/*
 * Copyright 2017 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_BROWSER_MEMORY_SETTINGS_TEXTURE_DIMENSIONS_H_
#define COBALT_BROWSER_MEMORY_SETTINGS_TEXTURE_DIMENSIONS_H_

#include "starboard/types.h"

namespace cobalt {
namespace browser {
namespace memory_settings {

class TextureDimensions {
 public:
  TextureDimensions() : width_(), height_(), bytes_per_pixel_() {}
  TextureDimensions(int w, int h, int d)
      : width_(w), height_(h), bytes_per_pixel_(d) {}
  TextureDimensions(const TextureDimensions& other)
      : width_(other.width_),
        height_(other.height_),
        bytes_per_pixel_(other.bytes_per_pixel_) {}

  bool operator==(const TextureDimensions& other) const {
    return width_ == other.width_ && height_ == other.height_ &&
           bytes_per_pixel_ == other.bytes_per_pixel_;
  }

  bool operator!=(const TextureDimensions& other) const {
    return !(*this == other);
  }

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

  int64_t TotalBytes() const {
    int64_t out = width_;
    out *= height_;
    out *= bytes_per_pixel_;
    return out;
  }

  void set_width(int width) { width_ = width; }
  void set_height(int height) { height_ = height; }
  void set_bytes_per_pixel(int bpp) { bytes_per_pixel_ = bpp; }

 private:
  int width_;
  int height_;
  int bytes_per_pixel_;
};

}  // namespace memory_settings
}  // namespace browser
}  // namespace cobalt

#endif  // COBALT_BROWSER_MEMORY_SETTINGS_TEXTURE_DIMENSIONS_H_
