Home | History | Annotate | Download | only in gpu
      1 /*
      2  * Copyright 2013 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "GrPaint.h"
      9 #include "GrXferProcessor.h"
     10 #include "effects/GrCoverageSetOpXP.h"
     11 #include "effects/GrPorterDuffXferProcessor.h"
     12 #include "effects/GrSimpleTextureEffect.h"
     13 
     14 void GrPaint::setPorterDuffXPFactory(SkBlendMode mode) {
     15     this->setXPFactory(GrPorterDuffXPFactory::Get(mode));
     16 }
     17 
     18 void GrPaint::setCoverageSetOpXPFactory(SkRegion::Op regionOp, bool invertCoverage) {
     19     this->setXPFactory(GrCoverageSetOpXPFactory::Get(regionOp, invertCoverage));
     20 }
     21 
     22 void GrPaint::addColorTextureProcessor(sk_sp<GrTextureProxy> proxy,
     23                                        sk_sp<GrColorSpaceXform> colorSpaceXform,
     24                                        const SkMatrix& matrix) {
     25     this->addColorFragmentProcessor(GrSimpleTextureEffect::Make(std::move(proxy),
     26                                                                 std::move(colorSpaceXform),
     27                                                                 matrix));
     28 }
     29 
     30 void GrPaint::addColorTextureProcessor(sk_sp<GrTextureProxy> proxy,
     31                                        sk_sp<GrColorSpaceXform> colorSpaceXform,
     32                                        const SkMatrix& matrix,
     33                                        const GrSamplerParams& params) {
     34     this->addColorFragmentProcessor(GrSimpleTextureEffect::Make(std::move(proxy),
     35                                                                 std::move(colorSpaceXform),
     36                                                                 matrix, params));
     37 }
     38 
     39 void GrPaint::addCoverageTextureProcessor(sk_sp<GrTextureProxy> proxy,
     40                                           const SkMatrix& matrix) {
     41     this->addCoverageFragmentProcessor(GrSimpleTextureEffect::Make(std::move(proxy),
     42                                                                    nullptr, matrix));
     43 }
     44 
     45 void GrPaint::addCoverageTextureProcessor(sk_sp<GrTextureProxy> proxy,
     46                                           const SkMatrix& matrix,
     47                                           const GrSamplerParams& params) {
     48     this->addCoverageFragmentProcessor(GrSimpleTextureEffect::Make(std::move(proxy),
     49                                                                    nullptr, matrix, params));
     50 }
     51 
     52 bool GrPaint::isConstantBlendedColor(GrColor* constantColor) const {
     53     // This used to do a more sophisticated analysis but now it just explicitly looks for common
     54     // cases.
     55     static const GrXPFactory* kSrc = GrPorterDuffXPFactory::Get(SkBlendMode::kSrc);
     56     static const GrXPFactory* kClear = GrPorterDuffXPFactory::Get(SkBlendMode::kClear);
     57     if (kClear == fXPFactory) {
     58         *constantColor = GrColor_TRANSPARENT_BLACK;
     59         return true;
     60     }
     61     if (this->numColorFragmentProcessors()) {
     62         return false;
     63     }
     64     if (kSrc == fXPFactory || (!fXPFactory && fColor.isOpaque())) {
     65         *constantColor = fColor.toGrColor();
     66         return true;
     67     }
     68     return false;
     69 }
     70