// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef WINDOW_MANAGER_IMAGE_CONTAINER_H_
#define WINDOW_MANAGER_IMAGE_CONTAINER_H_

#include <string>

#include "base/basictypes.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "window_manager/geometry.h"
#include "window_manager/image_enums.h"

namespace window_manager {

// This base class contains image data.  Given a filename, it's able to
// infer its type and construct an appropriate container object.
class ImageContainer {
 public:
  enum Result {
    IMAGE_LOAD_SUCCESS = 0,
    IMAGE_LOAD_FAILURE,
  };

  // This determines the type of image container to use automatically
  // from the file contents, and returns a newly allocated image
  // container of the correct type.  The caller is responsible for
  // deleting the returned image container.  Returns NULL if unable to
  // determine file type or access the file.  Note that the image data
  // isn't loaded until the LoadImage method returns successfully.
  static ImageContainer* CreateContainerFromFile(const std::string& filename);

  ImageContainer();
  virtual ~ImageContainer() { SetData(NULL, false); }

  // Loads the image, and returns a result code.
  virtual Result LoadImage() = 0;

  uint8_t* data() const { return data_; }
  size_t width() const { return width_; }
  size_t height() const { return height_; }
  Size size() const { return Size(width_,height_); }

  // Return stride in bytes of a row of pixels in the image data.
  size_t stride() const {
    return bits_per_pixel() * width() / 8;
  }

  // The number of bits per pixel in the image.
  int bits_per_pixel() const { return GetBitsPerPixelInImageFormat(format_); }

  // Currently, this class only supports 32-bit formats as well as 16-bit RGB.
  ImageFormat format() const { return format_; }

 protected:
  // Set parameters read from image.
  void set_width(size_t new_width) { width_ = new_width; }
  void set_height(size_t new_height) { height_ = new_height; }
  void set_format(ImageFormat format) {
    format_ = format;
  }

  // Takes ownership of the given array.
  void SetData(uint8_t* new_data, bool was_allocated_with_malloc);

 private:
  // 16 or 32-bit-per-pixel image data, oriented with (0, 0) at the beginning of
  // the array.  We own this data.
  uint8_t* data_;

  // Was |data_| allocated using malloc() (rather than new[])?
  bool data_was_allocated_with_malloc_;

  // Image width in pixels.
  size_t width_;

  // Image height in pixels.
  size_t height_;

  // Format of the image (from image_enums.h).
  ImageFormat format_;

  DISALLOW_COPY_AND_ASSIGN(ImageContainer);
};

// This is the PNG-specific version of the image container.  It can
// detect PNG image files from their contents, and load them into
// memory, converting them to the proper form for the ImageContainer
// class.
class PngImageContainer : public virtual ImageContainer {
 public:
  // Determines if the given file is a PNG image.
  static bool IsPngImage(const std::string& filename);

  explicit PngImageContainer(const std::string& filename);
  virtual ~PngImageContainer() {}

  const std::string& filename() { return filename_; }

  virtual Result LoadImage();

 private:
  // Name of the file being loaded.
  std::string filename_;

  DISALLOW_COPY_AND_ASSIGN(PngImageContainer);
};

// This is an implementation of ImageContainer that can be constructed
// directly from raw, already-loaded data.
class InMemoryImageContainer : public virtual ImageContainer {
 public:
  // Takes ownership of |new_data|, which must be 32-bit image data.
  InMemoryImageContainer(uint8_t* new_data, size_t new_width, size_t new_height,
                         ImageFormat new_format,
                         bool was_allocated_using_malloc);
  virtual ~InMemoryImageContainer() {}

  // This doesn't need to be called.
  virtual Result LoadImage() { return IMAGE_LOAD_SUCCESS; }

 private:
  DISALLOW_COPY_AND_ASSIGN(InMemoryImageContainer);
};

}  // namespace window_manager

#endif  // WINDOW_MANAGER_IMAGE_CONTAINER_H_
