| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 2 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
| 3 * | 3 * |
| 4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
| 5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
| 6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
| 7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
| 8 * | 8 * |
| 9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 #include "core/svg/SVGFontData.h" | 30 #include "core/svg/SVGFontData.h" |
| 31 #include "core/svg/SVGFontElement.h" | 31 #include "core/svg/SVGFontElement.h" |
| 32 #include "core/svg/SVGFontFaceElement.h" | 32 #include "core/svg/SVGFontFaceElement.h" |
| 33 #endif | 33 #endif |
| 34 | 34 |
| 35 namespace WebCore { | 35 namespace WebCore { |
| 36 | 36 |
| 37 SVGTextLayoutEngineSpacing::SVGTextLayoutEngineSpacing(const Font& font) | 37 SVGTextLayoutEngineSpacing::SVGTextLayoutEngineSpacing(const Font& font) |
| 38 : m_font(font) | 38 : m_font(font) |
| 39 , m_lastCharacter(0) | 39 , m_lastCharacter(0) |
| 40 #if ENABLE(SVG_FONTS) |
| 41 , m_lastGlyph(0) |
| 42 #endif |
| 40 { | 43 { |
| 41 } | 44 } |
| 42 | 45 |
| 43 float SVGTextLayoutEngineSpacing::calculateSVGKerning(bool isVerticalText, const
SVGTextMetrics::Glyph& currentGlyph) | 46 float SVGTextLayoutEngineSpacing::calculateSVGKerning(bool isVerticalText, Glyph
currentGlyph) |
| 44 { | 47 { |
| 45 #if ENABLE(SVG_FONTS) | 48 #if ENABLE(SVG_FONTS) |
| 46 const SimpleFontData* fontData = m_font.primaryFont(); | 49 const SimpleFontData* fontData = m_font.primaryFont(); |
| 47 if (!fontData->isSVGFont()) { | 50 if (!fontData->isSVGFont()) { |
| 48 m_lastGlyph.isValid = false; | 51 m_lastGlyph = 0; |
| 49 return 0; | 52 return 0; |
| 50 } | 53 } |
| 51 | 54 |
| 52 ASSERT(fontData->isCustomFont()); | 55 ASSERT(fontData->isCustomFont()); |
| 53 ASSERT(fontData->isSVGFont()); | 56 ASSERT(fontData->isSVGFont()); |
| 54 | 57 |
| 55 RefPtr<CustomFontData> customFontData = fontData->customFontData(); | 58 RefPtr<CustomFontData> customFontData = fontData->customFontData(); |
| 56 const SVGFontData* svgFontData = static_cast<const SVGFontData*>(customFontD
ata.get()); | 59 const SVGFontData* svgFontData = static_cast<const SVGFontData*>(customFontD
ata.get()); |
| 57 SVGFontFaceElement* svgFontFace = svgFontData->svgFontFaceElement(); | 60 SVGFontFaceElement* svgFontFace = svgFontData->svgFontFaceElement(); |
| 58 ASSERT(svgFontFace); | 61 ASSERT(svgFontFace); |
| 59 | 62 |
| 60 SVGFontElement* svgFont = svgFontFace->associatedFontElement(); | 63 SVGFontElement* svgFont = svgFontFace->associatedFontElement(); |
| 61 if (!svgFont) { | 64 if (!svgFont) { |
| 62 m_lastGlyph.isValid = false; | 65 m_lastGlyph = 0; |
| 63 return 0; | 66 return 0; |
| 64 } | 67 } |
| 65 | 68 |
| 66 float kerning = 0; | 69 float kerning = 0; |
| 67 if (m_lastGlyph.isValid) { | 70 if (m_lastGlyph) { |
| 68 if (isVerticalText) | 71 if (isVerticalText) |
| 69 kerning = svgFont->verticalKerningForPairOfStringsAndGlyphs(m_lastGl
yph.unicodeString, m_lastGlyph.name, currentGlyph.unicodeString, currentGlyph.na
me); | 72 kerning = svgFont->verticalKerningForPairOfGlyphs(m_lastGlyph, curre
ntGlyph); |
| 70 else | 73 else |
| 71 kerning = svgFont->horizontalKerningForPairOfStringsAndGlyphs(m_last
Glyph.unicodeString, m_lastGlyph.name, currentGlyph.unicodeString, currentGlyph.
name); | 74 kerning = svgFont->horizontalKerningForPairOfGlyphs(m_lastGlyph, cur
rentGlyph); |
| 75 |
| 76 kerning *= m_font.fontDescription().computedSize() / m_font.fontMetrics(
).unitsPerEm(); |
| 72 } | 77 } |
| 73 | 78 |
| 74 m_lastGlyph = currentGlyph; | 79 m_lastGlyph = currentGlyph; |
| 75 m_lastGlyph.isValid = true; | |
| 76 kerning *= m_font.fontDescription().computedSize() / m_font.fontMetrics().un
itsPerEm(); | |
| 77 return kerning; | 80 return kerning; |
| 78 #else | 81 #else |
| 79 return false; | 82 return 0; |
| 80 #endif | 83 #endif |
| 81 } | 84 } |
| 82 | 85 |
| 83 float SVGTextLayoutEngineSpacing::calculateCSSKerningAndSpacing(const SVGRenderS
tyle* style, SVGElement* contextElement, UChar currentCharacter) | 86 float SVGTextLayoutEngineSpacing::calculateCSSKerningAndSpacing(const SVGRenderS
tyle* style, SVGElement* contextElement, UChar currentCharacter) |
| 84 { | 87 { |
| 85 float kerning = 0; | 88 float kerning = 0; |
| 86 RefPtr<SVGLength> kerningLength = style->kerning(); | 89 RefPtr<SVGLength> kerningLength = style->kerning(); |
| 87 if (kerningLength->unitType() == LengthTypePercentage) | 90 if (kerningLength->unitType() == LengthTypePercentage) |
| 88 kerning = kerningLength->valueAsPercentage() * m_font.fontDescription().
computedPixelSize(); | 91 kerning = kerningLength->valueAsPercentage() * m_font.fontDescription().
computedPixelSize(); |
| 89 else { | 92 else { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 100 float spacing = m_font.fontDescription().letterSpacing() + kerning; | 103 float spacing = m_font.fontDescription().letterSpacing() + kerning; |
| 101 if (currentCharacter && lastCharacter && m_font.fontDescription().wordSpacin
g()) { | 104 if (currentCharacter && lastCharacter && m_font.fontDescription().wordSpacin
g()) { |
| 102 if (Character::treatAsSpace(currentCharacter) && !Character::treatAsSpac
e(lastCharacter)) | 105 if (Character::treatAsSpace(currentCharacter) && !Character::treatAsSpac
e(lastCharacter)) |
| 103 spacing += m_font.fontDescription().wordSpacing(); | 106 spacing += m_font.fontDescription().wordSpacing(); |
| 104 } | 107 } |
| 105 | 108 |
| 106 return spacing; | 109 return spacing; |
| 107 } | 110 } |
| 108 | 111 |
| 109 } | 112 } |
| OLD | NEW |