X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fdevices%2Ftext.c;h=d5b4bbc73399a8acd35ca1838f7cbfd3653b2036;hb=d3fb559b6b8ca9c122b310cae1a3e8b0805f97ad;hp=652b20a8feb91bb82735098399bf347c26856a56;hpb=5c97ba8aa76235db3e4f7bf833ef1d73744affaf;p=swftools.git diff --git a/lib/devices/text.c b/lib/devices/text.c index 652b20a..d5b4bbc 100644 --- a/lib/devices/text.c +++ b/lib/devices/text.c @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -39,16 +40,20 @@ typedef struct _textpage { typedef struct _internal { textpage_t*first_page; textpage_t*current_page; + double currentx; + double currenty; + double lastadvance; } internal_t; int text_setparameter(gfxdevice_t*dev, const char*key, const char*value) { internal_t*i = (internal_t*)dev->internal; + return 0; } void text_startpage(gfxdevice_t*dev, int width, int height) { internal_t*i = (internal_t*)dev->internal; - if(i->first_page) { + if(!i->first_page) { i->first_page = i->current_page = (textpage_t*)malloc(sizeof(textpage_t)); } else { i->current_page->next = (textpage_t*)malloc(sizeof(textpage_t)); @@ -56,6 +61,11 @@ void text_startpage(gfxdevice_t*dev, int width, int height) } i->current_page->textsize = 4096; i->current_page->text = malloc(i->current_page->textsize); + i->current_page->textpos = 0; + i->current_page->next = 0; + i->currentx = 0; + i->currenty = 0; + i->lastadvance = 0; } void text_startclip(gfxdevice_t*dev, gfxline_t*line) { @@ -82,19 +92,44 @@ void text_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, internal_t*i = (internal_t*)dev->internal; } void text_addfont(gfxdevice_t*dev, gfxfont_t*font) {} -void text_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) + +static void addchar(gfxdevice_t*dev, int unicode) { internal_t*i = (internal_t*)dev->internal; - + if(!i->current_page) { + text_startpage(dev, 0, 0); + } if(i->current_page->textpos + 10 > i->current_page->textsize) { i->current_page->textsize += 4096; i->current_page->text = realloc(i->current_page->text, i->current_page->textsize); } - - gfxglyph_t*glyph = &font->glyphs[glyphnr]; - writeUTF8(glyph->unicode, &i->current_page->text[i->current_page->textpos]); + writeUTF8(unicode, &i->current_page->text[i->current_page->textpos]); i->current_page->textpos += strlen(&i->current_page->text[i->current_page->textpos]); - return; +} + +void text_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) +{ + internal_t*i = (internal_t*)dev->internal; + double xshift = matrix->tx - i->currentx; + double yshift = matrix->ty - i->currenty; + i->currentx = matrix->tx; + i->currenty = matrix->ty; + + if(fabs(yshift)>1.0) { + addchar(dev, 10); + } else if(xshift > i->lastadvance*1.3 || xshift<0) { + addchar(dev, 32); + } + if(font) { + i->lastadvance = font->glyphs[glyphnr].advance*matrix->m00; + int u = font->glyphs[glyphnr].unicode; + } else { + u = glyphnr; + i->currentx = 0;i->currenty = 0; + } + if(u>13) { + addchar(dev, u); + } } void text_drawlink(gfxdevice_t*dev, gfxline_t*line, char*action)