Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(40)

Side by Side Diff: src/core/SkImageFilter.cpp

Issue 1826893002: Switch new SkImageFilter internal methods over to sk_sp (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Change method name to drawSpriteWithFilter Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/core/SkDevice.cpp ('k') | src/core/SkLocalMatrixImageFilter.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2012 The Android Open Source Project 2 * Copyright 2012 The Android Open Source Project
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkImageFilter.h" 8 #include "SkImageFilter.h"
9 #include "SkImageFilterCacheKey.h" 9 #include "SkImageFilterCacheKey.h"
10 10
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 SkImageFilter* input = this->getInput(i); 207 SkImageFilter* input = this->getInput(i);
208 buffer.writeBool(input != nullptr); 208 buffer.writeBool(input != nullptr);
209 if (input != nullptr) { 209 if (input != nullptr) {
210 buffer.writeFlattenable(input); 210 buffer.writeFlattenable(input);
211 } 211 }
212 } 212 }
213 buffer.writeRect(fCropRect.rect()); 213 buffer.writeRect(fCropRect.rect());
214 buffer.writeUInt(fCropRect.flags()); 214 buffer.writeUInt(fCropRect.flags());
215 } 215 }
216 216
217 SkSpecialImage* SkImageFilter::filterImage(SkSpecialImage* src, const Context& c ontext, 217 sk_sp<SkSpecialImage> SkImageFilter::filterImage(SkSpecialImage* src, const Cont ext& context,
218 SkIPoint* offset) const { 218 SkIPoint* offset) const {
219 SkASSERT(src && offset); 219 SkASSERT(src && offset);
220 220
221 uint32_t srcGenID = fUsesSrcInput ? src->uniqueID() : 0; 221 uint32_t srcGenID = fUsesSrcInput ? src->uniqueID() : 0;
222 const SkIRect srcSubset = fUsesSrcInput ? src->subset() : SkIRect::MakeWH(0, 0); 222 const SkIRect srcSubset = fUsesSrcInput ? src->subset() : SkIRect::MakeWH(0, 0);
223 Cache::Key key(fUniqueID, context.ctm(), context.clipBounds(), srcGenID, src Subset); 223 Cache::Key key(fUniqueID, context.ctm(), context.clipBounds(), srcGenID, src Subset);
224 if (context.cache()) { 224 if (context.cache()) {
225 SkSpecialImage* result = context.cache()->get(key, offset); 225 SkSpecialImage* result = context.cache()->get(key, offset);
226 if (result) { 226 if (result) {
227 return SkRef(result); 227 return sk_sp<SkSpecialImage>(SkRef(result));
228 } 228 }
229 } 229 }
230 230
231 SkSpecialImage* result = this->onFilterImage(src, context, offset); 231 sk_sp<SkSpecialImage> result(this->onFilterImage(src, context, offset));
232 if (result && context.cache()) { 232 if (result && context.cache()) {
233 context.cache()->set(key, result, *offset); 233 context.cache()->set(key, result.get(), *offset);
234 SkAutoMutexAcquire mutex(fMutex); 234 SkAutoMutexAcquire mutex(fMutex);
235 fCacheKeys.push_back(key); 235 fCacheKeys.push_back(key);
236 } 236 }
237 237
238 return result; 238 return result;
239 } 239 }
240 240
241 bool SkImageFilter::filterImageDeprecated(Proxy* proxy, const SkBitmap& src, 241 bool SkImageFilter::filterImageDeprecated(Proxy* proxy, const SkBitmap& src,
242 const Context& context, 242 const Context& context,
243 SkBitmap* result, SkIPoint* offset) co nst { 243 SkBitmap* result, SkIPoint* offset) co nst {
(...skipping 29 matching lines...) Expand all
273 SkImageFilter* input = this->getInput(index); 273 SkImageFilter* input = this->getInput(index);
274 if (!input) { 274 if (!input) {
275 return true; 275 return true;
276 } 276 }
277 277
278 sk_sp<SkSpecialImage> specialSrc(SkSpecialImage::internal_fromBM(proxy, src) ); 278 sk_sp<SkSpecialImage> specialSrc(SkSpecialImage::internal_fromBM(proxy, src) );
279 if (!specialSrc) { 279 if (!specialSrc) {
280 return false; 280 return false;
281 } 281 }
282 282
283 SkAutoTUnref<SkSpecialImage> tmp(input->onFilterImage(specialSrc.get(), 283 sk_sp<SkSpecialImage> tmp(input->onFilterImage(specialSrc.get(),
284 this->mapContext(ctx), 284 this->mapContext(ctx),
285 offset)); 285 offset));
286 if (!tmp) { 286 if (!tmp) {
287 return false; 287 return false;
288 } 288 }
289 289
290 return tmp->internal_getBM(result); 290 return tmp->internal_getBM(result);
291 } 291 }
292 292
293 SkIRect SkImageFilter::filterBounds(const SkIRect& src, const SkMatrix& ctm, 293 SkIRect SkImageFilter::filterBounds(const SkIRect& src, const SkMatrix& ctm,
294 MapDirection direction) const { 294 MapDirection direction) const {
295 if (kReverse_MapDirection == direction) { 295 if (kReverse_MapDirection == direction) {
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 SkBitmap*, SkIPoint*) const { 334 SkBitmap*, SkIPoint*) const {
335 // Only classes that now use the new SkSpecialImage-based path will not have 335 // Only classes that now use the new SkSpecialImage-based path will not have
336 // onFilterImageDeprecated methods. For those classes we should never be 336 // onFilterImageDeprecated methods. For those classes we should never be
337 // calling this method. 337 // calling this method.
338 SkASSERT(0); 338 SkASSERT(0);
339 return false; 339 return false;
340 } 340 }
341 341
342 // SkImageFilter-derived classes that do not yet have their own onFilterImage 342 // SkImageFilter-derived classes that do not yet have their own onFilterImage
343 // implementation convert back to calling the deprecated filterImage method 343 // implementation convert back to calling the deprecated filterImage method
344 SkSpecialImage* SkImageFilter::onFilterImage(SkSpecialImage* src, const Context& ctx, 344 sk_sp<SkSpecialImage> SkImageFilter::onFilterImage(SkSpecialImage* src, const Co ntext& ctx,
345 SkIPoint* offset) const { 345 SkIPoint* offset) const {
346 SkBitmap srcBM, resultBM; 346 SkBitmap srcBM, resultBM;
347 347
348 if (!src->internal_getBM(&srcBM)) { 348 if (!src->internal_getBM(&srcBM)) {
349 return nullptr; 349 return nullptr;
350 } 350 }
351 351
352 // This is the only valid call to the old filterImage path 352 // This is the only valid call to the old filterImage path
353 if (!this->filterImageDeprecated(src->internal_getProxy(), srcBM, ctx, &resu ltBM, offset)) { 353 if (!this->filterImageDeprecated(src->internal_getProxy(), srcBM, ctx, &resu ltBM, offset)) {
354 return nullptr; 354 return nullptr;
355 } 355 }
356 356
357 return SkSpecialImage::internal_fromBM(src->internal_getProxy(), resultBM).r elease(); 357 return SkSpecialImage::internal_fromBM(src->internal_getProxy(), resultBM);
358 } 358 }
359 359
360 bool SkImageFilter::canFilterImageGPU() const { 360 bool SkImageFilter::canFilterImageGPU() const {
361 return this->asFragmentProcessor(nullptr, nullptr, SkMatrix::I(), SkIRect()) ; 361 return this->asFragmentProcessor(nullptr, nullptr, SkMatrix::I(), SkIRect()) ;
362 } 362 }
363 363
364 bool SkImageFilter::filterImageGPUDeprecated(Proxy* proxy, const SkBitmap& src, const Context& ctx, 364 bool SkImageFilter::filterImageGPUDeprecated(Proxy* proxy, const SkBitmap& src, const Context& ctx,
365 SkBitmap* result, SkIPoint* offset) const { 365 SkBitmap* result, SkIPoint* offset) const {
366 #if SK_SUPPORT_GPU 366 #if SK_SUPPORT_GPU
367 SkBitmap input = src; 367 SkBitmap input = src;
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
482 SkCanvas* canvas = surf->getCanvas(); 482 SkCanvas* canvas = surf->getCanvas();
483 SkASSERT(canvas); 483 SkASSERT(canvas);
484 484
485 canvas->clear(0x0); 485 canvas->clear(0x0);
486 486
487 src->draw(canvas, offX, offY, nullptr); 487 src->draw(canvas, offX, offY, nullptr);
488 488
489 return surf->makeImageSnapshot(); 489 return surf->makeImageSnapshot();
490 } 490 }
491 491
492 SkSpecialImage* SkImageFilter::applyCropRect(const Context& ctx, 492 sk_sp<SkSpecialImage> SkImageFilter::applyCropRect(const Context& ctx,
493 SkSpecialImage* src, 493 SkSpecialImage* src,
494 SkIPoint* srcOffset, 494 SkIPoint* srcOffset,
495 SkIRect* bounds) const { 495 SkIRect* bounds) const {
496 SkIRect srcBounds; 496 SkIRect srcBounds;
497 srcBounds = SkIRect::MakeXYWH(srcOffset->fX, srcOffset->fY, src->width(), sr c->height()); 497 srcBounds = SkIRect::MakeXYWH(srcOffset->fX, srcOffset->fY, src->width(), sr c->height());
498 498
499 SkIRect dstBounds = this->onFilterNodeBounds(srcBounds, ctx.ctm(), kForward_ MapDirection); 499 SkIRect dstBounds = this->onFilterNodeBounds(srcBounds, ctx.ctm(), kForward_ MapDirection);
500 fCropRect.applyTo(dstBounds, ctx.ctm(), bounds); 500 fCropRect.applyTo(dstBounds, ctx.ctm(), bounds);
501 if (!bounds->intersect(ctx.clipBounds())) { 501 if (!bounds->intersect(ctx.clipBounds())) {
502 return nullptr; 502 return nullptr;
503 } 503 }
504 504
505 if (srcBounds.contains(*bounds)) { 505 if (srcBounds.contains(*bounds)) {
506 return SkRef(src); 506 return sk_sp<SkSpecialImage>(SkRef(src));
507 } else { 507 } else {
508 sk_sp<SkSpecialImage> img(pad_image(src, 508 sk_sp<SkSpecialImage> img(pad_image(src,
509 bounds->width(), bounds->height(), 509 bounds->width(), bounds->height(),
510 srcOffset->x() - bounds->x(), 510 srcOffset->x() - bounds->x(),
511 srcOffset->y() - bounds->y())); 511 srcOffset->y() - bounds->y()));
512 *srcOffset = SkIPoint::Make(bounds->x(), bounds->y()); 512 *srcOffset = SkIPoint::Make(bounds->x(), bounds->y());
513 return img.release(); 513 return img;
514 } 514 }
515 } 515 }
516 516
517 SkIRect SkImageFilter::onFilterBounds(const SkIRect& src, const SkMatrix& ctm, 517 SkIRect SkImageFilter::onFilterBounds(const SkIRect& src, const SkMatrix& ctm,
518 MapDirection direction) const { 518 MapDirection direction) const {
519 if (fInputCount < 1) { 519 if (fInputCount < 1) {
520 return src; 520 return src;
521 } 521 }
522 522
523 SkIRect totalBounds; 523 SkIRect totalBounds;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
556 return SkMatrixImageFilter::Create(matrix, filterQuality, input); 556 return SkMatrixImageFilter::Create(matrix, filterQuality, input);
557 } 557 }
558 558
559 SkImageFilter* SkImageFilter::newWithLocalMatrix(const SkMatrix& matrix) const { 559 SkImageFilter* SkImageFilter::newWithLocalMatrix(const SkMatrix& matrix) const {
560 // SkLocalMatrixImageFilter takes SkImage* in its factory, but logically tha t parameter 560 // SkLocalMatrixImageFilter takes SkImage* in its factory, but logically tha t parameter
561 // is *always* treated as a const ptr. Hence the const-cast here. 561 // is *always* treated as a const ptr. Hence the const-cast here.
562 // 562 //
563 return SkLocalMatrixImageFilter::Create(matrix, const_cast<SkImageFilter*>(t his)); 563 return SkLocalMatrixImageFilter::Create(matrix, const_cast<SkImageFilter*>(t his));
564 } 564 }
565 565
566 SkSpecialImage* SkImageFilter::filterInput(int index, 566 sk_sp<SkSpecialImage> SkImageFilter::filterInput(int index,
567 SkSpecialImage* src, 567 SkSpecialImage* src,
568 const Context& ctx, 568 const Context& ctx,
569 SkIPoint* offset) const { 569 SkIPoint* offset) const {
570 SkImageFilter* input = this->getInput(index); 570 SkImageFilter* input = this->getInput(index);
571 if (!input) { 571 if (!input) {
572 return SkRef(src); 572 return sk_sp<SkSpecialImage>(SkRef(src));
573 } 573 }
574 574
575 SkAutoTUnref<SkSpecialImage> result(input->filterImage(src, this->mapContext (ctx), offset)); 575 sk_sp<SkSpecialImage> result(input->filterImage(src, this->mapContext(ctx), offset));
576 576
577 #if SK_SUPPORT_GPU 577 #if SK_SUPPORT_GPU
578 if (src->peekTexture() && result && !result->peekTexture()) { 578 if (src->peekTexture() && result && !result->peekTexture()) {
579 // Keep the result on the GPU - this is still required for some 579 // Keep the result on the GPU - this is still required for some
580 // image filters that don't support GPU in all cases 580 // image filters that don't support GPU in all cases
581 GrContext* context = src->peekTexture()->getContext(); 581 GrContext* context = src->peekTexture()->getContext();
582 return result->makeTextureImage(src->internal_getProxy(), context).relea se(); 582 return result->makeTextureImage(src->internal_getProxy(), context);
583 } 583 }
584 #endif 584 #endif
585 585
586 return result.release(); 586 return result;
587 } 587 }
588 588
589 #if SK_SUPPORT_GPU 589 #if SK_SUPPORT_GPU
590 590
591 bool SkImageFilter::filterInputGPUDeprecated(int index, SkImageFilter::Proxy* pr oxy, 591 bool SkImageFilter::filterInputGPUDeprecated(int index, SkImageFilter::Proxy* pr oxy,
592 const SkBitmap& src, const Context& ctx, 592 const SkBitmap& src, const Context& ctx,
593 SkBitmap* result, SkIPoint* offset) const { 593 SkBitmap* result, SkIPoint* offset) const {
594 SkImageFilter* input = this->getInput(index); 594 SkImageFilter* input = this->getInput(index);
595 if (!input) { 595 if (!input) {
596 return true; 596 return true;
597 } 597 }
598 598
599 sk_sp<SkSpecialImage> specialSrc(SkSpecialImage::internal_fromBM(proxy, src) ); 599 sk_sp<SkSpecialImage> specialSrc(SkSpecialImage::internal_fromBM(proxy, src) );
600 if (!specialSrc) { 600 if (!specialSrc) {
601 return false; 601 return false;
602 } 602 }
603 603
604 SkAutoTUnref<SkSpecialImage> tmp(input->onFilterImage(specialSrc.get(), 604 sk_sp<SkSpecialImage> tmp(input->onFilterImage(specialSrc.get(),
605 this->mapContext(ctx), 605 this->mapContext(ctx),
606 offset)); 606 offset));
607 if (!tmp) { 607 if (!tmp) {
608 return false; 608 return false;
609 } 609 }
610 610
611 if (!tmp->internal_getBM(result)) { 611 if (!tmp->internal_getBM(result)) {
612 return false; 612 return false;
613 } 613 }
614 614
615 if (!result->getTexture()) { 615 if (!result->getTexture()) {
616 GrContext* context = src.getTexture()->getContext(); 616 GrContext* context = src.getTexture()->getContext();
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 } 798 }
799 return dev; 799 return dev;
800 } 800 }
801 801
802 bool SkImageFilter::DeviceProxy::filterImage(const SkImageFilter* filter, const SkBitmap& src, 802 bool SkImageFilter::DeviceProxy::filterImage(const SkImageFilter* filter, const SkBitmap& src,
803 const SkImageFilter::Context& ctx, 803 const SkImageFilter::Context& ctx,
804 SkBitmap* result, SkIPoint* offset) { 804 SkBitmap* result, SkIPoint* offset) {
805 return fDevice->filterImage(filter, src, ctx, result, offset); 805 return fDevice->filterImage(filter, src, ctx, result, offset);
806 } 806 }
807 807
OLDNEW
« no previous file with comments | « src/core/SkDevice.cpp ('k') | src/core/SkLocalMatrixImageFilter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698