Index: src/image/SkImageShader.cpp |
diff --git a/src/image/SkImageShader.cpp b/src/image/SkImageShader.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5ddc8749401cd225f34b97455bea3cab25d60820 |
--- /dev/null |
+++ b/src/image/SkImageShader.cpp |
@@ -0,0 +1,69 @@ |
+/* |
+ * Copyright 2011 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "SkBitmapProcShader.h" |
+#include "SkImage_Base.h" |
+#include "SkImageShader.h" |
+#include "SkReadBuffer.h" |
+#include "SkWriteBuffer.h" |
+ |
+#if SK_SUPPORT_GPU |
+#include "effects/GrBicubicEffect.h" |
+#include "effects/GrExtractAlphaFragmentProcessor.h" |
+#include "effects/GrSimpleTextureEffect.h" |
+#endif |
+ |
+SkImageShader::SkImageShader(const SkImage* img, TileMode tmx, TileMode tmy, const SkMatrix* matrix) |
+ : INHERITED(matrix) |
+ , fImage(SkRef(img)) |
+ , fTileModeX(tmx) |
+ , fTileModeY(tmy) |
+{} |
+ |
+SkFlattenable* SkImageShader::CreateProc(SkReadBuffer& buffer) { |
+ const TileMode tx = (TileMode)buffer.readUInt(); |
+ const TileMode ty = (TileMode)buffer.readUInt(); |
+ SkMatrix matrix; |
+ buffer.readMatrix(&matrix); |
+ SkAutoTUnref<SkImage> img(buffer.readImage()); |
+ if (!img) { |
+ return nullptr; |
+ } |
+ return new SkImageShader(img, tx, ty, &matrix); |
+} |
+ |
+void SkImageShader::flatten(SkWriteBuffer& buffer) const { |
+ buffer.writeUInt(fTileModeX); |
+ buffer.writeUInt(fTileModeY); |
+ buffer.writeMatrix(this->getLocalMatrix()); |
+ buffer.writeImage(fImage); |
+} |
+ |
+bool SkImageShader::isOpaque() const { |
+ return fImage->isOpaque(); |
+} |
+ |
+size_t SkImageShader::contextSize() const { |
+ // we creata a BitmapProcShader::Context, so we defer to it to compute the size |
+ return SkBitmapProcShader::ContextSize(); |
+} |
+ |
+SkShader::Context* SkImageShader::onCreateContext(const ContextRec& rec, void* storage) const { |
+ SkBitmap bitmap; |
+ if (!as_IB(fImage)->getROPixels(&bitmap)) { |
+ return nullptr; |
+ } |
+ return SkBitmapProcShader::MakeContext(*this, fTileModeX, fTileModeY, bitmap, rec, storage); |
+} |
+ |
+SkShader* SkImageShader::Create(const SkImage* image, TileMode tx, TileMode ty, |
+ const SkMatrix* localMatrix) { |
+ if (!image) { |
+ return nullptr; |
+ } |
+ return new SkImageShader(image, tx, ty, localMatrix); |
+} |