// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense

// Code auto-generated by piet-gpu-derive

struct AnnoImageRef {
    uint offset;
};

struct AnnoColorRef {
    uint offset;
};

struct AnnoLinGradientRef {
    uint offset;
};

struct AnnoBeginClipRef {
    uint offset;
};

struct AnnoEndClipRef {
    uint offset;
};

struct AnnotatedRef {
    uint offset;
};

struct AnnoImage {
    vec4 bbox;
    float linewidth;
    uint index;
    ivec2 offset;
};

#define AnnoImage_size 28

AnnoImageRef AnnoImage_index(AnnoImageRef ref, uint index) {
    return AnnoImageRef(ref.offset + index * AnnoImage_size);
}

struct AnnoColor {
    vec4 bbox;
    float linewidth;
    uint rgba_color;
};

#define AnnoColor_size 24

AnnoColorRef AnnoColor_index(AnnoColorRef ref, uint index) {
    return AnnoColorRef(ref.offset + index * AnnoColor_size);
}

struct AnnoLinGradient {
    vec4 bbox;
    float linewidth;
    uint index;
    float line_x;
    float line_y;
    float line_c;
};

#define AnnoLinGradient_size 36

AnnoLinGradientRef AnnoLinGradient_index(AnnoLinGradientRef ref, uint index) {
    return AnnoLinGradientRef(ref.offset + index * AnnoLinGradient_size);
}

struct AnnoBeginClip {
    vec4 bbox;
    float linewidth;
};

#define AnnoBeginClip_size 20

AnnoBeginClipRef AnnoBeginClip_index(AnnoBeginClipRef ref, uint index) {
    return AnnoBeginClipRef(ref.offset + index * AnnoBeginClip_size);
}

struct AnnoEndClip {
    vec4 bbox;
};

#define AnnoEndClip_size 16

AnnoEndClipRef AnnoEndClip_index(AnnoEndClipRef ref, uint index) {
    return AnnoEndClipRef(ref.offset + index * AnnoEndClip_size);
}

#define Annotated_Nop 0
#define Annotated_Color 1
#define Annotated_LinGradient 2
#define Annotated_Image 3
#define Annotated_BeginClip 4
#define Annotated_EndClip 5
#define Annotated_size 40

AnnotatedRef Annotated_index(AnnotatedRef ref, uint index) {
    return AnnotatedRef(ref.offset + index * Annotated_size);
}

struct AnnotatedTag {
   uint tag;
   uint flags;
};

AnnoImage AnnoImage_read(Alloc a, AnnoImageRef ref) {
    uint ix = ref.offset >> 2;
    uint raw0 = read_mem(a, ix + 0);
    uint raw1 = read_mem(a, ix + 1);
    uint raw2 = read_mem(a, ix + 2);
    uint raw3 = read_mem(a, ix + 3);
    uint raw4 = read_mem(a, ix + 4);
    uint raw5 = read_mem(a, ix + 5);
    uint raw6 = read_mem(a, ix + 6);
    AnnoImage s;
    s.bbox = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3));
    s.linewidth = uintBitsToFloat(raw4);
    s.index = raw5;
    s.offset = ivec2(int(raw6 << 16) >> 16, int(raw6) >> 16);
    return s;
}

void AnnoImage_write(Alloc a, AnnoImageRef ref, AnnoImage s) {
    uint ix = ref.offset >> 2;
    write_mem(a, ix + 0, floatBitsToUint(s.bbox.x));
    write_mem(a, ix + 1, floatBitsToUint(s.bbox.y));
    write_mem(a, ix + 2, floatBitsToUint(s.bbox.z));
    write_mem(a, ix + 3, floatBitsToUint(s.bbox.w));
    write_mem(a, ix + 4, floatBitsToUint(s.linewidth));
    write_mem(a, ix + 5, s.index);
    write_mem(a, ix + 6, (uint(s.offset.x) & 0xffff) | (uint(s.offset.y) << 16));
}

