29#include "third_party/skia/include/codec/SkCodecAnimation.h"
30#include "third_party/skia/include/core/SkData.h"
31#include "third_party/skia/include/core/SkImage.h"
32#include "third_party/skia/include/core/SkImageInfo.h"
33#include "third_party/skia/include/core/SkSize.h"
34#include "third_party/skia/include/encode/SkPngEncoder.h"
50 bool IsValid()
const override {
return true; }
57 return std::make_shared<TestImpellerAllocator>();
82 const std::function<
void()>& failure)
override {
83 tasks_.push_back(PendingTask{task, failure});
87 for (
auto& task : tasks_) {
111 std::function<void()> task;
112 std::function<void()> failure;
114 std::vector<PendingTask> tasks_;
115 std::shared_ptr<const Capabilities> capabilities_;
116 bool did_dispose_ =
false;
127 bool has_gpu_context =
true)
130 gl_context_(has_gpu_context ? gl_surface_.CreateGrContext() : nullptr),
131 weak_gl_context_factory_(
133 ?
std::make_unique<
fml::WeakPtrFactory<GrDirectContext>>(
138 fml::TimeDelta::FromNanoseconds(0),
140 runner_(task_runner),
141 is_gpu_disabled_sync_switch_(
std::make_shared<
fml::SyncSwitch>()),
142 weak_factory_(this) {
143 FML_CHECK(task_runner->RunsTasksOnCurrentThread())
144 <<
"The IO manager must be initialized its primary task runner. The "
145 "test harness may not be set up correctly/safely.";
146 weak_prototype_ = weak_factory_.GetWeakPtr();
152 [&latch,
queue = unref_queue_]() {
161 return weak_prototype_;
166 return weak_gl_context_factory_ ? weak_gl_context_factory_->GetWeakPtr()
178 return is_gpu_disabled_sync_switch_;
183 return impeller_context_;
187 is_gpu_disabled_sync_switch_->SetSwitch(disabled);
194 std::shared_ptr<impeller::Context> impeller_context_;
195 sk_sp<GrDirectContext> gl_context_;
196 std::unique_ptr<fml::WeakPtrFactory<GrDirectContext>>
197 weak_gl_context_factory_;
201 std::shared_ptr<fml::SyncSwitch> is_gpu_disabled_sync_switch_;
211 auto thread_task_runner = CreateNewThread();
221 TestIOManager manager(runners.GetIOTaskRunner());
223 auto decoder = ImageDecoder::Make(settings, runners, loop->GetTaskRunner(),
224 manager.GetWeakIOManager(),
225 std::make_shared<fml::SyncSwitch>());
226 ASSERT_NE(decoder, nullptr);
235 const SkImageInfo&
GetInfo() {
return info_; }
242 return {std::nullopt, 0, SkCodecAnimation::DisposalMethod::kKeep};
246 return SkISize::Make(info_.width(), info_.height());
252 unsigned int frame_index,
253 std::optional<unsigned int> prior_frame) {
263 auto thread_task_runner = CreateNewThread();
272 thread_task_runner->PostTask([&]() {
277 std::make_shared<fml::SyncSwitch>());
283 fml::MakeRefCounted<ImageDescriptor>(
284 std::move(
data), std::make_unique<UnknownImageGenerator>());
287 const std::string& decode_error) {
292 decoder->Decode(image_descriptor, 0, 0,
callback);
300 CreateNewThread(
"platform"),
301 CreateNewThread(
"raster"),
302 CreateNewThread(
"ui"),
303 CreateNewThread(
"io")
308 std::unique_ptr<TestIOManager> io_manager;
310 auto release_io_manager = [&]() {
314 auto decode_image = [&]() {
317 settings, runners, loop->GetTaskRunner(),
318 io_manager->GetWeakIOManager(), std::make_shared<fml::SyncSwitch>());
323 ASSERT_GE(
data->size(), 0u);
326 std::shared_ptr<ImageGenerator> generator =
328 ASSERT_TRUE(generator);
330 auto descriptor = fml::MakeRefCounted<ImageDescriptor>(
331 std::move(
data), std::move(generator));
334 const std::string& decode_error) {
337 EXPECT_TRUE(io_manager->did_access_is_gpu_disabled_sync_switch_);
340 EXPECT_FALSE(io_manager->did_access_is_gpu_disabled_sync_switch_);
341 image_decoder->Decode(descriptor, descriptor->width(), descriptor->height(),
345 auto set_up_io_manager_and_decode = [&]() {
346 io_manager = std::make_unique<TestIOManager>(runners.
GetIOTaskRunner());
355#if !IMPELLER_SUPPORTS_RENDERING
356 GTEST_SKIP() <<
"Impeller only test.";
359 auto no_gpu_access_context =
360 std::make_shared<impeller::TestImpellerContext>();
361 auto gpu_disabled_switch = std::make_shared<fml::SyncSwitch>(
true);
363 auto info = SkImageInfo::Make(10, 10, SkColorType::kRGBA_8888_SkColorType,
364 SkAlphaType::kPremul_SkAlphaType);
365 auto bitmap = std::make_shared<SkBitmap>();
366 bitmap->allocPixels(info, 10 * 4);
368 desc.
size = bitmap->computeByteSize();
369 auto buffer = std::make_shared<impeller::TestImpellerDeviceBuffer>(desc);
371 bool invoked =
false;
372 auto cb = [&invoked](
const sk_sp<DlImage>&
image,
373 const std::string&
message) { invoked =
true; };
376 cb, no_gpu_access_context,
buffer, info, bitmap, std::nullopt,
377 gpu_disabled_switch);
379 EXPECT_EQ(no_gpu_access_context->command_buffer_count_, 0ul);
380 EXPECT_FALSE(invoked);
381 EXPECT_EQ(no_gpu_access_context->DidDisposeResources(),
false);
384 no_gpu_access_context, bitmap);
386 ASSERT_EQ(no_gpu_access_context->command_buffer_count_, 0ul);
387 ASSERT_EQ(result.second,
"");
388 EXPECT_EQ(no_gpu_access_context->DidDisposeResources(),
true);
390 result.first->impeller_texture()->GetTextureDescriptor().storage_mode,
393 no_gpu_access_context->FlushTasks(
true);
397 ImpellerUploadToSharedNoGpuTaskFlushingFailure) {
398#if !IMPELLER_SUPPORTS_RENDERING
399 GTEST_SKIP() <<
"Impeller only test.";
402 auto no_gpu_access_context =
403 std::make_shared<impeller::TestImpellerContext>();
404 auto gpu_disabled_switch = std::make_shared<fml::SyncSwitch>(
true);
406 auto info = SkImageInfo::Make(10, 10, SkColorType::kRGBA_8888_SkColorType,
407 SkAlphaType::kPremul_SkAlphaType);
408 auto bitmap = std::make_shared<SkBitmap>();
409 bitmap->allocPixels(info, 10 * 4);
411 desc.
size = bitmap->computeByteSize();
412 auto buffer = std::make_shared<impeller::TestImpellerDeviceBuffer>(desc);
414 sk_sp<DlImage>
image;
416 bool invoked =
false;
417 auto cb = [&invoked, &
image, &
message](sk_sp<DlImage> p_image,
418 std::string p_message) {
420 image = std::move(p_image);
421 message = std::move(p_message);
425 cb, no_gpu_access_context,
buffer, info, bitmap, std::nullopt,
426 gpu_disabled_switch);
428 EXPECT_EQ(no_gpu_access_context->command_buffer_count_, 0ul);
429 EXPECT_FALSE(invoked);
431 no_gpu_access_context->FlushTasks(
true);
433 EXPECT_TRUE(invoked);
439 auto info = SkImageInfo::Make(10, 10, SkColorType::kRGBA_8888_SkColorType,
440 SkAlphaType::kPremul_SkAlphaType);
442 bitmap.allocPixels(info, 10 * 4);
443 auto data = SkData::MakeWithoutCopy(bitmap.getPixels(), 10 * 10 * 4);
444 auto image = SkImages::RasterFromBitmap(bitmap);
445 ASSERT_TRUE(
image !=
nullptr);
446 EXPECT_EQ(SkISize::Make(10, 10),
image->dimensions());
447 EXPECT_EQ(
nullptr,
image->colorSpace());
449 auto descriptor = fml::MakeRefCounted<ImageDescriptor>(
450 std::move(
data),
image->imageInfo(), 10 * 4);
452#if IMPELLER_SUPPORTS_RENDERING
453 std::shared_ptr<impeller::Capabilities> capabilities =
457 std::shared_ptr<impeller::Allocator> allocator =
458 std::make_shared<impeller::TestImpellerAllocator>();
459 std::optional<DecompressResult> decompressed =
461 descriptor.get(), SkISize::Make(100, 100), {100, 100},
462 true, capabilities, allocator);
463 ASSERT_TRUE(decompressed.has_value());
464 EXPECT_EQ(decompressed->image_info.colorType(), kRGBA_8888_SkColorType);
465 EXPECT_EQ(decompressed->image_info.colorSpace(),
466 SkColorSpace::MakeSRGB().get());
471 auto info = SkImageInfo::Make(10, 10, SkColorType::kRGBA_F32_SkColorType,
472 SkAlphaType::kUnpremul_SkAlphaType);
474 bitmap.allocPixels(info, 10 * 16);
475 auto data = SkData::MakeWithoutCopy(bitmap.getPixels(), 10 * 10 * 16);
476 auto image = SkImages::RasterFromBitmap(bitmap);
478 ASSERT_TRUE(
image !=
nullptr);
479 EXPECT_EQ(SkISize::Make(10, 10),
image->dimensions());
480 EXPECT_EQ(
nullptr,
image->colorSpace());
482 auto descriptor = fml::MakeRefCounted<ImageDescriptor>(
483 std::move(
data),
image->imageInfo(), 10 * 16);
485#if IMPELLER_SUPPORTS_RENDERING
486 std::shared_ptr<impeller::Capabilities> capabilities =
490 std::shared_ptr<impeller::Allocator> allocator =
491 std::make_shared<impeller::TestImpellerAllocator>();
492 std::optional<DecompressResult> decompressed =
494 descriptor.get(), SkISize::Make(100, 100), {100, 100},
495 true, capabilities, allocator);
497 ASSERT_TRUE(decompressed.has_value());
498 EXPECT_EQ(decompressed->image_info.colorType(), kRGBA_F16_SkColorType);
499 EXPECT_EQ(decompressed->image_info.colorSpace(),
500 SkColorSpace::MakeSRGB().get());
506 auto image = SkImages::DeferredFromEncodedData(
data);
507 ASSERT_TRUE(
image !=
nullptr);
508 ASSERT_EQ(SkISize::Make(100, 100),
image->dimensions());
511 std::shared_ptr<ImageGenerator> generator =
513 ASSERT_TRUE(generator);
515 auto descriptor = fml::MakeRefCounted<ImageDescriptor>(std::move(
data),
516 std::move(generator));
518#if IMPELLER_SUPPORTS_RENDERING
519 std::shared_ptr<impeller::Capabilities> capabilities =
523 std::shared_ptr<impeller::Allocator> allocator =
524 std::make_shared<impeller::TestImpellerAllocator>();
525 std::optional<DecompressResult> wide_result =
527 descriptor.get(), SkISize::Make(100, 100), {100, 100},
528 true, capabilities, allocator);
530 ASSERT_TRUE(wide_result.has_value());
531 ASSERT_EQ(wide_result->image_info.colorType(), kBGR_101010x_XR_SkColorType);
532 ASSERT_TRUE(wide_result->image_info.colorSpace()->isSRGB());
534 const SkPixmap& wide_pixmap = wide_result->sk_bitmap->pixmap();
535 const uint32_t* pixel_ptr =
static_cast<const uint32_t*
>(wide_pixmap.addr());
536 bool found_deep_red =
false;
537 for (
int i = 0;
i < wide_pixmap.width() * wide_pixmap.height(); ++
i) {
538 uint32_t pixel = *pixel_ptr++;
542 if (fabsf(red - 1.0931f) < 0.01f && fabsf(green - -0.2268f) < 0.01f &&
543 fabsf(blue - -0.1501f) < 0.01f) {
544 found_deep_red =
true;
548 ASSERT_TRUE(found_deep_red);
550 std::optional<DecompressResult> narrow_result =
552 descriptor.get(), SkISize::Make(100, 100), {100, 100},
553 false, capabilities, allocator);
555 ASSERT_TRUE(narrow_result.has_value());
556 ASSERT_EQ(narrow_result->image_info.colorType(), kRGBA_8888_SkColorType);
562 auto image = SkImages::DeferredFromEncodedData(
data);
563 ASSERT_TRUE(
image !=
nullptr);
564 ASSERT_EQ(SkISize::Make(600, 200),
image->dimensions());
567 std::shared_ptr<ImageGenerator> generator =
569 ASSERT_TRUE(generator);
571 auto descriptor = fml::MakeRefCounted<ImageDescriptor>(std::move(
data),
572 std::move(generator));
574#if IMPELLER_SUPPORTS_RENDERING
575 std::shared_ptr<impeller::Capabilities> capabilities =
579 std::shared_ptr<impeller::Allocator> allocator =
580 std::make_shared<impeller::TestImpellerAllocator>();
581 std::optional<DecompressResult> result =
583 descriptor.get(), SkISize::Make(600, 200), {600, 200},
584 true, capabilities, allocator);
586 ASSERT_TRUE(result.has_value());
587 ASSERT_EQ(result->image_info.colorType(), kRGBA_8888_SkColorType);
594 CreateNewThread(
"platform"),
595 CreateNewThread(
"raster"),
596 CreateNewThread(
"ui"),
597 CreateNewThread(
"io")
602 std::unique_ptr<IOManager> io_manager;
604 auto release_io_manager = [&]() {
609 SkISize decoded_size = SkISize::MakeEmpty();
610 auto decode_image = [&]() {
613 settings, runners, loop->GetTaskRunner(),
614 io_manager->GetWeakIOManager(), std::make_shared<fml::SyncSwitch>());
619 ASSERT_GE(
data->size(), 0u);
622 std::shared_ptr<ImageGenerator> generator =
624 ASSERT_TRUE(generator);
626 auto descriptor = fml::MakeRefCounted<ImageDescriptor>(
627 std::move(
data), std::move(generator));
630 const std::string& decode_error) {
633 decoded_size =
image->skia_image()->dimensions();
636 image_decoder->Decode(descriptor, descriptor->width(), descriptor->height(),
640 auto set_up_io_manager_and_decode = [&]() {
641 io_manager = std::make_unique<TestIOManager>(runners.
GetIOTaskRunner());
649 ASSERT_EQ(decoded_size.width(), 600);
650 ASSERT_EQ(decoded_size.height(), 200);
656 CreateNewThread(
"platform"),
657 CreateNewThread(
"raster"),
658 CreateNewThread(
"ui"),
659 CreateNewThread(
"io")
664 std::unique_ptr<IOManager> io_manager;
666 auto release_io_manager = [&]() {
671 auto decode_image = [&]() {
674 settings, runners, loop->GetTaskRunner(),
675 io_manager->GetWeakIOManager(), std::make_shared<fml::SyncSwitch>());
680 ASSERT_GE(
data->size(), 0u);
683 std::shared_ptr<ImageGenerator> generator =
685 ASSERT_TRUE(generator);
687 auto descriptor = fml::MakeRefCounted<ImageDescriptor>(
688 std::move(
data), std::move(generator));
691 const std::string& decode_error) {
696 image_decoder->Decode(descriptor, descriptor->width(), descriptor->height(),
700 auto set_up_io_manager_and_decode = [&]() {
712 const auto image_dimensions =
713 SkImages::DeferredFromEncodedData(
717 ASSERT_FALSE(image_dimensions.isEmpty());
719 ASSERT_NE(image_dimensions.width(), image_dimensions.height());
723 CreateNewThread(
"platform"),
724 CreateNewThread(
"raster"),
725 CreateNewThread(
"ui"),
726 CreateNewThread(
"io")
730 std::unique_ptr<IOManager> io_manager;
731 std::unique_ptr<ImageDecoder> image_decoder;
735 io_manager = std::make_unique<TestIOManager>(runners.GetIOTaskRunner());
741 image_decoder = ImageDecoder::Make(settings, runners, loop->GetTaskRunner(),
742 io_manager->GetWeakIOManager(),
743 std::make_shared<fml::SyncSwitch>());
747 auto decoded_size = [&](uint32_t target_width,
748 uint32_t target_height) -> SkISize {
749 SkISize final_size = SkISize::MakeEmpty();
754 ASSERT_GE(
data->size(), 0u);
757 std::shared_ptr<ImageGenerator> generator =
759 ASSERT_TRUE(generator);
761 auto descriptor = fml::MakeRefCounted<ImageDescriptor>(
762 std::move(
data), std::move(generator));
765 [&](
const sk_sp<DlImage>&
image,
const std::string& decode_error) {
768 final_size =
image->skia_image()->dimensions();
771 image_decoder->Decode(descriptor, target_width, target_height,
callback);
777 ASSERT_EQ(SkISize::Make(3024, 4032), image_dimensions);
778 ASSERT_EQ(decoded_size(3024, 4032), image_dimensions);
779 ASSERT_EQ(decoded_size(100, 100), SkISize::Make(100, 100));
791 VerifyCodecRepeatCountsForGifAndWebPAreConsistentWithLoopCounts) {
796 ASSERT_TRUE(gif_mapping);
797 ASSERT_TRUE(webp_mapping);
804 ASSERT_TRUE(gif_generator);
805 ASSERT_TRUE(webp_generator);
808 ASSERT_EQ(gif_generator->GetPlayCount(),
static_cast<unsigned int>(2));
809 ASSERT_EQ(webp_generator->GetPlayCount(),
static_cast<unsigned int>(2));
812TEST(ImageDecoderTest, VerifySimpleDecoding) {
814 auto image = SkImages::DeferredFromEncodedData(
data);
815 ASSERT_TRUE(
image !=
nullptr);
816 EXPECT_EQ(600,
image->width());
817 EXPECT_EQ(200,
image->height());
820 std::shared_ptr<ImageGenerator> generator =
822 ASSERT_TRUE(generator);
824 auto descriptor = fml::MakeRefCounted<ImageDescriptor>(std::move(
data),
825 std::move(generator));
828 EXPECT_EQ(compressed_image->width(), 6);
829 EXPECT_EQ(compressed_image->height(), 2);
830 EXPECT_EQ(compressed_image->alphaType(), kOpaque_SkAlphaType);
832#if IMPELLER_SUPPORTS_RENDERING
833 std::shared_ptr<impeller::Capabilities> capabilities =
837 std::shared_ptr<impeller::Capabilities> capabilities_no_blit =
843 std::shared_ptr<impeller::Allocator> allocator =
844 std::make_shared<impeller::TestImpellerAllocator>();
846 descriptor.get(), SkISize::Make(6, 2), {1000, 1000},
847 false, capabilities, allocator);
848 EXPECT_EQ(result_1.sk_bitmap->width(), 75);
849 EXPECT_EQ(result_1.sk_bitmap->height(), 25);
854 descriptor.get(), SkISize::Make(6, 2), {10, 10},
855 false, capabilities, allocator);
856 EXPECT_EQ(result_2.sk_bitmap->width(), 6);
857 EXPECT_EQ(result_2.sk_bitmap->height(), 2);
862 descriptor.get(), SkISize::Make(60, 20), {10, 10},
863 false, capabilities, allocator);
864 EXPECT_EQ(result_3.sk_bitmap->width(), 10);
865 EXPECT_EQ(result_3.sk_bitmap->height(), 10);
869 descriptor.get(), SkISize::Make(6, 2), {1000, 1000},
870 false, capabilities_no_blit, allocator);
871 EXPECT_EQ(result_4.sk_bitmap->width(), 6);
872 EXPECT_EQ(result_4.sk_bitmap->height(), 2);
876TEST(ImageDecoderTest, ImagesWithTransparencyArePremulAlpha) {
880 std::shared_ptr<ImageGenerator> generator =
882 ASSERT_TRUE(generator);
884 auto descriptor = fml::MakeRefCounted<ImageDescriptor>(std::move(
data),
885 std::move(generator));
888 ASSERT_TRUE(compressed_image);
889 ASSERT_EQ(compressed_image->width(), 250);
890 ASSERT_EQ(compressed_image->height(), 250);
891 ASSERT_EQ(compressed_image->alphaType(), kPremul_SkAlphaType);
894TEST(ImageDecoderTest, VerifySubpixelDecodingPreservesExifOrientation) {
898 std::shared_ptr<ImageGenerator> generator =
900 ASSERT_TRUE(generator);
902 fml::MakeRefCounted<ImageDescriptor>(
data, std::move(generator));
906 ASSERT_EQ(600, descriptor->width());
907 ASSERT_EQ(200, descriptor->height());
909 auto image = SkImages::DeferredFromEncodedData(
data);
910 ASSERT_TRUE(
image !=
nullptr);
911 ASSERT_EQ(600,
image->width());
912 ASSERT_EQ(200,
image->height());
914 auto decode = [descriptor](uint32_t target_width, uint32_t target_height) {
916 descriptor.get(), target_width, target_height,
921 ASSERT_TRUE(expected_data !=
nullptr);
922 ASSERT_FALSE(expected_data->isEmpty());
924 auto assert_image = [&](
const auto& decoded_image,
925 const std::string& decode_error) {
926 ASSERT_EQ(decoded_image->dimensions(), SkISize::Make(300, 100));
927 sk_sp<SkData> encoded =
928 SkPngEncoder::Encode(
nullptr, decoded_image.get(), {});
929 ASSERT_TRUE(encoded->equals(expected_data.get()));
932 assert_image(decode(300, 100), {});
936 MultiFrameCodecCanBeCollectedBeforeIOTasksFinish) {
950 auto settings = CreateSettingsForFixture();
952 auto vm_data = vm_ref.GetVMData();
956 ASSERT_TRUE(gif_mapping);
959 std::shared_ptr<ImageGenerator> gif_generator =
961 ASSERT_TRUE(gif_generator);
964 CreateNewThread(
"platform"),
965 CreateNewThread(
"raster"),
966 CreateNewThread(
"ui"),
967 CreateNewThread(
"io")
971 std::unique_ptr<TestIOManager> io_manager;
975 io_manager = std::make_unique<TestIOManager>(runners.GetIOTaskRunner());
980 io_manager->GetWeakIOManager());
986 fml::AutoResetWaitableEvent isolate_latch;
987 fml::RefPtr<MultiFrameCodec> codec;
988 EXPECT_TRUE(isolate->RunInIsolateScope([&]() -> bool {
989 Dart_Handle library = Dart_RootLibrary();
990 if (Dart_IsError(library)) {
991 isolate_latch.Signal();
994 Dart_Handle closure =
995 Dart_GetField(library, Dart_NewStringFromCString(
"frameCallback"));
996 if (Dart_IsError(closure) || !Dart_IsClosure(closure)) {
997 isolate_latch.Signal();
1001 codec = fml::MakeRefCounted<MultiFrameCodec>(std::move(gif_generator));
1002 codec->getNextFrame(closure);
1004 isolate_latch.Signal();
1007 isolate_latch.Wait();
1009 EXPECT_FALSE(codec);
1015 PostTaskSync(runners.GetIOTaskRunner(), [&]() { io_manager.reset(); });
1019 auto context = std::make_shared<impeller::TestImpellerContext>();
1022 EXPECT_FALSE(allocator.allocPixelRef(
nullptr));
static DartVMRef Create(const Settings &settings, fml::RefPtr< const DartSnapshot > vm_snapshot=nullptr, fml::RefPtr< const DartSnapshot > isolate_snapshot=nullptr)
std::function< void(sk_sp< DlImage >, std::string)> ImageResult
static std::unique_ptr< ImageDecoder > Make(const Settings &settings, const TaskRunners &runners, std::shared_ptr< fml::ConcurrentTaskRunner > concurrent_task_runner, const fml::WeakPtr< IOManager > &io_manager, const std::shared_ptr< fml::SyncSwitch > &gpu_disabled_switch)
static DecompressResult DecompressTexture(ImageDescriptor *descriptor, SkISize target_size, impeller::ISize max_texture_size, bool supports_wide_gamut, const std::shared_ptr< const impeller::Capabilities > &capabilities, const std::shared_ptr< impeller::Allocator > &allocator)
static std::pair< sk_sp< DlImage >, std::string > UploadTextureToStorage(const std::shared_ptr< impeller::Context > &context, std::shared_ptr< SkBitmap > bitmap)
Create a texture from the provided bitmap.
static void UploadTextureToPrivate(ImageResult result, const std::shared_ptr< impeller::Context > &context, const std::shared_ptr< impeller::DeviceBuffer > &buffer, const SkImageInfo &image_info, const std::shared_ptr< SkBitmap > &bitmap, const std::optional< SkImageInfo > &resize_info, const std::shared_ptr< const fml::SyncSwitch > &gpu_disabled_switch)
Create a device private texture from the provided host buffer.
static sk_sp< SkImage > ImageFromCompressedData(ImageDescriptor *descriptor, uint32_t target_width, uint32_t target_height, const fml::tracing::TraceFlow &flow)
The minimal interface necessary for defining a decoder that can be used for both single and multi-fra...
Keeps a priority-ordered registry of image generator builders to be used when decoding images....
std::shared_ptr< ImageGenerator > CreateCompatibleGenerator(const sk_sp< SkData > &buffer)
Walks the list of image generator builders in descending priority order until a compatible ImageGener...
fml::RefPtr< fml::TaskRunner > GetUITaskRunner() const
fml::RefPtr< fml::TaskRunner > GetIOTaskRunner() const
fml::RefPtr< flutter::SkiaUnrefQueue > GetSkiaUnrefQueue() const override
std::shared_ptr< const fml::SyncSwitch > GetIsGpuDisabledSyncSwitch() override
~TestIOManager() override
void SetGpuDisabled(bool disabled)
fml::WeakPtr< IOManager > GetWeakIOManager() const override
std::shared_ptr< impeller::Context > GetImpellerContext() const override
Retrieve the impeller::Context.
bool did_access_is_gpu_disabled_sync_switch_
TestIOManager(const fml::RefPtr< fml::TaskRunner > &task_runner, bool has_gpu_context=true)
fml::WeakPtr< GrDirectContext > GetResourceContext() const override
An Image generator that pretends it can't recognize the data it was given.
const SkImageInfo & GetInfo()
Returns basic information about the contents of the encoded image. This information can almost always...
unsigned int GetPlayCount() const
The number of times an animated image should play through before playback stops.
const ImageGenerator::FrameInfo GetFrameInfo(unsigned int frame_index)
Get information about a single frame in the context of a multi-frame image, useful for animation and ...
bool GetPixels(const SkImageInfo &info, void *pixels, size_t row_bytes, unsigned int frame_index, std::optional< unsigned int > prior_frame)
Decode the image into a given buffer. This method is currently always used for sub-pixel image decodi...
~UnknownImageGenerator()=default
SkISize GetScaledDimensions(float scale)
Given a scale value, find the closest image size that can be used for efficiently decoding the image....
unsigned int GetFrameCount() const
Get the number of frames that the encoded image stores. This method is always expected to be called b...
static std::shared_ptr< ConcurrentMessageLoop > Create(size_t worker_count=std::thread::hardware_concurrency())
static void RunNowOrPostTask(const fml::RefPtr< fml::TaskRunner > &runner, const fml::closure &task)
virtual void PostTask(const fml::closure &task) override
virtual bool RunsTasksOnCurrentThread()
CapabilitiesBuilder & SetSupportsTextureToTextureBlits(bool value)
std::unique_ptr< Capabilities > Build()
To do anything rendering related with Impeller, you need a context.
std::shared_ptr< CommandQueue > GetCommandQueue() const override
Return the graphics queue for submitting command buffers.
std::shared_ptr< ShaderLibrary > GetShaderLibrary() const override
Returns the library of shaders used to specify the programmable stages of a pipeline.
RuntimeStageBackend GetRuntimeStageBackend() const override
Retrieve the runtime stage for this context type.
std::shared_ptr< PipelineLibrary > GetPipelineLibrary() const override
Returns the library of pipelines used by render or compute commands.
void Shutdown() override
Force all pending asynchronous work to finish. This is achieved by deleting all owned concurrent mess...
std::shared_ptr< Allocator > GetResourceAllocator() const override
Returns the allocator used to create textures and buffers on the device.
bool IsValid() const override
Determines if a context is valid. If the caller ever receives an invalid context, they must discard i...
void DisposeThreadLocalCachedResources() override
const std::shared_ptr< const Capabilities > & GetCapabilities() const override
Get the capabilities of Impeller context. All optionally supported feature of the platform,...
std::string DescribeGpuModel() const override
BackendType GetBackendType() const override
Get the graphics backend of an Impeller context.
size_t command_buffer_count_
std::shared_ptr< CommandBuffer > CreateCommandBuffer() const override
Create a new command buffer. Command buffers can be used to encode graphics, blit,...
void StoreTaskForGPU(const std::function< void()> &task, const std::function< void()> &failure) override
void FlushTasks(bool fail=false)
bool DidDisposeResources() const
std::shared_ptr< SamplerLibrary > GetSamplerLibrary() const override
Returns the library of combined image samplers used in shaders.
FlutterVulkanImage * image
G_BEGIN_DECLS GBytes * message
FlutterDesktopBinaryReply callback
#define FML_CHECK(condition)
#define FML_UNREACHABLE()
#define FML_DISALLOW_COPY_AND_ASSIGN(TypeName)
std::string GetCurrentTestName()
Gets the name of the currently running test. This is useful in generating logs or assets based on tes...
TEST_F(DisplayListTest, Defaults)
void PostTaskSync(const fml::RefPtr< fml::TaskRunner > &task_runner, const std::function< void()> &function)
std::string GetDefaultKernelFilePath()
Returns the default path to kernel_blob.bin. This file is within the directory returned by GetFixture...
std::unique_ptr< AutoIsolateShutdown > RunDartCodeInIsolate(DartVMRef &vm_ref, const Settings &settings, const TaskRunners &task_runners, std::string entrypoint, const std::vector< std::string > &args, const std::string &kernel_file_path, fml::WeakPtr< IOManager > io_manager, std::unique_ptr< PlatformConfiguration > platform_configuration)
float DecodeBGR10(uint32_t x)
sk_sp< SkData > OpenFixtureAsSkData(const std::string &fixture_name)
Opens a fixture of the given file name and returns a Skia SkData holding its contents.
TEST(NativeAssetsManagerTest, NoAvailableAssets)
it will be possible to load the file into Perfetto s trace viewer use test Running tests that layout and measure text will not yield consistent results across various platforms Enabling this option will make font resolution default to the Ahem test font on all disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font manager
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
TEST_F(EngineAnimatorTest, AnimatorAcceptsMultipleRenders)
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir Path to the cache directory This is different from the persistent_cache_path in embedder which is used for Skia shader cache icu native lib Path to the library file that exports the ICU data vm service The hostname IP address on which the Dart VM Service should be served If not defaults to or::depending on whether ipv6 is specified disable vm Disable the Dart VM Service The Dart VM Service is never available in release mode Bind to the IPv6 localhost address for the Dart VM Service Ignored if vm service host is set profile Make the profiler discard new samples once the profiler sample buffer is full When this flag is not the profiler sample buffer is used as a ring buffer
Info about a single frame in the context of a multi-frame image, useful for animation and blending.