190adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com 290adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.comextern "C" { 390adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com#include <stdio.h> 490adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com#include <stdlib.h> 590adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com#include <config.h> 690adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com#include "pixman-private.h" 790adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com#include "utils.h" 890adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com#include "gtk-utils.h" 990adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com 1090adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com} 1190adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com 1290adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com#include "SkBitmap.h" 1390adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com#include "SkCanvas.h" 1490adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com#include "SkGraphics.h" 1590adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com#include "SkPaint.h" 1690adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com#import "SkWindow.h" 1790adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com 1890adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.combool DrawPixman(SkCanvas* canvas, int step, bool useOld); 1990adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.comSkCanvas* canvas; 2090adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com 2190adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.comextern "C" { 2290adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com 2390adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.comvoid* 2490adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.compixbuf_from_argb32 (uint32_t *bits, 2520c301bd1aa4578c6d0abb23ac2c72b5fbb436dbskia.committer@gmail.com int width, 2620c301bd1aa4578c6d0abb23ac2c72b5fbb436dbskia.committer@gmail.com int height, 2720c301bd1aa4578c6d0abb23ac2c72b5fbb436dbskia.committer@gmail.com int stride) 2890adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com{ 2990adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com SkBitmap* bitmap = new SkBitmap; 3090adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com bitmap->setConfig(SkBitmap::kARGB_8888_Config, width, height); 3190adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com bitmap->allocPixels(); 3290adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com 3390adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com int p_stride = bitmap->rowBytes(); 3490adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com uint32_t *p_bits = bitmap->getAddr32(0, 0); 3590adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com int i; 3690adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com 3790adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com for (i = 0; i < height; ++i) 3890adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com { 3920c301bd1aa4578c6d0abb23ac2c72b5fbb436dbskia.committer@gmail.com uint32_t *src_row = &bits[i * (stride / 4)]; 4020c301bd1aa4578c6d0abb23ac2c72b5fbb436dbskia.committer@gmail.com uint32_t *dst_row = p_bits + i * (p_stride / 4); 4190adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com 4220c301bd1aa4578c6d0abb23ac2c72b5fbb436dbskia.committer@gmail.com a8r8g8b8_to_rgba_np (dst_row, src_row, width); 4390adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com } 4490adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com return (void*) bitmap; 4590adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com} 4690adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com 4790adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com 4890adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.comvoid show_image (pixman_image_t *image) { 4990adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com int width, height; 5090adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com pixman_format_code_t format; 5190adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com pixman_image_t *copy; 5220c301bd1aa4578c6d0abb23ac2c72b5fbb436dbskia.committer@gmail.com 5390adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com width = pixman_image_get_width (image); 5490adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com height = pixman_image_get_height (image); 5590adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com 5690adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com 5790adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com format = pixman_image_get_format (image); 5890adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com 5990adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com /* Three cases: 6090adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com * 6190adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com * - image is a8r8g8b8_sRGB: we will display without modification 6290adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com * under the assumption that the monitor is sRGB 6390adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com * 6490adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com * - image is a8r8g8b8: we will display without modification 6590adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com * under the assumption that whoever created the image 6690adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com * probably did it wrong by using sRGB inputs 6790adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com * 6890adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com * - other: we will convert to a8r8g8b8 under the assumption that 6990adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com * whoever created the image probably did it wrong. 7090adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com */ 7190adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com switch (format) 7290adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com { 7390adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com case PIXMAN_a8r8g8b8_sRGB: 7490adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com case PIXMAN_a8r8g8b8: 7520c301bd1aa4578c6d0abb23ac2c72b5fbb436dbskia.committer@gmail.com copy = pixman_image_ref (image); 7620c301bd1aa4578c6d0abb23ac2c72b5fbb436dbskia.committer@gmail.com break; 7790adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com 7890adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com default: 7920c301bd1aa4578c6d0abb23ac2c72b5fbb436dbskia.committer@gmail.com copy = pixman_image_create_bits (PIXMAN_a8r8g8b8, 8020c301bd1aa4578c6d0abb23ac2c72b5fbb436dbskia.committer@gmail.com width, height, NULL, -1); 8120c301bd1aa4578c6d0abb23ac2c72b5fbb436dbskia.committer@gmail.com pixman_image_composite32 (PIXMAN_OP_SRC, 8220c301bd1aa4578c6d0abb23ac2c72b5fbb436dbskia.committer@gmail.com image, NULL, copy, 8320c301bd1aa4578c6d0abb23ac2c72b5fbb436dbskia.committer@gmail.com 0, 0, 0, 0, 0, 0, 8420c301bd1aa4578c6d0abb23ac2c72b5fbb436dbskia.committer@gmail.com width, height); 8520c301bd1aa4578c6d0abb23ac2c72b5fbb436dbskia.committer@gmail.com break; 8690adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com } 8790adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com 8890adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com SkBitmap* bitmap = (SkBitmap*) pixbuf_from_argb32 (pixman_image_get_data (copy), 8920c301bd1aa4578c6d0abb23ac2c72b5fbb436dbskia.committer@gmail.com width, height, 9020c301bd1aa4578c6d0abb23ac2c72b5fbb436dbskia.committer@gmail.com pixman_image_get_stride (copy)); 9190adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com canvas->drawBitmap(*bitmap, 0, 0); 9290adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com delete bitmap; 9390adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com} 9490adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com 9590adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com} 9690adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com 9790adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.combool DrawPixman(SkCanvas* c, int step, bool usePixman) { 9890adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com canvas = c; 9990adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com switch(step) { 10090adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com case 0: 10190adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com checkerboard_main(0, NULL); 10290adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com break; 10390adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com default: 10490adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com alpha_main(0, NULL); 10590adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com break; 10690adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com } 10790adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com return true; 10890adecd850f1ae2beb7f66b6e7ddbf9cb16d67accaryclark@google.com} 109