| 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 #if defined(SK_BUILD_FOR_WIN32) | 9 #if defined(SK_BUILD_FOR_WIN32) |
| 10 | 10 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 #if SK_HAS_DWRITE_1_H | 35 #if SK_HAS_DWRITE_1_H |
| 36 # include <dwrite_1.h> | 36 # include <dwrite_1.h> |
| 37 #endif | 37 #endif |
| 38 | 38 |
| 39 /* Note: | 39 /* Note: |
| 40 * In versions 8 and 8.1 of Windows, some calls in DWrite are not thread safe. | 40 * In versions 8 and 8.1 of Windows, some calls in DWrite are not thread safe. |
| 41 * The DWriteFactoryMutex protects the calls that are problematic. | 41 * The DWriteFactoryMutex protects the calls that are problematic. |
| 42 */ | 42 */ |
| 43 static SkSharedMutex DWriteFactoryMutex; | 43 static SkSharedMutex DWriteFactoryMutex; |
| 44 | 44 |
| 45 typedef SkAutoTExclusive<SkSharedMutex> Exclusive; | |
| 46 typedef SkAutoSharedMutexShared Shared; | 45 typedef SkAutoSharedMutexShared Shared; |
| 47 | 46 |
| 48 static bool isLCD(const SkScalerContext::Rec& rec) { | 47 static bool isLCD(const SkScalerContext::Rec& rec) { |
| 49 return SkMask::kLCD16_Format == rec.fMaskFormat; | 48 return SkMask::kLCD16_Format == rec.fMaskFormat; |
| 50 } | 49 } |
| 51 | 50 |
| 52 static bool is_hinted_without_gasp(DWriteFontTypeface* typeface) { | 51 static bool is_hinted_without_gasp(DWriteFontTypeface* typeface) { |
| 53 Exclusive l(DWriteFactoryMutex); | 52 SkAutoExclusive l(DWriteFactoryMutex); |
| 54 AutoTDWriteTable<SkOTTableMaximumProfile> maxp(typeface->fDWriteFontFace.get
()); | 53 AutoTDWriteTable<SkOTTableMaximumProfile> maxp(typeface->fDWriteFontFace.get
()); |
| 55 if (!maxp.fExists) { | 54 if (!maxp.fExists) { |
| 56 return false; | 55 return false; |
| 57 } | 56 } |
| 58 if (maxp.fSize < sizeof(SkOTTableMaximumProfile::Version::TT)) { | 57 if (maxp.fSize < sizeof(SkOTTableMaximumProfile::Version::TT)) { |
| 59 return false; | 58 return false; |
| 60 } | 59 } |
| 61 if (maxp->version.version != SkOTTableMaximumProfile::Version::TT::VERSION)
{ | 60 if (maxp->version.version != SkOTTableMaximumProfile::Version::TT::VERSION)
{ |
| 62 return false; | 61 return false; |
| 63 } | 62 } |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 { | 112 { |
| 114 range->min = minPPEM + 1; | 113 range->min = minPPEM + 1; |
| 115 range->max = maxPPEM; | 114 range->max = maxPPEM; |
| 116 return; | 115 return; |
| 117 } | 116 } |
| 118 minPPEM = maxPPEM; | 117 minPPEM = maxPPEM; |
| 119 } | 118 } |
| 120 } | 119 } |
| 121 | 120 |
| 122 static bool has_bitmap_strike(DWriteFontTypeface* typeface, PPEMRange range) { | 121 static bool has_bitmap_strike(DWriteFontTypeface* typeface, PPEMRange range) { |
| 123 Exclusive l(DWriteFactoryMutex); | 122 SkAutoExclusive l(DWriteFactoryMutex); |
| 124 { | 123 { |
| 125 AutoTDWriteTable<SkOTTableEmbeddedBitmapLocation> eblc(typeface->fDWrite
FontFace.get()); | 124 AutoTDWriteTable<SkOTTableEmbeddedBitmapLocation> eblc(typeface->fDWrite
FontFace.get()); |
| 126 if (!eblc.fExists) { | 125 if (!eblc.fExists) { |
| 127 return false; | 126 return false; |
| 128 } | 127 } |
| 129 if (eblc.fSize < sizeof(SkOTTableEmbeddedBitmapLocation)) { | 128 if (eblc.fSize < sizeof(SkOTTableEmbeddedBitmapLocation)) { |
| 130 return false; | 129 return false; |
| 131 } | 130 } |
| 132 if (eblc->version != SkOTTableEmbeddedBitmapLocation::version_initial) { | 131 if (eblc->version != SkOTTableEmbeddedBitmapLocation::version_initial) { |
| 133 return false; | 132 return false; |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 | 355 |
| 357 glyph->fAdvanceX = 0; | 356 glyph->fAdvanceX = 0; |
| 358 glyph->fAdvanceY = 0; | 357 glyph->fAdvanceY = 0; |
| 359 | 358 |
| 360 uint16_t glyphId = glyph->getGlyphID(); | 359 uint16_t glyphId = glyph->getGlyphID(); |
| 361 DWRITE_GLYPH_METRICS gm; | 360 DWRITE_GLYPH_METRICS gm; |
| 362 | 361 |
| 363 if (DWRITE_MEASURING_MODE_GDI_CLASSIC == fMeasuringMode || | 362 if (DWRITE_MEASURING_MODE_GDI_CLASSIC == fMeasuringMode || |
| 364 DWRITE_MEASURING_MODE_GDI_NATURAL == fMeasuringMode) | 363 DWRITE_MEASURING_MODE_GDI_NATURAL == fMeasuringMode) |
| 365 { | 364 { |
| 366 Exclusive l(DWriteFactoryMutex); | 365 SkAutoExclusive l(DWriteFactoryMutex); |
| 367 HRVM(fTypeface->fDWriteFontFace->GetGdiCompatibleGlyphMetrics( | 366 HRVM(fTypeface->fDWriteFontFace->GetGdiCompatibleGlyphMetrics( |
| 368 fTextSizeMeasure, | 367 fTextSizeMeasure, |
| 369 1.0f, // pixelsPerDip | 368 1.0f, // pixelsPerDip |
| 370 &fGsA, | 369 &fGsA, |
| 371 DWRITE_MEASURING_MODE_GDI_NATURAL == fMeasuringMode, | 370 DWRITE_MEASURING_MODE_GDI_NATURAL == fMeasuringMode, |
| 372 &glyphId, 1, | 371 &glyphId, 1, |
| 373 &gm), | 372 &gm), |
| 374 "Could not get gdi compatible glyph metrics."); | 373 "Could not get gdi compatible glyph metrics."); |
| 375 } else { | 374 } else { |
| 376 Exclusive l(DWriteFactoryMutex); | 375 SkAutoExclusive l(DWriteFactoryMutex); |
| 377 HRVM(fTypeface->fDWriteFontFace->GetDesignGlyphMetrics(&glyphId, 1, &gm)
, | 376 HRVM(fTypeface->fDWriteFontFace->GetDesignGlyphMetrics(&glyphId, 1, &gm)
, |
| 378 "Could not get design metrics."); | 377 "Could not get design metrics."); |
| 379 } | 378 } |
| 380 | 379 |
| 381 DWRITE_FONT_METRICS dwfm; | 380 DWRITE_FONT_METRICS dwfm; |
| 382 { | 381 { |
| 383 Shared l(DWriteFactoryMutex); | 382 Shared l(DWriteFactoryMutex); |
| 384 fTypeface->fDWriteFontFace->GetMetrics(&dwfm); | 383 fTypeface->fDWriteFontFace->GetMetrics(&dwfm); |
| 385 } | 384 } |
| 386 SkScalar advanceX = SkScalarMulDiv(fTextSizeMeasure, | 385 SkScalar advanceX = SkScalarMulDiv(fTextSizeMeasure, |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 425 run.glyphAdvances = &advance; | 424 run.glyphAdvances = &advance; |
| 426 run.fontFace = fTypeface->fDWriteFontFace.get(); | 425 run.fontFace = fTypeface->fDWriteFontFace.get(); |
| 427 run.fontEmSize = SkScalarToFloat(fTextSizeRender); | 426 run.fontEmSize = SkScalarToFloat(fTextSizeRender); |
| 428 run.bidiLevel = 0; | 427 run.bidiLevel = 0; |
| 429 run.glyphIndices = &glyphId; | 428 run.glyphIndices = &glyphId; |
| 430 run.isSideways = FALSE; | 429 run.isSideways = FALSE; |
| 431 run.glyphOffsets = &offset; | 430 run.glyphOffsets = &offset; |
| 432 | 431 |
| 433 SkTScopedComPtr<IDWriteGlyphRunAnalysis> glyphRunAnalysis; | 432 SkTScopedComPtr<IDWriteGlyphRunAnalysis> glyphRunAnalysis; |
| 434 { | 433 { |
| 435 Exclusive l(DWriteFactoryMutex); | 434 SkAutoExclusive l(DWriteFactoryMutex); |
| 436 HRM(fTypeface->fFactory->CreateGlyphRunAnalysis( | 435 HRM(fTypeface->fFactory->CreateGlyphRunAnalysis( |
| 437 &run, | 436 &run, |
| 438 1.0f, // pixelsPerDip, | 437 1.0f, // pixelsPerDip, |
| 439 &fXform, | 438 &fXform, |
| 440 renderingMode, | 439 renderingMode, |
| 441 fMeasuringMode, | 440 fMeasuringMode, |
| 442 0.0f, // baselineOriginX, | 441 0.0f, // baselineOriginX, |
| 443 0.0f, // baselineOriginY, | 442 0.0f, // baselineOriginY, |
| 444 &glyphRunAnalysis), | 443 &glyphRunAnalysis), |
| 445 "Could not create glyph run analysis."); | 444 "Could not create glyph run analysis."); |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 730 run.fontFace = fTypeface->fDWriteFontFace.get(); | 729 run.fontFace = fTypeface->fDWriteFontFace.get(); |
| 731 run.fontEmSize = SkScalarToFloat(fTextSizeRender); | 730 run.fontEmSize = SkScalarToFloat(fTextSizeRender); |
| 732 run.bidiLevel = 0; | 731 run.bidiLevel = 0; |
| 733 run.glyphIndices = &index; | 732 run.glyphIndices = &index; |
| 734 run.isSideways = FALSE; | 733 run.isSideways = FALSE; |
| 735 run.glyphOffsets = &offset; | 734 run.glyphOffsets = &offset; |
| 736 { | 735 { |
| 737 | 736 |
| 738 SkTScopedComPtr<IDWriteGlyphRunAnalysis> glyphRunAnalysis; | 737 SkTScopedComPtr<IDWriteGlyphRunAnalysis> glyphRunAnalysis; |
| 739 { | 738 { |
| 740 Exclusive l(DWriteFactoryMutex); | 739 SkAutoExclusive l(DWriteFactoryMutex); |
| 741 HRNM(fTypeface->fFactory->CreateGlyphRunAnalysis(&run, | 740 HRNM(fTypeface->fFactory->CreateGlyphRunAnalysis(&run, |
| 742 1.0f, // pixelsPerDip, | 741 1.0f, // pixelsPerDip, |
| 743 &fXform, | 742 &fXform, |
| 744 renderingMode, | 743 renderingMode, |
| 745 fMeasuringMode, | 744 fMeasuringMode, |
| 746 0.0f, // baselineOriginX, | 745 0.0f, // baselineOriginX, |
| 747 0.0f, // baselineOriginY, | 746 0.0f, // baselineOriginY, |
| 748 &glyphRunAnalysis), | 747 &glyphRunAnalysis), |
| 749 "Could not create glyph run analysis."); | 748 "Could not create glyph run analysis."); |
| 750 } | 749 } |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 814 SkASSERT(false); | 813 SkASSERT(false); |
| 815 color = fRec.getLuminanceColor(); | 814 color = fRec.getLuminanceColor(); |
| 816 } | 815 } |
| 817 paint.setColor(color); | 816 paint.setColor(color); |
| 818 | 817 |
| 819 SkPath path; | 818 SkPath path; |
| 820 SkTScopedComPtr<IDWriteGeometrySink> geometryToPath; | 819 SkTScopedComPtr<IDWriteGeometrySink> geometryToPath; |
| 821 HRVM(SkDWriteGeometrySink::Create(&path, &geometryToPath), | 820 HRVM(SkDWriteGeometrySink::Create(&path, &geometryToPath), |
| 822 "Could not create geometry to path converter."); | 821 "Could not create geometry to path converter."); |
| 823 { | 822 { |
| 824 Exclusive l(DWriteFactoryMutex); | 823 SkAutoExclusive l(DWriteFactoryMutex); |
| 825 HRVM(colorGlyph->glyphRun.fontFace->GetGlyphRunOutline( | 824 HRVM(colorGlyph->glyphRun.fontFace->GetGlyphRunOutline( |
| 826 colorGlyph->glyphRun.fontEmSize, | 825 colorGlyph->glyphRun.fontEmSize, |
| 827 colorGlyph->glyphRun.glyphIndices, | 826 colorGlyph->glyphRun.glyphIndices, |
| 828 colorGlyph->glyphRun.glyphAdvances, | 827 colorGlyph->glyphRun.glyphAdvances, |
| 829 colorGlyph->glyphRun.glyphOffsets, | 828 colorGlyph->glyphRun.glyphOffsets, |
| 830 colorGlyph->glyphRun.glyphCount, | 829 colorGlyph->glyphRun.glyphCount, |
| 831 colorGlyph->glyphRun.isSideways, | 830 colorGlyph->glyphRun.isSideways, |
| 832 colorGlyph->glyphRun.bidiLevel % 2, //rtl | 831 colorGlyph->glyphRun.bidiLevel % 2, //rtl |
| 833 geometryToPath.get()), | 832 geometryToPath.get()), |
| 834 "Could not create glyph outline."); | 833 "Could not create glyph outline."); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 892 void SkScalerContext_DW::generatePath(const SkGlyph& glyph, SkPath* path) { | 891 void SkScalerContext_DW::generatePath(const SkGlyph& glyph, SkPath* path) { |
| 893 SkASSERT(path); | 892 SkASSERT(path); |
| 894 | 893 |
| 895 path->reset(); | 894 path->reset(); |
| 896 | 895 |
| 897 SkTScopedComPtr<IDWriteGeometrySink> geometryToPath; | 896 SkTScopedComPtr<IDWriteGeometrySink> geometryToPath; |
| 898 HRVM(SkDWriteGeometrySink::Create(path, &geometryToPath), | 897 HRVM(SkDWriteGeometrySink::Create(path, &geometryToPath), |
| 899 "Could not create geometry to path converter."); | 898 "Could not create geometry to path converter."); |
| 900 uint16_t glyphId = glyph.getGlyphID(); | 899 uint16_t glyphId = glyph.getGlyphID(); |
| 901 { | 900 { |
| 902 Exclusive l(DWriteFactoryMutex); | 901 SkAutoExclusive l(DWriteFactoryMutex); |
| 903 //TODO: convert to<->from DIUs? This would make a difference if hinting. | 902 //TODO: convert to<->from DIUs? This would make a difference if hinting. |
| 904 //It may not be needed, it appears that DirectWrite only hints at em siz
e. | 903 //It may not be needed, it appears that DirectWrite only hints at em siz
e. |
| 905 HRVM(fTypeface->fDWriteFontFace->GetGlyphRunOutline(SkScalarToFloat(fTex
tSizeRender), | 904 HRVM(fTypeface->fDWriteFontFace->GetGlyphRunOutline(SkScalarToFloat(fTex
tSizeRender), |
| 906 &glyphId, | 905 &glyphId, |
| 907 nullptr, //advances | 906 nullptr, //advances |
| 908 nullptr, //offsets | 907 nullptr, //offsets |
| 909 1, //num glyphs | 908 1, //num glyphs |
| 910 FALSE, //sideways | 909 FALSE, //sideways |
| 911 FALSE, //rtl | 910 FALSE, //rtl |
| 912 geometryToPath.get()), | 911 geometryToPath.get()), |
| 913 "Could not create glyph outline."); | 912 "Could not create glyph outline."); |
| 914 } | 913 } |
| 915 | 914 |
| 916 path->transform(fSkXform); | 915 path->transform(fSkXform); |
| 917 } | 916 } |
| 918 | 917 |
| 919 #endif//defined(SK_BUILD_FOR_WIN32) | 918 #endif//defined(SK_BUILD_FOR_WIN32) |
| OLD | NEW |