| // 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. |
| |
| #include "flutter/lib/ui/painting/image_shader.h" |
| #include "flutter/lib/ui/painting/image_filter.h" |
| |
| #include "flutter/lib/ui/painting/display_list_image_gpu.h" |
| #include "flutter/lib/ui/ui_dart_state.h" |
| #include "third_party/tonic/converter/dart_converter.h" |
| #include "third_party/tonic/dart_args.h" |
| #include "third_party/tonic/dart_binding_macros.h" |
| #include "third_party/tonic/dart_library_natives.h" |
| |
| using tonic::ToDart; |
| |
| namespace flutter { |
| |
| IMPLEMENT_WRAPPERTYPEINFO(ui, ImageShader); |
| |
| void ImageShader::Create(Dart_Handle wrapper) { |
| auto res = fml::MakeRefCounted<ImageShader>(); |
| res->AssociateWithDartWrapper(wrapper); |
| } |
| |
| Dart_Handle ImageShader::initWithImage(CanvasImage* image, |
| DlTileMode tmx, |
| DlTileMode tmy, |
| int filter_quality_index, |
| Dart_Handle matrix_handle) { |
| // CanvasImage should have already checked for a UI thread safe image. |
| if (!image || !image->image()->isUIThreadSafe()) { |
| return ToDart("ImageShader constructor called with non-genuine Image."); |
| } |
| |
| image_ = image->image(); |
| tonic::Float64List matrix4(matrix_handle); |
| SkMatrix local_matrix = ToSkMatrix(matrix4); |
| matrix4.Release(); |
| sampling_is_locked_ = filter_quality_index >= 0; |
| DlImageSampling sampling = |
| sampling_is_locked_ ? ImageFilter::SamplingFromIndex(filter_quality_index) |
| : DlImageSampling::kLinear; |
| cached_shader_ = std::make_shared<DlImageColorSource>( |
| image_, tmx, tmy, sampling, &local_matrix); |
| FML_DCHECK(cached_shader_->isUIThreadSafe()); |
| return Dart_Null(); |
| } |
| |
| std::shared_ptr<DlColorSource> ImageShader::shader(DlImageSampling sampling) { |
| if (sampling_is_locked_ || sampling == cached_shader_->sampling()) { |
| return cached_shader_; |
| } |
| return cached_shader_->with_sampling(sampling); |
| } |
| |
| int ImageShader::width() { |
| return image_->width(); |
| } |
| |
| int ImageShader::height() { |
| return image_->height(); |
| } |
| |
| void ImageShader::dispose() { |
| cached_shader_.reset(); |
| image_.reset(); |
| ClearDartWrapper(); |
| } |
| |
| ImageShader::ImageShader() = default; |
| |
| ImageShader::~ImageShader() = default; |
| |
| } // namespace flutter |