// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_LAYOUT_LETTERBOXED_IMAGE_H_
#define COBALT_LAYOUT_LETTERBOXED_IMAGE_H_

#include <vector>

#include "base/optional.h"
#include "cobalt/math/rect_f.h"
#include "cobalt/math/size_f.h"

namespace cobalt {
namespace layout {

struct LetterboxDimensions {
  // The destination dimensions of the image such that its aspect ratio is
  // maintained.
  base::optional<math::RectF> image_rect;

  // A set of filling rectangles that pad the image.
  std::vector<math::RectF> fill_rects;
};

// This helper function will compute the dimensions of an image and filling
// rectangles such that the image appears at the correct aspect ratio within
// a letterboxed destination rectangle.  This function will return the
// dimensions to use for an image and all filling rectangles (which will
// presumably be filled as solid black) in order to create the letterbox effect.
// It does the above by the following steps:
// 2. If the area of the Image is 0, this function will return a single filling
//    rectangle covering the entire |destination_size|.
// 3. If the aspect ratio of the image is the same as |destination_size|, the
//    image will be stretched to fill the whole destination.
// 4. If the image is wider than the destination, it will be stretched to ensure
//    that its width is the same as the width of the destination.  The image
//    will be centered vertically and two filling rectangles placed on the top
//    and bottom to fill the blank.
// 5. Otherwise, the image is higher than the destination.  it will be stretched
//    to ensure that its height is the same as the height of the destination.
//    The image will be centered horizontally and two filling rectangles placed
//    on the left and right to fill the blank.
LetterboxDimensions GetLetterboxDimensions(const math::SizeF& image_size,
                                           const math::SizeF& destination_size);

}  // namespace layout
}  // namespace cobalt

#endif  // COBALT_LAYOUT_LETTERBOXED_IMAGE_H_
