@@ -79,29 +79,17 @@ SkImageShader::SkImageShader(sk_sp<SkImage> img,
7979
8080SkImageShader::SkImageShader (sk_sp<SkImage> img,
8181 SkTileMode tmx, SkTileMode tmy,
82- const SkFilterOptions & options,
82+ const SkSamplingOptions & options,
8383 const SkMatrix* localMatrix)
8484 : INHERITED(localMatrix)
8585 , fImage(std::move(img))
8686 , fTileModeX(optimize(tmx, fImage ->width ()))
8787 , fTileModeY(optimize(tmy, fImage ->height ()))
88- , fFilterEnum(FilterEnum::kUseFilterOptions )
88+ , fFilterEnum(options.fUseCubic ? FilterEnum::kUseCubicResampler
89+ : FilterEnum::kUseFilterOptions )
8990 , fClampAsIfUnpremul(false )
90- , fFilterOptions(options)
91- {}
92-
93- SkImageShader::SkImageShader (sk_sp<SkImage> img,
94- SkTileMode tmx, SkTileMode tmy,
95- SkImage::CubicResampler cubic,
96- const SkMatrix* localMatrix)
97- : INHERITED(localMatrix)
98- , fImage(std::move(img))
99- , fTileModeX(optimize(tmx, fImage ->width ()))
100- , fTileModeY(optimize(tmy, fImage ->height ()))
101- , fFilterEnum(FilterEnum::kUseCubicResampler )
102- , fClampAsIfUnpremul(false )
103- , fFilterOptions({}) // ignored
104- , fCubic(cubic)
91+ , fFilterOptions(options.fFilter )
92+ , fCubic(options.fCubic )
10593{}
10694
10795// fClampAsIfUnpremul is always false when constructed through public APIs,
@@ -116,23 +104,25 @@ sk_sp<SkFlattenable> SkImageShader::CreateProc(SkReadBuffer& buffer) {
116104 fe = buffer.read32LE <FilterEnum>(kLast );
117105 }
118106
119- SkFilterOptions fo{ SkSamplingMode::kNearest , SkMipmapMode::kNone };
120- SkImage::CubicResampler cubic{};
107+ SkSamplingOptions op;
121108
122109 if (buffer.isVersionLT (SkPicturePriv::kCubicResamplerImageShader_Version )) {
123110 if (!buffer.isVersionLT (SkPicturePriv::kFilterOptionsInImageShader_Version )) {
124- fo.fSampling = buffer.read32LE <SkSamplingMode>(SkSamplingMode::kLinear );
125- fo.fMipmap = buffer.read32LE <SkMipmapMode>(SkMipmapMode::kLinear );
111+ op.fUseCubic = false ;
112+ op.fFilter .fSampling = buffer.read32LE <SkSamplingMode>(SkSamplingMode::kLinear );
113+ op.fFilter .fMipmap = buffer.read32LE <SkMipmapMode>(SkMipmapMode::kLinear );
126114 }
127115 } else {
128116 switch (fe) {
129117 case kUseFilterOptions :
130- fo.fSampling = buffer.read32LE <SkSamplingMode>(SkSamplingMode::kLinear );
131- fo.fMipmap = buffer.read32LE <SkMipmapMode>(SkMipmapMode::kLinear );
118+ op.fUseCubic = false ;
119+ op.fFilter .fSampling = buffer.read32LE <SkSamplingMode>(SkSamplingMode::kLinear );
120+ op.fFilter .fMipmap = buffer.read32LE <SkMipmapMode>(SkMipmapMode::kLinear );
132121 break ;
133122 case kUseCubicResampler :
134- cubic.B = buffer.readScalar ();
135- cubic.C = buffer.readScalar ();
123+ op.fUseCubic = true ;
124+ op.fCubic .B = buffer.readScalar ();
125+ op.fCubic .C = buffer.readScalar ();
136126 break ;
137127 default :
138128 break ;
@@ -148,9 +138,8 @@ sk_sp<SkFlattenable> SkImageShader::CreateProc(SkReadBuffer& buffer) {
148138
149139 switch (fe) {
150140 case kUseFilterOptions :
151- return SkImageShader::Make (std::move (img), tmx, tmy, fo, &localMatrix);
152141 case kUseCubicResampler :
153- return SkImageShader::Make (std::move (img), tmx, tmy, cubic , &localMatrix);
142+ return SkImageShader::Make (std::move (img), tmx, tmy, op , &localMatrix);
154143 default :
155144 break ;
156145 }
@@ -297,27 +286,21 @@ sk_sp<SkShader> SkImageShader::Make(sk_sp<SkImage> image,
297286
298287sk_sp<SkShader> SkImageShader::Make (sk_sp<SkImage> image,
299288 SkTileMode tmx, SkTileMode tmy,
300- const SkFilterOptions & options,
289+ const SkSamplingOptions & options,
301290 const SkMatrix* localMatrix) {
302- if (!image) {
303- return sk_make_sp<SkEmptyShader>();
304- }
305- return sk_sp<SkShader>{
306- new SkImageShader (image, tmx, tmy, options, localMatrix)
291+ auto is_unit = [](float x) {
292+ return x >= 0 && x <= 1 ;
307293 };
308- }
309-
310- sk_sp<SkShader> SkImageShader::Make (sk_sp<SkImage> image, SkTileMode tmx, SkTileMode tmy,
311- SkImage::CubicResampler cubic, const SkMatrix* localMatrix) {
312- if (!(cubic.B >= 0 && cubic.B <= 1 &&
313- cubic.C >= 0 && cubic.C <= 1 )) {
314- return nullptr ;
294+ if (options.fUseCubic ) {
295+ if (!is_unit (options.fCubic .B ) || !is_unit (options.fCubic .C )) {
296+ return nullptr ;
297+ }
315298 }
316299 if (!image) {
317300 return sk_make_sp<SkEmptyShader>();
318301 }
319302 return sk_sp<SkShader>{
320- new SkImageShader (image, tmx, tmy, cubic , localMatrix)
303+ new SkImageShader (image, tmx, tmy, options , localMatrix)
321304 };
322305}
323306
@@ -393,7 +376,7 @@ std::unique_ptr<GrFragmentProcessor> SkImageShader::asFragmentProcessor(
393376 GrSamplerState::Filter fm;
394377 GrSamplerState::MipmapMode mm;
395378 bool bicubic;
396- SkImage::CubicResampler kernel = GrBicubicEffect::gMitchell ;
379+ SkCubicResampler kernel = GrBicubicEffect::gMitchell ;
397380
398381 switch (fFilterEnum ) {
399382 case FilterEnum::kUseFilterOptions :
0 commit comments