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; | |
} |