OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
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 "SkTypes.h" | 8 #include "SkTypes.h" |
9 #undef GetGlyphIndices | 9 #undef GetGlyphIndices |
10 | 10 |
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 | 474 |
475 IDWriteFactory* factory; | 475 IDWriteFactory* factory; |
476 HRVM(get_dwrite_factory(&factory), "Could not get factory."); | 476 HRVM(get_dwrite_factory(&factory), "Could not get factory."); |
477 HRV(factory->UnregisterFontCollectionLoader(fDWriteFontCollectionLoader.
get())); | 477 HRV(factory->UnregisterFontCollectionLoader(fDWriteFontCollectionLoader.
get())); |
478 HRV(factory->UnregisterFontFileLoader(fDWriteFontFileLoader.get())); | 478 HRV(factory->UnregisterFontFileLoader(fDWriteFontFileLoader.get())); |
479 } | 479 } |
480 | 480 |
481 protected: | 481 protected: |
482 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK
_OVERRIDE; | 482 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK
_OVERRIDE; |
483 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; | 483 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; |
| 484 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( |
| 485 SkAdvancedTypefaceMetrics::PerGlyphInfo, |
| 486 const uint32_t*, uint32_t) const SK_OVERRIDE; |
484 }; | 487 }; |
485 | 488 |
486 class SkScalerContext_Windows : public SkScalerContext { | 489 class SkScalerContext_Windows : public SkScalerContext { |
487 public: | 490 public: |
488 SkScalerContext_Windows(DWriteFontTypeface*, const SkDescriptor* desc); | 491 SkScalerContext_Windows(DWriteFontTypeface*, const SkDescriptor* desc); |
489 virtual ~SkScalerContext_Windows(); | 492 virtual ~SkScalerContext_Windows(); |
490 | 493 |
491 protected: | 494 protected: |
492 virtual unsigned generateGlyphCount() SK_OVERRIDE; | 495 virtual unsigned generateGlyphCount() SK_OVERRIDE; |
493 virtual uint16_t generateCharToGlyph(SkUnichar uni) SK_OVERRIDE; | 496 virtual uint16_t generateCharToGlyph(SkUnichar uni) SK_OVERRIDE; |
(...skipping 896 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1390 | 1393 |
1391 const T* fData; | 1394 const T* fData; |
1392 UINT32 fSize; | 1395 UINT32 fSize; |
1393 BOOL fExists; | 1396 BOOL fExists; |
1394 private: | 1397 private: |
1395 //SkTScopedComPtr<IDWriteFontFace> fFontFace; | 1398 //SkTScopedComPtr<IDWriteFontFace> fFontFace; |
1396 IDWriteFontFace* fFontFace; | 1399 IDWriteFontFace* fFontFace; |
1397 void* fLock; | 1400 void* fLock; |
1398 }; | 1401 }; |
1399 | 1402 |
1400 // static | 1403 SkAdvancedTypefaceMetrics* DWriteFontTypeface::onGetAdvancedTypefaceMetrics( |
1401 SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics( | |
1402 uint32_t fontID, | |
1403 SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo, | 1404 SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo, |
1404 const uint32_t* glyphIDs, | 1405 const uint32_t* glyphIDs, |
1405 uint32_t glyphIDsCount) { | 1406 uint32_t glyphIDsCount) const { |
1406 | 1407 |
1407 SkAdvancedTypefaceMetrics* info = NULL; | 1408 SkAdvancedTypefaceMetrics* info = NULL; |
1408 | 1409 |
1409 HRESULT hr = S_OK; | 1410 HRESULT hr = S_OK; |
1410 | 1411 |
1411 DWriteFontTypeface* typeface = GetDWriteFontByID(fontID); | 1412 const unsigned glyphCount = fDWriteFontFace->GetGlyphCount(); |
1412 | |
1413 const unsigned glyphCount = typeface->fDWriteFontFace->GetGlyphCount(); | |
1414 | 1413 |
1415 DWRITE_FONT_METRICS dwfm; | 1414 DWRITE_FONT_METRICS dwfm; |
1416 typeface->fDWriteFontFace->GetMetrics(&dwfm); | 1415 fDWriteFontFace->GetMetrics(&dwfm); |
1417 | 1416 |
1418 info = new SkAdvancedTypefaceMetrics; | 1417 info = new SkAdvancedTypefaceMetrics; |
1419 info->fEmSize = dwfm.designUnitsPerEm; | 1418 info->fEmSize = dwfm.designUnitsPerEm; |
1420 info->fMultiMaster = false; | 1419 info->fMultiMaster = false; |
1421 info->fLastGlyphID = SkToU16(glyphCount - 1); | 1420 info->fLastGlyphID = SkToU16(glyphCount - 1); |
1422 info->fStyle = 0; | 1421 info->fStyle = 0; |
1423 | 1422 |
1424 | 1423 |
1425 SkTScopedComPtr<IDWriteLocalizedStrings> familyNames; | 1424 SkTScopedComPtr<IDWriteLocalizedStrings> familyNames; |
1426 SkTScopedComPtr<IDWriteLocalizedStrings> faceNames; | 1425 SkTScopedComPtr<IDWriteLocalizedStrings> faceNames; |
1427 hr = typeface->fDWriteFontFamily->GetFamilyNames(&familyNames); | 1426 hr = fDWriteFontFamily->GetFamilyNames(&familyNames); |
1428 hr = typeface->fDWriteFont->GetFaceNames(&faceNames); | 1427 hr = fDWriteFont->GetFaceNames(&faceNames); |
1429 | 1428 |
1430 UINT32 familyNameLength; | 1429 UINT32 familyNameLength; |
1431 hr = familyNames->GetStringLength(0, &familyNameLength); | 1430 hr = familyNames->GetStringLength(0, &familyNameLength); |
1432 | 1431 |
1433 UINT32 faceNameLength; | 1432 UINT32 faceNameLength; |
1434 hr = faceNames->GetStringLength(0, &faceNameLength); | 1433 hr = faceNames->GetStringLength(0, &faceNameLength); |
1435 | 1434 |
1436 size_t size = familyNameLength+1+faceNameLength+1; | 1435 size_t size = familyNameLength+1+faceNameLength+1; |
1437 SkTDArray<wchar_t> wFamilyName(new wchar_t[size], size); | 1436 SkTDArray<wchar_t> wFamilyName(new wchar_t[size], size); |
1438 hr = familyNames->GetString(0, wFamilyName.begin(), size); | 1437 hr = familyNames->GetString(0, wFamilyName.begin(), size); |
1439 wFamilyName[familyNameLength] = L' '; | 1438 wFamilyName[familyNameLength] = L' '; |
1440 hr = faceNames->GetString(0, &wFamilyName[familyNameLength+1], size - faceNa
meLength + 1); | 1439 hr = faceNames->GetString(0, &wFamilyName[familyNameLength+1], size - faceNa
meLength + 1); |
1441 | 1440 |
1442 size_t str_len = WideCharToMultiByte(CP_UTF8, 0, wFamilyName.begin(), -1, NU
LL, 0, NULL, NULL); | 1441 size_t str_len = WideCharToMultiByte(CP_UTF8, 0, wFamilyName.begin(), -1, NU
LL, 0, NULL, NULL); |
1443 if (0 == str_len) { | 1442 if (0 == str_len) { |
1444 //TODO: error | 1443 //TODO: error |
1445 } | 1444 } |
1446 SkTDArray<char> familyName(new char[str_len], str_len); | 1445 SkTDArray<char> familyName(new char[str_len], str_len); |
1447 str_len = WideCharToMultiByte(CP_UTF8, 0, wFamilyName.begin(), -1, familyNam
e.begin(), str_len, NULL, NULL); | 1446 str_len = WideCharToMultiByte(CP_UTF8, 0, wFamilyName.begin(), -1, familyNam
e.begin(), str_len, NULL, NULL); |
1448 if (0 == str_len) { | 1447 if (0 == str_len) { |
1449 //TODO: error | 1448 //TODO: error |
1450 } | 1449 } |
1451 info->fFontName.set(familyName.begin(), str_len); | 1450 info->fFontName.set(familyName.begin(), str_len); |
1452 | 1451 |
1453 if (perGlyphInfo & SkAdvancedTypefaceMetrics::kToUnicode_PerGlyphInfo) { | 1452 if (perGlyphInfo & SkAdvancedTypefaceMetrics::kToUnicode_PerGlyphInfo) { |
1454 populate_glyph_to_unicode(typeface->fDWriteFontFace.get(), glyphCount, &
(info->fGlyphToUnicode)); | 1453 populate_glyph_to_unicode(fDWriteFontFace.get(), glyphCount, &(info->fGl
yphToUnicode)); |
1455 } | 1454 } |
1456 | 1455 |
1457 DWRITE_FONT_FACE_TYPE fontType = typeface->fDWriteFontFace->GetType(); | 1456 DWRITE_FONT_FACE_TYPE fontType = fDWriteFontFace->GetType(); |
1458 if (fontType == DWRITE_FONT_FACE_TYPE_TRUETYPE || | 1457 if (fontType == DWRITE_FONT_FACE_TYPE_TRUETYPE || |
1459 fontType == DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION) { | 1458 fontType == DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION) { |
1460 info->fType = SkAdvancedTypefaceMetrics::kTrueType_Font; | 1459 info->fType = SkAdvancedTypefaceMetrics::kTrueType_Font; |
1461 } else { | 1460 } else { |
1462 info->fType = SkAdvancedTypefaceMetrics::kOther_Font; | 1461 info->fType = SkAdvancedTypefaceMetrics::kOther_Font; |
1463 info->fItalicAngle = 0; | 1462 info->fItalicAngle = 0; |
1464 info->fAscent = dwfm.ascent;; | 1463 info->fAscent = dwfm.ascent;; |
1465 info->fDescent = dwfm.descent; | 1464 info->fDescent = dwfm.descent; |
1466 info->fStemV = 0; | 1465 info->fStemV = 0; |
1467 info->fCapHeight = dwfm.capHeight; | 1466 info->fCapHeight = dwfm.capHeight; |
1468 info->fBBox = SkIRect::MakeEmpty(); | 1467 info->fBBox = SkIRect::MakeEmpty(); |
1469 return info; | 1468 return info; |
1470 } | 1469 } |
1471 | 1470 |
1472 AutoDWriteTable<SkOTTableHead> headTable(typeface->fDWriteFontFace.get()); | 1471 AutoDWriteTable<SkOTTableHead> headTable(fDWriteFontFace.get()); |
1473 AutoDWriteTable<SkOTTablePostScript> postTable(typeface->fDWriteFontFace.get
()); | 1472 AutoDWriteTable<SkOTTablePostScript> postTable(fDWriteFontFace.get()); |
1474 AutoDWriteTable<SkOTTableHorizontalHeader> hheaTable(typeface->fDWriteFontFa
ce.get()); | 1473 AutoDWriteTable<SkOTTableHorizontalHeader> hheaTable(fDWriteFontFace.get()); |
1475 AutoDWriteTable<SkOTTableOS2> os2Table(typeface->fDWriteFontFace.get()); | 1474 AutoDWriteTable<SkOTTableOS2> os2Table(fDWriteFontFace.get()); |
1476 if (!headTable.fExists || !postTable.fExists || !hheaTable.fExists || !os2Ta
ble.fExists) { | 1475 if (!headTable.fExists || !postTable.fExists || !hheaTable.fExists || !os2Ta
ble.fExists) { |
1477 info->fItalicAngle = 0; | 1476 info->fItalicAngle = 0; |
1478 info->fAscent = dwfm.ascent;; | 1477 info->fAscent = dwfm.ascent;; |
1479 info->fDescent = dwfm.descent; | 1478 info->fDescent = dwfm.descent; |
1480 info->fStemV = 0; | 1479 info->fStemV = 0; |
1481 info->fCapHeight = dwfm.capHeight; | 1480 info->fCapHeight = dwfm.capHeight; |
1482 info->fBBox = SkIRect::MakeEmpty(); | 1481 info->fBBox = SkIRect::MakeEmpty(); |
1483 return info; | 1482 return info; |
1484 } | 1483 } |
1485 | 1484 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1539 | 1538 |
1540 // If Restricted, the font may not be embedded in a document. | 1539 // If Restricted, the font may not be embedded in a document. |
1541 // If not Restricted, the font can be embedded. | 1540 // If not Restricted, the font can be embedded. |
1542 // If PreviewPrint, the embedding is read-only. | 1541 // If PreviewPrint, the embedding is read-only. |
1543 if (os2Table->version.v0.fsType.field.Restricted) { | 1542 if (os2Table->version.v0.fsType.field.Restricted) { |
1544 info->fType = SkAdvancedTypefaceMetrics::kNotEmbeddable_Font; | 1543 info->fType = SkAdvancedTypefaceMetrics::kNotEmbeddable_Font; |
1545 } else if (perGlyphInfo & SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo)
{ | 1544 } else if (perGlyphInfo & SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo)
{ |
1546 if (fixedWidth) { | 1545 if (fixedWidth) { |
1547 appendRange(&info->fGlyphWidths, 0); | 1546 appendRange(&info->fGlyphWidths, 0); |
1548 int16_t advance; | 1547 int16_t advance; |
1549 getWidthAdvance(typeface->fDWriteFontFace.get(), 1, &advance); | 1548 getWidthAdvance(fDWriteFontFace.get(), 1, &advance); |
1550 info->fGlyphWidths->fAdvance.append(1, &advance); | 1549 info->fGlyphWidths->fAdvance.append(1, &advance); |
1551 finishRange(info->fGlyphWidths.get(), 0, | 1550 finishRange(info->fGlyphWidths.get(), 0, |
1552 SkAdvancedTypefaceMetrics::WidthRange::kDefault); | 1551 SkAdvancedTypefaceMetrics::WidthRange::kDefault); |
1553 } else { | 1552 } else { |
1554 info->fGlyphWidths.reset( | 1553 info->fGlyphWidths.reset( |
1555 getAdvanceData(typeface->fDWriteFontFace.get(), | 1554 getAdvanceData(fDWriteFontFace.get(), |
1556 glyphCount, | 1555 glyphCount, |
1557 glyphIDs, | 1556 glyphIDs, |
1558 glyphIDsCount, | 1557 glyphIDsCount, |
1559 getWidthAdvance)); | 1558 getWidthAdvance)); |
1560 } | 1559 } |
1561 } | 1560 } |
1562 | 1561 |
1563 return info; | 1562 return info; |
1564 } | 1563 } |
OLD | NEW |