| 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 "SkTypes.h" | 8 #include "SkTypes.h" |
| 9 #if defined(SK_BUILD_FOR_WIN32) | 9 #if defined(SK_BUILD_FOR_WIN32) |
| 10 | 10 |
| (...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 577 enum Type { | 577 enum Type { |
| 578 kTrueType_Type, kBitmap_Type, kLine_Type | 578 kTrueType_Type, kBitmap_Type, kLine_Type |
| 579 } fType; | 579 } fType; |
| 580 TEXTMETRIC fTM; | 580 TEXTMETRIC fTM; |
| 581 }; | 581 }; |
| 582 | 582 |
| 583 static FIXED float2FIXED(float x) { | 583 static FIXED float2FIXED(float x) { |
| 584 return SkFixedToFIXED(SkFloatToFixed(x)); | 584 return SkFixedToFIXED(SkFloatToFixed(x)); |
| 585 } | 585 } |
| 586 | 586 |
| 587 static inline float FIXED2float(FIXED x) { |
| 588 return SkFixedToFloat(SkFIXEDToFixed(x)); |
| 589 } |
| 590 |
| 587 static BYTE compute_quality(const SkScalerContext::Rec& rec) { | 591 static BYTE compute_quality(const SkScalerContext::Rec& rec) { |
| 588 switch (rec.fMaskFormat) { | 592 switch (rec.fMaskFormat) { |
| 589 case SkMask::kBW_Format: | 593 case SkMask::kBW_Format: |
| 590 return NONANTIALIASED_QUALITY; | 594 return NONANTIALIASED_QUALITY; |
| 591 case SkMask::kLCD16_Format: | 595 case SkMask::kLCD16_Format: |
| 592 return CLEARTYPE_QUALITY; | 596 return CLEARTYPE_QUALITY; |
| 593 default: | 597 default: |
| 594 if (rec.fFlags & SkScalerContext::kGenA8FromLCD_Flag) { | 598 if (rec.fFlags & SkScalerContext::kGenA8FromLCD_Flag) { |
| 595 return CLEARTYPE_QUALITY; | 599 return CLEARTYPE_QUALITY; |
| 596 } else { | 600 } else { |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 849 glyph->fWidth = SkToS16(fTM.tmMaxCharWidth); | 853 glyph->fWidth = SkToS16(fTM.tmMaxCharWidth); |
| 850 } else { | 854 } else { |
| 851 glyph->fWidth = SkToS16(size.cx); | 855 glyph->fWidth = SkToS16(size.cx); |
| 852 } | 856 } |
| 853 glyph->fHeight = SkToS16(size.cy); | 857 glyph->fHeight = SkToS16(size.cy); |
| 854 | 858 |
| 855 glyph->fTop = SkToS16(-fTM.tmAscent); | 859 glyph->fTop = SkToS16(-fTM.tmAscent); |
| 856 // Bitmap FON cannot underhang, but vector FON may. | 860 // Bitmap FON cannot underhang, but vector FON may. |
| 857 // There appears no means of determining underhang of vector FON. | 861 // There appears no means of determining underhang of vector FON. |
| 858 glyph->fLeft = SkToS16(0); | 862 glyph->fLeft = SkToS16(0); |
| 859 glyph->fAdvanceX = SkIntToFixed(glyph->fWidth); | 863 glyph->fAdvanceX = glyph->fWidth; |
| 860 glyph->fAdvanceY = 0; | 864 glyph->fAdvanceY = 0; |
| 861 | 865 |
| 862 // Vector FON will transform nicely, but bitmap FON do not. | 866 // Vector FON will transform nicely, but bitmap FON do not. |
| 863 if (fType == SkScalerContext_GDI::kLine_Type) { | 867 if (fType == SkScalerContext_GDI::kLine_Type) { |
| 864 SkRect bounds = SkRect::MakeXYWH(glyph->fLeft, glyph->fTop, | 868 SkRect bounds = SkRect::MakeXYWH(glyph->fLeft, glyph->fTop, |
| 865 glyph->fWidth, glyph->fHeight); | 869 glyph->fWidth, glyph->fHeight); |
| 866 SkMatrix m; | 870 SkMatrix m; |
| 867 m.setAll(SkFIXEDToScalar(fMat22.eM11), -SkFIXEDToScalar(fMat22.eM21)
, 0, | 871 m.setAll(SkFIXEDToScalar(fMat22.eM11), -SkFIXEDToScalar(fMat22.eM21)
, 0, |
| 868 -SkFIXEDToScalar(fMat22.eM12), SkFIXEDToScalar(fMat22.eM22)
, 0, | 872 -SkFIXEDToScalar(fMat22.eM12), SkFIXEDToScalar(fMat22.eM22)
, 0, |
| 869 0, 0, 1); | 873 0, 0, 1); |
| 870 m.mapRect(&bounds); | 874 m.mapRect(&bounds); |
| 871 bounds.roundOut(&bounds); | 875 bounds.roundOut(&bounds); |
| 872 glyph->fLeft = SkScalarTruncToInt(bounds.fLeft); | 876 glyph->fLeft = SkScalarTruncToInt(bounds.fLeft); |
| 873 glyph->fTop = SkScalarTruncToInt(bounds.fTop); | 877 glyph->fTop = SkScalarTruncToInt(bounds.fTop); |
| 874 glyph->fWidth = SkScalarTruncToInt(bounds.width()); | 878 glyph->fWidth = SkScalarTruncToInt(bounds.width()); |
| 875 glyph->fHeight = SkScalarTruncToInt(bounds.height()); | 879 glyph->fHeight = SkScalarTruncToInt(bounds.height()); |
| 876 } | 880 } |
| 877 | 881 |
| 878 // Apply matrix to advance. | 882 // Apply matrix to advance. |
| 879 glyph->fAdvanceY = SkFixedMul(-SkFIXEDToFixed(fMat22.eM12), glyph->fAdva
nceX); | 883 glyph->fAdvanceY = -FIXED2float(fMat22.eM12) * glyph->fAdvanceX; |
| 880 glyph->fAdvanceX = SkFixedMul(SkFIXEDToFixed(fMat22.eM11), glyph->fAdvan
ceX); | 884 glyph->fAdvanceX *= FIXED2float(fMat22.eM11); |
| 881 | 885 |
| 882 return; | 886 return; |
| 883 } | 887 } |
| 884 | 888 |
| 885 UINT glyphId = glyph->getGlyphID(); | 889 UINT glyphId = glyph->getGlyphID(); |
| 886 | 890 |
| 887 GLYPHMETRICS gm; | 891 GLYPHMETRICS gm; |
| 888 sk_bzero(&gm, sizeof(gm)); | 892 sk_bzero(&gm, sizeof(gm)); |
| 889 | 893 |
| 890 DWORD status = GetGlyphOutlineW(fDDC, glyphId, GGO_METRICS | GGO_GLYPH_INDEX
, &gm, 0, nullptr, &fMat22); | 894 DWORD status = GetGlyphOutlineW(fDDC, glyphId, GGO_METRICS | GGO_GLYPH_INDEX
, &gm, 0, nullptr, &fMat22); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 915 } else { | 919 } else { |
| 916 // Outset, since the image may bleed out of the black box. | 920 // Outset, since the image may bleed out of the black box. |
| 917 // For embedded bitmaps the black box should be exact. | 921 // For embedded bitmaps the black box should be exact. |
| 918 // For outlines we need to outset by 1 in all directions for bleed. | 922 // For outlines we need to outset by 1 in all directions for bleed. |
| 919 // For ClearType we need to outset by 2 for bleed. | 923 // For ClearType we need to outset by 2 for bleed. |
| 920 glyph->fWidth = gm.gmBlackBoxX + 4; | 924 glyph->fWidth = gm.gmBlackBoxX + 4; |
| 921 glyph->fHeight = gm.gmBlackBoxY + 4; | 925 glyph->fHeight = gm.gmBlackBoxY + 4; |
| 922 glyph->fTop -= 2; | 926 glyph->fTop -= 2; |
| 923 glyph->fLeft -= 2; | 927 glyph->fLeft -= 2; |
| 924 } | 928 } |
| 925 glyph->fAdvanceX = SkIntToFixed(gm.gmCellIncX); | 929 // TODO(benjaminwagner): What is the type of gm.gmCellInc[XY]? |
| 926 glyph->fAdvanceY = SkIntToFixed(gm.gmCellIncY); | 930 glyph->fAdvanceX = (float)((int)gm.gmCellIncX); |
| 931 glyph->fAdvanceY = (float)((int)gm.gmCellIncY); |
| 927 glyph->fRsbDelta = 0; | 932 glyph->fRsbDelta = 0; |
| 928 glyph->fLsbDelta = 0; | 933 glyph->fLsbDelta = 0; |
| 929 | 934 |
| 930 if (this->isSubpixel()) { | 935 if (this->isSubpixel()) { |
| 931 sk_bzero(&gm, sizeof(gm)); | 936 sk_bzero(&gm, sizeof(gm)); |
| 932 status = GetGlyphOutlineW(fDDC, glyphId, GGO_METRICS | GGO_GLYPH_INDEX,
&gm, 0, nullptr, &fHighResMat22); | 937 status = GetGlyphOutlineW(fDDC, glyphId, GGO_METRICS | GGO_GLYPH_INDEX,
&gm, 0, nullptr, &fHighResMat22); |
| 933 if (GDI_ERROR != status) { | 938 if (GDI_ERROR != status) { |
| 934 SkPoint advance; | 939 SkPoint advance; |
| 935 fHiResMatrix.mapXY(SkIntToScalar(gm.gmCellIncX), SkIntToScalar(gm.gm
CellIncY), &advance); | 940 fHiResMatrix.mapXY(SkIntToScalar(gm.gmCellIncX), SkIntToScalar(gm.gm
CellIncY), &advance); |
| 936 glyph->fAdvanceX = SkScalarToFixed(advance.fX); | 941 glyph->fAdvanceX = SkScalarToFloat(advance.fX); |
| 937 glyph->fAdvanceY = SkScalarToFixed(advance.fY); | 942 glyph->fAdvanceY = SkScalarToFloat(advance.fY); |
| 938 } | 943 } |
| 939 } else if (!isAxisAligned(this->fRec)) { | 944 } else if (!isAxisAligned(this->fRec)) { |
| 940 status = GetGlyphOutlineW(fDDC, glyphId, GGO_METRICS | GGO_GLYPH_INDEX,
&gm, 0, nullptr, &fGsA); | 945 status = GetGlyphOutlineW(fDDC, glyphId, GGO_METRICS | GGO_GLYPH_INDEX,
&gm, 0, nullptr, &fGsA); |
| 941 if (GDI_ERROR != status) { | 946 if (GDI_ERROR != status) { |
| 942 SkPoint advance; | 947 SkPoint advance; |
| 943 fG_inv.mapXY(SkIntToScalar(gm.gmCellIncX), SkIntToScalar(gm.gmCellIn
cY), &advance); | 948 fG_inv.mapXY(SkIntToScalar(gm.gmCellIncX), SkIntToScalar(gm.gmCellIn
cY), &advance); |
| 944 glyph->fAdvanceX = SkScalarToFixed(advance.fX); | 949 glyph->fAdvanceX = SkScalarToFloat(advance.fX); |
| 945 glyph->fAdvanceY = SkScalarToFixed(advance.fY); | 950 glyph->fAdvanceY = SkScalarToFloat(advance.fY); |
| 946 } | 951 } |
| 947 } | 952 } |
| 948 } | 953 } |
| 949 | 954 |
| 950 static const MAT2 gMat2Identity = {{0, 1}, {0, 0}, {0, 0}, {0, 1}}; | 955 static const MAT2 gMat2Identity = {{0, 1}, {0, 0}, {0, 0}, {0, 1}}; |
| 951 void SkScalerContext_GDI::generateFontMetrics(SkPaint::FontMetrics* metrics) { | 956 void SkScalerContext_GDI::generateFontMetrics(SkPaint::FontMetrics* metrics) { |
| 952 if (nullptr == metrics) { | 957 if (nullptr == metrics) { |
| 953 return; | 958 return; |
| 954 } | 959 } |
| 955 sk_bzero(metrics, sizeof(*metrics)); | 960 sk_bzero(metrics, sizeof(*metrics)); |
| (...skipping 1553 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2509 | 2514 |
| 2510 private: | 2515 private: |
| 2511 SkTDArray<ENUMLOGFONTEX> fLogFontArray; | 2516 SkTDArray<ENUMLOGFONTEX> fLogFontArray; |
| 2512 }; | 2517 }; |
| 2513 | 2518 |
| 2514 /////////////////////////////////////////////////////////////////////////////// | 2519 /////////////////////////////////////////////////////////////////////////////// |
| 2515 | 2520 |
| 2516 SkFontMgr* SkFontMgr_New_GDI() { return new SkFontMgrGDI; } | 2521 SkFontMgr* SkFontMgr_New_GDI() { return new SkFontMgrGDI; } |
| 2517 | 2522 |
| 2518 #endif//defined(SK_BUILD_FOR_WIN32) | 2523 #endif//defined(SK_BUILD_FOR_WIN32) |
| OLD | NEW |