Commit 8cc1e116 authored by eae@chromium.org's avatar eae@chromium.org

[DirectWrite] Disable subpixel font positioning for certain fonts/sizes

Conditionally disable subpixel text for certain older fonts at sizes
below 16px in order to improve legibility and rendering quality. This is
limited to a specific set of fonts and does not apply to webfonts.
This list of fonts in question includes all fonts in the "Microsoft Core
fonts for the Web" collection.

Specifically the following fonts: arial, courier new, times new roman,
andale mono, comic sans, impact, georgia, trebuchet, verdana, webdings,
tahoma, and lucida console.

R=cpu@chromium.org, scottmg@chromium.org
BUG=405445,395425

Review URL: https://codereview.chromium.org/544843004

git-svn-id: svn://svn.chromium.org/blink/trunk@181492 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 17c8e564
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
src: url('../../../resources/opensans/OpenSans-Regular.woff') format('woff'); src: url('../../../resources/opensans/OpenSans-Regular.woff') format('woff');
} }
section > div > div { section > div > div {
font-family: 'Open Sans'; font-family: 'Open Sans', 'Segoe UI';
} }
</style> </style>
<script src="resources/text-scaling.js"></script> <script src="resources/text-scaling.js"></script>
......
...@@ -46,6 +46,7 @@ FontPlatformData::FontPlatformData(WTF::HashTableDeletedValueType) ...@@ -46,6 +46,7 @@ FontPlatformData::FontPlatformData(WTF::HashTableDeletedValueType)
#if OS(WIN) #if OS(WIN)
, m_paintTextFlags(0) , m_paintTextFlags(0)
, m_minSizeForAntiAlias(0) , m_minSizeForAntiAlias(0)
, m_minSizeForSubpixel(0)
, m_useSubpixelPositioning(false) , m_useSubpixelPositioning(false)
#endif #endif
{ {
...@@ -60,6 +61,7 @@ FontPlatformData::FontPlatformData() ...@@ -60,6 +61,7 @@ FontPlatformData::FontPlatformData()
#if OS(WIN) #if OS(WIN)
, m_paintTextFlags(0) , m_paintTextFlags(0)
, m_minSizeForAntiAlias(0) , m_minSizeForAntiAlias(0)
, m_minSizeForSubpixel(0)
, m_useSubpixelPositioning(false) , m_useSubpixelPositioning(false)
#endif #endif
{ {
...@@ -74,6 +76,7 @@ FontPlatformData::FontPlatformData(float textSize, bool syntheticBold, bool synt ...@@ -74,6 +76,7 @@ FontPlatformData::FontPlatformData(float textSize, bool syntheticBold, bool synt
#if OS(WIN) #if OS(WIN)
, m_paintTextFlags(0) , m_paintTextFlags(0)
, m_minSizeForAntiAlias(0) , m_minSizeForAntiAlias(0)
, m_minSizeForSubpixel(0)
, m_useSubpixelPositioning(false) , m_useSubpixelPositioning(false)
#endif #endif
{ {
...@@ -94,6 +97,7 @@ FontPlatformData::FontPlatformData(const FontPlatformData& src) ...@@ -94,6 +97,7 @@ FontPlatformData::FontPlatformData(const FontPlatformData& src)
#if OS(WIN) #if OS(WIN)
, m_paintTextFlags(src.m_paintTextFlags) , m_paintTextFlags(src.m_paintTextFlags)
, m_minSizeForAntiAlias(src.m_minSizeForAntiAlias) , m_minSizeForAntiAlias(src.m_minSizeForAntiAlias)
, m_minSizeForSubpixel(src.m_minSizeForSubpixel)
, m_useSubpixelPositioning(src.m_useSubpixelPositioning) , m_useSubpixelPositioning(src.m_useSubpixelPositioning)
#endif #endif
{ {
...@@ -112,6 +116,7 @@ FontPlatformData::FontPlatformData(PassRefPtr<SkTypeface> tf, const char* family ...@@ -112,6 +116,7 @@ FontPlatformData::FontPlatformData(PassRefPtr<SkTypeface> tf, const char* family
#if OS(WIN) #if OS(WIN)
, m_paintTextFlags(0) , m_paintTextFlags(0)
, m_minSizeForAntiAlias(0) , m_minSizeForAntiAlias(0)
, m_minSizeForSubpixel(0)
, m_useSubpixelPositioning(subpixelTextPosition) , m_useSubpixelPositioning(subpixelTextPosition)
#endif #endif
{ {
...@@ -132,6 +137,7 @@ FontPlatformData::FontPlatformData(const FontPlatformData& src, float textSize) ...@@ -132,6 +137,7 @@ FontPlatformData::FontPlatformData(const FontPlatformData& src, float textSize)
#if OS(WIN) #if OS(WIN)
, m_paintTextFlags(src.m_paintTextFlags) , m_paintTextFlags(src.m_paintTextFlags)
, m_minSizeForAntiAlias(src.m_minSizeForAntiAlias) , m_minSizeForAntiAlias(src.m_minSizeForAntiAlias)
, m_minSizeForSubpixel(src.m_minSizeForSubpixel)
, m_useSubpixelPositioning(src.m_useSubpixelPositioning) , m_useSubpixelPositioning(src.m_useSubpixelPositioning)
#endif #endif
{ {
...@@ -157,6 +163,7 @@ FontPlatformData& FontPlatformData::operator=(const FontPlatformData& src) ...@@ -157,6 +163,7 @@ FontPlatformData& FontPlatformData::operator=(const FontPlatformData& src)
#if OS(WIN) #if OS(WIN)
m_paintTextFlags = 0; m_paintTextFlags = 0;
m_minSizeForAntiAlias = src.m_minSizeForAntiAlias; m_minSizeForAntiAlias = src.m_minSizeForAntiAlias;
m_minSizeForSubpixel = src.m_minSizeForSubpixel;
m_useSubpixelPositioning = src.m_useSubpixelPositioning; m_useSubpixelPositioning = src.m_useSubpixelPositioning;
#endif #endif
......
...@@ -85,6 +85,8 @@ public: ...@@ -85,6 +85,8 @@ public:
#if OS(WIN) #if OS(WIN)
void setMinSizeForAntiAlias(unsigned size) { m_minSizeForAntiAlias = size; } void setMinSizeForAntiAlias(unsigned size) { m_minSizeForAntiAlias = size; }
unsigned minSizeForAntiAlias() const { return m_minSizeForAntiAlias; } unsigned minSizeForAntiAlias() const { return m_minSizeForAntiAlias; }
void setMinSizeForSubpixel(float size) { m_minSizeForSubpixel = size; }
float minSizeForSubpixel() const { return m_minSizeForSubpixel; }
void setHinting(SkPaint::Hinting style) void setHinting(SkPaint::Hinting style)
{ {
m_style.useAutoHint = 0; m_style.useAutoHint = 0;
...@@ -135,6 +137,7 @@ private: ...@@ -135,6 +137,7 @@ private:
int m_paintTextFlags; int m_paintTextFlags;
bool m_useSubpixelPositioning; bool m_useSubpixelPositioning;
unsigned m_minSizeForAntiAlias; unsigned m_minSizeForAntiAlias;
float m_minSizeForSubpixel;
#endif #endif
}; };
......
...@@ -248,6 +248,33 @@ FontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontD ...@@ -248,6 +248,33 @@ FontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontD
} }
} }
// List of fonts that look bad with subpixel text rendering at smaller font
// sizes. This includes all fonts in the Microsoft Core fonts for the Web
// collection.
const static wchar_t* noSubpixelForSmallSizeFont[] = {
L"andale mono",
L"arial",
L"comic sans",
L"courier new",
L"georgia",
L"impact",
L"lucida console",
L"tahoma",
L"times new roman",
L"trebuchet ms",
L"verdana",
L"webdings"
};
const static float minSizeForSubpixelForFont = 16.0f;
numFonts = WTF_ARRAY_LENGTH(noSubpixelForSmallSizeFont);
for (size_t i = 0; i < numFonts; i++) {
const wchar_t* family = noSubpixelForSmallSizeFont[i];
if (typefacesMatchesFamily(tf.get(), family)) {
result->setMinSizeForSubpixel(minSizeForSubpixelForFont);
break;
}
}
return result; return result;
} }
......
...@@ -69,7 +69,7 @@ void FontPlatformData::setupPaint(SkPaint* paint, GraphicsContext* context) cons ...@@ -69,7 +69,7 @@ void FontPlatformData::setupPaint(SkPaint* paint, GraphicsContext* context) cons
// run without font smoothing we enable it for tests to ensure we get // run without font smoothing we enable it for tests to ensure we get
// good test coverage matching the more common smoothing enabled // good test coverage matching the more common smoothing enabled
// behavior. // behavior.
if (m_useSubpixelPositioning if (m_useSubpixelPositioning && ts >= m_minSizeForSubpixel
&& ((textFlags & SkPaint::kAntiAlias_Flag) || LayoutTestSupport::isRunningLayoutTest())) && ((textFlags & SkPaint::kAntiAlias_Flag) || LayoutTestSupport::isRunningLayoutTest()))
flags |= SkPaint::kSubpixelText_Flag; flags |= SkPaint::kSubpixelText_Flag;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment