| Index: third_party/WebKit/WebCore/platform/graphics/SimpleFontData.cpp
|
| ===================================================================
|
| --- third_party/WebKit/WebCore/platform/graphics/SimpleFontData.cpp (revision 9391)
|
| +++ third_party/WebKit/WebCore/platform/graphics/SimpleFontData.cpp (working copy)
|
| @@ -1,156 +1,156 @@
|
| -/*
|
| - * Copyright (C) 2005, 2008 Apple Computer, Inc. All rights reserved.
|
| - * Copyright (C) 2006 Alexey Proskuryakov
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions
|
| - * are met:
|
| - *
|
| - * 1. Redistributions of source code must retain the above copyright
|
| - * notice, this list of conditions and the following disclaimer.
|
| - * 2. 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.
|
| - * 3. Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 "SimpleFontData.h"
|
| -
|
| -#include "Font.h"
|
| -#include "FontCache.h"
|
| -
|
| -#if ENABLE(SVG_FONTS)
|
| -#include "SVGFontData.h"
|
| -#include "SVGFontFaceElement.h"
|
| -#endif
|
| -
|
| -#include <wtf/MathExtras.h>
|
| -
|
| -namespace WebCore {
|
| -
|
| -SimpleFontData::SimpleFontData(const FontPlatformData& f, bool customFont, bool loading, SVGFontData* svgFontData)
|
| - : m_unitsPerEm(defaultUnitsPerEm)
|
| - , m_font(f)
|
| - , m_treatAsFixedPitch(false)
|
| -#if ENABLE(SVG_FONTS)
|
| - , m_svgFontData(svgFontData)
|
| -#endif
|
| - , m_isCustomFont(customFont)
|
| - , m_isLoading(loading)
|
| - , m_smallCapsFontData(0)
|
| -{
|
| -#if ENABLE(SVG_FONTS)
|
| - if (SVGFontFaceElement* svgFontFaceElement = svgFontData ? svgFontData->svgFontFaceElement() : 0) {
|
| - m_unitsPerEm = svgFontFaceElement->unitsPerEm();
|
| -
|
| - double scale = f.size();
|
| - if (m_unitsPerEm)
|
| - scale /= m_unitsPerEm;
|
| -
|
| - m_ascent = static_cast<int>(svgFontFaceElement->ascent() * scale);
|
| - m_descent = static_cast<int>(svgFontFaceElement->descent() * scale);
|
| - // TODO(ojan): What should SVG fonts use for avgCharWidth/maxCharWidth?
|
| - // This is currently only used in RenderTextControl.cpp for the width
|
| - // of textareas with a non-fixed width.
|
| - m_avgCharWidth = 0;
|
| - m_maxCharWidth = 0;
|
| - m_xHeight = static_cast<int>(svgFontFaceElement->xHeight() * scale);
|
| - m_lineGap = 0.1f * f.size();
|
| - m_lineSpacing = m_ascent + m_descent + m_lineGap;
|
| -
|
| - m_spaceGlyph = 0;
|
| - m_spaceWidth = 0;
|
| - m_adjustedSpaceWidth = 0;
|
| - determinePitch();
|
| - m_missingGlyphData.fontData = this;
|
| - m_missingGlyphData.glyph = 0;
|
| - return;
|
| - }
|
| -#endif
|
| -
|
| - platformInit();
|
| - platformGlyphInit();
|
| -}
|
| -
|
| -#if !PLATFORM(QT)
|
| -void SimpleFontData::platformGlyphInit()
|
| -{
|
| - GlyphPage* glyphPageZero = GlyphPageTreeNode::getRootChild(this, 0)->page();
|
| - if (!glyphPageZero) {
|
| - LOG_ERROR("Failed to get glyph page zero.");
|
| - m_spaceGlyph = 0;
|
| - m_spaceWidth = 0;
|
| - m_adjustedSpaceWidth = 0;
|
| - determinePitch();
|
| - m_missingGlyphData.fontData = this;
|
| - m_missingGlyphData.glyph = 0;
|
| - return;
|
| - }
|
| -
|
| - // Nasty hack to determine if we should round or ceil space widths.
|
| - // If the font is monospace or fake monospace we ceil to ensure that
|
| - // every character and the space are the same width. Otherwise we round.
|
| - static const UChar32 space_char = ' ';
|
| - m_spaceGlyph = glyphPageZero->glyphDataForCharacter(space_char).glyph;
|
| - float width = widthForGlyph(m_spaceGlyph);
|
| - m_spaceWidth = width;
|
| - determinePitch();
|
| - m_adjustedSpaceWidth = m_treatAsFixedPitch ? ceilf(width) : roundf(width);
|
| -
|
| - // Force the glyph for ZERO WIDTH SPACE to have zero width, unless it is shared with SPACE.
|
| - // Helvetica is an example of a non-zero width ZERO WIDTH SPACE glyph.
|
| - // See <http://bugs.webkit.org/show_bug.cgi?id=13178>
|
| - // Ask for the glyph for 0 to avoid paging in ZERO WIDTH SPACE. Control characters, including 0,
|
| - // are mapped to the ZERO WIDTH SPACE glyph.
|
| - Glyph zeroWidthSpaceGlyph = glyphPageZero->glyphDataForCharacter(0).glyph;
|
| - if (zeroWidthSpaceGlyph) {
|
| - if (zeroWidthSpaceGlyph != m_spaceGlyph)
|
| - m_glyphToWidthMap.setWidthForGlyph(zeroWidthSpaceGlyph, 0);
|
| - else
|
| - LOG_ERROR("Font maps SPACE and ZERO WIDTH SPACE to the same glyph. Glyph width not overridden.");
|
| - }
|
| -
|
| - m_missingGlyphData.fontData = this;
|
| - m_missingGlyphData.glyph = 0;
|
| -}
|
| -#endif
|
| -
|
| -SimpleFontData::~SimpleFontData()
|
| -{
|
| - if (!isCustomFont()) {
|
| - if (m_smallCapsFontData)
|
| - fontCache()->releaseFontData(m_smallCapsFontData);
|
| - GlyphPageTreeNode::pruneTreeFontData(this);
|
| - }
|
| -
|
| -#if ENABLE(SVG_FONTS)
|
| - if (!m_svgFontData || !m_svgFontData->svgFontFaceElement())
|
| -#endif
|
| - platformDestroy();
|
| -}
|
| -
|
| -const SimpleFontData* SimpleFontData::fontDataForCharacter(UChar32) const
|
| -{
|
| - return this;
|
| -}
|
| -
|
| -bool SimpleFontData::isSegmented() const
|
| -{
|
| - return false;
|
| -}
|
| -
|
| -} // namespace WebCore
|
| +/*
|
| + * Copyright (C) 2005, 2008 Apple Computer, Inc. All rights reserved.
|
| + * Copyright (C) 2006 Alexey Proskuryakov
|
| + *
|
| + * Redistribution and use in source and binary forms, with or without
|
| + * modification, are permitted provided that the following conditions
|
| + * are met:
|
| + *
|
| + * 1. Redistributions of source code must retain the above copyright
|
| + * notice, this list of conditions and the following disclaimer.
|
| + * 2. 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.
|
| + * 3. Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 "SimpleFontData.h"
|
| +
|
| +#include "Font.h"
|
| +#include "FontCache.h"
|
| +
|
| +#if ENABLE(SVG_FONTS)
|
| +#include "SVGFontData.h"
|
| +#include "SVGFontFaceElement.h"
|
| +#endif
|
| +
|
| +#include <wtf/MathExtras.h>
|
| +
|
| +namespace WebCore {
|
| +
|
| +SimpleFontData::SimpleFontData(const FontPlatformData& f, bool customFont, bool loading, SVGFontData* svgFontData)
|
| + : m_unitsPerEm(defaultUnitsPerEm)
|
| + , m_font(f)
|
| + , m_treatAsFixedPitch(false)
|
| +#if ENABLE(SVG_FONTS)
|
| + , m_svgFontData(svgFontData)
|
| +#endif
|
| + , m_isCustomFont(customFont)
|
| + , m_isLoading(loading)
|
| + , m_smallCapsFontData(0)
|
| +{
|
| +#if ENABLE(SVG_FONTS)
|
| + if (SVGFontFaceElement* svgFontFaceElement = svgFontData ? svgFontData->svgFontFaceElement() : 0) {
|
| + m_unitsPerEm = svgFontFaceElement->unitsPerEm();
|
| +
|
| + double scale = f.size();
|
| + if (m_unitsPerEm)
|
| + scale /= m_unitsPerEm;
|
| +
|
| + m_ascent = static_cast<int>(svgFontFaceElement->ascent() * scale);
|
| + m_descent = static_cast<int>(svgFontFaceElement->descent() * scale);
|
| + // TODO(ojan): What should SVG fonts use for avgCharWidth/maxCharWidth?
|
| + // This is currently only used in RenderTextControl.cpp for the width
|
| + // of textareas with a non-fixed width.
|
| + m_avgCharWidth = 0;
|
| + m_maxCharWidth = 0;
|
| + m_xHeight = static_cast<int>(svgFontFaceElement->xHeight() * scale);
|
| + m_lineGap = 0.1f * f.size();
|
| + m_lineSpacing = m_ascent + m_descent + m_lineGap;
|
| +
|
| + m_spaceGlyph = 0;
|
| + m_spaceWidth = 0;
|
| + m_adjustedSpaceWidth = 0;
|
| + determinePitch();
|
| + m_missingGlyphData.fontData = this;
|
| + m_missingGlyphData.glyph = 0;
|
| + return;
|
| + }
|
| +#endif
|
| +
|
| + platformInit();
|
| + platformGlyphInit();
|
| +}
|
| +
|
| +#if !PLATFORM(QT)
|
| +void SimpleFontData::platformGlyphInit()
|
| +{
|
| + GlyphPage* glyphPageZero = GlyphPageTreeNode::getRootChild(this, 0)->page();
|
| + if (!glyphPageZero) {
|
| + LOG_ERROR("Failed to get glyph page zero.");
|
| + m_spaceGlyph = 0;
|
| + m_spaceWidth = 0;
|
| + m_adjustedSpaceWidth = 0;
|
| + determinePitch();
|
| + m_missingGlyphData.fontData = this;
|
| + m_missingGlyphData.glyph = 0;
|
| + return;
|
| + }
|
| +
|
| + // Nasty hack to determine if we should round or ceil space widths.
|
| + // If the font is monospace or fake monospace we ceil to ensure that
|
| + // every character and the space are the same width. Otherwise we round.
|
| + static const UChar32 space_char = ' ';
|
| + m_spaceGlyph = glyphPageZero->glyphDataForCharacter(space_char).glyph;
|
| + float width = widthForGlyph(m_spaceGlyph);
|
| + m_spaceWidth = width;
|
| + determinePitch();
|
| + m_adjustedSpaceWidth = m_treatAsFixedPitch ? ceilf(width) : roundf(width);
|
| +
|
| + // Force the glyph for ZERO WIDTH SPACE to have zero width, unless it is shared with SPACE.
|
| + // Helvetica is an example of a non-zero width ZERO WIDTH SPACE glyph.
|
| + // See <http://bugs.webkit.org/show_bug.cgi?id=13178>
|
| + // Ask for the glyph for 0 to avoid paging in ZERO WIDTH SPACE. Control characters, including 0,
|
| + // are mapped to the ZERO WIDTH SPACE glyph.
|
| + Glyph zeroWidthSpaceGlyph = glyphPageZero->glyphDataForCharacter(0).glyph;
|
| + if (zeroWidthSpaceGlyph) {
|
| + if (zeroWidthSpaceGlyph != m_spaceGlyph)
|
| + m_glyphToWidthMap.setWidthForGlyph(zeroWidthSpaceGlyph, 0);
|
| + else
|
| + LOG_ERROR("Font maps SPACE and ZERO WIDTH SPACE to the same glyph. Glyph width not overridden.");
|
| + }
|
| +
|
| + m_missingGlyphData.fontData = this;
|
| + m_missingGlyphData.glyph = 0;
|
| +}
|
| +#endif
|
| +
|
| +SimpleFontData::~SimpleFontData()
|
| +{
|
| +#if ENABLE(SVG_FONTS)
|
| + if (!m_svgFontData || !m_svgFontData->svgFontFaceElement())
|
| +#endif
|
| + platformDestroy();
|
| +
|
| + if (!isCustomFont()) {
|
| + if (m_smallCapsFontData)
|
| + fontCache()->releaseFontData(m_smallCapsFontData);
|
| + GlyphPageTreeNode::pruneTreeFontData(this);
|
| + }
|
| +}
|
| +
|
| +const SimpleFontData* SimpleFontData::fontDataForCharacter(UChar32) const
|
| +{
|
| + return this;
|
| +}
|
| +
|
| +bool SimpleFontData::isSegmented() const
|
| +{
|
| + return false;
|
| +}
|
| +
|
| +} // namespace WebCore
|
|
|