Index: Source/art/ARTContext.m =================================================================== RCS file: /cvsroot/gnustep/gnustep/core/back/Source/art/ARTContext.m,v retrieving revision 1.27 diff -u -r1.27 ARTContext.m --- Source/art/ARTContext.m 20 Jan 2005 21:35:23 -0000 1.27 +++ Source/art/ARTContext.m 24 Mar 2005 01:32:01 -0000 @@ -54,12 +54,6 @@ 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 @@ /* ----------------------------------------------------------------------- */ /* 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 @@ : (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 @@ 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 @@ 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 @@ 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 } Index: Source/art/ftfont.h =================================================================== RCS file: /cvsroot/gnustep/gnustep/core/back/Source/art/ftfont.h,v retrieving revision 1.6 diff -u -r1.6 ftfont.h --- Source/art/ftfont.h 29 Feb 2004 20:45:05 -0000 1.6 +++ Source/art/ftfont.h 24 Mar 2005 01:32:01 -0000 @@ -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; Index: Source/art/ftfont.m =================================================================== RCS file: /cvsroot/gnustep/gnustep/core/back/Source/art/ftfont.m,v retrieving revision 1.45 diff -u -r1.45 ftfont.m --- Source/art/ftfont.m 21 Jan 2005 20:49:29 -0000 1.45 +++ Source/art/ftfont.m 24 Mar 2005 01:32:03 -0000 @@ -873,17 +873,18 @@ /* 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,6 +892,8 @@ : (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; @@ -1049,7 +1052,53 @@ 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 += delta_data[d++]; + if (delta_flags & 0x4) + { + x += sbit->xadvance + delta_data[0]; + y += /*sbit->yadvance +*/ delta_data[1]; + if ((delta_flags & 0x8) && (uch == wch)) + { + x += delta_data[2]; + y += delta_data[3]; + } + } + else if (delta_flags & 0x8) + { + if (uch == wch) + { + x += sbit->xadvance + delta_data[0]; + y += /*sbit->yadvance +*/ delta_data[1]; + } + else + { + x += sbit->xadvance; + /*y += sbit->yadvance;*/ + } + } + else if (delta_flags & 0x8) + { + if (uch == wch) + { + x += sbit->xadvance + delta_data[0]; + y += /*sbit->yadvance +*/ delta_data[1]; + } + else + { + x += sbit->xadvance; + /*y += sbit->yadvance;*/ + } + } + } continue; } @@ -1158,7 +1207,40 @@ 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 += delta_data[d++]; + if (delta_flags & 0x4) + { + x += sbit->xadvance + delta_data[0]; + y += /*sbit->yadvance +*/ delta_data[1]; + if ((delta_flags & 0x8) && (uch == wch)) + { + x += delta_data[2]; + y += delta_data[3]; + } + } + else if (delta_flags & 0x8) + { + if (uch == wch) + { + x += sbit->xadvance + delta_data[0]; + y += /*sbit->yadvance +*/ delta_data[1]; + } + else + { + x += sbit->xadvance; + /*y += sbit->yadvance;*/ + } + } + } } else { @@ -1265,8 +1347,41 @@ 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); } Index: Source/art/ftfont-old.m =================================================================== RCS file: /cvsroot/gnustep/gnustep/core/back/Source/art/ftfont-old.m,v retrieving revision 1.1 diff -u -r1.1 ftfont-old.m --- Source/art/ftfont-old.m 11 Jan 2005 15:02:29 -0000 1.1 +++ Source/art/ftfont-old.m 24 Mar 2005 01:32:04 -0000 @@ -874,17 +874,18 @@ /* 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 @@ : (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 @@ const unsigned char *c; unsigned char ch; unsigned int uch; + int d; FTC_CMapDescRec cmap; unsigned int glyph; @@ -1034,6 +1038,7 @@ 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,53 @@ 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 += delta_data[d++]; + if (delta_flags & 0x4) + { + x += sbit->xadvance + delta_data[0]; + y += /*sbit->yadvance +*/ delta_data[1]; + if ((delta_flags & 0x8) && (uch == wch)) + { + x += delta_data[2]; + y += delta_data[3]; + } + } + else if (delta_flags & 0x8) + { + if (uch == wch) + { + x += sbit->xadvance + delta_data[0]; + y += /*sbit->yadvance +*/ delta_data[1]; + } + else + { + x += sbit->xadvance; + /*y += sbit->yadvance;*/ + } + } + else if (delta_flags & 0x8) + { + if (uch == wch) + { + x += sbit->xadvance + delta_data[0]; + y += /*sbit->yadvance +*/ delta_data[1]; + } + else + { + x += sbit->xadvance; + /*y += sbit->yadvance;*/ + } + } + } continue; } @@ -1218,7 +1269,40 @@ 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 += delta_data[d++]; + if (delta_flags & 0x4) + { + x += sbit->xadvance + delta_data[0]; + y += /*sbit->yadvance +*/ delta_data[1]; + if ((delta_flags & 0x8) && (uch == wch)) + { + x += delta_data[2]; + y += delta_data[3]; + } + } + else if (delta_flags & 0x8) + { + if (uch == wch) + { + x += sbit->xadvance + delta_data[0]; + y += /*sbit->yadvance +*/ delta_data[1]; + } + else + { + x += sbit->xadvance; + /*y += sbit->yadvance;*/ + } + } + } } else { @@ -1324,8 +1408,41 @@ 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); }