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 "SkBase64.h" | 10 #include "SkBase64.h" |
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
552 // initializations (which may include calling GDI). | 552 // initializations (which may include calling GDI). |
553 bool isValid() const; | 553 bool isValid() const; |
554 | 554 |
555 protected: | 555 protected: |
556 virtual unsigned generateGlyphCount() SK_OVERRIDE; | 556 virtual unsigned generateGlyphCount() SK_OVERRIDE; |
557 virtual uint16_t generateCharToGlyph(SkUnichar uni) SK_OVERRIDE; | 557 virtual uint16_t generateCharToGlyph(SkUnichar uni) SK_OVERRIDE; |
558 virtual void generateAdvance(SkGlyph* glyph) SK_OVERRIDE; | 558 virtual void generateAdvance(SkGlyph* glyph) SK_OVERRIDE; |
559 virtual void generateMetrics(SkGlyph* glyph) SK_OVERRIDE; | 559 virtual void generateMetrics(SkGlyph* glyph) SK_OVERRIDE; |
560 virtual void generateImage(const SkGlyph& glyph) SK_OVERRIDE; | 560 virtual void generateImage(const SkGlyph& glyph) SK_OVERRIDE; |
561 virtual void generatePath(const SkGlyph& glyph, SkPath* path) SK_OVERRIDE; | 561 virtual void generatePath(const SkGlyph& glyph, SkPath* path) SK_OVERRIDE; |
562 virtual void generateFontMetrics(SkPaint::FontMetrics* mX, | 562 virtual void generateFontMetrics(SkPaint::FontMetrics*) SK_OVERRIDE; |
563 SkPaint::FontMetrics* mY) SK_OVERRIDE; | |
564 | 563 |
565 private: | 564 private: |
566 DWORD getGDIGlyphPath(const SkGlyph& glyph, UINT flags, | 565 DWORD getGDIGlyphPath(const SkGlyph& glyph, UINT flags, |
567 SkAutoSTMalloc<BUFFERSIZE, uint8_t>* glyphbuf); | 566 SkAutoSTMalloc<BUFFERSIZE, uint8_t>* glyphbuf); |
568 | 567 |
569 HDCOffscreen fOffscreen; | 568 HDCOffscreen fOffscreen; |
570 /** fGsA is the non-rotational part of total matrix without the text height
scale. | 569 /** fGsA is the non-rotational part of total matrix without the text height
scale. |
571 * Used to find the magnitude of advances. | 570 * Used to find the magnitude of advances. |
572 */ | 571 */ |
573 MAT2 fGsA; | 572 MAT2 fGsA; |
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
971 if (GDI_ERROR != status) { | 970 if (GDI_ERROR != status) { |
972 SkPoint advance; | 971 SkPoint advance; |
973 fG_inv.mapXY(SkIntToScalar(gm.gmCellIncX), SkIntToScalar(gm.gmCellIn
cY), &advance); | 972 fG_inv.mapXY(SkIntToScalar(gm.gmCellIncX), SkIntToScalar(gm.gmCellIn
cY), &advance); |
974 glyph->fAdvanceX = SkScalarToFixed(advance.fX); | 973 glyph->fAdvanceX = SkScalarToFixed(advance.fX); |
975 glyph->fAdvanceY = SkScalarToFixed(advance.fY); | 974 glyph->fAdvanceY = SkScalarToFixed(advance.fY); |
976 } | 975 } |
977 } | 976 } |
978 } | 977 } |
979 | 978 |
980 static const MAT2 gMat2Identity = {{0, 1}, {0, 0}, {0, 0}, {0, 1}}; | 979 static const MAT2 gMat2Identity = {{0, 1}, {0, 0}, {0, 0}, {0, 1}}; |
981 void SkScalerContext_GDI::generateFontMetrics(SkPaint::FontMetrics* mx, SkPaint:
:FontMetrics* my) { | 980 void SkScalerContext_GDI::generateFontMetrics(SkPaint::FontMetrics* metrics) { |
982 if (!(mx || my)) { | 981 if (NULL == metrics) { |
983 return; | 982 return; |
984 } | 983 } |
985 | 984 sk_bzero(metrics, sizeof(*metrics)); |
986 if (mx) { | |
987 sk_bzero(mx, sizeof(*mx)); | |
988 } | |
989 if (my) { | |
990 sk_bzero(my, sizeof(*my)); | |
991 } | |
992 | 985 |
993 SkASSERT(fDDC); | 986 SkASSERT(fDDC); |
994 | 987 |
995 #ifndef SK_GDI_ALWAYS_USE_TEXTMETRICS_FOR_FONT_METRICS | 988 #ifndef SK_GDI_ALWAYS_USE_TEXTMETRICS_FOR_FONT_METRICS |
996 if (fType == SkScalerContext_GDI::kBitmap_Type || fType == SkScalerContext_G
DI::kLine_Type) { | 989 if (fType == SkScalerContext_GDI::kBitmap_Type || fType == SkScalerContext_G
DI::kLine_Type) { |
997 #endif | 990 #endif |
998 if (mx) { | 991 metrics->fTop = SkIntToScalar(-fTM.tmAscent); |
999 mx->fTop = SkIntToScalar(-fTM.tmAscent); | 992 metrics->fAscent = SkIntToScalar(-fTM.tmAscent); |
1000 mx->fAscent = SkIntToScalar(-fTM.tmAscent); | 993 metrics->fDescent = SkIntToScalar(fTM.tmDescent); |
1001 mx->fDescent = SkIntToScalar(fTM.tmDescent); | 994 metrics->fBottom = SkIntToScalar(fTM.tmDescent); |
1002 mx->fBottom = SkIntToScalar(fTM.tmDescent); | 995 metrics->fLeading = SkIntToScalar(fTM.tmExternalLeading); |
1003 mx->fLeading = SkIntToScalar(fTM.tmExternalLeading); | 996 metrics->fAvgCharWidth = SkIntToScalar(fTM.tmAveCharWidth); |
1004 } | 997 metrics->fMaxCharWidth = SkIntToScalar(fTM.tmMaxCharWidth); |
1005 | 998 metrics->fXMin = 0; |
1006 if (my) { | 999 metrics->fXMax = metrics->fMaxCharWidth; |
1007 my->fTop = SkIntToScalar(-fTM.tmAscent); | 1000 //metrics->fXHeight = 0; |
1008 my->fAscent = SkIntToScalar(-fTM.tmAscent); | |
1009 my->fDescent = SkIntToScalar(fTM.tmDescent); | |
1010 my->fBottom = SkIntToScalar(fTM.tmDescent); | |
1011 my->fLeading = SkIntToScalar(fTM.tmExternalLeading); | |
1012 my->fAvgCharWidth = SkIntToScalar(fTM.tmAveCharWidth); | |
1013 my->fMaxCharWidth = SkIntToScalar(fTM.tmMaxCharWidth); | |
1014 my->fXMin = 0; | |
1015 my->fXMax = my->fMaxCharWidth; | |
1016 //my->fXHeight = 0; | |
1017 } | |
1018 #ifndef SK_GDI_ALWAYS_USE_TEXTMETRICS_FOR_FONT_METRICS | 1001 #ifndef SK_GDI_ALWAYS_USE_TEXTMETRICS_FOR_FONT_METRICS |
1019 return; | 1002 return; |
1020 } | 1003 } |
1021 #endif | 1004 #endif |
1022 | 1005 |
1023 OUTLINETEXTMETRIC otm; | 1006 OUTLINETEXTMETRIC otm; |
1024 | 1007 |
1025 uint32_t ret = GetOutlineTextMetrics(fDDC, sizeof(otm), &otm); | 1008 uint32_t ret = GetOutlineTextMetrics(fDDC, sizeof(otm), &otm); |
1026 if (0 == ret) { | 1009 if (0 == ret) { |
1027 LogFontTypeface::EnsureAccessible(this->getTypeface()); | 1010 LogFontTypeface::EnsureAccessible(this->getTypeface()); |
1028 ret = GetOutlineTextMetrics(fDDC, sizeof(otm), &otm); | 1011 ret = GetOutlineTextMetrics(fDDC, sizeof(otm), &otm); |
1029 } | 1012 } |
1030 if (0 == ret) { | 1013 if (0 == ret) { |
1031 return; | 1014 return; |
1032 } | 1015 } |
1033 | 1016 |
1034 if (mx) { | 1017 #ifndef SK_GDI_ALWAYS_USE_TEXTMETRICS_FOR_FONT_METRICS |
1035 mx->fTop = SkIntToScalar(-otm.otmrcFontBox.left); | 1018 metrics->fTop = SkIntToScalar(-otm.otmrcFontBox.top); |
1036 mx->fAscent = SkIntToScalar(-otm.otmAscent); | 1019 metrics->fAscent = SkIntToScalar(-otm.otmAscent); |
1037 mx->fDescent = SkIntToScalar(-otm.otmDescent); | 1020 metrics->fDescent = SkIntToScalar(-otm.otmDescent); |
1038 mx->fBottom = SkIntToScalar(otm.otmrcFontBox.right); | 1021 metrics->fBottom = SkIntToScalar(-otm.otmrcFontBox.bottom); |
1039 mx->fLeading = SkIntToScalar(otm.otmLineGap); | 1022 metrics->fLeading = SkIntToScalar(otm.otmLineGap); |
1040 mx->fUnderlineThickness = SkIntToScalar(otm.otmsUnderscoreSize); | 1023 metrics->fAvgCharWidth = SkIntToScalar(otm.otmTextMetrics.tmAveCharWidth); |
1041 mx->fUnderlinePosition = -SkIntToScalar(otm.otmsUnderscorePosition); | 1024 metrics->fMaxCharWidth = SkIntToScalar(otm.otmTextMetrics.tmMaxCharWidth); |
| 1025 metrics->fXMin = SkIntToScalar(otm.otmrcFontBox.left); |
| 1026 metrics->fXMax = SkIntToScalar(otm.otmrcFontBox.right); |
| 1027 #endif |
| 1028 metrics->fUnderlineThickness = SkIntToScalar(otm.otmsUnderscoreSize); |
| 1029 metrics->fUnderlinePosition = -SkIntToScalar(otm.otmsUnderscorePosition); |
1042 | 1030 |
1043 mx->fFlags |= SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; | 1031 metrics->fFlags |= SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; |
1044 mx->fFlags |= SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; | 1032 metrics->fFlags |= SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; |
1045 } | |
1046 | 1033 |
1047 if (my) { | 1034 metrics->fXHeight = SkIntToScalar(otm.otmsXHeight); |
1048 #ifndef SK_GDI_ALWAYS_USE_TEXTMETRICS_FOR_FONT_METRICS | 1035 GLYPHMETRICS gm; |
1049 my->fTop = SkIntToScalar(-otm.otmrcFontBox.top); | 1036 sk_bzero(&gm, sizeof(gm)); |
1050 my->fAscent = SkIntToScalar(-otm.otmAscent); | 1037 DWORD len = GetGlyphOutlineW(fDDC, 'x', GGO_METRICS, &gm, 0, 0, &gMat2Identi
ty); |
1051 my->fDescent = SkIntToScalar(-otm.otmDescent); | 1038 if (len != GDI_ERROR && gm.gmBlackBoxY > 0) { |
1052 my->fBottom = SkIntToScalar(-otm.otmrcFontBox.bottom); | 1039 metrics->fXHeight = SkIntToScalar(gm.gmBlackBoxY); |
1053 my->fLeading = SkIntToScalar(otm.otmLineGap); | |
1054 my->fAvgCharWidth = SkIntToScalar(otm.otmTextMetrics.tmAveCharWidth); | |
1055 my->fMaxCharWidth = SkIntToScalar(otm.otmTextMetrics.tmMaxCharWidth); | |
1056 my->fXMin = SkIntToScalar(otm.otmrcFontBox.left); | |
1057 my->fXMax = SkIntToScalar(otm.otmrcFontBox.right); | |
1058 #endif | |
1059 my->fUnderlineThickness = SkIntToScalar(otm.otmsUnderscoreSize); | |
1060 my->fUnderlinePosition = -SkIntToScalar(otm.otmsUnderscorePosition); | |
1061 | |
1062 my->fFlags |= SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; | |
1063 my->fFlags |= SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; | |
1064 | |
1065 my->fXHeight = SkIntToScalar(otm.otmsXHeight); | |
1066 | |
1067 GLYPHMETRICS gm; | |
1068 sk_bzero(&gm, sizeof(gm)); | |
1069 DWORD len = GetGlyphOutlineW(fDDC, 'x', GGO_METRICS, &gm, 0, 0, &gMat2Id
entity); | |
1070 if (len != GDI_ERROR && gm.gmBlackBoxY > 0) { | |
1071 my->fXHeight = SkIntToScalar(gm.gmBlackBoxY); | |
1072 } | |
1073 } | 1040 } |
1074 } | 1041 } |
1075 | 1042 |
1076 ////////////////////////////////////////////////////////////////////////////////
//////// | 1043 ////////////////////////////////////////////////////////////////////////////////
//////// |
1077 | 1044 |
1078 #define SK_SHOW_TEXT_BLIT_COVERAGE 0 | 1045 #define SK_SHOW_TEXT_BLIT_COVERAGE 0 |
1079 | 1046 |
1080 static void build_power_table(uint8_t table[], float ee) { | 1047 static void build_power_table(uint8_t table[], float ee) { |
1081 for (int i = 0; i < 256; i++) { | 1048 for (int i = 0; i < 256; i++) { |
1082 float x = i / 255.f; | 1049 float x = i / 255.f; |
(...skipping 1319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2402 } | 2369 } |
2403 | 2370 |
2404 void LogFontTypeface::onFilterRec(SkScalerContextRec* rec) const { | 2371 void LogFontTypeface::onFilterRec(SkScalerContextRec* rec) const { |
2405 if (rec->fFlags & SkScalerContext::kLCD_BGROrder_Flag || | 2372 if (rec->fFlags & SkScalerContext::kLCD_BGROrder_Flag || |
2406 rec->fFlags & SkScalerContext::kLCD_Vertical_Flag) | 2373 rec->fFlags & SkScalerContext::kLCD_Vertical_Flag) |
2407 { | 2374 { |
2408 rec->fMaskFormat = SkMask::kA8_Format; | 2375 rec->fMaskFormat = SkMask::kA8_Format; |
2409 rec->fFlags |= SkScalerContext::kGenA8FromLCD_Flag; | 2376 rec->fFlags |= SkScalerContext::kGenA8FromLCD_Flag; |
2410 } | 2377 } |
2411 | 2378 |
2412 unsigned flagsWeDontSupport = SkScalerContext::kDevKernText_Flag | | 2379 unsigned flagsWeDontSupport = SkScalerContext::kVertical_Flag | |
| 2380 SkScalerContext::kDevKernText_Flag | |
2413 SkScalerContext::kForceAutohinting_Flag | | 2381 SkScalerContext::kForceAutohinting_Flag | |
2414 SkScalerContext::kEmbeddedBitmapText_Flag | | 2382 SkScalerContext::kEmbeddedBitmapText_Flag | |
2415 SkScalerContext::kEmbolden_Flag | | 2383 SkScalerContext::kEmbolden_Flag | |
2416 SkScalerContext::kLCD_BGROrder_Flag | | 2384 SkScalerContext::kLCD_BGROrder_Flag | |
2417 SkScalerContext::kLCD_Vertical_Flag; | 2385 SkScalerContext::kLCD_Vertical_Flag; |
2418 rec->fFlags &= ~flagsWeDontSupport; | 2386 rec->fFlags &= ~flagsWeDontSupport; |
2419 | 2387 |
2420 SkPaint::Hinting h = rec->getHinting(); | 2388 SkPaint::Hinting h = rec->getHinting(); |
2421 switch (h) { | 2389 switch (h) { |
2422 case SkPaint::kNo_Hinting: | 2390 case SkPaint::kNo_Hinting: |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2619 | 2587 |
2620 private: | 2588 private: |
2621 SkTDArray<ENUMLOGFONTEX> fLogFontArray; | 2589 SkTDArray<ENUMLOGFONTEX> fLogFontArray; |
2622 }; | 2590 }; |
2623 | 2591 |
2624 /////////////////////////////////////////////////////////////////////////////// | 2592 /////////////////////////////////////////////////////////////////////////////// |
2625 | 2593 |
2626 SkFontMgr* SkFontMgr_New_GDI() { | 2594 SkFontMgr* SkFontMgr_New_GDI() { |
2627 return SkNEW(SkFontMgrGDI); | 2595 return SkNEW(SkFontMgrGDI); |
2628 } | 2596 } |
OLD | NEW |