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 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 | 183 |
184 LOGFONT fLogFont; | 184 LOGFONT fLogFont; |
185 bool fSerializeAsStream; | 185 bool fSerializeAsStream; |
186 bool fCanBeLCD; | 186 bool fCanBeLCD; |
187 | 187 |
188 static LogFontTypeface* Create(const LOGFONT& lf) { | 188 static LogFontTypeface* Create(const LOGFONT& lf) { |
189 SkTypeface::Style style = get_style(lf); | 189 SkTypeface::Style style = get_style(lf); |
190 SkFontID fontID = SkTypefaceCache::NewFontID(); | 190 SkFontID fontID = SkTypefaceCache::NewFontID(); |
191 return new LogFontTypeface(style, fontID, lf); | 191 return new LogFontTypeface(style, fontID, lf); |
192 } | 192 } |
| 193 |
| 194 protected: |
| 195 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK
_OVERRIDE; |
| 196 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; |
193 }; | 197 }; |
194 | 198 |
195 class FontMemResourceTypeface : public LogFontTypeface { | 199 class FontMemResourceTypeface : public LogFontTypeface { |
196 public: | 200 public: |
197 /** | 201 /** |
198 * Takes ownership of fontMemResource. | 202 * Takes ownership of fontMemResource. |
199 */ | 203 */ |
200 FontMemResourceTypeface(SkTypeface::Style style, SkFontID fontID, const LOGF
ONT& lf, HANDLE fontMemResource) : | 204 FontMemResourceTypeface(SkTypeface::Style style, SkFontID fontID, const LOGF
ONT& lf, HANDLE fontMemResource) : |
201 LogFontTypeface(style, fontID, lf, true), fFontMemResource(fontMemResour
ce) { | 205 LogFontTypeface(style, fontID, lf, true), fFontMemResource(fontMemResour
ce) { |
202 } | 206 } |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 * This guy is public | 271 * This guy is public |
268 */ | 272 */ |
269 void SkLOGFONTFromTypeface(const SkTypeface* face, LOGFONT* lf) { | 273 void SkLOGFONTFromTypeface(const SkTypeface* face, LOGFONT* lf) { |
270 if (NULL == face) { | 274 if (NULL == face) { |
271 *lf = get_default_font(); | 275 *lf = get_default_font(); |
272 } else { | 276 } else { |
273 *lf = static_cast<const LogFontTypeface*>(face)->fLogFont; | 277 *lf = static_cast<const LogFontTypeface*>(face)->fLogFont; |
274 } | 278 } |
275 } | 279 } |
276 | 280 |
277 SkFontID SkFontHost::NextLogicalFont(SkFontID currFontID, SkFontID origFontID) { | 281 SkTypeface* SkFontHost::NextLogicalTypeface(SkFontID currFontID, SkFontID origFo
ntID) { |
278 // Zero means that we don't have any fallback fonts for this fontID. | 282 // Zero means that we don't have any fallback fonts for this fontID. |
279 // This function is implemented on Android, but doesn't have much | 283 // This function is implemented on Android, but doesn't have much |
280 // meaning here. | 284 // meaning here. |
281 return 0; | 285 return NULL; |
282 } | 286 } |
283 | 287 |
284 static void ensure_typeface_accessible(SkFontID fontID) { | 288 static void ensure_typeface_accessible(SkFontID fontID) { |
285 LogFontTypeface* face = static_cast<LogFontTypeface*>(SkTypefaceCache::FindB
yID(fontID)); | 289 LogFontTypeface* face = static_cast<LogFontTypeface*>(SkTypefaceCache::FindB
yID(fontID)); |
286 if (face) { | 290 if (face) { |
287 SkFontHost::EnsureTypefaceAccessible(*face); | 291 SkFontHost::EnsureTypefaceAccessible(*face); |
288 } | 292 } |
289 } | 293 } |
290 | 294 |
291 static void GetLogFontByID(SkFontID fontID, LOGFONT* lf) { | 295 static void GetLogFontByID(SkFontID fontID, LOGFONT* lf) { |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 } | 478 } |
475 *srcRBPtr = srcRB; | 479 *srcRBPtr = srcRB; |
476 // offset to the start of the image | 480 // offset to the start of the image |
477 return (const char*)fBits + (fHeight - glyph.fHeight) * srcRB; | 481 return (const char*)fBits + (fHeight - glyph.fHeight) * srcRB; |
478 } | 482 } |
479 | 483 |
480 ////////////////////////////////////////////////////////////////////////////// | 484 ////////////////////////////////////////////////////////////////////////////// |
481 | 485 |
482 class SkScalerContext_Windows : public SkScalerContext { | 486 class SkScalerContext_Windows : public SkScalerContext { |
483 public: | 487 public: |
484 SkScalerContext_Windows(const SkDescriptor* desc); | 488 SkScalerContext_Windows(SkTypeface*, const SkDescriptor* desc); |
485 virtual ~SkScalerContext_Windows(); | 489 virtual ~SkScalerContext_Windows(); |
486 | 490 |
487 protected: | 491 protected: |
488 virtual unsigned generateGlyphCount() SK_OVERRIDE; | 492 virtual unsigned generateGlyphCount() SK_OVERRIDE; |
489 virtual uint16_t generateCharToGlyph(SkUnichar uni) SK_OVERRIDE; | 493 virtual uint16_t generateCharToGlyph(SkUnichar uni) SK_OVERRIDE; |
490 virtual void generateAdvance(SkGlyph* glyph) SK_OVERRIDE; | 494 virtual void generateAdvance(SkGlyph* glyph) SK_OVERRIDE; |
491 virtual void generateMetrics(SkGlyph* glyph) SK_OVERRIDE; | 495 virtual void generateMetrics(SkGlyph* glyph) SK_OVERRIDE; |
492 virtual void generateImage(const SkGlyph& glyph) SK_OVERRIDE; | 496 virtual void generateImage(const SkGlyph& glyph) SK_OVERRIDE; |
493 virtual void generatePath(const SkGlyph& glyph, SkPath* path) SK_OVERRIDE; | 497 virtual void generatePath(const SkGlyph& glyph, SkPath* path) SK_OVERRIDE; |
494 virtual void generateFontMetrics(SkPaint::FontMetrics* mX, | 498 virtual void generateFontMetrics(SkPaint::FontMetrics* mX, |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
542 return CLEARTYPE_QUALITY; | 546 return CLEARTYPE_QUALITY; |
543 default: | 547 default: |
544 if (rec.fFlags & SkScalerContext::kGenA8FromLCD_Flag) { | 548 if (rec.fFlags & SkScalerContext::kGenA8FromLCD_Flag) { |
545 return CLEARTYPE_QUALITY; | 549 return CLEARTYPE_QUALITY; |
546 } else { | 550 } else { |
547 return ANTIALIASED_QUALITY; | 551 return ANTIALIASED_QUALITY; |
548 } | 552 } |
549 } | 553 } |
550 } | 554 } |
551 | 555 |
552 SkScalerContext_Windows::SkScalerContext_Windows(const SkDescriptor* desc) | 556 SkScalerContext_Windows::SkScalerContext_Windows(SkTypeface* typeface, |
553 : SkScalerContext(desc), fDDC(0), fFont(0), fSavefont(0), fSC(0) | 557 const SkDescriptor* desc) |
| 558 : SkScalerContext(typeface, desc), fDDC(0), fFont(0), fSavefont(0), fSC(
0) |
554 , fGlyphCount(-1) { | 559 , fGlyphCount(-1) { |
555 SkAutoMutexAcquire ac(gFTMutex); | 560 SkAutoMutexAcquire ac(gFTMutex); |
556 | 561 |
557 fDDC = ::CreateCompatibleDC(NULL); | 562 fDDC = ::CreateCompatibleDC(NULL); |
558 SetGraphicsMode(fDDC, GM_ADVANCED); | 563 SetGraphicsMode(fDDC, GM_ADVANCED); |
559 SetBkMode(fDDC, TRANSPARENT); | 564 SetBkMode(fDDC, TRANSPARENT); |
560 | 565 |
561 // Scaling by the DPI is inconsistent with how Skia draws elsewhere | 566 // Scaling by the DPI is inconsistent with how Skia draws elsewhere |
562 //SkScalar height = -(fRec.fTextSize * GetDeviceCaps(ddc, LOGPIXELSY) / 72); | 567 //SkScalar height = -(fRec.fTextSize * GetDeviceCaps(ddc, LOGPIXELSY) / 72); |
563 LOGFONT lf; | 568 LOGFONT lf; |
(...skipping 1037 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1601 DeleteObject(font); | 1606 DeleteObject(font); |
1602 DeleteDC(hdc); | 1607 DeleteDC(hdc); |
1603 | 1608 |
1604 return stream; | 1609 return stream; |
1605 } | 1610 } |
1606 | 1611 |
1607 size_t SkFontHost::GetFileName(SkFontID fontID, char path[], size_t length, int3
2_t* index) { | 1612 size_t SkFontHost::GetFileName(SkFontID fontID, char path[], size_t length, int3
2_t* index) { |
1608 return 0; | 1613 return 0; |
1609 } | 1614 } |
1610 | 1615 |
1611 SkScalerContext* SkFontHost::CreateScalerContext(const SkDescriptor* desc) { | 1616 SkScalerContext* LogFontTypeface::onCreateScalerContext(const SkDescriptor* desc
) const { |
1612 return SkNEW_ARGS(SkScalerContext_Windows, (desc)); | 1617 return SkNEW_ARGS(SkScalerContext_Windows, (const_cast<LogFontTypeface*>(thi
s), desc)); |
1613 } | 1618 } |
1614 | 1619 |
1615 /** Return the closest matching typeface given either an existing family | 1620 /** Return the closest matching typeface given either an existing family |
1616 (specified by a typeface in that family) or by a familyName, and a | 1621 (specified by a typeface in that family) or by a familyName, and a |
1617 requested style. | 1622 requested style. |
1618 1) If familyFace is null, use familyName. | 1623 1) If familyFace is null, use familyName. |
1619 2) If familyName is null, use familyFace. | 1624 2) If familyName is null, use familyFace. |
1620 3) If both are null, return the default font that best matches style | 1625 3) If both are null, return the default font that best matches style |
1621 This MUST not return NULL. | 1626 This MUST not return NULL. |
1622 */ | 1627 */ |
(...skipping 12 matching lines...) Expand all Loading... |
1635 } | 1640 } |
1636 setStyle(&lf, style); | 1641 setStyle(&lf, style); |
1637 return SkCreateTypefaceFromLOGFONT(lf); | 1642 return SkCreateTypefaceFromLOGFONT(lf); |
1638 } | 1643 } |
1639 | 1644 |
1640 SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) { | 1645 SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) { |
1641 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path)); | 1646 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path)); |
1642 return stream.get() ? CreateTypefaceFromStream(stream) : NULL; | 1647 return stream.get() ? CreateTypefaceFromStream(stream) : NULL; |
1643 } | 1648 } |
1644 | 1649 |
1645 void SkFontHost::FilterRec(SkScalerContext::Rec* rec, SkTypeface* typeface) { | 1650 void LogFontTypeface::onFilterRec(SkScalerContextRec* rec) const { |
1646 unsigned flagsWeDontSupport = SkScalerContext::kDevKernText_Flag | | 1651 unsigned flagsWeDontSupport = SkScalerContext::kDevKernText_Flag | |
1647 SkScalerContext::kAutohinting_Flag | | 1652 SkScalerContext::kAutohinting_Flag | |
1648 SkScalerContext::kEmbeddedBitmapText_Flag | | 1653 SkScalerContext::kEmbeddedBitmapText_Flag | |
1649 SkScalerContext::kEmbolden_Flag | | 1654 SkScalerContext::kEmbolden_Flag | |
1650 SkScalerContext::kSubpixelPositioning_Flag | | 1655 SkScalerContext::kSubpixelPositioning_Flag | |
1651 SkScalerContext::kLCD_BGROrder_Flag | | 1656 SkScalerContext::kLCD_BGROrder_Flag | |
1652 SkScalerContext::kLCD_Vertical_Flag; | 1657 SkScalerContext::kLCD_Vertical_Flag; |
1653 rec->fFlags &= ~flagsWeDontSupport; | 1658 rec->fFlags &= ~flagsWeDontSupport; |
1654 | 1659 |
1655 SkPaint::Hinting h = rec->getHinting(); | 1660 SkPaint::Hinting h = rec->getHinting(); |
(...skipping 19 matching lines...) Expand all Loading... |
1675 rec->setHinting(h); | 1680 rec->setHinting(h); |
1676 | 1681 |
1677 // turn this off since GDI might turn A8 into BW! Need a bigger fix. | 1682 // turn this off since GDI might turn A8 into BW! Need a bigger fix. |
1678 #if 0 | 1683 #if 0 |
1679 // Disable LCD when rotated, since GDI's output is ugly | 1684 // Disable LCD when rotated, since GDI's output is ugly |
1680 if (isLCD(*rec) && !isAxisAligned(*rec)) { | 1685 if (isLCD(*rec) && !isAxisAligned(*rec)) { |
1681 rec->fMaskFormat = SkMask::kA8_Format; | 1686 rec->fMaskFormat = SkMask::kA8_Format; |
1682 } | 1687 } |
1683 #endif | 1688 #endif |
1684 | 1689 |
1685 LogFontTypeface* logfontTypeface = static_cast<LogFontTypeface*>(typeface); | 1690 if (!fCanBeLCD && isLCD(*rec)) { |
1686 if (!logfontTypeface->fCanBeLCD && isLCD(*rec)) { | |
1687 rec->fMaskFormat = SkMask::kA8_Format; | 1691 rec->fMaskFormat = SkMask::kA8_Format; |
1688 rec->fFlags &= ~SkScalerContext::kGenA8FromLCD_Flag; | 1692 rec->fFlags &= ~SkScalerContext::kGenA8FromLCD_Flag; |
1689 } | 1693 } |
1690 } | 1694 } |
OLD | NEW |