diff --git a/unix/CMakeLists.txt b/unix/CMakeLists.txt index dc9726b1..14c957df 100644 --- a/unix/CMakeLists.txt +++ b/unix/CMakeLists.txt @@ -26,6 +26,7 @@ list(APPEND _LIBUI_SOURCES unix/graphemes.c unix/grid.c unix/group.c + unix/image.c unix/label.c unix/main.c unix/menu.c diff --git a/unix/image.c b/unix/image.c new file mode 100644 index 00000000..7a77cf02 --- /dev/null +++ b/unix/image.c @@ -0,0 +1,59 @@ +// 27 june 2016 +#include "uipriv_unix.h" + +struct uiImage { + double width; + double height; + GPtrArray *images; +}; + +static void freeImageRep(gpointer item) +{ + cairo_surface_t *cs = (cairo_surface_t *) item; + unsigned char *buf; + + buf = cairo_image_surface_get_data(cs); + cairo_surface_destroy(cs); + uiFree(buf); +} + +uiImage *uiNewImage(double width, double height) +{ + uiImage *i; + + i = uiNew(uiImage); + i->width = width; + i->height = height; + i->images = g_ptr_array_new_with_free_func(g_object_unref); + return i; +} + +void uiFreeImage(uiImage *i) +{ + g_ptr_array_free(i->images, TRUE); + uiFree(i); +} + +void uiImageAppend(uiImage *i, void *pixels, int pixelWidth, int pixelHeight, int pixelStride) +{ + cairo_surface_t *cs; + unsigned char *buf, *p; + uint8_t *src = (uint8_t *) pixels; + int cstride; + int y; + + cstride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, pixelWidth); + buf = (unsigned char *) uiAlloc((cstride * pixelHeight * 4) * sizeof (unsigned char), "unsigned char[]"); + p = buf; + for (y = 0; y < pixelWidth * pixelHeight; y += pixelStride) { + memmove(p, src + y, cstride); + p += cstride; + } + cs = cairo_image_surface_create_for_data(buf, CAIRO_FORMAT_ARGB32, + pixelWidth, pixelHeight, + cstride); + if (cairo_surface_status(cs) != CAIRO_STATUS_SUCCESS) + /* TODO */; + cairo_surface_flush(cs); + g_ptr_array_add(i->images, cs); +}