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

Side by Side Diff: Source/platform/graphics/GraphicsContext.cpp

Issue 555703004: drawDisplayList should notify the region tracker. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Disable region tracking during record. 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 | « no previous file | 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 /* 1 /*
2 * Copyright (C) 2003, 2004, 2005, 2006, 2009 Apple Inc. All rights reserved. 2 * Copyright (C) 2003, 2004, 2005, 2006, 2009 Apple Inc. All rights reserved.
3 * Copyright (C) 2013 Google Inc. All rights reserved. 3 * Copyright (C) 2013 Google Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 93
94 struct GraphicsContext::CanvasSaveState { 94 struct GraphicsContext::CanvasSaveState {
95 CanvasSaveState(bool pendingSave, int count) 95 CanvasSaveState(bool pendingSave, int count)
96 : m_pendingSave(pendingSave), m_restoreCount(count) { } 96 : m_pendingSave(pendingSave), m_restoreCount(count) { }
97 97
98 bool m_pendingSave; 98 bool m_pendingSave;
99 int m_restoreCount; 99 int m_restoreCount;
100 }; 100 };
101 101
102 struct GraphicsContext::RecordingState { 102 struct GraphicsContext::RecordingState {
103 RecordingState(SkPictureRecorder* recorder, SkCanvas* currentCanvas, const S kMatrix& currentMatrix, PassRefPtr<DisplayList> displayList) 103 RecordingState(SkPictureRecorder* recorder, SkCanvas* currentCanvas, const S kMatrix& currentMatrix,
104 PassRefPtr<DisplayList> displayList, RegionTrackingMode trackingMode)
104 : m_displayList(displayList) 105 : m_displayList(displayList)
105 , m_recorder(recorder) 106 , m_recorder(recorder)
106 , m_savedCanvas(currentCanvas) 107 , m_savedCanvas(currentCanvas)
107 , m_savedMatrix(currentMatrix) { } 108 , m_savedMatrix(currentMatrix)
109 , m_regionTrackingMode(trackingMode) { }
108 110
109 ~RecordingState() { } 111 ~RecordingState() { }
110 112
111 RefPtr<DisplayList> m_displayList; 113 RefPtr<DisplayList> m_displayList;
112 SkPictureRecorder* m_recorder; 114 SkPictureRecorder* m_recorder;
113 SkCanvas* m_savedCanvas; 115 SkCanvas* m_savedCanvas;
114 const SkMatrix m_savedMatrix; 116 const SkMatrix m_savedMatrix;
117 RegionTrackingMode m_regionTrackingMode;
115 }; 118 };
116 119
117 GraphicsContext::GraphicsContext(SkCanvas* canvas, DisabledMode disableContextOr Painting) 120 GraphicsContext::GraphicsContext(SkCanvas* canvas, DisabledMode disableContextOr Painting)
118 : m_canvas(canvas) 121 : m_canvas(canvas)
119 , m_paintStateStack() 122 , m_paintStateStack()
120 , m_paintStateIndex(0) 123 , m_paintStateIndex(0)
121 , m_pendingCanvasSave(false) 124 , m_pendingCanvasSave(false)
122 , m_annotationMode(0) 125 , m_annotationMode(0)
123 #if ENABLE(ASSERT) 126 #if ENABLE(ASSERT)
124 , m_annotationCount(0) 127 , m_annotationCount(0)
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after
512 515
513 // We want the bounds offset mapped to (0, 0), such that the display lis t content 516 // We want the bounds offset mapped to (0, 0), such that the display lis t content
514 // is fully contained within the SkPictureRecord's bounds. 517 // is fully contained within the SkPictureRecord's bounds.
515 if (!toFloatSize(bounds.location()).isZero()) { 518 if (!toFloatSize(bounds.location()).isZero()) {
516 m_canvas->translate(-bounds.x(), -bounds.y()); 519 m_canvas->translate(-bounds.x(), -bounds.y());
517 // To avoid applying the offset repeatedly in getTotalMatrix(), we p re-apply it here. 520 // To avoid applying the offset repeatedly in getTotalMatrix(), we p re-apply it here.
518 savedMatrix.preTranslate(bounds.x(), bounds.y()); 521 savedMatrix.preTranslate(bounds.x(), bounds.y());
519 } 522 }
520 } 523 }
521 524
522 m_recordingStateStack.append(RecordingState(recorder, savedCanvas, savedMatr ix, displayList)); 525 m_recordingStateStack.append(RecordingState(recorder, savedCanvas, savedMatr ix, displayList,
526 static_cast<RegionTrackingMode>(m_regionTrackingMode)));
527
528 // Disable region tracking during recording.
529 setRegionTrackingMode(RegionTrackingDisabled);
523 } 530 }
524 531
525 PassRefPtr<DisplayList> GraphicsContext::endRecording() 532 PassRefPtr<DisplayList> GraphicsContext::endRecording()
526 { 533 {
527 ASSERT(!m_recordingStateStack.isEmpty()); 534 ASSERT(!m_recordingStateStack.isEmpty());
528 535
529 RecordingState recording = m_recordingStateStack.last(); 536 RecordingState recording = m_recordingStateStack.last();
530 if (!contextDisabled()) 537 if (!contextDisabled())
531 recording.m_displayList->setPicture(recording.m_recorder->endRecording() ); 538 recording.m_displayList->setPicture(recording.m_recorder->endRecording() );
532 539
533 m_canvas = recording.m_savedCanvas; 540 m_canvas = recording.m_savedCanvas;
541 setRegionTrackingMode(recording.m_regionTrackingMode);
534 delete recording.m_recorder; 542 delete recording.m_recorder;
535 m_recordingStateStack.removeLast(); 543 m_recordingStateStack.removeLast();
536 544
537 return recording.m_displayList; 545 return recording.m_displayList;
538 } 546 }
539 547
540 bool GraphicsContext::isRecording() const 548 bool GraphicsContext::isRecording() const
541 { 549 {
542 return !m_recordingStateStack.isEmpty(); 550 return !m_recordingStateStack.isEmpty();
543 } 551 }
(...skipping 19 matching lines...) Expand all
563 571
564 const FloatPoint& location = displayList->bounds().location(); 572 const FloatPoint& location = displayList->bounds().location();
565 if (location.x() || location.y()) { 573 if (location.x() || location.y()) {
566 SkMatrix m; 574 SkMatrix m;
567 m.setTranslate(location.x(), location.y()); 575 m.setTranslate(location.x(), location.y());
568 m_canvas->drawPicture(displayList->picture(), &m, 0); 576 m_canvas->drawPicture(displayList->picture(), &m, 0);
569 } else { 577 } else {
570 m_canvas->drawPicture(displayList->picture()); 578 m_canvas->drawPicture(displayList->picture());
571 } 579 }
572 580
581 if (regionTrackingEnabled()) {
582 // Since we don't track regions within display lists, conservatively
583 // mark the bounds as non-opaque.
584 SkPaint paint;
585 paint.setXfermodeMode(SkXfermode::kClear_Mode);
586 m_trackedRegion.didDrawBounded(this, displayList->bounds(), paint);
587 }
588
573 if (performClip || performTransform) 589 if (performClip || performTransform)
574 restore(); 590 restore();
575 } 591 }
576 592
577 void GraphicsContext::drawConvexPolygon(size_t numPoints, const FloatPoint* poin ts, bool shouldAntialias) 593 void GraphicsContext::drawConvexPolygon(size_t numPoints, const FloatPoint* poin ts, bool shouldAntialias)
578 { 594 {
579 if (contextDisabled()) 595 if (contextDisabled())
580 return; 596 return;
581 597
582 if (numPoints <= 1) 598 if (numPoints <= 1)
(...skipping 1397 matching lines...) Expand 10 before | Expand all | Expand 10 after
1980 // FIXME: This is to not break tests (it results in the filter bitmap fl ag 1996 // FIXME: This is to not break tests (it results in the filter bitmap fl ag
1981 // being set to true). We need to decide if we respect InterpolationNone 1997 // being set to true). We need to decide if we respect InterpolationNone
1982 // being returned from computeInterpolationQuality. 1998 // being returned from computeInterpolationQuality.
1983 resampling = InterpolationLow; 1999 resampling = InterpolationLow;
1984 } 2000 }
1985 resampling = limitInterpolationQuality(this, resampling); 2001 resampling = limitInterpolationQuality(this, resampling);
1986 paint->setFilterLevel(static_cast<SkPaint::FilterLevel>(resampling)); 2002 paint->setFilterLevel(static_cast<SkPaint::FilterLevel>(resampling));
1987 } 2003 }
1988 2004
1989 } // namespace blink 2005 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698