blob: 7f3c32793ba4cf6cd3cc9a855847073117ab6a41 [file] [log] [blame]
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;
}