OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #include "SkAdvancedTypefaceMetrics.h" | 9 #include "SkAdvancedTypefaceMetrics.h" |
10 #include "SkBitmap.h" | 10 #include "SkBitmap.h" |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 fFace != NULL; | 193 fFace != NULL; |
194 } | 194 } |
195 | 195 |
196 protected: | 196 protected: |
197 virtual unsigned generateGlyphCount() SK_OVERRIDE; | 197 virtual unsigned generateGlyphCount() SK_OVERRIDE; |
198 virtual uint16_t generateCharToGlyph(SkUnichar uni) SK_OVERRIDE; | 198 virtual uint16_t generateCharToGlyph(SkUnichar uni) SK_OVERRIDE; |
199 virtual void generateAdvance(SkGlyph* glyph) SK_OVERRIDE; | 199 virtual void generateAdvance(SkGlyph* glyph) SK_OVERRIDE; |
200 virtual void generateMetrics(SkGlyph* glyph) SK_OVERRIDE; | 200 virtual void generateMetrics(SkGlyph* glyph) SK_OVERRIDE; |
201 virtual void generateImage(const SkGlyph& glyph) SK_OVERRIDE; | 201 virtual void generateImage(const SkGlyph& glyph) SK_OVERRIDE; |
202 virtual void generatePath(const SkGlyph& glyph, SkPath* path) SK_OVERRIDE; | 202 virtual void generatePath(const SkGlyph& glyph, SkPath* path) SK_OVERRIDE; |
203 virtual void generateFontMetrics(SkPaint::FontMetrics* mx, | 203 virtual void generateFontMetrics(SkPaint::FontMetrics*) SK_OVERRIDE; |
204 SkPaint::FontMetrics* my) SK_OVERRIDE; | |
205 virtual SkUnichar generateGlyphToChar(uint16_t glyph) SK_OVERRIDE; | 204 virtual SkUnichar generateGlyphToChar(uint16_t glyph) SK_OVERRIDE; |
206 | 205 |
207 private: | 206 private: |
208 SkFaceRec* fFaceRec; | 207 SkFaceRec* fFaceRec; |
209 FT_Face fFace; // reference to shared face in gFaceRecHead | 208 FT_Face fFace; // reference to shared face in gFaceRecHead |
210 FT_Size fFTSize; // our own copy | 209 FT_Size fFTSize; // our own copy |
211 FT_Int fStrikeIndex; | 210 FT_Int fStrikeIndex; |
212 SkFixed fScaleX, fScaleY; | 211 SkFixed fScaleX, fScaleY; |
213 FT_Matrix fMatrix22; | 212 FT_Matrix fMatrix22; |
214 uint32_t fLoadGlyphFlags; | 213 uint32_t fLoadGlyphFlags; |
(...skipping 1150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1365 // Offset the path so that it is relative to the vertical origin if needed. | 1364 // Offset the path so that it is relative to the vertical origin if needed. |
1366 if (fRec.fFlags & SkScalerContext::kVertical_Flag) { | 1365 if (fRec.fFlags & SkScalerContext::kVertical_Flag) { |
1367 FT_Vector vector; | 1366 FT_Vector vector; |
1368 vector.x = fFace->glyph->metrics.vertBearingX - fFace->glyph->metrics.ho
riBearingX; | 1367 vector.x = fFace->glyph->metrics.vertBearingX - fFace->glyph->metrics.ho
riBearingX; |
1369 vector.y = -fFace->glyph->metrics.vertBearingY - fFace->glyph->metrics.h
oriBearingY; | 1368 vector.y = -fFace->glyph->metrics.vertBearingY - fFace->glyph->metrics.h
oriBearingY; |
1370 FT_Vector_Transform(&vector, &fMatrix22); | 1369 FT_Vector_Transform(&vector, &fMatrix22); |
1371 path->offset(SkFDot6ToScalar(vector.x), -SkFDot6ToScalar(vector.y)); | 1370 path->offset(SkFDot6ToScalar(vector.x), -SkFDot6ToScalar(vector.y)); |
1372 } | 1371 } |
1373 } | 1372 } |
1374 | 1373 |
1375 void SkScalerContext_FreeType::generateFontMetrics(SkPaint::FontMetrics* mx, | 1374 void SkScalerContext_FreeType::generateFontMetrics(SkPaint::FontMetrics* metrics
) { |
1376 SkPaint::FontMetrics* my) { | 1375 if (NULL == metrics) { |
1377 if (NULL == mx && NULL == my) { | |
1378 return; | 1376 return; |
1379 } | 1377 } |
1380 | 1378 |
1381 SkAutoMutexAcquire ac(gFTMutex); | 1379 SkAutoMutexAcquire ac(gFTMutex); |
1382 | 1380 |
1383 if (this->setupSize()) { | 1381 if (this->setupSize()) { |
1384 ERROR: | 1382 ERROR: |
1385 if (mx) { | 1383 sk_bzero(metrics, sizeof(*metrics)); |
1386 sk_bzero(mx, sizeof(SkPaint::FontMetrics)); | |
1387 } | |
1388 if (my) { | |
1389 sk_bzero(my, sizeof(SkPaint::FontMetrics)); | |
1390 } | |
1391 return; | 1384 return; |
1392 } | 1385 } |
1393 | 1386 |
1394 FT_Face face = fFace; | 1387 FT_Face face = fFace; |
1395 SkScalar scaleX = fScale.x(); | 1388 SkScalar scaleX = fScale.x(); |
1396 SkScalar scaleY = fScale.y(); | 1389 SkScalar scaleY = fScale.y(); |
1397 SkScalar mxy = fMatrix22Scalar.getSkewX() * scaleY; | 1390 SkScalar mxy = fMatrix22Scalar.getSkewX() * scaleY; |
1398 SkScalar myy = fMatrix22Scalar.getScaleY() * scaleY; | 1391 SkScalar myy = fMatrix22Scalar.getScaleY() * scaleY; |
1399 | 1392 |
1400 // fetch units/EM from "head" table if needed (ie for bitmap fonts) | 1393 // fetch units/EM from "head" table if needed (ie for bitmap fonts) |
(...skipping 26 matching lines...) Expand all Loading... |
1427 descent = -SkIntToScalar(face->descender) / upem; | 1420 descent = -SkIntToScalar(face->descender) / upem; |
1428 leading = SkIntToScalar(face->height + (face->descender - face->ascender
)) / upem; | 1421 leading = SkIntToScalar(face->height + (face->descender - face->ascender
)) / upem; |
1429 xmin = SkIntToScalar(face->bbox.xMin) / upem; | 1422 xmin = SkIntToScalar(face->bbox.xMin) / upem; |
1430 xmax = SkIntToScalar(face->bbox.xMax) / upem; | 1423 xmax = SkIntToScalar(face->bbox.xMax) / upem; |
1431 ymin = -SkIntToScalar(face->bbox.yMin) / upem; | 1424 ymin = -SkIntToScalar(face->bbox.yMin) / upem; |
1432 ymax = -SkIntToScalar(face->bbox.yMax) / upem; | 1425 ymax = -SkIntToScalar(face->bbox.yMax) / upem; |
1433 underlineThickness = SkIntToScalar(face->underline_thickness) / upem; | 1426 underlineThickness = SkIntToScalar(face->underline_thickness) / upem; |
1434 underlinePosition = -SkIntToScalar(face->underline_position + | 1427 underlinePosition = -SkIntToScalar(face->underline_position + |
1435 face->underline_thickness / 2) / upem
; | 1428 face->underline_thickness / 2) / upem
; |
1436 | 1429 |
1437 if(mx) { | 1430 metrics->fFlags |= SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag
; |
1438 mx->fFlags |= SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; | 1431 metrics->fFlags |= SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; |
1439 mx->fFlags |= SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; | 1432 |
1440 } | |
1441 if(my){ | |
1442 my->fFlags |= SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; | |
1443 my->fFlags |= SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; | |
1444 } | |
1445 // we may be able to synthesize x_height and cap_height from outline | 1433 // we may be able to synthesize x_height and cap_height from outline |
1446 if (!x_height) { | 1434 if (!x_height) { |
1447 FT_BBox bbox; | 1435 FT_BBox bbox; |
1448 if (getCBoxForLetter('x', &bbox)) { | 1436 if (getCBoxForLetter('x', &bbox)) { |
1449 x_height = SkIntToScalar(bbox.yMax) / 64.0f; | 1437 x_height = SkIntToScalar(bbox.yMax) / 64.0f; |
1450 } | 1438 } |
1451 } | 1439 } |
1452 if (!cap_height) { | 1440 if (!cap_height) { |
1453 FT_BBox bbox; | 1441 FT_BBox bbox; |
1454 if (getCBoxForLetter('H', &bbox)) { | 1442 if (getCBoxForLetter('H', &bbox)) { |
1455 cap_height = SkIntToScalar(bbox.yMax) / 64.0f; | 1443 cap_height = SkIntToScalar(bbox.yMax) / 64.0f; |
1456 } | 1444 } |
1457 } | 1445 } |
1458 } else if (fStrikeIndex != -1) { // bitmap strike metrics | 1446 } else if (fStrikeIndex != -1) { // bitmap strike metrics |
1459 SkScalar xppem = SkIntToScalar(face->size->metrics.x_ppem); | 1447 SkScalar xppem = SkIntToScalar(face->size->metrics.x_ppem); |
1460 SkScalar yppem = SkIntToScalar(face->size->metrics.y_ppem); | 1448 SkScalar yppem = SkIntToScalar(face->size->metrics.y_ppem); |
1461 ascent = -SkIntToScalar(face->size->metrics.ascender) / (yppem * 64.0f); | 1449 ascent = -SkIntToScalar(face->size->metrics.ascender) / (yppem * 64.0f); |
1462 descent = -SkIntToScalar(face->size->metrics.descender) / (yppem * 64.0f
); | 1450 descent = -SkIntToScalar(face->size->metrics.descender) / (yppem * 64.0f
); |
1463 leading = (SkIntToScalar(face->size->metrics.height) / (yppem * 64.0f)) | 1451 leading = (SkIntToScalar(face->size->metrics.height) / (yppem * 64.0f)) |
1464 + ascent - descent; | 1452 + ascent - descent; |
1465 xmin = 0.0f; | 1453 xmin = 0.0f; |
1466 xmax = SkIntToScalar(face->available_sizes[fStrikeIndex].width) / xppem; | 1454 xmax = SkIntToScalar(face->available_sizes[fStrikeIndex].width) / xppem; |
1467 ymin = descent + leading; | 1455 ymin = descent + leading; |
1468 ymax = ascent - descent; | 1456 ymax = ascent - descent; |
1469 underlineThickness = 0; | 1457 underlineThickness = 0; |
1470 underlinePosition = 0; | 1458 underlinePosition = 0; |
1471 | 1459 |
1472 if(mx) { | 1460 metrics->fFlags &= ~SkPaint::FontMetrics::kUnderlineThinknessIsValid_Fla
g; |
1473 mx->fFlags &= ~SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag
; | 1461 metrics->fFlags &= ~SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag
; |
1474 mx->fFlags &= ~SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; | |
1475 } | |
1476 if(my){ | |
1477 my->fFlags &= ~SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag
; | |
1478 my->fFlags &= ~SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; | |
1479 } | |
1480 } else { | 1462 } else { |
1481 goto ERROR; | 1463 goto ERROR; |
1482 } | 1464 } |
1483 | 1465 |
1484 // synthesize elements that were not provided by the os/2 table or format-sp
ecific metrics | 1466 // synthesize elements that were not provided by the os/2 table or format-sp
ecific metrics |
1485 if (!x_height) { | 1467 if (!x_height) { |
1486 x_height = -ascent; | 1468 x_height = -ascent; |
1487 } | 1469 } |
1488 if (!avgCharWidth) { | 1470 if (!avgCharWidth) { |
1489 avgCharWidth = xmax - xmin; | 1471 avgCharWidth = xmax - xmin; |
1490 } | 1472 } |
1491 if (!cap_height) { | 1473 if (!cap_height) { |
1492 cap_height = -ascent; | 1474 cap_height = -ascent; |
1493 } | 1475 } |
1494 | 1476 |
1495 // disallow negative linespacing | 1477 // disallow negative linespacing |
1496 if (leading < 0.0f) { | 1478 if (leading < 0.0f) { |
1497 leading = 0.0f; | 1479 leading = 0.0f; |
1498 } | 1480 } |
1499 | 1481 |
1500 if (mx) { | 1482 SkScalar scale = myy; |
1501 mx->fTop = ymax * mxy; | 1483 if (this->isVertical()) { |
1502 mx->fAscent = ascent * mxy; | 1484 scale = mxy; |
1503 mx->fDescent = descent * mxy; | |
1504 mx->fBottom = ymin * mxy; | |
1505 mx->fLeading = leading * mxy; | |
1506 mx->fAvgCharWidth = avgCharWidth * mxy; | |
1507 mx->fXMin = xmin; | |
1508 mx->fXMax = xmax; | |
1509 mx->fXHeight = x_height; | |
1510 mx->fCapHeight = cap_height; | |
1511 mx->fUnderlineThickness = underlineThickness * mxy; | |
1512 mx->fUnderlinePosition = underlinePosition * mxy; | |
1513 } | 1485 } |
1514 if (my) { | 1486 metrics->fTop = ymax * scale; |
1515 my->fTop = ymax * myy; | 1487 metrics->fAscent = ascent * scale; |
1516 my->fAscent = ascent * myy; | 1488 metrics->fDescent = descent * scale; |
1517 my->fDescent = descent * myy; | 1489 metrics->fBottom = ymin * scale; |
1518 my->fBottom = ymin * myy; | 1490 metrics->fLeading = leading * scale; |
1519 my->fLeading = leading * myy; | 1491 metrics->fAvgCharWidth = avgCharWidth * scale; |
1520 my->fAvgCharWidth = avgCharWidth * myy; | 1492 metrics->fXMin = xmin; |
1521 my->fXMin = xmin; | 1493 metrics->fXMax = xmax; |
1522 my->fXMax = xmax; | 1494 metrics->fXHeight = x_height; |
1523 my->fXHeight = x_height; | 1495 metrics->fCapHeight = cap_height; |
1524 my->fCapHeight = cap_height; | 1496 metrics->fUnderlineThickness = underlineThickness * scale; |
1525 my->fUnderlineThickness = underlineThickness * myy; | 1497 metrics->fUnderlinePosition = underlinePosition * scale; |
1526 my->fUnderlinePosition = underlinePosition * myy; | |
1527 } | |
1528 } | 1498 } |
1529 | 1499 |
1530 void SkScalerContext_FreeType::emboldenIfNeeded(FT_Face face, FT_GlyphSlot glyph
) | 1500 void SkScalerContext_FreeType::emboldenIfNeeded(FT_Face face, FT_GlyphSlot glyph
) |
1531 { | 1501 { |
1532 // check to see if the embolden bit is set | 1502 // check to see if the embolden bit is set |
1533 if (0 == (fRec.fFlags & SkScalerContext::kEmbolden_Flag)) { | 1503 if (0 == (fRec.fFlags & SkScalerContext::kEmbolden_Flag)) { |
1534 return; | 1504 return; |
1535 } | 1505 } |
1536 | 1506 |
1537 #if defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) | 1507 #if defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1752 *style = (SkTypeface::Style) tempStyle; | 1722 *style = (SkTypeface::Style) tempStyle; |
1753 } | 1723 } |
1754 if (isFixedPitch) { | 1724 if (isFixedPitch) { |
1755 *isFixedPitch = FT_IS_FIXED_WIDTH(face); | 1725 *isFixedPitch = FT_IS_FIXED_WIDTH(face); |
1756 } | 1726 } |
1757 | 1727 |
1758 FT_Done_Face(face); | 1728 FT_Done_Face(face); |
1759 FT_Done_FreeType(library); | 1729 FT_Done_FreeType(library); |
1760 return true; | 1730 return true; |
1761 } | 1731 } |
OLD | NEW |