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

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

Issue 92793002: Fixed bad bitmap size crashes (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Changed getSize name to getAllocatedSizeInBytes Created 7 years 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 "SkBitmap.h" 8 #include "SkBitmap.h"
9 #include "SkMagnifierImageFilter.h" 9 #include "SkMagnifierImageFilter.h"
10 #include "SkColorPriv.h" 10 #include "SkColorPriv.h"
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 //////////////////////////////////////////////////////////////////////////////// 233 ////////////////////////////////////////////////////////////////////////////////
234 SkMagnifierImageFilter::SkMagnifierImageFilter(SkFlattenableReadBuffer& buffer) 234 SkMagnifierImageFilter::SkMagnifierImageFilter(SkFlattenableReadBuffer& buffer)
235 : INHERITED(1, buffer) { 235 : INHERITED(1, buffer) {
236 float x = buffer.readScalar(); 236 float x = buffer.readScalar();
237 float y = buffer.readScalar(); 237 float y = buffer.readScalar();
238 float width = buffer.readScalar(); 238 float width = buffer.readScalar();
239 float height = buffer.readScalar(); 239 float height = buffer.readScalar();
240 fSrcRect = SkRect::MakeXYWH(x, y, width, height); 240 fSrcRect = SkRect::MakeXYWH(x, y, width, height);
241 fInset = buffer.readScalar(); 241 fInset = buffer.readScalar();
242 242
243 buffer.validate(SkIsValidRect(fSrcRect) && SkScalarIsFinite(fInset)); 243 buffer.validate(SkScalarIsFinite(fInset) && SkIsValidRect(fSrcRect) &&
244 // Negative numbers in src rect are not supported
245 (fSrcRect.fLeft >= 0) && (fSrcRect.fTop >= 0));
244 } 246 }
245 247
246 // FIXME: implement single-input semantics 248 // FIXME: implement single-input semantics
247 SkMagnifierImageFilter::SkMagnifierImageFilter(SkRect srcRect, SkScalar inset) 249 SkMagnifierImageFilter::SkMagnifierImageFilter(SkRect srcRect, SkScalar inset)
248 : INHERITED(0), fSrcRect(srcRect), fInset(inset) { 250 : INHERITED(0), fSrcRect(srcRect), fInset(inset) {
249 SkASSERT(srcRect.x() >= 0 && srcRect.y() >= 0 && inset >= 0); 251 SkASSERT(srcRect.x() >= 0 && srcRect.y() >= 0 && inset >= 0);
250 } 252 }
251 253
252 #if SK_SUPPORT_GPU 254 #if SK_SUPPORT_GPU
253 bool SkMagnifierImageFilter::asNewEffect(GrEffectRef** effect, GrTexture* textur e, const SkMatrix&, const SkIRect&) const { 255 bool SkMagnifierImageFilter::asNewEffect(GrEffectRef** effect, GrTexture* textur e, const SkMatrix&, const SkIRect&) const {
(...skipping 22 matching lines...) Expand all
276 buffer.writeScalar(fInset); 278 buffer.writeScalar(fInset);
277 } 279 }
278 280
279 bool SkMagnifierImageFilter::onFilterImage(Proxy*, const SkBitmap& src, 281 bool SkMagnifierImageFilter::onFilterImage(Proxy*, const SkBitmap& src,
280 const SkMatrix&, SkBitmap* dst, 282 const SkMatrix&, SkBitmap* dst,
281 SkIPoint* offset) { 283 SkIPoint* offset) {
282 SkASSERT(src.config() == SkBitmap::kARGB_8888_Config); 284 SkASSERT(src.config() == SkBitmap::kARGB_8888_Config);
283 SkASSERT(fSrcRect.width() < src.width()); 285 SkASSERT(fSrcRect.width() < src.width());
284 SkASSERT(fSrcRect.height() < src.height()); 286 SkASSERT(fSrcRect.height() < src.height());
285 287
286 if (src.config() != SkBitmap::kARGB_8888_Config) { 288 if ((src.config() != SkBitmap::kARGB_8888_Config) ||
289 (fSrcRect.width() >= src.width()) ||
290 (fSrcRect.height() >= src.height())) {
287 return false; 291 return false;
288 } 292 }
289 293
290 SkAutoLockPixels alp(src); 294 SkAutoLockPixels alp(src);
291 SkASSERT(src.getPixels()); 295 SkASSERT(src.getPixels());
292 if (!src.getPixels() || src.width() <= 0 || src.height() <= 0) { 296 if (!src.getPixels() || src.width() <= 0 || src.height() <= 0) {
293 return false; 297 return false;
294 } 298 }
295 299
300 dst->setConfig(src.config(), src.width(), src.height());
301 dst->allocPixels();
302 if (!dst->getPixels()) {
303 return false;
304 }
305
296 SkScalar inv_inset = fInset > 0 ? SkScalarInvert(fInset) : SK_Scalar1; 306 SkScalar inv_inset = fInset > 0 ? SkScalarInvert(fInset) : SK_Scalar1;
297 307
298 SkScalar inv_x_zoom = fSrcRect.width() / src.width(); 308 SkScalar inv_x_zoom = fSrcRect.width() / src.width();
299 SkScalar inv_y_zoom = fSrcRect.height() / src.height(); 309 SkScalar inv_y_zoom = fSrcRect.height() / src.height();
300 310
301 dst->setConfig(src.config(), src.width(), src.height());
302 dst->allocPixels();
303 SkColor* sptr = src.getAddr32(0, 0); 311 SkColor* sptr = src.getAddr32(0, 0);
304 SkColor* dptr = dst->getAddr32(0, 0); 312 SkColor* dptr = dst->getAddr32(0, 0);
305 int width = src.width(), height = src.height(); 313 int width = src.width(), height = src.height();
306 for (int y = 0; y < height; ++y) { 314 for (int y = 0; y < height; ++y) {
307 for (int x = 0; x < width; ++x) { 315 for (int x = 0; x < width; ++x) {
308 SkScalar x_dist = SkMin32(x, width - x - 1) * inv_inset; 316 SkScalar x_dist = SkMin32(x, width - x - 1) * inv_inset;
309 SkScalar y_dist = SkMin32(y, height - y - 1) * inv_inset; 317 SkScalar y_dist = SkMin32(y, height - y - 1) * inv_inset;
310 SkScalar weight = 0; 318 SkScalar weight = 0;
311 319
312 static const SkScalar kScalar2 = SkScalar(2); 320 static const SkScalar kScalar2 = SkScalar(2);
(...skipping 12 matching lines...) Expand all
325 SkScalar sqDist = SkMinScalar(SkScalarSquare(x_dist), 333 SkScalar sqDist = SkMinScalar(SkScalarSquare(x_dist),
326 SkScalarSquare(y_dist)); 334 SkScalarSquare(y_dist));
327 weight = SkMinScalar(sqDist, SK_Scalar1); 335 weight = SkMinScalar(sqDist, SK_Scalar1);
328 } 336 }
329 337
330 SkScalar x_interp = SkScalarMul(weight, (fSrcRect.x() + x * inv_x_zo om)) + 338 SkScalar x_interp = SkScalarMul(weight, (fSrcRect.x() + x * inv_x_zo om)) +
331 (SK_Scalar1 - weight) * x; 339 (SK_Scalar1 - weight) * x;
332 SkScalar y_interp = SkScalarMul(weight, (fSrcRect.y() + y * inv_y_zo om)) + 340 SkScalar y_interp = SkScalarMul(weight, (fSrcRect.y() + y * inv_y_zo om)) +
333 (SK_Scalar1 - weight) * y; 341 (SK_Scalar1 - weight) * y;
334 342
335 int x_val = SkMin32(SkScalarFloorToInt(x_interp), width - 1); 343 int x_val = SkPin32(SkScalarFloorToInt(x_interp), 0, width - 1);
336 int y_val = SkMin32(SkScalarFloorToInt(y_interp), height - 1); 344 int y_val = SkPin32(SkScalarFloorToInt(y_interp), 0, height - 1);
337 345
338 *dptr = sptr[y_val * width + x_val]; 346 *dptr = sptr[y_val * width + x_val];
339 dptr++; 347 dptr++;
340 } 348 }
341 } 349 }
342 return true; 350 return true;
343 } 351 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698