| // Copyright 2013 The Flutter 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 FLUTTER_DISPLAY_LIST_IMAGE_DL_IMAGE_H_ |
| #define FLUTTER_DISPLAY_LIST_IMAGE_DL_IMAGE_H_ |
| |
| #include <memory> |
| #include <optional> |
| #include <string> |
| |
| #include "flutter/fml/macros.h" |
| #include "third_party/skia/include/core/SkImage.h" |
| #include "third_party/skia/include/core/SkRefCnt.h" |
| |
| namespace impeller { |
| class Texture; |
| } // namespace impeller |
| |
| namespace flutter { |
| |
| //------------------------------------------------------------------------------ |
| /// @brief Represents an image whose allocation is (usually) resident on |
| /// device memory. |
| /// |
| /// Since it is usually impossible or expensive to transmute images |
| /// for one rendering backend to another, these objects are backend |
| /// specific. |
| /// |
| class DlImage : public SkRefCnt { |
| public: |
| // Describes which GPU context owns this image. |
| enum class OwningContext { kRaster, kIO }; |
| |
| static sk_sp<DlImage> Make(const SkImage* image); |
| |
| static sk_sp<DlImage> Make(sk_sp<SkImage> image); |
| |
| virtual ~DlImage(); |
| |
| //---------------------------------------------------------------------------- |
| /// @brief If this display list image is meant to be used by the Skia |
| /// backend, an SkImage instance. Null otherwise. |
| /// |
| /// @return A Skia image instance or null. |
| /// |
| virtual sk_sp<SkImage> skia_image() const = 0; |
| |
| //---------------------------------------------------------------------------- |
| /// @brief If this display list image is meant to be used by the Impeller |
| /// backend, an Impeller texture instance. Null otherwise. |
| /// |
| /// @return An Impeller texture instance or null. |
| /// |
| virtual std::shared_ptr<impeller::Texture> impeller_texture() const = 0; |
| |
| //---------------------------------------------------------------------------- |
| /// @brief If the pixel format of this image ignores alpha, this returns |
| /// true. This method might conservatively return false when it |
| /// cannot guarnatee an opaque image, for example when the pixel |
| /// format of the image supports alpha but the image is made up of |
| /// entirely opaque pixels. |
| /// |
| /// @return True if the pixel format of this image ignores alpha. |
| /// |
| virtual bool isOpaque() const = 0; |
| |
| virtual bool isTextureBacked() const = 0; |
| |
| //---------------------------------------------------------------------------- |
| /// @brief If the underlying platform image held by this object has no |
| /// threading requirements for the release of that image (or if |
| /// arrangements have already been made to forward that image to |
| /// the correct thread upon deletion), this method returns true. |
| /// |
| /// @return True if the underlying image is held in a thread-safe manner. |
| /// |
| virtual bool isUIThreadSafe() const = 0; |
| |
| //---------------------------------------------------------------------------- |
| /// @return The dimensions of the pixel grid. |
| /// |
| virtual SkISize dimensions() const = 0; |
| |
| //---------------------------------------------------------------------------- |
| /// @return The approximate byte size of the allocation of this image. |
| /// This takes into account details such as mip-mapping. The |
| /// allocation is usually resident in device memory. |
| /// |
| virtual size_t GetApproximateByteSize() const = 0; |
| |
| //---------------------------------------------------------------------------- |
| /// @return The width of the pixel grid. A convenience method that calls |
| /// |DlImage::dimensions|. |
| /// |
| int width() const; |
| |
| //---------------------------------------------------------------------------- |
| /// @return The height of the pixel grid. A convenience method that calls |
| /// |DlImage::dimensions|. |
| /// |
| int height() const; |
| |
| //---------------------------------------------------------------------------- |
| /// @return The bounds of the pixel grid with 0, 0 as origin. A |
| /// convenience method that calls |DlImage::dimensions|. |
| /// |
| SkIRect bounds() const; |
| |
| //---------------------------------------------------------------------------- |
| /// @return Specifies which context was used to create this image. The |
| /// image must be collected on the same task runner as its |
| /// context. |
| virtual OwningContext owning_context() const { return OwningContext::kIO; } |
| |
| //---------------------------------------------------------------------------- |
| /// @return An error, if any, that occurred when trying to create the |
| /// image. |
| virtual std::optional<std::string> get_error() const; |
| |
| bool Equals(const DlImage* other) const { |
| if (!other) { |
| return false; |
| } |
| if (this == other) { |
| return true; |
| } |
| return skia_image() == other->skia_image() && |
| impeller_texture() == other->impeller_texture(); |
| } |
| |
| bool Equals(const DlImage& other) const { return Equals(&other); } |
| |
| bool Equals(const sk_sp<const DlImage>& other) const { |
| return Equals(other.get()); |
| } |
| |
| protected: |
| DlImage(); |
| }; |
| |
| } // namespace flutter |
| |
| #endif // FLUTTER_DISPLAY_LIST_IMAGE_DL_IMAGE_H_ |