#include #include "libimg-internal.h" #include #include #include int img_target(img_t img, int w, int h) { if(img.flags & FLAG_RO) return 0; if(img_null(img)) return 0; if(img.width < w || img.height < h) return 0; return 1; } img_t img_create(int w, int h) { if(w <= 0 || h <= 0 || w >= 0x10000 || h >= 0x10000) return NULL_IMG; img_t s = { .width = w, .height = h, .stride = w, .flags = FLAG_OWN, .pixels = malloc(w * h * sizeof *s.pixels), }; if(!s.pixels) return NULL_IMG; return s; } img_t img_copy(img_t img) { int w = img.width, h = img.height; img_t s = img_create(w, h); if(img_null(s)) return s; img_pixel_t *src_px = img.pixels; img_pixel_t *dst_px = s.pixels; for(int y = 0; y < img.height; y++) { memcpy(dst_px, src_px, w * sizeof *src_px); src_px += img.stride; dst_px += s.stride; } return s; } int img_null(img_t img) { return !img.width || !img.height || !img.pixels; } img_t img_sub(img_t img, int x, int y, int w, int h) { if(img_null(img)) return img; /* If w or h is negative, use the full width and height (this formula works even if x<0 or y<0) */ if(w < 0) w = img.width - x; if(h < 0) h = img.height - y; /* Clip in bounds */ if(x < 0) w += x, x = 0; if(y < 0) h += y, y = 0; if(x + w > img.width) w = img.width - x; if(y + h > img.height) h = img.height - y; if(w <= 0 || h <= 0) return NULL_IMG; img_t s = { .width = w, .height = h, .stride = img.stride, .flags = 0, .pixels = img.pixels + (y * img.stride) + x, }; return s; } img_t img_at(img_t img, int x, int y) { return img_sub(img, x, y, -1, -1); } #ifdef FXCG50 img_t img_vram(void) { img_t vram = { .width = 396, .height = 224, .stride = 396, .flags = 0, .pixels = gint_vram, }; return vram; } #endif void img_destroy(img_t img) { if(img.flags & FLAG_OWN && !(img.flags & FLAG_RO)) free(img.pixels); }