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

Side by Side Diff: cc/raster/tile_task_worker_pool.cc

Issue 1799883002: cc: Refactor SkipImageCanvas and create it during playback. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "cc/raster/tile_task_worker_pool.h" 5 #include "cc/raster/tile_task_worker_pool.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include "base/trace_event/trace_event.h" 9 #include "base/trace_event/trace_event.h"
10 #include "cc/playback/display_list_raster_source.h" 10 #include "cc/playback/display_list_raster_source.h"
11 #include "cc/raster/texture_compressor.h" 11 #include "cc/raster/texture_compressor.h"
12 #include "skia/ext/refptr.h" 12 #include "skia/ext/refptr.h"
13 #include "third_party/skia/include/core/SkCanvas.h" 13 #include "third_party/skia/include/core/SkCanvas.h"
14 #include "third_party/skia/include/core/SkSurface.h" 14 #include "third_party/skia/include/core/SkSurface.h"
15 #include "third_party/skia/include/utils/SkPaintFilterCanvas.h"
16 15
17 namespace cc { 16 namespace cc {
18 17
19 TileTaskWorkerPool::TileTaskWorkerPool() {} 18 TileTaskWorkerPool::TileTaskWorkerPool() {}
20 19
21 TileTaskWorkerPool::~TileTaskWorkerPool() {} 20 TileTaskWorkerPool::~TileTaskWorkerPool() {}
22 21
23 // static 22 // static
24 void TileTaskWorkerPool::ScheduleTasksOnOriginThread(TileTaskClient* client, 23 void TileTaskWorkerPool::ScheduleTasksOnOriginThread(TileTaskClient* client,
25 TaskGraph* graph) { 24 TaskGraph* graph) {
(...skipping 25 matching lines...) Expand all
51 case LUMINANCE_8: 50 case LUMINANCE_8:
52 case RGB_565: 51 case RGB_565:
53 case RED_8: 52 case RED_8:
54 case LUMINANCE_F16: 53 case LUMINANCE_F16:
55 return false; 54 return false;
56 } 55 }
57 NOTREACHED(); 56 NOTREACHED();
58 return false; 57 return false;
59 } 58 }
60 59
61 class SkipImageCanvas : public SkPaintFilterCanvas {
62 public:
63 explicit SkipImageCanvas(SkCanvas* canvas) : SkPaintFilterCanvas(canvas) {}
64
65 bool onFilter(SkTCopyOnFirstWrite<SkPaint>* paint, Type type) const override {
66 if (type == kBitmap_Type)
67 return false;
68
69 SkShader* shader = (*paint) ? (*paint)->getShader() : nullptr;
70 return !shader || !shader->isABitmap();
71 }
72
73 void onDrawPicture(const SkPicture* picture,
74 const SkMatrix* matrix,
75 const SkPaint* paint) override {
76 SkTCopyOnFirstWrite<SkPaint> filteredPaint(paint);
77
78 // To filter nested draws, we must unfurl pictures at this stage.
79 if (onFilter(&filteredPaint, kPicture_Type))
80 SkCanvas::onDrawPicture(picture, matrix, filteredPaint);
81 }
82 };
83
84 class AutoSkipImageCanvas {
85 public:
86 AutoSkipImageCanvas(SkCanvas* canvas, bool include_images) : canvas_(canvas) {
87 if (!include_images) {
88 skip_image_canvas_ = skia::AdoptRef(new SkipImageCanvas(canvas));
89 canvas_ = skip_image_canvas_.get();
90 }
91 }
92
93 operator SkCanvas*() { return canvas_; }
94
95 private:
96 skia::RefPtr<SkCanvas> skip_image_canvas_;
97 SkCanvas* canvas_;
98 };
99
100 } // anonymous namespace 60 } // anonymous namespace
101 61
102 // static 62 // static
103 void TileTaskWorkerPool::PlaybackToMemory( 63 void TileTaskWorkerPool::PlaybackToMemory(
104 void* memory, 64 void* memory,
105 ResourceFormat format, 65 ResourceFormat format,
106 const gfx::Size& size, 66 const gfx::Size& size,
107 size_t stride, 67 size_t stride,
108 const DisplayListRasterSource* raster_source, 68 const DisplayListRasterSource* raster_source,
109 const gfx::Rect& canvas_bitmap_rect, 69 const gfx::Rect& canvas_bitmap_rect,
(...skipping 17 matching lines...) Expand all
127 87
128 if (!stride) 88 if (!stride)
129 stride = info.minRowBytes(); 89 stride = info.minRowBytes();
130 DCHECK_GT(stride, 0u); 90 DCHECK_GT(stride, 0u);
131 91
132 switch (format) { 92 switch (format) {
133 case RGBA_8888: 93 case RGBA_8888:
134 case BGRA_8888: { 94 case BGRA_8888: {
135 skia::RefPtr<SkSurface> surface = skia::AdoptRef( 95 skia::RefPtr<SkSurface> surface = skia::AdoptRef(
136 SkSurface::NewRasterDirect(info, memory, stride, &surface_props)); 96 SkSurface::NewRasterDirect(info, memory, stride, &surface_props));
137 AutoSkipImageCanvas canvas(surface->getCanvas(), include_images); 97 raster_source->PlaybackToCanvas(surface->getCanvas(), canvas_bitmap_rect,
138 raster_source->PlaybackToCanvas(canvas, canvas_bitmap_rect, 98 canvas_playback_rect, scale,
139 canvas_playback_rect, scale); 99 include_images);
140 return; 100 return;
141 } 101 }
142 case RGBA_4444: 102 case RGBA_4444:
143 case ETC1: { 103 case ETC1: {
144 skia::RefPtr<SkSurface> surface = 104 skia::RefPtr<SkSurface> surface =
145 skia::AdoptRef(SkSurface::NewRaster(info, &surface_props)); 105 skia::AdoptRef(SkSurface::NewRaster(info, &surface_props));
146 AutoSkipImageCanvas canvas(surface->getCanvas(), include_images);
147 // TODO(reveman): Improve partial raster support by reducing the size of 106 // TODO(reveman): Improve partial raster support by reducing the size of
148 // playback rect passed to PlaybackToCanvas. crbug.com/519070 107 // playback rect passed to PlaybackToCanvas. crbug.com/519070
149 raster_source->PlaybackToCanvas(canvas, canvas_bitmap_rect, 108 raster_source->PlaybackToCanvas(surface->getCanvas(), canvas_bitmap_rect,
150 canvas_bitmap_rect, scale); 109 canvas_bitmap_rect, scale,
110 include_images);
151 111
152 if (format == ETC1) { 112 if (format == ETC1) {
153 TRACE_EVENT0("cc", 113 TRACE_EVENT0("cc",
154 "TileTaskWorkerPool::PlaybackToMemory::CompressETC1"); 114 "TileTaskWorkerPool::PlaybackToMemory::CompressETC1");
155 DCHECK_EQ(size.width() % 4, 0); 115 DCHECK_EQ(size.width() % 4, 0);
156 DCHECK_EQ(size.height() % 4, 0); 116 DCHECK_EQ(size.height() % 4, 0);
157 scoped_ptr<TextureCompressor> texture_compressor = 117 scoped_ptr<TextureCompressor> texture_compressor =
158 TextureCompressor::Create(TextureCompressor::kFormatETC1); 118 TextureCompressor::Create(TextureCompressor::kFormatETC1);
159 texture_compressor->Compress(reinterpret_cast<const uint8_t*>( 119 texture_compressor->Compress(reinterpret_cast<const uint8_t*>(
160 surface->peekPixels(nullptr, nullptr)), 120 surface->peekPixels(nullptr, nullptr)),
(...skipping 18 matching lines...) Expand all
179 case RED_8: 139 case RED_8:
180 case LUMINANCE_F16: 140 case LUMINANCE_F16:
181 NOTREACHED(); 141 NOTREACHED();
182 return; 142 return;
183 } 143 }
184 144
185 NOTREACHED(); 145 NOTREACHED();
186 } 146 }
187 147
188 } // namespace cc 148 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698