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

Side by Side Diff: src/core/SkImageFilter.cpp

Issue 1650433004: Image filters: fix srcOffset handling in asFragmentProcessor() path. (Closed) Base URL: https://skia.googlesource.com/skia.git@m49
Patch Set: Created 4 years, 10 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
« no previous file with comments | « gm/imagefiltersgraph.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "SkImageFilter.h" 8 #include "SkImageFilter.h"
9 9
10 #include "SkBitmap.h" 10 #include "SkBitmap.h"
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 SkASSERT(fInputCount == 1); 327 SkASSERT(fInputCount == 1);
328 SkIPoint srcOffset = SkIPoint::Make(0, 0); 328 SkIPoint srcOffset = SkIPoint::Make(0, 0);
329 if (!this->filterInputGPU(0, proxy, src, ctx, &input, &srcOffset)) { 329 if (!this->filterInputGPU(0, proxy, src, ctx, &input, &srcOffset)) {
330 return false; 330 return false;
331 } 331 }
332 GrTexture* srcTexture = input.getTexture(); 332 GrTexture* srcTexture = input.getTexture();
333 SkIRect bounds; 333 SkIRect bounds;
334 if (!this->applyCropRect(ctx, proxy, input, &srcOffset, &bounds, &input)) { 334 if (!this->applyCropRect(ctx, proxy, input, &srcOffset, &bounds, &input)) {
335 return false; 335 return false;
336 } 336 }
337 SkRect srcRect = SkRect::Make(bounds);
338 SkRect dstRect = SkRect::MakeWH(srcRect.width(), srcRect.height());
339 GrContext* context = srcTexture->getContext(); 337 GrContext* context = srcTexture->getContext();
340 338
341 GrSurfaceDesc desc; 339 GrSurfaceDesc desc;
342 desc.fFlags = kRenderTarget_GrSurfaceFlag, 340 desc.fFlags = kRenderTarget_GrSurfaceFlag,
343 desc.fWidth = bounds.width(); 341 desc.fWidth = bounds.width();
344 desc.fHeight = bounds.height(); 342 desc.fHeight = bounds.height();
345 desc.fConfig = kRGBA_8888_GrPixelConfig; 343 desc.fConfig = kRGBA_8888_GrPixelConfig;
346 344
347 SkAutoTUnref<GrTexture> dst(context->textureProvider()->createApproxTexture( desc)); 345 SkAutoTUnref<GrTexture> dst(context->textureProvider()->createApproxTexture( desc));
348 if (!dst) { 346 if (!dst) {
349 return false; 347 return false;
350 } 348 }
351 349
352 // setup new clip
353 GrClip clip(dstRect);
354
355 GrFragmentProcessor* fp; 350 GrFragmentProcessor* fp;
356 offset->fX = bounds.left(); 351 offset->fX = bounds.left();
357 offset->fY = bounds.top(); 352 offset->fY = bounds.top();
358 bounds.offset(-srcOffset); 353 bounds.offset(-srcOffset);
359 SkMatrix matrix(ctx.ctm()); 354 SkMatrix matrix(ctx.ctm());
360 matrix.postTranslate(SkIntToScalar(-bounds.left()), SkIntToScalar(-bounds.to p())); 355 matrix.postTranslate(SkIntToScalar(-bounds.left()), SkIntToScalar(-bounds.to p()));
361 GrPaint paint; 356 GrPaint paint;
362 if (this->asFragmentProcessor(&fp, srcTexture, matrix, bounds)) { 357 if (this->asFragmentProcessor(&fp, srcTexture, matrix, bounds)) {
363 SkASSERT(fp); 358 SkASSERT(fp);
364 paint.addColorFragmentProcessor(fp)->unref(); 359 paint.addColorFragmentProcessor(fp)->unref();
365 paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); 360 paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode);
366 361
367 SkAutoTUnref<GrDrawContext> drawContext(context->drawContext(dst->asRend erTarget())); 362 SkAutoTUnref<GrDrawContext> drawContext(context->drawContext(dst->asRend erTarget()));
368 if (drawContext) { 363 if (drawContext) {
364 SkRect srcRect = SkRect::Make(bounds);
365 SkRect dstRect = SkRect::MakeWH(srcRect.width(), srcRect.height());
366 GrClip clip(dstRect);
369 drawContext->fillRectToRect(clip, paint, SkMatrix::I(), dstRect, src Rect); 367 drawContext->fillRectToRect(clip, paint, SkMatrix::I(), dstRect, src Rect);
370 368
371 GrWrapTextureInBitmap(dst, bounds.width(), bounds.height(), false, r esult); 369 GrWrapTextureInBitmap(dst, bounds.width(), bounds.height(), false, r esult);
372 return true; 370 return true;
373 } 371 }
374 } 372 }
375 #endif 373 #endif
376 return false; 374 return false;
377 } 375 }
378 376
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
672 } 670 }
673 return dev; 671 return dev;
674 } 672 }
675 673
676 bool SkImageFilter::DeviceProxy::filterImage(const SkImageFilter* filter, const SkBitmap& src, 674 bool SkImageFilter::DeviceProxy::filterImage(const SkImageFilter* filter, const SkBitmap& src,
677 const SkImageFilter::Context& ctx, 675 const SkImageFilter::Context& ctx,
678 SkBitmap* result, SkIPoint* offset) { 676 SkBitmap* result, SkIPoint* offset) {
679 return fDevice->filterImage(filter, src, ctx, result, offset); 677 return fDevice->filterImage(filter, src, ctx, result, offset);
680 } 678 }
681 679
OLDNEW
« no previous file with comments | « gm/imagefiltersgraph.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698