OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
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 "SkBitmap.h" | 8 #include "SkBitmap.h" |
9 #include "SkBitmapDevice.h" | |
10 #include "SkBlurImageFilter.h" | 9 #include "SkBlurImageFilter.h" |
11 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
12 #include "SkColorFilterImageFilter.h" | 11 #include "SkColorFilterImageFilter.h" |
13 #include "SkColorMatrixFilter.h" | 12 #include "SkColorMatrixFilter.h" |
14 #include "SkComposeImageFilter.h" | 13 #include "SkComposeImageFilter.h" |
15 #include "SkDisplacementMapEffect.h" | 14 #include "SkDisplacementMapEffect.h" |
16 #include "SkDropShadowImageFilter.h" | 15 #include "SkDropShadowImageFilter.h" |
17 #include "SkFlattenableSerialization.h" | 16 #include "SkFlattenableSerialization.h" |
18 #include "SkGradientShader.h" | 17 #include "SkGradientShader.h" |
19 #include "SkImage.h" | 18 #include "SkImage.h" |
(...skipping 11 matching lines...) Expand all Loading... |
31 #include "SkPoint3.h" | 30 #include "SkPoint3.h" |
32 #include "SkReadBuffer.h" | 31 #include "SkReadBuffer.h" |
33 #include "SkRect.h" | 32 #include "SkRect.h" |
34 #include "SkSpecialImage.h" | 33 #include "SkSpecialImage.h" |
35 #include "SkSpecialSurface.h" | 34 #include "SkSpecialSurface.h" |
36 #include "SkSurface.h" | 35 #include "SkSurface.h" |
37 #include "SkTableColorFilter.h" | 36 #include "SkTableColorFilter.h" |
38 #include "SkTileImageFilter.h" | 37 #include "SkTileImageFilter.h" |
39 #include "SkXfermodeImageFilter.h" | 38 #include "SkXfermodeImageFilter.h" |
40 #include "Test.h" | 39 #include "Test.h" |
41 #include "TestingSpecialImageAccess.h" | |
42 | 40 |
43 #if SK_SUPPORT_GPU | 41 #if SK_SUPPORT_GPU |
44 #include "GrContext.h" | 42 #include "GrContext.h" |
45 #include "SkGpuDevice.h" | |
46 #endif | 43 #endif |
47 | 44 |
48 static const int kBitmapSize = 4; | 45 static const int kBitmapSize = 4; |
49 | 46 |
50 namespace { | 47 namespace { |
51 | 48 |
52 class MatrixTestImageFilter : public SkImageFilter { | 49 class MatrixTestImageFilter : public SkImageFilter { |
53 public: | 50 public: |
54 static sk_sp<SkImageFilter> Make(skiatest::Reporter* reporter, | 51 static sk_sp<SkImageFilter> Make(skiatest::Reporter* reporter, |
55 const SkMatrix& expectedMatrix) { | 52 const SkMatrix& expectedMatrix) { |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
363 return SkColorFilterImageFilter::Make(std::move(filter), std::move(input), c
ropRect); | 360 return SkColorFilterImageFilter::Make(std::move(filter), std::move(input), c
ropRect); |
364 } | 361 } |
365 | 362 |
366 static sk_sp<SkImageFilter> make_blue(sk_sp<SkImageFilter> input, | 363 static sk_sp<SkImageFilter> make_blue(sk_sp<SkImageFilter> input, |
367 const SkImageFilter::CropRect* cropRect) { | 364 const SkImageFilter::CropRect* cropRect) { |
368 sk_sp<SkColorFilter> filter(SkColorFilter::MakeModeFilter(SK_ColorBLUE, | 365 sk_sp<SkColorFilter> filter(SkColorFilter::MakeModeFilter(SK_ColorBLUE, |
369 SkXfermode::kSrcIn
_Mode)); | 366 SkXfermode::kSrcIn
_Mode)); |
370 return SkColorFilterImageFilter::Make(std::move(filter), std::move(input), c
ropRect); | 367 return SkColorFilterImageFilter::Make(std::move(filter), std::move(input), c
ropRect); |
371 } | 368 } |
372 | 369 |
373 static sk_sp<SkSpecialSurface> create_empty_special_surface(GrContext* context, | 370 static sk_sp<SkSpecialSurface> create_empty_special_surface(GrContext* context,
int widthHeight) { |
374 SkImageFilter::Proxy
* proxy, | |
375 int widthHeight) { | |
376 if (context) { | 371 if (context) { |
377 GrSurfaceDesc desc; | 372 GrSurfaceDesc desc; |
378 desc.fConfig = kSkia8888_GrPixelConfig; | 373 desc.fConfig = kSkia8888_GrPixelConfig; |
379 desc.fFlags = kRenderTarget_GrSurfaceFlag; | 374 desc.fFlags = kRenderTarget_GrSurfaceFlag; |
380 desc.fWidth = widthHeight; | 375 desc.fWidth = widthHeight; |
381 desc.fHeight = widthHeight; | 376 desc.fHeight = widthHeight; |
382 return SkSpecialSurface::MakeRenderTarget(proxy, context, desc); | 377 return SkSpecialSurface::MakeRenderTarget(context, desc); |
383 } else { | 378 } else { |
384 const SkImageInfo info = SkImageInfo::MakeN32(widthHeight, widthHeight, | 379 const SkImageInfo info = SkImageInfo::MakeN32(widthHeight, widthHeight, |
385 kOpaque_SkAlphaType); | 380 kOpaque_SkAlphaType); |
386 return SkSpecialSurface::MakeRaster(proxy, info); | 381 return SkSpecialSurface::MakeRaster(info); |
387 } | 382 } |
388 } | 383 } |
389 | 384 |
390 static sk_sp<SkSpecialImage> create_empty_special_image(GrContext* context, | 385 static sk_sp<SkSpecialImage> create_empty_special_image(GrContext* context, int
widthHeight) { |
391 SkImageFilter::Proxy* pr
oxy, | 386 sk_sp<SkSpecialSurface> surf(create_empty_special_surface(context, widthHeig
ht)); |
392 int widthHeight) { | |
393 sk_sp<SkSpecialSurface> surf(create_empty_special_surface(context, proxy, wi
dthHeight)); | |
394 | 387 |
395 SkASSERT(surf); | 388 SkASSERT(surf); |
396 | 389 |
397 SkCanvas* canvas = surf->getCanvas(); | 390 SkCanvas* canvas = surf->getCanvas(); |
398 SkASSERT(canvas); | 391 SkASSERT(canvas); |
399 | 392 |
400 canvas->clear(0x0); | 393 canvas->clear(0x0); |
401 | 394 |
402 return surf->makeImageSnapshot(); | 395 return surf->makeImageSnapshot(); |
403 } | 396 } |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
514 0xFFFFFFFF, SK_Scalar1, SK_Scalar1, SK_Scalar1, | 507 0xFFFFFFFF, SK_Scalar1, SK_Scalar1, SK_Scalar1, |
515 std::move(bmSrc))); | 508 std::move(bmSrc))); |
516 SkCanvas canvas(result); | 509 SkCanvas canvas(result); |
517 SkRect r = SkRect::MakeWH(SkIntToScalar(kBitmapSize), | 510 SkRect r = SkRect::MakeWH(SkIntToScalar(kBitmapSize), |
518 SkIntToScalar(kBitmapSize)); | 511 SkIntToScalar(kBitmapSize)); |
519 canvas.drawRect(r, paint); | 512 canvas.drawRect(r, paint); |
520 } | 513 } |
521 } | 514 } |
522 } | 515 } |
523 | 516 |
524 static void test_crop_rects(SkImageFilter::Proxy* proxy, | 517 static void test_crop_rects(skiatest::Reporter* reporter, |
525 skiatest::Reporter* reporter, | |
526 GrContext* context) { | 518 GrContext* context) { |
527 // Check that all filters offset to their absolute crop rect, | 519 // Check that all filters offset to their absolute crop rect, |
528 // unaffected by the input crop rect. | 520 // unaffected by the input crop rect. |
529 // Tests pass by not asserting. | 521 // Tests pass by not asserting. |
530 sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, proxy, 100)
); | 522 sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, 100)); |
531 SkASSERT(srcImg); | 523 SkASSERT(srcImg); |
532 | 524 |
533 SkImageFilter::CropRect inputCropRect(SkRect::MakeXYWH(8, 13, 80, 80)); | 525 SkImageFilter::CropRect inputCropRect(SkRect::MakeXYWH(8, 13, 80, 80)); |
534 SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(20, 30, 60, 60)); | 526 SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(20, 30, 60, 60)); |
535 sk_sp<SkImageFilter> input(make_grayscale(nullptr, &inputCropRect)); | 527 sk_sp<SkImageFilter> input(make_grayscale(nullptr, &inputCropRect)); |
536 | 528 |
537 FilterList filters(input, &cropRect); | 529 FilterList filters(input, &cropRect); |
538 | 530 |
539 for (int i = 0; i < filters.count(); ++i) { | 531 for (int i = 0; i < filters.count(); ++i) { |
540 SkImageFilter* filter = filters.getFilter(i); | 532 SkImageFilter* filter = filters.getFilter(i); |
541 SkIPoint offset; | 533 SkIPoint offset; |
542 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(100, 100), nul
lptr); | 534 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(100, 100), nul
lptr); |
543 sk_sp<SkSpecialImage> resultImg(filter->filterImage(srcImg.get(), ctx, &
offset)); | 535 sk_sp<SkSpecialImage> resultImg(filter->filterImage(srcImg.get(), ctx, &
offset)); |
544 REPORTER_ASSERT_MESSAGE(reporter, resultImg, filters.getName(i)); | 536 REPORTER_ASSERT_MESSAGE(reporter, resultImg, filters.getName(i)); |
545 REPORTER_ASSERT_MESSAGE(reporter, offset.fX == 20 && offset.fY == 30, fi
lters.getName(i)); | 537 REPORTER_ASSERT_MESSAGE(reporter, offset.fX == 20 && offset.fY == 30, fi
lters.getName(i)); |
546 } | 538 } |
547 } | 539 } |
548 | 540 |
549 static void test_negative_blur_sigma(SkImageFilter::Proxy* proxy, | 541 static void test_negative_blur_sigma(skiatest::Reporter* reporter, |
550 skiatest::Reporter* reporter, | |
551 GrContext* context) { | 542 GrContext* context) { |
552 // Check that SkBlurImageFilter will accept a negative sigma, either in | 543 // Check that SkBlurImageFilter will accept a negative sigma, either in |
553 // the given arguments or after CTM application. | 544 // the given arguments or after CTM application. |
554 const int width = 32, height = 32; | 545 const int width = 32, height = 32; |
555 const SkScalar five = SkIntToScalar(5); | 546 const SkScalar five = SkIntToScalar(5); |
556 | 547 |
557 sk_sp<SkImageFilter> positiveFilter(SkBlurImageFilter::Make(five, five, null
ptr)); | 548 sk_sp<SkImageFilter> positiveFilter(SkBlurImageFilter::Make(five, five, null
ptr)); |
558 sk_sp<SkImageFilter> negativeFilter(SkBlurImageFilter::Make(-five, five, nul
lptr)); | 549 sk_sp<SkImageFilter> negativeFilter(SkBlurImageFilter::Make(-five, five, nul
lptr)); |
559 | 550 |
560 SkBitmap gradient = make_gradient_circle(width, height); | 551 SkBitmap gradient = make_gradient_circle(width, height); |
561 sk_sp<SkSpecialImage> imgSrc(SkSpecialImage::MakeFromRaster(proxy, | 552 sk_sp<SkSpecialImage> imgSrc(SkSpecialImage::MakeFromRaster(SkIRect::MakeWH(
width, height), |
562 SkIRect::MakeWH(
width, height), | |
563 gradient)); | 553 gradient)); |
564 | 554 |
565 SkIPoint offset; | 555 SkIPoint offset; |
566 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(32, 32), nullptr); | 556 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(32, 32), nullptr); |
567 | 557 |
568 sk_sp<SkSpecialImage> positiveResult1(positiveFilter->filterImage(imgSrc.get
(), ctx, &offset)); | 558 sk_sp<SkSpecialImage> positiveResult1(positiveFilter->filterImage(imgSrc.get
(), ctx, &offset)); |
569 REPORTER_ASSERT(reporter, positiveResult1); | 559 REPORTER_ASSERT(reporter, positiveResult1); |
570 | 560 |
571 sk_sp<SkSpecialImage> negativeResult1(negativeFilter->filterImage(imgSrc.get
(), ctx, &offset)); | 561 sk_sp<SkSpecialImage> negativeResult1(negativeFilter->filterImage(imgSrc.get
(), ctx, &offset)); |
572 REPORTER_ASSERT(reporter, negativeResult1); | 562 REPORTER_ASSERT(reporter, negativeResult1); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
616 diffs = memcmp(positiveResultBM1.getAddr32(0, y), | 606 diffs = memcmp(positiveResultBM1.getAddr32(0, y), |
617 positiveResultBM2.getAddr32(0, y), | 607 positiveResultBM2.getAddr32(0, y), |
618 positiveResultBM1.rowBytes()); | 608 positiveResultBM1.rowBytes()); |
619 REPORTER_ASSERT(reporter, !diffs); | 609 REPORTER_ASSERT(reporter, !diffs); |
620 if (diffs) { | 610 if (diffs) { |
621 break; | 611 break; |
622 } | 612 } |
623 } | 613 } |
624 } | 614 } |
625 | 615 |
626 typedef void (*PFTest)(SkImageFilter::Proxy* proxy, | |
627 skiatest::Reporter* reporter, | |
628 GrContext* context); | |
629 | |
630 static void run_raster_test(skiatest::Reporter* reporter, | |
631 int widthHeight, | |
632 PFTest test) { | |
633 const SkSurfaceProps props(SkSurfaceProps::kLegacyFontHost_InitType); | |
634 | |
635 const SkImageInfo info = SkImageInfo::MakeN32Premul(widthHeight, widthHeight
); | |
636 | |
637 sk_sp<SkBaseDevice> device(SkBitmapDevice::Create(info, props)); | |
638 SkImageFilter::DeviceProxy proxy(device.get()); | |
639 | |
640 (*test)(&proxy, reporter, nullptr); | |
641 } | |
642 | |
643 #if SK_SUPPORT_GPU | |
644 static void run_gpu_test(skiatest::Reporter* reporter, | |
645 GrContext* context, | |
646 int widthHeight, | |
647 PFTest test) { | |
648 const SkSurfaceProps props(SkSurfaceProps::kLegacyFontHost_InitType); | |
649 | |
650 sk_sp<SkGpuDevice> device(SkGpuDevice::Create(context, | |
651 SkBudgeted::kNo, | |
652 SkImageInfo::MakeN32Premul(wid
thHeight, | |
653 wid
thHeight), | |
654 0, | |
655 &props, | |
656 SkGpuDevice::kUninit_InitConte
nts)); | |
657 SkImageFilter::DeviceProxy proxy(device.get()); | |
658 | |
659 (*test)(&proxy, reporter, context); | |
660 } | |
661 #endif | |
662 | |
663 DEF_TEST(ImageFilterNegativeBlurSigma, reporter) { | 616 DEF_TEST(ImageFilterNegativeBlurSigma, reporter) { |
664 run_raster_test(reporter, 100, test_negative_blur_sigma); | 617 test_negative_blur_sigma(reporter, nullptr); |
665 } | 618 } |
666 | 619 |
667 #if SK_SUPPORT_GPU | 620 #if SK_SUPPORT_GPU |
668 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageFilterNegativeBlurSigma_Gpu, reporter, c
txInfo) { | 621 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageFilterNegativeBlurSigma_Gpu, reporter, c
txInfo) { |
669 run_gpu_test(reporter, ctxInfo.fGrContext, 100, test_negative_blur_sigma); | 622 test_negative_blur_sigma(reporter, ctxInfo.fGrContext); |
670 } | 623 } |
671 #endif | 624 #endif |
672 | 625 |
673 static void test_zero_blur_sigma(SkImageFilter::Proxy* proxy, | 626 static void test_zero_blur_sigma(skiatest::Reporter* reporter, GrContext* contex
t) { |
674 skiatest::Reporter* reporter, | |
675 GrContext* context) { | |
676 // Check that SkBlurImageFilter with a zero sigma and a non-zero srcOffset w
orks correctly. | 627 // Check that SkBlurImageFilter with a zero sigma and a non-zero srcOffset w
orks correctly. |
677 SkImageFilter::CropRect cropRect(SkRect::Make(SkIRect::MakeXYWH(5, 0, 5, 10)
)); | 628 SkImageFilter::CropRect cropRect(SkRect::Make(SkIRect::MakeXYWH(5, 0, 5, 10)
)); |
678 sk_sp<SkImageFilter> input(SkOffsetImageFilter::Make(0, 0, nullptr, &cropRec
t)); | 629 sk_sp<SkImageFilter> input(SkOffsetImageFilter::Make(0, 0, nullptr, &cropRec
t)); |
679 sk_sp<SkImageFilter> filter(SkBlurImageFilter::Make(0, 0, std::move(input),
&cropRect)); | 630 sk_sp<SkImageFilter> filter(SkBlurImageFilter::Make(0, 0, std::move(input),
&cropRect)); |
680 | 631 |
681 sk_sp<SkSpecialSurface> surf(create_empty_special_surface(context, proxy, 10
)); | 632 sk_sp<SkSpecialSurface> surf(create_empty_special_surface(context, 10)); |
682 surf->getCanvas()->clear(SK_ColorGREEN); | 633 surf->getCanvas()->clear(SK_ColorGREEN); |
683 sk_sp<SkSpecialImage> image(surf->makeImageSnapshot()); | 634 sk_sp<SkSpecialImage> image(surf->makeImageSnapshot()); |
684 | 635 |
685 SkIPoint offset; | 636 SkIPoint offset; |
686 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(32, 32), nullptr); | 637 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(32, 32), nullptr); |
687 | 638 |
688 sk_sp<SkSpecialImage> result(filter->filterImage(image.get(), ctx, &offset))
; | 639 sk_sp<SkSpecialImage> result(filter->filterImage(image.get(), ctx, &offset))
; |
689 REPORTER_ASSERT(reporter, offset.fX == 5 && offset.fY == 0); | 640 REPORTER_ASSERT(reporter, offset.fX == 5 && offset.fY == 0); |
690 REPORTER_ASSERT(reporter, result); | 641 REPORTER_ASSERT(reporter, result); |
691 REPORTER_ASSERT(reporter, result->width() == 5 && result->height() == 10); | 642 REPORTER_ASSERT(reporter, result->width() == 5 && result->height() == 10); |
692 | 643 |
693 SkBitmap resultBM; | 644 SkBitmap resultBM; |
694 | 645 |
695 REPORTER_ASSERT(reporter, result->getROPixels(&resultBM)); | 646 REPORTER_ASSERT(reporter, result->getROPixels(&resultBM)); |
696 | 647 |
697 SkAutoLockPixels lock(resultBM); | 648 SkAutoLockPixels lock(resultBM); |
698 for (int y = 0; y < resultBM.height(); y++) { | 649 for (int y = 0; y < resultBM.height(); y++) { |
699 for (int x = 0; x < resultBM.width(); x++) { | 650 for (int x = 0; x < resultBM.width(); x++) { |
700 bool diff = *resultBM.getAddr32(x, y) != SK_ColorGREEN; | 651 bool diff = *resultBM.getAddr32(x, y) != SK_ColorGREEN; |
701 REPORTER_ASSERT(reporter, !diff); | 652 REPORTER_ASSERT(reporter, !diff); |
702 if (diff) { | 653 if (diff) { |
703 break; | 654 break; |
704 } | 655 } |
705 } | 656 } |
706 } | 657 } |
707 } | 658 } |
708 | 659 |
709 DEF_TEST(ImageFilterZeroBlurSigma, reporter) { | 660 DEF_TEST(ImageFilterZeroBlurSigma, reporter) { |
710 run_raster_test(reporter, 100, test_zero_blur_sigma); | 661 test_zero_blur_sigma(reporter, nullptr); |
711 } | 662 } |
712 | 663 |
713 #if SK_SUPPORT_GPU | 664 #if SK_SUPPORT_GPU |
714 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageFilterZeroBlurSigma_Gpu, reporter, ctxIn
fo) { | 665 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageFilterZeroBlurSigma_Gpu, reporter, ctxIn
fo) { |
715 run_gpu_test(reporter, ctxInfo.fGrContext, 100, test_zero_blur_sigma); | 666 test_zero_blur_sigma(reporter, ctxInfo.fGrContext); |
716 } | 667 } |
717 #endif | 668 #endif |
718 | 669 |
719 | 670 |
720 // Tests that, even when an upstream filter has returned null (due to failure or
clipping), a | 671 // Tests that, even when an upstream filter has returned null (due to failure or
clipping), a |
721 // downstream filter that affects transparent black still does so even with a nu
llptr input. | 672 // downstream filter that affects transparent black still does so even with a nu
llptr input. |
722 static void test_fail_affects_transparent_black(SkImageFilter::Proxy* proxy, | 673 static void test_fail_affects_transparent_black(skiatest::Reporter* reporter, Gr
Context* context) { |
723 skiatest::Reporter* reporter, | |
724 GrContext* context) { | |
725 sk_sp<FailImageFilter> failFilter(new FailImageFilter()); | 674 sk_sp<FailImageFilter> failFilter(new FailImageFilter()); |
726 sk_sp<SkSpecialImage> source(create_empty_special_image(context, proxy, 5)); | 675 sk_sp<SkSpecialImage> source(create_empty_special_image(context, 5)); |
727 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeXYWH(0, 0, 1, 1), nul
lptr); | 676 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeXYWH(0, 0, 1, 1), nul
lptr); |
728 sk_sp<SkColorFilter> green(SkColorFilter::MakeModeFilter(SK_ColorGREEN, SkXf
ermode::kSrc_Mode)); | 677 sk_sp<SkColorFilter> green(SkColorFilter::MakeModeFilter(SK_ColorGREEN, SkXf
ermode::kSrc_Mode)); |
729 SkASSERT(green->affectsTransparentBlack()); | 678 SkASSERT(green->affectsTransparentBlack()); |
730 sk_sp<SkImageFilter> greenFilter(SkColorFilterImageFilter::Make(std::move(gr
een), | 679 sk_sp<SkImageFilter> greenFilter(SkColorFilterImageFilter::Make(std::move(gr
een), |
731 std::move(fa
ilFilter))); | 680 std::move(fa
ilFilter))); |
732 SkIPoint offset; | 681 SkIPoint offset; |
733 sk_sp<SkSpecialImage> result(greenFilter->filterImage(source.get(), ctx, &of
fset)); | 682 sk_sp<SkSpecialImage> result(greenFilter->filterImage(source.get(), ctx, &of
fset)); |
734 REPORTER_ASSERT(reporter, nullptr != result.get()); | 683 REPORTER_ASSERT(reporter, nullptr != result.get()); |
735 if (result.get()) { | 684 if (result.get()) { |
736 SkBitmap resultBM; | 685 SkBitmap resultBM; |
737 REPORTER_ASSERT(reporter, result->getROPixels(&resultBM)); | 686 REPORTER_ASSERT(reporter, result->getROPixels(&resultBM)); |
738 SkAutoLockPixels lock(resultBM); | 687 SkAutoLockPixels lock(resultBM); |
739 REPORTER_ASSERT(reporter, *resultBM.getAddr32(0, 0) == SK_ColorGREEN); | 688 REPORTER_ASSERT(reporter, *resultBM.getAddr32(0, 0) == SK_ColorGREEN); |
740 } | 689 } |
741 } | 690 } |
742 | 691 |
743 DEF_TEST(ImageFilterFailAffectsTransparentBlack, reporter) { | 692 DEF_TEST(ImageFilterFailAffectsTransparentBlack, reporter) { |
744 run_raster_test(reporter, 100, test_fail_affects_transparent_black); | 693 test_fail_affects_transparent_black(reporter, nullptr); |
745 } | 694 } |
746 | 695 |
747 #if SK_SUPPORT_GPU | 696 #if SK_SUPPORT_GPU |
748 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageFilterFailAffectsTransparentBlack_Gpu, r
eporter, ctxInfo) { | 697 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageFilterFailAffectsTransparentBlack_Gpu, r
eporter, ctxInfo) { |
749 run_gpu_test(reporter, ctxInfo.fGrContext, 100, test_fail_affects_transparen
t_black); | 698 test_fail_affects_transparent_black(reporter, ctxInfo.fGrContext); |
750 } | 699 } |
751 #endif | 700 #endif |
752 | 701 |
753 DEF_TEST(ImageFilterDrawTiled, reporter) { | 702 DEF_TEST(ImageFilterDrawTiled, reporter) { |
754 // Check that all filters when drawn tiled (with subsequent clip rects) exac
tly | 703 // Check that all filters when drawn tiled (with subsequent clip rects) exac
tly |
755 // match the same filters drawn with a single full-canvas bitmap draw. | 704 // match the same filters drawn with a single full-canvas bitmap draw. |
756 // Tests pass by not asserting. | 705 // Tests pass by not asserting. |
757 | 706 |
758 FilterList filters(nullptr); | 707 FilterList filters(nullptr); |
759 | 708 |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
928 { | 877 { |
929 sk_sp<SkImageFilter> composite(SkXfermodeImageFilter::Make(nullptr, null
ptr, | 878 sk_sp<SkImageFilter> composite(SkXfermodeImageFilter::Make(nullptr, null
ptr, |
930 offset, nullp
tr)); | 879 offset, nullp
tr)); |
931 SkRect bounds = SkRect::MakeWH(100, 100); | 880 SkRect bounds = SkRect::MakeWH(100, 100); |
932 // Intentionally aliasing here, as that's what the real callers do. | 881 // Intentionally aliasing here, as that's what the real callers do. |
933 bounds = composite->computeFastBounds(bounds); | 882 bounds = composite->computeFastBounds(bounds); |
934 REPORTER_ASSERT(reporter, bounds == SkRect::MakeWH(150, 100)); | 883 REPORTER_ASSERT(reporter, bounds == SkRect::MakeWH(150, 100)); |
935 } | 884 } |
936 } | 885 } |
937 | 886 |
938 static void test_imagefilter_merge_result_size(SkImageFilter::Proxy* proxy, | 887 static void test_imagefilter_merge_result_size(skiatest::Reporter* reporter, GrC
ontext* context) { |
939 skiatest::Reporter* reporter, | |
940 GrContext* context) { | |
941 SkBitmap greenBM; | 888 SkBitmap greenBM; |
942 greenBM.allocN32Pixels(20, 20); | 889 greenBM.allocN32Pixels(20, 20); |
943 greenBM.eraseColor(SK_ColorGREEN); | 890 greenBM.eraseColor(SK_ColorGREEN); |
944 sk_sp<SkImage> greenImage(SkImage::MakeFromBitmap(greenBM)); | 891 sk_sp<SkImage> greenImage(SkImage::MakeFromBitmap(greenBM)); |
945 sk_sp<SkImageFilter> source(SkImageSource::Make(std::move(greenImage))); | 892 sk_sp<SkImageFilter> source(SkImageSource::Make(std::move(greenImage))); |
946 sk_sp<SkImageFilter> merge(SkMergeImageFilter::Make(source, source)); | 893 sk_sp<SkImageFilter> merge(SkMergeImageFilter::Make(source, source)); |
947 | 894 |
948 sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, proxy, 1)); | 895 sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, 1)); |
949 | 896 |
950 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeXYWH(0, 0, 100, 100),
nullptr); | 897 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeXYWH(0, 0, 100, 100),
nullptr); |
951 SkIPoint offset; | 898 SkIPoint offset; |
952 | 899 |
953 sk_sp<SkSpecialImage> resultImg(merge->filterImage(srcImg.get(), ctx, &offse
t)); | 900 sk_sp<SkSpecialImage> resultImg(merge->filterImage(srcImg.get(), ctx, &offse
t)); |
954 REPORTER_ASSERT(reporter, resultImg); | 901 REPORTER_ASSERT(reporter, resultImg); |
955 | 902 |
956 REPORTER_ASSERT(reporter, resultImg->width() == 20 && resultImg->height() ==
20); | 903 REPORTER_ASSERT(reporter, resultImg->width() == 20 && resultImg->height() ==
20); |
957 } | 904 } |
958 | 905 |
959 DEF_TEST(ImageFilterMergeResultSize, reporter) { | 906 DEF_TEST(ImageFilterMergeResultSize, reporter) { |
960 run_raster_test(reporter, 100, test_imagefilter_merge_result_size); | 907 test_imagefilter_merge_result_size(reporter, nullptr); |
961 } | 908 } |
962 | 909 |
963 #if SK_SUPPORT_GPU | 910 #if SK_SUPPORT_GPU |
964 DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(ImageFilterMergeResultSize_Gpu, reporter,
ctxInfo) { | 911 DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(ImageFilterMergeResultSize_Gpu, reporter,
ctxInfo) { |
965 run_gpu_test(reporter, ctxInfo.fGrContext, 100, test_imagefilter_merge_resul
t_size); | 912 test_imagefilter_merge_result_size(reporter, ctxInfo.fGrContext); |
966 } | 913 } |
967 #endif | 914 #endif |
968 | 915 |
969 static void draw_blurred_rect(SkCanvas* canvas) { | 916 static void draw_blurred_rect(SkCanvas* canvas) { |
970 SkPaint filterPaint; | 917 SkPaint filterPaint; |
971 filterPaint.setColor(SK_ColorWHITE); | 918 filterPaint.setColor(SK_ColorWHITE); |
972 filterPaint.setImageFilter(SkBlurImageFilter::Make(SkIntToScalar(8), 0, null
ptr)); | 919 filterPaint.setImageFilter(SkBlurImageFilter::Make(SkIntToScalar(8), 0, null
ptr)); |
973 canvas->saveLayer(nullptr, &filterPaint); | 920 canvas->saveLayer(nullptr, &filterPaint); |
974 SkPaint whitePaint; | 921 SkPaint whitePaint; |
975 whitePaint.setColor(SK_ColorWHITE); | 922 whitePaint.setColor(SK_ColorWHITE); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1085 SkPaint filterPaint; | 1032 SkPaint filterPaint; |
1086 filterPaint.setImageFilter(std::move(filter)); | 1033 filterPaint.setImageFilter(std::move(filter)); |
1087 SkRect bounds = SkRect::MakeWH(1, 10); | 1034 SkRect bounds = SkRect::MakeWH(1, 10); |
1088 SkRect rect = SkRect::Make(SkIRect::MakeWH(width, height)); | 1035 SkRect rect = SkRect::Make(SkIRect::MakeWH(width, height)); |
1089 SkPaint rectPaint; | 1036 SkPaint rectPaint; |
1090 canvas.saveLayer(&bounds, &filterPaint); | 1037 canvas.saveLayer(&bounds, &filterPaint); |
1091 canvas.drawRect(rect, rectPaint); | 1038 canvas.drawRect(rect, rectPaint); |
1092 canvas.restore(); | 1039 canvas.restore(); |
1093 } | 1040 } |
1094 | 1041 |
1095 static void test_big_kernel(SkImageFilter::Proxy* proxy, | 1042 static void test_big_kernel(skiatest::Reporter* reporter, GrContext* context) { |
1096 skiatest::Reporter* reporter, | |
1097 GrContext* context) { | |
1098 // Check that a kernel that is too big for the GPU still works | 1043 // Check that a kernel that is too big for the GPU still works |
1099 SkScalar identityKernel[49] = { | 1044 SkScalar identityKernel[49] = { |
1100 0, 0, 0, 0, 0, 0, 0, | 1045 0, 0, 0, 0, 0, 0, 0, |
1101 0, 0, 0, 0, 0, 0, 0, | 1046 0, 0, 0, 0, 0, 0, 0, |
1102 0, 0, 0, 0, 0, 0, 0, | 1047 0, 0, 0, 0, 0, 0, 0, |
1103 0, 0, 0, 1, 0, 0, 0, | 1048 0, 0, 0, 1, 0, 0, 0, |
1104 0, 0, 0, 0, 0, 0, 0, | 1049 0, 0, 0, 0, 0, 0, 0, |
1105 0, 0, 0, 0, 0, 0, 0, | 1050 0, 0, 0, 0, 0, 0, 0, |
1106 0, 0, 0, 0, 0, 0, 0 | 1051 0, 0, 0, 0, 0, 0, 0 |
1107 }; | 1052 }; |
1108 SkISize kernelSize = SkISize::Make(7, 7); | 1053 SkISize kernelSize = SkISize::Make(7, 7); |
1109 SkScalar gain = SK_Scalar1, bias = 0; | 1054 SkScalar gain = SK_Scalar1, bias = 0; |
1110 SkIPoint kernelOffset = SkIPoint::Make(0, 0); | 1055 SkIPoint kernelOffset = SkIPoint::Make(0, 0); |
1111 | 1056 |
1112 sk_sp<SkImageFilter> filter(SkMatrixConvolutionImageFilter::Make( | 1057 sk_sp<SkImageFilter> filter(SkMatrixConvolutionImageFilter::Make( |
1113 kernelSize, identityKernel, gain, bias,
kernelOffset, | 1058 kernelSize, identityKernel, gain, bias,
kernelOffset, |
1114 SkMatrixConvolutionImageFilter::kClamp_T
ileMode, | 1059 SkMatrixConvolutionImageFilter::kClamp_T
ileMode, |
1115 true, nullptr)); | 1060 true, nullptr)); |
1116 | 1061 |
1117 sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, proxy, 100)
); | 1062 sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, 100)); |
1118 SkASSERT(srcImg); | 1063 SkASSERT(srcImg); |
1119 | 1064 |
1120 SkIPoint offset; | 1065 SkIPoint offset; |
1121 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(100, 100), nullptr
); | 1066 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(100, 100), nullptr
); |
1122 sk_sp<SkSpecialImage> resultImg(filter->filterImage(srcImg.get(), ctx, &offs
et)); | 1067 sk_sp<SkSpecialImage> resultImg(filter->filterImage(srcImg.get(), ctx, &offs
et)); |
1123 REPORTER_ASSERT(reporter, resultImg); | 1068 REPORTER_ASSERT(reporter, resultImg); |
1124 REPORTER_ASSERT(reporter, SkToBool(context) == resultImg->isTextureBacked())
; | 1069 REPORTER_ASSERT(reporter, SkToBool(context) == resultImg->isTextureBacked())
; |
1125 REPORTER_ASSERT(reporter, resultImg->width() == 100 && resultImg->height() =
= 100); | 1070 REPORTER_ASSERT(reporter, resultImg->width() == 100 && resultImg->height() =
= 100); |
1126 REPORTER_ASSERT(reporter, offset.fX == 0 && offset.fY == 0); | 1071 REPORTER_ASSERT(reporter, offset.fX == 0 && offset.fY == 0); |
1127 } | 1072 } |
1128 | 1073 |
1129 DEF_TEST(ImageFilterMatrixConvolutionBigKernel, reporter) { | 1074 DEF_TEST(ImageFilterMatrixConvolutionBigKernel, reporter) { |
1130 run_raster_test(reporter, 100, test_big_kernel); | 1075 test_big_kernel(reporter, nullptr); |
1131 } | 1076 } |
1132 | 1077 |
1133 #if SK_SUPPORT_GPU | 1078 #if SK_SUPPORT_GPU |
1134 DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(ImageFilterMatrixConvolutionBigKernel_Gpu, | 1079 DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(ImageFilterMatrixConvolutionBigKernel_Gpu, |
1135 reporter, ctxInfo) { | 1080 reporter, ctxInfo) { |
1136 run_gpu_test(reporter, ctxInfo.fGrContext, 100, test_big_kernel); | 1081 test_big_kernel(reporter, ctxInfo.fGrContext); |
1137 } | 1082 } |
1138 #endif | 1083 #endif |
1139 | 1084 |
1140 DEF_TEST(ImageFilterCropRect, reporter) { | 1085 DEF_TEST(ImageFilterCropRect, reporter) { |
1141 run_raster_test(reporter, 100, test_crop_rects); | 1086 test_crop_rects(reporter, nullptr); |
1142 } | 1087 } |
1143 | 1088 |
1144 #if SK_SUPPORT_GPU | 1089 #if SK_SUPPORT_GPU |
1145 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageFilterCropRect_Gpu, reporter, ctxInfo) { | 1090 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageFilterCropRect_Gpu, reporter, ctxInfo) { |
1146 run_gpu_test(reporter, ctxInfo.fGrContext, 100, test_crop_rects); | 1091 test_crop_rects(reporter, ctxInfo.fGrContext); |
1147 } | 1092 } |
1148 #endif | 1093 #endif |
1149 | 1094 |
1150 DEF_TEST(ImageFilterMatrix, reporter) { | 1095 DEF_TEST(ImageFilterMatrix, reporter) { |
1151 SkBitmap temp; | 1096 SkBitmap temp; |
1152 temp.allocN32Pixels(100, 100); | 1097 temp.allocN32Pixels(100, 100); |
1153 SkCanvas canvas(temp); | 1098 SkCanvas canvas(temp); |
1154 canvas.scale(SkIntToScalar(2), SkIntToScalar(2)); | 1099 canvas.scale(SkIntToScalar(2), SkIntToScalar(2)); |
1155 | 1100 |
1156 SkMatrix expectedMatrix = canvas.getTotalMatrix(); | 1101 SkMatrix expectedMatrix = canvas.getTotalMatrix(); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1225 | 1170 |
1226 canvas.clear(0x0); | 1171 canvas.clear(0x0); |
1227 canvas.drawPicture(crossProcessPicture); | 1172 canvas.drawPicture(crossProcessPicture); |
1228 pixel = *bitmap.getAddr32(0, 0); | 1173 pixel = *bitmap.getAddr32(0, 0); |
1229 // If the security precautions are enabled, the result here should not be gr
een, since the | 1174 // If the security precautions are enabled, the result here should not be gr
een, since the |
1230 // filter draws nothing. | 1175 // filter draws nothing. |
1231 REPORTER_ASSERT(reporter, SkPicture::PictureIOSecurityPrecautionsEnabled() | 1176 REPORTER_ASSERT(reporter, SkPicture::PictureIOSecurityPrecautionsEnabled() |
1232 ? pixel != SK_ColorGREEN : pixel == SK_ColorGREEN); | 1177 ? pixel != SK_ColorGREEN : pixel == SK_ColorGREEN); |
1233 } | 1178 } |
1234 | 1179 |
1235 static void test_clipped_picture_imagefilter(SkImageFilter::Proxy* proxy, | 1180 static void test_clipped_picture_imagefilter(skiatest::Reporter* reporter, GrCon
text* context) { |
1236 skiatest::Reporter* reporter, | |
1237 GrContext* context) { | |
1238 sk_sp<SkPicture> picture; | 1181 sk_sp<SkPicture> picture; |
1239 | 1182 |
1240 { | 1183 { |
1241 SkRTreeFactory factory; | 1184 SkRTreeFactory factory; |
1242 SkPictureRecorder recorder; | 1185 SkPictureRecorder recorder; |
1243 SkCanvas* recordingCanvas = recorder.beginRecording(1, 1, &factory, 0); | 1186 SkCanvas* recordingCanvas = recorder.beginRecording(1, 1, &factory, 0); |
1244 | 1187 |
1245 // Create an SkPicture which simply draws a green 1x1 rectangle. | 1188 // Create an SkPicture which simply draws a green 1x1 rectangle. |
1246 SkPaint greenPaint; | 1189 SkPaint greenPaint; |
1247 greenPaint.setColor(SK_ColorGREEN); | 1190 greenPaint.setColor(SK_ColorGREEN); |
1248 recordingCanvas->drawRect(SkRect::Make(SkIRect::MakeWH(1, 1)), greenPain
t); | 1191 recordingCanvas->drawRect(SkRect::Make(SkIRect::MakeWH(1, 1)), greenPain
t); |
1249 picture = recorder.finishRecordingAsPicture(); | 1192 picture = recorder.finishRecordingAsPicture(); |
1250 } | 1193 } |
1251 | 1194 |
1252 sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, proxy, 2)); | 1195 sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, 2)); |
1253 | 1196 |
1254 sk_sp<SkImageFilter> imageFilter(SkPictureImageFilter::Make(picture)); | 1197 sk_sp<SkImageFilter> imageFilter(SkPictureImageFilter::Make(picture)); |
1255 | 1198 |
1256 SkIPoint offset; | 1199 SkIPoint offset; |
1257 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeXYWH(1, 1, 1, 1), nul
lptr); | 1200 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeXYWH(1, 1, 1, 1), nul
lptr); |
1258 | 1201 |
1259 sk_sp<SkSpecialImage> resultImage(imageFilter->filterImage(srcImg.get(), ctx
, &offset)); | 1202 sk_sp<SkSpecialImage> resultImage(imageFilter->filterImage(srcImg.get(), ctx
, &offset)); |
1260 REPORTER_ASSERT(reporter, !resultImage); | 1203 REPORTER_ASSERT(reporter, !resultImage); |
1261 } | 1204 } |
1262 | 1205 |
1263 DEF_TEST(ImageFilterClippedPictureImageFilter, reporter) { | 1206 DEF_TEST(ImageFilterClippedPictureImageFilter, reporter) { |
1264 run_raster_test(reporter, 2, test_clipped_picture_imagefilter); | 1207 test_clipped_picture_imagefilter(reporter, nullptr); |
1265 } | 1208 } |
1266 | 1209 |
1267 #if SK_SUPPORT_GPU | 1210 #if SK_SUPPORT_GPU |
1268 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageFilterClippedPictureImageFilter_Gpu, rep
orter, ctxInfo) { | 1211 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageFilterClippedPictureImageFilter_Gpu, rep
orter, ctxInfo) { |
1269 run_gpu_test(reporter, ctxInfo.fGrContext, 2, test_clipped_picture_imagefilt
er); | 1212 test_clipped_picture_imagefilter(reporter, ctxInfo.fGrContext); |
1270 } | 1213 } |
1271 #endif | 1214 #endif |
1272 | 1215 |
1273 DEF_TEST(ImageFilterEmptySaveLayer, reporter) { | 1216 DEF_TEST(ImageFilterEmptySaveLayer, reporter) { |
1274 // Even when there's an empty saveLayer()/restore(), ensure that an image | 1217 // Even when there's an empty saveLayer()/restore(), ensure that an image |
1275 // filter or color filter which affects transparent black still draws. | 1218 // filter or color filter which affects transparent black still draws. |
1276 | 1219 |
1277 SkBitmap bitmap; | 1220 SkBitmap bitmap; |
1278 bitmap.allocN32Pixels(10, 10); | 1221 bitmap.allocN32Pixels(10, 10); |
1279 SkCanvas canvas(bitmap); | 1222 SkCanvas canvas(bitmap); |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1493 REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN); | 1436 REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN); |
1494 } | 1437 } |
1495 | 1438 |
1496 DEF_TEST(XfermodeImageFilterCroppedInput, reporter) { | 1439 DEF_TEST(XfermodeImageFilterCroppedInput, reporter) { |
1497 SkBitmap temp; | 1440 SkBitmap temp; |
1498 temp.allocN32Pixels(100, 100); | 1441 temp.allocN32Pixels(100, 100); |
1499 SkCanvas canvas(temp); | 1442 SkCanvas canvas(temp); |
1500 test_xfermode_cropped_input(&canvas, reporter); | 1443 test_xfermode_cropped_input(&canvas, reporter); |
1501 } | 1444 } |
1502 | 1445 |
1503 static void test_composed_imagefilter_offset(SkImageFilter::Proxy* proxy, | 1446 static void test_composed_imagefilter_offset(skiatest::Reporter* reporter, GrCon
text* context) { |
1504 skiatest::Reporter* reporter, | 1447 sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, 100)); |
1505 GrContext* context) { | |
1506 sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, proxy, 100)
); | |
1507 | 1448 |
1508 SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(1, 0, 20, 20)); | 1449 SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(1, 0, 20, 20)); |
1509 sk_sp<SkImageFilter> offsetFilter(SkOffsetImageFilter::Make(0, 0, nullptr, &
cropRect)); | 1450 sk_sp<SkImageFilter> offsetFilter(SkOffsetImageFilter::Make(0, 0, nullptr, &
cropRect)); |
1510 sk_sp<SkImageFilter> blurFilter(SkBlurImageFilter::Make(SK_Scalar1, SK_Scala
r1, | 1451 sk_sp<SkImageFilter> blurFilter(SkBlurImageFilter::Make(SK_Scalar1, SK_Scala
r1, |
1511 nullptr, &cropRect))
; | 1452 nullptr, &cropRect))
; |
1512 sk_sp<SkImageFilter> composedFilter(SkComposeImageFilter::Make(std::move(blu
rFilter), | 1453 sk_sp<SkImageFilter> composedFilter(SkComposeImageFilter::Make(std::move(blu
rFilter), |
1513 std::move(off
setFilter))); | 1454 std::move(off
setFilter))); |
1514 SkIPoint offset; | 1455 SkIPoint offset; |
1515 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(100, 100), nullptr
); | 1456 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(100, 100), nullptr
); |
1516 | 1457 |
1517 sk_sp<SkSpecialImage> resultImg(composedFilter->filterImage(srcImg.get(), ct
x, &offset)); | 1458 sk_sp<SkSpecialImage> resultImg(composedFilter->filterImage(srcImg.get(), ct
x, &offset)); |
1518 REPORTER_ASSERT(reporter, resultImg); | 1459 REPORTER_ASSERT(reporter, resultImg); |
1519 REPORTER_ASSERT(reporter, offset.fX == 1 && offset.fY == 0); | 1460 REPORTER_ASSERT(reporter, offset.fX == 1 && offset.fY == 0); |
1520 } | 1461 } |
1521 | 1462 |
1522 DEF_TEST(ComposedImageFilterOffset, reporter) { | 1463 DEF_TEST(ComposedImageFilterOffset, reporter) { |
1523 run_raster_test(reporter, 100, test_composed_imagefilter_offset); | 1464 test_composed_imagefilter_offset(reporter, nullptr); |
1524 } | 1465 } |
1525 | 1466 |
1526 #if SK_SUPPORT_GPU | 1467 #if SK_SUPPORT_GPU |
1527 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ComposedImageFilterOffset_Gpu, reporter, ctxI
nfo) { | 1468 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ComposedImageFilterOffset_Gpu, reporter, ctxI
nfo) { |
1528 run_gpu_test(reporter, ctxInfo.fGrContext, 100, test_composed_imagefilter_of
fset); | 1469 test_composed_imagefilter_offset(reporter, ctxInfo.fGrContext); |
1529 } | 1470 } |
1530 #endif | 1471 #endif |
1531 | 1472 |
1532 static void test_composed_imagefilter_bounds(SkImageFilter::Proxy* proxy, | 1473 static void test_composed_imagefilter_bounds(skiatest::Reporter* reporter, GrCon
text* context) { |
1533 skiatest::Reporter* reporter, | |
1534 GrContext* context) { | |
1535 // The bounds passed to the inner filter must be filtered by the outer | 1474 // The bounds passed to the inner filter must be filtered by the outer |
1536 // filter, so that the inner filter produces the pixels that the outer | 1475 // filter, so that the inner filter produces the pixels that the outer |
1537 // filter requires as input. This matters if the outer filter moves pixels. | 1476 // filter requires as input. This matters if the outer filter moves pixels. |
1538 // Here, accounting for the outer offset is necessary so that the green | 1477 // Here, accounting for the outer offset is necessary so that the green |
1539 // pixels of the picture are not clipped. | 1478 // pixels of the picture are not clipped. |
1540 | 1479 |
1541 SkPictureRecorder recorder; | 1480 SkPictureRecorder recorder; |
1542 SkCanvas* recordingCanvas = recorder.beginRecording(SkRect::MakeWH(200, 100)
); | 1481 SkCanvas* recordingCanvas = recorder.beginRecording(SkRect::MakeWH(200, 100)
); |
1543 recordingCanvas->clipRect(SkRect::MakeXYWH(100, 0, 100, 100)); | 1482 recordingCanvas->clipRect(SkRect::MakeXYWH(100, 0, 100, 100)); |
1544 recordingCanvas->clear(SK_ColorGREEN); | 1483 recordingCanvas->clear(SK_ColorGREEN); |
1545 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture()); | 1484 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture()); |
1546 sk_sp<SkImageFilter> pictureFilter(SkPictureImageFilter::Make(picture)); | 1485 sk_sp<SkImageFilter> pictureFilter(SkPictureImageFilter::Make(picture)); |
1547 SkImageFilter::CropRect cropRect(SkRect::MakeWH(100, 100)); | 1486 SkImageFilter::CropRect cropRect(SkRect::MakeWH(100, 100)); |
1548 sk_sp<SkImageFilter> offsetFilter(SkOffsetImageFilter::Make(-100, 0, nullptr
, &cropRect)); | 1487 sk_sp<SkImageFilter> offsetFilter(SkOffsetImageFilter::Make(-100, 0, nullptr
, &cropRect)); |
1549 sk_sp<SkImageFilter> composedFilter(SkComposeImageFilter::Make(std::move(off
setFilter), | 1488 sk_sp<SkImageFilter> composedFilter(SkComposeImageFilter::Make(std::move(off
setFilter), |
1550 std::move(pic
tureFilter))); | 1489 std::move(pic
tureFilter))); |
1551 | 1490 |
1552 sk_sp<SkSpecialImage> sourceImage(create_empty_special_image(context, proxy,
100)); | 1491 sk_sp<SkSpecialImage> sourceImage(create_empty_special_image(context, 100)); |
1553 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(100, 100), nullptr
); | 1492 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(100, 100), nullptr
); |
1554 SkIPoint offset; | 1493 SkIPoint offset; |
1555 sk_sp<SkSpecialImage> result(composedFilter->filterImage(sourceImage.get(),
ctx, &offset)); | 1494 sk_sp<SkSpecialImage> result(composedFilter->filterImage(sourceImage.get(),
ctx, &offset)); |
1556 REPORTER_ASSERT(reporter, offset.isZero()); | 1495 REPORTER_ASSERT(reporter, offset.isZero()); |
1557 REPORTER_ASSERT(reporter, result); | 1496 REPORTER_ASSERT(reporter, result); |
1558 REPORTER_ASSERT(reporter, result->subset().size() == SkISize::Make(100, 100)
); | 1497 REPORTER_ASSERT(reporter, result->subset().size() == SkISize::Make(100, 100)
); |
1559 | 1498 |
1560 SkBitmap resultBM; | 1499 SkBitmap resultBM; |
1561 REPORTER_ASSERT(reporter, result->getROPixels(&resultBM)); | 1500 REPORTER_ASSERT(reporter, result->getROPixels(&resultBM)); |
1562 SkAutoLockPixels lock(resultBM); | 1501 SkAutoLockPixels lock(resultBM); |
1563 REPORTER_ASSERT(reporter, resultBM.getColor(50, 50) == SK_ColorGREEN); | 1502 REPORTER_ASSERT(reporter, resultBM.getColor(50, 50) == SK_ColorGREEN); |
1564 } | 1503 } |
1565 | 1504 |
1566 DEF_TEST(ComposedImageFilterBounds, reporter) { | 1505 DEF_TEST(ComposedImageFilterBounds, reporter) { |
1567 run_raster_test(reporter, 100, test_composed_imagefilter_bounds); | 1506 test_composed_imagefilter_bounds(reporter, nullptr); |
1568 } | 1507 } |
1569 | 1508 |
1570 #if SK_SUPPORT_GPU | 1509 #if SK_SUPPORT_GPU |
1571 DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(ComposedImageFilterBounds_Gpu, reporter, c
txInfo) { | 1510 DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(ComposedImageFilterBounds_Gpu, reporter, c
txInfo) { |
1572 run_gpu_test(reporter, ctxInfo.fGrContext, 100, test_composed_imagefilter_bo
unds); | 1511 test_composed_imagefilter_bounds(reporter, ctxInfo.fGrContext); |
1573 } | 1512 } |
1574 #endif | 1513 #endif |
1575 | 1514 |
1576 static void test_partial_crop_rect(SkImageFilter::Proxy* proxy, | 1515 static void test_partial_crop_rect(skiatest::Reporter* reporter, GrContext* cont
ext) { |
1577 skiatest::Reporter* reporter, | 1516 sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, 100)); |
1578 GrContext* context) { | |
1579 sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, proxy, 100)
); | |
1580 | 1517 |
1581 SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(100, 0, 20, 30), | 1518 SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(100, 0, 20, 30), |
1582 SkImageFilter::CropRect::kHasWidth_CropEdge | SkImageFilter::CropRect::k
HasHeight_CropEdge); | 1519 SkImageFilter::CropRect::kHasWidth_CropEdge | SkImageFilter::CropRect::k
HasHeight_CropEdge); |
1583 sk_sp<SkImageFilter> filter(make_grayscale(nullptr, &cropRect)); | 1520 sk_sp<SkImageFilter> filter(make_grayscale(nullptr, &cropRect)); |
1584 SkIPoint offset; | 1521 SkIPoint offset; |
1585 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(100, 100), nullptr
); | 1522 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(100, 100), nullptr
); |
1586 | 1523 |
1587 sk_sp<SkSpecialImage> resultImg(filter->filterImage(srcImg.get(), ctx, &offs
et)); | 1524 sk_sp<SkSpecialImage> resultImg(filter->filterImage(srcImg.get(), ctx, &offs
et)); |
1588 REPORTER_ASSERT(reporter, resultImg); | 1525 REPORTER_ASSERT(reporter, resultImg); |
1589 | 1526 |
1590 REPORTER_ASSERT(reporter, offset.fX == 0); | 1527 REPORTER_ASSERT(reporter, offset.fX == 0); |
1591 REPORTER_ASSERT(reporter, offset.fY == 0); | 1528 REPORTER_ASSERT(reporter, offset.fY == 0); |
1592 REPORTER_ASSERT(reporter, resultImg->width() == 20); | 1529 REPORTER_ASSERT(reporter, resultImg->width() == 20); |
1593 REPORTER_ASSERT(reporter, resultImg->height() == 30); | 1530 REPORTER_ASSERT(reporter, resultImg->height() == 30); |
1594 } | 1531 } |
1595 | 1532 |
1596 DEF_TEST(ImageFilterPartialCropRect, reporter) { | 1533 DEF_TEST(ImageFilterPartialCropRect, reporter) { |
1597 run_raster_test(reporter, 100, test_partial_crop_rect); | 1534 test_partial_crop_rect(reporter, nullptr); |
1598 } | 1535 } |
1599 | 1536 |
1600 #if SK_SUPPORT_GPU | 1537 #if SK_SUPPORT_GPU |
1601 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageFilterPartialCropRect_Gpu, reporter, ctx
Info) { | 1538 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageFilterPartialCropRect_Gpu, reporter, ctx
Info) { |
1602 run_gpu_test(reporter, ctxInfo.fGrContext, 100, test_partial_crop_rect); | 1539 test_partial_crop_rect(reporter, ctxInfo.fGrContext); |
1603 } | 1540 } |
1604 #endif | 1541 #endif |
1605 | 1542 |
1606 DEF_TEST(ImageFilterCanComputeFastBounds, reporter) { | 1543 DEF_TEST(ImageFilterCanComputeFastBounds, reporter) { |
1607 | 1544 |
1608 { | 1545 { |
1609 SkPoint3 location = SkPoint3::Make(0, 0, SK_Scalar1); | 1546 SkPoint3 location = SkPoint3::Make(0, 0, SK_Scalar1); |
1610 sk_sp<SkImageFilter> lighting(SkLightingImageFilter::MakePointLitDiffuse
(location, | 1547 sk_sp<SkImageFilter> lighting(SkLightingImageFilter::MakePointLitDiffuse
(location, |
1611
SK_ColorGREEN, | 1548
SK_ColorGREEN, |
1612
0, 0, nullptr)); | 1549
0, 0, nullptr)); |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1733 } | 1670 } |
1734 | 1671 |
1735 DEF_TEST(ImageFilterBlurLargeImage, reporter) { | 1672 DEF_TEST(ImageFilterBlurLargeImage, reporter) { |
1736 auto surface(SkSurface::MakeRaster(SkImageInfo::MakeN32Premul(100, 100))); | 1673 auto surface(SkSurface::MakeRaster(SkImageInfo::MakeN32Premul(100, 100))); |
1737 test_large_blur_input(reporter, surface->getCanvas()); | 1674 test_large_blur_input(reporter, surface->getCanvas()); |
1738 } | 1675 } |
1739 | 1676 |
1740 #if SK_SUPPORT_GPU | 1677 #if SK_SUPPORT_GPU |
1741 | 1678 |
1742 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageFilterHugeBlur_Gpu, reporter, ctxInfo) { | 1679 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageFilterHugeBlur_Gpu, reporter, ctxInfo) { |
1743 const SkSurfaceProps props(SkSurfaceProps::kLegacyFontHost_InitType); | |
1744 | 1680 |
1745 sk_sp<SkGpuDevice> device(SkGpuDevice::Create(ctxInfo.fGrContext, | 1681 sk_sp<SkSurface> surf(SkSurface::MakeRenderTarget(ctxInfo.fGrContext, |
1746 SkBudgeted::kNo, | 1682 SkBudgeted::kNo, |
1747 SkImageInfo::MakeN32Premul(100
, 100), | 1683 SkImageInfo::MakeN32Premul
(100, 100))); |
1748 0, | |
1749 &props, | |
1750 SkGpuDevice::kUninit_InitConte
nts)); | |
1751 SkCanvas canvas(device.get()); | |
1752 | 1684 |
1753 test_huge_blur(&canvas, reporter); | 1685 |
| 1686 SkCanvas* canvas = surf->getCanvas(); |
| 1687 |
| 1688 test_huge_blur(canvas, reporter); |
1754 } | 1689 } |
1755 | 1690 |
1756 DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(XfermodeImageFilterCroppedInput_Gpu, repor
ter, ctxInfo) { | 1691 DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(XfermodeImageFilterCroppedInput_Gpu, repor
ter, ctxInfo) { |
1757 const SkSurfaceProps props(SkSurfaceProps::kLegacyFontHost_InitType); | |
1758 | 1692 |
1759 sk_sp<SkGpuDevice> device(SkGpuDevice::Create(ctxInfo.fGrContext, | 1693 sk_sp<SkSurface> surf(SkSurface::MakeRenderTarget(ctxInfo.fGrContext, |
1760 SkBudgeted::kNo, | 1694 SkBudgeted::kNo, |
1761 SkImageInfo::MakeN32Premul(1,
1), | 1695 SkImageInfo::MakeN32Premul
(1, 1))); |
1762 0, | |
1763 &props, | |
1764 SkGpuDevice::kUninit_InitConte
nts)); | |
1765 SkCanvas canvas(device.get()); | |
1766 | 1696 |
1767 test_xfermode_cropped_input(&canvas, reporter); | 1697 |
| 1698 SkCanvas* canvas = surf->getCanvas(); |
| 1699 |
| 1700 test_xfermode_cropped_input(canvas, reporter); |
1768 } | 1701 } |
1769 | 1702 |
1770 DEF_GPUTEST_FOR_ALL_GL_CONTEXTS(ImageFilterBlurLargeImage_Gpu, reporter, ctxInfo
) { | 1703 DEF_GPUTEST_FOR_ALL_GL_CONTEXTS(ImageFilterBlurLargeImage_Gpu, reporter, ctxInfo
) { |
1771 auto surface(SkSurface::MakeRenderTarget(ctxInfo.fGrContext, SkBudgeted::kYe
s, | 1704 auto surface(SkSurface::MakeRenderTarget(ctxInfo.fGrContext, SkBudgeted::kYe
s, |
1772 SkImageInfo::MakeN32Premul(100, 100
))); | 1705 SkImageInfo::MakeN32Premul(100, 100
))); |
1773 test_large_blur_input(reporter, surface->getCanvas()); | 1706 test_large_blur_input(reporter, surface->getCanvas()); |
1774 } | 1707 } |
1775 #endif | 1708 #endif |
OLD | NEW |