From 4e5fe7c3ac91ef18f98cf0dc94a89e6517e348ca Mon Sep 17 00:00:00 2001 From: Adrian Robert Date: Tue, 29 Mar 2005 05:54:36 +0000 Subject: [PATCH] update impl for DPSshow to handle xshow, yshow, xyshow, ashow, widthshow, and awidthshow git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/back/trunk@20989 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 8 +++ Source/art/ARTContext.m | 118 +++++++++++++++++++++++++++------ Source/art/ftfont-old.m | 142 +++++++++++++++++++++++++++++++++++----- Source/art/ftfont.h | 10 +-- Source/art/ftfont.m | 141 ++++++++++++++++++++++++++++++++++----- 5 files changed, 362 insertions(+), 57 deletions(-) diff --git a/ChangeLog b/ChangeLog index dbe284f..5e5d140 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2005-03-29 Adrian Robert + + * Source/art/ftfont.h, Source/art/ftfont.m, Source/art/ftfont-old.m: + Support DPSxshow, xyshow, ashow, widthshow, and awidthshow in same + drawString:... method that was just implementing DPSshow, and drop + the stub that was slated to handle the former methods. + * Source/art/ARTContext.m: Use the methods defined above. + 2005-03-28 Richard Frith-Macdonald * Source/win32/WIN32Server.m: fix for locating window at point. diff --git a/Source/art/ARTContext.m b/Source/art/ARTContext.m index bcf6093..c8d248b 100644 --- a/Source/art/ARTContext.m +++ b/Source/art/ARTContext.m @@ -54,12 +54,6 @@ of crashing, they just print a warning. toPoint: (NSPoint)aPoint delta: (float)delta -- (void) DPSashow: (float)x : (float)y : (const char*)s -- (void) DPSawidthshow: (float)cx : (float)cy : (int)c : (float)ax : (float)ay -- (void) DPSwidthshow: (float)x : (float)y : (int)c : (const char*)s -DPSxshow, DPSyshow, DPSxyshow - - ** Other unimplemented stuff ** FontInfo: @@ -187,17 +181,67 @@ very expensive /* ----------------------------------------------------------------------- */ /* Text operations */ /* ----------------------------------------------------------------------- */ -- (void) DPSashow: (float)x : (float)y : (const char*)s -{ /* TODO: adds (x,y) in user space to each glyph's x/y advancement */ - NSLog(@"ignoring DPSashow: %g : %g : '%s'",x,y,s); +- (void) DPSashow: (float)ax : (float)ay : (const char*)s +{ /* adds (x,y) in user space to each glyph's x/y advancement */ + NSPoint p; + int x, y; + float numarray[2]; + + if (!wi || !wi->data) return; + if (all_clipped) + return; + + if ([path isEmpty]) return; + p = [path currentPoint]; + + numarray[0] = ax; numarray[1] = ay; + + x = p.x; + y = wi->sy - p.y; + [(id)font + drawString: s + at: x:y + to: clip_x0:clip_y0:clip_x1:clip_y1 : CLIP_DATA : wi->bytes_per_line + : (wi->has_alpha? wi->alpha + clip_x0 + clip_y0 * wi->sx : NULL) : wi->sx + color: fill_color[0]:fill_color[1]:fill_color[2]:fill_color[3] + transform: ctm + deltas: numarray : 1 : 4 + widthChar: 0 + drawinfo: &DI]; + UPDATE_UNBUFFERED } - (void) DPSawidthshow: (float)cx : (float)cy : (int)c : (float)ax : (float)ay : (const char*)s -{ /* TODO: add (ax,ay) in user space to each glyph's x/y advancement and - additionally add (cx,cy) to the character c's advancement */ - NSLog(@"ignoring DPSawidthshow: %g : %g : %i : %g : %g : '%s'", - cx,cy,c,ax,ay,s); +{ /* adds (ax,ay) in user space to every glyph's advancement and (cx,cy) + to character c's x/y advancement */ + NSPoint p; + int x, y; + float numarray[4]; + + if (!wi || !wi->data) return; + if (all_clipped) + return; + + if ([path isEmpty]) return; + p = [path currentPoint]; + + numarray[0] = ax; numarray[1] = ay; + numarray[2] = cx; numarray[3] = cy; + + x = p.x; + y = wi->sy - p.y; + [(id)font + drawString: s + at: x:y + to: clip_x0:clip_y0:clip_x1:clip_y1 : CLIP_DATA : wi->bytes_per_line + : (wi->has_alpha? wi->alpha + clip_x0 + clip_y0 * wi->sx : NULL) : wi->sx + color: fill_color[0]:fill_color[1]:fill_color[2]:fill_color[3] + transform: ctm + deltas: numarray : 1 : 12 + widthChar: c + drawinfo: &DI]; + UPDATE_UNBUFFERED } - (void) DPScharpath: (const char*)s : (int)b @@ -235,13 +279,40 @@ very expensive : (wi->has_alpha? wi->alpha + clip_x0 + clip_y0 * wi->sx : NULL) : wi->sx color: fill_color[0]:fill_color[1]:fill_color[2]:fill_color[3] transform: ctm + deltas: NULL : 0 : 0 + widthChar: 0 drawinfo: &DI]; UPDATE_UNBUFFERED } -- (void) DPSwidthshow: (float)x : (float)y : (int)c : (const char*)s -{ /* TODO: add (x,y) user-space to the character c's advancement */ - NSLog(@"ignoring DPSwidthshow: %g : %g : %i : '%s'",x,y,c,s); +- (void) DPSwidthshow: (float)cx : (float)cy : (int)c : (const char*)s +{ /* adds (x,y) in user space to character c's x/y advancement */ + NSPoint p; + int x, y; + float numarray[2]; + + if (!wi || !wi->data) return; + if (all_clipped) + return; + + if ([path isEmpty]) return; + p = [path currentPoint]; + + numarray[0] = cx; numarray[1] = cy; + + x = p.x; + y = wi->sy - p.y; + [(id)font + drawString: s + at: x:y + to: clip_x0:clip_y0:clip_x1:clip_y1 : CLIP_DATA : wi->bytes_per_line + : (wi->has_alpha? wi->alpha + clip_x0 + clip_y0 * wi->sx : NULL) : wi->sx + color: fill_color[0]:fill_color[1]:fill_color[2]:fill_color[3] + transform: ctm + deltas: numarray : 1 : 8 + widthChar: c + drawinfo: &DI]; + UPDATE_UNBUFFERED } - (void) DPSxshow: (const char*)s : (const float*)numarray : (int)size @@ -262,9 +333,12 @@ very expensive drawString: s at: x:y to: clip_x0:clip_y0:clip_x1:clip_y1 : CLIP_DATA : wi->bytes_per_line + : (wi->has_alpha? wi->alpha + clip_x0 + clip_y0 * wi->sx : NULL) : wi->sx color: fill_color[0]:fill_color[1]:fill_color[2]:fill_color[3] transform: ctm - deltas: numarray : size : 1]; + deltas: numarray : size : 1 + widthChar: 0 + drawinfo: &DI]; UPDATE_UNBUFFERED } @@ -286,9 +360,12 @@ very expensive drawString: s at: x:y to: clip_x0:clip_y0:clip_x1:clip_y1 : CLIP_DATA : wi->bytes_per_line + : (wi->has_alpha? wi->alpha + clip_x0 + clip_y0 * wi->sx : NULL) : wi->sx color: fill_color[0]:fill_color[1]:fill_color[2]:fill_color[3] transform: ctm - deltas: numarray : size : 3]; + deltas: numarray : size : 3 + widthChar: 0 + drawinfo: &DI]; UPDATE_UNBUFFERED } @@ -310,9 +387,12 @@ very expensive drawString: s at: x:y to: clip_x0:clip_y0:clip_x1:clip_y1 : CLIP_DATA : wi->bytes_per_line + : (wi->has_alpha? wi->alpha + clip_x0 + clip_y0 * wi->sx : NULL) : wi->sx color: fill_color[0]:fill_color[1]:fill_color[2]:fill_color[3] transform: ctm - deltas: numarray : size : 2]; + deltas: numarray : size : 2 + widthChar: 0 + drawinfo: &DI]; UPDATE_UNBUFFERED } diff --git a/Source/art/ftfont-old.m b/Source/art/ftfont-old.m index d3dbf08..a95a50b 100644 --- a/Source/art/ftfont-old.m +++ b/Source/art/ftfont-old.m @@ -874,17 +874,18 @@ static FT_Error ft_get_face(FTC_FaceID fid, FT_Library lib, FT_Pointer data, FT_ /* TODO: the current point probably needs updating after drawing is done */ --(void) drawString: (const char *)s - at: (int)x:(int)y - to: (int)x0:(int)y0:(int)x1:(int)y1:(unsigned char *)buf:(int)bpl - color:(unsigned char)r:(unsigned char)g:(unsigned char)b:(unsigned char)alpha - transform: (NSAffineTransform *)transform - deltas: (const float *)delta_data : (int)delta_size : (int)delta_flags; -{ -/* TODO */ -} - - +/* draw string at point, clipped, w/given color and alpha, and possible deltas: + flags & 0x1: data contains x offsets, use instead of glyph x advance + flags & 0x2: data contains y offsets, use instead of glyph y advance + flags & 0x4: data contains a single x and y offset, which should be added to + font's advancements for each glyph; results are undefined if + this option is combined with either x or y offsets (0x1,0x2) + flags & 0x8: data contains a single x and y offset, which should be added to + font's advancement for glyph identified by 'wch'; if combined + with 0x4 deltas contain exactly two offsets for x and y, the + first for every character, the second for 'wch'; results are + undefined if 0x8 is combined with 0x2 or 0x1 + */ -(void) drawString: (const char *)s at: (int)x : (int)y to: (int)x0 : (int)y0 : (int)x1 : (int)y1 @@ -892,6 +893,8 @@ static FT_Error ft_get_face(FTC_FaceID fid, FT_Library lib, FT_Pointer data, FT_ : (unsigned char *)abuf : (int)abpl color:(unsigned char)r : (unsigned char)g : (unsigned char)b : (unsigned char)alpha transform: (NSAffineTransform *)transform + deltas: (const float *)delta_data : (int)delta_size : (int)delta_flags + widthChar: (int) wch drawinfo: (draw_info_t *)di { #if 0 @@ -900,6 +903,7 @@ static FT_Error ft_get_face(FTC_FaceID fid, FT_Library lib, FT_Pointer data, FT_ const unsigned char *c; unsigned char ch; unsigned int uch; + int d; FTC_CMapDescRec cmap; unsigned int glyph; @@ -1034,6 +1038,7 @@ static FT_Error ft_get_face(FTC_FaceID fid, FT_Library lib, FT_Pointer data, FT_ cmap.face_id = imgd.font.face_id; cmap.u.encoding = ft_encoding_unicode; cmap.type = FTC_CMAP_BY_ENCODING; + d=0; for (c = s; *c; c++) { @@ -1109,7 +1114,44 @@ static FT_Error ft_get_face(FTC_FaceID fid, FT_Library lib, FT_Pointer data, FT_ if (!sbit->buffer) { - x += sbit->xadvance; + if (!delta_flags) + { + x += sbit->xadvance; + } + else + { + if (delta_flags & 0x1) + x += delta_data[d++]; + if (delta_flags & 0x2) + y += (transform->matrix.m22 < 0) ? + delta_data[d++] : -delta_data[d++]; + if (delta_flags & 0x4) + { + x += sbit->xadvance + delta_data[0]; + y += /*sbit->yadvance +*/ (transform->matrix.m22 < 0) ? + delta_data[1] : -delta_data[1]; + if ((delta_flags & 0x8) && (uch == wch)) + { + x += delta_data[2]; + y += (transform->matrix.m22 < 0) ? + delta_data[3] : -delta_data[3]; + } + } + else if (delta_flags & 0x8) + { + if (uch == wch) + { + x += sbit->xadvance + delta_data[0]; + y += /*sbit->yadvance +*/ (transform->matrix.m22 < 0) ? + delta_data[1] : -delta_data[1]; + } + else + { + x += sbit->xadvance; + /*y += sbit->yadvance;*/ + } + } + } continue; } @@ -1218,7 +1260,44 @@ static FT_Error ft_get_face(FTC_FaceID fid, FT_Library lib, FT_Pointer data, FT_ NSLog(@"unhandled font bitmap format %i", sbit->format); } - x += sbit->xadvance; + if (!delta_flags) + { + x += sbit->xadvance; + } + else + { + if (delta_flags & 0x1) + x += delta_data[d++]; + if (delta_flags & 0x2) + y += (transform->matrix.m22 < 0) ? + delta_data[d++] : -delta_data[d++]; + if (delta_flags & 0x4) + { + x += sbit->xadvance + delta_data[0]; + y += /*sbit->yadvance +*/ (transform->matrix.m22 < 0) ? + delta_data[1] : -delta_data[1]; + if ((delta_flags & 0x8) && (uch == wch)) + { + x += delta_data[2]; + y += (transform->matrix.m22 < 0) ? + delta_data[3] : -delta_data[3]; + } + } + else if (delta_flags & 0x8) + { + if (uch == wch) + { + x += sbit->xadvance + delta_data[0]; + y += /*sbit->yadvance +*/ (transform->matrix.m22 < 0) ? + delta_data[1] : -delta_data[1]; + } + else + { + x += sbit->xadvance; + /*y += sbit->yadvance;*/ + } + } + } } else { @@ -1324,8 +1403,41 @@ static FT_Error ft_get_face(FTC_FaceID fid, FT_Library lib, FT_Pointer data, FT_ NSLog(@"unhandled font bitmap format %i", gb->bitmap.pixel_mode); } - ftdelta.x += gl->advance.x >> 10; - ftdelta.y += gl->advance.y >> 10; + if (!delta_flags) + { + ftdelta.x += gl->advance.x >> 10; + ftdelta.y += gl->advance.y >> 10; + } + else + { + if (delta_flags & 0x1) + ftdelta.x += delta_data[d++] * 64.0; + if (delta_flags & 0x2) + ftdelta.y += delta_data[d++] * 64.0; + if (delta_flags & 0x4) + { + ftdelta.x += (gl->advance.x >> 10) + delta_data[0] * 64.0; + ftdelta.y += (gl->advance.y >> 10) + delta_data[1] * 64.0; + if ((delta_flags & 0x8) && (uch == wch)) + { + ftdelta.x += delta_data[2] * 64.0; + ftdelta.y += delta_data[3] * 64.0; + } + } + else if (delta_flags & 0x8) + { + if (uch == wch) + { + ftdelta.x += (gl->advance.x>>10) + delta_data[0] * 64.0; + ftdelta.y += (gl->advance.y>>10) + delta_data[1] * 64.0; + } + else + { + ftdelta.x += gl->advance.x >> 10; + ftdelta.y += gl->advance.y >> 10; + } + } + } FT_Done_Glyph(gl); } diff --git a/Source/art/ftfont.h b/Source/art/ftfont.h index 612d1b3..060b501 100644 --- a/Source/art/ftfont.h +++ b/Source/art/ftfont.h @@ -34,6 +34,8 @@ color: (unsigned char)r : (unsigned char)g : (unsigned char)b : (unsigned char)alpha transform: (NSAffineTransform *)transform + deltas: (const float *)delta_data : (int)delta_size : (int)delta_flags + widthChar: (int) wch drawinfo: (struct draw_info_s *)di; -(void) drawGlyphs: (const NSGlyph *)glyphs : (int)length @@ -55,14 +57,6 @@ transform: (NSAffineTransform *)transform drawinfo: (struct draw_info_s *)di; -/* TODO: see if this is really necessary */ --(void) drawString: (const char *)s - at: (int)x:(int)y - to: (int)x0:(int)y0:(int)x1:(int)y1:(unsigned char *)buf:(int)bpl - color:(unsigned char)r:(unsigned char)g:(unsigned char)b:(unsigned char)alpha - transform: (NSAffineTransform *)transform - deltas: (const float *)delta_data : (int)delta_size : (int)delta_flags; - -(void) outlineString: (const char *)s at: (float)x : (float)y gstate: (void *)func_param; diff --git a/Source/art/ftfont.m b/Source/art/ftfont.m index 21255bf..37d025d 100644 --- a/Source/art/ftfont.m +++ b/Source/art/ftfont.m @@ -873,17 +873,18 @@ static FT_Error ft_get_face(FTC_FaceID fid, FT_Library lib, FT_Pointer data, FT_ /* TODO: the current point probably needs updating after drawing is done */ --(void) drawString: (const char *)s - at: (int)x:(int)y - to: (int)x0:(int)y0:(int)x1:(int)y1:(unsigned char *)buf:(int)bpl - color:(unsigned char)r:(unsigned char)g:(unsigned char)b:(unsigned char)alpha - transform: (NSAffineTransform *)transform - deltas: (const float *)delta_data : (int)delta_size : (int)delta_flags; -{ -/* TODO */ -} - - +/* draw string at point, clipped, w/given color and alpha, and possible deltas: + flags & 0x1: data contains x offsets, use instead of glyph x advance + flags & 0x2: data contains y offsets, use instead of glyph y advance + flags & 0x4: data contains a single x and y offset, which should be added to + font's advancements for each glyph; results are undefined if + this option is combined with either x or y offsets (0x1,0x2) + flags & 0x8: data contains a single x and y offset, which should be added to + font's advancement for glyph identified by 'wch'; if combined + with 0x4 deltas contain exactly two offsets for x and y, the + first for every character, the second for 'wch'; results are + undefined if 0x8 is combined with 0x2 or 0x1 + */ -(void) drawString: (const char *)s at: (int)x : (int)y to: (int)x0 : (int)y0 : (int)x1 : (int)y1 @@ -891,11 +892,14 @@ static FT_Error ft_get_face(FTC_FaceID fid, FT_Library lib, FT_Pointer data, FT_ : (unsigned char *)abuf : (int)abpl color:(unsigned char)r : (unsigned char)g : (unsigned char)b : (unsigned char)alpha transform: (NSAffineTransform *)transform + deltas: (const float *)delta_data : (int)delta_size : (int)delta_flags + widthChar: (int) wch drawinfo: (draw_info_t *)di { const unsigned char *c; unsigned char ch; unsigned int uch; + int d; unsigned int glyph; @@ -1049,7 +1053,44 @@ static FT_Error ft_get_face(FTC_FaceID fid, FT_Library lib, FT_Pointer data, FT_ if (!sbit->buffer) { - x += sbit->xadvance; + if (!delta_flags) + { + x += sbit->xadvance; + } + else + { + if (delta_flags & 0x1) + x += delta_data[d++]; + if (delta_flags & 0x2) + y += (transform->matrix.m22 < 0) ? + delta_data[d++] : -delta_data[d++]; + if (delta_flags & 0x4) + { + x += sbit->xadvance + delta_data[0]; + y += /*sbit->yadvance +*/ (transform->matrix.m22 < 0) ? + delta_data[1] : -delta_data[1]; + if ((delta_flags & 0x8) && (uch == wch)) + { + x += delta_data[2]; + y += (transform->matrix.m22 < 0) ? + delta_data[3] : -delta_data[3]; + } + } + else if (delta_flags & 0x8) + { + if (uch == wch) + { + x += sbit->xadvance + delta_data[0]; + y += /*sbit->yadvance +*/ (transform->matrix.m22 < 0) ? + delta_data[1] : -delta_data[1]; + } + else + { + x += sbit->xadvance; + /*y += sbit->yadvance;*/ + } + } + } continue; } @@ -1158,7 +1199,44 @@ static FT_Error ft_get_face(FTC_FaceID fid, FT_Library lib, FT_Pointer data, FT_ NSLog(@"unhandled font bitmap format %i", sbit->format); } - x += sbit->xadvance; + if (!delta_flags) + { + x += sbit->xadvance; + } + else + { + if (delta_flags & 0x1) + x += delta_data[d++]; + if (delta_flags & 0x2) + y += (transform->matrix.m22 < 0) ? + delta_data[d++] : -delta_data[d++]; + if (delta_flags & 0x4) + { + x += sbit->xadvance + delta_data[0]; + y += /*sbit->yadvance +*/ (transform->matrix.m22 < 0) ? + delta_data[1] : -delta_data[1]; + if ((delta_flags & 0x8) && (uch == wch)) + { + x += delta_data[2]; + y += (transform->matrix.m22 < 0) ? + delta_data[3] : -delta_data[3]; + } + } + else if (delta_flags & 0x8) + { + if (uch == wch) + { + x += sbit->xadvance + delta_data[0]; + y += /*sbit->yadvance +*/ (transform->matrix.m22 < 0) ? + delta_data[1] : -delta_data[1]; + } + else + { + x += sbit->xadvance; + /*y += sbit->yadvance;*/ + } + } + } } else { @@ -1265,8 +1343,41 @@ static FT_Error ft_get_face(FTC_FaceID fid, FT_Library lib, FT_Pointer data, FT_ NSLog(@"unhandled font bitmap format %i", gb->bitmap.pixel_mode); } - ftdelta.x += gl->advance.x >> 10; - ftdelta.y += gl->advance.y >> 10; + if (!delta_flags) + { + ftdelta.x += gl->advance.x >> 10; + ftdelta.y += gl->advance.y >> 10; + } + else + { + if (delta_flags & 0x1) + ftdelta.x += delta_data[d++] * 64.0; + if (delta_flags & 0x2) + ftdelta.y += delta_data[d++] * 64.0; + if (delta_flags & 0x4) + { + ftdelta.x += (gl->advance.x >> 10) + delta_data[0] * 64.0; + ftdelta.y += (gl->advance.y >> 10) + delta_data[1] * 64.0; + if ((delta_flags & 0x8) && (uch == wch)) + { + ftdelta.x += delta_data[2] * 64.0; + ftdelta.y += delta_data[3] * 64.0; + } + } + else if (delta_flags & 0x8) + { + if (uch == wch) + { + ftdelta.x += (gl->advance.x >> 10) + delta_data[0] * 64.0; + ftdelta.y += (gl->advance.y >> 10) + delta_data[1] * 64.0; + } + else + { + ftdelta.x += gl->advance.x >> 10; + ftdelta.y += gl->advance.y >> 10; + } + } + } FT_Done_Glyph(gl); }