summaryrefslogtreecommitdiffstats
path: root/libs/hwui/SkiaShader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/hwui/SkiaShader.cpp')
-rw-r--r--libs/hwui/SkiaShader.cpp56
1 files changed, 56 insertions, 0 deletions
diff --git a/libs/hwui/SkiaShader.cpp b/libs/hwui/SkiaShader.cpp
index 590a9d7..a1783df 100644
--- a/libs/hwui/SkiaShader.cpp
+++ b/libs/hwui/SkiaShader.cpp
@@ -47,10 +47,22 @@ static const GLint gTileModes[] = {
// Base shader
///////////////////////////////////////////////////////////////////////////////
+void SkiaShader::copyFrom(const SkiaShader& shader) {
+ mType = shader.mType;
+ mKey = shader.mKey;
+ mTileX = shader.mTileX;
+ mTileY = shader.mTileY;
+ mBlend = shader.mBlend;
+ mUnitMatrix = shader.mUnitMatrix;
+ mShaderMatrix = shader.mShaderMatrix;
+ mGenerationId = shader.mGenerationId;
+}
+
SkiaShader::SkiaShader(Type type, SkShader* key, SkShader::TileMode tileX,
SkShader::TileMode tileY, SkMatrix* matrix, bool blend):
mType(type), mKey(key), mTileX(tileX), mTileY(tileY), mBlend(blend) {
setMatrix(matrix);
+ mGenerationId = 0;
}
SkiaShader::~SkiaShader() {
@@ -90,6 +102,13 @@ SkiaBitmapShader::SkiaBitmapShader(SkBitmap* bitmap, SkShader* key, SkShader::Ti
updateLocalMatrix(matrix);
}
+SkiaShader* SkiaBitmapShader::copy() {
+ SkiaBitmapShader* copy = new SkiaBitmapShader();
+ copy->copyFrom(*this);
+ copy->mBitmap = mBitmap;
+ return copy;
+}
+
void SkiaBitmapShader::describe(ProgramDescription& description, const Extensions& extensions) {
Texture* texture = mTextureCache->get(mBitmap);
if (!texture) return;
@@ -183,6 +202,16 @@ SkiaLinearGradientShader::~SkiaLinearGradientShader() {
delete[] mPositions;
}
+SkiaShader* SkiaLinearGradientShader::copy() {
+ SkiaLinearGradientShader* copy = new SkiaLinearGradientShader();
+ copy->copyFrom(*this);
+ copy->mBounds = mBounds;
+ copy->mColors = mColors;
+ copy->mPositions = mPositions;
+ copy->mCount = mCount;
+ return copy;
+}
+
void SkiaLinearGradientShader::describe(ProgramDescription& description,
const Extensions& extensions) {
description.hasGradient = true;
@@ -238,6 +267,15 @@ SkiaCircularGradientShader::SkiaCircularGradientShader(float x, float y, float r
updateLocalMatrix(matrix);
}
+SkiaShader* SkiaCircularGradientShader::copy() {
+ SkiaCircularGradientShader* copy = new SkiaCircularGradientShader();
+ copy->copyFrom(*this);
+ copy->mColors = mColors;
+ copy->mPositions = mPositions;
+ copy->mCount = mCount;
+ return copy;
+}
+
void SkiaCircularGradientShader::describe(ProgramDescription& description,
const Extensions& extensions) {
description.hasGradient = true;
@@ -276,6 +314,15 @@ SkiaSweepGradientShader::~SkiaSweepGradientShader() {
delete[] mPositions;
}
+SkiaShader* SkiaSweepGradientShader::copy() {
+ SkiaSweepGradientShader* copy = new SkiaSweepGradientShader();
+ copy->copyFrom(*this);
+ copy->mColors = mColors;
+ copy->mPositions = mPositions;
+ copy->mCount = mCount;
+ return copy;
+}
+
void SkiaSweepGradientShader::describe(ProgramDescription& description,
const Extensions& extensions) {
description.hasGradient = true;
@@ -318,6 +365,15 @@ SkiaComposeShader::SkiaComposeShader(SkiaShader* first, SkiaShader* second,
NULL, first->blend() || second->blend()), mFirst(first), mSecond(second), mMode(mode) {
}
+SkiaShader* SkiaComposeShader::copy() {
+ SkiaComposeShader* copy = new SkiaComposeShader();
+ copy->copyFrom(*this);
+ copy->mFirst = mFirst;
+ copy->mSecond = mSecond;
+ copy->mMode = mMode;
+ return copy;
+}
+
void SkiaComposeShader::set(TextureCache* textureCache, GradientCache* gradientCache) {
SkiaShader::set(textureCache, gradientCache);
mFirst->set(textureCache, gradientCache);