|  |  | 
|  | extern "C" { | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <config.h> | 
|  | #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; | 
|  | } |