20c301bd1a
git-svn-id: http://skia.googlecode.com/svn/trunk@5972 2bbb7eff-a529-9590-31e7-b0007b416f81
109 lines
2.5 KiB
C++
109 lines
2.5 KiB
C++
|
|
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;
|
|
}
|