From 9ca5ecc181de90f0fa17a125aa4f4fe6b8329172 Mon Sep 17 00:00:00 2001 From: Fred Kiefer Date: Wed, 2 Apr 2008 22:10:32 +0000 Subject: [PATCH] Correct cairo glyph to path conversion. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/back/trunk@26426 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 6 ++++++ Source/cairo/CairoFontInfo.m | 19 ++++++++++++++----- Source/cairo/CairoGState.m | 31 +++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 859681a..d431187 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-04-03 Fred Kiefer + + * Source/cairo/CairoFontInfo.m (-appendBezierPathWithGlyphs:...): + Correct implementation. + * Source/cairo/CairoGState.m (-DPScharpath::): Correct implementation. + 2008-03-29 Fred Kiefer * Source/cairo/CairoFontEnumerator.m, diff --git a/Source/cairo/CairoFontInfo.m b/Source/cairo/CairoFontInfo.m index 35690bb..354ad72 100644 --- a/Source/cairo/CairoFontInfo.m +++ b/Source/cairo/CairoFontInfo.m @@ -338,9 +338,10 @@ BOOL _cairo_extents_for_NSGlyph(cairo_scaled_font_t *scaled_font, NSGlyph glyph, objc_free(cdata); return; } - + + // Use flip matrix cairo_matrix_init(&font_matrix, matrix[0], matrix[1], matrix[2], - matrix[3], matrix[4], matrix[5]); + -matrix[3], matrix[4], matrix[5]); cairo_set_font_matrix(ct, &font_matrix); if (cairo_status(ct) != CAIRO_STATUS_SUCCESS) { @@ -363,6 +364,14 @@ BOOL _cairo_extents_for_NSGlyph(cairo_scaled_font_t *scaled_font, NSGlyph glyph, return; } + if ([path elementCount] > 0) + { + NSPoint p; + + p = [path currentPoint]; + cairo_move_to(ct, floorf(p.x), floorf(p.y)); + } + cairo_text_path(ct, str); if (cairo_status(ct) == CAIRO_STATUS_SUCCESS) { @@ -383,9 +392,9 @@ BOOL _cairo_extents_for_NSGlyph(cairo_scaled_font_t *scaled_font, NSGlyph glyph, [path lineToPoint: NSMakePoint(data[1].point.x, data[1].point.y)]; break; case CAIRO_PATH_CURVE_TO: - [path curveToPoint: NSMakePoint(data[1].point.x, data[1].point.y) - controlPoint1: NSMakePoint(data[2].point.x, data[2].point.y) - controlPoint2: NSMakePoint(data[3].point.x, data[3].point.y)]; + [path curveToPoint: NSMakePoint(data[3].point.x, data[3].point.y) + controlPoint1: NSMakePoint(data[1].point.x, data[1].point.y) + controlPoint2: NSMakePoint(data[2].point.x, data[2].point.y)]; break; case CAIRO_PATH_CLOSE_PATH: [path closePath]; diff --git a/Source/cairo/CairoGState.m b/Source/cairo/CairoGState.m index 9a976b1..1ae5253 100644 --- a/Source/cairo/CairoGState.m +++ b/Source/cairo/CairoGState.m @@ -313,6 +313,37 @@ static float floatToUserSpace(NSAffineTransform *ctm, float f) c[b] = 0; cairo_text_path(_ct, c); GS_ENDITEMBUF(); + if (cairo_status(_ct) == CAIRO_STATUS_SUCCESS) + { + cairo_path_t *cpath; + cairo_path_data_t *data; + int i; + + cpath = cairo_copy_path(_ct); + + for (i = 0; i < cpath->num_data; i += cpath->data[i].header.length) + { + data = &cpath->data[i]; + switch (data->header.type) + { + case CAIRO_PATH_MOVE_TO: + [path moveToPoint: NSMakePoint(data[1].point.x, data[1].point.y)]; + break; + case CAIRO_PATH_LINE_TO: + [path lineToPoint: NSMakePoint(data[1].point.x, data[1].point.y)]; + break; + case CAIRO_PATH_CURVE_TO: + [path curveToPoint: NSMakePoint(data[3].point.x, data[3].point.y) + controlPoint1: NSMakePoint(data[1].point.x, data[1].point.y) + controlPoint2: NSMakePoint(data[2].point.x, data[2].point.y)]; + break; + case CAIRO_PATH_CLOSE_PATH: + [path closePath]; + break; + } + } + cairo_path_destroy(cpath); + } } }