Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(86)

Side by Side Diff: Source/core/rendering/RenderObject.cpp

Issue 492053002: Use LayoutRect during addFocusRingRects to avoid loss of precision (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: NeedsRebaseline (pixel tests about focus rings. 1-pixel width diff at the edge because of different rounding) Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/rendering/RenderObject.h ('k') | Source/core/rendering/RenderTextControl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2000 Dirk Mueller (mueller@kde.org) 4 * (C) 2000 Dirk Mueller (mueller@kde.org)
5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com) 5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com)
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv ed. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv ed.
7 * Copyright (C) 2009 Google Inc. All rights reserved. 7 * Copyright (C) 2009 Google Inc. All rights reserved.
8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) 8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/)
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 1200 matching lines...) Expand 10 before | Expand all | Expand 10 after
1211 quad[3] = FloatPoint(x2, y1 + std::max(-adjacentWidth1, 0)); 1211 quad[3] = FloatPoint(x2, y1 + std::max(-adjacentWidth1, 0));
1212 break; 1212 break;
1213 } 1213 }
1214 1214
1215 graphicsContext->drawConvexPolygon(4, quad, antialias); 1215 graphicsContext->drawConvexPolygon(4, quad, antialias);
1216 graphicsContext->setStrokeStyle(oldStrokeStyle); 1216 graphicsContext->setStrokeStyle(oldStrokeStyle);
1217 } 1217 }
1218 1218
1219 void RenderObject::paintFocusRing(PaintInfo& paintInfo, const LayoutPoint& paint Offset, RenderStyle* style) 1219 void RenderObject::paintFocusRing(PaintInfo& paintInfo, const LayoutPoint& paint Offset, RenderStyle* style)
1220 { 1220 {
1221 Vector<IntRect> focusRingRects; 1221 Vector<LayoutRect> focusRingRects;
1222 addFocusRingRects(focusRingRects, paintOffset, paintInfo.paintContainer()); 1222 addFocusRingRects(focusRingRects, paintOffset, paintInfo.paintContainer());
1223 ASSERT(style->outlineStyleIsAuto()); 1223 ASSERT(style->outlineStyleIsAuto());
1224 paintInfo.context->drawFocusRing(focusRingRects, style->outlineWidth(), styl e->outlineOffset(), resolveColor(style, CSSPropertyOutlineColor)); 1224 Vector<IntRect> focusRingIntRects;
1225 for (size_t i = 0; i < focusRingRects.size(); ++i)
1226 focusRingIntRects.append(pixelSnappedIntRect(focusRingRects[i]));
1227 paintInfo.context->drawFocusRing(focusRingIntRects, style->outlineWidth(), s tyle->outlineOffset(), resolveColor(style, CSSPropertyOutlineColor));
1225 } 1228 }
1226 1229
1227 void RenderObject::paintOutline(PaintInfo& paintInfo, const LayoutRect& paintRec t) 1230 void RenderObject::paintOutline(PaintInfo& paintInfo, const LayoutRect& paintRec t)
1228 { 1231 {
1229 RenderStyle* styleToUse = style(); 1232 RenderStyle* styleToUse = style();
1230 if (!styleToUse->hasOutline()) 1233 if (!styleToUse->hasOutline())
1231 return; 1234 return;
1232 1235
1233 LayoutUnit outlineWidth = styleToUse->outlineWidth(); 1236 LayoutUnit outlineWidth = styleToUse->outlineWidth();
1234 1237
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1285 1288
1286 drawLineForBoxSide(graphicsContext, leftOuter, topOuter, leftInner, bottomOu ter, BSLeft, outlineColor, outlineStyle, outlineWidth, outlineWidth); 1289 drawLineForBoxSide(graphicsContext, leftOuter, topOuter, leftInner, bottomOu ter, BSLeft, outlineColor, outlineStyle, outlineWidth, outlineWidth);
1287 drawLineForBoxSide(graphicsContext, leftOuter, topOuter, rightOuter, topInne r, BSTop, outlineColor, outlineStyle, outlineWidth, outlineWidth); 1290 drawLineForBoxSide(graphicsContext, leftOuter, topOuter, rightOuter, topInne r, BSTop, outlineColor, outlineStyle, outlineWidth, outlineWidth);
1288 drawLineForBoxSide(graphicsContext, rightInner, topOuter, rightOuter, bottom Outer, BSRight, outlineColor, outlineStyle, outlineWidth, outlineWidth); 1291 drawLineForBoxSide(graphicsContext, rightInner, topOuter, rightOuter, bottom Outer, BSRight, outlineColor, outlineStyle, outlineWidth, outlineWidth);
1289 drawLineForBoxSide(graphicsContext, leftOuter, bottomInner, rightOuter, bott omOuter, BSBottom, outlineColor, outlineStyle, outlineWidth, outlineWidth); 1292 drawLineForBoxSide(graphicsContext, leftOuter, bottomInner, rightOuter, bott omOuter, BSBottom, outlineColor, outlineStyle, outlineWidth, outlineWidth);
1290 1293
1291 if (useTransparencyLayer) 1294 if (useTransparencyLayer)
1292 graphicsContext->endLayer(); 1295 graphicsContext->endLayer();
1293 } 1296 }
1294 1297
1295 void RenderObject::addChildFocusRingRects(Vector<IntRect>& rects, const LayoutPo int& additionalOffset, const RenderLayerModelObject* paintContainer) const 1298 void RenderObject::addChildFocusRingRects(Vector<LayoutRect>& rects, const Layou tPoint& additionalOffset, const RenderLayerModelObject* paintContainer) const
1296 { 1299 {
1297 for (RenderObject* current = slowFirstChild(); current; current = current->n extSibling()) { 1300 for (RenderObject* current = slowFirstChild(); current; current = current->n extSibling()) {
1298 if (current->isText() || current->isListMarker()) 1301 if (current->isText() || current->isListMarker())
1299 continue; 1302 continue;
1300 1303
1301 if (current->isBox()) { 1304 if (current->isBox()) {
1302 RenderBox* box = toRenderBox(current); 1305 RenderBox* box = toRenderBox(current);
1303 if (box->hasLayer()) { 1306 if (box->hasLayer()) {
1304 Vector<IntRect> layerFocusRingRects; 1307 Vector<LayoutRect> layerFocusRingRects;
1305 box->addFocusRingRects(layerFocusRingRects, LayoutPoint(), box); 1308 box->addFocusRingRects(layerFocusRingRects, LayoutPoint(), box);
1306 for (size_t i = 0; i < layerFocusRingRects.size(); ++i) { 1309 for (size_t i = 0; i < layerFocusRingRects.size(); ++i) {
1307 FloatQuad quadInBox = box->localToContainerQuad(FloatRect(la yerFocusRingRects[i]), paintContainer); 1310 FloatQuad quadInBox = box->localToContainerQuad(FloatQuad(la yerFocusRingRects[i]), paintContainer);
1308 FloatRect rect = quadInBox.boundingBox(); 1311 LayoutRect rect = LayoutRect(quadInBox.boundingBox());
1309 // Floor the location instead of using pixelSnappedIntRect t o match the !hasLayer() path. 1312 if (!rect.isEmpty())
1310 // FIXME: roundedIntSize matches pixelSnappedIntRect in othe r places of addFocusRingRects 1313 rects.append(rect);
1311 // because we always floor the offset.
1312 // This assumption is fragile and should be replaced by bett er solution.
1313 rects.append(IntRect(flooredIntPoint(rect.location()), round edIntSize(rect.size())));
1314 } 1314 }
1315 } else { 1315 } else {
1316 FloatPoint pos(additionalOffset); 1316 box->addFocusRingRects(rects, additionalOffset + box->locationOf fset(), paintContainer);
1317 pos.move(box->locationOffset());
1318 box->addFocusRingRects(rects, flooredIntPoint(pos), paintContain er);
1319 } 1317 }
1320 } else { 1318 } else {
1321 current->addFocusRingRects(rects, additionalOffset, paintContainer); 1319 current->addFocusRingRects(rects, additionalOffset, paintContainer);
1322 } 1320 }
1323 } 1321 }
1324 } 1322 }
1325 1323
1326 LayoutPoint RenderObject::positionFromPaintInvalidationContainer(const RenderLay erModelObject* paintInvalidationContainer, const PaintInvalidationState* paintIn validationState) const 1324 LayoutPoint RenderObject::positionFromPaintInvalidationContainer(const RenderLay erModelObject* paintInvalidationContainer, const PaintInvalidationState* paintIn validationState) const
1327 { 1325 {
1328 ASSERT(containerForPaintInvalidation() == paintInvalidationContainer); 1326 ASSERT(containerForPaintInvalidation() == paintInvalidationContainer);
(...skipping 30 matching lines...) Expand all
1359 return IntRect(); 1357 return IntRect();
1360 1358
1361 LayoutRect result = rects[0]; 1359 LayoutRect result = rects[0];
1362 for (size_t i = 1; i < n; ++i) 1360 for (size_t i = 1; i < n; ++i)
1363 result.unite(rects[i]); 1361 result.unite(rects[i]);
1364 return pixelSnappedIntRect(result); 1362 return pixelSnappedIntRect(result);
1365 } 1363 }
1366 1364
1367 void RenderObject::absoluteFocusRingQuads(Vector<FloatQuad>& quads) 1365 void RenderObject::absoluteFocusRingQuads(Vector<FloatQuad>& quads)
1368 { 1366 {
1369 Vector<IntRect> rects; 1367 Vector<LayoutRect> rects;
1370 const RenderLayerModelObject* container = containerForPaintInvalidation(); 1368 const RenderLayerModelObject* container = containerForPaintInvalidation();
1371 addFocusRingRects(rects, LayoutPoint(localToContainerPoint(FloatPoint(), con tainer)), container); 1369 addFocusRingRects(rects, LayoutPoint(localToContainerPoint(FloatPoint(), con tainer)), container);
1372 size_t count = rects.size(); 1370 size_t count = rects.size();
1373 for (size_t i = 0; i < count; ++i) 1371 for (size_t i = 0; i < count; ++i)
1374 quads.append(container->localToAbsoluteQuad(FloatQuad(rects[i]))); 1372 quads.append(container->localToAbsoluteQuad(FloatQuad(rects[i])));
1375 } 1373 }
1376 1374
1377 FloatRect RenderObject::absoluteBoundingBoxRectForRange(const Range* range) 1375 FloatRect RenderObject::absoluteBoundingBoxRectForRange(const Range* range)
1378 { 1376 {
1379 if (!range || !range->startContainer()) 1377 if (!range || !range->startContainer())
(...skipping 2066 matching lines...) Expand 10 before | Expand all | Expand 10 after
3446 { 3444 {
3447 if (object1) { 3445 if (object1) {
3448 const blink::RenderObject* root = object1; 3446 const blink::RenderObject* root = object1;
3449 while (root->parent()) 3447 while (root->parent())
3450 root = root->parent(); 3448 root = root->parent();
3451 root->showRenderTreeAndMark(object1, "*", object2, "-", 0); 3449 root->showRenderTreeAndMark(object1, "*", object2, "-", 0);
3452 } 3450 }
3453 } 3451 }
3454 3452
3455 #endif 3453 #endif
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderObject.h ('k') | Source/core/rendering/RenderTextControl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698