OLD | NEW |
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 "skia/ext/refptr.h" | 12 #include "skia/ext/refptr.h" |
12 #include "third_party/skia/include/core/SkCanvas.h" | 13 #include "third_party/skia/include/core/SkCanvas.h" |
13 #include "third_party/skia/include/core/SkSurface.h" | 14 #include "third_party/skia/include/core/SkSurface.h" |
14 #include "third_party/skia/include/utils/SkPaintFilterCanvas.h" | 15 #include "third_party/skia/include/utils/SkPaintFilterCanvas.h" |
15 | 16 |
16 namespace cc { | 17 namespace cc { |
17 | 18 |
18 TileTaskWorkerPool::TileTaskWorkerPool() {} | 19 TileTaskWorkerPool::TileTaskWorkerPool() {} |
19 | 20 |
20 TileTaskWorkerPool::~TileTaskWorkerPool() {} | 21 TileTaskWorkerPool::~TileTaskWorkerPool() {} |
(...skipping 16 matching lines...) Expand all Loading... |
37 } | 38 } |
38 } | 39 } |
39 | 40 |
40 namespace { | 41 namespace { |
41 | 42 |
42 bool IsSupportedPlaybackToMemoryFormat(ResourceFormat format) { | 43 bool IsSupportedPlaybackToMemoryFormat(ResourceFormat format) { |
43 switch (format) { | 44 switch (format) { |
44 case RGBA_4444: | 45 case RGBA_4444: |
45 case RGBA_8888: | 46 case RGBA_8888: |
46 case BGRA_8888: | 47 case BGRA_8888: |
| 48 case ETC1: |
47 return true; | 49 return true; |
48 case ALPHA_8: | 50 case ALPHA_8: |
49 case LUMINANCE_8: | 51 case LUMINANCE_8: |
50 case RGB_565: | 52 case RGB_565: |
51 case ETC1: | |
52 case RED_8: | 53 case RED_8: |
53 case LUMINANCE_F16: | 54 case LUMINANCE_F16: |
54 return false; | 55 return false; |
55 } | 56 } |
56 NOTREACHED(); | 57 NOTREACHED(); |
57 return false; | 58 return false; |
58 } | 59 } |
59 | 60 |
60 class SkipImageCanvas : public SkPaintFilterCanvas { | 61 class SkipImageCanvas : public SkPaintFilterCanvas { |
61 public: | 62 public: |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 const gfx::Rect& canvas_playback_rect, | 110 const gfx::Rect& canvas_playback_rect, |
110 float scale, | 111 float scale, |
111 bool include_images) { | 112 bool include_images) { |
112 TRACE_EVENT0("cc", "TileTaskWorkerPool::PlaybackToMemory"); | 113 TRACE_EVENT0("cc", "TileTaskWorkerPool::PlaybackToMemory"); |
113 | 114 |
114 DCHECK(IsSupportedPlaybackToMemoryFormat(format)) << format; | 115 DCHECK(IsSupportedPlaybackToMemoryFormat(format)) << format; |
115 | 116 |
116 // Uses kPremul_SkAlphaType since the result is not known to be opaque. | 117 // Uses kPremul_SkAlphaType since the result is not known to be opaque. |
117 SkImageInfo info = | 118 SkImageInfo info = |
118 SkImageInfo::MakeN32(size.width(), size.height(), kPremul_SkAlphaType); | 119 SkImageInfo::MakeN32(size.width(), size.height(), kPremul_SkAlphaType); |
119 SkColorType buffer_color_type = ResourceFormatToSkColorType(format); | |
120 bool needs_copy = buffer_color_type != info.colorType(); | |
121 | 120 |
122 // Use unknown pixel geometry to disable LCD text. | 121 // Use unknown pixel geometry to disable LCD text. |
123 SkSurfaceProps surface_props(0, kUnknown_SkPixelGeometry); | 122 SkSurfaceProps surface_props(0, kUnknown_SkPixelGeometry); |
124 if (raster_source->CanUseLCDText()) { | 123 if (raster_source->CanUseLCDText()) { |
125 // LegacyFontHost will get LCD text and skia figures out what type to use. | 124 // LegacyFontHost will get LCD text and skia figures out what type to use. |
126 surface_props = SkSurfaceProps(SkSurfaceProps::kLegacyFontHost_InitType); | 125 surface_props = SkSurfaceProps(SkSurfaceProps::kLegacyFontHost_InitType); |
127 } | 126 } |
128 | 127 |
129 if (!stride) | 128 if (!stride) |
130 stride = info.minRowBytes(); | 129 stride = info.minRowBytes(); |
131 DCHECK_GT(stride, 0u); | 130 DCHECK_GT(stride, 0u); |
132 | 131 |
133 if (!needs_copy) { | |
134 skia::RefPtr<SkSurface> surface = skia::AdoptRef( | |
135 SkSurface::NewRasterDirect(info, memory, stride, &surface_props)); | |
136 AutoSkipImageCanvas canvas(surface->getCanvas(), include_images); | |
137 raster_source->PlaybackToCanvas(canvas, canvas_bitmap_rect, | |
138 canvas_playback_rect, scale); | |
139 return; | |
140 } | |
141 | |
142 skia::RefPtr<SkSurface> surface = | |
143 skia::AdoptRef(SkSurface::NewRaster(info, &surface_props)); | |
144 AutoSkipImageCanvas canvas(surface->getCanvas(), include_images); | |
145 // TODO(reveman): Improve partial raster support by reducing the size of | |
146 // playback rect passed to PlaybackToCanvas. crbug.com/519070 | |
147 raster_source->PlaybackToCanvas(canvas, canvas_bitmap_rect, | |
148 canvas_bitmap_rect, scale); | |
149 | |
150 { | 132 { |
151 TRACE_EVENT0("cc", "TileTaskWorkerPool::PlaybackToMemory::ConvertPixels"); | 133 TRACE_EVENT0("cc", "TileTaskWorkerPool::PlaybackToMemory::ConvertPixels"); |
152 | 134 |
153 SkImageInfo dst_info = | 135 switch (format) { |
154 SkImageInfo::Make(info.width(), info.height(), buffer_color_type, | 136 case RGBA_8888: |
155 info.alphaType(), info.profileType()); | 137 case BGRA_8888: { |
156 bool rv = surface->getCanvas()->readPixels(dst_info, memory, stride, 0, 0); | 138 skia::RefPtr<SkSurface> surface = skia::AdoptRef( |
157 DCHECK(rv); | 139 SkSurface::NewRasterDirect(info, memory, stride, &surface_props)); |
| 140 AutoSkipImageCanvas canvas(surface->getCanvas(), include_images); |
| 141 raster_source->PlaybackToCanvas(canvas, canvas_bitmap_rect, |
| 142 canvas_playback_rect, scale); |
| 143 return; |
| 144 } |
| 145 case RGBA_4444: |
| 146 case ETC1: { |
| 147 skia::RefPtr<SkSurface> surface = |
| 148 skia::AdoptRef(SkSurface::NewRaster(info, &surface_props)); |
| 149 AutoSkipImageCanvas canvas(surface->getCanvas(), include_images); |
| 150 // TODO(reveman): Improve partial raster support by reducing the size of |
| 151 // playback rect passed to PlaybackToCanvas. crbug.com/519070 |
| 152 raster_source->PlaybackToCanvas(canvas, canvas_bitmap_rect, |
| 153 canvas_bitmap_rect, scale); |
| 154 |
| 155 if (format == ETC1) { |
| 156 DCHECK_EQ(size.width() % 4, 0); |
| 157 DCHECK_EQ(size.height() % 4, 0); |
| 158 scoped_ptr<TextureCompressor> texture_compressor = |
| 159 TextureCompressor::Create(TextureCompressor::kFormatETC1); |
| 160 texture_compressor->Compress( |
| 161 reinterpret_cast<const uint8_t*>( |
| 162 surface->peekPixels(nullptr, nullptr)), |
| 163 reinterpret_cast<uint8_t*>(memory), size.width(), size.height(), |
| 164 TextureCompressor::kQualityHigh); |
| 165 } else { |
| 166 SkImageInfo dst_info = SkImageInfo::Make( |
| 167 info.width(), info.height(), ResourceFormatToSkColorType(format), |
| 168 info.alphaType(), info.profileType()); |
| 169 bool rv = |
| 170 surface->getCanvas()->readPixels(dst_info, memory, stride, 0, 0); |
| 171 DCHECK(rv); |
| 172 } |
| 173 return; |
| 174 } |
| 175 case ALPHA_8: |
| 176 case LUMINANCE_8: |
| 177 case RGB_565: |
| 178 case RED_8: |
| 179 case LUMINANCE_F16: |
| 180 NOTREACHED(); |
| 181 return; |
| 182 } |
| 183 |
| 184 NOTREACHED(); |
158 } | 185 } |
159 } | 186 } |
160 | 187 |
161 } // namespace cc | 188 } // namespace cc |
OLD | NEW |