| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkAdvancedTypefaceMetrics.h" | 8 #include "SkAdvancedTypefaceMetrics.h" |
| 9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
| 10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
| (...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 453 charCode = FT_Get_Next_Char(face, charCode, &glyphIndex)) { | 453 charCode = FT_Get_Next_Char(face, charCode, &glyphIndex)) { |
| 454 if (charCode && | 454 if (charCode && |
| 455 ((*glyphToUnicode)[glyphIndex] == 0 || preferredMap)) { | 455 ((*glyphToUnicode)[glyphIndex] == 0 || preferredMap)) { |
| 456 (*glyphToUnicode)[glyphIndex] = charCode; | 456 (*glyphToUnicode)[glyphIndex] = charCode; |
| 457 } | 457 } |
| 458 } | 458 } |
| 459 } | 459 } |
| 460 } | 460 } |
| 461 | 461 |
| 462 SkAdvancedTypefaceMetrics* SkTypeface_FreeType::onGetAdvancedTypefaceMetrics( | 462 SkAdvancedTypefaceMetrics* SkTypeface_FreeType::onGetAdvancedTypefaceMetrics( |
| 463 SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo, | 463 PerGlyphInfo perGlyphInfo, |
| 464 const uint32_t* glyphIDs, | 464 const uint32_t* glyphIDs, |
| 465 uint32_t glyphIDsCount) const { | 465 uint32_t glyphIDsCount) const { |
| 466 #if defined(SK_BUILD_FOR_MAC) | 466 #if defined(SK_BUILD_FOR_MAC) |
| 467 return NULL; | 467 return NULL; |
| 468 #else | 468 #else |
| 469 AutoFTAccess fta(this); | 469 AutoFTAccess fta(this); |
| 470 FT_Face face = fta.face(); | 470 FT_Face face = fta.face(); |
| 471 if (!face) { | 471 if (!face) { |
| 472 return NULL; | 472 return NULL; |
| 473 } | 473 } |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 580 } else { | 580 } else { |
| 581 // Last resort, use the ascent. | 581 // Last resort, use the ascent. |
| 582 info->fCapHeight = info->fAscent; | 582 info->fCapHeight = info->fAscent; |
| 583 } | 583 } |
| 584 } | 584 } |
| 585 | 585 |
| 586 info->fBBox = SkIRect::MakeLTRB(face->bbox.xMin, face->bbox.yMax, | 586 info->fBBox = SkIRect::MakeLTRB(face->bbox.xMin, face->bbox.yMax, |
| 587 face->bbox.xMax, face->bbox.yMin); | 587 face->bbox.xMax, face->bbox.yMin); |
| 588 | 588 |
| 589 if (!FT_IS_SCALABLE(face)) { | 589 if (!FT_IS_SCALABLE(face)) { |
| 590 perGlyphInfo = SkAdvancedTypefaceMetrics::kNo_PerGlyphInfo; | 590 perGlyphInfo = kNo_PerGlyphInfo; |
| 591 } | 591 } |
| 592 | 592 |
| 593 if (perGlyphInfo & SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo) { | 593 if (perGlyphInfo & kHAdvance_PerGlyphInfo) { |
| 594 if (FT_IS_FIXED_WIDTH(face)) { | 594 if (FT_IS_FIXED_WIDTH(face)) { |
| 595 appendRange(&info->fGlyphWidths, 0); | 595 appendRange(&info->fGlyphWidths, 0); |
| 596 int16_t advance = face->max_advance_width; | 596 int16_t advance = face->max_advance_width; |
| 597 info->fGlyphWidths->fAdvance.append(1, &advance); | 597 info->fGlyphWidths->fAdvance.append(1, &advance); |
| 598 finishRange(info->fGlyphWidths.get(), 0, | 598 finishRange(info->fGlyphWidths.get(), 0, |
| 599 SkAdvancedTypefaceMetrics::WidthRange::kDefault); | 599 SkAdvancedTypefaceMetrics::WidthRange::kDefault); |
| 600 } else if (!cid) { | 600 } else if (!cid) { |
| 601 appendRange(&info->fGlyphWidths, 0); | 601 appendRange(&info->fGlyphWidths, 0); |
| 602 // So as to not blow out the stack, get advances in batches. | 602 // So as to not blow out the stack, get advances in batches. |
| 603 for (int gID = 0; gID < face->num_glyphs; gID += 128) { | 603 for (int gID = 0; gID < face->num_glyphs; gID += 128) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 617 } else { | 617 } else { |
| 618 info->fGlyphWidths.reset( | 618 info->fGlyphWidths.reset( |
| 619 getAdvanceData(face, | 619 getAdvanceData(face, |
| 620 face->num_glyphs, | 620 face->num_glyphs, |
| 621 glyphIDs, | 621 glyphIDs, |
| 622 glyphIDsCount, | 622 glyphIDsCount, |
| 623 &getWidthAdvance)); | 623 &getWidthAdvance)); |
| 624 } | 624 } |
| 625 } | 625 } |
| 626 | 626 |
| 627 if (perGlyphInfo & SkAdvancedTypefaceMetrics::kVAdvance_PerGlyphInfo && | 627 if (perGlyphInfo & kVAdvance_PerGlyphInfo && |
| 628 FT_HAS_VERTICAL(face)) { | 628 FT_HAS_VERTICAL(face)) { |
| 629 SkASSERT(false); // Not implemented yet. | 629 SkASSERT(false); // Not implemented yet. |
| 630 } | 630 } |
| 631 | 631 |
| 632 if (perGlyphInfo & SkAdvancedTypefaceMetrics::kGlyphNames_PerGlyphInfo && | 632 if (perGlyphInfo & kGlyphNames_PerGlyphInfo && |
| 633 info->fType == SkAdvancedTypefaceMetrics::kType1_Font) { | 633 info->fType == SkAdvancedTypefaceMetrics::kType1_Font) { |
| 634 // Postscript fonts may contain more than 255 glyphs, so we end up | 634 // Postscript fonts may contain more than 255 glyphs, so we end up |
| 635 // using multiple font descriptions with a glyph ordering. Record | 635 // using multiple font descriptions with a glyph ordering. Record |
| 636 // the name of each glyph. | 636 // the name of each glyph. |
| 637 info->fGlyphNames.reset( | 637 info->fGlyphNames.reset( |
| 638 new SkAutoTArray<SkString>(face->num_glyphs)); | 638 new SkAutoTArray<SkString>(face->num_glyphs)); |
| 639 for (int gID = 0; gID < face->num_glyphs; gID++) { | 639 for (int gID = 0; gID < face->num_glyphs; gID++) { |
| 640 char glyphName[128]; // PS limit for names is 127 bytes. | 640 char glyphName[128]; // PS limit for names is 127 bytes. |
| 641 FT_Get_Glyph_Name(face, gID, glyphName, 128); | 641 FT_Get_Glyph_Name(face, gID, glyphName, 128); |
| 642 info->fGlyphNames->get()[gID].set(glyphName); | 642 info->fGlyphNames->get()[gID].set(glyphName); |
| 643 } | 643 } |
| 644 } | 644 } |
| 645 | 645 |
| 646 if (perGlyphInfo & SkAdvancedTypefaceMetrics::kToUnicode_PerGlyphInfo && | 646 if (perGlyphInfo & kToUnicode_PerGlyphInfo && |
| 647 info->fType != SkAdvancedTypefaceMetrics::kType1_Font && | 647 info->fType != SkAdvancedTypefaceMetrics::kType1_Font && |
| 648 face->num_charmaps) { | 648 face->num_charmaps) { |
| 649 populate_glyph_to_unicode(face, &(info->fGlyphToUnicode)); | 649 populate_glyph_to_unicode(face, &(info->fGlyphToUnicode)); |
| 650 } | 650 } |
| 651 | 651 |
| 652 return info; | 652 return info; |
| 653 #endif | 653 #endif |
| 654 } | 654 } |
| 655 | 655 |
| 656 /////////////////////////////////////////////////////////////////////////// | 656 /////////////////////////////////////////////////////////////////////////// |
| (...skipping 1065 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1722 if (style) { | 1722 if (style) { |
| 1723 *style = SkFontStyle(weight, width, slant); | 1723 *style = SkFontStyle(weight, width, slant); |
| 1724 } | 1724 } |
| 1725 if (isFixedPitch) { | 1725 if (isFixedPitch) { |
| 1726 *isFixedPitch = FT_IS_FIXED_WIDTH(face); | 1726 *isFixedPitch = FT_IS_FIXED_WIDTH(face); |
| 1727 } | 1727 } |
| 1728 | 1728 |
| 1729 FT_Done_Face(face); | 1729 FT_Done_Face(face); |
| 1730 return true; | 1730 return true; |
| 1731 } | 1731 } |
| OLD | NEW |