static cairo_surface_t * test_compositor_surface_create (const cairo_compositor_t *compositor, cairo_content_t content, int width, int height) { test_compositor_surface_t *surface; pixman_image_t *pixman_image; pixman_format_code_t pixman_format; switch (content) { case CAIRO_CONTENT_ALPHA: pixman_format = PIXMAN_a8; break; case CAIRO_CONTENT_COLOR: pixman_format = PIXMAN_x8r8g8b8; break; case CAIRO_CONTENT_COLOR_ALPHA: pixman_format = PIXMAN_a8r8g8b8; break; default: return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_CONTENT)); } pixman_image = pixman_image_create_bits (pixman_format, width, height, NULL, 0); if (unlikely (pixman_image == NULL)) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); surface = malloc (sizeof (test_compositor_surface_t)); if (unlikely (surface == NULL)) { pixman_image_unref (pixman_image); return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); } _cairo_surface_init (&surface->base.base, &test_compositor_surface_backend, NULL, /* device */ content, FALSE); /* is_vector */ _cairo_image_surface_init (&surface->base, pixman_image, pixman_format); surface->base.compositor = compositor; return &surface->base.base; }
cairo_surface_t * _cairo_image_surface_create_for_pixman_image (pixman_image_t *pixman_image, pixman_format_code_t pixman_format) { cairo_image_surface_t *surface; surface = malloc (sizeof (cairo_image_surface_t)); if (unlikely (surface == NULL)) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); _cairo_surface_init (&surface->base, &_cairo_image_surface_backend, NULL, /* device */ _cairo_content_from_pixman_format (pixman_format)); _cairo_image_surface_init (surface, pixman_image, pixman_format); return &surface->base; }
static cairo_skia_surface_t * _cairo_skia_surface_create_internal (SkBitmap::Config config, bool opaque, unsigned char *data, int width, int height, int stride) { cairo_skia_surface_t *surface; pixman_image_t *pixman_image; pixman_format_code_t pixman_format; SkColorType colorType; surface = (cairo_skia_surface_t *) malloc (sizeof (cairo_skia_surface_t)); if (unlikely (surface == NULL)) return (cairo_skia_surface_t *) _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); pixman_format = sk_config_to_pixman_format_code (config, opaque); pixman_image = pixman_image_create_bits (pixman_format, width, height, (uint32_t *) data, stride); if (unlikely (pixman_image == NULL)) { free (surface); return (cairo_skia_surface_t *) _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); } _cairo_surface_init (&surface->image.base, &cairo_skia_surface_backend, NULL, /* device */ _cairo_content_from_pixman_format (pixman_format)); _cairo_image_surface_init (&surface->image, pixman_image, pixman_format); surface->bitmap = new SkBitmap; colorType = SkBitmapConfigToColorType(config); surface->bitmap->setAlphaType (opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType); surface->bitmap->setInfo (SkImageInfo::Make(width, height, colorType, kPremul_SkAlphaType), surface->image.stride); surface->bitmap->setPixels (surface->image.data); surface->image.base.is_clear = data == NULL; return surface; }
static cairo_skia_surface_t * _cairo_skia_surface_create_internal (SkBitmap::Config config, bool opaque, unsigned char *data, int width, int height, int stride) { cairo_skia_surface_t *surface; pixman_image_t *pixman_image; pixman_format_code_t pixman_format; surface = (cairo_skia_surface_t *) malloc (sizeof (cairo_skia_surface_t)); if (unlikely (surface == NULL)) return (cairo_skia_surface_t *) _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); pixman_format = sk_config_to_pixman_format_code (config, opaque); pixman_image = pixman_image_create_bits (pixman_format, width, height, (uint32_t *) data, stride); if (unlikely (pixman_image == NULL)) return (cairo_skia_surface_t *) _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); _cairo_surface_init (&surface->image.base, &cairo_skia_surface_backend, NULL, /* device */ _cairo_content_from_pixman_format (pixman_format)); _cairo_image_surface_init (&surface->image, pixman_image, pixman_format); surface->bitmap = new SkBitmap; surface->bitmap->setConfig (config, width, height, surface->image.stride); surface->bitmap->setIsOpaque (opaque); surface->bitmap->setPixels (surface->image.data); surface->image.base.is_clear = data == NULL; return surface; }
static cairo_surface_t * map_qimage_to_image (QImage *qimg, const cairo_rectangle_int_t *extents) { struct _qimage_surface *surface; pixman_image_t *pixman_image; pixman_format_code_t pixman_format; uint8_t *data; if (qimg == NULL) return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); switch (qimg->format()) { case QImage::Format_ARGB32_Premultiplied: pixman_format = PIXMAN_a8r8g8b8; break; case QImage::Format_RGB32: pixman_format = PIXMAN_x8r8g8b8; break; case QImage::Format_Indexed8: // XXX not quite pixman_format = PIXMAN_a8; break; #ifdef WORDS_BIGENDIAN case QImage::Format_Mono: #else case QImage::Format_MonoLSB: #endif pixman_format = PIXMAN_a1; break; case QImage::Format_Invalid: #ifdef WORDS_BIGENDIAN case QImage::Format_MonoLSB: #else case QImage::Format_Mono: #endif case QImage::Format_ARGB32: case QImage::Format_RGB16: case QImage::Format_ARGB8565_Premultiplied: case QImage::Format_RGB666: case QImage::Format_ARGB6666_Premultiplied: case QImage::Format_RGB555: case QImage::Format_ARGB8555_Premultiplied: case QImage::Format_RGB888: case QImage::Format_RGB444: case QImage::Format_ARGB4444_Premultiplied: case QImage::NImageFormats: default: delete qimg; return _cairo_surface_create_in_error (CAIRO_STATUS_INVALID_FORMAT); } data = qimg->bits(); data += extents->y * qimg->bytesPerLine(); data += extents->x * PIXMAN_FORMAT_BPP (pixman_format) / 8; pixman_image = pixman_image_create_bits (pixman_format, extents->width, extents->height, (uint32_t *)data, qimg->bytesPerLine()); if (pixman_image == NULL) { delete qimg; return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); } surface = (struct _qimage_surface *) malloc (sizeof(*surface)); if (unlikely (surface == NULL)) { pixman_image_unref (pixman_image); delete qimg; return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); } _cairo_image_surface_init (&surface->image, pixman_image, pixman_format); surface->qimg = qimg; cairo_surface_set_device_offset (&surface->image.base, -extents->x, -extents->y); return &surface->image.base; }