AnnoColor AnnoColor_read(Alloc a, AnnoColorRef ref) {
    uint ix = ref.offset >> 2;
    uint raw0 = read_mem(a, ix + 0);
    uint raw1 = read_mem(a, ix + 1);
    uint raw2 = read_mem(a, ix + 2);
    uint raw3 = read_mem(a, ix + 3);
    uint raw4 = read_mem(a, ix + 4);
    uint raw5 = read_mem(a, ix + 5);
    AnnoColor s;
    s.bbox = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3));
    s.linewidth = uintBitsToFloat(raw4);
    s.rgba_color = raw5;
    return s;
}

void AnnoColor_write(Alloc a, AnnoColorRef ref, AnnoColor s) {
    uint ix = ref.offset >> 2;
    write_mem(a, ix + 0, floatBitsToUint(s.bbox.x));
    write_mem(a, ix + 1, floatBitsToUint(s.bbox.y));
    write_mem(a, ix + 2, floatBitsToUint(s.bbox.z));
    write_mem(a, ix + 3, floatBitsToUint(s.bbox.w));
    write_mem(a, ix + 4, floatBitsToUint(s.linewidth));
    write_mem(a, ix + 5, s.rgba_color);
}

AnnoLinGradient AnnoLinGradient_read(Alloc a, AnnoLinGradientRef ref) {
    uint ix = ref.offset >> 2;
    uint raw0 = read_mem(a, ix + 0);
    uint raw1 = read_mem(a, ix + 1);
    uint raw2 = read_mem(a, ix + 2);
    uint raw3 = read_mem(a, ix + 3);
    uint raw4 = read_mem(a, ix + 4);
    uint raw5 = read_mem(a, ix + 5);
    uint raw6 = read_mem(a, ix + 6);
    uint raw7 = read_mem(a, ix + 7);
    uint raw8 = read_mem(a, ix + 8);
    AnnoLinGradient s;
    s.bbox = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3));
    s.linewidth = uintBitsToFloat(raw4);
    s.index = raw5;
    s.line_x = uintBitsToFloat(raw6);
    s.line_y = uintBitsToFloat(raw7);
    s.line_c = uintBitsToFloat(raw8);
    return s;
}

void AnnoLinGradient_write(Alloc a, AnnoLinGradientRef ref, AnnoLinGradient s) {
    uint ix = ref.offset >> 2;
    write_mem(a, ix + 0, floatBitsToUint(s.bbox.x));
    write_mem(a, ix + 1, floatBitsToUint(s.bbox.y));
    write_mem(a, ix + 2, floatBitsToUint(s.bbox.z));
    write_mem(a, ix + 3, floatBitsToUint(s.bbox.w));
    write_mem(a, ix + 4, floatBitsToUint(s.linewidth));
    write_mem(a, ix + 5, s.index);
    write_mem(a, ix + 6, floatBitsToUint(s.line_x));
    write_mem(a, ix + 7, floatBitsToUint(s.line_y));
    write_mem(a, ix + 8, floatBitsToUint(s.line_c));
}

AnnoBeginClip AnnoBeginClip_read(Alloc a, AnnoBeginClipRef ref) {
    uint ix = ref.offset >> 2;
    uint raw0 = read_mem(a, ix + 0);
    uint raw1 = read_mem(a, ix + 1);
    uint raw2 = read_mem(a, ix + 2);
    uint raw3 = read_mem(a, ix + 3);
    uint raw4 = read_mem(a, ix + 4);
    AnnoBeginClip s;
    s.bbox = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3));
    s.linewidth = uintBitsToFloat(raw4);
    return s;
}

void AnnoBeginClip_write(Alloc a, AnnoBeginClipRef ref, AnnoBeginClip s) {
    uint ix = ref.offset >> 2;
    write_mem(a, ix + 0, floatBitsToUint(s.bbox.x));
    write_mem(a, ix + 1, floatBitsToUint(s.bbox.y));
    write_mem(a, ix + 2, floatBitsToUint(s.bbox.z));
    write_mem(a, ix + 3, floatBitsToUint(s.bbox.w));
    write_mem(a, ix + 4, floatBitsToUint(s.linewidth));
}

