C++程序  |  109行  |  2.52 KB


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