summaryrefslogtreecommitdiffstats
path: root/gfx/cairo/d2d.patch
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/cairo/d2d.patch')
-rw-r--r--gfx/cairo/d2d.patch465
1 files changed, 465 insertions, 0 deletions
diff --git a/gfx/cairo/d2d.patch b/gfx/cairo/d2d.patch
new file mode 100644
index 000000000..b8dd155e7
--- /dev/null
+++ b/gfx/cairo/d2d.patch
@@ -0,0 +1,465 @@
+commit 4a412c0b144ed1fdde668e0e91241bac8bedd579
+Author: Jeff Muizelaar <jmuizelaar@mozilla.com>
+Date: Sun Jan 24 14:04:33 2010 -0500
+
+ d2d
+
+diff --git a/src/cairo-fixed-private.h b/src/cairo-fixed-private.h
+index c299def..a37ca6a 100644
+--- a/src/cairo-fixed-private.h
++++ b/src/cairo-fixed-private.h
+@@ -50,6 +50,7 @@
+
+ #define CAIRO_FIXED_ONE ((cairo_fixed_t)(1 << CAIRO_FIXED_FRAC_BITS))
+ #define CAIRO_FIXED_ONE_DOUBLE ((double)(1 << CAIRO_FIXED_FRAC_BITS))
++#define CAIRO_FIXED_ONE_FLOAT ((float)(1 << CAIRO_FIXED_FRAC_BITS))
+ #define CAIRO_FIXED_EPSILON ((cairo_fixed_t)(1))
+
+ #define CAIRO_FIXED_FRAC_MASK (((cairo_fixed_unsigned_t)(-1)) >> (CAIRO_FIXED_BITS - CAIRO_FIXED_FRAC_BITS))
+@@ -141,6 +142,12 @@ _cairo_fixed_to_double (cairo_fixed_t f)
+ return ((double) f) / CAIRO_FIXED_ONE_DOUBLE;
+ }
+
++static inline float
++_cairo_fixed_to_float (cairo_fixed_t f)
++{
++ return ((float) f) / CAIRO_FIXED_ONE_FLOAT;
++}
++
+ static inline int
+ _cairo_fixed_is_integer (cairo_fixed_t f)
+ {
+diff --git a/src/cairo-win32-private.h b/src/cairo-win32-private.h
+index b9926bb..ba57595 100644
+--- a/src/cairo-win32-private.h
++++ b/src/cairo-win32-private.h
+@@ -231,4 +231,19 @@ inline BOOL ModifyWorldTransform(HDC hdc, CONST XFORM * lpxf, DWORD mode) { retu
+
+ #endif
+
++#ifdef CAIRO_HAS_DWRITE_FONT
++CAIRO_BEGIN_DECLS
++
++cairo_public cairo_int_status_t
++cairo_dwrite_show_glyphs_on_surface(void *surface,
++ cairo_operator_t op,
++ const cairo_pattern_t *source,
++ cairo_glyph_t *glyphs,
++ int num_glyphs,
++ cairo_scaled_font_t *scaled_font,
++ cairo_rectangle_int_t *extents);
++
++
++CAIRO_END_DECLS
++#endif /* CAIRO_HAS_DWRITE_FONT */
+ #endif /* CAIRO_WIN32_PRIVATE_H */
+diff --git a/src/cairo-win32-surface.c b/src/cairo-win32-surface.c
+index 0dc5e76..bee00b1 100644
+--- a/src/cairo-win32-surface.c
++++ b/src/cairo-win32-surface.c
+@@ -1547,152 +1547,158 @@ _cairo_win32_surface_show_glyphs (void *surface,
+ int *remaining_glyphs)
+ {
+ #if defined(CAIRO_HAS_WIN32_FONT) && !defined(WINCE)
+- cairo_win32_surface_t *dst = surface;
+-
+- WORD glyph_buf_stack[STACK_GLYPH_SIZE];
+- WORD *glyph_buf = glyph_buf_stack;
+- int dxy_buf_stack[2 * STACK_GLYPH_SIZE];
+- int *dxy_buf = dxy_buf_stack;
+-
+- BOOL win_result = 0;
+- int i, j;
++ if (scaled_font->backend->type == CAIRO_FONT_TYPE_DWRITE) {
++#ifdef CAIRO_HAS_DWRITE_FONT
++ return cairo_dwrite_show_glyphs_on_surface(surface, op, source, glyphs, num_glyphs, scaled_font, clip);
++#endif
++ } else {
++ cairo_win32_surface_t *dst = surface;
++
++ WORD glyph_buf_stack[STACK_GLYPH_SIZE];
++ WORD *glyph_buf = glyph_buf_stack;
++ int dxy_buf_stack[2 * STACK_GLYPH_SIZE];
++ int *dxy_buf = dxy_buf_stack;
+
+- cairo_solid_pattern_t *solid_pattern;
+- COLORREF color;
++ BOOL win_result = 0;
++ int i, j;
+
+- cairo_matrix_t device_to_logical;
++ cairo_solid_pattern_t *solid_pattern;
++ COLORREF color;
+
+- int start_x, start_y;
+- double user_x, user_y;
+- int logical_x, logical_y;
+- unsigned int glyph_index_option;
++ cairo_matrix_t device_to_logical;
+
+- /* We can only handle win32 fonts */
+- if (cairo_scaled_font_get_type (scaled_font) != CAIRO_FONT_TYPE_WIN32)
+- return CAIRO_INT_STATUS_UNSUPPORTED;
++ int start_x, start_y;
++ double user_x, user_y;
++ int logical_x, logical_y;
++ unsigned int glyph_index_option;
+
+- /* We can only handle opaque solid color sources */
+- if (!_cairo_pattern_is_opaque_solid(source))
+- return CAIRO_INT_STATUS_UNSUPPORTED;
++ /* We can only handle win32 fonts */
++ if (cairo_scaled_font_get_type (scaled_font) != CAIRO_FONT_TYPE_WIN32)
++ return CAIRO_INT_STATUS_UNSUPPORTED;
+
+- /* We can only handle operator SOURCE or OVER with the destination
+- * having no alpha */
+- if ((op != CAIRO_OPERATOR_SOURCE && op != CAIRO_OPERATOR_OVER) ||
+- (dst->format != CAIRO_FORMAT_RGB24))
+- return CAIRO_INT_STATUS_UNSUPPORTED;
++ /* We can only handle opaque solid color sources */
++ if (!_cairo_pattern_is_opaque_solid(source))
++ return CAIRO_INT_STATUS_UNSUPPORTED;
+
+- /* If we have a fallback mask clip set on the dst, we have
+- * to go through the fallback path, but only if we're not
+- * doing this for printing */
+- if (clip != NULL) {
+- if ((dst->flags & CAIRO_WIN32_SURFACE_FOR_PRINTING) == 0) {
+- cairo_region_t *clip_region;
+- cairo_status_t status;
++ /* We can only handle operator SOURCE or OVER with the destination
++ * having no alpha */
++ if ((op != CAIRO_OPERATOR_SOURCE && op != CAIRO_OPERATOR_OVER) ||
++ (dst->format != CAIRO_FORMAT_RGB24))
++ return CAIRO_INT_STATUS_UNSUPPORTED;
+
+- status = _cairo_clip_get_region (clip, &clip_region);
+- assert (status != CAIRO_INT_STATUS_NOTHING_TO_DO);
+- if (status)
+- return status;
++ /* If we have a fallback mask clip set on the dst, we have
++ * to go through the fallback path, but only if we're not
++ * doing this for printing */
++ if (clip != NULL) {
++ if ((dst->flags & CAIRO_WIN32_SURFACE_FOR_PRINTING) == 0) {
++ cairo_region_t *clip_region;
++ cairo_status_t status;
++
++ status = _cairo_clip_get_region (clip, &clip_region);
++ assert (status != CAIRO_INT_STATUS_NOTHING_TO_DO);
++ if (status)
++ return status;
+
+- _cairo_win32_surface_set_clip_region (surface, clip_region);
++ _cairo_win32_surface_set_clip_region (surface, clip_region);
++ }
+ }
+- }
+
+- solid_pattern = (cairo_solid_pattern_t *)source;
+- color = RGB(((int)solid_pattern->color.red_short) >> 8,
+- ((int)solid_pattern->color.green_short) >> 8,
+- ((int)solid_pattern->color.blue_short) >> 8);
++ solid_pattern = (cairo_solid_pattern_t *)source;
++ color = RGB(((int)solid_pattern->color.red_short) >> 8,
++ ((int)solid_pattern->color.green_short) >> 8,
++ ((int)solid_pattern->color.blue_short) >> 8);
+
+- cairo_win32_scaled_font_get_device_to_logical(scaled_font, &device_to_logical);
++ cairo_win32_scaled_font_get_device_to_logical(scaled_font, &device_to_logical);
+
+- SaveDC(dst->dc);
++ SaveDC(dst->dc);
+
+- cairo_win32_scaled_font_select_font(scaled_font, dst->dc);
+- SetTextColor(dst->dc, color);
+- SetTextAlign(dst->dc, TA_BASELINE | TA_LEFT);
+- SetBkMode(dst->dc, TRANSPARENT);
++ cairo_win32_scaled_font_select_font(scaled_font, dst->dc);
++ SetTextColor(dst->dc, color);
++ SetTextAlign(dst->dc, TA_BASELINE | TA_LEFT);
++ SetBkMode(dst->dc, TRANSPARENT);
+
+- if (num_glyphs > STACK_GLYPH_SIZE) {
+- glyph_buf = (WORD *) _cairo_malloc_ab (num_glyphs, sizeof(WORD));
+- dxy_buf = (int *) _cairo_malloc_abc (num_glyphs, sizeof(int), 2);
+- }
++ if (num_glyphs > STACK_GLYPH_SIZE) {
++ glyph_buf = (WORD *) _cairo_malloc_ab (num_glyphs, sizeof(WORD));
++ dxy_buf = (int *) _cairo_malloc_abc (num_glyphs, sizeof(int), 2);
++ }
+
+- /* It is vital that dx values for dxy_buf are calculated from the delta of
+- * _logical_ x coordinates (not user x coordinates) or else the sum of all
+- * previous dx values may start to diverge from the current glyph's x
+- * coordinate due to accumulated rounding error. As a result strings could
+- * be painted shorter or longer than expected. */
++ /* It is vital that dx values for dxy_buf are calculated from the delta of
++ * _logical_ x coordinates (not user x coordinates) or else the sum of all
++ * previous dx values may start to diverge from the current glyph's x
++ * coordinate due to accumulated rounding error. As a result strings could
++ * be painted shorter or longer than expected. */
+
+- user_x = glyphs[0].x;
+- user_y = glyphs[0].y;
++ user_x = glyphs[0].x;
++ user_y = glyphs[0].y;
+
+- cairo_matrix_transform_point(&device_to_logical,
+- &user_x, &user_y);
++ cairo_matrix_transform_point(&device_to_logical,
++ &user_x, &user_y);
+
+- logical_x = _cairo_lround (user_x);
+- logical_y = _cairo_lround (user_y);
++ logical_x = _cairo_lround (user_x);
++ logical_y = _cairo_lround (user_y);
+
+- start_x = logical_x;
+- start_y = logical_y;
++ start_x = logical_x;
++ start_y = logical_y;
+
+- for (i = 0, j = 0; i < num_glyphs; ++i, j = 2 * i) {
+- glyph_buf[i] = (WORD) glyphs[i].index;
+- if (i == num_glyphs - 1) {
+- dxy_buf[j] = 0;
+- dxy_buf[j+1] = 0;
+- } else {
+- double next_user_x = glyphs[i+1].x;
+- double next_user_y = glyphs[i+1].y;
+- int next_logical_x, next_logical_y;
++ for (i = 0, j = 0; i < num_glyphs; ++i, j = 2 * i) {
++ glyph_buf[i] = (WORD) glyphs[i].index;
++ if (i == num_glyphs - 1) {
++ dxy_buf[j] = 0;
++ dxy_buf[j+1] = 0;
++ } else {
++ double next_user_x = glyphs[i+1].x;
++ double next_user_y = glyphs[i+1].y;
++ int next_logical_x, next_logical_y;
+
+- cairo_matrix_transform_point(&device_to_logical,
+- &next_user_x, &next_user_y);
++ cairo_matrix_transform_point(&device_to_logical,
++ &next_user_x, &next_user_y);
+
+- next_logical_x = _cairo_lround (next_user_x);
+- next_logical_y = _cairo_lround (next_user_y);
++ next_logical_x = _cairo_lround (next_user_x);
++ next_logical_y = _cairo_lround (next_user_y);
+
+- dxy_buf[j] = _cairo_lround (next_logical_x - logical_x);
+- dxy_buf[j+1] = _cairo_lround (logical_y - next_logical_y);
+- /* note that GDI coordinate system is inverted */
++ dxy_buf[j] = _cairo_lround (next_logical_x - logical_x);
++ dxy_buf[j+1] = _cairo_lround (logical_y - next_logical_y);
++ /* note that GDI coordinate system is inverted */
+
+- logical_x = next_logical_x;
+- logical_y = next_logical_y;
+- }
+- }
++ logical_x = next_logical_x;
++ logical_y = next_logical_y;
++ }
++ }
+
+- /* Using glyph indices for a Type 1 font does not work on a
+- * printer DC. The win32 printing surface will convert the the
+- * glyph indices of Type 1 fonts to the unicode values.
+- */
+- if ((dst->flags & CAIRO_WIN32_SURFACE_FOR_PRINTING) &&
+- _cairo_win32_scaled_font_is_type1 (scaled_font))
+- {
+- glyph_index_option = 0;
+- }
+- else
+- {
+- glyph_index_option = ETO_GLYPH_INDEX;
+- }
++ /* Using glyph indices for a Type 1 font does not work on a
++ * printer DC. The win32 printing surface will convert the the
++ * glyph indices of Type 1 fonts to the unicode values.
++ */
++ if ((dst->flags & CAIRO_WIN32_SURFACE_FOR_PRINTING) &&
++ _cairo_win32_scaled_font_is_type1 (scaled_font))
++ {
++ glyph_index_option = 0;
++ }
++ else
++ {
++ glyph_index_option = ETO_GLYPH_INDEX;
++ }
+
+- win_result = ExtTextOutW(dst->dc,
+- start_x,
+- start_y,
+- glyph_index_option | ETO_PDY,
+- NULL,
+- glyph_buf,
+- num_glyphs,
+- dxy_buf);
+- if (!win_result) {
+- _cairo_win32_print_gdi_error("_cairo_win32_surface_show_glyphs(ExtTextOutW failed)");
+- }
++ win_result = ExtTextOutW(dst->dc,
++ start_x,
++ start_y,
++ glyph_index_option | ETO_PDY,
++ NULL,
++ glyph_buf,
++ num_glyphs,
++ dxy_buf);
++ if (!win_result) {
++ _cairo_win32_print_gdi_error("_cairo_win32_surface_show_glyphs(ExtTextOutW failed)");
++ }
+
+- RestoreDC(dst->dc, -1);
++ RestoreDC(dst->dc, -1);
+
+- if (glyph_buf != glyph_buf_stack) {
+- free(glyph_buf);
+- free(dxy_buf);
++ if (glyph_buf != glyph_buf_stack) {
++ free(glyph_buf);
++ free(dxy_buf);
++ }
++ return (win_result) ? CAIRO_STATUS_SUCCESS : CAIRO_INT_STATUS_UNSUPPORTED;
+ }
+- return (win_result) ? CAIRO_STATUS_SUCCESS : CAIRO_INT_STATUS_UNSUPPORTED;
+ #else
+ return CAIRO_INT_STATUS_UNSUPPORTED;
+ #endif
+diff --git a/src/cairo-win32.h b/src/cairo-win32.h
+index 6b86d4e..fcf20b8 100644
+--- a/src/cairo-win32.h
++++ b/src/cairo-win32.h
+@@ -109,6 +109,63 @@ cairo_win32_scaled_font_get_device_to_logical (cairo_scaled_font_t *scaled_font,
+
+ #endif /* CAIRO_HAS_WIN32_FONT */
+
++#if CAIRO_HAS_DWRITE_FONT
++
++/*
++ * Win32 DirectWrite font support
++ */
++cairo_public cairo_font_face_t *
++cairo_dwrite_font_face_create_for_dwrite_fontface(void *dwrite_font, void *dwrite_font_face);
++
++#endif /* CAIRO_HAS_DWRITE_FONT */
++
++#if CAIRO_HAS_D2D_SURFACE
++
++/**
++ * Create a D2D surface for an HWND
++ *
++ * \param wnd Handle for the window
++ * \return New cairo surface
++ */
++cairo_public cairo_surface_t *
++cairo_d2d_surface_create_for_hwnd(HWND wnd);
++
++/**
++ * Create a D2D surface of a certain size.
++ *
++ * \param format Cairo format of the surface
++ * \param width Width of the surface
++ * \param height Height of the surface
++ * \return New cairo surface
++ */
++cairo_public cairo_surface_t *
++cairo_d2d_surface_create(cairo_format_t format,
++ int width,
++ int height);
++
++/**
++ * Present the backbuffer for a surface create for an HWND. This needs
++ * to be called when the owner of the original window surface wants to
++ * actually present the executed drawing operations to the screen.
++ *
++ * \param surface D2D surface.
++ */
++void cairo_d2d_present_backbuffer(cairo_surface_t *surface);
++
++/**
++ * Scroll the surface, this only moves the surface graphics, it does not
++ * actually scroll child windows or anything like that. Nor does it invalidate
++ * that area of the window.
++ *
++ * \param surface The d2d surface this operation should apply to.
++ * \param x The x delta for the movement
++ * \param y The y delta for the movement
++ * \param clip The clip rectangle, the is the 'part' of the surface that needs
++ * scrolling.
++ */
++void cairo_d2d_scroll(cairo_surface_t *surface, int x, int y, cairo_rectangle_t *clip);
++#endif
++
+ CAIRO_END_DECLS
+
+ #else /* CAIRO_HAS_WIN32_SURFACE */
+diff --git a/src/cairo.h b/src/cairo.h
+index 3a8b8a6..21827aa 100644
+--- a/src/cairo.h
++++ b/src/cairo.h
+@@ -1370,7 +1370,8 @@ typedef enum _cairo_font_type {
+ CAIRO_FONT_TYPE_FT,
+ CAIRO_FONT_TYPE_WIN32,
+ CAIRO_FONT_TYPE_QUARTZ,
+- CAIRO_FONT_TYPE_USER
++ CAIRO_FONT_TYPE_USER,
++ CAIRO_FONT_TYPE_DWRITE
+ } cairo_font_type_t;
+
+ cairo_public cairo_font_type_t
+@@ -2009,7 +2010,7 @@ typedef enum _cairo_surface_type {
+ CAIRO_SURFACE_TYPE_TEE,
+ CAIRO_SURFACE_TYPE_XML,
+ CAIRO_SURFACE_TYPE_SKIA,
+- CAIRO_SURFACE_TYPE_DDRAW
++ CAIRO_SURFACE_TYPE_D2D
+ } cairo_surface_type_t;
+
+ cairo_public cairo_surface_type_t
+diff --git a/src/cairoint.h b/src/cairoint.h
+index b942b4b..58850ab 100644
+--- a/src/cairoint.h
++++ b/src/cairoint.h
+@@ -587,6 +587,12 @@ extern const cairo_private struct _cairo_font_face_backend _cairo_win32_font_fac
+
+ #endif
+
++#if CAIRO_HAS_DWRITE_FONT
++
++extern const cairo_private struct _cairo_font_face_backend _cairo_dwrite_font_face_backend;
++
++#endif
++
+ #if CAIRO_HAS_QUARTZ_FONT
+
+ extern const cairo_private struct _cairo_font_face_backend _cairo_quartz_font_face_backend;
+@@ -932,7 +938,12 @@ typedef struct _cairo_traps {
+ #define CAIRO_FT_FONT_FAMILY_DEFAULT ""
+ #define CAIRO_USER_FONT_FAMILY_DEFAULT "@cairo:"
+
+-#if CAIRO_HAS_WIN32_FONT
++#if CAIRO_HAS_DWRITE_FONT
++
++#define CAIRO_FONT_FAMILY_DEFAULT CAIRO_WIN32_FONT_FAMILY_DEFAULT
++#define CAIRO_FONT_FACE_BACKEND_DEFAULT &_cairo_dwrite_font_face_backend
++
++#elif CAIRO_HAS_WIN32_FONT
+
+ #define CAIRO_FONT_FAMILY_DEFAULT CAIRO_WIN32_FONT_FAMILY_DEFAULT
+ #define CAIRO_FONT_FACE_BACKEND_DEFAULT &_cairo_win32_font_face_backend
+@@ -2617,7 +2628,7 @@ cairo_private int
+ _cairo_ucs4_to_utf8 (uint32_t unicode,
+ char *utf8);
+
+-#if CAIRO_HAS_WIN32_FONT || CAIRO_HAS_QUARTZ_FONT || CAIRO_HAS_PDF_OPERATORS
++#if CAIRO_HAS_WIN32_FONT || CAIRO_HAS_QUARTZ_FONT || CAIRO_HAS_PDF_OPERATORS || CAIRO_HAS_DW_FONT
+ # define CAIRO_HAS_UTF8_TO_UTF16 1
+ #endif
+ #if CAIRO_HAS_UTF8_TO_UTF16