// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#pragma once

#include "flutter/fml/logging.h"

#include <cstdint>

namespace impeller {

struct IPoint16 {
  int16_t x() const { return x_; }
  int16_t y() const { return y_; }

  int16_t x_;
  int16_t y_;
};

//------------------------------------------------------------------------------
/// @brief      Packs rectangles into a specified area without rotating them.
///
class RectanglePacker {
 public:
  //----------------------------------------------------------------------------
  /// @brief     Return an empty packer with area specified by width and height.
  ///
  static RectanglePacker* Factory(int width, int height);

  virtual ~RectanglePacker() {}

  //----------------------------------------------------------------------------
  /// @brief     Attempt to add a rect without moving already placed rectangles.
  ///
  /// @param[in]   width   The width of the rectangle to add.
  /// @param[in]   height  The height of the rectangle to add.
  /// @param[out]  loc     If successful, will be set to the position of the
  ///                      upper-left corner of the rectangle.
  ///
  /// @return     Return true on success; false on failure.
  ///
  virtual bool addRect(int width, int height, IPoint16* loc) = 0;

  //----------------------------------------------------------------------------
  /// @brief     Returns how much area has been filled with rectangles.
  ///
  /// @return    Percentage as a decimal between 0.0 and 1.0
  ///
  virtual float percentFull() const = 0;

  //----------------------------------------------------------------------------
  /// @brief     Empty out all previously added rectangles.
  ///
  virtual void reset() = 0;

 protected:
  RectanglePacker(int width, int height) : width_(width), height_(height) {
    FML_DCHECK(width >= 0);
    FML_DCHECK(height >= 0);
  }

  int width() const { return width_; }
  int height() const { return height_; }

 private:
  const int width_;
  const int height_;
};

}  // namespace impeller
