freetype的pen.x和pen.y问题以及电子产品量产工具的文字系统FreeTypeGetFontBitMap函数中的问题

问题1:
在应用开发基础里显示一行文字代码show_line.c中,提供了lcd_x和lcd_y是一行文字在LCD中的左上角坐标,然后转换成了笛卡尔坐标系。然后pen.x的x-bbox.xMin和pen.y的y - bbox.yMax这里应该表示的就是笛卡尔坐标。
在项目开发基础电子产品量产工具的文字系统的freetype.c中,字符的pen.x用的是ptFontBitMap->iCurOriginX,pen.y使用的是ptFontBitMap->iCurOriginY。ptFontBitMap->iCurOriginX和ptFontBitMap->iCurOriginY在后面进行文字系统的单元测试font_test.c时传入的是LCD坐标系,那这里和之前的应用开发基础里的pen坐标是笛卡尔坐标不是矛盾了吗?


问题2:
这里的ptFontBitMap->iLeftUpX计算视频说ptFontBitmap->iCurOriginY - delta ,这个式子ptFontBitmap->iCurOriginY 是LCD坐标系,然后delta = bitmap_top - iCurOriginY这里的iCurOriginY应该是笛卡尔坐标吧,那么这两个式子为什么可以直接代入呢?

问题1:
image

在FreeTypeGetFontBitMap里,调用FT_Load_Char时,得到是坐标值确实是笛卡尔坐标系,
我们传入pen.y,得到slot->bitmap_top,slot->bitmap_top 大于 pen.y。
我们可以算出delta = slot->bitmap_top - pen.y,这个差值是图中蓝点和红点在Y方向的距离,它跟坐标系没关系。
现在回到LCD坐标系里,pen.y是字符原点的话,那么这个字符的左上角值假设是Y’,Y’小于pen.y,
pen.y - Y’ = slot->bitmap_top - pen.y;
所以 Y’ = pen.y * 2 - slot->bitmap_top;

对应如下代码:
ptFontBitMap->tRegion.iLeftUpY = ptFontBitMap->iCurOriginY*2 - slot->bitmap_top;

理解了上面的公式后,问题1、问题2都回答了

换句话说,
使用FT_Load_Char时,完全可以先传入pen.y=0,得到左上角的Y坐标 slot->bitmap_top;
然后就可以计算出LCD坐标系里原点y对应的左上角Y坐标为:y - slot->bitmap_top

这里传入的pen.y坐标是LCD坐标吗

是的,是LCD坐标,FT_Load_Char把它动作笛卡尔坐标,但是没关系,在FT_Load_Char返回值之后,我们自己计算