Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(147)

Side by Side Diff: src/effects/SkMorphologyImageFilter.cpp

Issue 112803004: Make SkImageFilter crop rects relative to the primitive origin, instead of relative to their parent (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Remove a useless zero. Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright 2012 The Android Open Source Project 2 * Copyright 2012 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 "SkMorphologyImageFilter.h" 8 #include "SkMorphologyImageFilter.h"
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkColorPriv.h" 10 #include "SkColorPriv.h"
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 } 160 }
161 dilateYProc(src.getAddr32(bounds.left(), bounds.top()), dst->getAddr32(0, 0) , 161 dilateYProc(src.getAddr32(bounds.left(), bounds.top()), dst->getAddr32(0, 0) ,
162 radiusY, bounds.height(), bounds.width(), 162 radiusY, bounds.height(), bounds.width(),
163 src.rowBytesAsPixels(), dst->rowBytesAsPixels()); 163 src.rowBytesAsPixels(), dst->rowBytesAsPixels());
164 } 164 }
165 165
166 bool SkErodeImageFilter::onFilterImage(Proxy* proxy, 166 bool SkErodeImageFilter::onFilterImage(Proxy* proxy,
167 const SkBitmap& source, const SkMatrix& c tm, 167 const SkBitmap& source, const SkMatrix& c tm,
168 SkBitmap* dst, SkIPoint* offset) { 168 SkBitmap* dst, SkIPoint* offset) {
169 SkBitmap src = source; 169 SkBitmap src = source;
170 if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctm, &src, offse t)) { 170 SkIPoint srcOffset = SkIPoint::Make(0, 0);
171 if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctm, &src, &srcO ffset)) {
171 return false; 172 return false;
172 } 173 }
173 174
174 if (src.config() != SkBitmap::kARGB_8888_Config) { 175 if (src.config() != SkBitmap::kARGB_8888_Config) {
175 return false; 176 return false;
176 } 177 }
177 178
178 SkIRect bounds; 179 SkIRect bounds;
179 src.getBounds(&bounds); 180 src.getBounds(&bounds);
181 bounds.offset(srcOffset);
180 if (!this->applyCropRect(&bounds, ctm)) { 182 if (!this->applyCropRect(&bounds, ctm)) {
181 return false; 183 return false;
182 } 184 }
183 185
184 SkAutoLockPixels alp(src); 186 SkAutoLockPixels alp(src);
185 if (!src.getPixels()) { 187 if (!src.getPixels()) {
186 return false; 188 return false;
187 } 189 }
188 190
189 dst->setConfig(src.config(), bounds.width(), bounds.height()); 191 dst->setConfig(src.config(), bounds.width(), bounds.height());
190 dst->allocPixels(); 192 dst->allocPixels();
191 if (!dst->getPixels()) { 193 if (!dst->getPixels()) {
192 return false; 194 return false;
193 } 195 }
194 196
195 int width = radius().width(); 197 int width = radius().width();
196 int height = radius().height(); 198 int height = radius().height();
197 199
198 if (width < 0 || height < 0) { 200 if (width < 0 || height < 0) {
199 return false; 201 return false;
200 } 202 }
201 203
202 if (width == 0 && height == 0) { 204 if (width == 0 && height == 0) {
203 src.extractSubset(dst, bounds); 205 src.extractSubset(dst, bounds);
204 offset->fX += bounds.left(); 206 offset->fX = bounds.left();
205 offset->fY += bounds.top(); 207 offset->fY = bounds.top();
206 return true; 208 return true;
207 } 209 }
208 210
209 SkBitmap temp; 211 SkBitmap temp;
210 temp.setConfig(dst->config(), dst->width(), dst->height()); 212 temp.setConfig(dst->config(), dst->width(), dst->height());
211 if (!temp.allocPixels()) { 213 if (!temp.allocPixels()) {
212 return false; 214 return false;
213 } 215 }
214 216
215 if (width > 0 && height > 0) { 217 if (width > 0 && height > 0) {
216 erodeX(src, &temp, width, bounds); 218 erodeX(src, &temp, width, bounds);
217 SkIRect tmpBounds = SkIRect::MakeWH(bounds.width(), bounds.height()); 219 SkIRect tmpBounds = SkIRect::MakeWH(bounds.width(), bounds.height());
218 erodeY(temp, dst, height, tmpBounds); 220 erodeY(temp, dst, height, tmpBounds);
219 } else if (width > 0) { 221 } else if (width > 0) {
220 erodeX(src, dst, width, bounds); 222 erodeX(src, dst, width, bounds);
221 } else if (height > 0) { 223 } else if (height > 0) {
222 erodeY(src, dst, height, bounds); 224 erodeY(src, dst, height, bounds);
223 } 225 }
224 offset->fX += bounds.left(); 226 offset->fX = bounds.left();
225 offset->fY += bounds.top(); 227 offset->fY = bounds.top();
226 return true; 228 return true;
227 } 229 }
228 230
229 bool SkDilateImageFilter::onFilterImage(Proxy* proxy, 231 bool SkDilateImageFilter::onFilterImage(Proxy* proxy,
230 const SkBitmap& source, const SkMatrix& ctm, 232 const SkBitmap& source, const SkMatrix& ctm,
231 SkBitmap* dst, SkIPoint* offset) { 233 SkBitmap* dst, SkIPoint* offset) {
232 SkBitmap src = source; 234 SkBitmap src = source;
233 if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctm, &src, offse t)) { 235 SkIPoint srcOffset = SkIPoint::Make(0, 0);
236 if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctm, &src, &srcO ffset)) {
234 return false; 237 return false;
235 } 238 }
236 if (src.config() != SkBitmap::kARGB_8888_Config) { 239 if (src.config() != SkBitmap::kARGB_8888_Config) {
237 return false; 240 return false;
238 } 241 }
239 242
240 SkIRect bounds; 243 SkIRect bounds;
241 src.getBounds(&bounds); 244 src.getBounds(&bounds);
245 bounds.offset(srcOffset);
242 if (!this->applyCropRect(&bounds, ctm)) { 246 if (!this->applyCropRect(&bounds, ctm)) {
243 return false; 247 return false;
244 } 248 }
245 249
246 SkAutoLockPixels alp(src); 250 SkAutoLockPixels alp(src);
247 if (!src.getPixels()) { 251 if (!src.getPixels()) {
248 return false; 252 return false;
249 } 253 }
250 254
251 dst->setConfig(src.config(), bounds.width(), bounds.height()); 255 dst->setConfig(src.config(), bounds.width(), bounds.height());
252 dst->allocPixels(); 256 dst->allocPixels();
253 if (!dst->getPixels()) { 257 if (!dst->getPixels()) {
254 return false; 258 return false;
255 } 259 }
256 260
257 int width = radius().width(); 261 int width = radius().width();
258 int height = radius().height(); 262 int height = radius().height();
259 263
260 if (width < 0 || height < 0) { 264 if (width < 0 || height < 0) {
261 return false; 265 return false;
262 } 266 }
263 267
264 if (width == 0 && height == 0) { 268 if (width == 0 && height == 0) {
265 src.extractSubset(dst, bounds); 269 src.extractSubset(dst, bounds);
266 offset->fX += bounds.left(); 270 offset->fX = bounds.left();
267 offset->fY += bounds.top(); 271 offset->fY = bounds.top();
268 return true; 272 return true;
269 } 273 }
270 274
271 SkBitmap temp; 275 SkBitmap temp;
272 temp.setConfig(dst->config(), dst->width(), dst->height()); 276 temp.setConfig(dst->config(), dst->width(), dst->height());
273 if (!temp.allocPixels()) { 277 if (!temp.allocPixels()) {
274 return false; 278 return false;
275 } 279 }
276 280
277 if (width > 0 && height > 0) { 281 if (width > 0 && height > 0) {
278 dilateX(src, &temp, width, bounds); 282 dilateX(src, &temp, width, bounds);
279 SkIRect tmpBounds = SkIRect::MakeWH(bounds.width(), bounds.height()); 283 SkIRect tmpBounds = SkIRect::MakeWH(bounds.width(), bounds.height());
280 dilateY(temp, dst, height, tmpBounds); 284 dilateY(temp, dst, height, tmpBounds);
281 } else if (width > 0) { 285 } else if (width > 0) {
282 dilateX(src, dst, width, bounds); 286 dilateX(src, dst, width, bounds);
283 } else if (height > 0) { 287 } else if (height > 0) {
284 dilateY(src, dst, height, bounds); 288 dilateY(src, dst, height, bounds);
285 } 289 }
286 offset->fX += bounds.left(); 290 offset->fX = bounds.left();
287 offset->fY += bounds.top(); 291 offset->fY = bounds.top();
288 return true; 292 return true;
289 } 293 }
290 294
291 #if SK_SUPPORT_GPU 295 #if SK_SUPPORT_GPU
292 296
293 /////////////////////////////////////////////////////////////////////////////// 297 ///////////////////////////////////////////////////////////////////////////////
294 298
295 class GrGLMorphologyEffect; 299 class GrGLMorphologyEffect;
296 300
297 /** 301 /**
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 } 577 }
574 int width = radius().width(); 578 int width = radius().width();
575 int height = radius().height(); 579 int height = radius().height();
576 580
577 if (width < 0 || height < 0) { 581 if (width < 0 || height < 0) {
578 return false; 582 return false;
579 } 583 }
580 584
581 if (width == 0 && height == 0) { 585 if (width == 0 && height == 0) {
582 src.extractSubset(result, bounds); 586 src.extractSubset(result, bounds);
583 offset->fX += bounds.left(); 587 offset->fX = bounds.left();
584 offset->fY += bounds.top(); 588 offset->fY = bounds.top();
585 return true; 589 return true;
586 } 590 }
587 591
588 if (!apply_morphology(input, bounds, GrMorphologyEffect::kDilate_MorphologyT ype, radius(), result)) { 592 if (!apply_morphology(input, bounds, GrMorphologyEffect::kDilate_MorphologyT ype, radius(), result)) {
589 return false; 593 return false;
590 } 594 }
591 offset->fX += bounds.left(); 595 offset->fX = bounds.left();
592 offset->fY += bounds.top(); 596 offset->fY = bounds.top();
593 return true; 597 return true;
594 } 598 }
595 599
596 bool SkErodeImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const SkMatrix& ctm, 600 bool SkErodeImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const SkMatrix& ctm,
597 SkBitmap* result, SkIPoint* offset) { 601 SkBitmap* result, SkIPoint* offset) {
598 SkBitmap input; 602 SkBitmap input;
599 if (!SkImageFilterUtils::GetInputResultGPU(getInput(0), proxy, src, ctm, &in put, offset)) { 603 if (!SkImageFilterUtils::GetInputResultGPU(getInput(0), proxy, src, ctm, &in put, offset)) {
600 return false; 604 return false;
601 } 605 }
602 SkIRect bounds; 606 SkIRect bounds;
603 src.getBounds(&bounds); 607 src.getBounds(&bounds);
604 if (!this->applyCropRect(&bounds, ctm)) { 608 if (!this->applyCropRect(&bounds, ctm)) {
605 return false; 609 return false;
606 } 610 }
607 int width = radius().width(); 611 int width = radius().width();
608 int height = radius().height(); 612 int height = radius().height();
609 613
610 if (width < 0 || height < 0) { 614 if (width < 0 || height < 0) {
611 return false; 615 return false;
612 } 616 }
613 617
614 if (width == 0 && height == 0) { 618 if (width == 0 && height == 0) {
615 src.extractSubset(result, bounds); 619 src.extractSubset(result, bounds);
616 offset->fX += bounds.left(); 620 offset->fX = bounds.left();
617 offset->fY += bounds.top(); 621 offset->fY = bounds.top();
618 return true; 622 return true;
619 } 623 }
620 624
621 if (!apply_morphology(input, bounds, GrMorphologyEffect::kErode_MorphologyTy pe, radius(), result)) { 625 if (!apply_morphology(input, bounds, GrMorphologyEffect::kErode_MorphologyTy pe, radius(), result)) {
622 return false; 626 return false;
623 } 627 }
624 offset->fX += bounds.left(); 628 offset->fX = bounds.left();
625 offset->fY += bounds.top(); 629 offset->fY = bounds.top();
626 return true; 630 return true;
627 } 631 }
628 632
629 #endif 633 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698