AnnoEndClip AnnoEndClip_read(Alloc a, AnnoEndClipRef ref) {
    uint ix = ref.offset >> 2;
    uint raw0 = read_mem(a, ix + 0);
    uint raw1 = read_mem(a, ix + 1);
    uint raw2 = read_mem(a, ix + 2);
    uint raw3 = read_mem(a, ix + 3);
    AnnoEndClip s;
    s.bbox = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3));
    return s;
}

void AnnoEndClip_write(Alloc a, AnnoEndClipRef ref, AnnoEndClip s) {
    uint ix = ref.offset >> 2;
    write_mem(a, ix + 0, floatBitsToUint(s.bbox.x));
    write_mem(a, ix + 1, floatBitsToUint(s.bbox.y));
    write_mem(a, ix + 2, floatBitsToUint(s.bbox.z));
    write_mem(a, ix + 3, floatBitsToUint(s.bbox.w));
}

AnnotatedTag Annotated_tag(Alloc a, AnnotatedRef ref) {
    uint tag_and_flags = read_mem(a, ref.offset >> 2);
    return AnnotatedTag(tag_and_flags & 0xffff, tag_and_flags >> 16);
}

AnnoColor Annotated_Color_read(Alloc a, AnnotatedRef ref) {
    return AnnoColor_read(a, AnnoColorRef(ref.offset + 4));
}

AnnoLinGradient Annotated_LinGradient_read(Alloc a, AnnotatedRef ref) {
    return AnnoLinGradient_read(a, AnnoLinGradientRef(ref.offset + 4));
}

AnnoImage Annotated_Image_read(Alloc a, AnnotatedRef ref) {
    return AnnoImage_read(a, AnnoImageRef(ref.offset + 4));
}

AnnoBeginClip Annotated_BeginClip_read(Alloc a, AnnotatedRef ref) {
    return AnnoBeginClip_read(a, AnnoBeginClipRef(ref.offset + 4));
}

AnnoEndClip Annotated_EndClip_read(Alloc a, AnnotatedRef ref) {
    return AnnoEndClip_read(a, AnnoEndClipRef(ref.offset + 4));
}

void Annotated_Nop_write(Alloc a, AnnotatedRef ref) {
    write_mem(a, ref.offset >> 2, Annotated_Nop);
}

void Annotated_Color_write(Alloc a, AnnotatedRef ref, uint flags, AnnoColor s) {
    write_mem(a, ref.offset >> 2, (flags << 16) | Annotated_Color);
    AnnoColor_write(a, AnnoColorRef(ref.offset + 4), s);
}

void Annotated_LinGradient_write(Alloc a, AnnotatedRef ref, uint flags, AnnoLinGradient s) {
    write_mem(a, ref.offset >> 2, (flags << 16) | Annotated_LinGradient);
    AnnoLinGradient_write(a, AnnoLinGradientRef(ref.offset + 4), s);
}

void Annotated_Image_write(Alloc a, AnnotatedRef ref, uint flags, AnnoImage s) {
    write_mem(a, ref.offset >> 2, (flags << 16) | Annotated_Image);
    AnnoImage_write(a, AnnoImageRef(ref.offset + 4), s);
}

void Annotated_BeginClip_write(Alloc a, AnnotatedRef ref, uint flags, AnnoBeginClip s) {
    write_mem(a, ref.offset >> 2, (flags << 16) | Annotated_BeginClip);
    AnnoBeginClip_write(a, AnnoBeginClipRef(ref.offset + 4), s);
}

void Annotated_EndClip_write(Alloc a, AnnotatedRef ref, AnnoEndClip s) {
    write_mem(a, ref.offset >> 2, Annotated_EndClip);
    AnnoEndClip_write(a, AnnoEndClipRef(ref.offset + 4), s);
}

