OLD | NEW |
---|---|
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 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
428 SkRect dest_rect = gfx::RectFToSkRect(QuadVertexRect()); | 428 SkRect dest_rect = gfx::RectFToSkRect(QuadVertexRect()); |
429 SkRect dest_visible_rect = gfx::RectFToSkRect(MathUtil::ScaleRectProportional( | 429 SkRect dest_visible_rect = gfx::RectFToSkRect(MathUtil::ScaleRectProportional( |
430 QuadVertexRect(), quad->rect, quad->visible_rect)); | 430 QuadVertexRect(), quad->rect, quad->visible_rect)); |
431 SkRect content_rect = SkRect::MakeWH(quad->rect.width(), quad->rect.height()); | 431 SkRect content_rect = SkRect::MakeWH(quad->rect.width(), quad->rect.height()); |
432 | 432 |
433 SkMatrix content_mat; | 433 SkMatrix content_mat; |
434 content_mat.setRectToRect(content_rect, dest_rect, | 434 content_mat.setRectToRect(content_rect, dest_rect, |
435 SkMatrix::kFill_ScaleToFit); | 435 SkMatrix::kFill_ScaleToFit); |
436 | 436 |
437 const SkBitmap* content = lock.sk_bitmap(); | 437 const SkBitmap* content = lock.sk_bitmap(); |
438 skia::RefPtr<SkShader> shader = skia::AdoptRef( | 438 |
439 SkShader::CreateBitmapShader(*content, | 439 SkBitmap filter_bitmap; |
440 SkShader::kClamp_TileMode, | 440 if (!quad->filters.IsEmpty()) { |
441 SkShader::kClamp_TileMode)); | 441 skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( |
442 quad->filters, content_texture->size()); | |
443 // TODO(ajuma): In addition origin translation, the canvas should also be | |
444 // scaled to accomodate device pixel ratio and pinch zoom. See | |
445 // crbug.com/281516 and crbug.com/281518. | |
446 if (filter) { | |
447 skia::RefPtr<SkBaseDevice> device = | |
448 skia::AdoptRef(current_canvas_->getDevice()->createCompatibleDevice( | |
449 SkBitmap::kARGB_8888_Config, | |
450 content_texture->size().width(), | |
451 content_texture->size().height(), | |
452 false)); | |
danakj
2013/10/16 15:48:59
can you use temporary variables so these boolean l
ajuma
2013/10/16 19:12:07
Done.
| |
453 SkCanvas canvas(device.get()); | |
454 SkPaint paint; | |
455 paint.setImageFilter(filter.get()); | |
456 canvas.clear(SK_ColorTRANSPARENT); | |
457 canvas.translate(SkIntToScalar(-quad->rect.origin().x()), | |
458 SkIntToScalar(-quad->rect.origin().y())); | |
459 canvas.drawSprite(*content, 0, 0, &paint); | |
460 filter_bitmap = device->accessBitmap(false); | |
Stephen White
2013/10/15 19:49:19
Might want to log a bug that there's a possible op
ajuma
2013/10/16 19:12:07
Done and added a TODO for this too.
| |
461 } | |
462 } | |
463 | |
464 skia::RefPtr<SkShader> shader; | |
465 if (filter_bitmap.isNull()) { | |
466 shader = skia::AdoptRef(SkShader::CreateBitmapShader( | |
467 *content, SkShader::kClamp_TileMode, SkShader::kClamp_TileMode)); | |
468 } else { | |
469 shader = skia::AdoptRef(SkShader::CreateBitmapShader( | |
470 filter_bitmap, SkShader::kClamp_TileMode, SkShader::kClamp_TileMode)); | |
471 } | |
442 shader->setLocalMatrix(content_mat); | 472 shader->setLocalMatrix(content_mat); |
443 current_paint_.setShader(shader.get()); | 473 current_paint_.setShader(shader.get()); |
444 | 474 |
445 // TODO(ajuma): Remove this condition once general CSS filters are working | |
446 // correctly (http://crbug.com/160302), and add corresponding pixel tests. | |
447 if (quad->filters.HasReferenceFilter()) { | |
448 skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( | |
449 quad->filters, content_texture->size()); | |
450 if (filter) | |
451 current_paint_.setImageFilter(filter.get()); | |
452 } | |
453 | |
454 if (quad->mask_resource_id) { | 475 if (quad->mask_resource_id) { |
455 ResourceProvider::ScopedReadLockSoftware mask_lock(resource_provider_, | 476 ResourceProvider::ScopedReadLockSoftware mask_lock(resource_provider_, |
456 quad->mask_resource_id); | 477 quad->mask_resource_id); |
457 | 478 |
458 const SkBitmap* mask = mask_lock.sk_bitmap(); | 479 const SkBitmap* mask = mask_lock.sk_bitmap(); |
459 | 480 |
460 SkRect mask_rect = SkRect::MakeXYWH( | 481 SkRect mask_rect = SkRect::MakeXYWH( |
461 quad->mask_uv_rect.x() * mask->width(), | 482 quad->mask_uv_rect.x() * mask->width(), |
462 quad->mask_uv_rect.y() * mask->height(), | 483 quad->mask_uv_rect.y() * mask->height(), |
463 quad->mask_uv_rect.width() * mask->width(), | 484 quad->mask_uv_rect.width() * mask->width(), |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
556 EnsureBackbuffer(); | 577 EnsureBackbuffer(); |
557 else | 578 else |
558 DiscardBackbuffer(); | 579 DiscardBackbuffer(); |
559 } | 580 } |
560 | 581 |
561 void SoftwareRenderer::SetDiscardBackBufferWhenNotVisible(bool discard) { | 582 void SoftwareRenderer::SetDiscardBackBufferWhenNotVisible(bool discard) { |
562 // The software renderer always discards the backbuffer when not visible. | 583 // The software renderer always discards the backbuffer when not visible. |
563 } | 584 } |
564 | 585 |
565 } // namespace cc | 586 } // namespace cc |
OLD | NEW |