| OLD | NEW |
| 1 /** | 1 /* |
| 2 * Copyright (C) 2007 Rob Buis <buis@kde.org> | 2 * Copyright (C) 2007 Rob Buis <buis@kde.org> |
| 3 * Copyright (C) 2007 Nikolas Zimmermann <zimmermann@kde.org> | 3 * Copyright (C) 2007 Nikolas Zimmermann <zimmermann@kde.org> |
| 4 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 4 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
| 5 * | 5 * |
| 6 * This library is free software; you can redistribute it and/or | 6 * This library is free software; you can redistribute it and/or |
| 7 * modify it under the terms of the GNU Library General Public | 7 * modify it under the terms of the GNU Library General Public |
| 8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
| 9 * version 2 of the License, or (at your option) any later version. | 9 * version 2 of the License, or (at your option) any later version. |
| 10 * | 10 * |
| 11 * This library is distributed in the hope that it will be useful, | 11 * This library is distributed in the hope that it will be useful, |
| (...skipping 28 matching lines...) Expand all Loading... |
| 40 "SVGInlineTextBox has an unexpected size"); | 40 "SVGInlineTextBox has an unexpected size"); |
| 41 | 41 |
| 42 SVGInlineTextBox::SVGInlineTextBox(LineLayoutItem item, | 42 SVGInlineTextBox::SVGInlineTextBox(LineLayoutItem item, |
| 43 int start, | 43 int start, |
| 44 unsigned short length) | 44 unsigned short length) |
| 45 : InlineTextBox(item, start, length), m_startsNewTextChunk(false) {} | 45 : InlineTextBox(item, start, length), m_startsNewTextChunk(false) {} |
| 46 | 46 |
| 47 void SVGInlineTextBox::dirtyLineBoxes() { | 47 void SVGInlineTextBox::dirtyLineBoxes() { |
| 48 InlineTextBox::dirtyLineBoxes(); | 48 InlineTextBox::dirtyLineBoxes(); |
| 49 | 49 |
| 50 // Clear the now stale text fragments | 50 // Clear the now stale text fragments. |
| 51 clearTextFragments(); | 51 clearTextFragments(); |
| 52 | 52 |
| 53 // And clear any following text fragments as the text on which they | 53 // And clear any following text fragments as the text on which they depend may |
| 54 // depend may now no longer exist, or glyph positions may be wrong | 54 // now no longer exist, or glyph positions may be wrong. |
| 55 InlineTextBox* nextBox = nextTextBox(); | 55 InlineTextBox* nextBox = nextTextBox(); |
| 56 if (nextBox) | 56 if (nextBox) |
| 57 nextBox->dirtyLineBoxes(); | 57 nextBox->dirtyLineBoxes(); |
| 58 } | 58 } |
| 59 | 59 |
| 60 int SVGInlineTextBox::offsetForPosition(LayoutUnit, bool) const { | 60 int SVGInlineTextBox::offsetForPosition(LayoutUnit, bool) const { |
| 61 // SVG doesn't use the standard offset <-> position selection system, as it's
not suitable for SVGs complex needs. | 61 // SVG doesn't use the standard offset <-> position selection system, as it's |
| 62 // vertical text selection, inline boxes spanning multiple lines (contrary to
HTML, etc.) | 62 // not suitable for SVGs complex needs. Vertical text selection, inline boxes |
| 63 // spanning multiple lines (contrary to HTML, etc.) |
| 63 ASSERT_NOT_REACHED(); | 64 ASSERT_NOT_REACHED(); |
| 64 return 0; | 65 return 0; |
| 65 } | 66 } |
| 66 | 67 |
| 67 int SVGInlineTextBox::offsetForPositionInFragment( | 68 int SVGInlineTextBox::offsetForPositionInFragment( |
| 68 const SVGTextFragment& fragment, | 69 const SVGTextFragment& fragment, |
| 69 LayoutUnit position, | 70 LayoutUnit position, |
| 70 bool includePartialGlyphs) const { | 71 bool includePartialGlyphs) const { |
| 71 LineLayoutSVGInlineText lineLayoutItem = | 72 LineLayoutSVGInlineText lineLayoutItem = |
| 72 LineLayoutSVGInlineText(this->getLineLayoutItem()); | 73 LineLayoutSVGInlineText(this->getLineLayoutItem()); |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 run.setText(text.characters8() + fragment.characterOffset, | 192 run.setText(text.characters8() + fragment.characterOffset, |
| 192 fragment.length); | 193 fragment.length); |
| 193 else | 194 else |
| 194 run.setText(text.characters16() + fragment.characterOffset, | 195 run.setText(text.characters16() + fragment.characterOffset, |
| 195 fragment.length); | 196 fragment.length); |
| 196 } | 197 } |
| 197 | 198 |
| 198 // We handle letter & word spacing ourselves. | 199 // We handle letter & word spacing ourselves. |
| 199 run.disableSpacing(); | 200 run.disableSpacing(); |
| 200 | 201 |
| 201 // Propagate the maximum length of the characters buffer to the TextRun, even
when we're only processing a substring. | 202 // Propagate the maximum length of the characters buffer to the TextRun, even |
| 203 // when we're only processing a substring. |
| 202 run.setCharactersLength(text.textLength() - fragment.characterOffset); | 204 run.setCharactersLength(text.textLength() - fragment.characterOffset); |
| 203 ASSERT(run.charactersLength() >= run.length()); | 205 ASSERT(run.charactersLength() >= run.length()); |
| 204 return run; | 206 return run; |
| 205 } | 207 } |
| 206 | 208 |
| 207 bool SVGInlineTextBox::mapStartEndPositionsIntoFragmentCoordinates( | 209 bool SVGInlineTextBox::mapStartEndPositionsIntoFragmentCoordinates( |
| 208 const SVGTextFragment& fragment, | 210 const SVGTextFragment& fragment, |
| 209 int& startPosition, | 211 int& startPosition, |
| 210 int& endPosition) const { | 212 int& endPosition) const { |
| 211 int fragmentOffsetInBox = | 213 int fragmentOffsetInBox = |
| 212 static_cast<int>(fragment.characterOffset) - start(); | 214 static_cast<int>(fragment.characterOffset) - start(); |
| 213 | 215 |
| 214 // Compute positions relative to the fragment. | 216 // Compute positions relative to the fragment. |
| 215 startPosition -= fragmentOffsetInBox; | 217 startPosition -= fragmentOffsetInBox; |
| 216 endPosition -= fragmentOffsetInBox; | 218 endPosition -= fragmentOffsetInBox; |
| 217 | 219 |
| 218 // Intersect with the fragment range. | 220 // Intersect with the fragment range. |
| 219 startPosition = std::max(startPosition, 0); | 221 startPosition = std::max(startPosition, 0); |
| 220 endPosition = std::min(endPosition, static_cast<int>(fragment.length)); | 222 endPosition = std::min(endPosition, static_cast<int>(fragment.length)); |
| 221 | 223 |
| 222 return startPosition < endPosition; | 224 return startPosition < endPosition; |
| 223 } | 225 } |
| 224 | 226 |
| 225 void SVGInlineTextBox::paintDocumentMarker(GraphicsContext&, | 227 void SVGInlineTextBox::paintDocumentMarker(GraphicsContext&, |
| 226 const LayoutPoint&, | 228 const LayoutPoint&, |
| 227 DocumentMarker*, | 229 DocumentMarker*, |
| 228 const ComputedStyle&, | 230 const ComputedStyle&, |
| 229 const Font&, | 231 const Font&, |
| 230 bool) const { | 232 bool) const { |
| 231 // SVG does not have support for generic document markers (e.g., spellchecking
, etc). | 233 // SVG does not have support for generic document markers (e.g., |
| 234 // spellchecking, etc). |
| 232 } | 235 } |
| 233 | 236 |
| 234 void SVGInlineTextBox::paintTextMatchMarkerForeground( | 237 void SVGInlineTextBox::paintTextMatchMarkerForeground( |
| 235 const PaintInfo& paintInfo, | 238 const PaintInfo& paintInfo, |
| 236 const LayoutPoint& point, | 239 const LayoutPoint& point, |
| 237 DocumentMarker* marker, | 240 DocumentMarker* marker, |
| 238 const ComputedStyle& style, | 241 const ComputedStyle& style, |
| 239 const Font& font) const { | 242 const Font& font) const { |
| 240 SVGInlineTextBoxPainter(*this).paintTextMatchMarkerForeground( | 243 SVGInlineTextBoxPainter(*this).paintTextMatchMarkerForeground( |
| 241 paintInfo, point, marker, style, font); | 244 paintInfo, point, marker, style, font); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 311 return true; | 314 return true; |
| 312 } | 315 } |
| 313 } | 316 } |
| 314 } | 317 } |
| 315 } | 318 } |
| 316 } | 319 } |
| 317 return false; | 320 return false; |
| 318 } | 321 } |
| 319 | 322 |
| 320 } // namespace blink | 323 } // namespace blink |
| OLD | NEW |