| import '../../internal/internal.dart'; |
| import '../../util/input_buffer.dart'; |
| |
| /** |
| * Decodes a frame from a WebP animation. |
| */ |
| class WebPFrame { |
| /// The x coordinate of the upper left corner of the frame. |
| int x; |
| /// The y coordinate of the upper left corner of the frame. |
| int y; |
| /// The width of the frame. |
| int width; |
| /// The height of the frame. |
| int height; |
| /// How long the frame should be displayed, in milliseconds. |
| int duration; |
| /// Indicates how the current frame is to be treated after it has been |
| /// displayed (before rendering the next frame) on the canvas. |
| /// If true, the frame is cleared to the background color. If false, |
| /// frame is left and the next frame drawn over it. |
| bool clearFrame; |
| |
| WebPFrame(InputBuffer input, int size) { |
| x = input.readUint24() * 2; |
| y = input.readUint24() * 2; |
| width = input.readUint24() + 1; |
| height = input.readUint24() + 1; |
| duration = input.readUint24(); |
| int b = input.readByte(); |
| _reserved = (b & 0x7F) >> 7; |
| clearFrame = (b & 0x1) != 0; |
| |
| _framePosition = input.position; |
| _frameSize = size - _ANIMF_HEADER_SIZE; |
| } |
| |
| bool get isValid => _reserved == 0; |
| |
| int _reserved = 1; |
| int _framePosition; |
| int _frameSize; |
| |
| // Size of an animation frame header. |
| static const int _ANIMF_HEADER_SIZE = 16; |
| } |
| |
| @internal |
| class InternalWebPFrame extends WebPFrame { |
| InternalWebPFrame(InputBuffer input, int size) : super(input, size); |
| |
| int get framePosition => _framePosition; |
| int get frameSize => _frameSize; |
| } |