From b47fce544c1c5ec98b326f69b56c916ba5be1c68 Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Sat, 15 Feb 2020 01:55:22 +0800 Subject: Right-aligned texts are now correctly spaced. Line spacing is now more consistent. --- extensions/smttfont.cpp | 40 +++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/extensions/smttfont.cpp b/extensions/smttfont.cpp index 566aab1..dc0b8ad 100644 --- a/extensions/smttfont.cpp +++ b/extensions/smttfont.cpp @@ -29,7 +29,7 @@ public: float h(){return (float)_h;} void free(); bool setChar(wchar_t c,FT_Face ttface,smTTFont* par); - void render(float x,float y,float z,DWORD col,float scalex,float scaley,bool rtl); + void render(float x,float y,float z,DWORD col,float scalex,float scaley); }; SMELT *_smTTChar::sm=NULL; @@ -71,23 +71,13 @@ bool _smTTChar::setChar(wchar_t c,FT_Face ttface,smTTFont* par) quad.v[3].tx=1.*dx/par->texw;quad.v[3].ty=1.*(rh+dy)/par->texh; return true; } -void _smTTChar::render(float x,float y,float z,DWORD col,float scalex,float scaley,bool rtl) +void _smTTChar::render(float x,float y,float z,DWORD col,float scalex,float scaley) { for(int i=0;i<4;++i)quad.v[i].col=col,quad.v[i].z=z; - if(!rtl) - { - quad.v[0].x=x+xofs*scalex;quad.v[0].y=y+(yofs-rh)*scaley; - quad.v[1].x=x+(rw+xofs)*scalex;quad.v[1].y=y+(yofs-rh)*scaley; - quad.v[2].x=x+(rw+xofs)*scalex;quad.v[2].y=y+yofs*scaley; - quad.v[3].x=x+xofs*scalex;quad.v[3].y=y+yofs*scaley; - } - else - { - quad.v[0].x=x+(-rw+xofs)*scalex;quad.v[0].y=y+(yofs-rh)*scaley; - quad.v[1].x=x+xofs*scalex;quad.v[1].y=y+(yofs-rh)*scaley; - quad.v[2].x=x+xofs*scalex;quad.v[2].y=y+yofs*scaley; - quad.v[3].x=x+(-rw+xofs)*scalex;quad.v[3].y=y+yofs*scaley; - } + quad.v[0].x=x+xofs*scalex;quad.v[0].y=y+(yofs-rh)*scaley; + quad.v[1].x=x+(rw+xofs)*scalex;quad.v[1].y=y+(yofs-rh)*scaley; + quad.v[2].x=x+(rw+xofs)*scalex;quad.v[2].y=y+yofs*scaley; + quad.v[3].x=x+xofs*scalex;quad.v[3].y=y+yofs*scaley; sm->smRenderQuad(&quad); } @@ -200,35 +190,39 @@ void smTTFont::render(float x,float y,float z,DWORD col,int align,float scalex,f if(align==ALIGN_LEFT) { curx=x;cury=y;lh=0; + for(int i=0;buf[i]!=L'\0';++i) + if(chars.find(buf[i])!=chars.end()) + if(chars[buf[i]]->h()>lh)lh=chars[buf[i]]->h(); for(int i=0;buf[i]!=L'\0';++i) { if(buf[i]!=L'\n') { if(chars.find(buf[i])!=chars.end()) { - chars[buf[i]]->render(curx,cury,z,col,scalex,scaley,false); + chars[buf[i]]->render(curx,cury,z,col,scalex,scaley); curx+=chars[buf[i]]->w()*scalex; - lh=chars[buf[i]]->h()>lh?chars[buf[i]]->h():lh; } } - else cury+=lh*scaley,lh=0,curx=x; + else cury+=lh*scaley,curx=x; } } if(align==ALIGN_RIGHT) { curx=x;cury=y;lh=0; + for(int i=wcslen(buf)-1;i>=0;--i) + if(chars.find(buf[i])!=chars.end()) + if(chars[buf[i]]->h()>lh)lh=chars[buf[i]]->h(); for(int i=wcslen(buf)-1;i>=0;--i) { if(buf[i]!=L'\n') { if(chars.find(buf[i])!=chars.end()) { - chars[buf[i]]->render(curx,cury,z,col,scalex,scaley,true); - curx-=chars[buf[i]]->w()*scalex; - lh=chars[buf[i]]->h()>lh?chars[buf[i]]->h():lh; + chars[buf[i]]->render(curx,cury,z,col,scalex,scaley); + if(i&&buf[i-1]!=L'\n')curx-=chars[buf[i-1]]->w()*scalex; } } - else cury-=lh*scaley,lh=0,curx=x; + else cury-=lh*scaley,curx=x; } } } -- cgit v1.2.3