mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2025-12-27 12:50:12 +01:00
win32: Compile, but broken
First step: just make it compile again but crash upon usage.
This commit is contained in:
parent
4790bbf596
commit
bbacfc4e83
4 changed files with 18 additions and 273 deletions
|
|
@ -45,6 +45,8 @@
|
|||
#include "cairoint.h"
|
||||
|
||||
#include "cairo-win32-private.h"
|
||||
|
||||
#include "cairo-array-private.h"
|
||||
#include "cairo-error-private.h"
|
||||
#include "cairo-image-surface-private.h"
|
||||
#include "cairo-pattern-private.h"
|
||||
|
|
@ -1388,6 +1390,7 @@ _cairo_win32_scaled_font_glyph_init (void *abstract_font,
|
|||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static cairo_int_status_t
|
||||
_cairo_win32_scaled_font_show_glyphs (void *abstract_font,
|
||||
cairo_operator_t op,
|
||||
|
|
@ -1496,13 +1499,7 @@ _cairo_win32_scaled_font_show_glyphs (void *abstract_font,
|
|||
if (scaled_font->quality == CLEARTYPE_QUALITY)
|
||||
mask.base.has_component_alpha = TRUE;
|
||||
|
||||
status = _cairo_surface_composite (op, pattern,
|
||||
&mask.base,
|
||||
&surface->base,
|
||||
source_x, source_y,
|
||||
0, 0,
|
||||
dest_x, dest_y,
|
||||
width, height,
|
||||
status = _cairo_surface_mask (&surface->base, op, pattern, &mask.base,
|
||||
clip_region);
|
||||
|
||||
_cairo_pattern_fini (&mask.base);
|
||||
|
|
@ -1510,6 +1507,7 @@ _cairo_win32_scaled_font_show_glyphs (void *abstract_font,
|
|||
return status;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static cairo_int_status_t
|
||||
_cairo_win32_scaled_font_load_truetype_table (void *abstract_font,
|
||||
|
|
@ -1963,7 +1961,6 @@ const cairo_scaled_font_backend_t _cairo_win32_scaled_font_backend = {
|
|||
_cairo_win32_scaled_font_glyph_init,
|
||||
NULL, /* _cairo_win32_scaled_font_text_to_glyphs, FIXME */
|
||||
_cairo_win32_scaled_font_ucs4_to_index,
|
||||
_cairo_win32_scaled_font_show_glyphs,
|
||||
_cairo_win32_scaled_font_load_truetype_table,
|
||||
_cairo_win32_scaled_font_index_to_ucs4,
|
||||
_cairo_win32_scaled_font_is_synthetic,
|
||||
|
|
@ -2218,14 +2215,11 @@ cairo_win32_font_face_create_for_logfontw_hfont (LOGFONTW *logfont, HFONT font)
|
|||
if (unlikely (status))
|
||||
goto FAIL;
|
||||
|
||||
DONE:
|
||||
_cairo_win32_font_face_hash_table_unlock ();
|
||||
|
||||
return &font_face->base;
|
||||
|
||||
FAIL:
|
||||
_cairo_win32_font_face_hash_table_unlock ();
|
||||
|
||||
return (cairo_font_face_t *)&_cairo_font_face_nil;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1441,8 +1441,7 @@ _cairo_win32_printing_surface_emit_win32_glyphs (cairo_win32_surface_t *surface
|
|||
cairo_glyph_t *glyphs,
|
||||
int num_glyphs,
|
||||
cairo_scaled_font_t *scaled_font,
|
||||
const cairo_clip_t *clip,
|
||||
int *remaining_glyphs)
|
||||
const cairo_clip_t *clip)
|
||||
{
|
||||
cairo_matrix_t ctm;
|
||||
cairo_glyph_t *unicode_glyphs;
|
||||
|
|
@ -1504,7 +1503,6 @@ _cairo_win32_printing_surface_emit_win32_glyphs (cairo_win32_surface_t *surface
|
|||
i - first + 1,
|
||||
scaled_font,
|
||||
clip,
|
||||
remaining_glyphs,
|
||||
! sequence_is_unicode);
|
||||
first = i + 1;
|
||||
if (i < num_glyphs - 1)
|
||||
|
|
@ -1529,8 +1527,7 @@ _cairo_win32_printing_surface_show_glyphs (void *abstract_surfac
|
|||
cairo_glyph_t *glyphs,
|
||||
int num_glyphs,
|
||||
cairo_scaled_font_t *scaled_font,
|
||||
const cairo_clip_t *clip,
|
||||
int *remaining_glyphs)
|
||||
const cairo_clip_t *clip)
|
||||
{
|
||||
cairo_win32_surface_t *surface = abstract_surface;
|
||||
cairo_status_t status = CAIRO_STATUS_SUCCESS;
|
||||
|
|
@ -1612,8 +1609,7 @@ _cairo_win32_printing_surface_show_glyphs (void *abstract_surfac
|
|||
glyphs,
|
||||
num_glyphs,
|
||||
scaled_font,
|
||||
clip,
|
||||
remaining_glyphs);
|
||||
clip);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -1885,9 +1881,6 @@ static const cairo_surface_backend_t cairo_win32_printing_surface_backend = {
|
|||
NULL, /* flush */
|
||||
NULL, /* mark_dirty_rectangle */
|
||||
|
||||
NULL, /* scaled_font_fini */
|
||||
NULL, /* scaled_glyph_fini */
|
||||
|
||||
_cairo_win32_printing_surface_paint,
|
||||
NULL, /* mask */
|
||||
_cairo_win32_printing_surface_stroke,
|
||||
|
|
|
|||
|
|
@ -172,7 +172,6 @@ _cairo_win32_surface_show_glyphs_internal (void *surface,
|
|||
int num_glyphs,
|
||||
cairo_scaled_font_t *scaled_font,
|
||||
const cairo_clip_t *clip,
|
||||
int *remaining_glyphs,
|
||||
cairo_bool_t glyph_indices);
|
||||
|
||||
cairo_int_status_t
|
||||
|
|
@ -182,8 +181,7 @@ _cairo_win32_surface_show_glyphs (void *surface,
|
|||
cairo_glyph_t *glyphs,
|
||||
int num_glyphs,
|
||||
cairo_scaled_font_t *scaled_font,
|
||||
const cairo_clip_t *clip,
|
||||
int *remaining_glyphs);
|
||||
const cairo_clip_t *clip);
|
||||
|
||||
cairo_surface_t *
|
||||
_cairo_win32_surface_create_similar (void *abstract_src,
|
||||
|
|
@ -191,18 +189,6 @@ _cairo_win32_surface_create_similar (void *abstract_src,
|
|||
int width,
|
||||
int height);
|
||||
|
||||
cairo_status_t
|
||||
_cairo_win32_surface_clone_similar (void *abstract_surface,
|
||||
cairo_surface_t *src,
|
||||
cairo_content_t content,
|
||||
int src_x,
|
||||
int src_y,
|
||||
int width,
|
||||
int height,
|
||||
int *clone_offset_x,
|
||||
int *clone_offset_y,
|
||||
cairo_surface_t **clone_out);
|
||||
|
||||
static inline void
|
||||
_cairo_matrix_to_win32_xform (const cairo_matrix_t *m,
|
||||
XFORM *xform)
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@
|
|||
#include "cairo-win32-private.h"
|
||||
#include "cairo-scaled-font-subsets-private.h"
|
||||
#include "cairo-surface-fallback-private.h"
|
||||
#include "cairo-surface-backend-private.h"
|
||||
|
||||
#include <wchar.h>
|
||||
#include <windows.h>
|
||||
|
|
@ -646,65 +647,6 @@ _cairo_win32_surface_release_source_image (void *abstract_surf
|
|||
cairo_surface_destroy ((cairo_surface_t *)local);
|
||||
}
|
||||
|
||||
static cairo_status_t
|
||||
_cairo_win32_surface_acquire_dest_image (void *abstract_surface,
|
||||
cairo_rectangle_int_t *interest_rect,
|
||||
cairo_image_surface_t **image_out,
|
||||
cairo_rectangle_int_t *image_rect,
|
||||
void **image_extra)
|
||||
{
|
||||
cairo_win32_surface_t *surface = abstract_surface;
|
||||
cairo_win32_surface_t *local = NULL;
|
||||
cairo_status_t status;
|
||||
|
||||
if (surface->image) {
|
||||
GdiFlush();
|
||||
|
||||
*image_out = (cairo_image_surface_t *) surface->image;
|
||||
*image_extra = NULL;
|
||||
*image_rect = surface->extents;
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
status = _cairo_win32_surface_get_subimage (abstract_surface,
|
||||
interest_rect->x,
|
||||
interest_rect->y,
|
||||
interest_rect->width,
|
||||
interest_rect->height,
|
||||
&local);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
*image_out = (cairo_image_surface_t *) local->image;
|
||||
*image_extra = local;
|
||||
*image_rect = *interest_rect;
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static void
|
||||
_cairo_win32_surface_release_dest_image (void *abstract_surface,
|
||||
cairo_rectangle_int_t *interest_rect,
|
||||
cairo_image_surface_t *image,
|
||||
cairo_rectangle_int_t *image_rect,
|
||||
void *image_extra)
|
||||
{
|
||||
cairo_win32_surface_t *surface = abstract_surface;
|
||||
cairo_win32_surface_t *local = image_extra;
|
||||
|
||||
if (!local)
|
||||
return;
|
||||
|
||||
if (!BitBlt (surface->dc,
|
||||
image_rect->x, image_rect->y,
|
||||
image_rect->width, image_rect->height,
|
||||
local->dc,
|
||||
0, 0,
|
||||
SRCCOPY))
|
||||
_cairo_win32_print_gdi_error ("_cairo_win32_surface_release_dest_image");
|
||||
|
||||
cairo_surface_destroy ((cairo_surface_t *)local);
|
||||
}
|
||||
|
||||
cairo_status_t
|
||||
_cairo_win32_surface_set_clip_region (void *abstract_surface,
|
||||
cairo_region_t *region)
|
||||
|
|
@ -1380,6 +1322,7 @@ UNSUPPORTED:
|
|||
if (dst->image) {
|
||||
GdiFlush();
|
||||
|
||||
#if 0
|
||||
return dst->image->backend->composite (op, pattern, mask_pattern,
|
||||
dst->image,
|
||||
src_x, src_y,
|
||||
|
|
@ -1387,6 +1330,7 @@ UNSUPPORTED:
|
|||
dst_x, dst_y,
|
||||
width, height,
|
||||
clip_region);
|
||||
#endif
|
||||
}
|
||||
|
||||
return CAIRO_INT_STATUS_UNSUPPORTED;
|
||||
|
|
@ -1583,7 +1527,6 @@ _cairo_win32_surface_show_glyphs_internal (void *surface,
|
|||
int num_glyphs,
|
||||
cairo_scaled_font_t *scaled_font,
|
||||
const cairo_clip_t *clip,
|
||||
int *remaining_glyphs,
|
||||
cairo_bool_t glyph_indexing)
|
||||
{
|
||||
#if CAIRO_HAS_WIN32_FONT
|
||||
|
|
@ -1733,8 +1676,7 @@ _cairo_win32_surface_show_glyphs (void *surface,
|
|||
cairo_glyph_t *glyphs,
|
||||
int num_glyphs,
|
||||
cairo_scaled_font_t *scaled_font,
|
||||
const cairo_clip_t *clip,
|
||||
int *remaining_glyphs)
|
||||
const cairo_clip_t *clip)
|
||||
{
|
||||
return _cairo_win32_surface_show_glyphs_internal (surface,
|
||||
op,
|
||||
|
|
@ -1743,7 +1685,6 @@ _cairo_win32_surface_show_glyphs (void *surface,
|
|||
num_glyphs,
|
||||
scaled_font,
|
||||
clip,
|
||||
remaining_glyphs,
|
||||
TRUE);
|
||||
}
|
||||
|
||||
|
|
@ -1985,166 +1926,6 @@ cairo_win32_surface_get_image (cairo_surface_t *surface)
|
|||
return ((cairo_win32_surface_t*)surface)->image;
|
||||
}
|
||||
|
||||
static cairo_bool_t
|
||||
_cairo_win32_surface_is_similar (void *surface_a,
|
||||
void *surface_b)
|
||||
{
|
||||
cairo_win32_surface_t *a = surface_a;
|
||||
cairo_win32_surface_t *b = surface_b;
|
||||
|
||||
return a->dc == b->dc;
|
||||
}
|
||||
|
||||
typedef struct _cairo_win32_surface_span_renderer {
|
||||
cairo_span_renderer_t base;
|
||||
|
||||
cairo_operator_t op;
|
||||
const cairo_pattern_t *pattern;
|
||||
cairo_antialias_t antialias;
|
||||
|
||||
uint8_t *mask_data;
|
||||
uint32_t mask_stride;
|
||||
|
||||
cairo_image_surface_t *mask;
|
||||
cairo_win32_surface_t *dst;
|
||||
cairo_region_t *clip_region;
|
||||
|
||||
cairo_composite_rectangles_t composite_rectangles;
|
||||
} cairo_win32_surface_span_renderer_t;
|
||||
|
||||
static cairo_status_t
|
||||
_cairo_win32_surface_span_renderer_render_rows (
|
||||
void *abstract_renderer,
|
||||
int y,
|
||||
int height,
|
||||
const cairo_half_open_span_t *spans,
|
||||
unsigned num_spans)
|
||||
{
|
||||
cairo_win32_surface_span_renderer_t *renderer = abstract_renderer;
|
||||
while (height--)
|
||||
_cairo_image_surface_span_render_row (y++, spans, num_spans, renderer->mask_data, renderer->mask_stride);
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static void
|
||||
_cairo_win32_surface_span_renderer_destroy (void *abstract_renderer)
|
||||
{
|
||||
cairo_win32_surface_span_renderer_t *renderer = abstract_renderer;
|
||||
if (!renderer) return;
|
||||
|
||||
if (renderer->mask != NULL)
|
||||
cairo_surface_destroy (&renderer->mask->base);
|
||||
|
||||
free (renderer);
|
||||
}
|
||||
|
||||
static cairo_status_t
|
||||
_cairo_win32_surface_span_renderer_finish (void *abstract_renderer)
|
||||
{
|
||||
cairo_win32_surface_span_renderer_t *renderer = abstract_renderer;
|
||||
cairo_status_t status = CAIRO_STATUS_SUCCESS;
|
||||
|
||||
if (renderer->pattern == NULL || renderer->mask == NULL)
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
|
||||
status = cairo_surface_status (&renderer->mask->base);
|
||||
if (status == CAIRO_STATUS_SUCCESS) {
|
||||
cairo_composite_rectangles_t *rects = &renderer->composite_rectangles;
|
||||
cairo_win32_surface_t *dst = renderer->dst;
|
||||
cairo_pattern_t *mask_pattern = cairo_pattern_create_for_surface (&renderer->mask->base);
|
||||
/* composite onto the image surface directly if we can */
|
||||
if (dst->image) {
|
||||
GdiFlush(); /* XXX: I'm not sure if this needed or not */
|
||||
|
||||
status = dst->image->backend->composite (renderer->op,
|
||||
renderer->pattern, mask_pattern, dst->image,
|
||||
rects->bounded.x, rects->bounded.y,
|
||||
0, 0, /* mask.x, mask.y */
|
||||
rects->bounded.x, rects->bounded.y,
|
||||
rects->bounded.width, rects->bounded.height,
|
||||
renderer->clip_region);
|
||||
} else {
|
||||
/* otherwise go through the fallback_composite path which
|
||||
* will do the appropriate surface acquisition */
|
||||
status = _cairo_surface_fallback_composite (
|
||||
renderer->op,
|
||||
renderer->pattern, mask_pattern, &dst->base,
|
||||
rects->bounded.x, rects->bounded.y,
|
||||
0, 0, /* mask.x, mask.y */
|
||||
rects->bounded.x, rects->bounded.y,
|
||||
rects->bounded.width, rects->bounded.height,
|
||||
renderer->clip_region);
|
||||
}
|
||||
cairo_pattern_destroy (mask_pattern);
|
||||
|
||||
}
|
||||
if (status != CAIRO_STATUS_SUCCESS)
|
||||
return _cairo_span_renderer_set_error (abstract_renderer,
|
||||
status);
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static cairo_bool_t
|
||||
_cairo_win32_surface_check_span_renderer (cairo_operator_t op,
|
||||
const cairo_pattern_t *pattern,
|
||||
void *abstract_dst,
|
||||
cairo_antialias_t antialias)
|
||||
{
|
||||
(void) op;
|
||||
(void) pattern;
|
||||
(void) abstract_dst;
|
||||
(void) antialias;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static cairo_span_renderer_t *
|
||||
_cairo_win32_surface_create_span_renderer (cairo_operator_t op,
|
||||
const cairo_pattern_t *pattern,
|
||||
void *abstract_dst,
|
||||
cairo_antialias_t antialias,
|
||||
const cairo_composite_rectangles_t *rects,
|
||||
cairo_region_t *clip_region)
|
||||
{
|
||||
cairo_win32_surface_t *dst = abstract_dst;
|
||||
cairo_win32_surface_span_renderer_t *renderer;
|
||||
cairo_status_t status;
|
||||
int width = rects->bounded.width;
|
||||
int height = rects->bounded.height;
|
||||
|
||||
renderer = calloc(1, sizeof(*renderer));
|
||||
if (renderer == NULL)
|
||||
return _cairo_span_renderer_create_in_error (CAIRO_STATUS_NO_MEMORY);
|
||||
|
||||
renderer->base.destroy = _cairo_win32_surface_span_renderer_destroy;
|
||||
renderer->base.finish = _cairo_win32_surface_span_renderer_finish;
|
||||
renderer->base.render_rows = _cairo_win32_surface_span_renderer_render_rows;
|
||||
renderer->op = op;
|
||||
renderer->pattern = pattern;
|
||||
renderer->antialias = antialias;
|
||||
renderer->dst = dst;
|
||||
renderer->clip_region = clip_region;
|
||||
|
||||
renderer->composite_rectangles = *rects;
|
||||
|
||||
/* TODO: support rendering to A1 surfaces (or: go add span
|
||||
* compositing to pixman.) */
|
||||
renderer->mask = (cairo_image_surface_t *)
|
||||
cairo_image_surface_create (CAIRO_FORMAT_A8,
|
||||
width, height);
|
||||
|
||||
status = cairo_surface_status (&renderer->mask->base);
|
||||
|
||||
if (status != CAIRO_STATUS_SUCCESS) {
|
||||
_cairo_win32_surface_span_renderer_destroy (renderer);
|
||||
return _cairo_span_renderer_create_in_error (status);
|
||||
}
|
||||
|
||||
renderer->mask_data = renderer->mask->data - rects->bounded.x - rects->bounded.y * renderer->mask->stride;
|
||||
renderer->mask_stride = renderer->mask->stride;
|
||||
return &renderer->base;
|
||||
}
|
||||
|
||||
|
||||
static const cairo_surface_backend_t cairo_win32_surface_backend = {
|
||||
CAIRO_SURFACE_TYPE_WIN32,
|
||||
_cairo_win32_surface_finish,
|
||||
|
|
@ -2158,32 +1939,23 @@ static const cairo_surface_backend_t cairo_win32_surface_backend = {
|
|||
|
||||
_cairo_win32_surface_acquire_source_image,
|
||||
_cairo_win32_surface_release_source_image,
|
||||
_cairo_win32_surface_acquire_dest_image,
|
||||
_cairo_win32_surface_release_dest_image,
|
||||
NULL, /* clone similar */
|
||||
_cairo_win32_surface_composite,
|
||||
_cairo_win32_surface_fill_rectangles,
|
||||
NULL, /* composite_trapezoids */
|
||||
_cairo_win32_surface_create_span_renderer,
|
||||
_cairo_win32_surface_check_span_renderer,
|
||||
NULL, /* snapshot */
|
||||
|
||||
NULL, /* copy_page */
|
||||
NULL, /* show_page */
|
||||
|
||||
_cairo_win32_surface_get_extents,
|
||||
NULL, /* old_show_glyphs */
|
||||
NULL, /* get_font_options */
|
||||
|
||||
_cairo_win32_surface_flush,
|
||||
NULL, /* mark_dirty_rectangle */
|
||||
NULL, /* scaled_font_fini */
|
||||
NULL, /* scaled_glyph_fini */
|
||||
|
||||
NULL, /* paint */
|
||||
NULL, /* mask */
|
||||
NULL, /* stroke */
|
||||
NULL, /* fill */
|
||||
NULL, /* fill/stroke */
|
||||
_cairo_win32_surface_show_glyphs,
|
||||
|
||||
NULL, /* snapshot */
|
||||
_cairo_win32_surface_is_similar,
|
||||
};
|
||||
|
||||
/* Notes:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue