From 50b40ec96ddb4690c0f38b01d2c3ec695ff48bf4 Mon Sep 17 00:00:00 2001 From: Jonathan Kew Date: Wed, 22 Apr 2026 13:00:22 -0700 Subject: [PATCH 19/29] Add cairo_win32_surface APIs wanted for gecko --- src/cairo-win32.h | 8 +++++ src/win32/cairo-win32-surface.c | 60 +++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/src/cairo-win32.h b/src/cairo-win32.h index db4cac69f..a2576e2ad 100644 --- a/src/cairo-win32.h +++ b/src/cairo-win32.h @@ -72,6 +72,14 @@ cairo_win32_surface_get_dc (cairo_surface_t *surface); cairo_public cairo_surface_t * cairo_win32_surface_get_image (cairo_surface_t *surface); +cairo_public HDC +cairo_win32_get_dc_with_clip(cairo_t* cr); + +cairo_public cairo_status_t +cairo_win32_surface_get_size(const cairo_surface_t* surface, + int* width, + int* height); + #if CAIRO_HAS_WIN32_FONT /* diff --git a/src/win32/cairo-win32-surface.c b/src/win32/cairo-win32-surface.c index e1ac51558..eb90a4fff 100644 --- a/src/win32/cairo-win32-surface.c +++ b/src/win32/cairo-win32-surface.c @@ -124,6 +124,52 @@ cairo_win32_surface_get_dc (cairo_surface_t *surface) return NULL; } +/** + * cairo_win32_get_dc_with_clip: + * (Mozilla addition) + */ +HDC +cairo_win32_get_dc_with_clip(cairo_t* cr) +{ + cairo_surface_t* surface = cairo_get_target(cr); + if (cr->backend->type == CAIRO_TYPE_DEFAULT) { + cairo_default_context_t* c = (cairo_default_context_t*)cr; + cairo_clip_t* clip = _cairo_clip_copy(_cairo_gstate_get_clip(c->gstate)); + if (_cairo_surface_is_win32(surface)) { + cairo_win32_display_surface_t* winsurf = (cairo_win32_display_surface_t*)surface; + + _cairo_win32_display_surface_set_clip(winsurf, clip); + + _cairo_clip_destroy(clip); + return winsurf->win32.dc; + } + + if (_cairo_surface_is_paginated(surface)) { + cairo_surface_t* target; + + target = _cairo_paginated_surface_get_target(surface); + +#ifndef CAIRO_OMIT_WIN32_PRINTING + if (_cairo_surface_is_win32_printing(target)) { + cairo_status_t status; + cairo_win32_printing_surface_t* psurf = (cairo_win32_printing_surface_t*)target; + + status = _cairo_surface_clipper_set_clip(&psurf->clipper, clip); + + _cairo_clip_destroy(clip); + + if (status) + return NULL; + + return psurf->win32.dc; + } +#endif + } + _cairo_clip_destroy(clip); + } + return NULL; +} + /** * _cairo_surface_is_win32: * @surface: a #cairo_surface_t @@ -299,3 +345,17 @@ _cairo_win32_surface_emit_glyphs (cairo_win32_surface_t *dst, #endif } #undef STACK_GLYPH_SIZE + +cairo_status_t +cairo_win32_surface_get_size(const cairo_surface_t* surface, int* width, int* height) +{ + if (!_cairo_surface_is_win32(surface)) + return CAIRO_STATUS_SURFACE_TYPE_MISMATCH; + + const cairo_win32_surface_t* winsurface = (const cairo_win32_surface_t*)surface; + + *width = winsurface->extents.width; + *height = winsurface->extents.height; + + return CAIRO_STATUS_SUCCESS; +} \ No newline at end of file -- 2.53.0