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

Side by Side Diff: src/effects/SkMorphologyImageFilter.cpp

Issue 1404823005: GrDrawContext now holds GrRenderTarget pointer (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix overlength line Created 5 years, 2 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/effects/SkLightingImageFilter.cpp ('k') | src/effects/SkXfermodeImageFilter.cpp » ('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 "SkMorphologyImageFilter.h" 8 #include "SkMorphologyImageFilter.h"
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkColorPriv.h" 10 #include "SkColorPriv.h"
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 MorphologyType type = d->fRandom->nextBool() ? GrMorphologyEffect::kErode_Mo rphologyType : 451 MorphologyType type = d->fRandom->nextBool() ? GrMorphologyEffect::kErode_Mo rphologyType :
452 GrMorphologyEffect::kDilate_Morph ologyType; 452 GrMorphologyEffect::kDilate_Morph ologyType;
453 453
454 return GrMorphologyEffect::Create(d->fTextures[texIdx], dir, radius, type); 454 return GrMorphologyEffect::Create(d->fTextures[texIdx], dir, radius, type);
455 } 455 }
456 456
457 namespace { 457 namespace {
458 458
459 459
460 void apply_morphology_rect(GrDrawContext* drawContext, 460 void apply_morphology_rect(GrDrawContext* drawContext,
461 GrRenderTarget* rt,
462 const GrClip& clip, 461 const GrClip& clip,
463 GrTexture* texture, 462 GrTexture* texture,
464 const SkIRect& srcRect, 463 const SkIRect& srcRect,
465 const SkIRect& dstRect, 464 const SkIRect& dstRect,
466 int radius, 465 int radius,
467 GrMorphologyEffect::MorphologyType morphType, 466 GrMorphologyEffect::MorphologyType morphType,
468 float bounds[2], 467 float bounds[2],
469 Gr1DKernelEffect::Direction direction) { 468 Gr1DKernelEffect::Direction direction) {
470 GrPaint paint; 469 GrPaint paint;
471 paint.addColorFragmentProcessor(GrMorphologyEffect::Create(texture, 470 paint.addColorFragmentProcessor(GrMorphologyEffect::Create(texture,
472 direction, 471 direction,
473 radius, 472 radius,
474 morphType, 473 morphType,
475 bounds))->unref() ; 474 bounds))->unref() ;
476 drawContext->drawNonAARectToRect(rt, clip, paint, SkMatrix::I(), SkRect::Mak e(dstRect), 475 drawContext->drawNonAARectToRect(clip, paint, SkMatrix::I(), SkRect::Make(ds tRect),
477 SkRect::Make(srcRect)); 476 SkRect::Make(srcRect));
478 } 477 }
479 478
480 void apply_morphology_rect_no_bounds(GrDrawContext* drawContext, 479 void apply_morphology_rect_no_bounds(GrDrawContext* drawContext,
481 GrRenderTarget* rt,
482 const GrClip& clip, 480 const GrClip& clip,
483 GrTexture* texture, 481 GrTexture* texture,
484 const SkIRect& srcRect, 482 const SkIRect& srcRect,
485 const SkIRect& dstRect, 483 const SkIRect& dstRect,
486 int radius, 484 int radius,
487 GrMorphologyEffect::MorphologyType morphTyp e, 485 GrMorphologyEffect::MorphologyType morphTyp e,
488 Gr1DKernelEffect::Direction direction) { 486 Gr1DKernelEffect::Direction direction) {
489 GrPaint paint; 487 GrPaint paint;
490 paint.addColorFragmentProcessor(GrMorphologyEffect::Create(texture, 488 paint.addColorFragmentProcessor(GrMorphologyEffect::Create(texture,
491 direction, 489 direction,
492 radius, 490 radius,
493 morphType))->unre f(); 491 morphType))->unre f();
494 drawContext->drawNonAARectToRect(rt, clip, paint, SkMatrix::I(), SkRect::Mak e(dstRect), 492 drawContext->drawNonAARectToRect(clip, paint, SkMatrix::I(), SkRect::Make(ds tRect),
495 SkRect::Make(srcRect)); 493 SkRect::Make(srcRect));
496 } 494 }
497 495
498 void apply_morphology_pass(GrDrawContext* drawContext, 496 void apply_morphology_pass(GrDrawContext* drawContext,
499 GrRenderTarget* rt,
500 const GrClip& clip, 497 const GrClip& clip,
501 GrTexture* texture, 498 GrTexture* texture,
502 const SkIRect& srcRect, 499 const SkIRect& srcRect,
503 const SkIRect& dstRect, 500 const SkIRect& dstRect,
504 int radius, 501 int radius,
505 GrMorphologyEffect::MorphologyType morphType, 502 GrMorphologyEffect::MorphologyType morphType,
506 Gr1DKernelEffect::Direction direction) { 503 Gr1DKernelEffect::Direction direction) {
507 float bounds[2] = { 0.0f, 1.0f }; 504 float bounds[2] = { 0.0f, 1.0f };
508 SkIRect lowerSrcRect = srcRect, lowerDstRect = dstRect; 505 SkIRect lowerSrcRect = srcRect, lowerDstRect = dstRect;
509 SkIRect middleSrcRect = srcRect, middleDstRect = dstRect; 506 SkIRect middleSrcRect = srcRect, middleDstRect = dstRect;
(...skipping 12 matching lines...) Expand all
522 bounds[1] = (SkIntToScalar(srcRect.bottom()) - 0.5f) / texture->height() ; 519 bounds[1] = (SkIntToScalar(srcRect.bottom()) - 0.5f) / texture->height() ;
523 lowerSrcRect.fBottom = srcRect.top() + radius; 520 lowerSrcRect.fBottom = srcRect.top() + radius;
524 lowerDstRect.fBottom = dstRect.top() + radius; 521 lowerDstRect.fBottom = dstRect.top() + radius;
525 upperSrcRect.fTop = srcRect.bottom() - radius; 522 upperSrcRect.fTop = srcRect.bottom() - radius;
526 upperDstRect.fTop = dstRect.bottom() - radius; 523 upperDstRect.fTop = dstRect.bottom() - radius;
527 middleSrcRect.inset(0, radius); 524 middleSrcRect.inset(0, radius);
528 middleDstRect.inset(0, radius); 525 middleDstRect.inset(0, radius);
529 } 526 }
530 if (middleSrcRect.fLeft - middleSrcRect.fRight >= 0) { 527 if (middleSrcRect.fLeft - middleSrcRect.fRight >= 0) {
531 // radius covers srcRect; use bounds over entire draw 528 // radius covers srcRect; use bounds over entire draw
532 apply_morphology_rect(drawContext, rt, clip, texture, srcRect, dstRect, radius, 529 apply_morphology_rect(drawContext, clip, texture, srcRect, dstRect, radi us,
533 morphType, bounds, direction); 530 morphType, bounds, direction);
534 } else { 531 } else {
535 // Draw upper and lower margins with bounds; middle without. 532 // Draw upper and lower margins with bounds; middle without.
536 apply_morphology_rect(drawContext, rt, clip, texture, lowerSrcRect, lowe rDstRect, radius, 533 apply_morphology_rect(drawContext, clip, texture, lowerSrcRect, lowerDst Rect, radius,
537 morphType, bounds, direction); 534 morphType, bounds, direction);
538 apply_morphology_rect(drawContext, rt, clip, texture, upperSrcRect, uppe rDstRect, radius, 535 apply_morphology_rect(drawContext, clip, texture, upperSrcRect, upperDst Rect, radius,
539 morphType, bounds, direction); 536 morphType, bounds, direction);
540 apply_morphology_rect_no_bounds(drawContext, rt, clip, texture, middleSr cRect, middleDstRect, 537 apply_morphology_rect_no_bounds(drawContext, clip, texture, middleSrcRec t, middleDstRect,
541 radius, morphType, direction); 538 radius, morphType, direction);
542 } 539 }
543 } 540 }
544 541
545 bool apply_morphology(const SkBitmap& input, 542 bool apply_morphology(const SkBitmap& input,
546 const SkIRect& rect, 543 const SkIRect& rect,
547 GrMorphologyEffect::MorphologyType morphType, 544 GrMorphologyEffect::MorphologyType morphType,
548 SkISize radius, 545 SkISize radius,
549 SkBitmap* dst) { 546 SkBitmap* dst) {
550 SkAutoTUnref<GrTexture> srcTexture(SkRef(input.getTexture())); 547 SkAutoTUnref<GrTexture> srcTexture(SkRef(input.getTexture()));
(...skipping 10 matching lines...) Expand all
561 desc.fWidth = rect.width(); 558 desc.fWidth = rect.width();
562 desc.fHeight = rect.height(); 559 desc.fHeight = rect.height();
563 desc.fConfig = kSkia8888_GrPixelConfig; 560 desc.fConfig = kSkia8888_GrPixelConfig;
564 SkIRect srcRect = rect; 561 SkIRect srcRect = rect;
565 562
566 if (radius.fWidth > 0) { 563 if (radius.fWidth > 0) {
567 GrTexture* scratch = context->textureProvider()->createApproxTexture(des c); 564 GrTexture* scratch = context->textureProvider()->createApproxTexture(des c);
568 if (nullptr == scratch) { 565 if (nullptr == scratch) {
569 return false; 566 return false;
570 } 567 }
571 SkAutoTUnref<GrDrawContext> dstDrawContext(context->drawContext()); 568 SkAutoTUnref<GrDrawContext> dstDrawContext(context->drawContext(scratch- >asRenderTarget()));
572 if (!dstDrawContext) { 569 if (!dstDrawContext) {
573 return false; 570 return false;
574 } 571 }
575 572
576 apply_morphology_pass(dstDrawContext, scratch->asRenderTarget(), clip, s rcTexture, 573 apply_morphology_pass(dstDrawContext, clip, srcTexture,
577 srcRect, dstRect, radius.fWidth, morphType, 574 srcRect, dstRect, radius.fWidth, morphType,
578 Gr1DKernelEffect::kX_Direction); 575 Gr1DKernelEffect::kX_Direction);
579 SkIRect clearRect = SkIRect::MakeXYWH(dstRect.fLeft, dstRect.fBottom, 576 SkIRect clearRect = SkIRect::MakeXYWH(dstRect.fLeft, dstRect.fBottom,
580 dstRect.width(), radius.fHeight); 577 dstRect.width(), radius.fHeight);
581 GrColor clearColor = GrMorphologyEffect::kErode_MorphologyType == morphT ype ? 578 GrColor clearColor = GrMorphologyEffect::kErode_MorphologyType == morphT ype ?
582 SK_ColorWHITE : 579 SK_ColorWHITE :
583 SK_ColorTRANSPARENT; 580 SK_ColorTRANSPARENT;
584 dstDrawContext->clear(scratch->asRenderTarget(), &clearRect, clearColor, false); 581 dstDrawContext->clear(&clearRect, clearColor, false);
585 582
586 srcTexture.reset(scratch); 583 srcTexture.reset(scratch);
587 srcRect = dstRect; 584 srcRect = dstRect;
588 } 585 }
589 if (radius.fHeight > 0) { 586 if (radius.fHeight > 0) {
590 GrTexture* scratch = context->textureProvider()->createApproxTexture(des c); 587 GrTexture* scratch = context->textureProvider()->createApproxTexture(des c);
591 if (nullptr == scratch) { 588 if (nullptr == scratch) {
592 return false; 589 return false;
593 } 590 }
594 SkAutoTUnref<GrDrawContext> dstDrawContext(context->drawContext()); 591 SkAutoTUnref<GrDrawContext> dstDrawContext(context->drawContext(scratch- >asRenderTarget()));
595 if (!dstDrawContext) { 592 if (!dstDrawContext) {
596 return false; 593 return false;
597 } 594 }
598 595
599 apply_morphology_pass(dstDrawContext, scratch->asRenderTarget(), clip, s rcTexture, 596 apply_morphology_pass(dstDrawContext, clip, srcTexture,
600 srcRect, dstRect, radius.fHeight, morphType, 597 srcRect, dstRect, radius.fHeight, morphType,
601 Gr1DKernelEffect::kY_Direction); 598 Gr1DKernelEffect::kY_Direction);
602 599
603 srcTexture.reset(scratch); 600 srcTexture.reset(scratch);
604 } 601 }
605 SkImageFilter::WrapTexture(srcTexture, rect.width(), rect.height(), dst); 602 SkImageFilter::WrapTexture(srcTexture, rect.width(), rect.height(), dst);
606 return true; 603 return true;
607 } 604 }
608 605
609 }; 606 };
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
657 SkBitmap* result, SkIPoint* offset) con st { 654 SkBitmap* result, SkIPoint* offset) con st {
658 return this->filterImageGPUGeneric(true, proxy, src, ctx, result, offset); 655 return this->filterImageGPUGeneric(true, proxy, src, ctx, result, offset);
659 } 656 }
660 657
661 bool SkErodeImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context& ctx, 658 bool SkErodeImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context& ctx,
662 SkBitmap* result, SkIPoint* offset) cons t { 659 SkBitmap* result, SkIPoint* offset) cons t {
663 return this->filterImageGPUGeneric(false, proxy, src, ctx, result, offset); 660 return this->filterImageGPUGeneric(false, proxy, src, ctx, result, offset);
664 } 661 }
665 662
666 #endif 663 #endif
OLDNEW
« no previous file with comments | « src/effects/SkLightingImageFilter.cpp ('k') | src/effects/SkXfermodeImageFilter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698