Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 2a84ea5

Browse files
authored
Revert "Replace deprecated and internal Skia EncodedImage calls with public versions" (#41595)
Reverts #41368 This is blocking rolls into the framework. Let's revert until we sort out whether there's a workaround for the change to the unpremultiplied alpha issue.
1 parent 4b380b9 commit 2a84ea5

File tree

4 files changed

+29
-88
lines changed

4 files changed

+29
-88
lines changed

impeller/image/backends/skia/compressed_image_skia.cc

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,8 @@
99
#include "impeller/base/validation.h"
1010
#include "third_party/skia/include/core/SkBitmap.h"
1111
#include "third_party/skia/include/core/SkData.h"
12-
#include "third_party/skia/include/core/SkImage.h"
12+
#include "third_party/skia/include/core/SkImageGenerator.h"
1313
#include "third_party/skia/include/core/SkPixmap.h"
14-
#include "third_party/skia/include/core/SkRefCnt.h"
1514

1615
namespace impeller {
1716

@@ -47,12 +46,12 @@ DecompressedImage CompressedImageSkia::Decode() const {
4746
},
4847
src);
4948

50-
auto image = SkImages::DeferredFromEncodedData(sk_data);
51-
if (!image) {
49+
auto generator = SkImageGenerator::MakeFromEncoded(sk_data);
50+
if (!generator) {
5251
return {};
5352
}
5453

55-
const auto dims = image->imageInfo().dimensions();
54+
const auto dims = generator->getInfo().dimensions();
5655
auto info = SkImageInfo::Make(dims.width(), dims.height(),
5756
kRGBA_8888_SkColorType, kPremul_SkAlphaType);
5857

@@ -62,7 +61,7 @@ DecompressedImage CompressedImageSkia::Decode() const {
6261
return {};
6362
}
6463

65-
if (!image->readPixels(nullptr, bitmap->pixmap(), 0, 0)) {
64+
if (!generator->getPixels(bitmap->pixmap())) {
6665
VALIDATION_LOG << "Could not decompress image into arena.";
6766
return {};
6867
}

lib/ui/painting/image_decoder_unittests.cc

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -838,8 +838,7 @@ TEST(ImageDecoderTest, VerifySimpleDecoding) {
838838
auto data = OpenFixtureAsSkData("Horizontal.jpg");
839839
auto image = SkImages::DeferredFromEncodedData(data);
840840
ASSERT_TRUE(image != nullptr);
841-
ASSERT_EQ(600, image->width());
842-
ASSERT_EQ(200, image->height());
841+
ASSERT_EQ(SkISize::Make(600, 200), image->dimensions());
843842

844843
ImageGeneratorRegistry registry;
845844
std::shared_ptr<ImageGenerator> generator =
@@ -848,25 +847,24 @@ TEST(ImageDecoderTest, VerifySimpleDecoding) {
848847

849848
auto descriptor = fml::MakeRefCounted<ImageDescriptor>(std::move(data),
850849
std::move(generator));
851-
auto compressed_image = ImageDecoderSkia::ImageFromCompressedData(
852-
descriptor.get(), 6, 2, fml::tracing::TraceFlow(""));
853-
ASSERT_EQ(compressed_image->width(), 6);
854-
ASSERT_EQ(compressed_image->height(), 2);
850+
851+
ASSERT_EQ(ImageDecoderSkia::ImageFromCompressedData(
852+
descriptor.get(), 6, 2, fml::tracing::TraceFlow(""))
853+
->dimensions(),
854+
SkISize::Make(6, 2));
855855

856856
#if IMPELLER_SUPPORTS_RENDERING
857857
std::shared_ptr<impeller::Allocator> allocator =
858858
std::make_shared<impeller::TestImpellerAllocator>();
859859
auto result_1 = ImageDecoderImpeller::DecompressTexture(
860860
descriptor.get(), SkISize::Make(6, 2), {100, 100},
861861
/*supports_wide_gamut=*/false, allocator);
862-
ASSERT_EQ(result_1->sk_bitmap->width(), 6);
863-
ASSERT_EQ(result_1->sk_bitmap->height(), 2);
862+
ASSERT_EQ(result_1->sk_bitmap->dimensions(), SkISize::Make(6, 2));
864863

865864
auto result_2 = ImageDecoderImpeller::DecompressTexture(
866865
descriptor.get(), SkISize::Make(60, 20), {10, 10},
867866
/*supports_wide_gamut=*/false, allocator);
868-
ASSERT_EQ(result_2->sk_bitmap->width(), 10);
869-
ASSERT_EQ(result_2->sk_bitmap->height(), 10);
867+
ASSERT_EQ(result_2->sk_bitmap->dimensions(), SkISize::Make(10, 10));
870868
#endif // IMPELLER_SUPPORTS_RENDERING
871869
}
872870

@@ -880,15 +878,9 @@ TEST(ImageDecoderTest, VerifySubpixelDecodingPreservesExifOrientation) {
880878
auto descriptor =
881879
fml::MakeRefCounted<ImageDescriptor>(data, std::move(generator));
882880

883-
// If Exif metadata is ignored, the height and width will be swapped because
884-
// "Rotate 90 CW" is what is encoded there.
885-
ASSERT_EQ(600, descriptor->width());
886-
ASSERT_EQ(200, descriptor->height());
887-
888881
auto image = SkImages::DeferredFromEncodedData(data);
889882
ASSERT_TRUE(image != nullptr);
890-
ASSERT_EQ(600, image->width());
891-
ASSERT_EQ(200, image->height());
883+
ASSERT_EQ(SkISize::Make(600, 200), image->dimensions());
892884

893885
auto decode = [descriptor](uint32_t target_width, uint32_t target_height) {
894886
return ImageDecoderSkia::ImageFromCompressedData(
@@ -902,9 +894,8 @@ TEST(ImageDecoderTest, VerifySubpixelDecodingPreservesExifOrientation) {
902894

903895
auto assert_image = [&](auto decoded_image) {
904896
ASSERT_EQ(decoded_image->dimensions(), SkISize::Make(300, 100));
905-
sk_sp<SkData> encoded =
906-
SkPngEncoder::Encode(nullptr, decoded_image.get(), {});
907-
ASSERT_TRUE(encoded->equals(expected_data.get()));
897+
ASSERT_TRUE(SkPngEncoder::Encode(nullptr, decoded_image.get(), {})
898+
->equals(expected_data.get()));
908899
};
909900

910901
assert_image(decode(300, 100));

lib/ui/painting/image_generator.cc

Lines changed: 11 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
#include <utility>
88

99
#include "flutter/fml/logging.h"
10-
#include "third_party/skia/include/codec/SkEncodedOrigin.h"
11-
#include "third_party/skia/include/codec/SkPixmapUtils.h"
1210
#include "third_party/skia/include/core/SkBitmap.h"
1311
#include "third_party/skia/include/core/SkImage.h"
1412

@@ -83,43 +81,34 @@ std::unique_ptr<ImageGenerator> BuiltinSkiaImageGenerator::MakeFromGenerator(
8381

8482
BuiltinSkiaCodecImageGenerator::~BuiltinSkiaCodecImageGenerator() = default;
8583

86-
static SkImageInfo getInfoIncludingExif(SkCodec* codec) {
87-
SkImageInfo info = codec->getInfo();
88-
if (SkEncodedOriginSwapsWidthHeight(codec->getOrigin())) {
89-
info = SkPixmapUtils::SwapWidthHeight(info);
90-
}
91-
return info;
92-
}
93-
9484
BuiltinSkiaCodecImageGenerator::BuiltinSkiaCodecImageGenerator(
9585
std::unique_ptr<SkCodec> codec)
96-
: codec_(std::move(codec)) {
97-
image_info_ = getInfoIncludingExif(codec_.get());
98-
}
86+
: codec_generator_(static_cast<SkCodecImageGenerator*>(
87+
SkCodecImageGenerator::MakeFromCodec(std::move(codec)).release())) {}
9988

10089
BuiltinSkiaCodecImageGenerator::BuiltinSkiaCodecImageGenerator(
10190
sk_sp<SkData> buffer)
102-
: codec_(SkCodec::MakeFromData(std::move(buffer)).release()) {
103-
image_info_ = getInfoIncludingExif(codec_.get());
104-
}
91+
: codec_generator_(static_cast<SkCodecImageGenerator*>(
92+
SkCodecImageGenerator::MakeFromEncodedCodec(std::move(buffer))
93+
.release())) {}
10594

10695
const SkImageInfo& BuiltinSkiaCodecImageGenerator::GetInfo() {
107-
return image_info_;
96+
return codec_generator_->getInfo();
10897
}
10998

11099
unsigned int BuiltinSkiaCodecImageGenerator::GetFrameCount() const {
111-
return codec_->getFrameCount();
100+
return codec_generator_->getFrameCount();
112101
}
113102

114103
unsigned int BuiltinSkiaCodecImageGenerator::GetPlayCount() const {
115-
auto repetition_count = codec_->getRepetitionCount();
104+
auto repetition_count = codec_generator_->getRepetitionCount();
116105
return repetition_count < 0 ? kInfinitePlayCount : repetition_count + 1;
117106
}
118107

119108
const ImageGenerator::FrameInfo BuiltinSkiaCodecImageGenerator::GetFrameInfo(
120109
unsigned int frame_index) {
121110
SkCodec::FrameInfo info = {};
122-
codec_->getFrameInfo(frame_index, &info);
111+
codec_generator_->getFrameInfo(frame_index, &info);
123112
return {
124113
.required_frame = info.fRequiredFrame == SkCodec::kNoFrame
125114
? std::nullopt
@@ -130,11 +119,7 @@ const ImageGenerator::FrameInfo BuiltinSkiaCodecImageGenerator::GetFrameInfo(
130119

131120
SkISize BuiltinSkiaCodecImageGenerator::GetScaledDimensions(
132121
float desired_scale) {
133-
SkISize size = codec_->getScaledDimensions(desired_scale);
134-
if (SkEncodedOriginSwapsWidthHeight(codec_->getOrigin())) {
135-
std::swap(size.fWidth, size.fHeight);
136-
}
137-
return size;
122+
return codec_generator_->getScaledDimensions(desired_scale);
138123
}
139124

140125
bool BuiltinSkiaCodecImageGenerator::GetPixels(
@@ -148,40 +133,7 @@ bool BuiltinSkiaCodecImageGenerator::GetPixels(
148133
if (prior_frame.has_value()) {
149134
options.fPriorFrame = prior_frame.value();
150135
}
151-
SkEncodedOrigin origin = codec_->getOrigin();
152-
153-
SkPixmap output_pixmap(info, pixels, row_bytes);
154-
SkPixmap temp_pixmap;
155-
SkBitmap temp_bitmap;
156-
if (origin == kTopLeft_SkEncodedOrigin) {
157-
// We can decode directly into the output buffer.
158-
temp_pixmap = output_pixmap;
159-
} else {
160-
// We need to decode into a different buffer so we can re-orient
161-
// the pixels later.
162-
SkImageInfo temp_info = output_pixmap.info();
163-
if (SkEncodedOriginSwapsWidthHeight(origin)) {
164-
// We'll be decoding into a buffer that has height and width swapped.
165-
temp_info = SkPixmapUtils::SwapWidthHeight(temp_info);
166-
}
167-
if (!temp_bitmap.tryAllocPixels(temp_info)) {
168-
FML_DLOG(ERROR) << "Failed to allocate memory for bitmap of size "
169-
<< temp_info.computeMinByteSize() << "B";
170-
return false;
171-
}
172-
temp_pixmap = temp_bitmap.pixmap();
173-
}
174-
175-
SkCodec::Result result = codec_->getPixels(temp_pixmap, &options);
176-
if (result != SkCodec::kSuccess) {
177-
FML_DLOG(WARNING) << "codec could not get pixels. "
178-
<< SkCodec::ResultToString(result);
179-
return false;
180-
}
181-
if (origin == kTopLeft_SkEncodedOrigin) {
182-
return true;
183-
}
184-
return SkPixmapUtils::Orient(output_pixmap, temp_pixmap, origin);
136+
return codec_generator_->getPixels(info, pixels, row_bytes, &options);
185137
}
186138

187139
std::unique_ptr<ImageGenerator> BuiltinSkiaCodecImageGenerator::MakeFromData(

lib/ui/painting/image_generator.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
#include "third_party/skia/include/codec/SkCodecAnimation.h"
1212
#include "third_party/skia/include/core/SkData.h"
1313
#include "third_party/skia/include/core/SkImage.h"
14-
#include "third_party/skia/include/core/SkImageGenerator.h"
1514
#include "third_party/skia/include/core/SkImageInfo.h"
1615
#include "third_party/skia/include/core/SkSize.h"
16+
#include "third_party/skia/src/codec/SkCodecImageGenerator.h" // nogncheck
1717

1818
namespace flutter {
1919

@@ -213,8 +213,7 @@ class BuiltinSkiaCodecImageGenerator : public ImageGenerator {
213213

214214
private:
215215
FML_DISALLOW_COPY_ASSIGN_AND_MOVE(BuiltinSkiaCodecImageGenerator);
216-
std::unique_ptr<SkCodec> codec_;
217-
SkImageInfo image_info_;
216+
std::unique_ptr<SkCodecImageGenerator> codec_generator_;
218217
};
219218

220219
} // namespace flutter

0 commit comments

Comments
 (0)