30Dart_Handle ReusableFragmentShader::Create(Dart_Handle wrapper,
32 Dart_Handle float_count_handle,
33 Dart_Handle sampler_count_handle) {
34 auto* fragment_program =
36 uint64_t float_count =
38 uint64_t sampler_count =
41 auto res = fml::MakeRefCounted<ReusableFragmentShader>(
42 fml::Ref(fragment_program), float_count, sampler_count);
43 res->AssociateWithDartWrapper(wrapper);
45 void* raw_uniform_data =
46 reinterpret_cast<void*
>(res->uniform_data_->writable_data());
47 return Dart_NewExternalTypedData(Dart_TypedData_kFloat32, raw_uniform_data,
63void ReusableFragmentShader::SetImageSampler(Dart_Handle index_handle,
64 Dart_Handle image_handle,
65 int filterQualityIndex) {
69 if (index >= samplers_.size()) {
70 Dart_ThrowException(
tonic::ToDart(
"Sampler index out of bounds"));
74 Dart_ThrowException(
tonic::ToDart(
"Image has been disposed"));
78 Dart_ThrowException(
tonic::ToDart(
"Image is not thread-safe"));
84 samplers_[index] = DlColorSource::MakeImage(
85 image->
image(), DlTileMode::kClamp, DlTileMode::kClamp,
86 ImageFilter::SamplingFromIndex(filterQualityIndex),
nullptr);
89 FML_DCHECK(samplers_[index]->isUIThreadSafe());
91 auto* uniform_floats =
92 reinterpret_cast<float*
>(uniform_data_->writable_data());
93 uniform_floats[float_count_ + 2 * index] =
image->width();
94 uniform_floats[float_count_ + 2 * index + 1] =
image->height();
97std::shared_ptr<DlImageFilter> ReusableFragmentShader::as_image_filter()
const {
103 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
104 uniform_data->resize(uniform_data_->size());
105 memcpy(uniform_data->data(), uniform_data_->bytes(), uniform_data->size());
107 return program_->MakeDlImageFilter(std::move(uniform_data), samplers_);
110std::shared_ptr<DlColorSource> ReusableFragmentShader::shader(
117 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
118 uniform_data->resize(uniform_data_->size());
119 memcpy(uniform_data->data(), uniform_data_->bytes(), uniform_data->size());
121 auto source = program_->MakeDlColorSource(std::move(uniform_data), samplers_);