From 16898ba11b4d6e9e2e64bb2d02d0fb5adbe266e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1?= =?UTF-8?q?=D1=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= Date: Thu, 26 Mar 2015 19:33:43 +0000 Subject: win32: Add cairo API to set up a Win32 surface for an HDC with an alpha channel. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Руслан Ижбулатов Reviewed-by: Bryce Harrington diff --git a/src/cairo-win32.h b/src/cairo-win32.h index 3d2e1c6..db4cac6 100644 --- a/src/cairo-win32.h +++ b/src/cairo-win32.h @@ -49,6 +49,10 @@ cairo_public cairo_surface_t * cairo_win32_surface_create (HDC hdc); cairo_public cairo_surface_t * +cairo_win32_surface_create_with_format (HDC hdc, + cairo_format_t format); + +cairo_public cairo_surface_t * cairo_win32_printing_surface_create (HDC hdc); cairo_public cairo_surface_t * diff --git a/src/win32/cairo-win32-display-surface.c b/src/win32/cairo-win32-display-surface.c index 965f2c4..1571480 100644 --- a/src/win32/cairo-win32-display-surface.c +++ b/src/win32/cairo-win32-display-surface.c @@ -917,31 +917,41 @@ static const cairo_surface_backend_t cairo_win32_display_surface_backend = { */ /** - * cairo_win32_surface_create: + * cairo_win32_surface_create_with_format: * @hdc: the DC to create a surface for + * @format: format of pixels in the surface to create * * Creates a cairo surface that targets the given DC. The DC will be * queried for its initial clip extents, and this will be used as the - * size of the cairo surface. The resulting surface will always be of - * format %CAIRO_FORMAT_RGB24; should you need another surface format, - * you will need to create one through - * cairo_win32_surface_create_with_dib(). + * size of the cairo surface. * - * Return value: the newly created surface + * Supported formats are: + * %CAIRO_FORMAT_ARGB32 + * %CAIRO_FORMAT_RGB24 * - * Since: 1.0 + * Note: @format only tells cairo how to draw on the surface, not what + * the format of the surface is. Namely, cairo does not (and cannot) + * check that @hdc actually supports alpha-transparency. + * + * Return value: the newly created surface, NULL on failure + * + * Since: 1.14.3 **/ cairo_surface_t * -cairo_win32_surface_create (HDC hdc) +cairo_win32_surface_create_with_format (HDC hdc, cairo_format_t format) { cairo_win32_display_surface_t *surface; - cairo_format_t format; cairo_status_t status; cairo_device_t *device; - /* Assume that everything coming in as a HDC is RGB24 */ - format = CAIRO_FORMAT_RGB24; + switch (format) { + default: + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB24: + break; + } surface = malloc (sizeof (*surface)); if (surface == NULL) @@ -977,6 +987,28 @@ cairo_win32_surface_create (HDC hdc) } /** + * cairo_win32_surface_create: + * @hdc: the DC to create a surface for + * + * Creates a cairo surface that targets the given DC. The DC will be + * queried for its initial clip extents, and this will be used as the + * size of the cairo surface. The resulting surface will always be of + * format %CAIRO_FORMAT_RGB24; should you need another surface format, + * you will need to create one through + * cairo_win32_surface_create_with_format() or + * cairo_win32_surface_create_with_dib(). + * + * Return value: the newly created surface, NULL on failure + * + * Since: 1.0 + **/ +cairo_surface_t * +cairo_win32_surface_create (HDC hdc) +{ + return cairo_win32_surface_create_with_format (hdc, CAIRO_FORMAT_RGB24); +} + +/** * cairo_win32_surface_create_with_dib: * @format: format of pixels in the surface to create * @width: width of the surface, in pixels @@ -1027,12 +1059,16 @@ cairo_win32_surface_create_with_ddb (HDC hdc, HDC screen_dc, ddb_dc; HBITMAP saved_dc_bitmap; - if (format != CAIRO_FORMAT_RGB24) + switch (format) { + default: +/* XXX handle these eventually */ + case CAIRO_FORMAT_A8: + case CAIRO_FORMAT_A1: return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); -/* XXX handle these eventually - format != CAIRO_FORMAT_A8 || - format != CAIRO_FORMAT_A1) -*/ + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB24: + break; + } if (!hdc) { screen_dc = GetDC (NULL); -- cgit v0.10.2