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