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

Side by Side Diff: cc/output/software_renderer.cc

Issue 12912010: cc: Convert non-const reference arguments to pointers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix ui/compositor Created 7 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 | Annotate | Revision Log
« no previous file with comments | « cc/output/software_renderer.h ('k') | cc/output/software_renderer_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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/output/software_renderer.h" 5 #include "cc/output/software_renderer.h"
6 6
7 #include "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "cc/base/math_util.h" 8 #include "cc/base/math_util.h"
9 #include "cc/output/compositor_frame.h" 9 #include "cc/output/compositor_frame.h"
10 #include "cc/output/compositor_frame_ack.h" 10 #include "cc/output/compositor_frame_ack.h"
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 SoftwareRenderer::~SoftwareRenderer() {} 88 SoftwareRenderer::~SoftwareRenderer() {}
89 89
90 const RendererCapabilities& SoftwareRenderer::Capabilities() const { 90 const RendererCapabilities& SoftwareRenderer::Capabilities() const {
91 return capabilities_; 91 return capabilities_;
92 } 92 }
93 93
94 void SoftwareRenderer::ViewportChanged() { 94 void SoftwareRenderer::ViewportChanged() {
95 output_device_->Resize(ViewportSize()); 95 output_device_->Resize(ViewportSize());
96 } 96 }
97 97
98 void SoftwareRenderer::BeginDrawingFrame(DrawingFrame& frame) { 98 void SoftwareRenderer::BeginDrawingFrame(DrawingFrame* frame) {
99 TRACE_EVENT0("cc", "SoftwareRenderer::BeginDrawingFrame"); 99 TRACE_EVENT0("cc", "SoftwareRenderer::BeginDrawingFrame");
100 root_canvas_ = output_device_->BeginPaint( 100 root_canvas_ = output_device_->BeginPaint(
101 gfx::ToEnclosingRect(frame.root_damage_rect)); 101 gfx::ToEnclosingRect(frame->root_damage_rect));
102 } 102 }
103 103
104 void SoftwareRenderer::FinishDrawingFrame(DrawingFrame& frame) { 104 void SoftwareRenderer::FinishDrawingFrame(DrawingFrame* frame) {
105 TRACE_EVENT0("cc", "SoftwareRenderer::FinishDrawingFrame"); 105 TRACE_EVENT0("cc", "SoftwareRenderer::FinishDrawingFrame");
106 current_framebuffer_lock_.reset(); 106 current_framebuffer_lock_.reset();
107 current_canvas_ = NULL; 107 current_canvas_ = NULL;
108 root_canvas_ = NULL; 108 root_canvas_ = NULL;
109 if (Settings().compositor_frame_message) { 109 if (Settings().compositor_frame_message) {
110 compositor_frame_.metadata = client_->MakeCompositorFrameMetadata(); 110 compositor_frame_.metadata = client_->MakeCompositorFrameMetadata();
111 output_device_->EndPaint(compositor_frame_.software_frame_data.get()); 111 output_device_->EndPaint(compositor_frame_.software_frame_data.get());
112 } else { 112 } else {
113 output_device_->EndPaint(NULL); 113 output_device_->EndPaint(NULL);
114 } 114 }
(...skipping 26 matching lines...) Expand all
141 // rendering, but the underlying effect we want is to clear any existing 141 // rendering, but the underlying effect we want is to clear any existing
142 // clipRect on the current SkCanvas. This is done by setting clipRect to 142 // clipRect on the current SkCanvas. This is done by setting clipRect to
143 // the viewport's dimensions. 143 // the viewport's dimensions.
144 is_scissor_enabled_ = false; 144 is_scissor_enabled_ = false;
145 SkDevice* device = current_canvas_->getDevice(); 145 SkDevice* device = current_canvas_->getDevice();
146 SetClipRect(gfx::Rect(device->width(), device->height())); 146 SetClipRect(gfx::Rect(device->width(), device->height()));
147 } 147 }
148 148
149 void SoftwareRenderer::Finish() {} 149 void SoftwareRenderer::Finish() {}
150 150
151 void SoftwareRenderer::BindFramebufferToOutputSurface(DrawingFrame& frame) { 151 void SoftwareRenderer::BindFramebufferToOutputSurface(DrawingFrame* frame) {
152 current_framebuffer_lock_.reset(); 152 current_framebuffer_lock_.reset();
153 current_canvas_ = root_canvas_; 153 current_canvas_ = root_canvas_;
154 } 154 }
155 155
156 bool SoftwareRenderer::BindFramebufferToTexture( 156 bool SoftwareRenderer::BindFramebufferToTexture(
157 DrawingFrame& frame, 157 DrawingFrame* frame,
158 const ScopedResource* texture, 158 const ScopedResource* texture,
159 gfx::Rect framebuffer_rect) { 159 gfx::Rect framebuffer_rect) {
160 current_framebuffer_lock_ = make_scoped_ptr( 160 current_framebuffer_lock_ = make_scoped_ptr(
161 new ResourceProvider::ScopedWriteLockSoftware( 161 new ResourceProvider::ScopedWriteLockSoftware(
162 resource_provider_, texture->id())); 162 resource_provider_, texture->id()));
163 current_canvas_ = current_framebuffer_lock_->sk_canvas(); 163 current_canvas_ = current_framebuffer_lock_->sk_canvas();
164 InitializeMatrices(frame, framebuffer_rect, false); 164 InitializeMatrices(frame, framebuffer_rect, false);
165 SetDrawViewportSize(framebuffer_rect.size()); 165 SetDrawViewportSize(framebuffer_rect.size());
166 166
167 return true; 167 return true;
(...skipping 15 matching lines...) Expand all
183 183
184 void SoftwareRenderer::ClearCanvas(SkColor color) { 184 void SoftwareRenderer::ClearCanvas(SkColor color) {
185 // SkCanvas::clear doesn't respect the current clipping region 185 // SkCanvas::clear doesn't respect the current clipping region
186 // so we SkCanvas::drawColor instead if scissoring is active. 186 // so we SkCanvas::drawColor instead if scissoring is active.
187 if (is_scissor_enabled_) 187 if (is_scissor_enabled_)
188 current_canvas_->drawColor(color, SkXfermode::kSrc_Mode); 188 current_canvas_->drawColor(color, SkXfermode::kSrc_Mode);
189 else 189 else
190 current_canvas_->clear(color); 190 current_canvas_->clear(color);
191 } 191 }
192 192
193 void SoftwareRenderer::ClearFramebuffer(DrawingFrame& frame) { 193 void SoftwareRenderer::ClearFramebuffer(DrawingFrame* frame) {
194 if (frame.current_render_pass->has_transparent_background) { 194 if (frame->current_render_pass->has_transparent_background) {
195 ClearCanvas(SkColorSetARGB(0, 0, 0, 0)); 195 ClearCanvas(SkColorSetARGB(0, 0, 0, 0));
196 } else { 196 } else {
197 #ifndef NDEBUG 197 #ifndef NDEBUG
198 // On DEBUG builds, opaque render passes are cleared to blue 198 // On DEBUG builds, opaque render passes are cleared to blue
199 // to easily see regions that were not drawn on the screen. 199 // to easily see regions that were not drawn on the screen.
200 ClearCanvas(SkColorSetARGB(255, 0, 0, 255)); 200 ClearCanvas(SkColorSetARGB(255, 0, 0, 255));
201 #endif 201 #endif
202 } 202 }
203 } 203 }
204 204
205 void SoftwareRenderer::SetDrawViewportSize(gfx::Size viewport_size) {} 205 void SoftwareRenderer::SetDrawViewportSize(gfx::Size viewport_size) {}
206 206
207 bool SoftwareRenderer::IsSoftwareResource( 207 bool SoftwareRenderer::IsSoftwareResource(
208 ResourceProvider::ResourceId resource_id) const { 208 ResourceProvider::ResourceId resource_id) const {
209 switch (resource_provider_->GetResourceType(resource_id)) { 209 switch (resource_provider_->GetResourceType(resource_id)) {
210 case ResourceProvider::GLTexture: 210 case ResourceProvider::GLTexture:
211 return false; 211 return false;
212 case ResourceProvider::Bitmap: 212 case ResourceProvider::Bitmap:
213 return true; 213 return true;
214 } 214 }
215 215
216 LOG(FATAL) << "Invalid resource type."; 216 LOG(FATAL) << "Invalid resource type.";
217 return false; 217 return false;
218 } 218 }
219 219
220 void SoftwareRenderer::DoDrawQuad(DrawingFrame& frame, const DrawQuad* quad) { 220 void SoftwareRenderer::DoDrawQuad(DrawingFrame* frame, const DrawQuad* quad) {
221 TRACE_EVENT0("cc", "SoftwareRenderer::DoDrawQuad"); 221 TRACE_EVENT0("cc", "SoftwareRenderer::DoDrawQuad");
222 gfx::Transform quad_rect_matrix; 222 gfx::Transform quad_rect_matrix;
223 QuadRectTransform(&quad_rect_matrix, quad->quadTransform(), quad->rect); 223 QuadRectTransform(&quad_rect_matrix, quad->quadTransform(), quad->rect);
224 gfx::Transform contents_device_transform = 224 gfx::Transform contents_device_transform =
225 frame.window_matrix * frame.projection_matrix * quad_rect_matrix; 225 frame->window_matrix * frame->projection_matrix * quad_rect_matrix;
226 contents_device_transform.FlattenTo2d(); 226 contents_device_transform.FlattenTo2d();
227 SkMatrix sk_device_matrix; 227 SkMatrix sk_device_matrix;
228 ToSkMatrix(&sk_device_matrix, contents_device_transform); 228 ToSkMatrix(&sk_device_matrix, contents_device_transform);
229 current_canvas_->setMatrix(sk_device_matrix); 229 current_canvas_->setMatrix(sk_device_matrix);
230 230
231 current_paint_.reset(); 231 current_paint_.reset();
232 if (!IsScaleAndTranslate(sk_device_matrix)) { 232 if (!IsScaleAndTranslate(sk_device_matrix)) {
233 current_paint_.setAntiAlias(true); 233 current_paint_.setAntiAlias(true);
234 current_paint_.setFilterBitmap(true); 234 current_paint_.setFilterBitmap(true);
235 } 235 }
(...skipping 22 matching lines...) Expand all
258 DrawRenderPassQuad(frame, RenderPassDrawQuad::MaterialCast(quad)); 258 DrawRenderPassQuad(frame, RenderPassDrawQuad::MaterialCast(quad));
259 break; 259 break;
260 default: 260 default:
261 DrawUnsupportedQuad(frame, quad); 261 DrawUnsupportedQuad(frame, quad);
262 break; 262 break;
263 } 263 }
264 264
265 current_canvas_->resetMatrix(); 265 current_canvas_->resetMatrix();
266 } 266 }
267 267
268 void SoftwareRenderer::DrawDebugBorderQuad(const DrawingFrame& frame, 268 void SoftwareRenderer::DrawDebugBorderQuad(const DrawingFrame* frame,
269 const DebugBorderDrawQuad* quad) { 269 const DebugBorderDrawQuad* quad) {
270 // We need to apply the matrix manually to have pixel-sized stroke width. 270 // We need to apply the matrix manually to have pixel-sized stroke width.
271 SkPoint vertices[4]; 271 SkPoint vertices[4];
272 gfx::RectFToSkRect(QuadVertexRect()).toQuad(vertices); 272 gfx::RectFToSkRect(QuadVertexRect()).toQuad(vertices);
273 SkPoint transformed_vertices[4]; 273 SkPoint transformed_vertices[4];
274 current_canvas_->getTotalMatrix().mapPoints(transformed_vertices, 274 current_canvas_->getTotalMatrix().mapPoints(transformed_vertices,
275 vertices, 275 vertices,
276 4); 276 4);
277 current_canvas_->resetMatrix(); 277 current_canvas_->resetMatrix();
278 278
279 current_paint_.setColor(quad->color); 279 current_paint_.setColor(quad->color);
280 current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color)); 280 current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color));
281 current_paint_.setStyle(SkPaint::kStroke_Style); 281 current_paint_.setStyle(SkPaint::kStroke_Style);
282 current_paint_.setStrokeWidth(quad->width); 282 current_paint_.setStrokeWidth(quad->width);
283 current_canvas_->drawPoints(SkCanvas::kPolygon_PointMode, 283 current_canvas_->drawPoints(SkCanvas::kPolygon_PointMode,
284 4, transformed_vertices, current_paint_); 284 4, transformed_vertices, current_paint_);
285 } 285 }
286 286
287 void SoftwareRenderer::DrawSolidColorQuad(const DrawingFrame& frame, 287 void SoftwareRenderer::DrawSolidColorQuad(const DrawingFrame* frame,
288 const SolidColorDrawQuad* quad) { 288 const SolidColorDrawQuad* quad) {
289 current_paint_.setColor(quad->color); 289 current_paint_.setColor(quad->color);
290 current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color)); 290 current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color));
291 current_canvas_->drawRect(gfx::RectFToSkRect(QuadVertexRect()), 291 current_canvas_->drawRect(gfx::RectFToSkRect(QuadVertexRect()),
292 current_paint_); 292 current_paint_);
293 } 293 }
294 294
295 void SoftwareRenderer::DrawTextureQuad(const DrawingFrame& frame, 295 void SoftwareRenderer::DrawTextureQuad(const DrawingFrame* frame,
296 const TextureDrawQuad* quad) { 296 const TextureDrawQuad* quad) {
297 if (!IsSoftwareResource(quad->resource_id)) { 297 if (!IsSoftwareResource(quad->resource_id)) {
298 DrawUnsupportedQuad(frame, quad); 298 DrawUnsupportedQuad(frame, quad);
299 return; 299 return;
300 } 300 }
301 301
302 // FIXME: Add support for non-premultiplied alpha. 302 // FIXME: Add support for non-premultiplied alpha.
303 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_, 303 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_,
304 quad->resource_id); 304 quad->resource_id);
305 const SkBitmap* bitmap = lock.sk_bitmap(); 305 const SkBitmap* bitmap = lock.sk_bitmap();
306 gfx::RectF uv_rect = gfx::ScaleRect(gfx::BoundingRect(quad->uv_top_left, 306 gfx::RectF uv_rect = gfx::ScaleRect(gfx::BoundingRect(quad->uv_top_left,
307 quad->uv_bottom_right), 307 quad->uv_bottom_right),
308 bitmap->width(), 308 bitmap->width(),
309 bitmap->height()); 309 bitmap->height());
310 SkRect sk_uv_rect = gfx::RectFToSkRect(uv_rect); 310 SkRect sk_uv_rect = gfx::RectFToSkRect(uv_rect);
311 if (quad->flipped) 311 if (quad->flipped)
312 current_canvas_->scale(1, -1); 312 current_canvas_->scale(1, -1);
313 current_canvas_->drawBitmapRectToRect(*bitmap, &sk_uv_rect, 313 current_canvas_->drawBitmapRectToRect(*bitmap, &sk_uv_rect,
314 gfx::RectFToSkRect(QuadVertexRect()), 314 gfx::RectFToSkRect(QuadVertexRect()),
315 &current_paint_); 315 &current_paint_);
316 } 316 }
317 317
318 void SoftwareRenderer::DrawTileQuad(const DrawingFrame& frame, 318 void SoftwareRenderer::DrawTileQuad(const DrawingFrame* frame,
319 const TileDrawQuad* quad) { 319 const TileDrawQuad* quad) {
320 DCHECK(IsSoftwareResource(quad->resource_id)); 320 DCHECK(IsSoftwareResource(quad->resource_id));
321 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_, 321 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_,
322 quad->resource_id); 322 quad->resource_id);
323 323
324 SkRect uv_rect = gfx::RectFToSkRect(quad->tex_coord_rect); 324 SkRect uv_rect = gfx::RectFToSkRect(quad->tex_coord_rect);
325 current_paint_.setFilterBitmap(true); 325 current_paint_.setFilterBitmap(true);
326 current_canvas_->drawBitmapRectToRect(*lock.sk_bitmap(), &uv_rect, 326 current_canvas_->drawBitmapRectToRect(*lock.sk_bitmap(), &uv_rect,
327 gfx::RectFToSkRect(QuadVertexRect()), 327 gfx::RectFToSkRect(QuadVertexRect()),
328 &current_paint_); 328 &current_paint_);
329 } 329 }
330 330
331 void SoftwareRenderer::DrawRenderPassQuad(const DrawingFrame& frame, 331 void SoftwareRenderer::DrawRenderPassQuad(const DrawingFrame* frame,
332 const RenderPassDrawQuad* quad) { 332 const RenderPassDrawQuad* quad) {
333 CachedResource* content_texture = 333 CachedResource* content_texture =
334 render_pass_textures_.get(quad->render_pass_id); 334 render_pass_textures_.get(quad->render_pass_id);
335 if (!content_texture || !content_texture->id()) 335 if (!content_texture || !content_texture->id())
336 return; 336 return;
337 337
338 DCHECK(IsSoftwareResource(content_texture->id())); 338 DCHECK(IsSoftwareResource(content_texture->id()));
339 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_, 339 ResourceProvider::ScopedReadLockSoftware lock(resource_provider_,
340 content_texture->id()); 340 content_texture->id());
341 341
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 mask_rasterizer->addLayer(mask_paint); 387 mask_rasterizer->addLayer(mask_paint);
388 388
389 current_paint_.setRasterizer(mask_rasterizer.get()); 389 current_paint_.setRasterizer(mask_rasterizer.get());
390 current_canvas_->drawRect(dest_rect, current_paint_); 390 current_canvas_->drawRect(dest_rect, current_paint_);
391 } else { 391 } else {
392 // FIXME: Apply background filters and blend with content 392 // FIXME: Apply background filters and blend with content
393 current_canvas_->drawRect(dest_rect, current_paint_); 393 current_canvas_->drawRect(dest_rect, current_paint_);
394 } 394 }
395 } 395 }
396 396
397 void SoftwareRenderer::DrawUnsupportedQuad(const DrawingFrame& frame, 397 void SoftwareRenderer::DrawUnsupportedQuad(const DrawingFrame* frame,
398 const DrawQuad* quad) { 398 const DrawQuad* quad) {
399 #ifndef NDEBUG 399 #ifndef NDEBUG
400 current_paint_.setColor(SK_ColorWHITE); 400 current_paint_.setColor(SK_ColorWHITE);
401 #else 401 #else
402 current_paint_.setColor(SK_ColorMAGENTA); 402 current_paint_.setColor(SK_ColorMAGENTA);
403 #endif 403 #endif
404 current_paint_.setAlpha(quad->opacity() * 255); 404 current_paint_.setAlpha(quad->opacity() * 255);
405 current_canvas_->drawRect(gfx::RectFToSkRect(QuadVertexRect()), 405 current_canvas_->drawRect(gfx::RectFToSkRect(QuadVertexRect()),
406 current_paint_); 406 current_paint_);
407 } 407 }
408 408
409 void SoftwareRenderer::GetFramebufferPixels(void* pixels, gfx::Rect rect) { 409 void SoftwareRenderer::GetFramebufferPixels(void* pixels, gfx::Rect rect) {
410 TRACE_EVENT0("cc", "SoftwareRenderer::GetFramebufferPixels"); 410 TRACE_EVENT0("cc", "SoftwareRenderer::GetFramebufferPixels");
411 SkBitmap subset_bitmap; 411 SkBitmap subset_bitmap;
412 output_device_->CopyToBitmap(rect, &subset_bitmap); 412 output_device_->CopyToBitmap(rect, &subset_bitmap);
413 subset_bitmap.copyPixelsTo(pixels, 413 subset_bitmap.copyPixelsTo(pixels,
414 4 * rect.width() * rect.height(), 414 4 * rect.width() * rect.height(),
415 4 * rect.width()); 415 4 * rect.width());
416 } 416 }
417 417
418 void SoftwareRenderer::SetVisible(bool visible) { 418 void SoftwareRenderer::SetVisible(bool visible) {
419 if (visible_ == visible) 419 if (visible_ == visible)
420 return; 420 return;
421 visible_ = visible; 421 visible_ = visible;
422 } 422 }
423 423
424 } // namespace cc 424 } // namespace cc
OLDNEW
« no previous file with comments | « cc/output/software_renderer.h ('k') | cc/output/software_renderer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698