diff options
Diffstat (limited to 'chromium/third_party/skia/experimental/pixman/junk.cpp')
-rw-r--r-- | chromium/third_party/skia/experimental/pixman/junk.cpp | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/chromium/third_party/skia/experimental/pixman/junk.cpp b/chromium/third_party/skia/experimental/pixman/junk.cpp new file mode 100644 index 00000000000..f85a442e9a4 --- /dev/null +++ b/chromium/third_party/skia/experimental/pixman/junk.cpp @@ -0,0 +1,108 @@ + +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; +} |