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;
}