// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense // Common data structures and functions for the draw tag stream. // Design of draw tag: & 0x1c gives scene size in bytes // & 1 gives clip // (tag >> 4) & 0x3c is info size in bytes #define Drawtag_Nop 0 #define Drawtag_FillColor 0x44 #define Drawtag_FillLinGradient 0x114 #define Drawtag_FillRadGradient 0x2dc #define Drawtag_FillImage 0x48 #define Drawtag_BeginClip 0x05 #define Drawtag_EndClip 0x25 struct DrawMonoid { uint path_ix; uint clip_ix; uint scene_offset; uint info_offset; }; DrawMonoid draw_monoid_identity() { return DrawMonoid(0, 0, 0, 0); } DrawMonoid combine_draw_monoid(DrawMonoid a, DrawMonoid b) { DrawMonoid c; c.path_ix = a.path_ix + b.path_ix; c.clip_ix = a.clip_ix + b.clip_ix; c.scene_offset = a.scene_offset + b.scene_offset; c.info_offset = a.info_offset + b.info_offset; return c; } DrawMonoid map_tag(uint tag_word) { // TODO: at some point, EndClip should not generate a path uint has_path = uint(tag_word != Drawtag_Nop); return DrawMonoid(has_path, tag_word & 1, tag_word & 0x1c, (tag_word >> 4) & 0x3c); }