diff options
Diffstat (limited to 'WebCore/rendering/RenderSVGInlineText.cpp')
-rw-r--r-- | WebCore/rendering/RenderSVGInlineText.cpp | 132 |
1 files changed, 3 insertions, 129 deletions
diff --git a/WebCore/rendering/RenderSVGInlineText.cpp b/WebCore/rendering/RenderSVGInlineText.cpp index 48d01ae..ba99243 100644 --- a/WebCore/rendering/RenderSVGInlineText.cpp +++ b/WebCore/rendering/RenderSVGInlineText.cpp @@ -38,99 +38,21 @@ namespace WebCore { -static inline bool isChildOfHiddenContainer(RenderObject* start) -{ - while (start) { - if (start->isSVGHiddenContainer()) - return true; - - start = start->parent(); - } - - return false; -} - RenderSVGInlineText::RenderSVGInlineText(Node* n, PassRefPtr<StringImpl> str) : RenderText(n, str) { } - void RenderSVGInlineText::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) { - // Skip RenderText's possible layout scheduling on style change - RenderObject::styleDidChange(diff, oldStyle); + RenderText::styleDidChange(diff, oldStyle); - // FIXME: SVG text is apparently always transformed? + // FIXME: Should optimize this. + // SVG text is always transformed. if (RefPtr<StringImpl> textToTransform = originalText()) setText(textToTransform.release(), true); } -void RenderSVGInlineText::absoluteRects(Vector<IntRect>& rects, int, int) -{ - rects.append(computeRepaintRectForRange(0, 0, textLength())); -} - -void RenderSVGInlineText::absoluteQuads(Vector<FloatQuad>& quads) -{ - quads.append(computeRepaintQuadForRange(0, 0, textLength())); -} - -IntRect RenderSVGInlineText::selectionRectForRepaint(RenderBoxModelObject* repaintContainer, bool /*clipToVisibleContent*/) -{ - ASSERT(!needsLayout()); - - if (selectionState() == SelectionNone) - return IntRect(); - - // Early exit if we're ie. a <text> within a <defs> section. - if (isChildOfHiddenContainer(this)) - return IntRect(); - - // Now calculate startPos and endPos for painting selection. - // We include a selection while endPos > 0 - int startPos, endPos; - if (selectionState() == SelectionInside) { - // We are fully selected. - startPos = 0; - endPos = textLength(); - } else { - selectionStartEnd(startPos, endPos); - if (selectionState() == SelectionStart) - endPos = textLength(); - else if (selectionState() == SelectionEnd) - startPos = 0; - } - - if (startPos == endPos) - return IntRect(); - - return computeRepaintRectForRange(repaintContainer, startPos, endPos); -} - -IntRect RenderSVGInlineText::computeRepaintRectForRange(RenderBoxModelObject* repaintContainer, int startPos, int endPos) -{ - FloatQuad repaintQuad = computeRepaintQuadForRange(repaintContainer, startPos, endPos); - return enclosingIntRect(repaintQuad.boundingBox()); -} - -FloatQuad RenderSVGInlineText::computeRepaintQuadForRange(RenderBoxModelObject* repaintContainer, int startPos, int endPos) -{ - RenderBlock* cb = containingBlock(); - if (!cb || !cb->container()) - return FloatQuad(); - - RenderSVGRoot* root = findSVGRootObject(parent()); - if (!root) - return FloatQuad(); - - IntRect rect; - for (InlineTextBox* box = firstTextBox(); box; box = box->nextTextBox()) - rect.unite(box->selectionRect(0, 0, startPos, endPos)); - - return localToContainerQuad(FloatQuad(rect), repaintContainer); -} - InlineTextBox* RenderSVGInlineText::createTextBox() { InlineTextBox* box = new (renderArena()) SVGInlineTextBox(this); @@ -140,57 +62,9 @@ InlineTextBox* RenderSVGInlineText::createTextBox() IntRect RenderSVGInlineText::localCaretRect(InlineBox*, int, int*) { - // SVG doesn't have any editable content where a caret rect would be needed. - // FIXME: That's not sufficient. The localCaretRect function is also used for selection. return IntRect(); } -VisiblePosition RenderSVGInlineText::positionForPoint(const IntPoint& point) -{ - SVGInlineTextBox* textBox = static_cast<SVGInlineTextBox*>(firstTextBox()); - - if (!textBox || textLength() == 0) - return createVisiblePosition(0, DOWNSTREAM); - - SVGRootInlineBox* rootBox = textBox->svgRootInlineBox(); - RenderBlock* object = rootBox ? rootBox->block() : 0; - - if (!object) - return createVisiblePosition(0, DOWNSTREAM); - - int closestOffsetInBox = 0; - - // FIXME: This approach is wrong. The correct code would first find the - // closest SVGInlineTextBox to the point, and *then* ask only that inline box - // what the closest text offset to that point is. This code instead walks - // through all boxes in order, so when you click "near" a box, you'll actually - // end up returning the nearest offset in the last box, even if the - // nearest offset to your click is contained in another box. - for (SVGInlineTextBox* box = textBox; box; box = static_cast<SVGInlineTextBox*>(box->nextTextBox())) { - if (box->svgCharacterHitsPosition(point.x() + object->x(), point.y() + object->y(), closestOffsetInBox)) { - // If we're not at the end/start of the box, stop looking for other selected boxes. - if (box->direction() == LTR) { - if (closestOffsetInBox <= (int) box->end() + 1) - break; - } else { - if (closestOffsetInBox > (int) box->start()) - break; - } - } - } - - return createVisiblePosition(closestOffsetInBox, DOWNSTREAM); -} - -void RenderSVGInlineText::destroy() -{ - if (!documentBeingDestroyed()) { - setNeedsLayoutAndPrefWidthsRecalc(); - repaint(); - } - RenderText::destroy(); -} - } #endif // ENABLE(SVG) |