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

Commit 6fc076b

Browse files
authored
[Impeller] Adds unit test to make sure we can encode bgr101010xr to png. (#46007)
fixes flutter/flutter#133942 This is current blocked on the skia bug: https://g-issues.skia.org/issues/300986800 Depends on skia fix: https://skia-review.googlesource.com/c/skia/+/757816 [C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style
1 parent 08ee602 commit 6fc076b

File tree

3 files changed

+74
-47
lines changed

3 files changed

+74
-47
lines changed

lib/ui/painting/image_encoding.cc

Lines changed: 38 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,6 @@ class Context;
3434
namespace flutter {
3535
namespace {
3636

37-
// This must be kept in sync with the enum in painting.dart
38-
enum ImageByteFormat {
39-
kRawRGBA,
40-
kRawStraightRGBA,
41-
kRawUnmodified,
42-
kRawExtendedRgba128,
43-
kPNG,
44-
};
45-
4637
void FinalizeSkData(void* isolate_callback_data, void* peer) {
4738
SkData* buffer = reinterpret_cast<SkData*>(peer);
4839
buffer->unref();
@@ -107,44 +98,6 @@ sk_sp<SkData> CopyImageByteData(const sk_sp<SkImage>& raster_image,
10798
return SkData::MakeWithCopy(pixmap.addr(), pixmap.computeByteSize());
10899
}
109100

110-
sk_sp<SkData> EncodeImage(const sk_sp<SkImage>& raster_image,
111-
ImageByteFormat format) {
112-
TRACE_EVENT0("flutter", __FUNCTION__);
113-
114-
if (!raster_image) {
115-
return nullptr;
116-
}
117-
118-
switch (format) {
119-
case kPNG: {
120-
auto png_image = SkPngEncoder::Encode(nullptr, raster_image.get(), {});
121-
122-
if (png_image == nullptr) {
123-
FML_LOG(ERROR) << "Could not convert raster image to PNG.";
124-
return nullptr;
125-
};
126-
return png_image;
127-
}
128-
case kRawRGBA:
129-
return CopyImageByteData(raster_image, kRGBA_8888_SkColorType,
130-
kPremul_SkAlphaType);
131-
132-
case kRawStraightRGBA:
133-
return CopyImageByteData(raster_image, kRGBA_8888_SkColorType,
134-
kUnpremul_SkAlphaType);
135-
136-
case kRawUnmodified:
137-
return CopyImageByteData(raster_image, raster_image->colorType(),
138-
raster_image->alphaType());
139-
case kRawExtendedRgba128:
140-
return CopyImageByteData(raster_image, kRGBA_F32_SkColorType,
141-
kUnpremul_SkAlphaType);
142-
}
143-
144-
FML_LOG(ERROR) << "Unknown error encoding image.";
145-
return nullptr;
146-
}
147-
148101
void EncodeImageAndInvokeDataCallback(
149102
const sk_sp<DlImage>& image,
150103
std::unique_ptr<DartPersistentValue> callback,
@@ -229,4 +182,42 @@ Dart_Handle EncodeImage(CanvasImage* canvas_image,
229182
return Dart_Null();
230183
}
231184

185+
sk_sp<SkData> EncodeImage(const sk_sp<SkImage>& raster_image,
186+
ImageByteFormat format) {
187+
TRACE_EVENT0("flutter", __FUNCTION__);
188+
189+
if (!raster_image) {
190+
return nullptr;
191+
}
192+
193+
switch (format) {
194+
case kPNG: {
195+
auto png_image = SkPngEncoder::Encode(nullptr, raster_image.get(), {});
196+
197+
if (png_image == nullptr) {
198+
FML_LOG(ERROR) << "Could not convert raster image to PNG.";
199+
return nullptr;
200+
};
201+
return png_image;
202+
}
203+
case kRawRGBA:
204+
return CopyImageByteData(raster_image, kRGBA_8888_SkColorType,
205+
kPremul_SkAlphaType);
206+
207+
case kRawStraightRGBA:
208+
return CopyImageByteData(raster_image, kRGBA_8888_SkColorType,
209+
kUnpremul_SkAlphaType);
210+
211+
case kRawUnmodified:
212+
return CopyImageByteData(raster_image, raster_image->colorType(),
213+
raster_image->alphaType());
214+
case kRawExtendedRgba128:
215+
return CopyImageByteData(raster_image, kRGBA_F32_SkColorType,
216+
kUnpremul_SkAlphaType);
217+
}
218+
219+
FML_LOG(ERROR) << "Unknown error encoding image.";
220+
return nullptr;
221+
}
222+
232223
} // namespace flutter

lib/ui/painting/image_encoding.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,29 @@
55
#ifndef FLUTTER_LIB_UI_PAINTING_IMAGE_ENCODING_H_
66
#define FLUTTER_LIB_UI_PAINTING_IMAGE_ENCODING_H_
77

8+
#include "third_party/skia/include/core/SkImage.h"
89
#include "third_party/tonic/dart_library_natives.h"
910

1011
namespace flutter {
1112

1213
class CanvasImage;
1314

15+
// This must be kept in sync with the enum in painting.dart
16+
enum ImageByteFormat {
17+
kRawRGBA,
18+
kRawStraightRGBA,
19+
kRawUnmodified,
20+
kRawExtendedRgba128,
21+
kPNG,
22+
};
23+
1424
Dart_Handle EncodeImage(CanvasImage* canvas_image,
1525
int format,
1626
Dart_Handle callback_handle);
1727

28+
sk_sp<SkData> EncodeImage(const sk_sp<SkImage>& raster_image,
29+
ImageByteFormat format);
30+
1831
} // namespace flutter
1932

2033
#endif // FLUTTER_LIB_UI_PAINTING_IMAGE_ENCODING_H_

lib/ui/painting/image_encoding_unittests.cc

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,29 @@ TEST(ImageEncodingImpellerTest, ConvertDlImageToSkImage10XR) {
275275
context);
276276
EXPECT_TRUE(did_call);
277277
}
278+
279+
TEST(ImageEncodingImpellerTest, PngEncoding10XR) {
280+
int width = 100;
281+
int height = 100;
282+
SkImageInfo info = SkImageInfo::Make(
283+
width, height, kBGR_101010x_XR_SkColorType, kUnpremul_SkAlphaType);
284+
285+
auto surface = SkSurfaces::Raster(info);
286+
SkCanvas* canvas = surface->getCanvas();
287+
288+
SkPaint paint;
289+
paint.setColor(SK_ColorBLUE);
290+
paint.setAntiAlias(true);
291+
292+
canvas->clear(SK_ColorWHITE);
293+
canvas->drawCircle(width / 2, height / 2, 100, paint);
294+
295+
sk_sp<SkImage> image = surface->makeImageSnapshot();
296+
297+
sk_sp<SkData> png = EncodeImage(image, ImageByteFormat::kPNG);
298+
EXPECT_TRUE(png);
299+
}
300+
278301
#endif // IMPELLER_SUPPORTS_RENDERING
279302

280303
} // namespace testing

0 commit comments

Comments
 (0)