/* * Copyright (C) 2006, 2007 Apple Computer, Inc. * Copyright (c) 2006, 2007, 2008, 2009, 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 "FontPlatformData.h" #include #include #include #include "PlatformBridge.h" #include "SkiaFontWin.h" namespace WebCore { FontPlatformData::FontPlatformData(WTF::HashTableDeletedValueType) : m_font(hashTableDeletedFontValue()) , m_size(-1) , m_scriptCache(0) , m_scriptFontProperties(0) { } FontPlatformData::FontPlatformData() : m_font(0) , m_size(0) , m_scriptCache(0) , m_scriptFontProperties(0) { } FontPlatformData::FontPlatformData(HFONT font, float size) : m_font(RefCountedHFONT::create(font)) , m_size(size) , m_scriptCache(0) , m_scriptFontProperties(0) { } // FIXME: this constructor is needed for SVG fonts but doesn't seem to do much FontPlatformData::FontPlatformData(float size, bool bold, bool oblique) : m_font(0) , m_size(size) , m_scriptCache(0) , m_scriptFontProperties(0) { } FontPlatformData::FontPlatformData(const FontPlatformData& data) : m_font(data.m_font) , m_size(data.m_size) , m_scriptCache(0) , m_scriptFontProperties(0) { } FontPlatformData& FontPlatformData::operator=(const FontPlatformData& data) { if (this != &data) { m_font = data.m_font; m_size = data.m_size; // The following fields will get re-computed if necessary. ScriptFreeCache(&m_scriptCache); m_scriptCache = 0; delete m_scriptFontProperties; m_scriptFontProperties = 0; } return *this; } FontPlatformData::~FontPlatformData() { ScriptFreeCache(&m_scriptCache); m_scriptCache = 0; delete m_scriptFontProperties; m_scriptFontProperties = 0; } FontPlatformData::RefCountedHFONT::~RefCountedHFONT() { if (m_hfont != reinterpret_cast(-1)) { SkiaWinOutlineCache::removePathsForFont(m_hfont); DeleteObject(m_hfont); } } FontPlatformData::RefCountedHFONT* FontPlatformData::hashTableDeletedFontValue() { static RefPtr deletedValue = RefCountedHFONT::create(reinterpret_cast(-1)); return deletedValue.get(); } SCRIPT_FONTPROPERTIES* FontPlatformData::scriptFontProperties() const { if (!m_scriptFontProperties) { m_scriptFontProperties = new SCRIPT_FONTPROPERTIES; memset(m_scriptFontProperties, 0, sizeof(SCRIPT_FONTPROPERTIES)); m_scriptFontProperties->cBytes = sizeof(SCRIPT_FONTPROPERTIES); HRESULT result = ScriptGetFontProperties(0, scriptCache(), m_scriptFontProperties); if (result == E_PENDING) { HDC dc = GetDC(0); HGDIOBJ oldFont = SelectObject(dc, hfont()); HRESULT hr = ScriptGetFontProperties(dc, scriptCache(), m_scriptFontProperties); if (S_OK != hr) { if (PlatformBridge::ensureFontLoaded(hfont())) { // FIXME: Handle gracefully the error if this call also fails. hr = ScriptGetFontProperties(dc, scriptCache(), m_scriptFontProperties); if (S_OK != hr) { LOG_ERROR("Unable to get the font properties after second attempt"); } } } SelectObject(dc, oldFont); ReleaseDC(0, dc); } } return m_scriptFontProperties; } #ifndef NDEBUG String FontPlatformData::description() const { return String(); } #endif }