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

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

struct StateRef {
    uint offset;
};

struct State {
    vec4 mat;
    vec2 translate;
    vec4 bbox;
    float linewidth;
    uint flags;
    uint path_count;
    uint pathseg_count;
    uint trans_count;
};

#define State_size 60

StateRef State_index(StateRef ref, uint index) {
    return StateRef(ref.offset + index * State_size);
}

State State_read(StateRef ref) {
    uint ix = ref.offset >> 2;
    uint raw0 = state[ix + 0];
    uint raw1 = state[ix + 1];
    uint raw2 = state[ix + 2];
    uint raw3 = state[ix + 3];
    uint raw4 = state[ix + 4];
    uint raw5 = state[ix + 5];
    uint raw6 = state[ix + 6];
    uint raw7 = state[ix + 7];
    uint raw8 = state[ix + 8];
    uint raw9 = state[ix + 9];
    uint raw10 = state[ix + 10];
    uint raw11 = state[ix + 11];
    uint raw12 = state[ix + 12];
    uint raw13 = state[ix + 13];
    uint raw14 = state[ix + 14];
    State s;
    s.mat = vec4(uintBitsToFloat(raw0), uintBitsToFloat(raw1), uintBitsToFloat(raw2), uintBitsToFloat(raw3));
    s.translate = vec2(uintBitsToFloat(raw4), uintBitsToFloat(raw5));
    s.bbox = vec4(uintBitsToFloat(raw6), uintBitsToFloat(raw7), uintBitsToFloat(raw8), uintBitsToFloat(raw9));
    s.linewidth = uintBitsToFloat(raw10);
    s.flags = raw11;
    s.path_count = raw12;
    s.pathseg_count = raw13;
    s.trans_count = raw14;
    return s;
}

void State_write(StateRef ref, State s) {
    uint ix = ref.offset >> 2;
    state[ix + 0] = floatBitsToUint(s.mat.x);
    state[ix + 1] = floatBitsToUint(s.mat.y);
    state[ix + 2] = floatBitsToUint(s.mat.z);
    state[ix + 3] = floatBitsToUint(s.mat.w);
    state[ix + 4] = floatBitsToUint(s.translate.x);
    state[ix + 5] = floatBitsToUint(s.translate.y);
    state[ix + 6] = floatBitsToUint(s.bbox.x);
    state[ix + 7] = floatBitsToUint(s.bbox.y);
    state[ix + 8] = floatBitsToUint(s.bbox.z);
    state[ix + 9] = floatBitsToUint(s.bbox.w);
    state[ix + 10] = floatBitsToUint(s.linewidth);
    state[ix + 11] = s.flags;
    state[ix + 12] = s.path_count;
    state[ix + 13] = s.pathseg_count;
    state[ix + 14] = s.trans_count;
}

