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
This commit is contained in:
Fred Kiefer 2008-04-02 22:10:32 +00:00
parent 19dda8e5a7
commit 9ca5ecc181
3 changed files with 51 additions and 5 deletions

View file

@ -1,3 +1,9 @@
2008-04-03 Fred Kiefer <FredKiefer@gmx.de>
* Source/cairo/CairoFontInfo.m (-appendBezierPathWithGlyphs:...):
Correct implementation.
* Source/cairo/CairoGState.m (-DPScharpath::): Correct implementation.
2008-03-29 Fred Kiefer <FredKiefer@gmx.de> 2008-03-29 Fred Kiefer <FredKiefer@gmx.de>
* Source/cairo/CairoFontEnumerator.m, * Source/cairo/CairoFontEnumerator.m,

View file

@ -338,9 +338,10 @@ BOOL _cairo_extents_for_NSGlyph(cairo_scaled_font_t *scaled_font, NSGlyph glyph,
objc_free(cdata); objc_free(cdata);
return; return;
} }
// Use flip matrix
cairo_matrix_init(&font_matrix, matrix[0], matrix[1], matrix[2], 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); cairo_set_font_matrix(ct, &font_matrix);
if (cairo_status(ct) != CAIRO_STATUS_SUCCESS) 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; 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); cairo_text_path(ct, str);
if (cairo_status(ct) == CAIRO_STATUS_SUCCESS) 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)]; [path lineToPoint: NSMakePoint(data[1].point.x, data[1].point.y)];
break; break;
case CAIRO_PATH_CURVE_TO: case CAIRO_PATH_CURVE_TO:
[path curveToPoint: NSMakePoint(data[1].point.x, data[1].point.y) [path curveToPoint: NSMakePoint(data[3].point.x, data[3].point.y)
controlPoint1: NSMakePoint(data[2].point.x, data[2].point.y) controlPoint1: NSMakePoint(data[1].point.x, data[1].point.y)
controlPoint2: NSMakePoint(data[3].point.x, data[3].point.y)]; controlPoint2: NSMakePoint(data[2].point.x, data[2].point.y)];
break; break;
case CAIRO_PATH_CLOSE_PATH: case CAIRO_PATH_CLOSE_PATH:
[path closePath]; [path closePath];

View file

@ -313,6 +313,37 @@ static float floatToUserSpace(NSAffineTransform *ctm, float f)
c[b] = 0; c[b] = 0;
cairo_text_path(_ct, c); cairo_text_path(_ct, c);
GS_ENDITEMBUF(); 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);
}
} }
} }