// 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_JPEG_IMAGE_DECODER_H_
#define COBALT_LOADER_IMAGE_JPEG_IMAGE_DECODER_H_

#include <setjmp.h>
#include <string>

#include "base/callback.h"
#include "base/memory/scoped_ptr.h"
#include "cobalt/loader/image/image.h"
#include "cobalt/loader/image/image_data_decoder.h"

// Inhibit C++ name-mangling for libjpeg functions.
extern "C" {
#include "third_party/libjpeg/jpeglib.h"
}

namespace cobalt {
namespace loader {
namespace image {

class JPEGImageDecoder : public ImageDataDecoder {
 public:
  // Pass true to |allow_image_decoding_to_multi_plane| to allow the decoder to
  // produce output in YUV  whenever possible, which saves both decoding time
  // and memory footprint.  Pass false to it on platforms that cannot render
  // multi plane images efficiently, and the output will always be produced in
  // single plane RGBA or BGRA.
  JPEGImageDecoder(render_tree::ResourceProvider* resource_provider,
                   bool allow_image_decoding_to_multi_plane);
  ~JPEGImageDecoder() override;

  // From ImageDataDecoder
  std::string GetTypeString() const override { return "JPEGImageDecoder"; }

 private:
  enum OutputFormat {
    kOutputFormatInvalid,
    kOutputFormatYUV,
    kOutputFormatRGBA,
    kOutputFormatBGRA,
  };

  // From ImageDataDecoder
  size_t DecodeChunkInternal(const uint8* data, size_t size) override;
  scoped_refptr<Image> FinishInternal() override;

  bool ReadHeader();
  bool StartDecompress();
  bool DecodeProgressiveJPEG();
  bool ReadYUVLines();
  bool ReadRgbaOrGbraLines();
  bool ReadLines();

  const bool allow_image_decoding_to_multi_plane_;

  jpeg_decompress_struct info_;
  jpeg_source_mgr source_manager_;
  jpeg_error_mgr error_manager_;

  OutputFormat output_format_ = kOutputFormatInvalid;

  // This is only used when |output_format_| is kOutputFormatRGBA or
  // kOutputFormatBGRA.
  scoped_ptr<render_tree::ImageData> decoded_image_data_;

  // All the following variables are only valid when |output_format_| is
  // kOutputFormatYUV.
  scoped_ptr<render_tree::RawImageMemory> raw_image_memory_;

  // Sample factors of y plane, they are 1 for yuv444 or 2 for yuv420 but may
  // have other value combinations for other yuv formats.
  int h_sample_factor_ = 0;
  int v_sample_factor_ = 0;
  // Width/height of y plane, aligned to |kDctScaleSize| * |y_sample_factor_|.
  JDIMENSION y_plane_width_ = 0;
  JDIMENSION y_plane_height_ = 0;
};

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

#endif  // COBALT_LOADER_IMAGE_JPEG_IMAGE_DECODER_H_
