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

Unified Diff: Source/core/paint/BlockPainter.cpp

Issue 1218013003: Keep a cache of caret painters to avoid recomputing all the time. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: a shade of deduplication blue 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/paint/BlockPainter.h ('k') | Source/core/paint/DeprecatedPaintLayerPainter.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/paint/BlockPainter.cpp
diff --git a/Source/core/paint/BlockPainter.cpp b/Source/core/paint/BlockPainter.cpp
index b14abc26e445cac2cb6b588a480afbd2942c75fd..09c36e7375ae38247ce0629c8f85c77b812bdb6b 100644
--- a/Source/core/paint/BlockPainter.cpp
+++ b/Source/core/paint/BlockPainter.cpp
@@ -16,6 +16,7 @@
#include "core/paint/InlinePainter.h"
#include "core/paint/LayoutObjectDrawingRecorder.h"
#include "core/paint/LineBoxListPainter.h"
+#include "core/paint/PaintDataCache.h"
#include "core/paint/PaintInfo.h"
#include "core/paint/ScopeRecorder.h"
#include "core/paint/ScrollRecorder.h"
@@ -53,7 +54,10 @@ void BlockPainter::paint(const PaintInfo& paintInfo, const LayoutPoint& paintOff
// There are some cases where not all clipped visual overflow is accounted for.
// FIXME: reduce the number of such cases.
ContentsClipBehavior contentsClipBehavior = ForceContentsClip;
- if (m_layoutBlock.hasOverflowClip() && !m_layoutBlock.hasControlClip() && !(m_layoutBlock.shouldPaintSelectionGaps() && originalPhase == PaintPhaseForeground) && !hasCaret())
+ if (m_layoutBlock.hasOverflowClip()
+ && !m_layoutBlock.hasControlClip()
+ && !(m_layoutBlock.shouldPaintSelectionGaps() && originalPhase == PaintPhaseForeground)
+ && !hasCaret(paintInfo.paintDataCache()))
contentsClipBehavior = SkipContentsClipIfPossible;
if (localPaintInfo.phase == PaintPhaseOutline) {
@@ -224,42 +228,26 @@ void BlockPainter::paintObject(const PaintInfo& paintInfo, const LayoutPoint& pa
// If the caret's node's layout object's containing block is this block, and the paint action is PaintPhaseForeground,
// then paint the caret.
- if (paintPhase == PaintPhaseForeground && hasCaret()) {
+ if (paintPhase == PaintPhaseForeground && hasCaret(paintInfo.paintDataCache())) {
LayoutObjectDrawingRecorder recorder(*paintInfo.context, m_layoutBlock, DisplayItem::Caret, visualOverflowRectWithPaintOffset(m_layoutBlock, paintOffset));
if (!recorder.canUseCachedDrawing())
paintCarets(paintInfo, paintOffset);
}
}
-static inline bool caretBrowsingEnabled(const Frame* frame)
-{
- Settings* settings = frame->settings();
- return settings && settings->caretBrowsingEnabled();
-}
-
-static inline bool hasCursorCaret(const FrameSelection& selection, const LayoutBlock* block, bool caretBrowsing)
-{
- return selection.caretLayoutObject() == block && (selection.hasEditableStyle() || caretBrowsing);
-}
-
-static inline bool hasDragCaret(const DragCaretController& dragCaretController, const LayoutBlock* block, bool caretBrowsing)
-{
- return dragCaretController.caretLayoutObject() == block && (dragCaretController.isContentEditable() || caretBrowsing);
-}
-
void BlockPainter::paintCarets(const PaintInfo& paintInfo, const LayoutPoint& paintOffset)
{
- bool caretBrowsing = caretBrowsingEnabled(m_layoutBlock.frame());
-
- FrameSelection& selection = m_layoutBlock.frame()->selection();
- if (hasCursorCaret(selection, &m_layoutBlock, caretBrowsing)) {
- selection.paintCaret(paintInfo.context, paintOffset, LayoutRect(paintInfo.rect));
- }
-
- DragCaretController& dragCaretController = m_layoutBlock.frame()->page()->dragCaretController();
- if (hasDragCaret(dragCaretController, &m_layoutBlock, caretBrowsing)) {
- dragCaretController.paintDragCaret(m_layoutBlock.frame(), paintInfo.context, paintOffset, LayoutRect(paintInfo.rect));
- }
+ bool hasCursorCaret = false;
+ bool hasDragCaret = false;
+ PaintDataCache localCache;
+ PaintDataCache* paintDataCache = paintInfo.paintDataCache() ? paintInfo.paintDataCache() : &localCache;
+ paintDataCache->getLayoutBlockCarets(m_layoutBlock, &hasCursorCaret, &hasDragCaret);
+ LocalFrame* frame = m_layoutBlock.frame();
+
+ if (hasCursorCaret)
+ frame->selection().paintCaret(paintInfo.context, paintOffset, LayoutRect(paintInfo.rect));
+ if (hasDragCaret)
+ frame->page()->dragCaretController().paintDragCaret(frame, paintInfo.context, paintOffset, LayoutRect(paintInfo.rect));
}
LayoutRect BlockPainter::overflowRectForPaintRejection() const
@@ -273,11 +261,11 @@ LayoutRect BlockPainter::overflowRectForPaintRejection() const
return overflowRect;
}
-bool BlockPainter::hasCaret() const
+bool BlockPainter::hasCaret(PaintDataCache* paintDataCache) const
{
- bool caretBrowsing = caretBrowsingEnabled(m_layoutBlock.frame());
- return hasCursorCaret(m_layoutBlock.frame()->selection(), &m_layoutBlock, caretBrowsing)
- || hasDragCaret(m_layoutBlock.frame()->page()->dragCaretController(), &m_layoutBlock, caretBrowsing);
+ if (paintDataCache)
+ return paintDataCache->layoutBlockHasCaret(m_layoutBlock);
+ return PaintDataCache().layoutBlockHasCaret(m_layoutBlock);
}
void BlockPainter::paintContents(const PaintInfo& paintInfo, const LayoutPoint& paintOffset)
« no previous file with comments | « Source/core/paint/BlockPainter.h ('k') | Source/core/paint/DeprecatedPaintLayerPainter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698