| 199 | | #if (FREETYPE_MAJOR > 2) || ((FREETYPE_MAJOR == 2) && (FREETYPE_MINOR > 1)) |
| 200 | | TT_HoriHeader *hori = FT_Get_Sfnt_Table(face, ft_sfnt_hhea); |
| 201 | | TT_OS2 *os2 = FT_Get_Sfnt_Table(face, ft_sfnt_os2); |
| 202 | | double mscale = 1.; |
| 203 | | FT_Size_RequestRec rq; |
| 204 | | FT_Size_Metrics *m = &face->size->metrics; |
| 205 | | // VSFilter uses metrics from TrueType OS/2 table |
| 206 | | // The idea was borrowed from asa (http://asa.diac24.net) |
| 207 | | if (hori && os2) { |
| 208 | | int hori_height = hori->Ascender - hori->Descender; |
| 209 | | int os2_height = os2->usWinAscent + os2->usWinDescent; |
| 210 | | if (hori_height && os2_height) |
| 211 | | mscale = (double)hori_height / os2_height; |
| 212 | | } |
| 213 | | memset(&rq, 0, sizeof(rq)); |
| 214 | | rq.type = FT_SIZE_REQUEST_TYPE_REAL_DIM; |
| 215 | | rq.width = 0; |
| 216 | | rq.height = double_to_d6(size * mscale); |
| 217 | | rq.horiResolution = rq.vertResolution = 0; |
| 218 | | FT_Request_Size(face, &rq); |
| 219 | | m->ascender /= mscale; |
| 220 | | m->descender /= mscale; |
| 221 | | m->height /= mscale; |
| 222 | | #else |