| Index: content/browser/android/in_process/synchronous_compositor_output_surface.cc
|
| diff --git a/content/browser/android/in_process/synchronous_compositor_output_surface.cc b/content/browser/android/in_process/synchronous_compositor_output_surface.cc
|
| index d5876e41a3ef8d7ab4a7002a001daff9553cd45a..b0e2d0e3a4918de3c5470bdce41541f0f433a657 100644
|
| --- a/content/browser/android/in_process/synchronous_compositor_output_surface.cc
|
| +++ b/content/browser/android/in_process/synchronous_compositor_output_surface.cc
|
| @@ -154,24 +154,33 @@ bool SynchronousCompositorOutputSurface::IsHwReady() {
|
| return context3d() != NULL;
|
| }
|
|
|
| +namespace {
|
| +void AdjustTransformForClip(gfx::Transform* transform, gfx::Rect clip) {
|
| + // The system-provided transform translates us from the screen origin to the
|
| + // origin of the clip rect, but CC's draw origin starts at the clip.
|
| + transform->matrix().postTranslate(-clip.x(), -clip.y(), 0);
|
| +}
|
| +} // namespace
|
| +
|
| bool SynchronousCompositorOutputSurface::DemandDrawSw(SkCanvas* canvas) {
|
| DCHECK(CalledOnValidThread());
|
| DCHECK(canvas);
|
| DCHECK(!current_sw_canvas_);
|
| current_sw_canvas_ = canvas;
|
|
|
| - SkRect canvas_clip;
|
| - gfx::Rect damage_area;
|
| - if (canvas->getClipBounds(&canvas_clip)) {
|
| - damage_area = gfx::ToEnclosedRect(gfx::SkRectToRectF(canvas_clip));
|
| - } else {
|
| - damage_area = gfx::Rect(kint16max, kint16max);
|
| - }
|
| + SkIRect canvas_clip;
|
| + canvas->getClipDeviceBounds(&canvas_clip);
|
| + gfx::Rect clip = gfx::SkIRectToRect(canvas_clip);
|
|
|
| - gfx::Transform transform;
|
| + gfx::Transform transform(gfx::Transform::kSkipInitialization);
|
| transform.matrix() = canvas->getTotalMatrix(); // Converts 3x3 matrix to 4x4.
|
| + AdjustTransformForClip(&transform, clip);
|
| +
|
| + surface_size_ = gfx::Size(canvas->getDeviceSize().width(),
|
| + canvas->getDeviceSize().height());
|
| + client_->SetExternalDrawConstraints(transform, clip);
|
|
|
| - InvokeComposite(transform, damage_area);
|
| + InvokeComposite(clip.size());
|
|
|
| bool finished_draw = current_sw_canvas_ == NULL;
|
| current_sw_canvas_ = NULL;
|
| @@ -179,9 +188,9 @@ bool SynchronousCompositorOutputSurface::DemandDrawSw(SkCanvas* canvas) {
|
| }
|
|
|
| bool SynchronousCompositorOutputSurface::DemandDrawHw(
|
| - gfx::Size view_size,
|
| + gfx::Size surface_size,
|
| const gfx::Transform& transform,
|
| - gfx::Rect damage_area) {
|
| + gfx::Rect clip) {
|
| DCHECK(CalledOnValidThread());
|
| DCHECK(client_);
|
| DCHECK(context3d());
|
| @@ -196,17 +205,18 @@ bool SynchronousCompositorOutputSurface::DemandDrawHw(
|
|
|
| did_swap_buffer_ = false;
|
|
|
| - InvokeComposite(transform, damage_area);
|
| + gfx::Transform adjusted_transform = transform;
|
| + AdjustTransformForClip(&adjusted_transform, clip);
|
| + surface_size_ = surface_size;
|
| + client_->SetExternalDrawConstraints(adjusted_transform, clip);
|
| + InvokeComposite(clip.size());
|
|
|
| return did_swap_buffer_;
|
| }
|
|
|
| void SynchronousCompositorOutputSurface::InvokeComposite(
|
| - const gfx::Transform& transform,
|
| - gfx::Rect damage_area) {
|
| - // TODO(boliu): This assumes |transform| is identity and |damage_area| is the
|
| - // whole view. Tracking bug to implement this: crbug.com/230463.
|
| - client_->SetNeedsRedrawRect(damage_area);
|
| + gfx::Size damage_size) {
|
| + client_->SetNeedsRedrawRect(gfx::Rect(damage_size));
|
| if (needs_begin_frame_)
|
| client_->BeginFrame(base::TimeTicks::Now());
|
| }
|
|
|