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 <vector> | 9 #include <vector> |
10 #ifdef SK_BUILD_FOR_MAC | 10 #ifdef SK_BUILD_FOR_MAC |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 return rect.origin.y + rect.size.height; | 142 return rect.origin.y + rect.size.height; |
143 } | 143 } |
144 | 144 |
145 static CGFloat CGRectGetWidth_inline(const CGRect& rect) { | 145 static CGFloat CGRectGetWidth_inline(const CGRect& rect) { |
146 return rect.size.width; | 146 return rect.size.width; |
147 } | 147 } |
148 | 148 |
149 /////////////////////////////////////////////////////////////////////////////// | 149 /////////////////////////////////////////////////////////////////////////////// |
150 | 150 |
151 static void sk_memset_rect32(uint32_t* ptr, uint32_t value, | 151 static void sk_memset_rect32(uint32_t* ptr, uint32_t value, |
152 size_t width, size_t height, size_t rowBytes) { | 152 int width, int height, size_t rowBytes) { |
153 SkASSERT(width); | 153 SkASSERT(width); |
154 SkASSERT(width * sizeof(uint32_t) <= rowBytes); | 154 SkASSERT(width * sizeof(uint32_t) <= rowBytes); |
155 | 155 |
156 if (width >= 32) { | 156 if (width >= 32) { |
157 while (height) { | 157 while (height) { |
158 sk_memset32(ptr, value, width); | 158 sk_memset32(ptr, value, width); |
159 ptr = (uint32_t*)((char*)ptr + rowBytes); | 159 ptr = (uint32_t*)((char*)ptr + rowBytes); |
160 height -= 1; | 160 height -= 1; |
161 } | 161 } |
162 return; | 162 return; |
(...skipping 1271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1434 } | 1434 } |
1435 CTFontRef ct = CTFontCreateWithGraphicsFont(cg, 0, NULL, NULL); | 1435 CTFontRef ct = CTFontCreateWithGraphicsFont(cg, 0, NULL, NULL); |
1436 return cg ? SkCreateTypefaceFromCTFont(ct) : NULL; | 1436 return cg ? SkCreateTypefaceFromCTFont(ct) : NULL; |
1437 } | 1437 } |
1438 | 1438 |
1439 // Web fonts added to the the CTFont registry do not return their character set. | 1439 // Web fonts added to the the CTFont registry do not return their character set. |
1440 // Iterate through the font in this case. The existing caller caches the result, | 1440 // Iterate through the font in this case. The existing caller caches the result, |
1441 // so the performance impact isn't too bad. | 1441 // so the performance impact isn't too bad. |
1442 static void populate_glyph_to_unicode_slow(CTFontRef ctFont, CFIndex glyphCount, | 1442 static void populate_glyph_to_unicode_slow(CTFontRef ctFont, CFIndex glyphCount, |
1443 SkTDArray<SkUnichar>* glyphToUnicode)
{ | 1443 SkTDArray<SkUnichar>* glyphToUnicode)
{ |
1444 glyphToUnicode->setCount(glyphCount); | 1444 glyphToUnicode->setCount(SkToInt(glyphCount)); |
1445 SkUnichar* out = glyphToUnicode->begin(); | 1445 SkUnichar* out = glyphToUnicode->begin(); |
1446 sk_bzero(out, glyphCount * sizeof(SkUnichar)); | 1446 sk_bzero(out, glyphCount * sizeof(SkUnichar)); |
1447 UniChar unichar = 0; | 1447 UniChar unichar = 0; |
1448 while (glyphCount > 0) { | 1448 while (glyphCount > 0) { |
1449 CGGlyph glyph; | 1449 CGGlyph glyph; |
1450 if (CTFontGetGlyphsForCharacters(ctFont, &unichar, &glyph, 1)) { | 1450 if (CTFontGetGlyphsForCharacters(ctFont, &unichar, &glyph, 1)) { |
1451 out[glyph] = unichar; | 1451 out[glyph] = unichar; |
1452 --glyphCount; | 1452 --glyphCount; |
1453 } | 1453 } |
1454 if (++unichar == 0) { | 1454 if (++unichar == 0) { |
(...skipping 23 matching lines...) Expand all Loading... |
1478 return; | 1478 return; |
1479 } | 1479 } |
1480 if (length > 8192) { | 1480 if (length > 8192) { |
1481 // TODO: Add support for Unicode above 0xFFFF | 1481 // TODO: Add support for Unicode above 0xFFFF |
1482 // Consider only the BMP portion of the Unicode character points. | 1482 // Consider only the BMP portion of the Unicode character points. |
1483 // The bitmap may contain other planes, up to plane 16. | 1483 // The bitmap may contain other planes, up to plane 16. |
1484 // See http://developer.apple.com/library/ios/#documentation/CoreFoundat
ion/Reference/CFCharacterSetRef/Reference/reference.html | 1484 // See http://developer.apple.com/library/ios/#documentation/CoreFoundat
ion/Reference/CFCharacterSetRef/Reference/reference.html |
1485 length = 8192; | 1485 length = 8192; |
1486 } | 1486 } |
1487 const UInt8* bits = CFDataGetBytePtr(bitmap); | 1487 const UInt8* bits = CFDataGetBytePtr(bitmap); |
1488 glyphToUnicode->setCount(glyphCount); | 1488 glyphToUnicode->setCount(SkToInt(glyphCount)); |
1489 SkUnichar* out = glyphToUnicode->begin(); | 1489 SkUnichar* out = glyphToUnicode->begin(); |
1490 sk_bzero(out, glyphCount * sizeof(SkUnichar)); | 1490 sk_bzero(out, glyphCount * sizeof(SkUnichar)); |
1491 for (int i = 0; i < length; i++) { | 1491 for (int i = 0; i < length; i++) { |
1492 int mask = bits[i]; | 1492 int mask = bits[i]; |
1493 if (!mask) { | 1493 if (!mask) { |
1494 continue; | 1494 continue; |
1495 } | 1495 } |
1496 for (int j = 0; j < 8; j++) { | 1496 for (int j = 0; j < 8; j++) { |
1497 CGGlyph glyph; | 1497 CGGlyph glyph; |
1498 UniChar unichar = static_cast<UniChar>((i << 3) + j); | 1498 UniChar unichar = static_cast<UniChar>((i << 3) + j); |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1618 info->fType = SkAdvancedTypefaceMetrics::kNotEmbeddable_Font; | 1618 info->fType = SkAdvancedTypefaceMetrics::kNotEmbeddable_Font; |
1619 } else if (perGlyphInfo & SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo)
{ | 1619 } else if (perGlyphInfo & SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo)
{ |
1620 if (info->fStyle & SkAdvancedTypefaceMetrics::kFixedPitch_Style) { | 1620 if (info->fStyle & SkAdvancedTypefaceMetrics::kFixedPitch_Style) { |
1621 skia_advanced_typeface_metrics_utils::appendRange(&info->fGlyphWidth
s, 0); | 1621 skia_advanced_typeface_metrics_utils::appendRange(&info->fGlyphWidth
s, 0); |
1622 info->fGlyphWidths->fAdvance.append(1, &min_width); | 1622 info->fGlyphWidths->fAdvance.append(1, &min_width); |
1623 skia_advanced_typeface_metrics_utils::finishRange(info->fGlyphWidths
.get(), 0, | 1623 skia_advanced_typeface_metrics_utils::finishRange(info->fGlyphWidths
.get(), 0, |
1624 SkAdvancedTypefaceMetrics::WidthRange::kDefault); | 1624 SkAdvancedTypefaceMetrics::WidthRange::kDefault); |
1625 } else { | 1625 } else { |
1626 info->fGlyphWidths.reset( | 1626 info->fGlyphWidths.reset( |
1627 skia_advanced_typeface_metrics_utils::getAdvanceData(ctFont.get(
), | 1627 skia_advanced_typeface_metrics_utils::getAdvanceData(ctFont.get(
), |
1628 glyphCount, | 1628 SkToInt(glyphCount), |
1629 glyphIDs, | 1629 glyphIDs, |
1630 glyphIDsCount, | 1630 glyphIDsCount, |
1631 &getWidthAdvance)); | 1631 &getWidthAdvance)); |
1632 } | 1632 } |
1633 } | 1633 } |
1634 return info; | 1634 return info; |
1635 } | 1635 } |
1636 | 1636 |
1637 /////////////////////////////////////////////////////////////////////////////// | 1637 /////////////////////////////////////////////////////////////////////////////// |
1638 | 1638 |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1717 | 1717 |
1718 // write tables | 1718 // write tables |
1719 SkSFNTHeader::TableDirectoryEntry* entry = (SkSFNTHeader::TableDirectoryEntr
y*)dataPtr; | 1719 SkSFNTHeader::TableDirectoryEntry* entry = (SkSFNTHeader::TableDirectoryEntr
y*)dataPtr; |
1720 dataPtr += sizeof(SkSFNTHeader::TableDirectoryEntry) * numTables; | 1720 dataPtr += sizeof(SkSFNTHeader::TableDirectoryEntry) * numTables; |
1721 for (int tableIndex = 0; tableIndex < numTables; ++tableIndex) { | 1721 for (int tableIndex = 0; tableIndex < numTables; ++tableIndex) { |
1722 size_t tableSize = tableSizes[tableIndex]; | 1722 size_t tableSize = tableSizes[tableIndex]; |
1723 this->getTableData(tableTags[tableIndex], 0, tableSize, dataPtr); | 1723 this->getTableData(tableTags[tableIndex], 0, tableSize, dataPtr); |
1724 entry->tag = SkEndian_SwapBE32(tableTags[tableIndex]); | 1724 entry->tag = SkEndian_SwapBE32(tableTags[tableIndex]); |
1725 entry->checksum = SkEndian_SwapBE32(SkOTUtils::CalcTableChecksum((SK_OT_
ULONG*)dataPtr, | 1725 entry->checksum = SkEndian_SwapBE32(SkOTUtils::CalcTableChecksum((SK_OT_
ULONG*)dataPtr, |
1726 tableSi
ze)); | 1726 tableSi
ze)); |
1727 entry->offset = SkEndian_SwapBE32(dataPtr - dataStart); | 1727 entry->offset = SkEndian_SwapBE32(SkToU32(dataPtr - dataStart)); |
1728 entry->logicalLength = SkEndian_SwapBE32(tableSize); | 1728 entry->logicalLength = SkEndian_SwapBE32(SkToU32(tableSize)); |
1729 | 1729 |
1730 dataPtr += (tableSize + 3) & ~3; | 1730 dataPtr += (tableSize + 3) & ~3; |
1731 ++entry; | 1731 ++entry; |
1732 } | 1732 } |
1733 | 1733 |
1734 return stream; | 1734 return stream; |
1735 } | 1735 } |
1736 | 1736 |
1737 /////////////////////////////////////////////////////////////////////////////// | 1737 /////////////////////////////////////////////////////////////////////////////// |
1738 /////////////////////////////////////////////////////////////////////////////// | 1738 /////////////////////////////////////////////////////////////////////////////// |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1778 } | 1778 } |
1779 return data; | 1779 return data; |
1780 } | 1780 } |
1781 | 1781 |
1782 int SkTypeface_Mac::onGetTableTags(SkFontTableTag tags[]) const { | 1782 int SkTypeface_Mac::onGetTableTags(SkFontTableTag tags[]) const { |
1783 AutoCFRelease<CFArrayRef> cfArray(CTFontCopyAvailableTables(fFontRef, | 1783 AutoCFRelease<CFArrayRef> cfArray(CTFontCopyAvailableTables(fFontRef, |
1784 kCTFontTableOptionNoOptions)); | 1784 kCTFontTableOptionNoOptions)); |
1785 if (NULL == cfArray) { | 1785 if (NULL == cfArray) { |
1786 return 0; | 1786 return 0; |
1787 } | 1787 } |
1788 int count = CFArrayGetCount(cfArray); | 1788 int count = SkToInt(CFArrayGetCount(cfArray)); |
1789 if (tags) { | 1789 if (tags) { |
1790 for (int i = 0; i < count; ++i) { | 1790 for (int i = 0; i < count; ++i) { |
1791 uintptr_t fontTag = reinterpret_cast<uintptr_t>(CFArrayGetValueAtInd
ex(cfArray, i)); | 1791 uintptr_t fontTag = reinterpret_cast<uintptr_t>(CFArrayGetValueAtInd
ex(cfArray, i)); |
1792 tags[i] = static_cast<SkFontTableTag>(fontTag); | 1792 tags[i] = static_cast<SkFontTableTag>(fontTag); |
1793 } | 1793 } |
1794 } | 1794 } |
1795 return count; | 1795 return count; |
1796 } | 1796 } |
1797 | 1797 |
1798 size_t SkTypeface_Mac::onGetTableData(SkFontTableTag tag, size_t offset, | 1798 size_t SkTypeface_Mac::onGetTableData(SkFontTableTag tag, size_t offset, |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1923 int srcCount; | 1923 int srcCount; |
1924 switch (encoding) { | 1924 switch (encoding) { |
1925 case kUTF8_Encoding: { | 1925 case kUTF8_Encoding: { |
1926 const char* utf8 = reinterpret_cast<const char*>(chars); | 1926 const char* utf8 = reinterpret_cast<const char*>(chars); |
1927 UniChar* utf16 = charStorage.reset(2 * glyphCount); | 1927 UniChar* utf16 = charStorage.reset(2 * glyphCount); |
1928 src = utf16; | 1928 src = utf16; |
1929 for (int i = 0; i < glyphCount; ++i) { | 1929 for (int i = 0; i < glyphCount; ++i) { |
1930 SkUnichar uni = SkUTF8_NextUnichar(&utf8); | 1930 SkUnichar uni = SkUTF8_NextUnichar(&utf8); |
1931 utf16 += SkUTF16_FromUnichar(uni, utf16); | 1931 utf16 += SkUTF16_FromUnichar(uni, utf16); |
1932 } | 1932 } |
1933 srcCount = utf16 - src; | 1933 srcCount = SkToInt(utf16 - src); |
1934 break; | 1934 break; |
1935 } | 1935 } |
1936 case kUTF16_Encoding: { | 1936 case kUTF16_Encoding: { |
1937 src = reinterpret_cast<const UniChar*>(chars); | 1937 src = reinterpret_cast<const UniChar*>(chars); |
1938 int extra = 0; | 1938 int extra = 0; |
1939 for (int i = 0; i < glyphCount; ++i) { | 1939 for (int i = 0; i < glyphCount; ++i) { |
1940 if (SkUTF16_IsHighSurrogate(src[i + extra])) { | 1940 if (SkUTF16_IsHighSurrogate(src[i + extra])) { |
1941 ++extra; | 1941 ++extra; |
1942 } | 1942 } |
1943 } | 1943 } |
1944 srcCount = glyphCount + extra; | 1944 srcCount = glyphCount + extra; |
1945 break; | 1945 break; |
1946 } | 1946 } |
1947 case kUTF32_Encoding: { | 1947 case kUTF32_Encoding: { |
1948 const SkUnichar* utf32 = reinterpret_cast<const SkUnichar*>(chars); | 1948 const SkUnichar* utf32 = reinterpret_cast<const SkUnichar*>(chars); |
1949 UniChar* utf16 = charStorage.reset(2 * glyphCount); | 1949 UniChar* utf16 = charStorage.reset(2 * glyphCount); |
1950 src = utf16; | 1950 src = utf16; |
1951 for (int i = 0; i < glyphCount; ++i) { | 1951 for (int i = 0; i < glyphCount; ++i) { |
1952 utf16 += SkUTF16_FromUnichar(utf32[i], utf16); | 1952 utf16 += SkUTF16_FromUnichar(utf32[i], utf16); |
1953 } | 1953 } |
1954 srcCount = utf16 - src; | 1954 srcCount = SkToInt(utf16 - src); |
1955 break; | 1955 break; |
1956 } | 1956 } |
1957 } | 1957 } |
1958 | 1958 |
1959 // If glyphs is NULL, CT still needs glyph storage for finding the first fai
lure. | 1959 // If glyphs is NULL, CT still needs glyph storage for finding the first fai
lure. |
1960 // Also, if there are any non-bmp code points, the provided 'glyphs' storage
will be inadequate. | 1960 // Also, if there are any non-bmp code points, the provided 'glyphs' storage
will be inadequate. |
1961 SkAutoSTMalloc<1024, uint16_t> glyphStorage; | 1961 SkAutoSTMalloc<1024, uint16_t> glyphStorage; |
1962 uint16_t* macGlyphs = glyphs; | 1962 uint16_t* macGlyphs = glyphs; |
1963 if (NULL == macGlyphs || srcCount > glyphCount) { | 1963 if (NULL == macGlyphs || srcCount > glyphCount) { |
1964 macGlyphs = glyphStorage.reset(srcCount); | 1964 macGlyphs = glyphStorage.reset(srcCount); |
(...skipping 27 matching lines...) Expand all Loading... |
1992 for (int i = 0; i < glyphCount; ++i) { | 1992 for (int i = 0; i < glyphCount; ++i) { |
1993 if (0 == compactedGlyphs[i]) { | 1993 if (0 == compactedGlyphs[i]) { |
1994 return i; | 1994 return i; |
1995 } | 1995 } |
1996 } | 1996 } |
1997 // Odd to get here, as we expected CT to have returned true up front. | 1997 // Odd to get here, as we expected CT to have returned true up front. |
1998 return glyphCount; | 1998 return glyphCount; |
1999 } | 1999 } |
2000 | 2000 |
2001 int SkTypeface_Mac::onCountGlyphs() const { | 2001 int SkTypeface_Mac::onCountGlyphs() const { |
2002 return CTFontGetGlyphCount(fFontRef); | 2002 return SkToInt(CTFontGetGlyphCount(fFontRef)); |
2003 } | 2003 } |
2004 | 2004 |
2005 /////////////////////////////////////////////////////////////////////////////// | 2005 /////////////////////////////////////////////////////////////////////////////// |
2006 /////////////////////////////////////////////////////////////////////////////// | 2006 /////////////////////////////////////////////////////////////////////////////// |
2007 #if 1 | 2007 #if 1 |
2008 | 2008 |
2009 static bool find_desc_str(CTFontDescriptorRef desc, CFStringRef name, SkString*
value) { | 2009 static bool find_desc_str(CTFontDescriptorRef desc, CFStringRef name, SkString*
value) { |
2010 AutoCFRelease<CFStringRef> ref((CFStringRef)CTFontDescriptorCopyAttribute(de
sc, name)); | 2010 AutoCFRelease<CFStringRef> ref((CFStringRef)CTFontDescriptorCopyAttribute(de
sc, name)); |
2011 if (NULL == ref.get()) { | 2011 if (NULL == ref.get()) { |
2012 return false; | 2012 return false; |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2135 class SkFontStyleSet_Mac : public SkFontStyleSet { | 2135 class SkFontStyleSet_Mac : public SkFontStyleSet { |
2136 public: | 2136 public: |
2137 SkFontStyleSet_Mac(CFStringRef familyName, CTFontDescriptorRef desc) | 2137 SkFontStyleSet_Mac(CFStringRef familyName, CTFontDescriptorRef desc) |
2138 : fArray(CTFontDescriptorCreateMatchingFontDescriptors(desc, NULL)) | 2138 : fArray(CTFontDescriptorCreateMatchingFontDescriptors(desc, NULL)) |
2139 , fFamilyName(familyName) | 2139 , fFamilyName(familyName) |
2140 , fCount(0) { | 2140 , fCount(0) { |
2141 CFRetain(familyName); | 2141 CFRetain(familyName); |
2142 if (NULL == fArray) { | 2142 if (NULL == fArray) { |
2143 fArray = CFArrayCreate(NULL, NULL, 0, NULL); | 2143 fArray = CFArrayCreate(NULL, NULL, 0, NULL); |
2144 } | 2144 } |
2145 fCount = CFArrayGetCount(fArray); | 2145 fCount = SkToInt(CFArrayGetCount(fArray)); |
2146 } | 2146 } |
2147 | 2147 |
2148 virtual ~SkFontStyleSet_Mac() { | 2148 virtual ~SkFontStyleSet_Mac() { |
2149 CFRelease(fArray); | 2149 CFRelease(fArray); |
2150 CFRelease(fFamilyName); | 2150 CFRelease(fFamilyName); |
2151 } | 2151 } |
2152 | 2152 |
2153 virtual int count() SK_OVERRIDE { | 2153 virtual int count() SK_OVERRIDE { |
2154 return fCount; | 2154 return fCount; |
2155 } | 2155 } |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2212 CFArrayRef fNames; | 2212 CFArrayRef fNames; |
2213 | 2213 |
2214 CFStringRef stringAt(int index) const { | 2214 CFStringRef stringAt(int index) const { |
2215 SkASSERT((unsigned)index < (unsigned)fCount); | 2215 SkASSERT((unsigned)index < (unsigned)fCount); |
2216 return (CFStringRef)CFArrayGetValueAtIndex(fNames, index); | 2216 return (CFStringRef)CFArrayGetValueAtIndex(fNames, index); |
2217 } | 2217 } |
2218 | 2218 |
2219 void lazyInit() { | 2219 void lazyInit() { |
2220 if (NULL == fNames) { | 2220 if (NULL == fNames) { |
2221 fNames = SkCTFontManagerCopyAvailableFontFamilyNames(); | 2221 fNames = SkCTFontManagerCopyAvailableFontFamilyNames(); |
2222 fCount = fNames ? CFArrayGetCount(fNames) : 0; | 2222 fCount = fNames ? SkToInt(CFArrayGetCount(fNames)) : 0; |
2223 } | 2223 } |
2224 } | 2224 } |
2225 | 2225 |
2226 static SkFontStyleSet* CreateSet(CFStringRef cfFamilyName) { | 2226 static SkFontStyleSet* CreateSet(CFStringRef cfFamilyName) { |
2227 AutoCFRelease<CFMutableDictionaryRef> cfAttr( | 2227 AutoCFRelease<CFMutableDictionaryRef> cfAttr( |
2228 CFDictionaryCreateMutable(kCFAllocatorDefault, 0, | 2228 CFDictionaryCreateMutable(kCFAllocatorDefault, 0, |
2229 &kCFTypeDictionaryKeyCallBacks, | 2229 &kCFTypeDictionaryKeyCallBacks, |
2230 &kCFTypeDictionaryValueCallBacks)); | 2230 &kCFTypeDictionaryValueCallBacks)); |
2231 | 2231 |
2232 CFDictionaryAddValue(cfAttr, kCTFontFamilyNameAttribute, cfFamilyName); | 2232 CFDictionaryAddValue(cfAttr, kCTFontFamilyNameAttribute, cfFamilyName); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2313 return create_typeface(NULL, familyName, (SkTypeface::Style)styleBits); | 2313 return create_typeface(NULL, familyName, (SkTypeface::Style)styleBits); |
2314 } | 2314 } |
2315 }; | 2315 }; |
2316 | 2316 |
2317 /////////////////////////////////////////////////////////////////////////////// | 2317 /////////////////////////////////////////////////////////////////////////////// |
2318 | 2318 |
2319 SkFontMgr* SkFontMgr::Factory() { | 2319 SkFontMgr* SkFontMgr::Factory() { |
2320 return SkNEW(SkFontMgr_Mac); | 2320 return SkNEW(SkFontMgr_Mac); |
2321 } | 2321 } |
2322 #endif | 2322 #endif |
OLD | NEW |