| Index: Source/core/platform/graphics/win/FontPlatformDataWin.cpp
|
| diff --git a/Source/core/platform/graphics/win/FontPlatformDataWin.cpp b/Source/core/platform/graphics/win/FontPlatformDataWin.cpp
|
| deleted file mode 100644
|
| index a9988ba0c3bb8254285cfaf8896e6fbce087af05..0000000000000000000000000000000000000000
|
| --- a/Source/core/platform/graphics/win/FontPlatformDataWin.cpp
|
| +++ /dev/null
|
| @@ -1,439 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2006, 2007 Apple Computer, Inc.
|
| - * Copyright (c) 2006, 2007, 2008, 2009, 2012 Google Inc. All rights reserved.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions are
|
| - * met:
|
| - *
|
| - * * Redistributions of source code must retain the above copyright
|
| - * notice, this list of conditions and the following disclaimer.
|
| - * * Redistributions in binary form must reproduce the above
|
| - * copyright notice, this list of conditions and the following disclaimer
|
| - * in the documentation and/or other materials provided with the
|
| - * distribution.
|
| - * * Neither the name of Google Inc. nor the names of its
|
| - * contributors may be used to endorse or promote products derived from
|
| - * this software without specific prior written permission.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| - */
|
| -
|
| -#include "config.h"
|
| -#include "core/platform/graphics/FontPlatformData.h"
|
| -
|
| -#include "core/platform/graphics/FontCache.h"
|
| -#include "core/platform/graphics/GraphicsContext.h"
|
| -#if USE(HARFBUZZ)
|
| -#include "core/platform/graphics/harfbuzz/HarfBuzzFace.h"
|
| -#endif
|
| -#include "core/platform/graphics/skia/SkiaFontWin.h"
|
| -#include "platform/LayoutTestSupport.h"
|
| -#include "platform/win/HWndDC.h"
|
| -#include "public/platform/Platform.h"
|
| -#include "public/platform/win/WebSandboxSupport.h"
|
| -#include "wtf/PassOwnPtr.h"
|
| -#include "wtf/StdLibExtras.h"
|
| -#include <mlang.h>
|
| -#include <objidl.h>
|
| -#include <windows.h>
|
| -
|
| -namespace WebCore {
|
| -
|
| -void FontPlatformData::setupPaint(SkPaint* paint, GraphicsContext* context) const
|
| -{
|
| - const float ts = m_textSize >= 0 ? m_textSize : 12;
|
| - paint->setTextSize(SkFloatToScalar(m_textSize));
|
| - paint->setTypeface(typeface());
|
| - paint->setFakeBoldText(m_fakeBold);
|
| - paint->setTextSkewX(m_fakeItalic ? -SK_Scalar1 / 4 : 0);
|
| - paint->setSubpixelText(m_useSubpixelPositioning);
|
| -
|
| - int textFlags = paintTextFlags();
|
| - // Only set painting flags when we're actually painting.
|
| - if (context && !context->couldUseLCDRenderedText()) {
|
| - textFlags &= ~SkPaint::kLCDRenderText_Flag;
|
| - // If we *just* clear our request for LCD, then GDI seems to
|
| - // sometimes give us AA text, and sometimes give us BW text. Since the
|
| - // original intent was LCD, we want to force AA (rather than BW), so we
|
| - // add a special bit to tell Skia to do its best to avoid the BW: by
|
| - // drawing LCD offscreen and downsampling that to AA.
|
| - textFlags |= SkPaint::kGenA8FromLCD_Flag;
|
| - }
|
| -
|
| - static const uint32_t textFlagsMask = SkPaint::kAntiAlias_Flag |
|
| - SkPaint::kLCDRenderText_Flag |
|
| - SkPaint::kGenA8FromLCD_Flag;
|
| -
|
| - SkASSERT(!(textFlags & ~textFlagsMask));
|
| - uint32_t flags = paint->getFlags();
|
| - flags &= ~textFlagsMask;
|
| - flags |= textFlags;
|
| - paint->setFlags(flags);
|
| -}
|
| -
|
| -// Lookup the current system settings for font smoothing.
|
| -// We cache these values for performance, but if the browser has a way to be
|
| -// notified when these change, we could re-query them at that time.
|
| -static uint32_t getDefaultGDITextFlags()
|
| -{
|
| - static bool gInited;
|
| - static uint32_t gFlags;
|
| - if (!gInited) {
|
| - BOOL enabled;
|
| - gFlags = 0;
|
| - if (SystemParametersInfo(SPI_GETFONTSMOOTHING, 0, &enabled, 0) && enabled) {
|
| - gFlags |= SkPaint::kAntiAlias_Flag;
|
| -
|
| - UINT smoothType;
|
| - if (SystemParametersInfo(SPI_GETFONTSMOOTHINGTYPE, 0, &smoothType, 0)) {
|
| - if (FE_FONTSMOOTHINGCLEARTYPE == smoothType)
|
| - gFlags |= SkPaint::kLCDRenderText_Flag;
|
| - }
|
| - }
|
| - gInited = true;
|
| - }
|
| - return gFlags;
|
| -}
|
| -
|
| -static bool isWebFont(const LOGFONT& lf)
|
| -{
|
| - // web-fonts have artifical names constructed to always be
|
| - // 1. 24 characters, followed by a '\0'
|
| - // 2. the last two characters are '=='
|
| - return '=' == lf.lfFaceName[22] && '=' == lf.lfFaceName[23] && '\0' == lf.lfFaceName[24];
|
| -}
|
| -
|
| -static int computePaintTextFlags(const LOGFONT& lf)
|
| -{
|
| - int textFlags = 0;
|
| - switch (lf.lfQuality) {
|
| - case NONANTIALIASED_QUALITY:
|
| - textFlags = 0;
|
| - break;
|
| - case ANTIALIASED_QUALITY:
|
| - textFlags = SkPaint::kAntiAlias_Flag;
|
| - break;
|
| - case CLEARTYPE_QUALITY:
|
| - textFlags = (SkPaint::kAntiAlias_Flag | SkPaint::kLCDRenderText_Flag);
|
| - break;
|
| - default:
|
| - textFlags = getDefaultGDITextFlags();
|
| - break;
|
| - }
|
| -
|
| - // only allow features that SystemParametersInfo allows
|
| - textFlags &= getDefaultGDITextFlags();
|
| -
|
| - /*
|
| - * FontPlatformData(...) will read our logfont, and try to honor the the lfQuality
|
| - * setting (computing the corresponding SkPaint flags for AA and LCD). However, it
|
| - * will limit the quality based on its query of SPI_GETFONTSMOOTHING. This could mean
|
| - * we end up drawing the text in BW, even though our lfQuality requested antialiasing.
|
| - *
|
| - * Many web-fonts are so poorly hinted that they are terrible to read when drawn in BW.
|
| - * In these cases, we have decided to FORCE these fonts to be drawn with at least grayscale AA,
|
| - * even when the System (getDefaultGDITextFlags) tells us to draw only in BW.
|
| - */
|
| - if (isWebFont(lf) && !isRunningLayoutTest())
|
| - textFlags |= SkPaint::kAntiAlias_Flag;
|
| - return textFlags;
|
| -}
|
| -
|
| -#if !USE(HARFBUZZ)
|
| -PassRefPtr<SkTypeface> CreateTypefaceFromHFont(HFONT hfont, int* size, int* paintTextFlags)
|
| -{
|
| - LOGFONT info;
|
| - GetObject(hfont, sizeof(info), &info);
|
| - if (size) {
|
| - int height = info.lfHeight;
|
| - if (height < 0)
|
| - height = -height;
|
| - *size = height;
|
| - }
|
| - if (paintTextFlags)
|
| - *paintTextFlags = computePaintTextFlags(info);
|
| - return adoptRef(SkCreateTypefaceFromLOGFONT(info));
|
| -}
|
| -#endif
|
| -
|
| -FontPlatformData::FontPlatformData(WTF::HashTableDeletedValueType)
|
| - : m_textSize(-1)
|
| - , m_fakeBold(false)
|
| - , m_fakeItalic(false)
|
| - , m_orientation(Horizontal)
|
| - , m_typeface(adoptRef(SkTypeface::RefDefault()))
|
| - , m_paintTextFlags(0)
|
| - , m_isHashTableDeletedValue(true)
|
| - , m_useSubpixelPositioning(false)
|
| -{
|
| -#if !USE(HARFBUZZ)
|
| - m_font = 0;
|
| - m_scriptCache = 0;
|
| -#endif
|
| -}
|
| -
|
| -FontPlatformData::FontPlatformData()
|
| - : m_textSize(0)
|
| - , m_fakeBold(false)
|
| - , m_fakeItalic(false)
|
| - , m_orientation(Horizontal)
|
| - , m_typeface(adoptRef(SkTypeface::RefDefault()))
|
| - , m_paintTextFlags(0)
|
| - , m_isHashTableDeletedValue(false)
|
| - , m_useSubpixelPositioning(false)
|
| -{
|
| -#if !USE(HARFBUZZ)
|
| - m_font = 0;
|
| - m_scriptCache = 0;
|
| -#endif
|
| -}
|
| -
|
| -#if ENABLE(GDI_FONTS_ON_WINDOWS) && !USE(HARFBUZZ)
|
| -FontPlatformData::FontPlatformData(HFONT font, float size, FontOrientation orientation)
|
| - : m_font(RefCountedHFONT::create(font))
|
| - , m_textSize(size)
|
| - , m_fakeBold(false)
|
| - , m_fakeItalic(false)
|
| - , m_orientation(orientation)
|
| - , m_scriptCache(0)
|
| - , m_typeface(CreateTypefaceFromHFont(font, 0, &m_paintTextFlags))
|
| - , m_isHashTableDeletedValue(false)
|
| - , m_useSubpixelPositioning(false)
|
| -{
|
| -}
|
| -#endif
|
| -
|
| -// FIXME: this constructor is needed for SVG fonts but doesn't seem to do much
|
| -FontPlatformData::FontPlatformData(float size, bool bold, bool oblique)
|
| - : m_textSize(size)
|
| - , m_fakeBold(false)
|
| - , m_fakeItalic(false)
|
| - , m_orientation(Horizontal)
|
| - , m_typeface(adoptRef(SkTypeface::RefDefault()))
|
| - , m_paintTextFlags(0)
|
| - , m_isHashTableDeletedValue(false)
|
| - , m_useSubpixelPositioning(false)
|
| -{
|
| -#if !USE(HARFBUZZ)
|
| - m_font = 0;
|
| - m_scriptCache = 0;
|
| -#endif
|
| -}
|
| -
|
| -FontPlatformData::FontPlatformData(const FontPlatformData& data)
|
| - : m_textSize(data.m_textSize)
|
| - , m_fakeBold(data.m_fakeBold)
|
| - , m_fakeItalic(data.m_fakeItalic)
|
| - , m_orientation(data.m_orientation)
|
| - , m_typeface(data.m_typeface)
|
| - , m_paintTextFlags(data.m_paintTextFlags)
|
| - , m_isHashTableDeletedValue(false)
|
| - , m_useSubpixelPositioning(data.m_useSubpixelPositioning)
|
| -{
|
| -#if !USE(HARFBUZZ)
|
| - m_font = data.m_font;
|
| - m_scriptCache = 0;
|
| -#endif
|
| -}
|
| -
|
| -FontPlatformData::FontPlatformData(const FontPlatformData& data, float textSize)
|
| - : m_textSize(textSize)
|
| - , m_fakeBold(data.m_fakeBold)
|
| - , m_fakeItalic(data.m_fakeItalic)
|
| - , m_orientation(data.m_orientation)
|
| - , m_typeface(data.m_typeface)
|
| - , m_paintTextFlags(data.m_paintTextFlags)
|
| - , m_isHashTableDeletedValue(false)
|
| - , m_useSubpixelPositioning(data.m_useSubpixelPositioning)
|
| -{
|
| -#if !USE(HARFBUZZ)
|
| - m_font = data.m_font;
|
| - m_scriptCache = 0;
|
| -#endif
|
| -}
|
| -
|
| -FontPlatformData::FontPlatformData(PassRefPtr<SkTypeface> tf, const char* family,
|
| - float textSize, bool fakeBold, bool fakeItalic, FontOrientation orientation,
|
| - bool useSubpixelPositioning)
|
| - : m_textSize(textSize)
|
| - , m_fakeBold(fakeBold)
|
| - , m_fakeItalic(fakeItalic)
|
| - , m_orientation(orientation)
|
| - , m_typeface(tf)
|
| - , m_isHashTableDeletedValue(false)
|
| - , m_useSubpixelPositioning(useSubpixelPositioning)
|
| -{
|
| - // FIXME: This can be removed together with m_font once the last few
|
| - // uses of hfont() has been eliminated.
|
| - LOGFONT logFont;
|
| - SkLOGFONTFromTypeface(m_typeface.get(), &logFont);
|
| - logFont.lfHeight = -textSize;
|
| - m_paintTextFlags = computePaintTextFlags(logFont);
|
| -
|
| -#if !USE(HARFBUZZ)
|
| - HFONT hFont = CreateFontIndirect(&logFont);
|
| - m_font = hFont ? RefCountedHFONT::create(hFont) : 0;
|
| - m_scriptCache = 0;
|
| -#endif
|
| -}
|
| -
|
| -FontPlatformData& FontPlatformData::operator=(const FontPlatformData& data)
|
| -{
|
| - if (this != &data) {
|
| - m_textSize = data.m_textSize;
|
| - m_fakeBold = data.m_fakeBold;
|
| - m_fakeItalic = data.m_fakeItalic;
|
| - m_orientation = data.m_orientation;
|
| - m_typeface = data.m_typeface;
|
| - m_paintTextFlags = data.m_paintTextFlags;
|
| -
|
| -#if !USE(HARFBUZZ)
|
| - m_font = data.m_font;
|
| - // The following fields will get re-computed if necessary.
|
| - ScriptFreeCache(&m_scriptCache);
|
| - m_scriptCache = 0;
|
| - m_scriptFontProperties.clear();
|
| -#endif
|
| - }
|
| - return *this;
|
| -}
|
| -
|
| -FontPlatformData::~FontPlatformData()
|
| -{
|
| -#if !USE(HARFBUZZ)
|
| - ScriptFreeCache(&m_scriptCache);
|
| - m_scriptCache = 0;
|
| -#endif
|
| -}
|
| -
|
| -String FontPlatformData::fontFamilyName() const
|
| -{
|
| -#if ENABLE(GDI_FONTS_ON_WINDOWS)
|
| - HWndDC dc(0);
|
| - HGDIOBJ oldFont = static_cast<HFONT>(SelectObject(dc, hfont()));
|
| - WCHAR name[LF_FACESIZE];
|
| - unsigned resultLength = GetTextFace(dc, LF_FACESIZE, name);
|
| - if (resultLength > 0)
|
| - resultLength--; // ignore the null terminator
|
| - SelectObject(dc, oldFont);
|
| - return String(name, resultLength);
|
| -#else
|
| - // FIXME: This returns the requested name, perhaps a better solution would be to
|
| - // return the list of names provided by SkTypeface::createFamilyNameIterator.
|
| - ASSERT(typeface());
|
| - SkString familyName;
|
| - typeface()->getFamilyName(&familyName);
|
| - return String::fromUTF8(familyName.c_str());
|
| -#endif
|
| -}
|
| -
|
| -bool FontPlatformData::isFixedPitch() const
|
| -{
|
| -#if ENABLE(GDI_FONTS_ON_WINDOWS)
|
| - // TEXTMETRICS have this. Set m_treatAsFixedPitch based off that.
|
| - HWndDC dc(0);
|
| - HGDIOBJ oldFont = SelectObject(dc, hfont());
|
| -
|
| - // Yes, this looks backwards, but the fixed pitch bit is actually set if the font
|
| - // is *not* fixed pitch. Unbelievable but true.
|
| - TEXTMETRIC textMetric = { 0 };
|
| - if (!GetTextMetrics(dc, &textMetric)) {
|
| - if (ensureFontLoaded(hfont())) {
|
| - // Retry GetTextMetrics.
|
| - // FIXME: Handle gracefully the error if this call also fails.
|
| - // See http://crbug.com/6401.
|
| - if (!GetTextMetrics(dc, &textMetric))
|
| - WTF_LOG_ERROR("Unable to get the text metrics after second attempt");
|
| - }
|
| - }
|
| -
|
| - bool treatAsFixedPitch = !(textMetric.tmPitchAndFamily & TMPF_FIXED_PITCH);
|
| -
|
| - SelectObject(dc, oldFont);
|
| -
|
| - return treatAsFixedPitch;
|
| -#else
|
| - return typeface() && typeface()->isFixedPitch();
|
| -#endif
|
| -}
|
| -
|
| -bool FontPlatformData::operator==(const FontPlatformData& a) const
|
| -{
|
| - return SkTypeface::Equal(m_typeface.get(), a.m_typeface.get())
|
| - && m_textSize == a.m_textSize
|
| - && m_fakeBold == a.m_fakeBold
|
| - && m_fakeItalic == a.m_fakeItalic
|
| - && m_orientation == a.m_orientation
|
| - && m_isHashTableDeletedValue == a.m_isHashTableDeletedValue;
|
| -}
|
| -
|
| -#if USE(HARFBUZZ)
|
| -HarfBuzzFace* FontPlatformData::harfBuzzFace() const
|
| -{
|
| - if (!m_harfBuzzFace)
|
| - m_harfBuzzFace = HarfBuzzFace::create(const_cast<FontPlatformData*>(this), uniqueID());
|
| -
|
| - return m_harfBuzzFace.get();
|
| -}
|
| -
|
| -#else
|
| -FontPlatformData::RefCountedHFONT::~RefCountedHFONT()
|
| -{
|
| - DeleteObject(m_hfont);
|
| -}
|
| -
|
| -SCRIPT_FONTPROPERTIES* FontPlatformData::scriptFontProperties() const
|
| -{
|
| - if (!m_scriptFontProperties) {
|
| - m_scriptFontProperties = adoptPtr(new SCRIPT_FONTPROPERTIES);
|
| - memset(m_scriptFontProperties.get(), 0, sizeof(SCRIPT_FONTPROPERTIES));
|
| - m_scriptFontProperties->cBytes = sizeof(SCRIPT_FONTPROPERTIES);
|
| - HRESULT result = ScriptGetFontProperties(0, scriptCache(), m_scriptFontProperties.get());
|
| - if (result == E_PENDING) {
|
| - HWndDC dc(0);
|
| - HGDIOBJ oldFont = SelectObject(dc, hfont());
|
| - HRESULT hr = ScriptGetFontProperties(dc, scriptCache(), m_scriptFontProperties.get());
|
| - if (S_OK != hr) {
|
| - if (FontPlatformData::ensureFontLoaded(hfont())) {
|
| - // FIXME: Handle gracefully the error if this call also fails.
|
| - hr = ScriptGetFontProperties(dc, scriptCache(), m_scriptFontProperties.get());
|
| - if (S_OK != hr) {
|
| - WTF_LOG_ERROR("Unable to get the font properties after second attempt");
|
| - }
|
| - }
|
| - }
|
| -
|
| - SelectObject(dc, oldFont);
|
| - }
|
| - }
|
| - return m_scriptFontProperties.get();
|
| -}
|
| -
|
| -bool FontPlatformData::ensureFontLoaded(HFONT font)
|
| -{
|
| - blink::WebSandboxSupport* sandboxSupport = blink::Platform::current()->sandboxSupport();
|
| - // if there is no sandbox, then we can assume the font
|
| - // was able to be loaded successfully already
|
| - return sandboxSupport ? sandboxSupport->ensureFontLoaded(font) : true;
|
| -}
|
| -#endif
|
| -
|
| -#ifndef NDEBUG
|
| -String FontPlatformData::description() const
|
| -{
|
| - return String();
|
| -}
|
| -#endif
|
| -
|
| -}
|
|
|