| 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 |