1313#include " flutter/shell/common/thread_host.h"
1414#include " flutter/testing/testing.h"
1515#include " gmock/gmock.h"
16+ #include " gtest/gtest.h"
17+
18+ #if IMPELLER_SUPPORTS_RENDERING
19+ #include " flutter/lib/ui/painting/image_encoding_impeller.h"
20+ #include " impeller/renderer/testing/mocks.h"
21+ #endif // IMPELLER_SUPPORTS_RENDERING
1622
1723// CREATE_NATIVE_ENTRY is leaky by design
1824// NOLINTBEGIN(clang-analyzer-core.StackAddressEscape)
@@ -22,8 +28,19 @@ namespace testing {
2228
2329namespace {
2430fml::AutoResetWaitableEvent message_latch;
31+
32+ class MockDlImage : public DlImage {
33+ public:
34+ MOCK_CONST_METHOD0 (skia_image, sk_sp<SkImage>());
35+ MOCK_CONST_METHOD0 (impeller_texture, std::shared_ptr<impeller::Texture>());
36+ MOCK_CONST_METHOD0 (isOpaque, bool ());
37+ MOCK_CONST_METHOD0 (isTextureBacked, bool ());
38+ MOCK_CONST_METHOD0 (dimensions, SkISize());
39+ MOCK_CONST_METHOD0 (GetApproximateByteSize, size_t ());
2540};
2641
42+ } // namespace
43+
2744class MockSyncSwitch {
2845 public:
2946 struct Handlers {
@@ -166,6 +183,96 @@ TEST_F(ShellTest, EncodeImageAccessesSyncSwitch) {
166183 DestroyShell (std::move (shell), task_runners);
167184}
168185
186+ #if IMPELLER_SUPPORTS_RENDERING
187+ using ::impeller::testing::MockAllocator;
188+ using ::impeller::testing::MockBlitPass;
189+ using ::impeller::testing::MockCommandBuffer;
190+ using ::impeller::testing::MockDeviceBuffer;
191+ using ::impeller::testing::MockImpellerContext;
192+ using ::impeller::testing::MockTexture;
193+ using ::testing::_;
194+ using ::testing::DoAll;
195+ using ::testing::InvokeArgument;
196+ using ::testing::Return;
197+
198+ namespace {
199+ std::shared_ptr<impeller::Context> MakeConvertDlImageToSkImageContext (
200+ std::vector<uint8_t >& buffer) {
201+ auto context = std::make_shared<MockImpellerContext>();
202+ auto command_buffer = std::make_shared<MockCommandBuffer>(context);
203+ auto allocator = std::make_shared<MockAllocator>();
204+ auto blit_pass = std::make_shared<MockBlitPass>();
205+ impeller::DeviceBufferDescriptor device_buffer_desc;
206+ device_buffer_desc.size = buffer.size ();
207+ auto device_buffer = std::make_shared<MockDeviceBuffer>(device_buffer_desc);
208+ EXPECT_CALL (*allocator, OnCreateBuffer).WillOnce (Return (device_buffer));
209+ EXPECT_CALL (*blit_pass, IsValid).WillRepeatedly (Return (true ));
210+ EXPECT_CALL (*command_buffer, IsValid).WillRepeatedly (Return (true ));
211+ EXPECT_CALL (*command_buffer, OnCreateBlitPass).WillOnce (Return (blit_pass));
212+ EXPECT_CALL (*command_buffer, OnSubmitCommands (_))
213+ .WillOnce (
214+ DoAll (InvokeArgument<0 >(impeller::CommandBuffer::Status::kCompleted ),
215+ Return (true )));
216+ EXPECT_CALL (*context, GetResourceAllocator).WillRepeatedly (Return (allocator));
217+ EXPECT_CALL (*context, CreateCommandBuffer).WillOnce (Return (command_buffer));
218+ EXPECT_CALL (*device_buffer, OnGetContents).WillOnce (Return (buffer.data ()));
219+ return context;
220+ }
221+ } // namespace
222+
223+ TEST (ImageEncodingImpellerTest, ConvertDlImageToSkImage16Float) {
224+ sk_sp<MockDlImage> image (new MockDlImage ());
225+ EXPECT_CALL (*image, dimensions)
226+ .WillRepeatedly (Return (SkISize::Make (100 , 100 )));
227+ impeller::TextureDescriptor desc;
228+ desc.format = impeller::PixelFormat::kR16G16B16A16Float ;
229+ auto texture = std::make_shared<MockTexture>(desc);
230+ EXPECT_CALL (*image, impeller_texture).WillOnce (Return (texture));
231+ std::vector<uint8_t > buffer;
232+ buffer.reserve (100 * 100 * 8 );
233+ auto context = MakeConvertDlImageToSkImageContext (buffer);
234+ bool did_call = false ;
235+ ImageEncodingImpeller::ConvertDlImageToSkImage (
236+ image,
237+ [&did_call](const sk_sp<SkImage>& image) {
238+ did_call = true ;
239+ ASSERT_TRUE (image);
240+ EXPECT_EQ (100 , image->width ());
241+ EXPECT_EQ (100 , image->height ());
242+ EXPECT_EQ (kRGBA_F16_SkColorType , image->colorType ());
243+ EXPECT_EQ (nullptr , image->colorSpace ());
244+ },
245+ context);
246+ EXPECT_TRUE (did_call);
247+ }
248+
249+ TEST (ImageEncodingImpellerTest, ConvertDlImageToSkImage10XR) {
250+ sk_sp<MockDlImage> image (new MockDlImage ());
251+ EXPECT_CALL (*image, dimensions)
252+ .WillRepeatedly (Return (SkISize::Make (100 , 100 )));
253+ impeller::TextureDescriptor desc;
254+ desc.format = impeller::PixelFormat::kB10G10R10XR ;
255+ auto texture = std::make_shared<MockTexture>(desc);
256+ EXPECT_CALL (*image, impeller_texture).WillOnce (Return (texture));
257+ std::vector<uint8_t > buffer;
258+ buffer.reserve (100 * 100 * 4 );
259+ auto context = MakeConvertDlImageToSkImageContext (buffer);
260+ bool did_call = false ;
261+ ImageEncodingImpeller::ConvertDlImageToSkImage (
262+ image,
263+ [&did_call](const sk_sp<SkImage>& image) {
264+ did_call = true ;
265+ ASSERT_TRUE (image);
266+ EXPECT_EQ (100 , image->width ());
267+ EXPECT_EQ (100 , image->height ());
268+ EXPECT_EQ (kBGR_101010x_XR_SkColorType , image->colorType ());
269+ EXPECT_EQ (nullptr , image->colorSpace ());
270+ },
271+ context);
272+ EXPECT_TRUE (did_call);
273+ }
274+ #endif // IMPELLER_SUPPORTS_RENDERING
275+
169276} // namespace testing
170277} // namespace flutter
171278
0 commit comments