Skip to content

Instantly share code, notes, and snippets.

@kenchris
Created January 20, 2012 13:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kenchris/1647438 to your computer and use it in GitHub Desktop.
Save kenchris/1647438 to your computer and use it in GitHub Desktop.
namespace WebCore {
namespace{
inline LayoutSize frameToMainFrameOffset(Frame* frame)
{
LayoutPoint mainFramePoint = frame->page()->mainFrame()->view()->rootViewToContents(frame->view()->contentsToRootView(LayoutPoint()));
return toLayoutSize(mainFramePoint);
}
} // anonymous namespace
namespace GestureTapHighlighter {
void drawHighlight(GraphicsContext* context, Node* node, const Color& color)
{
RenderObject* renderer = node->renderer();
Frame* containingFrame = node->document()->frame();
if (!renderer || !containingFrame || !context)
return;
LayoutSize mainFrameOffset = frameToMainFrameOffset(containingFrame);
// Don't translate the context if the frame is rendered in page coordinates.
FrameView* view = containingFrame->page()->mainFrame()->view();
if (!view->delegatesScrolling()) {
FloatRect visibleRect = view->visibleContentRect();
context->translate(-visibleRect.x(), -visibleRect.y());
}
if (renderer->isBox() || renderer->isRenderInline()) {
LayoutRect contentBox;
LayoutRect paddingBox;
LayoutRect borderBox;
if (renderer->isBox()) {
RenderBox* renderBox = toRenderBox(renderer);
contentBox = renderBox->contentBoxRect();
paddingBox = LayoutRect(contentBox.x() - renderBox->paddingLeft(), contentBox.y() - renderBox->paddingTop(),
contentBox.width() + renderBox->paddingLeft() + renderBox->paddingRight(), contentBox.height() + renderBox->paddingTop() + renderBox->paddingBottom());
borderBox = LayoutRect(paddingBox.x() - renderBox->borderLeft(), paddingBox.y() - renderBox->borderTop(),
paddingBox.width() + renderBox->borderLeft() + renderBox->borderRight(), paddingBox.height() + renderBox->borderTop() + renderBox->borderBottom());
} else {
RenderInline* renderInline = toRenderInline(renderer);
// RenderInline's bounding box includes paddings and borders, excludes margins.
borderBox = renderInline->linesBoundingBox();
}
RoundedRect rect(borderBox);
rect.expandRadii(10);
rect.inflateWithRadii(5);
if (!renderer->hasLayer())
return;
LayoutSize containerOffset = renderer->offsetFromAncestorContainer(renderer);
TransformationMatrix t;
renderer->getTransformFromContainer(renderer, containerOffset, t);
AffineTransform trans = t.toAffineTransform();
rect.move(mainFrameOffset);
context->concatCTM(trans);
context->fillRoundedRect(rect, color, ColorSpaceDeviceRGB);
}
}
} // namespace GestureTapHighlighter
} // namespace WebCore
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment