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