| Index: src/effects/SkResizeImageFilter.cpp
|
| diff --git a/src/effects/SkResizeImageFilter.cpp b/src/effects/SkResizeImageFilter.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4d700901efb292f14a65d09b35a588fe0a1053ce
|
| --- /dev/null
|
| +++ b/src/effects/SkResizeImageFilter.cpp
|
| @@ -0,0 +1,81 @@
|
| +/*
|
| + * Copyright 2013 The Android Open Source Project
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#include "SkResizeImageFilter.h"
|
| +#include "SkBitmap.h"
|
| +#include "SkCanvas.h"
|
| +#include "SkDevice.h"
|
| +#include "SkColorPriv.h"
|
| +#include "SkFlattenableBuffers.h"
|
| +#include "SkMatrix.h"
|
| +#include "SkRect.h"
|
| +
|
| +SkResizeImageFilter::SkResizeImageFilter(SkScalar sx, SkScalar sy, SkPaint::FilterLevel filterLevel,
|
| + SkImageFilter* input)
|
| + : INHERITED(input),
|
| + fSx(sx),
|
| + fSy(sy),
|
| + fFilterLevel(filterLevel) {
|
| +}
|
| +
|
| +SkResizeImageFilter::SkResizeImageFilter(SkFlattenableReadBuffer& buffer)
|
| + : INHERITED(1, buffer) {
|
| + fSx = buffer.readScalar();
|
| + fSy = buffer.readScalar();
|
| + fFilterLevel = static_cast<SkPaint::FilterLevel>(buffer.readInt());
|
| +}
|
| +
|
| +void SkResizeImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const {
|
| + this->INHERITED::flatten(buffer);
|
| + buffer.writeScalar(fSx);
|
| + buffer.writeScalar(fSy);
|
| + buffer.writeInt(fFilterLevel);
|
| +}
|
| +
|
| +SkResizeImageFilter::~SkResizeImageFilter() {
|
| +}
|
| +
|
| +bool SkResizeImageFilter::onFilterImage(Proxy* proxy,
|
| + const SkBitmap& source,
|
| + const SkMatrix& matrix,
|
| + SkBitmap* result,
|
| + SkIPoint* offset) {
|
| + SkBitmap src = source;
|
| + SkIPoint srcOffset = SkIPoint::Make(0, 0);
|
| + if (getInput(0) && !getInput(0)->filterImage(proxy, source, matrix, &src, &srcOffset)) {
|
| + return false;
|
| + }
|
| +
|
| + SkRect dstRect;
|
| + SkIRect srcBounds, dstBounds;
|
| + src.getBounds(&srcBounds);
|
| + srcBounds.offset(srcOffset);
|
| + SkRect srcRect = SkRect::Make(srcBounds);
|
| + SkMatrix dstMatrix;
|
| + dstMatrix.setScale(fSx, fSy);
|
| + dstMatrix.mapRect(&dstRect, srcRect);
|
| + dstRect.roundOut(&dstBounds);
|
| +
|
| + SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(dstBounds.width(), dstBounds.height()));
|
| + if (NULL == device.get()) {
|
| + return false;
|
| + }
|
| +
|
| + SkCanvas canvas(device.get());
|
| + canvas.translate(-SkIntToScalar(dstBounds.fLeft), -SkIntToScalar(dstBounds.fTop));
|
| + SkPaint paint;
|
| +
|
| + paint.setXfermodeMode(SkXfermode::kSrc_Mode);
|
| + paint.setFilterLevel(fFilterLevel);
|
| + canvas.concat(dstMatrix);
|
| + canvas.drawBitmap(src, srcRect.left(), srcRect.top(), &paint);
|
| +
|
| + *result = device.get()->accessBitmap(false);
|
| + offset->fX = dstBounds.fLeft;
|
| + offset->fY = dstBounds.fTop;
|
| + return true;
|
| +}
|
|
|