| 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 17 matching lines...) Expand all Loading... |
| 28 #include <tchar.h> | 28 #include <tchar.h> |
| 29 #include <usp10.h> | 29 #include <usp10.h> |
| 30 #include <objbase.h> | 30 #include <objbase.h> |
| 31 | 31 |
| 32 static void (*gEnsureLOGFONTAccessibleProc)(const LOGFONT&); | 32 static void (*gEnsureLOGFONTAccessibleProc)(const LOGFONT&); |
| 33 | 33 |
| 34 void SkTypeface_SetEnsureLOGFONTAccessibleProc(void (*proc)(const LOGFONT&)) { | 34 void SkTypeface_SetEnsureLOGFONTAccessibleProc(void (*proc)(const LOGFONT&)) { |
| 35 gEnsureLOGFONTAccessibleProc = proc; | 35 gEnsureLOGFONTAccessibleProc = proc; |
| 36 } | 36 } |
| 37 | 37 |
| 38 static void call_ensure_accessible(const LOGFONT& lf) { |
| 39 if (gEnsureLOGFONTAccessibleProc) { |
| 40 gEnsureLOGFONTAccessibleProc(lf); |
| 41 } |
| 42 } |
| 43 |
| 44 /////////////////////////////////////////////////////////////////////////////// |
| 45 |
| 38 // always packed xxRRGGBB | 46 // always packed xxRRGGBB |
| 39 typedef uint32_t SkGdiRGB; | 47 typedef uint32_t SkGdiRGB; |
| 40 | 48 |
| 41 template <typename T> T* SkTAddByteOffset(T* ptr, size_t byteOffset) { | 49 template <typename T> T* SkTAddByteOffset(T* ptr, size_t byteOffset) { |
| 42 return (T*)((char*)ptr + byteOffset); | 50 return (T*)((char*)ptr + byteOffset); |
| 43 } | 51 } |
| 44 | 52 |
| 45 // define this in your Makefile or .gyp to enforce AA requests | 53 // define this in your Makefile or .gyp to enforce AA requests |
| 46 // which GDI ignores at small sizes. This flag guarantees AA | 54 // which GDI ignores at small sizes. This flag guarantees AA |
| 47 // for rotated text, regardless of GDI's notions. | 55 // for rotated text, regardless of GDI's notions. |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 161 SkTypeface(style, fontID, false), fLogFont(lf), fSerializeAsStream(seria
lizeAsStream) { | 169 SkTypeface(style, fontID, false), fLogFont(lf), fSerializeAsStream(seria
lizeAsStream) { |
| 162 | 170 |
| 163 // If the font has cubic outlines, it will not be rendered with ClearTyp
e. | 171 // If the font has cubic outlines, it will not be rendered with ClearTyp
e. |
| 164 HFONT font = CreateFontIndirect(&lf); | 172 HFONT font = CreateFontIndirect(&lf); |
| 165 | 173 |
| 166 HDC deviceContext = ::CreateCompatibleDC(NULL); | 174 HDC deviceContext = ::CreateCompatibleDC(NULL); |
| 167 HFONT savefont = (HFONT)SelectObject(deviceContext, font); | 175 HFONT savefont = (HFONT)SelectObject(deviceContext, font); |
| 168 | 176 |
| 169 TEXTMETRIC textMetric; | 177 TEXTMETRIC textMetric; |
| 170 if (0 == GetTextMetrics(deviceContext, &textMetric)) { | 178 if (0 == GetTextMetrics(deviceContext, &textMetric)) { |
| 171 SkFontHost::EnsureTypefaceAccessible(*this); | 179 call_ensure_accessible(lf); |
| 172 if (0 == GetTextMetrics(deviceContext, &textMetric)) { | 180 if (0 == GetTextMetrics(deviceContext, &textMetric)) { |
| 173 textMetric.tmPitchAndFamily = TMPF_TRUETYPE; | 181 textMetric.tmPitchAndFamily = TMPF_TRUETYPE; |
| 174 } | 182 } |
| 175 } | 183 } |
| 176 if (deviceContext) { | 184 if (deviceContext) { |
| 177 ::SelectObject(deviceContext, savefont); | 185 ::SelectObject(deviceContext, savefont); |
| 178 ::DeleteDC(deviceContext); | 186 ::DeleteDC(deviceContext); |
| 179 } | 187 } |
| 180 if (font) { | 188 if (font) { |
| 181 ::DeleteObject(font); | 189 ::DeleteObject(font); |
| 182 } | 190 } |
| 183 | 191 |
| 184 // Used a logfont on a memory context, should never get a device font. | 192 // Used a logfont on a memory context, should never get a device font. |
| 185 // Therefore all TMPF_DEVICE will be PostScript (cubic) fonts. | 193 // Therefore all TMPF_DEVICE will be PostScript (cubic) fonts. |
| 186 fCanBeLCD = !((textMetric.tmPitchAndFamily & TMPF_VECTOR) && | 194 fCanBeLCD = !((textMetric.tmPitchAndFamily & TMPF_VECTOR) && |
| 187 (textMetric.tmPitchAndFamily & TMPF_DEVICE)); | 195 (textMetric.tmPitchAndFamily & TMPF_DEVICE)); |
| 188 } | 196 } |
| 189 | 197 |
| 190 LOGFONT fLogFont; | 198 LOGFONT fLogFont; |
| 191 bool fSerializeAsStream; | 199 bool fSerializeAsStream; |
| 192 bool fCanBeLCD; | 200 bool fCanBeLCD; |
| 193 | 201 |
| 194 static LogFontTypeface* Create(const LOGFONT& lf) { | 202 static LogFontTypeface* Create(const LOGFONT& lf) { |
| 195 SkTypeface::Style style = get_style(lf); | 203 SkTypeface::Style style = get_style(lf); |
| 196 SkFontID fontID = SkTypefaceCache::NewFontID(); | 204 SkFontID fontID = SkTypefaceCache::NewFontID(); |
| 197 return new LogFontTypeface(style, fontID, lf); | 205 return new LogFontTypeface(style, fontID, lf); |
| 198 } | 206 } |
| 199 | 207 |
| 208 static void EnsureAccessible(const SkTypeface* face) { |
| 209 call_ensure_accessible(static_cast<const LogFontTypeface*>(face)->fLogFo
nt); |
| 210 } |
| 211 |
| 200 protected: | 212 protected: |
| 201 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK
_OVERRIDE; | 213 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK
_OVERRIDE; |
| 202 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; | 214 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; |
| 203 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( | 215 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( |
| 204 SkAdvancedTypefaceMetrics::PerGlyphInfo, | 216 SkAdvancedTypefaceMetrics::PerGlyphInfo, |
| 205 const uint32_t*, uint32_t) const SK_OVERRIDE; | 217 const uint32_t*, uint32_t) const SK_OVERRIDE; |
| 206 }; | 218 }; |
| 207 | 219 |
| 208 class FontMemResourceTypeface : public LogFontTypeface { | 220 class FontMemResourceTypeface : public LogFontTypeface { |
| 209 public: | 221 public: |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 } | 299 } |
| 288 } | 300 } |
| 289 | 301 |
| 290 SkTypeface* SkFontHost::NextLogicalTypeface(SkFontID currFontID, SkFontID origFo
ntID) { | 302 SkTypeface* SkFontHost::NextLogicalTypeface(SkFontID currFontID, SkFontID origFo
ntID) { |
| 291 // Zero means that we don't have any fallback fonts for this fontID. | 303 // Zero means that we don't have any fallback fonts for this fontID. |
| 292 // This function is implemented on Android, but doesn't have much | 304 // This function is implemented on Android, but doesn't have much |
| 293 // meaning here. | 305 // meaning here. |
| 294 return NULL; | 306 return NULL; |
| 295 } | 307 } |
| 296 | 308 |
| 297 static void ensure_typeface_accessible(SkFontID fontID) { | |
| 298 LogFontTypeface* face = static_cast<LogFontTypeface*>(SkTypefaceCache::FindB
yID(fontID)); | |
| 299 if (face) { | |
| 300 SkFontHost::EnsureTypefaceAccessible(*face); | |
| 301 } | |
| 302 } | |
| 303 | |
| 304 static void GetLogFontByID(SkFontID fontID, LOGFONT* lf) { | 309 static void GetLogFontByID(SkFontID fontID, LOGFONT* lf) { |
| 305 LogFontTypeface* face = static_cast<LogFontTypeface*>(SkTypefaceCache::FindB
yID(fontID)); | 310 LogFontTypeface* face = static_cast<LogFontTypeface*>(SkTypefaceCache::FindB
yID(fontID)); |
| 306 if (face) { | 311 if (face) { |
| 307 *lf = face->fLogFont; | 312 *lf = face->fLogFont; |
| 308 } else { | 313 } else { |
| 309 sk_bzero(lf, sizeof(LOGFONT)); | 314 sk_bzero(lf, sizeof(LOGFONT)); |
| 310 } | 315 } |
| 311 } | 316 } |
| 312 | 317 |
| 313 // Construct Glyph to Unicode table. | 318 // Construct Glyph to Unicode table. |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 555 return CLEARTYPE_QUALITY; | 560 return CLEARTYPE_QUALITY; |
| 556 default: | 561 default: |
| 557 if (rec.fFlags & SkScalerContext::kGenA8FromLCD_Flag) { | 562 if (rec.fFlags & SkScalerContext::kGenA8FromLCD_Flag) { |
| 558 return CLEARTYPE_QUALITY; | 563 return CLEARTYPE_QUALITY; |
| 559 } else { | 564 } else { |
| 560 return ANTIALIASED_QUALITY; | 565 return ANTIALIASED_QUALITY; |
| 561 } | 566 } |
| 562 } | 567 } |
| 563 } | 568 } |
| 564 | 569 |
| 565 SkScalerContext_Windows::SkScalerContext_Windows(SkTypeface* typeface, | 570 SkScalerContext_Windows::SkScalerContext_Windows(SkTypeface* rawTypeface, |
| 566 const SkDescriptor* desc) | 571 const SkDescriptor* desc) |
| 567 : SkScalerContext(typeface, desc), fDDC(0), fFont(0), fSavefont(0), fSC(
0) | 572 : SkScalerContext(rawTypeface, desc) |
| 573 , fDDC(0) |
| 574 , fFont(0) |
| 575 , fSavefont(0) |
| 576 , fSC(0) |
| 568 , fGlyphCount(-1) { | 577 , fGlyphCount(-1) { |
| 569 SkAutoMutexAcquire ac(gFTMutex); | 578 SkAutoMutexAcquire ac(gFTMutex); |
| 570 | 579 |
| 580 LogFontTypeface* typeface = reinterpret_cast<LogFontTypeface*>(rawTypeface); |
| 581 |
| 571 fDDC = ::CreateCompatibleDC(NULL); | 582 fDDC = ::CreateCompatibleDC(NULL); |
| 572 SetGraphicsMode(fDDC, GM_ADVANCED); | 583 SetGraphicsMode(fDDC, GM_ADVANCED); |
| 573 SetBkMode(fDDC, TRANSPARENT); | 584 SetBkMode(fDDC, TRANSPARENT); |
| 574 | 585 |
| 575 // Scaling by the DPI is inconsistent with how Skia draws elsewhere | 586 // Scaling by the DPI is inconsistent with how Skia draws elsewhere |
| 576 //SkScalar height = -(fRec.fTextSize * GetDeviceCaps(ddc, LOGPIXELSY) / 72); | 587 //SkScalar height = -(fRec.fTextSize * GetDeviceCaps(ddc, LOGPIXELSY) / 72); |
| 577 LOGFONT lf; | 588 LOGFONT lf = typeface->fLogFont; |
| 578 GetLogFontByID(fRec.fFontID, &lf); | |
| 579 lf.lfHeight = -gCanonicalTextSize; | 589 lf.lfHeight = -gCanonicalTextSize; |
| 580 lf.lfQuality = compute_quality(fRec); | 590 lf.lfQuality = compute_quality(fRec); |
| 581 fFont = CreateFontIndirect(&lf); | 591 fFont = CreateFontIndirect(&lf); |
| 582 | 592 |
| 583 // if we're rotated, or want fractional widths, create a hires font | 593 // if we're rotated, or want fractional widths, create a hires font |
| 584 fHiResFont = 0; | 594 fHiResFont = 0; |
| 585 if (needHiResMetrics(fRec.fPost2x2)) { | 595 if (needHiResMetrics(fRec.fPost2x2)) { |
| 586 lf.lfHeight = -HIRES_TEXTSIZE; | 596 lf.lfHeight = -HIRES_TEXTSIZE; |
| 587 fHiResFont = CreateFontIndirect(&lf); | 597 fHiResFont = CreateFontIndirect(&lf); |
| 588 | 598 |
| 589 fMat22Identity.eM11 = fMat22Identity.eM22 = SkFixedToFIXED(SK_Fixed1); | 599 fMat22Identity.eM11 = fMat22Identity.eM22 = SkFixedToFIXED(SK_Fixed1); |
| 590 fMat22Identity.eM12 = fMat22Identity.eM21 = SkFixedToFIXED(0); | 600 fMat22Identity.eM12 = fMat22Identity.eM21 = SkFixedToFIXED(0); |
| 591 | 601 |
| 592 // construct a matrix to go from HIRES logical units to our device units | 602 // construct a matrix to go from HIRES logical units to our device units |
| 593 fRec.getSingleMatrix(&fHiResMatrix); | 603 fRec.getSingleMatrix(&fHiResMatrix); |
| 594 SkScalar scale = SkScalarInvert(SkIntToScalar(HIRES_TEXTSIZE)); | 604 SkScalar scale = SkScalarInvert(SkIntToScalar(HIRES_TEXTSIZE)); |
| 595 fHiResMatrix.preScale(scale, scale); | 605 fHiResMatrix.preScale(scale, scale); |
| 596 } | 606 } |
| 597 fSavefont = (HFONT)SelectObject(fDDC, fFont); | 607 fSavefont = (HFONT)SelectObject(fDDC, fFont); |
| 598 | 608 |
| 599 if (0 == GetTextMetrics(fDDC, &fTM)) { | 609 if (0 == GetTextMetrics(fDDC, &fTM)) { |
| 600 ensure_typeface_accessible(fRec.fFontID); | 610 call_ensure_accessible(lf); |
| 601 if (0 == GetTextMetrics(fDDC, &fTM)) { | 611 if (0 == GetTextMetrics(fDDC, &fTM)) { |
| 602 fTM.tmPitchAndFamily = TMPF_TRUETYPE; | 612 fTM.tmPitchAndFamily = TMPF_TRUETYPE; |
| 603 } | 613 } |
| 604 } | 614 } |
| 605 // Used a logfont on a memory context, should never get a device font. | 615 // Used a logfont on a memory context, should never get a device font. |
| 606 // Therefore all TMPF_DEVICE will be PostScript fonts. | 616 // Therefore all TMPF_DEVICE will be PostScript fonts. |
| 607 | 617 |
| 608 // If TMPF_VECTOR is set, one of TMPF_TRUETYPE or TMPF_DEVICE must be set, | 618 // If TMPF_VECTOR is set, one of TMPF_TRUETYPE or TMPF_DEVICE must be set, |
| 609 // otherwise we have a vector FON, which we don't support. | 619 // otherwise we have a vector FON, which we don't support. |
| 610 // This was determined by testing with Type1 PFM/PFB and OpenTypeCFF OTF, | 620 // This was determined by testing with Type1 PFM/PFB and OpenTypeCFF OTF, |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 657 fMat22.eM21 = SkScalarToFIXED(-fRec.fPost2x2[0][1]); | 667 fMat22.eM21 = SkScalarToFIXED(-fRec.fPost2x2[0][1]); |
| 658 fMat22.eM22 = SkScalarToFIXED(fRec.fPost2x2[1][1]); | 668 fMat22.eM22 = SkScalarToFIXED(fRec.fPost2x2[1][1]); |
| 659 | 669 |
| 660 lf.lfHeight = -SkScalarCeilToInt(fRec.fTextSize); | 670 lf.lfHeight = -SkScalarCeilToInt(fRec.fTextSize); |
| 661 HFONT bitmapFont = CreateFontIndirect(&lf); | 671 HFONT bitmapFont = CreateFontIndirect(&lf); |
| 662 SelectObject(fDDC, bitmapFont); | 672 SelectObject(fDDC, bitmapFont); |
| 663 ::DeleteObject(fFont); | 673 ::DeleteObject(fFont); |
| 664 fFont = bitmapFont; | 674 fFont = bitmapFont; |
| 665 | 675 |
| 666 if (0 == GetTextMetrics(fDDC, &fTM)) { | 676 if (0 == GetTextMetrics(fDDC, &fTM)) { |
| 667 ensure_typeface_accessible(fRec.fFontID); | 677 call_ensure_accessible(lf); |
| 668 //if the following fails, we'll just draw at gCanonicalTextSize. | 678 //if the following fails, we'll just draw at gCanonicalTextSize. |
| 669 GetTextMetrics(fDDC, &fTM); | 679 GetTextMetrics(fDDC, &fTM); |
| 670 } | 680 } |
| 671 } | 681 } |
| 672 | 682 |
| 673 fOffscreen.init(fFont, xform); | 683 fOffscreen.init(fFont, xform); |
| 674 } | 684 } |
| 675 | 685 |
| 676 SkScalerContext_Windows::~SkScalerContext_Windows() { | 686 SkScalerContext_Windows::~SkScalerContext_Windows() { |
| 677 if (fDDC) { | 687 if (fDDC) { |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 753 return; | 763 return; |
| 754 } | 764 } |
| 755 | 765 |
| 756 UINT glyphId = glyph->getGlyphID(0); | 766 UINT glyphId = glyph->getGlyphID(0); |
| 757 | 767 |
| 758 GLYPHMETRICS gm; | 768 GLYPHMETRICS gm; |
| 759 sk_bzero(&gm, sizeof(gm)); | 769 sk_bzero(&gm, sizeof(gm)); |
| 760 | 770 |
| 761 DWORD status = GetGlyphOutlineW(fDDC, glyphId, GGO_METRICS | GGO_GLYPH_INDEX
, &gm, 0, NULL, &fMat22); | 771 DWORD status = GetGlyphOutlineW(fDDC, glyphId, GGO_METRICS | GGO_GLYPH_INDEX
, &gm, 0, NULL, &fMat22); |
| 762 if (GDI_ERROR == status) { | 772 if (GDI_ERROR == status) { |
| 763 ensure_typeface_accessible(fRec.fFontID); | 773 LogFontTypeface::EnsureAccessible(this->getTypeface()); |
| 764 status = GetGlyphOutlineW(fDDC, glyphId, GGO_METRICS | GGO_GLYPH_INDEX,
&gm, 0, NULL, &fMat22); | 774 status = GetGlyphOutlineW(fDDC, glyphId, GGO_METRICS | GGO_GLYPH_INDEX,
&gm, 0, NULL, &fMat22); |
| 765 if (GDI_ERROR == status) { | 775 if (GDI_ERROR == status) { |
| 766 glyph->zeroMetrics(); | 776 glyph->zeroMetrics(); |
| 767 return; | 777 return; |
| 768 } | 778 } |
| 769 } | 779 } |
| 770 | 780 |
| 771 bool empty = false; | 781 bool empty = false; |
| 772 // The black box is either the embedded bitmap size or the outline extent. | 782 // The black box is either the embedded bitmap size or the outline extent. |
| 773 // It is 1x1 if nothing is to be drawn, but will also be 1x1 if something ve
ry small | 783 // It is 1x1 if nothing is to be drawn, but will also be 1x1 if something ve
ry small |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 838 my->fLeading = SkIntToScalar(fTM.tmInternalLeading | 848 my->fLeading = SkIntToScalar(fTM.tmInternalLeading |
| 839 + fTM.tmExternalLeading); | 849 + fTM.tmExternalLeading); |
| 840 } | 850 } |
| 841 return; | 851 return; |
| 842 } | 852 } |
| 843 | 853 |
| 844 OUTLINETEXTMETRIC otm; | 854 OUTLINETEXTMETRIC otm; |
| 845 | 855 |
| 846 uint32_t ret = GetOutlineTextMetrics(fDDC, sizeof(otm), &otm); | 856 uint32_t ret = GetOutlineTextMetrics(fDDC, sizeof(otm), &otm); |
| 847 if (GDI_ERROR == ret) { | 857 if (GDI_ERROR == ret) { |
| 848 ensure_typeface_accessible(fRec.fFontID); | 858 LogFontTypeface::EnsureAccessible(this->getTypeface()); |
| 849 ret = GetOutlineTextMetrics(fDDC, sizeof(otm), &otm); | 859 ret = GetOutlineTextMetrics(fDDC, sizeof(otm), &otm); |
| 850 } | 860 } |
| 851 if (sizeof(otm) != ret) { | 861 if (sizeof(otm) != ret) { |
| 852 return; | 862 return; |
| 853 } | 863 } |
| 854 | 864 |
| 855 if (mx) { | 865 if (mx) { |
| 856 mx->fTop = -fScale * otm.otmTextMetrics.tmAscent; | 866 mx->fTop = -fScale * otm.otmTextMetrics.tmAscent; |
| 857 mx->fAscent = -fScale * otm.otmAscent; | 867 mx->fAscent = -fScale * otm.otmAscent; |
| 858 mx->fDescent = -fScale * otm.otmDescent; | 868 mx->fDescent = -fScale * otm.otmDescent; |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1081 void SkScalerContext_Windows::generateImage(const SkGlyph& glyph) { | 1091 void SkScalerContext_Windows::generateImage(const SkGlyph& glyph) { |
| 1082 SkAutoMutexAcquire ac(gFTMutex); | 1092 SkAutoMutexAcquire ac(gFTMutex); |
| 1083 SkASSERT(fDDC); | 1093 SkASSERT(fDDC); |
| 1084 | 1094 |
| 1085 const bool isBW = SkMask::kBW_Format == fRec.fMaskFormat; | 1095 const bool isBW = SkMask::kBW_Format == fRec.fMaskFormat; |
| 1086 const bool isAA = !isLCD(fRec); | 1096 const bool isAA = !isLCD(fRec); |
| 1087 | 1097 |
| 1088 size_t srcRB; | 1098 size_t srcRB; |
| 1089 const void* bits = fOffscreen.draw(glyph, isBW, &srcRB); | 1099 const void* bits = fOffscreen.draw(glyph, isBW, &srcRB); |
| 1090 if (NULL == bits) { | 1100 if (NULL == bits) { |
| 1091 ensure_typeface_accessible(fRec.fFontID); | 1101 LogFontTypeface::EnsureAccessible(this->getTypeface()); |
| 1092 bits = fOffscreen.draw(glyph, isBW, &srcRB); | 1102 bits = fOffscreen.draw(glyph, isBW, &srcRB); |
| 1093 if (NULL == bits) { | 1103 if (NULL == bits) { |
| 1094 sk_bzero(glyph.fImage, glyph.computeImageSize()); | 1104 sk_bzero(glyph.fImage, glyph.computeImageSize()); |
| 1095 return; | 1105 return; |
| 1096 } | 1106 } |
| 1097 } | 1107 } |
| 1098 | 1108 |
| 1099 if (!isBW) { | 1109 if (!isBW) { |
| 1100 const uint8_t* table; | 1110 const uint8_t* table; |
| 1101 //The offscreen contains a GDI blit if isAA and kGenA8FromLCD_Flag is no
t set. | 1111 //The offscreen contains a GDI blit if isAA and kGenA8FromLCD_Flag is no
t set. |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1174 SkAutoMutexAcquire ac(gFTMutex); | 1184 SkAutoMutexAcquire ac(gFTMutex); |
| 1175 | 1185 |
| 1176 SkASSERT(&glyph && path); | 1186 SkASSERT(&glyph && path); |
| 1177 SkASSERT(fDDC); | 1187 SkASSERT(fDDC); |
| 1178 | 1188 |
| 1179 path->reset(); | 1189 path->reset(); |
| 1180 | 1190 |
| 1181 GLYPHMETRICS gm; | 1191 GLYPHMETRICS gm; |
| 1182 uint32_t total_size = GetGlyphOutlineW(fDDC, glyph.fID, GGO_NATIVE | GGO_GLY
PH_INDEX, &gm, BUFFERSIZE, glyphbuf, &fMat22); | 1192 uint32_t total_size = GetGlyphOutlineW(fDDC, glyph.fID, GGO_NATIVE | GGO_GLY
PH_INDEX, &gm, BUFFERSIZE, glyphbuf, &fMat22); |
| 1183 if (GDI_ERROR == total_size) { | 1193 if (GDI_ERROR == total_size) { |
| 1184 ensure_typeface_accessible(fRec.fFontID); | 1194 LogFontTypeface::EnsureAccessible(this->getTypeface()); |
| 1185 total_size = GetGlyphOutlineW(fDDC, glyph.fID, GGO_NATIVE | GGO_GLYPH_IN
DEX, &gm, BUFFERSIZE, glyphbuf, &fMat22); | 1195 total_size = GetGlyphOutlineW(fDDC, glyph.fID, GGO_NATIVE | GGO_GLYPH_IN
DEX, &gm, BUFFERSIZE, glyphbuf, &fMat22); |
| 1186 if (GDI_ERROR == total_size) { | 1196 if (GDI_ERROR == total_size) { |
| 1187 SkASSERT(false); | 1197 SkASSERT(false); |
| 1188 return; | 1198 return; |
| 1189 } | 1199 } |
| 1190 } | 1200 } |
| 1191 | 1201 |
| 1192 const uint8_t* cur_glyph = glyphbuf; | 1202 const uint8_t* cur_glyph = glyphbuf; |
| 1193 const uint8_t* end_glyph = glyphbuf + total_size; | 1203 const uint8_t* end_glyph = glyphbuf + total_size; |
| 1194 | 1204 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1273 SkFontDescriptor descriptor(face->style()); | 1283 SkFontDescriptor descriptor(face->style()); |
| 1274 | 1284 |
| 1275 // Get the actual name of the typeface. The logfont may not know this. | 1285 // Get the actual name of the typeface. The logfont may not know this. |
| 1276 HFONT font = CreateFontIndirect(&face->fLogFont); | 1286 HFONT font = CreateFontIndirect(&face->fLogFont); |
| 1277 | 1287 |
| 1278 HDC deviceContext = ::CreateCompatibleDC(NULL); | 1288 HDC deviceContext = ::CreateCompatibleDC(NULL); |
| 1279 HFONT savefont = (HFONT)SelectObject(deviceContext, font); | 1289 HFONT savefont = (HFONT)SelectObject(deviceContext, font); |
| 1280 | 1290 |
| 1281 int fontNameLen; //length of fontName in TCHARS. | 1291 int fontNameLen; //length of fontName in TCHARS. |
| 1282 if (0 == (fontNameLen = GetTextFace(deviceContext, 0, NULL))) { | 1292 if (0 == (fontNameLen = GetTextFace(deviceContext, 0, NULL))) { |
| 1283 SkFontHost::EnsureTypefaceAccessible(*rawFace); | 1293 LogFontTypeface::EnsureAccessible(rawFace); |
| 1284 if (0 == (fontNameLen = GetTextFace(deviceContext, 0, NULL))) { | 1294 if (0 == (fontNameLen = GetTextFace(deviceContext, 0, NULL))) { |
| 1285 fontNameLen = 0; | 1295 fontNameLen = 0; |
| 1286 } | 1296 } |
| 1287 } | 1297 } |
| 1288 | 1298 |
| 1289 SkAutoSTArray<LF_FULLFACESIZE, TCHAR> fontName(fontNameLen+1); | 1299 SkAutoSTArray<LF_FULLFACESIZE, TCHAR> fontName(fontNameLen+1); |
| 1290 if (0 == GetTextFace(deviceContext, fontNameLen, fontName.get())) { | 1300 if (0 == GetTextFace(deviceContext, fontNameLen, fontName.get())) { |
| 1291 SkFontHost::EnsureTypefaceAccessible(*rawFace); | 1301 LogFontTypeface::EnsureAccessible(rawFace); |
| 1292 if (0 == GetTextFace(deviceContext, fontNameLen, fontName.get())) { | 1302 if (0 == GetTextFace(deviceContext, fontNameLen, fontName.get())) { |
| 1293 fontName[0] = 0; | 1303 fontName[0] = 0; |
| 1294 } | 1304 } |
| 1295 } | 1305 } |
| 1296 | 1306 |
| 1297 if (deviceContext) { | 1307 if (deviceContext) { |
| 1298 ::SelectObject(deviceContext, savefont); | 1308 ::SelectObject(deviceContext, savefont); |
| 1299 ::DeleteDC(deviceContext); | 1309 ::DeleteDC(deviceContext); |
| 1300 } | 1310 } |
| 1301 if (font) { | 1311 if (font) { |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1364 | 1374 |
| 1365 const char stem_chars[] = {'i', 'I', '!', '1'}; | 1375 const char stem_chars[] = {'i', 'I', '!', '1'}; |
| 1366 int16_t min_width; | 1376 int16_t min_width; |
| 1367 unsigned glyphCount; | 1377 unsigned glyphCount; |
| 1368 | 1378 |
| 1369 // To request design units, create a logical font whose height is specified | 1379 // To request design units, create a logical font whose height is specified |
| 1370 // as unitsPerEm. | 1380 // as unitsPerEm. |
| 1371 OUTLINETEXTMETRIC otm; | 1381 OUTLINETEXTMETRIC otm; |
| 1372 unsigned int otmRet = GetOutlineTextMetrics(hdc, sizeof(otm), &otm); | 1382 unsigned int otmRet = GetOutlineTextMetrics(hdc, sizeof(otm), &otm); |
| 1373 if (0 == otmRet) { | 1383 if (0 == otmRet) { |
| 1374 ensure_typeface_accessible(this->uniqueID()); | 1384 call_ensure_accessible(lf); |
| 1375 otmRet = GetOutlineTextMetrics(hdc, sizeof(otm), &otm); | 1385 otmRet = GetOutlineTextMetrics(hdc, sizeof(otm), &otm); |
| 1376 } | 1386 } |
| 1377 if (!otmRet || !GetTextFace(hdc, LF_FACESIZE, lf.lfFaceName)) { | 1387 if (!otmRet || !GetTextFace(hdc, LF_FACESIZE, lf.lfFaceName)) { |
| 1378 goto Error; | 1388 goto Error; |
| 1379 } | 1389 } |
| 1380 lf.lfHeight = -SkToS32(otm.otmEMSquare); | 1390 lf.lfHeight = -SkToS32(otm.otmEMSquare); |
| 1381 designFont = CreateFontIndirect(&lf); | 1391 designFont = CreateFontIndirect(&lf); |
| 1382 SelectObject(hdc, designFont); | 1392 SelectObject(hdc, designFont); |
| 1383 if (!GetOutlineTextMetrics(hdc, sizeof(otm), &otm)) { | 1393 if (!GetOutlineTextMetrics(hdc, sizeof(otm), &otm)) { |
| 1384 goto Error; | 1394 goto Error; |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1586 | 1596 |
| 1587 HDC hdc = ::CreateCompatibleDC(NULL); | 1597 HDC hdc = ::CreateCompatibleDC(NULL); |
| 1588 HFONT font = CreateFontIndirect(&lf); | 1598 HFONT font = CreateFontIndirect(&lf); |
| 1589 HFONT savefont = (HFONT)SelectObject(hdc, font); | 1599 HFONT savefont = (HFONT)SelectObject(hdc, font); |
| 1590 | 1600 |
| 1591 SkMemoryStream* stream = NULL; | 1601 SkMemoryStream* stream = NULL; |
| 1592 DWORD tables[2] = {kTTCTag, 0}; | 1602 DWORD tables[2] = {kTTCTag, 0}; |
| 1593 for (int i = 0; i < SK_ARRAY_COUNT(tables); i++) { | 1603 for (int i = 0; i < SK_ARRAY_COUNT(tables); i++) { |
| 1594 size_t bufferSize = GetFontData(hdc, tables[i], 0, NULL, 0); | 1604 size_t bufferSize = GetFontData(hdc, tables[i], 0, NULL, 0); |
| 1595 if (bufferSize == GDI_ERROR) { | 1605 if (bufferSize == GDI_ERROR) { |
| 1596 ensure_typeface_accessible(uniqueID); | 1606 call_ensure_accessible(lf); |
| 1597 bufferSize = GetFontData(hdc, tables[i], 0, NULL, 0); | 1607 bufferSize = GetFontData(hdc, tables[i], 0, NULL, 0); |
| 1598 } | 1608 } |
| 1599 if (bufferSize != GDI_ERROR) { | 1609 if (bufferSize != GDI_ERROR) { |
| 1600 stream = new SkMemoryStream(bufferSize); | 1610 stream = new SkMemoryStream(bufferSize); |
| 1601 if (GetFontData(hdc, tables[i], 0, (void*)stream->getMemoryBase(), | 1611 if (GetFontData(hdc, tables[i], 0, (void*)stream->getMemoryBase(), |
| 1602 bufferSize)) { | 1612 bufferSize)) { |
| 1603 break; | 1613 break; |
| 1604 } else { | 1614 } else { |
| 1605 delete stream; | 1615 delete stream; |
| 1606 stream = NULL; | 1616 stream = NULL; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1691 if (isLCD(*rec) && !isAxisAligned(*rec)) { | 1701 if (isLCD(*rec) && !isAxisAligned(*rec)) { |
| 1692 rec->fMaskFormat = SkMask::kA8_Format; | 1702 rec->fMaskFormat = SkMask::kA8_Format; |
| 1693 } | 1703 } |
| 1694 #endif | 1704 #endif |
| 1695 | 1705 |
| 1696 if (!fCanBeLCD && isLCD(*rec)) { | 1706 if (!fCanBeLCD && isLCD(*rec)) { |
| 1697 rec->fMaskFormat = SkMask::kA8_Format; | 1707 rec->fMaskFormat = SkMask::kA8_Format; |
| 1698 rec->fFlags &= ~SkScalerContext::kGenA8FromLCD_Flag; | 1708 rec->fFlags &= ~SkScalerContext::kGenA8FromLCD_Flag; |
| 1699 } | 1709 } |
| 1700 } | 1710 } |
| OLD | NEW |