SkOffsetImageFilter.cpp revision ba6e954140e45e251d67934ed6ad752149fcf72f
1/*
2 * Copyright 2012 The Android Open Source Project
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkOffsetImageFilter.h"
9#include "SkBitmap.h"
10#include "SkMatrix.h"
11#include "SkFlattenableBuffers.h"
12
13bool SkOffsetImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& source,
14                                        const SkMatrix& matrix,
15                                        SkBitmap* result,
16                                        SkIPoint* loc) {
17    SkBitmap src = source;
18    if (getInput(0) && !getInput(0)->filterImage(proxy, source, matrix, &src, loc)) {
19        return false;
20    }
21
22    SkVector vec;
23    matrix.mapVectors(&vec, &fOffset, 1);
24
25    loc->fX += SkScalarRoundToInt(vec.fX);
26    loc->fY += SkScalarRoundToInt(vec.fY);
27    *result = src;
28    return true;
29}
30
31bool SkOffsetImageFilter::onFilterBounds(const SkIRect& src, const SkMatrix& ctm,
32                                         SkIRect* dst) {
33    SkVector vec;
34    ctm.mapVectors(&vec, &fOffset, 1);
35
36    *dst = src;
37    dst->offset(SkScalarRoundToInt(vec.fX), SkScalarRoundToInt(vec.fY));
38    return true;
39}
40
41void SkOffsetImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const {
42    this->INHERITED::flatten(buffer);
43    buffer.writePoint(fOffset);
44}
45
46SkOffsetImageFilter::SkOffsetImageFilter(SkScalar dx, SkScalar dy,
47                                         SkImageFilter* input) : INHERITED(input) {
48    fOffset.set(dx, dy);
49}
50
51SkOffsetImageFilter::SkOffsetImageFilter(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
52    buffer.readPoint(&fOffset);
53    buffer.validate(SkScalarIsFinite(fOffset.fX) &&
54                    SkScalarIsFinite(fOffset.fY));
55}
56