- FT_Glyph image(iter2->glyph);
- FT_Vector pen;
- FT_BitmapGlyph bit;
-
- pen.x = bx + iter2->pos.x;
- pen.y = by + iter2->pos.y;
-
- //synfig::info("GLYPH: pen.x=%d, pen,y=%d",curr_line,(pen.x+32)>>6,(pen.y+32)>>6);
-
- error = FT_Glyph_To_Bitmap( &image, ft_render_mode_normal,0/*&pen*/, 1 );
- if(error) { FT_Done_Glyph( image ); continue; }
-
- bit = (FT_BitmapGlyph)image;
-
- for(v=0;v<bit->bitmap.rows;v++)
- for(u=0;u<bit->bitmap.width;u++)
- {
- int x=u+((pen.x+32)>>6)+ bit->left;
- int y=v+((pen.y+32)>>6)- bit->top;
- if( y>=0 &&
- x>=0 &&
- y<surface->get_h() &&
- x<surface->get_w())
+ bx=round_to_int((origin[0]-renddesc.get_tl()[0])*pw*CHAR_RESOLUTION-orient[0]*iter->width);
+ // I've no idea why 1.5, but it kind of works. Otherwise,
+ // rendering to .bmp (which renders from bottom to top, due to
+ // the .bmp format describing the image from bottom to top,
+ // renders text in the wrong place.
+ by=round_to_int((origin[1]-renddesc.get_tl()[1])*ph*CHAR_RESOLUTION +
+ (1.0-orient[1])*string_height-line_height*curr_line +
+ ((ph>0) ? line_height/1.5 : 0));
+
+ //by=round_to_int(vcompress*((origin[1]-renddesc.get_tl()[1])*ph*64+(1.0-orient[1])*string_height-face->size->metrics.height*curr_line));
+ //synfig::info("curr_line=%d, bx=%d, by=%d",curr_line,bx,by);
+
+ std::vector<Glyph>::iterator iter2;
+ for(iter2=iter->glyph_table.begin();iter2!=iter->glyph_table.end();++iter2)
+ {
+ FT_Glyph image(iter2->glyph);
+ FT_Vector pen;
+ FT_BitmapGlyph bit;
+
+ pen.x = bx + iter2->pos.x;
+ pen.y = by + iter2->pos.y;
+
+ //synfig::info("GLYPH: line %d, pen.x=%d, pen,y=%d",curr_line,(pen.x+32)>>6,(pen.y+32)>>6);
+
+ error = FT_Glyph_To_Bitmap( &image, ft_render_mode_normal,0/*&pen*/, 1 );
+ if(error) { FT_Done_Glyph( image ); continue; }
+
+ bit = (FT_BitmapGlyph)image;
+
+ for(v=0;v<bit->bitmap.rows;v++)
+ for(u=0;u<bit->bitmap.width;u++)