Home | History | Annotate | Download | only in shaders
      1 /*
      2  * Copyright 2015 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 #ifndef SkImageShader_DEFINED
      9 #define SkImageShader_DEFINED
     10 
     11 #include "SkBitmapProcShader.h"
     12 #include "SkColorSpaceXformer.h"
     13 #include "SkImage.h"
     14 #include "SkShaderBase.h"
     15 
     16 class SkImageShader : public SkShaderBase {
     17 public:
     18     static sk_sp<SkShader> Make(sk_sp<SkImage>, TileMode tx, TileMode ty,
     19                                 const SkMatrix* localMatrix);
     20 
     21     bool isOpaque() const override;
     22 
     23     SK_TO_STRING_OVERRIDE()
     24     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkImageShader)
     25 
     26 #if SK_SUPPORT_GPU
     27     sk_sp<GrFragmentProcessor> asFragmentProcessor(const AsFPArgs&) const override;
     28 #endif
     29 
     30     SkImageShader(sk_sp<SkImage>, TileMode tx, TileMode ty, const SkMatrix* localMatrix);
     31 
     32     static bool IsRasterPipelineOnly(SkColorType, SkShader::TileMode tx, SkShader::TileMode ty);
     33 
     34 protected:
     35     void flatten(SkWriteBuffer&) const override;
     36     Context* onMakeContext(const ContextRec&, SkArenaAlloc* storage) const override;
     37 #ifdef SK_SUPPORT_LEGACY_SHADER_ISABITMAP
     38     bool onIsABitmap(SkBitmap*, SkMatrix*, TileMode*) const override;
     39 #endif
     40     SkImage* onIsAImage(SkMatrix*, TileMode*) const override;
     41 
     42     bool onIsRasterPipelineOnly() const override;
     43 
     44     bool onAppendStages(SkRasterPipeline*, SkColorSpace*, SkArenaAlloc*,
     45                         const SkMatrix& ctm, const SkPaint&, const SkMatrix*) const override;
     46 
     47     sk_sp<SkShader> onMakeColorSpace(SkColorSpaceXformer* xformer) const override {
     48         return xformer->apply(fImage.get())->makeShader(fTileModeX, fTileModeY,
     49                                                         &this->getLocalMatrix());
     50     }
     51 
     52     sk_sp<SkImage>  fImage;
     53     const TileMode  fTileModeX;
     54     const TileMode  fTileModeY;
     55 
     56 private:
     57     friend class SkShaderBase;
     58 
     59     typedef SkShaderBase INHERITED;
     60 };
     61 
     62 #endif
     63