Chromium Code Reviews| Index: ui/views/view.cc |
| diff --git a/ui/views/view.cc b/ui/views/view.cc |
| index 6d1e20b652f869ce99ef5b48a7a5a2b67f14fd1f..2afa86ee1d72f881ebf6d4fa68fb22fe7ba490c7 100644 |
| --- a/ui/views/view.cc |
| +++ b/ui/views/view.cc |
| @@ -838,33 +838,35 @@ void View::SchedulePaintInRect(const gfx::Rect& rect) { |
| void View::Paint(const ui::PaintContext& parent_context) { |
| if (!ShouldPaint()) |
| return; |
| - |
| - ui::PaintContext context(parent_context, GetPaintContextOffset()); |
| + ui::PaintContext context(parent_context, GetPaintContextBounds(), |
| + GetContextScaleType()); |
| bool is_invalidated = true; |
| - if (context.CanCheckInvalid()) { |
| + if (context.CanCheckRepaint()) { |
| #if DCHECK_IS_ON() |
| - gfx::Vector2d offset; |
| - context.Visited(this); |
| - View* view = this; |
| - while (view->parent() && !view->layer()) { |
| - DCHECK(view->GetTransform().IsIdentity()); |
| - offset += view->GetMirroredPosition().OffsetFromOrigin(); |
| - view = view->parent(); |
| + if (!context.IsPixelCanvas()) { |
| + gfx::Vector2d offset; |
| + context.Visited(this); |
| + View* view = this; |
| + while (view->parent() && !view->layer()) { |
| + DCHECK(view->GetTransform().IsIdentity()); |
| + offset += view->GetMirroredPosition().OffsetFromOrigin(); |
| + view = view->parent(); |
| + } |
| + // The offset in the PaintContext should be the offset up to the paint |
| + // root, which we compute and verify here. |
| + DCHECK_EQ(context.PaintOffset().x(), offset.x()); |
| + DCHECK_EQ(context.PaintOffset().y(), offset.y()); |
| + // The above loop will stop when |view| is the paint root, which should be |
| + // the root of the current paint walk, as verified by storing the root in |
| + // the PaintContext. |
| + DCHECK_EQ(context.RootVisited(), view); |
| } |
| - // The offset in the PaintContext should be the offset up to the paint root, |
| - // which we compute and verify here. |
| - DCHECK_EQ(context.PaintOffset().x(), offset.x()); |
| - DCHECK_EQ(context.PaintOffset().y(), offset.y()); |
| - // The above loop will stop when |view| is the paint root, which should be |
| - // the root of the current paint walk, as verified by storing the root in |
| - // the PaintContext. |
| - DCHECK_EQ(context.RootVisited(), view); |
| #endif |
| // If the View wasn't invalidated, don't waste time painting it, the output |
| // would be culled. |
| - is_invalidated = context.IsRectInvalid(GetLocalBounds()); |
| + is_invalidated = context.ShouldRepaint(); |
| } |
| TRACE_EVENT1("views", "View::Paint", "class", GetClassName()); |
| @@ -880,22 +882,25 @@ void View::Paint(const ui::PaintContext& parent_context) { |
| // into consideration whether or not the View uses a right-to-left layout so |
| // that we paint the View in its mirrored position if need be. |
| if (clip_path_.isEmpty()) { |
| - clip_recorder.ClipRect(GetMirroredBounds()); |
| + clip_recorder.ClipRect(context.pixel_bounds()); |
| } else { |
| gfx::Path clip_path_in_parent = clip_path_; |
| clip_path_in_parent.offset(GetMirroredX(), y()); |
| + clip_path_in_parent.transform(SkMatrix::MakeScale( |
| + SkFloatToScalar(parent_context.effective_scale_factor_x()), |
| + SkFloatToScalar(parent_context.effective_scale_factor_y()))); |
|
oshima
2017/06/15 22:59:13
shouldn't this match the scale type requested?
malaykeshav
2017/06/16 20:41:58
effective_scale_factor_x() and effective_scale_fac
|
| clip_recorder.ClipPathWithAntiAliasing(clip_path_in_parent); |
| } |
| } |
| ui::TransformRecorder transform_recorder(context); |
| - SetupTransformRecorderForPainting(&transform_recorder); |
| + SetupTransformRecorderForPainting(&transform_recorder, context); |
| // Note that the cache is not aware of the offset of the view |
| // relative to the parent since painting is always done relative to |
| // the top left of the individual view. |
| - if (is_invalidated || !paint_cache_.UseCache(context, size())) { |
| - ui::PaintRecorder recorder(context, size(), &paint_cache_); |
| + if (is_invalidated || !paint_cache_.UseCache(context, context.pixel_size())) { |
| + ui::PaintRecorder recorder(context, context.pixel_size(), &paint_cache_); |
| gfx::Canvas* canvas = recorder.canvas(); |
| gfx::ScopedRTLFlipCanvas scoped_canvas(canvas, width(), |
| flip_canvas_on_paint_for_rtl_ui_); |
| @@ -1482,6 +1487,10 @@ bool View::HasObserver(const ViewObserver* observer) const { |
| return observers_.HasObserver(observer); |
| } |
| +int View::GetContextScaleType() const { |
| + return ui::PaintContext::SCALE_TO_FIT; |
| +} |
| + |
| //////////////////////////////////////////////////////////////////////////////// |
| // View, protected: |
| @@ -1959,15 +1968,16 @@ bool View::ShouldPaint() const { |
| return visible_ && !size().IsEmpty(); |
| } |
| -gfx::Vector2d View::GetPaintContextOffset() const { |
| +gfx::Rect View::GetPaintContextBounds() const { |
| // If the View has a layer() then it is a paint root. Otherwise, we need to |
| // add the offset from the parent into the total offset from the paint root. |
| DCHECK(layer() || parent() || origin() == gfx::Point()); |
| - return layer() ? gfx::Vector2d() : GetMirroredPosition().OffsetFromOrigin(); |
| + return layer() ? GetLocalBounds() : GetMirroredBounds(); |
| } |
| void View::SetupTransformRecorderForPainting( |
| - ui::TransformRecorder* recorder) const { |
| + ui::TransformRecorder* recorder, |
| + const ui::PaintContext& context) const { |
| // If the view is backed by a layer, it should paint with itself as the origin |
| // rather than relative to its parent. |
| if (layer()) |
| @@ -1976,10 +1986,9 @@ void View::SetupTransformRecorderForPainting( |
| // Translate the graphics such that 0,0 corresponds to where this View is |
| // located relative to its parent. |
| gfx::Transform transform_from_parent; |
| - gfx::Vector2d offset_from_parent = GetMirroredPosition().OffsetFromOrigin(); |
| + gfx::Vector2d offset_from_parent = context.pixel_bounds().OffsetFromOrigin(); |
|
oshima
2017/06/15 22:59:13
Don't you have to mirror this for RTL?
malaykeshav
2017/06/16 20:41:58
context.pixel_bounds() is already mirrored since w
|
| transform_from_parent.Translate(offset_from_parent.x(), |
| offset_from_parent.y()); |
| - transform_from_parent.PreconcatTransform(GetTransform()); |
| recorder->Transform(transform_from_parent); |
| } |
| @@ -2004,14 +2013,15 @@ void View::PaintDebugRects(const ui::PaintContext& parent_context) { |
| if (!ShouldPaint()) |
| return; |
| - ui::PaintContext context(parent_context, GetPaintContextOffset()); |
| + ui::PaintContext context(parent_context, GetPaintContextBounds(), |
| + GetContextScaleType()); |
| ui::TransformRecorder transform_recorder(context); |
| - SetupTransformRecorderForPainting(&transform_recorder); |
| + SetupTransformRecorderForPainting(&transform_recorder, context); |
| RecursivePaintHelper(&View::PaintDebugRects, context); |
| // Draw outline rects for debugging. |
| - ui::PaintRecorder recorder(context, size()); |
| + ui::PaintRecorder recorder(context, context.pixel_size(), &paint_cache_); |
| gfx::Canvas* canvas = recorder.canvas(); |
| const float scale = canvas->UndoDeviceScaleFactor(); |
| gfx::RectF outline_rect(ScaleToEnclosedRect(GetLocalBounds(), scale)); |