aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gm/colormatrix.cpp32
-rw-r--r--include/effects/SkColorMatrixFilter.h7
-rw-r--r--src/effects/SkColorMatrixFilter.cpp54
3 files changed, 33 insertions, 60 deletions
diff --git a/gm/colormatrix.cpp b/gm/colormatrix.cpp
index cc5cfbc22a..518ccd0f50 100644
--- a/gm/colormatrix.cpp
+++ b/gm/colormatrix.cpp
@@ -27,6 +27,14 @@ private:
mutable bool fOnce;
};
+static void setColorMatrix(SkPaint* paint, const SkColorMatrix& matrix) {
+ paint->setColorFilter(SkNEW_ARGS(SkColorMatrixFilter, (matrix)))->unref();
+}
+
+static void setArray(SkPaint* paint, const SkScalar array[]) {
+ paint->setColorFilter(SkNEW_ARGS(SkColorMatrixFilter, (array)))->unref();
+}
+
namespace skiagm {
class ColorMatrixGM : public GM {
@@ -72,47 +80,45 @@ protected:
SkPaint paint;
SkColorMatrix matrix;
- SkColorMatrixFilter* filter = new SkColorMatrixFilter();
- paint.setColorFilter(filter)->unref();
matrix.setIdentity();
- filter->setMatrix(matrix);
+ setColorMatrix(&paint, matrix);
canvas->drawBitmap(fBitmap, 0, 0, &paint);
matrix.setRotate(SkColorMatrix::kR_Axis, 90);
- filter->setMatrix(matrix);
+ setColorMatrix(&paint, matrix);
canvas->drawBitmap(fBitmap, 80, 0, &paint);
matrix.setRotate(SkColorMatrix::kG_Axis, 90);
- filter->setMatrix(matrix);
+ setColorMatrix(&paint, matrix);
canvas->drawBitmap(fBitmap, 160, 0, &paint);
matrix.setRotate(SkColorMatrix::kB_Axis, 90);
- filter->setMatrix(matrix);
+ setColorMatrix(&paint, matrix);
canvas->drawBitmap(fBitmap, 240, 0, &paint);
matrix.setSaturation(SkFloatToScalar(0.0f));
- filter->setMatrix(matrix);
+ setColorMatrix(&paint, matrix);
canvas->drawBitmap(fBitmap, 0, 80, &paint);
matrix.setSaturation(SkFloatToScalar(0.5f));
- filter->setMatrix(matrix);
+ setColorMatrix(&paint, matrix);
canvas->drawBitmap(fBitmap, 80, 80, &paint);
matrix.setSaturation(SkFloatToScalar(1.0f));
- filter->setMatrix(matrix);
+ setColorMatrix(&paint, matrix);
canvas->drawBitmap(fBitmap, 160, 80, &paint);
matrix.setSaturation(SkFloatToScalar(2.0f));
- filter->setMatrix(matrix);
+ setColorMatrix(&paint, matrix);
canvas->drawBitmap(fBitmap, 240, 80, &paint);
matrix.setRGB2YUV();
- filter->setMatrix(matrix);
+ setColorMatrix(&paint, matrix);
canvas->drawBitmap(fBitmap, 0, 160, &paint);
matrix.setYUV2RGB();
- filter->setMatrix(matrix);
+ setColorMatrix(&paint, matrix);
canvas->drawBitmap(fBitmap, 80, 160, &paint);
SkScalar s1 = SK_Scalar1;
@@ -125,7 +131,7 @@ protected:
s1, 0, 0, 0, 0,
};
- filter->setArray(data);
+ setArray(&paint, data);
canvas->drawBitmap(fBitmap, 160, 160, &paint);
}
diff --git a/include/effects/SkColorMatrixFilter.h b/include/effects/SkColorMatrixFilter.h
index 1ac6fbf3ee..07bd967ed5 100644
--- a/include/effects/SkColorMatrixFilter.h
+++ b/include/effects/SkColorMatrixFilter.h
@@ -15,13 +15,9 @@
class SK_API SkColorMatrixFilter : public SkColorFilter {
public:
- SkColorMatrixFilter();
explicit SkColorMatrixFilter(const SkColorMatrix&);
SkColorMatrixFilter(const SkScalar array[20]);
- void setMatrix(const SkColorMatrix&);
- void setArray(const SkScalar array[20]);
-
// overrides from SkColorFilter
virtual void filterSpan(const SkPMColor src[], int count, SkPMColor[]) SK_OVERRIDE;
virtual void filterSpan16(const uint16_t src[], int count, uint16_t[]) SK_OVERRIDE;
@@ -41,6 +37,7 @@ protected:
virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE;
private:
+ SkColorMatrix fMatrix;
typedef void (*Proc)(State*, unsigned r, unsigned g, unsigned b,
unsigned a);
@@ -49,7 +46,7 @@ private:
State fState;
uint32_t fFlags;
- void setup(const SkScalar array[20]);
+ void initState(const SkScalar array[20]);
typedef SkColorFilter INHERITED;
};
diff --git a/src/effects/SkColorMatrixFilter.cpp b/src/effects/SkColorMatrixFilter.cpp
index e2123e56ff..534bc01e5f 100644
--- a/src/effects/SkColorMatrixFilter.cpp
+++ b/src/effects/SkColorMatrixFilter.cpp
@@ -119,14 +119,7 @@ static void Add16(SkColorMatrixFilter::State* state,
// src is [20] but some compilers won't accept __restrict__ on anything
// but an raw pointer or reference
-void SkColorMatrixFilter::setup(const SkScalar* SK_RESTRICT src) {
- if (NULL == src) {
- fProc = NULL; // signals identity
- fFlags = kNO_ALPHA_FLAGS;
- // fState is undefined, but that is OK, since we shouldn't look at it
- return;
- }
-
+void SkColorMatrixFilter::initState(const SkScalar* SK_RESTRICT src) {
int32_t* array = fState.fArray;
SkFixed max = 0;
for (int i = 0; i < 20; i++) {
@@ -209,16 +202,13 @@ static int32_t pin(int32_t value, int32_t max) {
return value;
}
-SkColorMatrixFilter::SkColorMatrixFilter() {
- this->setup(NULL);
-}
-
-SkColorMatrixFilter::SkColorMatrixFilter(const SkColorMatrix& cm) {
- this->setup(cm.fMat);
+SkColorMatrixFilter::SkColorMatrixFilter(const SkColorMatrix& cm) : fMatrix(cm) {
+ this->initState(cm.fMat);
}
SkColorMatrixFilter::SkColorMatrixFilter(const SkScalar array[20]) {
- this->setup(array);
+ memcpy(fMatrix.fMat, array, 20 * sizeof(SkScalar));
+ this->initState(array);
}
uint32_t SkColorMatrixFilter::getFlags() {
@@ -309,42 +299,22 @@ void SkColorMatrixFilter::filterSpan16(const uint16_t src[], int count,
void SkColorMatrixFilter::flatten(SkFlattenableWriteBuffer& buffer) const {
this->INHERITED::flatten(buffer);
-
- buffer.writeFunctionPtr((void*)fProc);
- buffer.writeMul4(&fState, sizeof(fState));
- buffer.write32(fFlags);
+ // TODO: buffer.writeScalars(array, N)?
+ buffer.write(fMatrix.fMat, sizeof(fMatrix.fMat));
}
SkColorMatrixFilter::SkColorMatrixFilter(SkFlattenableReadBuffer& buffer)
: INHERITED(buffer) {
- fProc = (Proc)buffer.readFunctionPtr();
- buffer.read(&fState, sizeof(fState));
- fFlags = buffer.readU32();
+ // TODO: buffer.readScalars(array, N)?
+ buffer.read(fMatrix.fMat, sizeof(fMatrix.fMat));
+ this->initState(fMatrix.fMat);
}
bool SkColorMatrixFilter::asColorMatrix(SkScalar matrix[20]) {
- int32_t* array = fState.fArray;
- int unshift = 16 - fState.fShift;
- for (int i = 0; i < 20; i++) {
- matrix[i] = SkFixedToScalar(array[i] << unshift);
- }
- if (NULL != fProc) {
- // Undo the offset applied to the constant column in setup().
- SkFixed offset = 1 << (fState.fShift - 1);
- matrix[4] = SkFixedToScalar((array[4] - offset) << unshift);
- matrix[9] = SkFixedToScalar((array[9] - offset) << unshift);
- matrix[14] = SkFixedToScalar((array[14] - offset) << unshift);
- matrix[19] = SkFixedToScalar((array[19] - offset) << unshift);
+ if (matrix) {
+ memcpy(matrix, fMatrix.fMat, 20 * sizeof(SkScalar));
}
return true;
}
-void SkColorMatrixFilter::setMatrix(const SkColorMatrix& matrix) {
- setup(matrix.fMat);
-}
-
-void SkColorMatrixFilter::setArray(const SkScalar array[20]) {
- setup(array);
-}
-
SK_DEFINE_FLATTENABLE_REGISTRAR(SkColorMatrixFilter)