From af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19 Mon Sep 17 00:00:00 2001 From: "bsalomon@google.com" Date: Fri, 5 Oct 2012 13:23:24 +0000 Subject: [PATCH] Move setPaint from GrContext to GrDrawState. R=robertphillips@google.com Review URL: https://codereview.appspot.com/6624045 git-svn-id: http://skia.googlecode.com/svn/trunk@5823 2bbb7eff-a529-9590-31e7-b0007b416f81 --- gyp/gpu.gypi | 1 + include/gpu/GrContext.h | 2 -- src/gpu/GrContext.cpp | 55 ++++++----------------------------------- src/gpu/GrDrawState.cpp | 48 +++++++++++++++++++++++++++++++++++ src/gpu/GrDrawState.h | 11 ++++++++- 5 files changed, 67 insertions(+), 50 deletions(-) create mode 100644 src/gpu/GrDrawState.cpp diff --git a/gyp/gpu.gypi b/gyp/gpu.gypi index 9afddc460..c0a4a7be8 100644 --- a/gyp/gpu.gypi +++ b/gyp/gpu.gypi @@ -63,6 +63,7 @@ '<(skia_src_path)/gpu/GrCustomStage.cpp', '<(skia_src_path)/gpu/GrDefaultPathRenderer.cpp', '<(skia_src_path)/gpu/GrDefaultPathRenderer.h', + '<(skia_src_path)/gpu/GrDrawState.cpp', '<(skia_src_path)/gpu/GrDrawState.h', '<(skia_src_path)/gpu/GrDrawTarget.cpp', '<(skia_src_path)/gpu/GrDrawTarget.h', diff --git a/include/gpu/GrContext.h b/include/gpu/GrContext.h index 71665cc59..b3c011911 100644 --- a/include/gpu/GrContext.h +++ b/include/gpu/GrContext.h @@ -841,8 +841,6 @@ private: void flushDrawBuffer(); - void setPaint(const GrPaint& paint); - /// Sets the paint and returns the target to draw into. The paint can be NULL in which case the /// draw state is left unmodified. GrDrawTarget* prepareToDraw(const GrPaint*, BufferedDraw); diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp index b038a9d26..b113ca3e5 100644 --- a/src/gpu/GrContext.cpp +++ b/src/gpu/GrContext.cpp @@ -1588,59 +1588,20 @@ void GrContext::writeRenderTargetPixels(GrRenderTarget* target, } //////////////////////////////////////////////////////////////////////////////// -void GrContext::setPaint(const GrPaint& paint) { - GrAssert(fDrawState->stagesDisabled()); - - for (int i = 0; i < GrPaint::kMaxTextures; ++i) { - int s = i + GrPaint::kFirstTextureStage; - if (paint.isTextureStageEnabled(i)) { - *fDrawState->sampler(s) = paint.getTextureSampler(i); - } - } - - fDrawState->setFirstCoverageStage(GrPaint::kFirstMaskStage); - - for (int i = 0; i < GrPaint::kMaxMasks; ++i) { - int s = i + GrPaint::kFirstMaskStage; - if (paint.isMaskStageEnabled(i)) { - *fDrawState->sampler(s) = paint.getMaskSampler(i); - } - } - - // disable all stages not accessible via the paint - for (int s = GrPaint::kTotalStages; s < GrDrawState::kNumStages; ++s) { - fDrawState->disableStage(s); - } - - fDrawState->setColor(paint.fColor); - - fDrawState->setState(GrDrawState::kDither_StateBit, paint.fDither); - fDrawState->setState(GrDrawState::kHWAntialias_StateBit, paint.fAntiAlias); - - if (paint.fColorMatrixEnabled) { - fDrawState->enableState(GrDrawState::kColorMatrix_StateBit); - fDrawState->setColorMatrix(paint.fColorMatrix); - } else { - fDrawState->disableState(GrDrawState::kColorMatrix_StateBit); - } - fDrawState->setBlendFunc(paint.fSrcBlendCoeff, paint.fDstBlendCoeff); - fDrawState->setColorFilter(paint.fColorFilterColor, paint.fColorFilterXfermode); - fDrawState->setCoverage(paint.fCoverage); -#if GR_DEBUG_PARTIAL_COVERAGE_CHECK - if ((paint.hasMask() || 0xff != paint.fCoverage) && - !fGpu->canApplyCoverage()) { - GrPrintf("Partial pixel coverage will be incorrectly blended.\n"); - } -#endif -} - GrDrawTarget* GrContext::prepareToDraw(const GrPaint* paint, BufferedDraw buffered) { if (kNo_BufferedDraw == buffered && kYes_BufferedDraw == fLastDrawWasBuffered) { this->flushDrawBuffer(); fLastDrawWasBuffered = kNo_BufferedDraw; } if (NULL != paint) { - this->setPaint(*paint); + GrAssert(fDrawState->stagesDisabled()); + fDrawState->setFromPaint(*paint); +#if GR_DEBUG_PARTIAL_COVERAGE_CHECK + if ((paint->hasMask() || 0xff != paint->fCoverage) && + !fGpu->canApplyCoverage()) { + GrPrintf("Partial pixel coverage will be incorrectly blended.\n"); + } +#endif } if (kYes_BufferedDraw == buffered) { fDrawBuffer->setClip(fGpu->getClip()); diff --git a/src/gpu/GrDrawState.cpp b/src/gpu/GrDrawState.cpp new file mode 100644 index 000000000..2d2dc1a14 --- /dev/null +++ b/src/gpu/GrDrawState.cpp @@ -0,0 +1,48 @@ +/* + * Copyright 2012 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "GrDrawState.h" + +#include "GrPaint.h" + +void GrDrawState::setFromPaint(const GrPaint& paint) { + for (int i = 0; i < GrPaint::kMaxTextures; ++i) { + int s = i + GrPaint::kFirstTextureStage; + if (paint.isTextureStageEnabled(i)) { + *this->sampler(s) = paint.getTextureSampler(i); + } + } + + this->setFirstCoverageStage(GrPaint::kFirstMaskStage); + + for (int i = 0; i < GrPaint::kMaxMasks; ++i) { + int s = i + GrPaint::kFirstMaskStage; + if (paint.isMaskStageEnabled(i)) { + *this->sampler(s) = paint.getMaskSampler(i); + } + } + + // disable all stages not accessible via the paint + for (int s = GrPaint::kTotalStages; s < GrDrawState::kNumStages; ++s) { + this->disableStage(s); + } + + this->setColor(paint.fColor); + + this->setState(GrDrawState::kDither_StateBit, paint.fDither); + this->setState(GrDrawState::kHWAntialias_StateBit, paint.fAntiAlias); + + if (paint.fColorMatrixEnabled) { + this->enableState(GrDrawState::kColorMatrix_StateBit); + this->setColorMatrix(paint.fColorMatrix); + } else { + this->disableState(GrDrawState::kColorMatrix_StateBit); + } + this->setBlendFunc(paint.fSrcBlendCoeff, paint.fDstBlendCoeff); + this->setColorFilter(paint.fColorFilterColor, paint.fColorFilterXfermode); + this->setCoverage(paint.fCoverage); +} diff --git a/src/gpu/GrDrawState.h b/src/gpu/GrDrawState.h index 05da3df0e..ca3b2c18a 100644 --- a/src/gpu/GrDrawState.h +++ b/src/gpu/GrDrawState.h @@ -20,6 +20,7 @@ #include "SkXfermode.h" +class GrPaint; class GrDrawState : public GrRefCnt { public: @@ -89,7 +90,15 @@ public: fColorFilterMode = SkXfermode::kDst_Mode; fColorFilterColor = 0x0; fDrawFace = kBoth_DrawFace; - } + } + + /** + * Initializes the GrDrawState based on a GrPaint. Note that GrDrawState + * encompases more than GrPaint. Aspects of GrDrawState that have no + * GrPaint equivalents are not modified. GrPaint has fewer stages than + * GrDrawState. The extra GrDrawState stages are disabled. + */ + void setFromPaint(const GrPaint& paint); /////////////////////////////////////////////////////////////////////////// /// @name Color