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     std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
     28 #endif
     29 
     30     SkImageShader(sk_sp<SkImage>, TileMode tx, TileMode ty, const SkMatrix* localMatrix);
     31 
     32     static bool IsRasterPipelineOnly(const SkMatrix& ctm, SkColorType, SkAlphaType,
     33                                      SkShader::TileMode tx, SkShader::TileMode ty,
     34                                      const SkMatrix& localM);
     35 
     36 protected:
     37     void flatten(SkWriteBuffer&) const override;
     38     Context* onMakeContext(const ContextRec&, SkArenaAlloc* storage) const override;
     39 #ifdef SK_SUPPORT_LEGACY_SHADER_ISABITMAP
     40     bool onIsABitmap(SkBitmap*, SkMatrix*, TileMode*) const override;
     41 #endif
     42     SkImage* onIsAImage(SkMatrix*, TileMode*) const override;
     43 
     44     bool onIsRasterPipelineOnly(const SkMatrix& ctm) const override;
     45 
     46     bool onAppendStages(const StageRec&) const override;
     47 
     48     sk_sp<SkShader> onMakeColorSpace(SkColorSpaceXformer* xformer) const override {
     49         return xformer->apply(fImage.get())->makeShader(fTileModeX, fTileModeY,
     50                                                         &this->getLocalMatrix());
     51     }
     52 
     53     sk_sp<SkImage>  fImage;
     54     const TileMode  fTileModeX;
     55     const TileMode  fTileModeY;
     56 
     57 private:
     58     friend class SkShaderBase;
     59 
     60     typedef SkShaderBase INHERITED;
     61 };
     62 
     63 #endif
     64