#include "SkMergeImageFilter.h"
#include "SkCanvas.h"
#include "SkDevice.h"
-#include "SkFlattenableBuffers.h"
+#include "SkReadBuffer.h"
+#include "SkWriteBuffer.h"
#include "SkValidationUtils.h"
///////////////////////////////////////////////////////////////////////////////
SkMergeImageFilter::SkMergeImageFilter(SkImageFilter* filters[], int count,
const SkXfermode::Mode modes[],
const CropRect* cropRect) : INHERITED(count, filters, cropRect) {
+ SkASSERT(count >= 0);
this->initModes(modes);
}
}
}
-bool SkMergeImageFilter::onFilterBounds(const SkIRect& src, const SkMatrix& ctm,
- SkIRect* dst) {
- if (countInputs() < 1) {
- return false;
- }
-
- SkIRect totalBounds;
-
- int inputCount = countInputs();
- for (int i = 0; i < inputCount; ++i) {
- SkImageFilter* filter = getInput(i);
- SkIRect r;
- if (filter) {
- if (!filter->filterBounds(src, ctm, &r)) {
- return false;
- }
- } else {
- r = src;
- }
- if (0 == i) {
- totalBounds = r;
- } else {
- totalBounds.join(r);
- }
- }
-
- // don't modify dst until now, so we don't accidentally change it in the
- // loop, but then return false on the next filter.
- *dst = totalBounds;
- return true;
-}
-
bool SkMergeImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src,
const SkMatrix& ctm,
- SkBitmap* result, SkIPoint* loc) {
+ SkBitmap* result, SkIPoint* offset) const {
if (countInputs() < 1) {
return false;
}
canvas.drawSprite(*srcPtr, pos.x() - x0, pos.y() - y0, &paint);
}
- loc->fX += bounds.left();
- loc->fY += bounds.top();
+ offset->fX = bounds.left();
+ offset->fY = bounds.top();
*result = dst->accessBitmap(false);
return true;
}
-void SkMergeImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const {
+void SkMergeImageFilter::flatten(SkWriteBuffer& buffer) const {
this->INHERITED::flatten(buffer);
buffer.writeBool(fModes != NULL);
}
}
-SkMergeImageFilter::SkMergeImageFilter(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
+SkMergeImageFilter::SkMergeImageFilter(SkReadBuffer& buffer)
+ : INHERITED(-1, buffer) {
bool hasModes = buffer.readBool();
if (hasModes) {
this->initAllocModes();
int nbInputs = countInputs();
size_t size = nbInputs * sizeof(fModes[0]);
SkASSERT(buffer.getArrayCount() == size);
- buffer.readByteArray(fModes, size);
- for (int i = 0; i < nbInputs; ++i) {
- buffer.validate(SkIsValidMode((SkXfermode::Mode)fModes[i]));
+ if (buffer.validate(buffer.getArrayCount() == size) &&
+ buffer.readByteArray(fModes, size)) {
+ for (int i = 0; i < nbInputs; ++i) {
+ buffer.validate(SkIsValidMode((SkXfermode::Mode)fModes[i]));
+ }
}
} else {
fModes = 0;