// Copyright 2018 The Chromium 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 UI_GFX_IMAGE_IMAGE_SKIA_REP_DEFAULT_H_
#define UI_GFX_IMAGE_IMAGE_SKIA_REP_DEFAULT_H_

#include "build/build_config.h"
#include "cc/paint/paint_image.h"
#include "cc/paint/paint_op_buffer.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/gfx_export.h"

namespace gfx {

// An ImageSkiaRep represents an image and the scale factor it is intended for.
// 0.0f scale is used to indicate that this ImageSkiaRep is used for unscaled
// (ImageSkia does not automatically scale the image).
// TODO(malaykeshav): Support transport of PaintRecord across mojo. This would
// require adding inline serialization support for PaintRecords.
class GFX_EXPORT ImageSkiaRep {
 public:
  // Create null bitmap.
  ImageSkiaRep();

  // Note: This is for testing purpose only.
  // Creates a bitmap with kARGB_8888_Config config with given |size| in DIP.
  // This allocates pixels in the bitmap. It is guaranteed that the data in the
  // bitmap are initialized but the actual values are undefined.
  // Specifying 0 scale means the image is for unscaled image (unscaled()
  // returns true, and scale() returns 1.0f).
  ImageSkiaRep(const gfx::Size& size, float scale);

  // Creates an ImageSkiaRep that holds the `src` bitmap, which is created for
  // display at the given device scale factor. Takes ownership of a reference to
  // the SkBitmap's backing store. The `src` bitmap may not be uninitialized,
  // null or empty; in that case the default constructor should be used
  // instead.
  ImageSkiaRep(const SkBitmap& src, float scale);

  // Creates an image rep backed by a paint record of given size and scale. This
  // is used when the image representation is sourced from a drawable such as
  // CanvasImageSource. The `size` must not be empty; in that case the default
  // constructor should be used instead.
  ImageSkiaRep(sk_sp<cc::PaintRecord> paint_record,
               const gfx::Size& size,
               float scale);

  ImageSkiaRep(const ImageSkiaRep& other);
  ~ImageSkiaRep();

  // Get width and height of the image in pixels.
  int pixel_width() const { return pixel_size_.width(); }
  int pixel_height() const { return pixel_size_.height(); }
  const Size& pixel_size() const { return pixel_size_; }

  // Get width and height of the image in DIP.
  int GetWidth() const;
  int GetHeight() const;

  // Retrieves the scale for which this image is a representation of.
  float scale() const { return unscaled() ? 1.0f : scale_; }
  bool unscaled() const { return scale_ == 0.0f; }

  bool is_null() const {
    return type_ == ImageRepType::kImageTypeBitmap ? bitmap_.isNull()
                                                   : !paint_record_;
  }

  // Returns the backing bitmap when the image representation is sourced from a
  // bitmap. If this is a |kImageTypeDrawable| then it will generate(and cache)
  // a bitmap.
  const SkBitmap& GetBitmap() const;

  // Returns the backing drawable as a PaintRecord. Use this when the type of
  // ImageRep is |kImageTypeDrawable|.
  sk_sp<cc::PaintRecord> GetPaintRecord() const;

  const cc::PaintImage& paint_image() const { return paint_image_; }
  bool has_paint_image() const { return !!paint_image_; }

 private:
  enum class ImageRepType {
    kImageTypeBitmap,   // When the source image is rasterized. (Bitmaps, PNGs)
    kImageTypeDrawable  // When the source image is a drawable generated by a
                        // CanvasImageSource.
  };

  // TODO(malaykeshav): Remove when migration is complete and it is safe.
  cc::PaintImage paint_image_;
  mutable sk_sp<cc::PaintRecord> paint_record_;
  ImageRepType type_;

  Size pixel_size_;
  mutable SkBitmap bitmap_;
  float scale_;
};

}  // namespace gfx

#endif  // UI_GFX_IMAGE_IMAGE_SKIA_REP_DEFAULT_H_
