OLD | NEW |
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 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 return false; | 265 return false; |
266 } | 266 } |
267 | 267 |
268 bool SkImageFilter::filterInputDeprecated(int index, Proxy* proxy, const SkBitma
p& src, | 268 bool SkImageFilter::filterInputDeprecated(int index, Proxy* proxy, const SkBitma
p& src, |
269 const Context& ctx, | 269 const Context& ctx, |
270 SkBitmap* result, SkIPoint* offset) co
nst { | 270 SkBitmap* result, SkIPoint* offset) co
nst { |
271 SkImageFilter* input = this->getInput(index); | 271 SkImageFilter* input = this->getInput(index); |
272 if (!input) { | 272 if (!input) { |
273 return true; | 273 return true; |
274 } | 274 } |
275 return input->filterImageDeprecated(proxy, src, this->mapContext(ctx), resul
t, offset); | 275 |
| 276 SkAutoTUnref<SkSpecialImage> specialSrc(SkSpecialImage::internal_fromBM(prox
y, src)); |
| 277 if (!specialSrc) { |
| 278 return false; |
| 279 } |
| 280 |
| 281 SkAutoTUnref<SkSpecialImage> tmp(input->onFilterImage(specialSrc, |
| 282 this->mapContext(ctx), |
| 283 offset)); |
| 284 if (!tmp) { |
| 285 return false; |
| 286 } |
| 287 |
| 288 return tmp->internal_getBM(result); |
276 } | 289 } |
277 | 290 |
278 bool SkImageFilter::filterBounds(const SkIRect& src, const SkMatrix& ctm, SkIRec
t* dst, | 291 bool SkImageFilter::filterBounds(const SkIRect& src, const SkMatrix& ctm, SkIRec
t* dst, |
279 MapDirection direction) const { | 292 MapDirection direction) const { |
280 SkASSERT(dst); | 293 SkASSERT(dst); |
281 SkIRect bounds; | 294 SkIRect bounds; |
282 if (kReverse_MapDirection == direction) { | 295 if (kReverse_MapDirection == direction) { |
283 this->onFilterNodeBounds(src, ctm, &bounds, direction); | 296 this->onFilterNodeBounds(src, ctm, &bounds, direction); |
284 return this->onFilterBounds(bounds, ctm, dst, direction); | 297 return this->onFilterBounds(bounds, ctm, dst, direction); |
285 } else { | 298 } else { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
320 SkImageFilter* input = this->getInput(i); | 333 SkImageFilter* input = this->getInput(i); |
321 if (input && !input->canComputeFastBounds()) { | 334 if (input && !input->canComputeFastBounds()) { |
322 return false; | 335 return false; |
323 } | 336 } |
324 } | 337 } |
325 return true; | 338 return true; |
326 } | 339 } |
327 | 340 |
328 bool SkImageFilter::onFilterImageDeprecated(Proxy*, const SkBitmap&, const Conte
xt&, | 341 bool SkImageFilter::onFilterImageDeprecated(Proxy*, const SkBitmap&, const Conte
xt&, |
329 SkBitmap*, SkIPoint*) const { | 342 SkBitmap*, SkIPoint*) const { |
| 343 // Only classes that now use the new SkSpecialImage-based path will not have |
| 344 // onFilterImageDeprecated methods. For those classes we should never be |
| 345 // calling this method. |
| 346 SkASSERT(0); |
330 return false; | 347 return false; |
331 } | 348 } |
332 | 349 |
| 350 // SkImageFilter-derived classes that do not yet have their own onFilterImage |
| 351 // implementation convert back to calling the deprecated filterImage method |
333 SkSpecialImage* SkImageFilter::onFilterImage(SkSpecialImage* src, const Context&
ctx, | 352 SkSpecialImage* SkImageFilter::onFilterImage(SkSpecialImage* src, const Context&
ctx, |
334 SkIPoint* offset) const { | 353 SkIPoint* offset) const { |
335 SkBitmap srcBM, resultBM; | 354 SkBitmap srcBM, resultBM; |
336 | 355 |
337 if (!src->internal_getBM(&srcBM)) { | 356 if (!src->internal_getBM(&srcBM)) { |
338 return nullptr; | 357 return nullptr; |
339 } | 358 } |
340 | 359 |
| 360 // This is the only valid call to the old filterImage path |
341 if (!this->filterImageDeprecated(src->internal_getProxy(), srcBM, ctx, &resu
ltBM, offset)) { | 361 if (!this->filterImageDeprecated(src->internal_getProxy(), srcBM, ctx, &resu
ltBM, offset)) { |
342 return nullptr; | 362 return nullptr; |
343 } | 363 } |
344 | 364 |
345 return SkSpecialImage::internal_fromBM(src->internal_getProxy(), resultBM); | 365 return SkSpecialImage::internal_fromBM(src->internal_getProxy(), resultBM); |
346 } | 366 } |
347 | 367 |
348 bool SkImageFilter::canFilterImageGPU() const { | 368 bool SkImageFilter::canFilterImageGPU() const { |
349 return this->asFragmentProcessor(nullptr, nullptr, SkMatrix::I(), SkIRect())
; | 369 return this->asFragmentProcessor(nullptr, nullptr, SkMatrix::I(), SkIRect())
; |
350 } | 370 } |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
576 | 596 |
577 #if SK_SUPPORT_GPU | 597 #if SK_SUPPORT_GPU |
578 | 598 |
579 bool SkImageFilter::filterInputGPUDeprecated(int index, SkImageFilter::Proxy* pr
oxy, | 599 bool SkImageFilter::filterInputGPUDeprecated(int index, SkImageFilter::Proxy* pr
oxy, |
580 const SkBitmap& src, const Context&
ctx, | 600 const SkBitmap& src, const Context&
ctx, |
581 SkBitmap* result, SkIPoint* offset)
const { | 601 SkBitmap* result, SkIPoint* offset)
const { |
582 SkImageFilter* input = this->getInput(index); | 602 SkImageFilter* input = this->getInput(index); |
583 if (!input) { | 603 if (!input) { |
584 return true; | 604 return true; |
585 } | 605 } |
586 // Ensure that GrContext calls under filterImage and filterImageGPU below wi
ll see an identity | 606 |
587 // matrix with no clip and that the matrix, clip, and render target set befo
re this function was | 607 SkAutoTUnref<SkSpecialImage> specialSrc(SkSpecialImage::internal_fromBM(prox
y, src)); |
588 // called are restored before we return to the caller. | 608 if (!specialSrc) { |
589 GrContext* context = src.getTexture()->getContext(); | |
590 if (input->filterImageDeprecated(proxy, src, this->mapContext(ctx), result,
offset)) { | |
591 if (!result->getTexture()) { | |
592 const SkImageInfo info = result->info(); | |
593 if (kUnknown_SkColorType == info.colorType()) { | |
594 return false; | |
595 } | |
596 SkAutoTUnref<GrTexture> resultTex( | |
597 GrRefCachedBitmapTexture(context, *result, GrTextureParams::Clam
pNoFilter())); | |
598 if (!resultTex) { | |
599 return false; | |
600 } | |
601 result->setPixelRef(new SkGrPixelRef(info, resultTex))->unref(); | |
602 } | |
603 return true; | |
604 } else { | |
605 return false; | 609 return false; |
606 } | 610 } |
| 611 |
| 612 SkAutoTUnref<SkSpecialImage> tmp(input->onFilterImage(specialSrc, |
| 613 this->mapContext(ctx), |
| 614 offset)); |
| 615 if (!tmp) { |
| 616 return false; |
| 617 } |
| 618 |
| 619 if (!tmp->internal_getBM(result)) { |
| 620 return false; |
| 621 } |
| 622 |
| 623 if (!result->getTexture()) { |
| 624 GrContext* context = src.getTexture()->getContext(); |
| 625 |
| 626 const SkImageInfo info = result->info(); |
| 627 if (kUnknown_SkColorType == info.colorType()) { |
| 628 return false; |
| 629 } |
| 630 SkAutoTUnref<GrTexture> resultTex( |
| 631 GrRefCachedBitmapTexture(context, *result, GrTextureParams::ClampNoF
ilter())); |
| 632 if (!resultTex) { |
| 633 return false; |
| 634 } |
| 635 result->setPixelRef(new SkGrPixelRef(info, resultTex))->unref(); |
| 636 } |
| 637 |
| 638 return true; |
607 } | 639 } |
608 #endif | 640 #endif |
609 | 641 |
610 namespace { | 642 namespace { |
611 | 643 |
612 class CacheImpl : public SkImageFilter::Cache { | 644 class CacheImpl : public SkImageFilter::Cache { |
613 public: | 645 public: |
614 CacheImpl(size_t maxBytes) : fMaxBytes(maxBytes), fCurrentBytes(0) { } | 646 CacheImpl(size_t maxBytes) : fMaxBytes(maxBytes), fCurrentBytes(0) { } |
615 ~CacheImpl() override { | 647 ~CacheImpl() override { |
616 SkTDynamicHash<Value, Key>::Iter iter(&fLookup); | 648 SkTDynamicHash<Value, Key>::Iter iter(&fLookup); |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
774 } | 806 } |
775 return dev; | 807 return dev; |
776 } | 808 } |
777 | 809 |
778 bool SkImageFilter::DeviceProxy::filterImage(const SkImageFilter* filter, const
SkBitmap& src, | 810 bool SkImageFilter::DeviceProxy::filterImage(const SkImageFilter* filter, const
SkBitmap& src, |
779 const SkImageFilter::Context& ctx, | 811 const SkImageFilter::Context& ctx, |
780 SkBitmap* result, SkIPoint* offset) { | 812 SkBitmap* result, SkIPoint* offset) { |
781 return fDevice->filterImage(filter, src, ctx, result, offset); | 813 return fDevice->filterImage(filter, src, ctx, result, offset); |
782 } | 814 } |
783 | 815 |
OLD | NEW |