142dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org
242dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org/*
342dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org * Copyright 2013 Google Inc.
442dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org *
542dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
642dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org * found in the LICENSE file.
742dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org */
842dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org
942dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org#include "GrPaint.h"
1042dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org
11b6cbc38702dc4a1540a17181cbdab71060c92ce7egdaniel#include "GrProcOptInfo.h"
12b197b8ff31b73ccb20423023e03592df8ae78ea6egdaniel#include "effects/GrCoverageSetOpXP.h"
13378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel#include "effects/GrPorterDuffXferProcessor.h"
1442dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org#include "effects/GrSimpleTextureEffect.h"
1542dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org
162fdeda04988867625bb9bc2f7f6037406a0a98ecjoshualittGrPaint::GrPaint()
172fdeda04988867625bb9bc2f7f6037406a0a98ecjoshualitt    : fAntiAlias(false)
182fdeda04988867625bb9bc2f7f6037406a0a98ecjoshualitt    , fDither(false)
192fdeda04988867625bb9bc2f7f6037406a0a98ecjoshualitt    , fColor(GrColor_WHITE) {
202fdeda04988867625bb9bc2f7f6037406a0a98ecjoshualitt}
212fdeda04988867625bb9bc2f7f6037406a0a98ecjoshualitt
22b197b8ff31b73ccb20423023e03592df8ae78ea6egdanielvoid GrPaint::setCoverageSetOpXPFactory(SkRegion::Op regionOp, bool invertCoverage) {
23b197b8ff31b73ccb20423023e03592df8ae78ea6egdaniel    fXPFactory.reset(GrCoverageSetOpXPFactory::Create(regionOp, invertCoverage));
24b197b8ff31b73ccb20423023e03592df8ae78ea6egdaniel}
25b197b8ff31b73ccb20423023e03592df8ae78ea6egdaniel
26b0a8a377f832c59cee939ad721e1f87d378b7142joshualittvoid GrPaint::addColorTextureProcessor(GrTexture* texture, const SkMatrix& matrix) {
27b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    this->addColorProcessor(GrSimpleTextureEffect::Create(texture, matrix))->unref();
2842dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org}
2942dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org
30b0a8a377f832c59cee939ad721e1f87d378b7142joshualittvoid GrPaint::addCoverageTextureProcessor(GrTexture* texture, const SkMatrix& matrix) {
31b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    this->addCoverageProcessor(GrSimpleTextureEffect::Create(texture, matrix))->unref();
3242dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org}
3342dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org
34b0a8a377f832c59cee939ad721e1f87d378b7142joshualittvoid GrPaint::addColorTextureProcessor(GrTexture* texture,
3540d4bd8dafe9ed844f29a3de3d8965672248ee73joshualitt                                       const SkMatrix& matrix,
3640d4bd8dafe9ed844f29a3de3d8965672248ee73joshualitt                                       const GrTextureParams& params) {
37b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    this->addColorProcessor(GrSimpleTextureEffect::Create(texture, matrix, params))->unref();
3842dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org}
3942dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org
40b0a8a377f832c59cee939ad721e1f87d378b7142joshualittvoid GrPaint::addCoverageTextureProcessor(GrTexture* texture,
4140d4bd8dafe9ed844f29a3de3d8965672248ee73joshualitt                                          const SkMatrix& matrix,
4240d4bd8dafe9ed844f29a3de3d8965672248ee73joshualitt                                          const GrTextureParams& params) {
43b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt    this->addCoverageProcessor(GrSimpleTextureEffect::Create(texture, matrix, params))->unref();
4442dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org}
4524ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org
4624ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.orgbool GrPaint::isOpaqueAndConstantColor(GrColor* color) const {
479e4ecdc9f86724dcce23dc7546e2f295b901407begdaniel    GrProcOptInfo coverageProcInfo;
489e4ecdc9f86724dcce23dc7546e2f295b901407begdaniel    coverageProcInfo.calcWithInitialValues(fCoverageStages.begin(), this->numCoverageStages(),
499e4ecdc9f86724dcce23dc7546e2f295b901407begdaniel                                           0xFFFFFFFF, kRGBA_GrColorComponentFlags, true);
509e4ecdc9f86724dcce23dc7546e2f295b901407begdaniel    GrProcOptInfo colorProcInfo;
519e4ecdc9f86724dcce23dc7546e2f295b901407begdaniel    colorProcInfo.calcWithInitialValues(fColorStages.begin(), this->numColorStages(), fColor,
529e4ecdc9f86724dcce23dc7546e2f295b901407begdaniel                                        kRGBA_GrColorComponentFlags, false);
539e4ecdc9f86724dcce23dc7546e2f295b901407begdaniel
549e4ecdc9f86724dcce23dc7546e2f295b901407begdaniel    GrXPFactory::InvariantOutput output;
55080e673b10ac607305f140ddb245e140ccde40c6egdaniel    fXPFactory->getInvariantOutput(colorProcInfo, coverageProcInfo, &output);
569e4ecdc9f86724dcce23dc7546e2f295b901407begdaniel
579e4ecdc9f86724dcce23dc7546e2f295b901407begdaniel    if (kRGBA_GrColorComponentFlags == output.fBlendedColorFlags &&
589e4ecdc9f86724dcce23dc7546e2f295b901407begdaniel        0xFF == GrColorUnpackA(output.fBlendedColor)) {
599e4ecdc9f86724dcce23dc7546e2f295b901407begdaniel        *color = output.fBlendedColor;
609e4ecdc9f86724dcce23dc7546e2f295b901407begdaniel        return true;
6124ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org    }
6224ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org    return false;
6324ab3b0ce50b3428f063849b6160e468f047487ccommit-bot@chromium.org}
64