blob: 5dc77b0a291b740a1008d5eecf0831acb74e98fc [file] [log] [blame]
// Copyright 2015 The Cobalt Authors. 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_