| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef FLUTTER_SHELL_PLATFORM_ANDROID_ANDROID_IMAGE_GENERATOR_H_ | |
| #define FLUTTER_SHELL_PLATFORM_ANDROID_ANDROID_IMAGE_GENERATOR_H_ | |
| #include <jni.h> | |
| #include "flutter/fml/memory/ref_ptr.h" | |
| #include "flutter/fml/synchronization/waitable_event.h" | |
| #include "flutter/fml/task_runner.h" | |
| #include "flutter/lib/ui/painting/image_generator.h" | |
| namespace flutter { | |
| class AndroidImageGenerator : public ImageGenerator { | |
| private: | |
| explicit AndroidImageGenerator(sk_sp<SkData> buffer); | |
| public: | |
| ~AndroidImageGenerator(); | |
| // |ImageGenerator| | |
| const SkImageInfo& GetInfo() override; | |
| // |ImageGenerator| | |
| unsigned int GetFrameCount() const override; | |
| // |ImageGenerator| | |
| unsigned int GetPlayCount() const override; | |
| // |ImageGenerator| | |
| const ImageGenerator::FrameInfo GetFrameInfo( | |
| unsigned int frame_index) const override; | |
| // |ImageGenerator| | |
| SkISize GetScaledDimensions(float desired_scale) override; | |
| // |ImageGenerator| | |
| bool GetPixels(const SkImageInfo& info, | |
| void* pixels, | |
| size_t row_bytes, | |
| unsigned int frame_index, | |
| std::optional<unsigned int> prior_frame) override; | |
| void DecodeImage(); | |
| static bool Register(JNIEnv* env); | |
| static std::shared_ptr<ImageGenerator> MakeFromData( | |
| sk_sp<SkData> data, | |
| const fml::RefPtr<fml::TaskRunner>& task_runner); | |
| static void NativeImageHeaderCallback(JNIEnv* env, | |
| jclass jcaller, | |
| jlong generator_pointer, | |
| int width, | |
| int height); | |
| private: | |
| sk_sp<SkData> data_; | |
| sk_sp<SkData> software_decoded_data_; | |
| SkImageInfo image_info_; | |
| /// Blocks until the header of the image has been decoded and the image | |
| /// dimensions have been determined. | |
| fml::ManualResetWaitableEvent header_decoded_latch_; | |
| /// Blocks until the image has been fully decoded. | |
| fml::ManualResetWaitableEvent fully_decoded_latch_; | |
| void DoDecodeImage(); | |
| bool IsValidImageData(); | |
| FML_DISALLOW_COPY_ASSIGN_AND_MOVE(AndroidImageGenerator); | |
| }; | |
| } // namespace flutter | |
| #endif // FLUTTER_SHELL_PLATFORM_ANDROID_ANDROID_IMAGE_GENERATOR_H_ |