swf: Don't error on focal gradients in DefineShape tags (fix #2730)
This commit is contained in:
parent
ab92bc1b98
commit
2254589e71
|
@ -1369,7 +1369,7 @@ impl<'a> Reader<'a> {
|
||||||
let mut start_fill_styles = Vec::with_capacity(num_fill_styles);
|
let mut start_fill_styles = Vec::with_capacity(num_fill_styles);
|
||||||
let mut end_fill_styles = Vec::with_capacity(num_fill_styles);
|
let mut end_fill_styles = Vec::with_capacity(num_fill_styles);
|
||||||
for _ in 0..num_fill_styles {
|
for _ in 0..num_fill_styles {
|
||||||
let (start, end) = self.read_morph_fill_style(shape_version)?;
|
let (start, end) = self.read_morph_fill_style()?;
|
||||||
start_fill_styles.push(start);
|
start_fill_styles.push(start);
|
||||||
end_fill_styles.push(end);
|
end_fill_styles.push(end);
|
||||||
}
|
}
|
||||||
|
@ -1495,7 +1495,7 @@ impl<'a> Reader<'a> {
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
let (start_fill_style, end_fill_style) = if has_fill {
|
let (start_fill_style, end_fill_style) = if has_fill {
|
||||||
let (start, end) = self.read_morph_fill_style(shape_version)?;
|
let (start, end) = self.read_morph_fill_style()?;
|
||||||
(Some(start), Some(end))
|
(Some(start), Some(end))
|
||||||
} else {
|
} else {
|
||||||
(None, None)
|
(None, None)
|
||||||
|
@ -1529,7 +1529,7 @@ impl<'a> Reader<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_morph_fill_style(&mut self, shape_version: u8) -> Result<(FillStyle, FillStyle)> {
|
fn read_morph_fill_style(&mut self) -> Result<(FillStyle, FillStyle)> {
|
||||||
let fill_style_type = self.read_u8()?;
|
let fill_style_type = self.read_u8()?;
|
||||||
let fill_style = match fill_style_type {
|
let fill_style = match fill_style_type {
|
||||||
0x00 => {
|
0x00 => {
|
||||||
|
@ -1555,12 +1555,8 @@ impl<'a> Reader<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
0x13 => {
|
0x13 => {
|
||||||
if self.version < 8 || shape_version < 2 {
|
// SWF19 says focal gradients are only allowed in SWFv8+ and DefineMorphShapeShape2,
|
||||||
return Err(Error::invalid_data(
|
// but it works even in earlier tags (#2730).
|
||||||
"Focal gradients are only supported in SWF version 8 \
|
|
||||||
or higher.",
|
|
||||||
));
|
|
||||||
}
|
|
||||||
// TODO(Herschel): How is focal_point stored?
|
// TODO(Herschel): How is focal_point stored?
|
||||||
let (start_gradient, end_gradient) = self.read_morph_gradient()?;
|
let (start_gradient, end_gradient) = self.read_morph_gradient()?;
|
||||||
let start_focal_point = self.read_fixed8()?;
|
let start_focal_point = self.read_fixed8()?;
|
||||||
|
@ -1755,18 +1751,12 @@ impl<'a> Reader<'a> {
|
||||||
|
|
||||||
0x12 => FillStyle::RadialGradient(self.read_gradient(shape_version)?),
|
0x12 => FillStyle::RadialGradient(self.read_gradient(shape_version)?),
|
||||||
|
|
||||||
0x13 => {
|
0x13 => FillStyle::FocalGradient {
|
||||||
if self.version < 8 || shape_version < 4 {
|
// SWF19 says focal gradients are only allowed in SWFv8+ and DefineShape4,
|
||||||
return Err(Error::invalid_data(
|
// but it works even in earlier tags (#2730).
|
||||||
"Focal gradients are only supported in SWF version 8 \
|
|
||||||
or higher.",
|
|
||||||
));
|
|
||||||
}
|
|
||||||
FillStyle::FocalGradient {
|
|
||||||
gradient: self.read_gradient(shape_version)?,
|
gradient: self.read_gradient(shape_version)?,
|
||||||
focal_point: self.read_fixed8()?,
|
focal_point: self.read_fixed8()?,
|
||||||
}
|
},
|
||||||
}
|
|
||||||
|
|
||||||
0x40..=0x43 => FillStyle::Bitmap {
|
0x40..=0x43 => FillStyle::Bitmap {
|
||||||
id: self.read_u16()?,
|
id: self.read_u16()?,
|
||||||
|
|
|
@ -1179,7 +1179,7 @@ impl<W: Write> Writer<W> {
|
||||||
.iter()
|
.iter()
|
||||||
.zip(data.end.fill_styles.iter())
|
.zip(data.end.fill_styles.iter())
|
||||||
{
|
{
|
||||||
writer.write_morph_fill_style(start, end, data.version)?;
|
writer.write_morph_fill_style(start, end)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
if num_line_styles >= 0xff {
|
if num_line_styles >= 0xff {
|
||||||
|
@ -1263,12 +1263,7 @@ impl<W: Write> Writer<W> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_morph_fill_style(
|
fn write_morph_fill_style(&mut self, start: &FillStyle, end: &FillStyle) -> Result<()> {
|
||||||
&mut self,
|
|
||||||
start: &FillStyle,
|
|
||||||
end: &FillStyle,
|
|
||||||
shape_version: u8,
|
|
||||||
) -> Result<()> {
|
|
||||||
match (start, end) {
|
match (start, end) {
|
||||||
(&FillStyle::Color(ref start_color), &FillStyle::Color(ref end_color)) => {
|
(&FillStyle::Color(ref start_color), &FillStyle::Color(ref end_color)) => {
|
||||||
self.write_u8(0x00)?; // Solid color.
|
self.write_u8(0x00)?; // Solid color.
|
||||||
|
@ -1302,13 +1297,6 @@ impl<W: Write> Writer<W> {
|
||||||
focal_point: end_focal_point,
|
focal_point: end_focal_point,
|
||||||
},
|
},
|
||||||
) => {
|
) => {
|
||||||
if self.version < 8 || shape_version < 2 {
|
|
||||||
return Err(Error::invalid_data(
|
|
||||||
"Focal gradients are only support in SWF version 8 \
|
|
||||||
and higher.",
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
self.write_u8(0x13)?; // Focal gradient.
|
self.write_u8(0x13)?; // Focal gradient.
|
||||||
self.write_morph_gradient(start_gradient, end_gradient)?;
|
self.write_morph_gradient(start_gradient, end_gradient)?;
|
||||||
self.write_fixed8(start_focal_point)?;
|
self.write_fixed8(start_focal_point)?;
|
||||||
|
@ -1443,7 +1431,7 @@ impl<W: Write> Writer<W> {
|
||||||
}
|
}
|
||||||
|
|
||||||
(&Some(ref start_fill), &Some(ref end_fill)) => {
|
(&Some(ref start_fill), &Some(ref end_fill)) => {
|
||||||
self.write_morph_fill_style(start_fill, end_fill, shape_version)?
|
self.write_morph_fill_style(start_fill, end_fill)?
|
||||||
}
|
}
|
||||||
|
|
||||||
_ => {
|
_ => {
|
||||||
|
@ -1772,13 +1760,6 @@ impl<W: Write> Writer<W> {
|
||||||
ref gradient,
|
ref gradient,
|
||||||
focal_point,
|
focal_point,
|
||||||
} => {
|
} => {
|
||||||
if self.version < 8 {
|
|
||||||
return Err(Error::invalid_data(
|
|
||||||
"Focal gradients are only support in SWF version 8 \
|
|
||||||
and higher.",
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
self.write_u8(0x13)?; // Focal gradient.
|
self.write_u8(0x13)?; // Focal gradient.
|
||||||
self.write_gradient(gradient, shape_version)?;
|
self.write_gradient(gradient, shape_version)?;
|
||||||
self.write_fixed8(focal_point)?;
|
self.write_fixed8(focal_point)?;
|
||||||
|
|
Loading…
Reference in New Issue