| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 "GrDrawState.h" | 8 #include "GrDrawState.h" |
| 9 #include "GrPaint.h" | 9 #include "GrPaint.h" |
| 10 | 10 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 // These have no equivalent in GrPaint, set them to defaults | 47 // These have no equivalent in GrPaint, set them to defaults |
| 48 fCommon.fBlendConstant = 0x0; | 48 fCommon.fBlendConstant = 0x0; |
| 49 fCommon.fDrawFace = kBoth_DrawFace; | 49 fCommon.fDrawFace = kBoth_DrawFace; |
| 50 fCommon.fStencilSettings.setDisabled(); | 50 fCommon.fStencilSettings.setDisabled(); |
| 51 this->resetStateFlags(); | 51 this->resetStateFlags(); |
| 52 | 52 |
| 53 // Enable the clip bit | 53 // Enable the clip bit |
| 54 this->enableState(GrDrawState::kClip_StateBit); | 54 this->enableState(GrDrawState::kClip_StateBit); |
| 55 | 55 |
| 56 this->setColor(paint.getColor()); | 56 this->setColor(paint.getColor()); |
| 57 this->setCoverage4(paint.getCoverage()); |
| 57 this->setState(GrDrawState::kDither_StateBit, paint.isDither()); | 58 this->setState(GrDrawState::kDither_StateBit, paint.isDither()); |
| 58 this->setState(GrDrawState::kHWAntialias_StateBit, paint.isAntiAlias()); | 59 this->setState(GrDrawState::kHWAntialias_StateBit, paint.isAntiAlias()); |
| 59 | 60 |
| 60 this->setBlendFunc(paint.getSrcBlendCoeff(), paint.getDstBlendCoeff()); | 61 this->setBlendFunc(paint.getSrcBlendCoeff(), paint.getDstBlendCoeff()); |
| 61 this->setCoverage(paint.getCoverage()); | 62 this->setCoverage(paint.getCoverage()); |
| 62 } | 63 } |
| 63 | 64 |
| 64 //////////////////////////////////////////////////////////////////////////////// | 65 //////////////////////////////////////////////////////////////////////////////// |
| 65 | 66 |
| 66 static size_t vertex_size(const GrVertexAttrib* attribs, int count) { | 67 static size_t vertex_size(const GrVertexAttrib* attribs, int count) { |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 } | 213 } |
| 213 | 214 |
| 214 // Run through the color stages | 215 // Run through the color stages |
| 215 for (int s = 0; s < fColorStages.count(); ++s) { | 216 for (int s = 0; s < fColorStages.count(); ++s) { |
| 216 const GrEffectRef* effect = fColorStages[s].getEffect(); | 217 const GrEffectRef* effect = fColorStages[s].getEffect(); |
| 217 (*effect)->getConstantColorComponents(&color, &validComponentFlags); | 218 (*effect)->getConstantColorComponents(&color, &validComponentFlags); |
| 218 } | 219 } |
| 219 | 220 |
| 220 // Check whether coverage is treated as color. If so we run through the cove
rage computation. | 221 // Check whether coverage is treated as color. If so we run through the cove
rage computation. |
| 221 if (this->isCoverageDrawing()) { | 222 if (this->isCoverageDrawing()) { |
| 222 GrColor coverageColor = this->getCoverageColor(); | 223 GrColor coverageColor = this->getCoverage(); |
| 223 GrColor oldColor = color; | 224 GrColor oldColor = color; |
| 224 color = 0; | 225 color = 0; |
| 225 for (int c = 0; c < 4; ++c) { | 226 for (int c = 0; c < 4; ++c) { |
| 226 if (validComponentFlags & (1 << c)) { | 227 if (validComponentFlags & (1 << c)) { |
| 227 U8CPU a = (oldColor >> (c * 8)) & 0xff; | 228 U8CPU a = (oldColor >> (c * 8)) & 0xff; |
| 228 U8CPU b = (coverageColor >> (c * 8)) & 0xff; | 229 U8CPU b = (coverageColor >> (c * 8)) & 0xff; |
| 229 color |= (SkMulDiv255Round(a, b) << (c * 8)); | 230 color |= (SkMulDiv255Round(a, b) << (c * 8)); |
| 230 } | 231 } |
| 231 } | 232 } |
| 232 for (int s = 0; s < fCoverageStages.count(); ++s) { | 233 for (int s = 0; s < fCoverageStages.count(); ++s) { |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 } | 305 } |
| 305 | 306 |
| 306 bool srcAIsOne = this->srcAlphaWillBeOne(); | 307 bool srcAIsOne = this->srcAlphaWillBeOne(); |
| 307 bool dstCoeffIsOne = kOne_GrBlendCoeff == *dstCoeff || | 308 bool dstCoeffIsOne = kOne_GrBlendCoeff == *dstCoeff || |
| 308 (kSA_GrBlendCoeff == *dstCoeff && srcAIsOne); | 309 (kSA_GrBlendCoeff == *dstCoeff && srcAIsOne); |
| 309 bool dstCoeffIsZero = kZero_GrBlendCoeff == *dstCoeff || | 310 bool dstCoeffIsZero = kZero_GrBlendCoeff == *dstCoeff || |
| 310 (kISA_GrBlendCoeff == *dstCoeff && srcAIsOne); | 311 (kISA_GrBlendCoeff == *dstCoeff && srcAIsOne); |
| 311 | 312 |
| 312 bool covIsZero = !this->isCoverageDrawing() && | 313 bool covIsZero = !this->isCoverageDrawing() && |
| 313 !this->hasCoverageVertexAttribute() && | 314 !this->hasCoverageVertexAttribute() && |
| 314 0 == this->getCoverageColor(); | 315 0 == this->getCoverage(); |
| 315 // When coeffs are (0,1) there is no reason to draw at all, unless | 316 // When coeffs are (0,1) there is no reason to draw at all, unless |
| 316 // stenciling is enabled. Having color writes disabled is effectively | 317 // stenciling is enabled. Having color writes disabled is effectively |
| 317 // (0,1). The same applies when coverage is known to be 0. | 318 // (0,1). The same applies when coverage is known to be 0. |
| 318 if ((kZero_GrBlendCoeff == *srcCoeff && dstCoeffIsOne) || covIsZero) { | 319 if ((kZero_GrBlendCoeff == *srcCoeff && dstCoeffIsOne) || covIsZero) { |
| 319 if (this->getStencil().doesWrite()) { | 320 if (this->getStencil().doesWrite()) { |
| 320 return kDisableBlend_BlendOptFlag | | 321 return kDisableBlend_BlendOptFlag | |
| 321 kEmitCoverage_BlendOptFlag; | 322 kEmitCoverage_BlendOptFlag; |
| 322 } else { | 323 } else { |
| 323 return kSkipDraw_BlendOptFlag; | 324 return kSkipDraw_BlendOptFlag; |
| 324 } | 325 } |
| 325 } | 326 } |
| 326 | 327 |
| 327 // check for coverage due to constant coverage, per-vertex coverage, or cove
rage stage | 328 // check for coverage due to constant coverage, per-vertex coverage, or cove
rage stage |
| 328 bool hasCoverage = forceCoverage || | 329 bool hasCoverage = forceCoverage || |
| 329 0xffffffff != this->getCoverageColor() || | 330 0xffffffff != this->getCoverage() || |
| 330 this->hasCoverageVertexAttribute() || | 331 this->hasCoverageVertexAttribute() || |
| 331 fCoverageStages.count() > 0; | 332 fCoverageStages.count() > 0; |
| 332 | 333 |
| 333 // if we don't have coverage we can check whether the dst | 334 // if we don't have coverage we can check whether the dst |
| 334 // has to read at all. If not, we'll disable blending. | 335 // has to read at all. If not, we'll disable blending. |
| 335 if (!hasCoverage) { | 336 if (!hasCoverage) { |
| 336 if (dstCoeffIsZero) { | 337 if (dstCoeffIsZero) { |
| 337 if (kOne_GrBlendCoeff == *srcCoeff) { | 338 if (kOne_GrBlendCoeff == *srcCoeff) { |
| 338 // if there is no coverage and coeffs are (1,0) then we | 339 // if there is no coverage and coeffs are (1,0) then we |
| 339 // won't need to read the dst at all, it gets replaced by src | 340 // won't need to read the dst at all, it gets replaced by src |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 466 fDrawState->fColorStages[s].saveCoordChange(&fSavedCoordChanges[i]); | 467 fDrawState->fColorStages[s].saveCoordChange(&fSavedCoordChanges[i]); |
| 467 fDrawState->fColorStages[s].localCoordChange(coordChangeMatrix); | 468 fDrawState->fColorStages[s].localCoordChange(coordChangeMatrix); |
| 468 } | 469 } |
| 469 | 470 |
| 470 int numCoverageStages = fDrawState->numCoverageStages(); | 471 int numCoverageStages = fDrawState->numCoverageStages(); |
| 471 for (int s = 0; s < numCoverageStages; ++s, ++i) { | 472 for (int s = 0; s < numCoverageStages; ++s, ++i) { |
| 472 fDrawState->fCoverageStages[s].saveCoordChange(&fSavedCoordChanges[i]); | 473 fDrawState->fCoverageStages[s].saveCoordChange(&fSavedCoordChanges[i]); |
| 473 fDrawState->fCoverageStages[s].localCoordChange(coordChangeMatrix); | 474 fDrawState->fCoverageStages[s].localCoordChange(coordChangeMatrix); |
| 474 } | 475 } |
| 475 } | 476 } |
| OLD | NEW |