#include "SkColorMatrixFilter.h"
#include "SkDevice.h"
#include "SkColorFilter.h"
-#include "SkFlattenableBuffers.h"
+#include "SkReadBuffer.h"
+#include "SkWriteBuffer.h"
namespace {
};
SkColorFilterImageFilter* SkColorFilterImageFilter::Create(SkColorFilter* cf,
- SkImageFilter* input, const CropRect* cropRect) {
+ SkImageFilter* input, const CropRect* cropRect, uint32_t uniqueID) {
SkASSERT(cf);
+ if (NULL == cf) {
+ return NULL;
+ }
SkScalar colorMatrix[20], inputMatrix[20];
SkColorFilter* inputColorFilter;
if (input && cf->asColorMatrix(colorMatrix)
&& input->asColorFilter(&inputColorFilter)
- && (NULL != inputColorFilter)) {
+ && (inputColorFilter)) {
SkAutoUnref autoUnref(inputColorFilter);
if (inputColorFilter->asColorMatrix(inputMatrix) && !matrix_needs_clamping(inputMatrix)) {
SkScalar combinedMatrix[20];
- mult_color_matrix(inputMatrix, colorMatrix, combinedMatrix);
- SkAutoTUnref<SkColorFilter> newCF(SkNEW_ARGS(SkColorMatrixFilter, (combinedMatrix)));
- return SkNEW_ARGS(SkColorFilterImageFilter, (newCF, input->getInput(0), cropRect));
+ mult_color_matrix(colorMatrix, inputMatrix, combinedMatrix);
+ SkAutoTUnref<SkColorFilter> newCF(SkColorMatrixFilter::Create(combinedMatrix));
+ return SkNEW_ARGS(SkColorFilterImageFilter, (newCF, input->getInput(0), cropRect, 0));
}
}
- return SkNEW_ARGS(SkColorFilterImageFilter, (cf, input, cropRect));
+ return SkNEW_ARGS(SkColorFilterImageFilter, (cf, input, cropRect, uniqueID));
}
SkColorFilterImageFilter::SkColorFilterImageFilter(SkColorFilter* cf,
- SkImageFilter* input, const CropRect* cropRect)
- : INHERITED(input, cropRect), fColorFilter(cf) {
- SkASSERT(cf);
- SkSafeRef(cf);
+ SkImageFilter* input, const CropRect* cropRect, uint32_t uniqueID)
+ : INHERITED(1, &input, cropRect, uniqueID), fColorFilter(SkRef(cf)) {
}
-SkColorFilterImageFilter::SkColorFilterImageFilter(SkFlattenableReadBuffer& buffer)
+#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
+SkColorFilterImageFilter::SkColorFilterImageFilter(SkReadBuffer& buffer)
: INHERITED(1, buffer) {
fColorFilter = buffer.readColorFilter();
}
+#endif
-void SkColorFilterImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const {
- this->INHERITED::flatten(buffer);
+SkFlattenable* SkColorFilterImageFilter::CreateProc(SkReadBuffer& buffer) {
+ SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
+ SkAutoTUnref<SkColorFilter> cf(buffer.readColorFilter());
+ return Create(cf, common.getInput(0), &common.cropRect(), common.uniqueID());
+}
+void SkColorFilterImageFilter::flatten(SkWriteBuffer& buffer) const {
+ this->INHERITED::flatten(buffer);
buffer.writeFlattenable(fColorFilter);
}
SkColorFilterImageFilter::~SkColorFilterImageFilter() {
- SkSafeUnref(fColorFilter);
+ fColorFilter->unref();
}
bool SkColorFilterImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& source,
- const SkMatrix& matrix,
+ const Context& ctx,
SkBitmap* result,
- SkIPoint* offset) {
+ SkIPoint* offset) const {
SkBitmap src = source;
SkIPoint srcOffset = SkIPoint::Make(0, 0);
- if (getInput(0) && !getInput(0)->filterImage(proxy, source, matrix, &src, &srcOffset)) {
+ if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctx, &src, &srcOffset)) {
return false;
}
SkIRect bounds;
- src.getBounds(&bounds);
- bounds.offset(srcOffset);
- if (!this->applyCropRect(&bounds, matrix)) {
+ if (!this->applyCropRect(ctx, src, srcOffset, &bounds)) {
return false;
}