Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
image_encoding_skia.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "flutter/lib/ui/painting/image_encoding.h"
6#include "flutter/lib/ui/painting/image_encoding_impl.h"
7
8#include "flutter/lib/ui/painting/image.h"
9
10namespace flutter {
11
13 const sk_sp<DlImage>& dl_image,
14 std::function<void(sk_sp<SkImage>)> encode_task,
15 const fml::RefPtr<fml::TaskRunner>& raster_task_runner,
16 const fml::RefPtr<fml::TaskRunner>& io_task_runner,
17 const fml::WeakPtr<GrDirectContext>& resource_context,
19 const std::shared_ptr<const fml::SyncSwitch>& is_gpu_disabled_sync_switch) {
20 // If the owning_context is kRaster, we can't access it on this task runner.
21 if (dl_image->owning_context() != DlImage::OwningContext::kRaster) {
22 auto image = dl_image->skia_image();
23
24 // Check validity of the image.
25 if (image == nullptr) {
26 FML_LOG(ERROR) << "Image was null.";
27 encode_task(nullptr);
28 return;
29 }
30
31 auto dimensions = image->dimensions();
32
33 if (dimensions.isEmpty()) {
34 FML_LOG(ERROR) << "Image dimensions were empty.";
35 encode_task(nullptr);
36 return;
37 }
38
39 SkPixmap pixmap;
40 if (image->peekPixels(&pixmap)) {
41 // This is already a raster image.
42 encode_task(image);
43 return;
44 }
45
46 if (sk_sp<SkImage> raster_image = image->makeRasterImage()) {
47 // The image can be converted to a raster image.
48 encode_task(raster_image);
49 return;
50 }
51 }
52
53 if (!raster_task_runner) {
54 FML_LOG(ERROR) << "Raster task runner was null.";
55 encode_task(nullptr);
56 return;
57 }
58
59 if (!io_task_runner) {
60 FML_LOG(ERROR) << "IO task runner was null.";
61 encode_task(nullptr);
62 return;
63 }
64
65 // Cross-context images do not support makeRasterImage. Convert these images
66 // by drawing them into a surface. This must be done on the raster thread
67 // to prevent concurrent usage of the image on both the IO and raster threads.
68 raster_task_runner->PostTask([dl_image, encode_task = std::move(encode_task),
69 resource_context, snapshot_delegate,
70 io_task_runner, is_gpu_disabled_sync_switch,
71 raster_task_runner]() {
72 auto image = dl_image->skia_image();
73 if (!image || !snapshot_delegate) {
74 io_task_runner->PostTask(
75 [encode_task = encode_task]() mutable { encode_task(nullptr); });
76 return;
77 }
78
79 sk_sp<SkImage> raster_image =
80 snapshot_delegate->ConvertToRasterImage(image);
81
82 io_task_runner->PostTask([image, encode_task = encode_task,
83 raster_image = std::move(raster_image),
84 resource_context, is_gpu_disabled_sync_switch,
85 owning_context = dl_image->owning_context(),
86 raster_task_runner]() mutable {
87 if (!raster_image) {
88 // The rasterizer was unable to render the cross-context image
89 // (presumably because it does not have a GrContext). In that case,
90 // convert the image on the IO thread using the resource context.
92 image, resource_context, is_gpu_disabled_sync_switch);
93 }
94 encode_task(raster_image);
95 if (owning_context == DlImage::OwningContext::kRaster) {
96 raster_task_runner->PostTask([image = std::move(image)]() {});
97 }
98 });
99 });
100}
101
102} // namespace flutter
sk_sp< SkImage > makeRasterImage(GrDirectContext *, CachingHint cachingHint=kDisallow_CachingHint) const
Definition SkImage.cpp:267
SkISize dimensions() const
Definition SkImage.h:297
bool peekPixels(SkPixmap *pixmap) const
Definition SkImage.cpp:34
sk_sp< SkImage > image
Definition examples.cpp:29
#define FML_LOG(severity)
Definition logging.h:82
sk_sp< SkImage > ConvertToRasterUsingResourceContext(const sk_sp< SkImage > &image, const fml::WeakPtr< GrDirectContext > &resource_context, const std::shared_ptr< const SyncSwitch > &is_gpu_disabled_sync_switch)
void ConvertImageToRasterSkia(const sk_sp< DlImage > &dl_image, std::function< void(sk_sp< SkImage >)> encode_task, const fml::RefPtr< fml::TaskRunner > &raster_task_runner, const fml::RefPtr< fml::TaskRunner > &io_task_runner, const fml::WeakPtr< GrDirectContext > &resource_context, const fml::TaskRunnerAffineWeakPtr< SnapshotDelegate > &snapshot_delegate, const std::shared_ptr< const fml::SyncSwitch > &is_gpu_disabled_sync_switch)
#define ERROR(message)