12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/contents_scaling_layer.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h"
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size ContentsScalingLayer::ComputeContentBoundsForScale(
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float scale_x,
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float scale_y) const {
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::ToCeiledSize(gfx::ScaleSize(bounds(), scale_x, scale_y));
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ContentsScalingLayer::ContentsScalingLayer()
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : last_update_contents_scale_x_(0.f),
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      last_update_contents_scale_y_(0.f) {}
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ContentsScalingLayer::~ContentsScalingLayer() {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentsScalingLayer::CalculateContentsScale(
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float ideal_contents_scale,
25b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    float device_scale_factor,
26b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    float page_scale_factor,
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool animating_transform_to_screen,
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float* contents_scale_x,
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float* contents_scale_y,
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Size* content_bounds) {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *contents_scale_x = ideal_contents_scale;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *contents_scale_y = ideal_contents_scale;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *content_bounds = ComputeContentBoundsForScale(
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ideal_contents_scale,
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ideal_contents_scale);
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool ContentsScalingLayer::Update(
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceUpdateQueue* queue,
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const OcclusionTracker* occlusion) {
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bool updated = Layer::Update(queue, occlusion);
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (draw_properties().contents_scale_x == last_update_contents_scale_x_ &&
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      draw_properties().contents_scale_y == last_update_contents_scale_y_)
45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return updated;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  last_update_contents_scale_x_ = draw_properties().contents_scale_x;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  last_update_contents_scale_y_ = draw_properties().contents_scale_y;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Invalidate the whole layer if scale changed.
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetNeedsDisplayRect(gfx::Rect(paint_properties().bounds));
51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return updated;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
55