extern "C" { #include #include #include #include "pixman-private.h" #include "utils.h" #include "gtk-utils.h" } #include "SkBitmap.h" #include "SkCanvas.h" #include "SkGraphics.h" #include "SkPaint.h" #import "SkWindow.h" bool DrawPixman(SkCanvas* canvas, int step, bool useOld); SkCanvas* canvas; extern "C" { void* pixbuf_from_argb32 (uint32_t *bits, int width, int height, int stride) { SkBitmap* bitmap = new SkBitmap; bitmap->setConfig(SkBitmap::kARGB_8888_Config, width, height); bitmap->allocPixels(); int p_stride = bitmap->rowBytes(); uint32_t *p_bits = bitmap->getAddr32(0, 0); int i; for (i = 0; i < height; ++i) { uint32_t *src_row = &bits[i * (stride / 4)]; uint32_t *dst_row = p_bits + i * (p_stride / 4); a8r8g8b8_to_rgba_np (dst_row, src_row, width); } return (void*) bitmap; } void show_image (pixman_image_t *image) { int width, height; pixman_format_code_t format; pixman_image_t *copy; width = pixman_image_get_width (image); height = pixman_image_get_height (image); format = pixman_image_get_format (image); /* Three cases: * * - image is a8r8g8b8_sRGB: we will display without modification * under the assumption that the monitor is sRGB * * - image is a8r8g8b8: we will display without modification * under the assumption that whoever created the image * probably did it wrong by using sRGB inputs * * - other: we will convert to a8r8g8b8 under the assumption that * whoever created the image probably did it wrong. */ switch (format) { case PIXMAN_a8r8g8b8_sRGB: case PIXMAN_a8r8g8b8: copy = pixman_image_ref (image); break; default: copy = pixman_image_create_bits (PIXMAN_a8r8g8b8, width, height, NULL, -1); pixman_image_composite32 (PIXMAN_OP_SRC, image, NULL, copy, 0, 0, 0, 0, 0, 0, width, height); break; } SkBitmap* bitmap = (SkBitmap*) pixbuf_from_argb32 (pixman_image_get_data (copy), width, height, pixman_image_get_stride (copy)); canvas->drawBitmap(*bitmap, 0, 0); delete bitmap; } } bool DrawPixman(SkCanvas* c, int step, bool usePixman) { canvas = c; switch(step) { case 0: checkerboard_main(0, NULL); break; default: alpha_main(0, NULL); break; } return true; }