| OLD | NEW |
| 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 Loading... |
| 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 |
| 217 offset->fX = bounds.left(); |
| 218 offset->fY = bounds.top(); |
| 219 bounds.offset(-srcOffset); |
| 215 if (width > 0 && height > 0) { | 220 if (width > 0 && height > 0) { |
| 216 erodeX(src, &temp, width, bounds); | 221 erodeX(src, &temp, width, bounds); |
| 217 SkIRect tmpBounds = SkIRect::MakeWH(bounds.width(), bounds.height()); | 222 SkIRect tmpBounds = SkIRect::MakeWH(bounds.width(), bounds.height()); |
| 218 erodeY(temp, dst, height, tmpBounds); | 223 erodeY(temp, dst, height, tmpBounds); |
| 219 } else if (width > 0) { | 224 } else if (width > 0) { |
| 220 erodeX(src, dst, width, bounds); | 225 erodeX(src, dst, width, bounds); |
| 221 } else if (height > 0) { | 226 } else if (height > 0) { |
| 222 erodeY(src, dst, height, bounds); | 227 erodeY(src, dst, height, bounds); |
| 223 } | 228 } |
| 224 offset->fX += bounds.left(); | |
| 225 offset->fY += bounds.top(); | |
| 226 return true; | 229 return true; |
| 227 } | 230 } |
| 228 | 231 |
| 229 bool SkDilateImageFilter::onFilterImage(Proxy* proxy, | 232 bool SkDilateImageFilter::onFilterImage(Proxy* proxy, |
| 230 const SkBitmap& source, const SkMatrix&
ctm, | 233 const SkBitmap& source, const SkMatrix&
ctm, |
| 231 SkBitmap* dst, SkIPoint* offset) { | 234 SkBitmap* dst, SkIPoint* offset) { |
| 232 SkBitmap src = source; | 235 SkBitmap src = source; |
| 233 if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctm, &src, offse
t)) { | 236 SkIPoint srcOffset = SkIPoint::Make(0, 0); |
| 237 if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctm, &src, &srcO
ffset)) { |
| 234 return false; | 238 return false; |
| 235 } | 239 } |
| 236 if (src.config() != SkBitmap::kARGB_8888_Config) { | 240 if (src.config() != SkBitmap::kARGB_8888_Config) { |
| 237 return false; | 241 return false; |
| 238 } | 242 } |
| 239 | 243 |
| 240 SkIRect bounds; | 244 SkIRect bounds; |
| 241 src.getBounds(&bounds); | 245 src.getBounds(&bounds); |
| 246 bounds.offset(srcOffset); |
| 242 if (!this->applyCropRect(&bounds, ctm)) { | 247 if (!this->applyCropRect(&bounds, ctm)) { |
| 243 return false; | 248 return false; |
| 244 } | 249 } |
| 245 | 250 |
| 246 SkAutoLockPixels alp(src); | 251 SkAutoLockPixels alp(src); |
| 247 if (!src.getPixels()) { | 252 if (!src.getPixels()) { |
| 248 return false; | 253 return false; |
| 249 } | 254 } |
| 250 | 255 |
| 251 dst->setConfig(src.config(), bounds.width(), bounds.height()); | 256 dst->setConfig(src.config(), bounds.width(), bounds.height()); |
| 252 dst->allocPixels(); | 257 dst->allocPixels(); |
| 253 if (!dst->getPixels()) { | 258 if (!dst->getPixels()) { |
| 254 return false; | 259 return false; |
| 255 } | 260 } |
| 256 | 261 |
| 257 int width = radius().width(); | 262 int width = radius().width(); |
| 258 int height = radius().height(); | 263 int height = radius().height(); |
| 259 | 264 |
| 260 if (width < 0 || height < 0) { | 265 if (width < 0 || height < 0) { |
| 261 return false; | 266 return false; |
| 262 } | 267 } |
| 263 | 268 |
| 264 if (width == 0 && height == 0) { | 269 if (width == 0 && height == 0) { |
| 265 src.extractSubset(dst, bounds); | 270 src.extractSubset(dst, bounds); |
| 266 offset->fX += bounds.left(); | 271 offset->fX = bounds.left(); |
| 267 offset->fY += bounds.top(); | 272 offset->fY = bounds.top(); |
| 268 return true; | 273 return true; |
| 269 } | 274 } |
| 270 | 275 |
| 271 SkBitmap temp; | 276 SkBitmap temp; |
| 272 temp.setConfig(dst->config(), dst->width(), dst->height()); | 277 temp.setConfig(dst->config(), dst->width(), dst->height()); |
| 273 if (!temp.allocPixels()) { | 278 if (!temp.allocPixels()) { |
| 274 return false; | 279 return false; |
| 275 } | 280 } |
| 276 | 281 |
| 282 offset->fX = bounds.left(); |
| 283 offset->fY = bounds.top(); |
| 284 bounds.offset(-srcOffset); |
| 277 if (width > 0 && height > 0) { | 285 if (width > 0 && height > 0) { |
| 278 dilateX(src, &temp, width, bounds); | 286 dilateX(src, &temp, width, bounds); |
| 279 SkIRect tmpBounds = SkIRect::MakeWH(bounds.width(), bounds.height()); | 287 SkIRect tmpBounds = SkIRect::MakeWH(bounds.width(), bounds.height()); |
| 280 dilateY(temp, dst, height, tmpBounds); | 288 dilateY(temp, dst, height, tmpBounds); |
| 281 } else if (width > 0) { | 289 } else if (width > 0) { |
| 282 dilateX(src, dst, width, bounds); | 290 dilateX(src, dst, width, bounds); |
| 283 } else if (height > 0) { | 291 } else if (height > 0) { |
| 284 dilateY(src, dst, height, bounds); | 292 dilateY(src, dst, height, bounds); |
| 285 } | 293 } |
| 286 offset->fX += bounds.left(); | |
| 287 offset->fY += bounds.top(); | |
| 288 return true; | 294 return true; |
| 289 } | 295 } |
| 290 | 296 |
| 291 #if SK_SUPPORT_GPU | 297 #if SK_SUPPORT_GPU |
| 292 | 298 |
| 293 /////////////////////////////////////////////////////////////////////////////// | 299 /////////////////////////////////////////////////////////////////////////////// |
| 294 | 300 |
| 295 class GrGLMorphologyEffect; | 301 class GrGLMorphologyEffect; |
| 296 | 302 |
| 297 /** | 303 /** |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 573 } | 579 } |
| 574 int width = radius().width(); | 580 int width = radius().width(); |
| 575 int height = radius().height(); | 581 int height = radius().height(); |
| 576 | 582 |
| 577 if (width < 0 || height < 0) { | 583 if (width < 0 || height < 0) { |
| 578 return false; | 584 return false; |
| 579 } | 585 } |
| 580 | 586 |
| 581 if (width == 0 && height == 0) { | 587 if (width == 0 && height == 0) { |
| 582 src.extractSubset(result, bounds); | 588 src.extractSubset(result, bounds); |
| 583 offset->fX += bounds.left(); | 589 offset->fX = bounds.left(); |
| 584 offset->fY += bounds.top(); | 590 offset->fY = bounds.top(); |
| 585 return true; | 591 return true; |
| 586 } | 592 } |
| 587 | 593 |
| 588 if (!apply_morphology(input, bounds, GrMorphologyEffect::kDilate_MorphologyT
ype, radius(), result)) { | 594 if (!apply_morphology(input, bounds, GrMorphologyEffect::kDilate_MorphologyT
ype, radius(), result)) { |
| 589 return false; | 595 return false; |
| 590 } | 596 } |
| 591 offset->fX += bounds.left(); | 597 offset->fX = bounds.left(); |
| 592 offset->fY += bounds.top(); | 598 offset->fY = bounds.top(); |
| 593 return true; | 599 return true; |
| 594 } | 600 } |
| 595 | 601 |
| 596 bool SkErodeImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const
SkMatrix& ctm, | 602 bool SkErodeImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const
SkMatrix& ctm, |
| 597 SkBitmap* result, SkIPoint* offset) { | 603 SkBitmap* result, SkIPoint* offset) { |
| 598 SkBitmap input; | 604 SkBitmap input; |
| 599 if (!SkImageFilterUtils::GetInputResultGPU(getInput(0), proxy, src, ctm, &in
put, offset)) { | 605 if (!SkImageFilterUtils::GetInputResultGPU(getInput(0), proxy, src, ctm, &in
put, offset)) { |
| 600 return false; | 606 return false; |
| 601 } | 607 } |
| 602 SkIRect bounds; | 608 SkIRect bounds; |
| 603 src.getBounds(&bounds); | 609 src.getBounds(&bounds); |
| 604 if (!this->applyCropRect(&bounds, ctm)) { | 610 if (!this->applyCropRect(&bounds, ctm)) { |
| 605 return false; | 611 return false; |
| 606 } | 612 } |
| 607 int width = radius().width(); | 613 int width = radius().width(); |
| 608 int height = radius().height(); | 614 int height = radius().height(); |
| 609 | 615 |
| 610 if (width < 0 || height < 0) { | 616 if (width < 0 || height < 0) { |
| 611 return false; | 617 return false; |
| 612 } | 618 } |
| 613 | 619 |
| 614 if (width == 0 && height == 0) { | 620 if (width == 0 && height == 0) { |
| 615 src.extractSubset(result, bounds); | 621 src.extractSubset(result, bounds); |
| 616 offset->fX += bounds.left(); | 622 offset->fX = bounds.left(); |
| 617 offset->fY += bounds.top(); | 623 offset->fY = bounds.top(); |
| 618 return true; | 624 return true; |
| 619 } | 625 } |
| 620 | 626 |
| 621 if (!apply_morphology(input, bounds, GrMorphologyEffect::kErode_MorphologyTy
pe, radius(), result)) { | 627 if (!apply_morphology(input, bounds, GrMorphologyEffect::kErode_MorphologyTy
pe, radius(), result)) { |
| 622 return false; | 628 return false; |
| 623 } | 629 } |
| 624 offset->fX += bounds.left(); | 630 offset->fX = bounds.left(); |
| 625 offset->fY += bounds.top(); | 631 offset->fY = bounds.top(); |
| 626 return true; | 632 return true; |
| 627 } | 633 } |
| 628 | 634 |
| 629 #endif | 635 #endif |
| OLD | NEW |