While switching swf to return slices, I noticed ActionPush was
potentially allocating a huge vector by mistake.
Switch to SmallVec<[Value; 4]> to fix this and avoid the
allocation in general (this was fairly high up in the profiler).
TODO: Return an iterator instead of any sort of vec.
A bitmap fill style ends in a matrix, but the overall type should
still be byte aligned. This could cause certain shapes with bitmap
line styles to be incorrectly parsed. Fixes#1192.
There is a difference between empty/default (change value to default)
and none (don't modify), so make this explicit for some PlaceObject
parameters where it wasn't.
Fixes#1104.
The underlying problem is actually shift overflow - on the fifth byte in the sequence, it attempts to mask bits by shifting them off the left of the value, which doesn't work here, as we'll be shifting by -3. For those unaware, shifting by a negative does NOT shift in the opposite direction, it instead gives your C compiler permission to stuff demons up your nose.
I wouldn't be surprised if this is just outright UB in Flash Player.
The spec says that StyleChangeRecord is only supported in
DefineShape2+, but SWFs exist with StyleChangeRecord in
DefineShape1 tags, and these play correctly in the Flash Player.
(see #929 HAGIMURA_EXTREME.swf).
401799_pre_Scene_1.swf has a DefineButton2 tag with an invalid
CondActionSize field (it should be at least 4). It's unclear how
Flash handles this. For now, avoid the underflow and return an
error instead.
Fixes#92.
The interpolation and spread modes of morph shape gradients were
not being properly parsed. Fixed this and cleaned up some of the
gradient parsing code.
Some software would export SWFs with a missing LatencySeek field
in SoundStreamHead (e.g., CoffeeCup Firestarter). Silently ignore
this error if the field is missing.