--- /dev/null
+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?= <lrn1986@gmail.com>
+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: Руслан Ижбулатов <lrn1986@gmail.com>
+Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
+
+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