diff options
Diffstat (limited to 'gfx/cairo/d2d.patch')
-rw-r--r-- | gfx/cairo/d2d.patch | 465 |
1 files changed, 0 insertions, 465 deletions
diff --git a/gfx/cairo/d2d.patch b/gfx/cairo/d2d.patch deleted file mode 100644 index b8dd155e7..000000000 --- a/gfx/cairo/d2d.patch +++ /dev/null @@ -1,465 +0,0 @@ -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 |