Index: cc/raster/gpu_raster_buffer_provider.cc |
diff --git a/cc/raster/gpu_raster_buffer_provider.cc b/cc/raster/gpu_raster_buffer_provider.cc |
index 85a77c201b3e62858684bcaae2729df63f4e35dd..841158fbbcc2dfeb078695c50af0bc0e1def708e 100644 |
--- a/cc/raster/gpu_raster_buffer_provider.cc |
+++ b/cc/raster/gpu_raster_buffer_provider.cc |
@@ -13,6 +13,7 @@ |
#include "base/metrics/histogram_macros.h" |
#include "base/trace_event/trace_event.h" |
#include "cc/base/histograms.h" |
+#include "cc/base/scale_translate2d.h" |
#include "cc/playback/image_hijack_canvas.h" |
#include "cc/playback/raster_source.h" |
#include "cc/raster/scoped_gpu_raster.h" |
@@ -32,7 +33,7 @@ static sk_sp<SkPicture> PlaybackToPicture( |
const gfx::Size& resource_size, |
const gfx::Rect& raster_full_rect, |
const gfx::Rect& raster_dirty_rect, |
- float scale, |
+ const ScaleTranslate2d& transform, |
const RasterSource::PlaybackSettings& playback_settings) { |
// GPU raster doesn't do low res tiles, so should always include images. |
DCHECK(!playback_settings.skip_images); |
@@ -63,6 +64,9 @@ static sk_sp<SkPicture> PlaybackToPicture( |
sk_sp<SkCanvas> canvas = sk_ref_sp( |
recorder.beginRecording(resource_size.width(), resource_size.height())); |
canvas->save(); |
+ canvas->translate(-raster_full_rect.x(), -raster_full_rect.y()); |
+ canvas->clipRect(gfx::RectToSkRect(playback_rect)); |
+ transform.ApplyToCanvas(canvas.get()); |
// The GPU image decode controller assumes that Skia is done with an image |
// when playback is complete. However, in this case, where we play back to a |
@@ -74,7 +78,7 @@ static sk_sp<SkPicture> PlaybackToPicture( |
RasterSource::PlaybackSettings settings = playback_settings; |
settings.use_image_hijack_canvas = false; |
raster_source->PlaybackToCanvas(canvas.get(), raster_full_rect, playback_rect, |
- scale, settings); |
+ transform, settings); |
canvas->restore(); |
return recorder.finishRecordingAsPicture(); |
} |
@@ -146,13 +150,13 @@ void GpuRasterBufferProvider::RasterBufferImpl::Playback( |
const gfx::Rect& raster_full_rect, |
const gfx::Rect& raster_dirty_rect, |
uint64_t new_content_id, |
- float scale, |
+ const ScaleTranslate2d& transform, |
const RasterSource::PlaybackSettings& playback_settings) { |
TRACE_EVENT0("cc", "GpuRasterBuffer::Playback"); |
client_->PlaybackOnWorkerThread(&lock_, sync_token_, |
resource_has_previous_content_, raster_source, |
raster_full_rect, raster_dirty_rect, |
- new_content_id, scale, playback_settings); |
+ new_content_id, transform, playback_settings); |
} |
GpuRasterBufferProvider::GpuRasterBufferProvider( |
@@ -244,7 +248,7 @@ void GpuRasterBufferProvider::PlaybackOnWorkerThread( |
const gfx::Rect& raster_full_rect, |
const gfx::Rect& raster_dirty_rect, |
uint64_t new_content_id, |
- float scale, |
+ const ScaleTranslate2d& transform, |
const RasterSource::PlaybackSettings& playback_settings) { |
ContextProvider::ScopedContextLock scoped_context(worker_context_provider_); |
gpu::gles2::GLES2Interface* gl = scoped_context.ContextGL(); |
@@ -261,7 +265,7 @@ void GpuRasterBufferProvider::PlaybackOnWorkerThread( |
sk_sp<SkPicture> picture = PlaybackToPicture( |
raster_source, resource_has_previous_content, resource_lock->size(), |
- raster_full_rect, raster_dirty_rect, scale, playback_settings); |
+ raster_full_rect, raster_dirty_rect, transform, playback_settings); |
// Turn on distance fields for layers that have ever animated. |
bool use_distance_field_text = |