OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 The Android Open Source Project | 2 * Copyright 2014 The Android Open Source Project |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkMatrixImageFilter.h" | 8 #include "SkMatrixImageFilter.h" |
9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 paint.setXfermodeMode(SkXfermode::kSrc_Mode); | 84 paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
85 paint.setFilterQuality(fFilterQuality); | 85 paint.setFilterQuality(fFilterQuality); |
86 canvas.drawBitmap(src, srcRect.x(), srcRect.y(), &paint); | 86 canvas.drawBitmap(src, srcRect.x(), srcRect.y(), &paint); |
87 | 87 |
88 *result = device.get()->accessBitmap(false); | 88 *result = device.get()->accessBitmap(false); |
89 offset->fX = dstBounds.fLeft; | 89 offset->fX = dstBounds.fLeft; |
90 offset->fY = dstBounds.fTop; | 90 offset->fY = dstBounds.fTop; |
91 return true; | 91 return true; |
92 } | 92 } |
93 | 93 |
94 void SkMatrixImageFilter::computeFastBounds(const SkRect& src, SkRect* dst) cons
t { | 94 SkRect SkMatrixImageFilter::computeFastBounds(const SkRect& src) const { |
95 SkRect bounds = src; | 95 SkRect bounds = this->getInput(0) ? this->getInput(0)->computeFastBounds(src
) : src; |
96 if (getInput(0)) { | 96 SkRect dst; |
97 getInput(0)->computeFastBounds(src, &bounds); | 97 fTransform.mapRect(&dst, bounds); |
98 } | 98 return dst; |
99 fTransform.mapRect(dst, bounds); | |
100 } | 99 } |
101 | 100 |
102 void SkMatrixImageFilter::onFilterNodeBounds(const SkIRect& src, const SkMatrix&
ctm, | 101 SkIRect SkMatrixImageFilter::onFilterNodeBounds(const SkIRect& src, const SkMatr
ix& ctm, |
103 SkIRect* dst, MapDirection directio
n) const { | 102 MapDirection direction) const { |
104 SkMatrix matrix; | 103 SkMatrix matrix; |
105 if (!ctm.invert(&matrix)) { | 104 if (!ctm.invert(&matrix)) { |
106 *dst = src; | 105 return src; |
107 return; | |
108 } | 106 } |
109 if (kForward_MapDirection == direction) { | 107 if (kForward_MapDirection == direction) { |
110 matrix.postConcat(fTransform); | 108 matrix.postConcat(fTransform); |
111 } else { | 109 } else { |
112 SkMatrix transformInverse; | 110 SkMatrix transformInverse; |
113 if (!fTransform.invert(&transformInverse)) { | 111 if (!fTransform.invert(&transformInverse)) { |
114 *dst = src; | 112 return src; |
115 return; | |
116 } | 113 } |
117 matrix.postConcat(transformInverse); | 114 matrix.postConcat(transformInverse); |
118 } | 115 } |
119 matrix.postConcat(ctm); | 116 matrix.postConcat(ctm); |
120 SkRect floatBounds; | 117 SkRect floatBounds; |
121 matrix.mapRect(&floatBounds, SkRect::Make(src)); | 118 matrix.mapRect(&floatBounds, SkRect::Make(src)); |
122 SkIRect bounds = floatBounds.roundOut(); | 119 return floatBounds.roundOut(); |
123 *dst = bounds; | |
124 } | 120 } |
125 | 121 |
126 #ifndef SK_IGNORE_TO_STRING | 122 #ifndef SK_IGNORE_TO_STRING |
127 void SkMatrixImageFilter::toString(SkString* str) const { | 123 void SkMatrixImageFilter::toString(SkString* str) const { |
128 str->appendf("SkMatrixImageFilter: ("); | 124 str->appendf("SkMatrixImageFilter: ("); |
129 | 125 |
130 str->appendf("transform: (%f %f %f %f %f %f %f %f %f)", | 126 str->appendf("transform: (%f %f %f %f %f %f %f %f %f)", |
131 fTransform[SkMatrix::kMScaleX], | 127 fTransform[SkMatrix::kMScaleX], |
132 fTransform[SkMatrix::kMSkewX], | 128 fTransform[SkMatrix::kMSkewX], |
133 fTransform[SkMatrix::kMTransX], | 129 fTransform[SkMatrix::kMTransX], |
134 fTransform[SkMatrix::kMSkewY], | 130 fTransform[SkMatrix::kMSkewY], |
135 fTransform[SkMatrix::kMScaleY], | 131 fTransform[SkMatrix::kMScaleY], |
136 fTransform[SkMatrix::kMTransY], | 132 fTransform[SkMatrix::kMTransY], |
137 fTransform[SkMatrix::kMPersp0], | 133 fTransform[SkMatrix::kMPersp0], |
138 fTransform[SkMatrix::kMPersp1], | 134 fTransform[SkMatrix::kMPersp1], |
139 fTransform[SkMatrix::kMPersp2]); | 135 fTransform[SkMatrix::kMPersp2]); |
140 | 136 |
141 str->append("<dt>FilterLevel:</dt><dd>"); | 137 str->append("<dt>FilterLevel:</dt><dd>"); |
142 static const char* gFilterLevelStrings[] = { "None", "Low", "Medium", "High"
}; | 138 static const char* gFilterLevelStrings[] = { "None", "Low", "Medium", "High"
}; |
143 str->append(gFilterLevelStrings[fFilterQuality]); | 139 str->append(gFilterLevelStrings[fFilterQuality]); |
144 str->append("</dd>"); | 140 str->append("</dd>"); |
145 | 141 |
146 str->appendf(")"); | 142 str->appendf(")"); |
147 } | 143 } |
148 #endif | 144 #endif |
OLD | NEW |