class @image
{
    Context2D* (*FileToContext2D)(U8* filepath);
    Context2D* (*BufferToContext2D)(U8* buffer, I64 size);
};

@image Image;

Context2D* @image_buffer_to_context2d(U8* buffer, I64 size)
{
    if (!buffer || !size) {
        return NULL;
    }
    I32 x;
    I32 y;
    I32 comp;
    I32 code = @stbi_info_from_memory(buffer, size, &x, &y, &comp);
    if (code != 1) {
        return NULL;
    }
    U8* pixels = @stbi_load_from_memory(buffer, size, &x, &y, &comp, 4);
    if (!pixels) {
        return NULL;
    }
    Context2D* ctx = CAlloc(sizeof(Context2D));
    ctx->width = x;
    ctx->height = y;
    ctx->fb = pixels;
    ctx->opacity = -1;
    I64 i;
    for (i = 0; i < x * y; i++) {
        ctx->fb(U32*)[i] = @image_pixel_flip_rgb_bgr(ctx->fb(U32*)[i]);
    }
    return ctx;
}

Context2D* @image_file_to_context2d(U8* filepath)
{
    if (!FileFind(filepath)) {
        return NULL;
    }
    I64 size = NULL;
    U8* buffer = FileRead(filepath, &size);
    if (!buffer || !size) {
        return NULL;
    }
    Context2D* ctx = @image_buffer_to_context2d(buffer, size);
    Free(buffer);
    return ctx;
}

Image.FileToContext2D = &@image_file_to_context2d;
Image.BufferToContext2D = &@image_buffer_to_context2d;

"image ";
