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

Side by Side Diff: Source/core/paint/InlinePainter.cpp

Issue 1163913002: Improve outline bounds estimation in InlinePainter (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix continuation outlines. Created 5 years, 6 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/paint/InlinePainter.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "core/paint/InlinePainter.h" 6 #include "core/paint/InlinePainter.h"
7 7
8 #include "core/layout/LayoutBlock.h" 8 #include "core/layout/LayoutBlock.h"
9 #include "core/layout/LayoutInline.h" 9 #include "core/layout/LayoutInline.h"
10 #include "core/layout/LayoutTheme.h" 10 #include "core/layout/LayoutTheme.h"
(...skipping 11 matching lines...) Expand all
22 void InlinePainter::paint(const PaintInfo& paintInfo, const LayoutPoint& paintOf fset) 22 void InlinePainter::paint(const PaintInfo& paintInfo, const LayoutPoint& paintOf fset)
23 { 23 {
24 // FIXME: When Skia supports annotation rect covering (https://code.google.c om/p/skia/issues/detail?id=3872), 24 // FIXME: When Skia supports annotation rect covering (https://code.google.c om/p/skia/issues/detail?id=3872),
25 // this rect may be covered by foreground and descendant drawings. Then we m ay need a dedicated paint phase. 25 // this rect may be covered by foreground and descendant drawings. Then we m ay need a dedicated paint phase.
26 if (paintInfo.phase == PaintPhaseForeground && paintInfo.context->printing() ) 26 if (paintInfo.phase == PaintPhaseForeground && paintInfo.context->printing() )
27 ObjectPainter(m_layoutInline).addPDFURLRectIfNeeded(paintInfo, paintOffs et); 27 ObjectPainter(m_layoutInline).addPDFURLRectIfNeeded(paintInfo, paintOffs et);
28 28
29 LineBoxListPainter(*m_layoutInline.lineBoxes()).paint(&m_layoutInline, paint Info, paintOffset); 29 LineBoxListPainter(*m_layoutInline.lineBoxes()).paint(&m_layoutInline, paint Info, paintOffset);
30 } 30 }
31 31
32 LayoutRect InlinePainter::outlinePaintRect(const Vector<LayoutRect>& outlineRect s, const LayoutPoint& paintOffset) const
33 {
34 const ComputedStyle& style = m_layoutInline.styleRef();
35 int outlineOutset;
36 if (style.outlineStyleIsAuto())
37 outlineOutset = GraphicsContext::focusRingOutsetExtent(style.outlineOffs et(), style.outlineWidth());
38 else
39 outlineOutset = style.outlineSize();
40 LayoutRect outlineRect;
41 for (const LayoutRect& rect : outlineRects) {
42 LayoutRect inflatedRect(rect);
43 // Inflate the individual rects instead of the union, to avoid losing
44 // rects which have degenerate width/height (== isEmpty() true.)
45 inflatedRect.inflate(outlineOutset);
46 outlineRect.unite(inflatedRect);
47 }
48 outlineRect.moveBy(paintOffset);
49 return outlineRect;
50 }
51
32 void InlinePainter::paintOutline(const PaintInfo& paintInfo, const LayoutPoint& paintOffset) 52 void InlinePainter::paintOutline(const PaintInfo& paintInfo, const LayoutPoint& paintOffset)
33 { 53 {
34 const ComputedStyle& styleToUse = m_layoutInline.styleRef(); 54 const ComputedStyle& styleToUse = m_layoutInline.styleRef();
35 if (!styleToUse.hasOutline()) 55 if (!styleToUse.hasOutline())
36 return; 56 return;
37 57
38 if (styleToUse.outlineStyleIsAuto()) { 58 if (styleToUse.outlineStyleIsAuto()) {
39 if (LayoutTheme::theme().shouldDrawDefaultFocusRing(&m_layoutInline)) { 59 if (LayoutTheme::theme().shouldDrawDefaultFocusRing(&m_layoutInline)) {
40 Vector<LayoutRect> focusRingRects; 60 Vector<LayoutRect> focusRingRects;
41 m_layoutInline.addFocusRingRects(focusRingRects, paintOffset); 61 m_layoutInline.addFocusRingRects(focusRingRects, paintOffset);
42 LayoutRect focusRingBoundingRect;
43 for (const auto& rect : focusRingRects)
44 focusRingBoundingRect.unite(rect);
45 62
46 LayoutObjectDrawingRecorder recorder(*paintInfo.context, m_layoutInl ine, paintInfo.phase, focusRingBoundingRect); 63 LayoutObjectDrawingRecorder recorder(*paintInfo.context, m_layoutInl ine, paintInfo.phase, outlinePaintRect(focusRingRects, LayoutPoint()));
47 if (recorder.canUseCachedDrawing()) 64 if (recorder.canUseCachedDrawing())
48 return; 65 return;
49 66
50 // Only paint the focus ring by hand if the theme isn't able to draw the focus ring. 67 // Only paint the focus ring by hand if the theme isn't able to draw the focus ring.
51 ObjectPainter(m_layoutInline).paintFocusRing(paintInfo, styleToUse, focusRingRects); 68 ObjectPainter(m_layoutInline).paintFocusRing(paintInfo, styleToUse, focusRingRects);
52 } 69 }
53 return; 70 return;
54 } 71 }
55 72
56 if (styleToUse.outlineStyle() == BNONE) 73 if (styleToUse.outlineStyle() == BNONE)
57 return; 74 return;
58 75
59 Vector<LayoutRect> rects; 76 Vector<LayoutRect> rects;
60 77
61 rects.append(LayoutRect()); 78 rects.append(LayoutRect());
62 for (InlineFlowBox* curr = m_layoutInline.firstLineBox(); curr; curr = curr- >nextLineBox()) { 79 for (InlineFlowBox* curr = m_layoutInline.firstLineBox(); curr; curr = curr- >nextLineBox()) {
63 RootInlineBox& root = curr->root(); 80 RootInlineBox& root = curr->root();
64 LayoutUnit top = std::max<LayoutUnit>(root.lineTop(), curr->logicalTop() ); 81 LayoutUnit top = std::max<LayoutUnit>(root.lineTop(), curr->logicalTop() );
65 LayoutUnit bottom = std::min<LayoutUnit>(root.lineBottom(), curr->logica lBottom()); 82 LayoutUnit bottom = std::min<LayoutUnit>(root.lineBottom(), curr->logica lBottom());
66 rects.append(LayoutRect(curr->x(), top, curr->logicalWidth(), bottom - t op)); 83 rects.append(LayoutRect(curr->x(), top, curr->logicalWidth(), bottom - t op));
67 } 84 }
68 rects.append(LayoutRect()); 85 rects.append(LayoutRect());
69 86
70 Color outlineColor = m_layoutInline.resolveColor(styleToUse, CSSPropertyOutl ineColor); 87 Color outlineColor = m_layoutInline.resolveColor(styleToUse, CSSPropertyOutl ineColor);
71 bool useTransparencyLayer = outlineColor.hasAlpha(); 88 bool useTransparencyLayer = outlineColor.hasAlpha();
72 89
73 int outlineWidth = styleToUse.outlineWidth(); 90 LayoutObjectDrawingRecorder recorder(*paintInfo.context, m_layoutInline, pai ntInfo.phase, outlinePaintRect(rects, paintOffset));
74 LayoutRect bounds;
75 for (const auto& rect : rects) {
76 LayoutRect rectCopy(rect);
77 rectCopy.expand(LayoutSize(outlineWidth, outlineWidth));
78 bounds.unite(rectCopy);
79 }
80 bounds.moveBy(paintOffset);
81
82 LayoutObjectDrawingRecorder recorder(*paintInfo.context, m_layoutInline, pai ntInfo.phase, bounds);
83 if (recorder.canUseCachedDrawing()) 91 if (recorder.canUseCachedDrawing())
84 return; 92 return;
85 93
86 GraphicsContext* graphicsContext = paintInfo.context; 94 GraphicsContext* graphicsContext = paintInfo.context;
87 if (useTransparencyLayer) { 95 if (useTransparencyLayer) {
88 graphicsContext->beginLayer(static_cast<float>(outlineColor.alpha()) / 2 55); 96 graphicsContext->beginLayer(static_cast<float>(outlineColor.alpha()) / 2 55);
89 outlineColor = Color(outlineColor.red(), outlineColor.green(), outlineCo lor.blue()); 97 outlineColor = Color(outlineColor.red(), outlineColor.green(), outlineCo lor.blue());
90 } 98 }
91 99
92 for (unsigned i = 1; i < rects.size() - 1; i++) 100 for (unsigned i = 1; i < rects.size() - 1; i++)
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 pixelSnappedBox.maxX() + outlineWidth, 218 pixelSnappedBox.maxX() + outlineWidth,
211 pixelSnappedBox.maxY() + outlineWidth, 219 pixelSnappedBox.maxY() + outlineWidth,
212 BSBottom, outlineColor, outlineStyle, 220 BSBottom, outlineColor, outlineStyle,
213 outlineWidth, 221 outlineWidth,
214 outlineWidth, 222 outlineWidth,
215 antialias); 223 antialias);
216 } 224 }
217 } 225 }
218 226
219 } // namespace blink 227 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/paint/InlinePainter.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698