aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar bungeman@google.com <bungeman@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-10-12 18:48:35 +0000
committerGravatar bungeman@google.com <bungeman@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-10-12 18:48:35 +0000
commitcb1bbb375aa4fdd099dc60302ca1712f04607782 (patch)
tree1f02fcf98c4403e81804d63f026ed3692fc50891 /src
parent9a4c746a1f0f91a5be2708a4c2018dfe14f62e48 (diff)
Fonts with cubic outlines are rendered without ClearType by GDI.
Diffstat (limited to 'src')
-rw-r--r--src/core/SkPaint.cpp8
-rw-r--r--src/core/SkTypeface.cpp4
-rw-r--r--src/ports/SkFontHost_FreeType.cpp2
-rw-r--r--src/ports/SkFontHost_mac_atsui.cpp2
-rw-r--r--src/ports/SkFontHost_mac_coretext.cpp2
-rw-r--r--src/ports/SkFontHost_none.cpp2
-rwxr-xr-xsrc/ports/SkFontHost_win.cpp45
-rw-r--r--src/ports/SkFontHost_win_dw.cpp2
-rwxr-xr-xsrc/utils/ios/SkFontHost_iOS.mm2
9 files changed, 50 insertions, 19 deletions
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp
index 58a8c1c407..c517663945 100644
--- a/src/core/SkPaint.cpp
+++ b/src/core/SkPaint.cpp
@@ -1505,7 +1505,11 @@ void SkScalerContext::MakeRec(const SkPaint& paint,
const SkMatrix* deviceMatrix, Rec* rec) {
SkASSERT(deviceMatrix == NULL || !deviceMatrix->hasPerspective());
- rec->fOrigFontID = SkTypeface::UniqueID(paint.getTypeface());
+ SkTypeface* typeface = paint.getTypeface();
+ if (NULL == typeface) {
+ typeface = SkTypeface::GetDefaultTypeface();
+ }
+ rec->fOrigFontID = typeface->uniqueID();
rec->fFontID = rec->fOrigFontID;
rec->fTextSize = paint.getTextSize();
rec->fPreScaleX = paint.getTextScaleX();
@@ -1622,7 +1626,7 @@ void SkScalerContext::MakeRec(const SkPaint& paint,
they can modify our rec up front, so we don't create duplicate cache
entries.
*/
- SkFontHost::FilterRec(rec);
+ SkFontHost::FilterRec(rec, typeface);
// be sure to call PostMakeRec(rec) before you actually use it!
}
diff --git a/src/core/SkTypeface.cpp b/src/core/SkTypeface.cpp
index 3a40e0130b..94bb237b84 100644
--- a/src/core/SkTypeface.cpp
+++ b/src/core/SkTypeface.cpp
@@ -36,7 +36,7 @@ SkTypeface::~SkTypeface() {
///////////////////////////////////////////////////////////////////////////////
-static SkTypeface* get_default_typeface() {
+SkTypeface* SkTypeface::GetDefaultTypeface() {
// we keep a reference to this guy for all time, since if we return its
// fontID, the font cache may later on ask to resolve that back into a
// typeface object.
@@ -51,7 +51,7 @@ static SkTypeface* get_default_typeface() {
uint32_t SkTypeface::UniqueID(const SkTypeface* face) {
if (NULL == face) {
- face = get_default_typeface();
+ face = GetDefaultTypeface();
}
return face->uniqueID();
}
diff --git a/src/ports/SkFontHost_FreeType.cpp b/src/ports/SkFontHost_FreeType.cpp
index 5d351331cf..ce8f409731 100644
--- a/src/ports/SkFontHost_FreeType.cpp
+++ b/src/ports/SkFontHost_FreeType.cpp
@@ -637,7 +637,7 @@ static bool isAxisAligned(const SkScalerContext::Rec& rec) {
bothZero(rec.fPost2x2[0][0], rec.fPost2x2[1][1]));
}
-void SkFontHost::FilterRec(SkScalerContext::Rec* rec) {
+void SkFontHost::FilterRec(SkScalerContext::Rec* rec, SkTypeface*) {
//BOGUS: http://code.google.com/p/chromium/issues/detail?id=121119
//Cap the requested size as larger sizes give bogus values.
//Remove when http://code.google.com/p/skia/issues/detail?id=554 is fixed.
diff --git a/src/ports/SkFontHost_mac_atsui.cpp b/src/ports/SkFontHost_mac_atsui.cpp
index f8251ab0bb..84f7f0b224 100644
--- a/src/ports/SkFontHost_mac_atsui.cpp
+++ b/src/ports/SkFontHost_mac_atsui.cpp
@@ -97,7 +97,7 @@ private:
static OSStatus Close(void *cb);
};
-void SkFontHost::FilterRec(SkScalerContext::Rec* rec) {
+void SkFontHost::FilterRec(SkScalerContext::Rec* rec, SkTypeface*) {
// we only support 2 levels of hinting
SkPaint::Hinting h = rec->getHinting();
if (SkPaint::kSlight_Hinting == h) {
diff --git a/src/ports/SkFontHost_mac_coretext.cpp b/src/ports/SkFontHost_mac_coretext.cpp
index 622b8ede1f..e385337388 100644
--- a/src/ports/SkFontHost_mac_coretext.cpp
+++ b/src/ports/SkFontHost_mac_coretext.cpp
@@ -1811,7 +1811,7 @@ SkFontID SkFontHost::NextLogicalFont(SkFontID currFontID, SkFontID origFontID) {
return nextFontID;
}
-void SkFontHost::FilterRec(SkScalerContext::Rec* rec) {
+void SkFontHost::FilterRec(SkScalerContext::Rec* rec, SkTypeface*) {
unsigned flagsWeDontSupport = SkScalerContext::kDevKernText_Flag |
SkScalerContext::kAutohinting_Flag;
diff --git a/src/ports/SkFontHost_none.cpp b/src/ports/SkFontHost_none.cpp
index a68391915c..21eda8e1b8 100644
--- a/src/ports/SkFontHost_none.cpp
+++ b/src/ports/SkFontHost_none.cpp
@@ -37,7 +37,7 @@ SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics(
return NULL;
}
-void SkFontHost::FilterRec(SkScalerContext::Rec* rec) {
+void SkFontHost::FilterRec(SkScalerContext::Rec* rec, SkTypeface*) {
}
///////////////////////////////////////////////////////////////////////////////
diff --git a/src/ports/SkFontHost_win.cpp b/src/ports/SkFontHost_win.cpp
index 015df7835b..f2603e99a8 100755
--- a/src/ports/SkFontHost_win.cpp
+++ b/src/ports/SkFontHost_win.cpp
@@ -210,11 +210,39 @@ static unsigned calculateOutlineGlyphCount(HDC hdc) {
class LogFontTypeface : public SkTypeface {
public:
- LogFontTypeface(SkTypeface::Style style, SkFontID fontID, const LOGFONT& lf) :
- SkTypeface(style, fontID, false), fLogFont(lf), fSerializeAsStream(false) {}
+ LogFontTypeface(SkTypeface::Style style, SkFontID fontID, const LOGFONT& lf, bool serializeAsStream = false) :
+ SkTypeface(style, fontID, false), fLogFont(lf), fSerializeAsStream(serializeAsStream) {
+
+ // If the font has cubic outlines, it will not be rendered with ClearType.
+ HFONT font = CreateFontIndirect(&lf);
+
+ HDC deviceContext = ::CreateCompatibleDC(NULL);
+ HFONT savefont = (HFONT)SelectObject(deviceContext, font);
+
+ TEXTMETRIC textMetric;
+ if (0 == GetTextMetrics(deviceContext, &textMetric)) {
+ SkFontHost::EnsureTypefaceAccessible(*this);
+ if (0 == GetTextMetrics(deviceContext, &textMetric)) {
+ textMetric.tmPitchAndFamily = TMPF_TRUETYPE;
+ }
+ }
+ if (deviceContext) {
+ ::SelectObject(deviceContext, savefont);
+ ::DeleteDC(deviceContext);
+ }
+ if (font) {
+ ::DeleteObject(font);
+ }
+
+ // Used a logfont on a memory context, should never get a device font.
+ // Therefore all TMPF_DEVICE will be PostScript (cubic) fonts.
+ fCanBeLCD = !((textMetric.tmPitchAndFamily & TMPF_VECTOR) &&
+ (textMetric.tmPitchAndFamily & TMPF_DEVICE));
+ }
LOGFONT fLogFont;
bool fSerializeAsStream;
+ bool fCanBeLCD;
static LogFontTypeface* Create(const LOGFONT& lf) {
SkTypeface::Style style = get_style(lf);
@@ -229,8 +257,7 @@ public:
* Takes ownership of fontMemResource.
*/
FontMemResourceTypeface(SkTypeface::Style style, SkFontID fontID, const LOGFONT& lf, HANDLE fontMemResource) :
- LogFontTypeface(style, fontID, lf), fFontMemResource(fontMemResource) {
- fSerializeAsStream = true;
+ LogFontTypeface(style, fontID, lf, true), fFontMemResource(fontMemResource) {
}
HANDLE fFontMemResource;
@@ -1673,7 +1700,7 @@ SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) {
return face;
}
-void SkFontHost::FilterRec(SkScalerContext::Rec* rec) {
+void SkFontHost::FilterRec(SkScalerContext::Rec* rec, SkTypeface* typeface) {
unsigned flagsWeDontSupport = SkScalerContext::kDevKernText_Flag |
SkScalerContext::kAutohinting_Flag |
SkScalerContext::kEmbeddedBitmapText_Flag |
@@ -1713,9 +1740,9 @@ void SkFontHost::FilterRec(SkScalerContext::Rec* rec) {
}
#endif
-#if 0
- if (SkMask::kLCD16_Format == rec->fMaskFormat) {
- rec->fMaskFormat = SkMask::kLCD32_Format;
+ LogFontTypeface* logfontTypeface = static_cast<LogFontTypeface*>(typeface);
+ if (!logfontTypeface->fCanBeLCD && isLCD(*rec)) {
+ rec->fMaskFormat = SkMask::kA8_Format;
+ rec->fFlags &= ~SkScalerContext::kGenA8FromLCD_Flag;
}
-#endif
}
diff --git a/src/ports/SkFontHost_win_dw.cpp b/src/ports/SkFontHost_win_dw.cpp
index d91cfa9b02..82d44eeb33 100644
--- a/src/ports/SkFontHost_win_dw.cpp
+++ b/src/ports/SkFontHost_win_dw.cpp
@@ -1264,7 +1264,7 @@ SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) {
return NULL;
}
-void SkFontHost::FilterRec(SkScalerContext::Rec* rec) {
+void SkFontHost::FilterRec(SkScalerContext::Rec* rec, SkTypeface*) {
unsigned flagsWeDontSupport = SkScalerContext::kDevKernText_Flag |
SkScalerContext::kAutohinting_Flag |
SkScalerContext::kEmbeddedBitmapText_Flag |
diff --git a/src/utils/ios/SkFontHost_iOS.mm b/src/utils/ios/SkFontHost_iOS.mm
index b74b29f1f8..60f111c84e 100755
--- a/src/utils/ios/SkFontHost_iOS.mm
+++ b/src/utils/ios/SkFontHost_iOS.mm
@@ -253,7 +253,7 @@ SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics(
return NULL;
}
-void SkFontHost::FilterRec(SkScalerContext::Rec* rec) {
+void SkFontHost::FilterRec(SkScalerContext::Rec* rec, SkTypeface*) {
}
SkScalerContext* SkFontHost::CreateScalerContext(const SkDescriptor* desc) {