// 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_LOADER_IMAGE_IMAGE_DATA_DECODER_H_
#define COBALT_LOADER_IMAGE_IMAGE_DATA_DECODER_H_

#include <string>
#include <vector>

#include "cobalt/loader/image/image.h"
#include "cobalt/render_tree/resource_provider.h"
#if defined(STARBOARD)
#include "starboard/decode_target.h"
#endif

namespace cobalt {
namespace loader {
namespace image {

// This class is used as a component of ImageDecoder and is intended to be
// sub-classed by specific data decoders, such as JPEG decoders and PNG
// decoders. This class is intended to decode image data based on the type,
// but leaves the responsibility of handling callbacks and producing the final
// image to ImageDecoder.
class ImageDataDecoder {
 public:
  explicit ImageDataDecoder(render_tree::ResourceProvider* resource_provider);

  virtual ~ImageDataDecoder() {}

  virtual std::string GetTypeString() const = 0;

  scoped_ptr<render_tree::ImageData> RetrieveImageData() {
    return image_data_.Pass();
  }

#if defined(STARBOARD)
#if SB_HAS(GRAPHICS)
  // Starboard version 3 adds support for hardware accelerated image decoding.
  // In order to make use of this feature, subclasses of ImageDataDecoder may
  // override this method in order to return an SbDecodeTarget, rather than a
  // render_tree::ImageData, which could potentially save a copy from CPU
  // memory to GPU memory, depending on the render_tree implementation and
  // hardware image decoding functionality available.  If
  // |RetrieveSbDecodeTarget| returns any value other than the default
  // |kSbDecodeInvalid|, ImageDecoder will interpret it as a preference
  // towards SbDecodeTarget rather than render_tree::ImageData.
  virtual SbDecodeTarget RetrieveSbDecodeTarget() {
    return kSbDecodeTargetInvalid;
  }
#endif  // SB_HAS(GRAPHICS)
#endif  // defined(STARBOARD)

  void DecodeChunk(const uint8* data, size_t size);
  // Return true if decoding succeeded.
  bool FinishWithSuccess();

  // If a format supports animation, subclass should implement these methods.
  // When has_animation() is true, the intermediate result is returned in
  // animated_image().
  virtual bool has_animation() const { return false; }
  virtual scoped_refptr<AnimatedImage> animated_image() { return NULL; }

 protected:
  enum State {
    kWaitingForHeader,
    kReadLines,
    kDone,
    kError,
  };

  // Every subclass of ImageDataDecoder should override this function to do
  // the internal decoding. The return value of this function is the number of
  // decoded data.
  virtual size_t DecodeChunkInternal(const uint8* data, size_t input_byte) = 0;
  // Subclass can override this function to get a last chance to do some work.
  virtual void FinishInternal() {}

  bool AllocateImageData(const math::Size& size, bool has_alpha);

  render_tree::ResourceProvider* resource_provider() {
    return resource_provider_;
  }

  render_tree::ImageData* image_data() const { return image_data_.get(); }

  void set_state(State state) { state_ = state; }
  State state() const { return state_; }

  render_tree::PixelFormat pixel_format() const { return pixel_format_; }

 private:
  // Called on construction to query the ResourceProvider for the best image
  // pixel format to use.
  void CalculatePixelFormat();

  // |resource_provider_| is used to allocate render_tree::ImageData
  render_tree::ResourceProvider* const resource_provider_;
  // Decoded image data.
  scoped_ptr<render_tree::ImageData> image_data_;
  // |data_buffer_| is used to cache the undecoded data.
  std::vector<uint8> data_buffer_;
  // Record the current decoding status.
  State state_;
  // The pixel format that the decoded image data is expected to be in.
  render_tree::PixelFormat pixel_format_;
};

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

#endif  // COBALT_LOADER_IMAGE_IMAGE_DATA_DECODER_H_
