// Copyright 2018 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_LOADER_IMAGE_IMAGE_ENCODER_H_
#define COBALT_LOADER_IMAGE_IMAGE_ENCODER_H_

#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "cobalt/loader/image/image.h"
#include "cobalt/math/size.h"

namespace cobalt {
namespace loader {
namespace image {

class EncodedStaticImage : public Image {
 public:
  enum class ImageFormat {
    kJPEG,
    kPNG,
    kWEBP,
  };

  EncodedStaticImage(ImageFormat image_format, scoped_array<uint8> memory,
                     uint32 size_in_bytes, const math::Size& image_dimensions);

  ImageFormat GetImageFormat() const { return image_format_; }
  uint8_t* GetMemory() { return memory_.get(); }

  uint32 GetEstimatedSizeInBytes() const override { return size_in_bytes_; }
  const math::Size& GetSize() const override { return image_dimensions_; }
  bool IsOpaque() const override { return false; }
  bool IsAnimated() const override { return false; }

 private:
  ImageFormat image_format_;
  uint32 size_in_bytes_;
  math::Size image_dimensions_;
  scoped_array<uint8> memory_;
};

scoped_refptr<EncodedStaticImage> CompressRGBAImage(
    EncodedStaticImage::ImageFormat desired_format,
    const uint8* const image_data, const math::Size& dimensions);

}  // namespace image
}  // namespace loader
}  // namespace cobalt

#endif  // COBALT_LOADER_IMAGE_IMAGE_ENCODER_H_
