📄 fontplatformdatachromiumwin.cpp
字号:
/* * 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 <windows.h>#include <objidl.h>#include <mlang.h>#include "ChromiumBridge.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 muchFontPlatformData::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<HFONT>(-1)) { SkiaWinOutlineCache::removePathsForFont(m_hfont); DeleteObject(m_hfont); }}FontPlatformData::RefCountedHFONT* FontPlatformData::hashTableDeletedFontValue(){ static RefPtr<RefCountedHFONT> deletedValue = RefCountedHFONT::create(reinterpret_cast<HFONT>(-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 (ChromiumBridge::ensureFontLoaded(hfont())) { // FIXME: Handle gracefully the error if this call also fails. hr = ScriptGetFontProperties(dc, scriptCache(), m_scriptFontProperties); if (S_OK != hr) { ASSERT_NOT_REACHED(); } } } SelectObject(dc, oldFont); ReleaseDC(0, dc); } } return m_scriptFontProperties;}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -