blob: 6f9fc113a330ec566290d908476dc61fdb0100f2 [file] [log] [blame]
// 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_LIB_UI_SNAPSHOT_DELEGATE_H_
#define FLUTTER_LIB_UI_SNAPSHOT_DELEGATE_H_
#include <string>
#include "flutter/common/graphics/texture.h"
#include "flutter/display_list/display_list.h"
#include "flutter/flow/skia_gpu_object.h"
#include "third_party/skia/include/core/SkImage.h"
#include "third_party/skia/include/core/SkPicture.h"
#include "third_party/skia/include/core/SkPromiseImageTexture.h"
#include "third_party/skia/include/gpu/GrContextThreadSafeProxy.h"
#include "third_party/skia/include/gpu/GrDirectContext.h"
namespace flutter {
class DlImage;
class SnapshotDelegate {
public:
//----------------------------------------------------------------------------
/// @brief A data structure used by the Skia implementation of deferred
/// GPU based images.
struct GpuImageResult {
GpuImageResult(const GrBackendTexture& p_texture,
sk_sp<GrDirectContext> p_context,
sk_sp<SkImage> p_image = nullptr,
const std::string& p_error = "")
: texture(p_texture),
context(std::move(p_context)),
image(std::move(p_image)),
error(p_error) {}
const GrBackendTexture texture;
// If texture.isValid() == true, this is a pointer to a GrDirectContext that
// can be used to create an image from the texture.
sk_sp<GrDirectContext> context;
// If MakeGpuImage could not create a GPU resident image, a raster copy
// is available in this member and texture.isValid() is false.
sk_sp<SkImage> image;
// A non-empty string containing an error message if neither a GPU backed
// texture nor a raster backed image could be created.
const std::string error;
};
//----------------------------------------------------------------------------
/// @brief Attempts to create a GrBackendTexture for the specified
/// DisplayList. May result in a raster bitmap if no GPU context
/// is available.
virtual std::unique_ptr<GpuImageResult> MakeSkiaGpuImage(
sk_sp<DisplayList> display_list,
const SkImageInfo& image_info) = 0;
//----------------------------------------------------------------------------
/// @brief Gets the registry of external textures currently in use by the
/// rasterizer. These textures may be updated at a cadence
/// different from that of the Flutter application. When an
/// external texture is referenced in the Flutter layer tree, that
/// texture is composited within the Flutter layer tree.
///
/// @return A pointer to the external texture registry.
///
virtual std::shared_ptr<TextureRegistry> GetTextureRegistry() = 0;
virtual GrDirectContext* GetGrContext() = 0;
virtual sk_sp<DlImage> MakeRasterSnapshot(sk_sp<DisplayList> display_list,
SkISize picture_size) = 0;
virtual sk_sp<SkImage> ConvertToRasterImage(sk_sp<SkImage> image) = 0;
};
} // namespace flutter
#endif // FLUTTER_LIB_UI_SNAPSHOT_DELEGATE_H_