VisiblePosition RenderReplaced::positionForCoordinates(int x, int y) { InlineBox* box = inlineBoxWrapper(); if (!box) return VisiblePosition(element(), 0, DOWNSTREAM); // FIXME: This code is buggy if the replaced element is relative positioned. RootInlineBox* root = box->root(); int top = root->topOverflow(); int bottom = root->nextRootBox() ? root->nextRootBox()->topOverflow() : root->bottomOverflow(); if (y + yPos() < top) return VisiblePosition(element(), caretMinOffset(), DOWNSTREAM); // coordinates are above if (y + yPos() >= bottom) return VisiblePosition(element(), caretMaxOffset(), DOWNSTREAM); // coordinates are below if (element()) { if (x <= width() / 2) return VisiblePosition(element(), 0, DOWNSTREAM); return VisiblePosition(element(), 1, DOWNSTREAM); } return RenderBox::positionForCoordinates(x, y); }
VisiblePosition RenderReplaced::positionForPoint(const IntPoint& point) { InlineBox* box = inlineBoxWrapper(); if (!box) return createVisiblePosition(0, DOWNSTREAM); // FIXME: This code is buggy if the replaced element is relative positioned. RootInlineBox* root = box->root(); int top = root->topOverflow(); int bottom = root->nextRootBox() ? root->nextRootBox()->topOverflow() : root->bottomOverflow(); if (point.y() + y() < top) return createVisiblePosition(caretMinOffset(), DOWNSTREAM); // coordinates are above if (point.y() + y() >= bottom) return createVisiblePosition(caretMaxOffset(), DOWNSTREAM); // coordinates are below if (node()) { if (point.x() <= width() / 2) return createVisiblePosition(0, DOWNSTREAM); return createVisiblePosition(1, DOWNSTREAM); } return RenderBox::positionForPoint(point); }
void RenderFlow::repaint(Priority prior) { if (isInlineFlow()) { // Find our leftmost position. int left = 0; // root inline box not reliably availabe during relayout int top = firstLineBox() ? ( needsLayout() ? firstLineBox()->xPos() : firstLineBox()->root()->topOverflow() ) : 0; for (InlineRunBox* curr = firstLineBox(); curr; curr = curr->nextLineBox()) if (curr == firstLineBox() || curr->xPos() < left) left = curr->xPos(); // Now invalidate a rectangle. int ow = style() ? style()->outlineSize() : 0; // We need to add in the relative position offsets of any inlines (including us) up to our // containing block. RenderBlock* cb = containingBlock(); for (RenderObject* inlineFlow = this; inlineFlow && inlineFlow->isInlineFlow() && inlineFlow != cb; inlineFlow = inlineFlow->parent()) { if (inlineFlow->style() && inlineFlow->style()->position() == RELATIVE && inlineFlow->layer()) { KHTMLAssert(inlineFlow->isBox()); static_cast<RenderBox*>(inlineFlow)->relativePositionOffset(left, top); } } RootInlineBox *lastRoot = lastLineBox() && !needsLayout() ? lastLineBox()->root() : 0; containingBlock()->repaintRectangle(-ow+left, -ow+top, width()+ow*2, (lastRoot ? lastRoot->bottomOverflow() - top : height())+ow*2, prior); } else { if (firstLineBox() && firstLineBox()->topOverflow() < 0) { int ow = style() ? style()->outlineSize() : 0; repaintRectangle(-ow, -ow+firstLineBox()->topOverflow(), effectiveWidth()+ow*2, effectiveHeight()+ow*2, prior); } else return RenderBox::repaint(prior); } }
VisiblePosition RenderReplaced::positionForCoordinates(int _x, int _y) { InlineBox *box = inlineBoxWrapper(); if (!box) return VisiblePosition(element(), 0, DOWNSTREAM); RootInlineBox *root = box->root(); int absx, absy; containingBlock()->absolutePosition(absx, absy); int top = absy + root->topOverflow(); int bottom = root->nextRootBox() ? absy + root->nextRootBox()->topOverflow() : absy + root->bottomOverflow(); if (_y < top) return VisiblePosition(element(), caretMinOffset(), DOWNSTREAM); // coordinates are above if (_y >= bottom) return VisiblePosition(element(), caretMaxOffset(), DOWNSTREAM); // coordinates are below if (element()) { if (_x <= absx + xPos() + (width() / 2)) return VisiblePosition(element(), 0, DOWNSTREAM); return VisiblePosition(element(), 1, DOWNSTREAM); } return RenderBox::positionForCoordinates(_x, _y); }