| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 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 "GrContext.h" | 9 #include "GrContext.h" |
| 10 | 10 |
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 477 } | 477 } |
| 478 | 478 |
| 479 GrGpu::DrawPreference drawPreference = unpremul ? GrGpu::kCallerPrefersDraw_
DrawPreference : | 479 GrGpu::DrawPreference drawPreference = unpremul ? GrGpu::kCallerPrefersDraw_
DrawPreference : |
| 480 GrGpu::kNoDraw_DrawPrefere
nce; | 480 GrGpu::kNoDraw_DrawPrefere
nce; |
| 481 GrGpu::ReadPixelTempDrawInfo tempDrawInfo; | 481 GrGpu::ReadPixelTempDrawInfo tempDrawInfo; |
| 482 if (!fGpu->getReadPixelsInfo(src, width, height, rowBytes, dstConfig, &drawP
reference, | 482 if (!fGpu->getReadPixelsInfo(src, width, height, rowBytes, dstConfig, &drawP
reference, |
| 483 &tempDrawInfo)) { | 483 &tempDrawInfo)) { |
| 484 return false; | 484 return false; |
| 485 } | 485 } |
| 486 | 486 |
| 487 GrRenderTarget* rtToRead = src->asRenderTarget(); | 487 SkAutoTUnref<GrRenderTarget> rtToRead(SkSafeRef(src->asRenderTarget())); |
| 488 bool didTempDraw = false; | 488 bool didTempDraw = false; |
| 489 if (GrGpu::kNoDraw_DrawPreference != drawPreference) { | 489 if (GrGpu::kNoDraw_DrawPreference != drawPreference) { |
| 490 GrTextureProvider::ScratchTexMatch match = GrTextureProvider::kApprox_Sc
ratchTexMatch; | 490 GrTextureProvider::ScratchTexMatch match = GrTextureProvider::kApprox_Sc
ratchTexMatch; |
| 491 if (tempDrawInfo.fUseExactScratch) { | 491 if (tempDrawInfo.fUseExactScratch) { |
| 492 // We only respect this when the entire src is being read. Otherwise
we can trigger too | 492 // We only respect this when the entire src is being read. Otherwise
we can trigger too |
| 493 // many odd ball texture sizes and trash the cache. | 493 // many odd ball texture sizes and trash the cache. |
| 494 if (width == src->width() && height == src->height()) { | 494 if (width == src->width() && height == src->height()) { |
| 495 match = GrTextureProvider::kExact_ScratchTexMatch; | 495 match = GrTextureProvider::kExact_ScratchTexMatch; |
| 496 } | 496 } |
| 497 } | 497 } |
| 498 SkAutoTUnref<GrTexture> temp; | 498 SkAutoTUnref<GrTexture> temp; |
| 499 temp.reset(this->textureProvider()->refScratchTexture(tempDrawInfo.fTemp
SurfaceDesc, match)); | 499 temp.reset(this->textureProvider()->refScratchTexture(tempDrawInfo.fTemp
SurfaceDesc, |
| 500 match)); |
| 500 if (temp) { | 501 if (temp) { |
| 501 SkMatrix textureMatrix; | 502 SkMatrix textureMatrix; |
| 502 textureMatrix.setTranslate(SkIntToScalar(left), SkIntToScalar(top)); | 503 textureMatrix.setTranslate(SkIntToScalar(left), SkIntToScalar(top)); |
| 503 textureMatrix.postIDiv(src->width(), src->height()); | 504 textureMatrix.postIDiv(src->width(), src->height()); |
| 504 GrPaint paint; | 505 GrPaint paint; |
| 505 SkAutoTUnref<const GrFragmentProcessor> fp; | 506 SkAutoTUnref<const GrFragmentProcessor> fp; |
| 506 if (unpremul) { | 507 if (unpremul) { |
| 507 fp.reset(this->createPMToUPMEffect( | 508 fp.reset(this->createPMToUPMEffect( |
| 508 paint.getProcessorDataManager(), src->asTexture(), tempDrawI
nfo.fSwapRAndB, | 509 paint.getProcessorDataManager(), src->asTexture(), tempDrawI
nfo.fSwapRAndB, |
| 509 textureMatrix)); | 510 textureMatrix)); |
| 510 if (fp) { | 511 if (fp) { |
| 511 unpremul = false; // we no longer need to do this on CPU aft
er the read back. | 512 unpremul = false; // we no longer need to do this on CPU aft
er the read back. |
| 512 } else if (GrGpu::kCallerPrefersDraw_DrawPreference == drawPrefe
rence) { | 513 } else if (GrGpu::kCallerPrefersDraw_DrawPreference == drawPrefe
rence) { |
| 513 // We only wanted to do the draw in order to perform the unp
remul so don't | 514 // We only wanted to do the draw in order to perform the unp
remul so don't |
| 514 // bother. | 515 // bother. |
| 515 temp.reset(NULL); | 516 temp.reset(NULL); |
| 516 } | 517 } |
| 517 } | 518 } |
| 518 if (!fp && temp) { | 519 if (!fp && temp) { |
| 519 fp.reset(GrConfigConversionEffect::Create( | 520 fp.reset(GrConfigConversionEffect::Create( |
| 520 paint.getProcessorDataManager(), src->asTexture(), tempDrawI
nfo.fSwapRAndB, | 521 paint.getProcessorDataManager(), src->asTexture(), tempDrawI
nfo.fSwapRAndB, |
| 521 GrConfigConversionEffect::kNone_PMConversion, textureMatrix)
); | 522 GrConfigConversionEffect::kNone_PMConversion, textureMatrix)
); |
| 522 } | 523 } |
| 523 if (fp) { | 524 if (fp) { |
| 524 paint.addColorProcessor(fp); | 525 paint.addColorProcessor(fp); |
| 525 SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar
(height)); | 526 SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar
(height)); |
| 526 GrDrawContext* drawContext = this->drawContext(); | 527 GrDrawContext* drawContext = this->drawContext(); |
| 527 drawContext->drawRect(temp->asRenderTarget(), GrClip::WideOpen()
, paint, | 528 drawContext->drawRect(temp->asRenderTarget(), GrClip::WideOpen()
, paint, |
| 528 SkMatrix::I(), rect, NULL); | 529 SkMatrix::I(), rect, NULL); |
| 529 rtToRead = temp->asRenderTarget(); | 530 rtToRead.reset(SkRef(temp->asRenderTarget())); |
| 530 left = 0; | 531 left = 0; |
| 531 top = 0; | 532 top = 0; |
| 532 didTempDraw = true; | 533 didTempDraw = true; |
| 533 } | 534 } |
| 534 } | 535 } |
| 535 } | 536 } |
| 536 | 537 |
| 537 if (GrGpu::kRequireDraw_DrawPreference == drawPreference && !didTempDraw) { | 538 if (GrGpu::kRequireDraw_DrawPreference == drawPreference && !didTempDraw) { |
| 538 return false; | 539 return false; |
| 539 } | 540 } |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 736 ////////////////////////////////////////////////////////////////////////////// | 737 ////////////////////////////////////////////////////////////////////////////// |
| 737 | 738 |
| 738 void GrContext::addGpuTraceMarker(const GrGpuTraceMarker* marker) { | 739 void GrContext::addGpuTraceMarker(const GrGpuTraceMarker* marker) { |
| 739 fGpu->addGpuTraceMarker(marker); | 740 fGpu->addGpuTraceMarker(marker); |
| 740 } | 741 } |
| 741 | 742 |
| 742 void GrContext::removeGpuTraceMarker(const GrGpuTraceMarker* marker) { | 743 void GrContext::removeGpuTraceMarker(const GrGpuTraceMarker* marker) { |
| 743 fGpu->removeGpuTraceMarker(marker); | 744 fGpu->removeGpuTraceMarker(marker); |
| 744 } | 745 } |
| 745 | 746 |
| OLD | NEW |