| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2010 Google Inc. | 3 * Copyright 2010 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "GrDrawTarget.h" | 9 #include "GrDrawTarget.h" |
| 10 | 10 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 desc.fHeight = copyRect.height(); | 93 desc.fHeight = copyRect.height(); |
| 94 | 94 |
| 95 SkAutoTUnref<GrTexture> copy(fContext->textureProvider()->refScratchTexture(
desc, | 95 SkAutoTUnref<GrTexture> copy(fContext->textureProvider()->refScratchTexture(
desc, |
| 96 GrTextureProvider::kApprox_ScratchTexMatch)); | 96 GrTextureProvider::kApprox_ScratchTexMatch)); |
| 97 | 97 |
| 98 if (!copy) { | 98 if (!copy) { |
| 99 SkDebugf("Failed to create temporary copy of destination texture.\n"); | 99 SkDebugf("Failed to create temporary copy of destination texture.\n"); |
| 100 return false; | 100 return false; |
| 101 } | 101 } |
| 102 SkIPoint dstPoint = {0, 0}; | 102 SkIPoint dstPoint = {0, 0}; |
| 103 if (this->copySurface(copy, rt, copyRect, dstPoint)) { | 103 this->copySurface(copy, rt, copyRect, dstPoint); |
| 104 dstCopy->setTexture(copy); | 104 dstCopy->setTexture(copy); |
| 105 dstCopy->setOffset(copyRect.fLeft, copyRect.fTop); | 105 dstCopy->setOffset(copyRect.fLeft, copyRect.fTop); |
| 106 return true; | 106 return true; |
| 107 } else { | |
| 108 return false; | |
| 109 } | |
| 110 } | 107 } |
| 111 | 108 |
| 112 void GrDrawTarget::flush() { | 109 void GrDrawTarget::flush() { |
| 113 if (fFlushing) { | 110 if (fFlushing) { |
| 114 return; | 111 return; |
| 115 } | 112 } |
| 116 fFlushing = true; | 113 fFlushing = true; |
| 117 | 114 |
| 118 this->getGpu()->saveActiveTraceMarkers(); | 115 this->getGpu()->saveActiveTraceMarkers(); |
| 119 | 116 |
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 414 if (clippedDstPoint->fY + clippedSrcRect->height() > dst->height()) { | 411 if (clippedDstPoint->fY + clippedSrcRect->height() > dst->height()) { |
| 415 clippedSrcRect->fBottom = clippedSrcRect->fTop + dst->height() - clipped
DstPoint->fY; | 412 clippedSrcRect->fBottom = clippedSrcRect->fTop + dst->height() - clipped
DstPoint->fY; |
| 416 } | 413 } |
| 417 | 414 |
| 418 // The above clipping steps may have inverted the rect if it didn't intersec
t either the src or | 415 // The above clipping steps may have inverted the rect if it didn't intersec
t either the src or |
| 419 // dst bounds. | 416 // dst bounds. |
| 420 return !clippedSrcRect->isEmpty(); | 417 return !clippedSrcRect->isEmpty(); |
| 421 } | 418 } |
| 422 } | 419 } |
| 423 | 420 |
| 424 bool GrDrawTarget::copySurface(GrSurface* dst, | 421 void GrDrawTarget::copySurface(GrSurface* dst, |
| 425 GrSurface* src, | 422 GrSurface* src, |
| 426 const SkIRect& srcRect, | 423 const SkIRect& srcRect, |
| 427 const SkIPoint& dstPoint) { | 424 const SkIPoint& dstPoint) { |
| 428 SkASSERT(dst); | 425 SkASSERT(dst); |
| 429 SkASSERT(src); | 426 SkASSERT(src); |
| 430 | 427 |
| 431 SkIRect clippedSrcRect; | 428 SkIRect clippedSrcRect; |
| 432 SkIPoint clippedDstPoint; | 429 SkIPoint clippedDstPoint; |
| 433 // If the rect is outside the src or dst then we've already succeeded. | 430 // If the rect is outside the src or dst then we've already succeeded. |
| 434 if (!clip_srcrect_and_dstpoint(dst, | 431 if (!clip_srcrect_and_dstpoint(dst, |
| 435 src, | 432 src, |
| 436 srcRect, | 433 srcRect, |
| 437 dstPoint, | 434 dstPoint, |
| 438 &clippedSrcRect, | 435 &clippedSrcRect, |
| 439 &clippedDstPoint)) { | 436 &clippedDstPoint)) { |
| 440 return true; | 437 return; |
| 441 } | 438 } |
| 442 | 439 |
| 443 if (this->getGpu()->canCopySurface(dst, src, clippedSrcRect, clippedDstPoint
)) { | 440 this->onCopySurface(dst, src, clippedSrcRect, clippedDstPoint); |
| 444 this->onCopySurface(dst, src, clippedSrcRect, clippedDstPoint); | |
| 445 return true; | |
| 446 } | |
| 447 | |
| 448 GrRenderTarget* rt = dst->asRenderTarget(); | |
| 449 GrTexture* tex = src->asTexture(); | |
| 450 | |
| 451 if ((dst == src) || !rt || !tex) { | |
| 452 return false; | |
| 453 } | |
| 454 | |
| 455 GrPipelineBuilder pipelineBuilder; | |
| 456 pipelineBuilder.setRenderTarget(rt); | |
| 457 SkMatrix matrix; | |
| 458 matrix.setTranslate(SkIntToScalar(clippedSrcRect.fLeft - clippedDstPoint.fX)
, | |
| 459 SkIntToScalar(clippedSrcRect.fTop - clippedDstPoint.fY))
; | |
| 460 matrix.postIDiv(tex->width(), tex->height()); | |
| 461 pipelineBuilder.addColorTextureProcessor(tex, matrix); | |
| 462 SkIRect dstRect = SkIRect::MakeXYWH(clippedDstPoint.fX, | |
| 463 clippedDstPoint.fY, | |
| 464 clippedSrcRect.width(), | |
| 465 clippedSrcRect.height()); | |
| 466 this->drawSimpleRect(&pipelineBuilder, GrColor_WHITE, SkMatrix::I(), dstRect
); | |
| 467 return true; | |
| 468 } | |
| 469 | |
| 470 bool GrDrawTarget::canCopySurface(const GrSurface* dst, | |
| 471 const GrSurface* src, | |
| 472 const SkIRect& srcRect, | |
| 473 const SkIPoint& dstPoint) { | |
| 474 SkASSERT(dst); | |
| 475 SkASSERT(src); | |
| 476 | |
| 477 SkIRect clippedSrcRect; | |
| 478 SkIPoint clippedDstPoint; | |
| 479 // If the rect is outside the src or dst then we're guaranteed success | |
| 480 if (!clip_srcrect_and_dstpoint(dst, | |
| 481 src, | |
| 482 srcRect, | |
| 483 dstPoint, | |
| 484 &clippedSrcRect, | |
| 485 &clippedDstPoint)) { | |
| 486 return true; | |
| 487 } | |
| 488 return ((dst != src) && dst->asRenderTarget() && src->asTexture()) || | |
| 489 this->getGpu()->canCopySurface(dst, src, clippedSrcRect, clippedDstPo
int); | |
| 490 } | 441 } |
| 491 | 442 |
| 492 void GrDrawTarget::setupPipeline(const PipelineInfo& pipelineInfo, | 443 void GrDrawTarget::setupPipeline(const PipelineInfo& pipelineInfo, |
| 493 GrPipeline* pipeline) { | 444 GrPipeline* pipeline) { |
| 494 SkNEW_PLACEMENT_ARGS(pipeline, GrPipeline, (*pipelineInfo.fPipelineBuilder, | 445 SkNEW_PLACEMENT_ARGS(pipeline, GrPipeline, (*pipelineInfo.fPipelineBuilder, |
| 495 pipelineInfo.fColorPOI, | 446 pipelineInfo.fColorPOI, |
| 496 pipelineInfo.fCoveragePOI, | 447 pipelineInfo.fCoveragePOI, |
| 497 *this->caps(), | 448 *this->caps(), |
| 498 *pipelineInfo.fScissor, | 449 *pipelineInfo.fScissor, |
| 499 &pipelineInfo.fDstCopy)); | 450 &pipelineInfo.fDstCopy)); |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 778 GrPipelineBuilder::AutoRestoreFragmentProcessors* a
rfp, | 729 GrPipelineBuilder::AutoRestoreFragmentProcessors* a
rfp, |
| 779 GrPipelineBuilder::AutoRestoreStencil* ars, | 730 GrPipelineBuilder::AutoRestoreStencil* ars, |
| 780 GrScissorState* scissorState, | 731 GrScissorState* scissorState, |
| 781 const SkRect* devBounds) { | 732 const SkRect* devBounds) { |
| 782 return fClipMaskManager.setupClipping(pipelineBuilder, | 733 return fClipMaskManager.setupClipping(pipelineBuilder, |
| 783 arfp, | 734 arfp, |
| 784 ars, | 735 ars, |
| 785 scissorState, | 736 scissorState, |
| 786 devBounds); | 737 devBounds); |
| 787 } | 738 } |
| OLD | NEW |