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

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

Issue 920513003: Make filters use SkImage instead of SkBitmap Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 9 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 | « src/effects/SkTestImageFilters.cpp ('k') | src/effects/SkXfermodeImageFilter.cpp » ('j') | 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 2013 Google Inc. 2 * Copyright 2013 Google Inc.
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 "SkTileImageFilter.h" 8 #include "SkTileImageFilter.h"
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkCanvas.h" 10 #include "SkCanvas.h"
11 #include "SkDevice.h" 11 #include "SkDevice.h"
12 #include "SkImage.h"
12 #include "SkReadBuffer.h" 13 #include "SkReadBuffer.h"
13 #include "SkWriteBuffer.h" 14 #include "SkWriteBuffer.h"
14 #include "SkMatrix.h" 15 #include "SkMatrix.h"
15 #include "SkPaint.h" 16 #include "SkPaint.h"
16 #include "SkShader.h" 17 #include "SkShader.h"
17 #include "SkValidationUtils.h" 18 #include "SkValidationUtils.h"
18 19
19 SkTileImageFilter* SkTileImageFilter::Create(const SkRect& srcRect, const SkRect & dstRect, 20 SkTileImageFilter* SkTileImageFilter::Create(const SkRect& srcRect, const SkRect & dstRect,
20 SkImageFilter* input) { 21 SkImageFilter* input) {
21 if (!SkIsValidRect(srcRect) || !SkIsValidRect(dstRect)) { 22 if (!SkIsValidRect(srcRect) || !SkIsValidRect(dstRect)) {
22 return NULL; 23 return NULL;
23 } 24 }
24 return SkNEW_ARGS(SkTileImageFilter, (srcRect, dstRect, input)); 25 return SkNEW_ARGS(SkTileImageFilter, (srcRect, dstRect, input));
25 } 26 }
26 27
27 bool SkTileImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src, 28 bool SkTileImageFilter::onFilterImage(Proxy* proxy, const SkImage* src,
28 const Context& ctx, 29 const Context& ctx,
29 SkBitmap* dst, SkIPoint* offset) const { 30 SkAutoTUnref<const SkImage>& dst, SkIPoint * offset) const {
30 SkBitmap source = src; 31 SkAutoTUnref<const SkImage> source(SkRef(src));
31 SkImageFilter* input = getInput(0); 32 SkImageFilter* input = getInput(0);
32 SkIPoint srcOffset = SkIPoint::Make(0, 0); 33 SkIPoint srcOffset = SkIPoint::Make(0, 0);
33 if (input && !input->filterImage(proxy, src, ctx, &source, &srcOffset)) { 34 if (input && !input->filterImage(proxy, src, ctx, source, &srcOffset)) {
34 return false; 35 return false;
35 } 36 }
36 37
37 SkRect dstRect; 38 SkRect dstRect;
38 ctx.ctm().mapRect(&dstRect, fDstRect); 39 ctx.ctm().mapRect(&dstRect, fDstRect);
39 const SkIRect dstIRect = dstRect.roundOut(); 40 const SkIRect dstIRect = dstRect.roundOut();
40 int w = dstIRect.width(); 41 int w = dstIRect.width();
41 int h = dstIRect.height(); 42 int h = dstIRect.height();
42 if (!fSrcRect.width() || !fSrcRect.height() || !w || !h) { 43 if (!fSrcRect.width() || !fSrcRect.height() || !w || !h) {
43 return false; 44 return false;
44 } 45 }
45 46
46 SkRect srcRect; 47 SkRect srcRect;
47 ctx.ctm().mapRect(&srcRect, fSrcRect); 48 ctx.ctm().mapRect(&srcRect, fSrcRect);
48 SkIRect srcIRect; 49 SkIRect srcIRect;
49 srcRect.roundOut(&srcIRect); 50 srcRect.roundOut(&srcIRect);
50 srcIRect.offset(-srcOffset); 51 srcIRect.offset(-srcOffset);
51 SkBitmap subset; 52 SkIRect bounds = SkIRect::MakeWH(source->width(), source->height());
52 SkIRect bounds;
53 source.getBounds(&bounds);
54 53
55 if (!srcIRect.intersect(bounds)) { 54 if (!srcIRect.intersect(bounds)) {
56 offset->fX = offset->fY = 0; 55 offset->fX = offset->fY = 0;
57 return true; 56 return true;
58 } else if (!source.extractSubset(&subset, srcIRect)) { 57 }
58 SkAutoTUnref<SkImage> subset(source->newImage(srcIRect.width(), srcIRect.hei ght(), &srcIRect));
59 if (!subset) {
59 return false; 60 return false;
60 } 61 }
61 62
62 SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(w, h)); 63 SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(w, h));
63 if (NULL == device.get()) { 64 if (NULL == device.get()) {
64 return false; 65 return false;
65 } 66 }
66 SkCanvas canvas(device); 67 {
67 SkPaint paint; 68 SkCanvas canvas(device);
68 paint.setXfermodeMode(SkXfermode::kSrc_Mode); 69 SkPaint paint;
70 paint.setXfermodeMode(SkXfermode::kSrc_Mode);
69 71
70 SkMatrix shaderMatrix; 72 SkMatrix shaderMatrix;
71 shaderMatrix.setTranslate(SkIntToScalar(srcOffset.fX), 73 shaderMatrix.setTranslate(SkIntToScalar(srcOffset.fX),
72 SkIntToScalar(srcOffset.fY)); 74 SkIntToScalar(srcOffset.fY));
73 SkAutoTUnref<SkShader> shader(SkShader::CreateBitmapShader(subset, 75 SkAutoTUnref<SkShader> shader(subset->newShader(SkShader::kRepeat_TileMo de,
74 SkShader::kRepeat_TileMode, SkShader::kRepeat_ TileMode, 76 SkShader::kRepeat_TileMo de, &shaderMatrix));
75 &shaderMatrix)); 77
76 paint.setShader(shader); 78 paint.setShader(shader);
77 canvas.translate(-dstRect.fLeft, -dstRect.fTop); 79 subset.reset(NULL);
78 canvas.drawRect(dstRect, paint); 80 canvas.translate(-dstRect.fLeft, -dstRect.fTop);
79 *dst = device->accessBitmap(false); 81 canvas.drawRect(dstRect, paint);
82 }
83
84 SkImage* image = device->newImageSnapshot();
85 if (NULL == image) {
86 return false;
87 }
88 dst.reset(image);
80 offset->fX = dstIRect.fLeft; 89 offset->fX = dstIRect.fLeft;
81 offset->fY = dstIRect.fTop; 90 offset->fY = dstIRect.fTop;
82 return true; 91 return true;
83 } 92 }
84 93
85 bool SkTileImageFilter::onFilterBounds(const SkIRect& src, const SkMatrix& ctm, 94 bool SkTileImageFilter::onFilterBounds(const SkIRect& src, const SkMatrix& ctm,
86 SkIRect* dst) const { 95 SkIRect* dst) const {
87 SkRect srcRect; 96 SkRect srcRect;
88 ctm.mapRect(&srcRect, fSrcRect); 97 ctm.mapRect(&srcRect, fSrcRect);
89 SkIRect srcIRect; 98 SkIRect srcIRect;
(...skipping 16 matching lines...) Expand all
106 buffer.writeRect(fSrcRect); 115 buffer.writeRect(fSrcRect);
107 buffer.writeRect(fDstRect); 116 buffer.writeRect(fDstRect);
108 } 117 }
109 118
110 #ifndef SK_IGNORE_TO_STRING 119 #ifndef SK_IGNORE_TO_STRING
111 void SkTileImageFilter::toString(SkString* str) const { 120 void SkTileImageFilter::toString(SkString* str) const {
112 str->appendf("SkTileImageFilter: ("); 121 str->appendf("SkTileImageFilter: (");
113 str->append(")"); 122 str->append(")");
114 } 123 }
115 #endif 124 #endif
OLDNEW
« no previous file with comments | « src/effects/SkTestImageFilters.cpp ('k') | src/effects/SkXfermodeImageFilter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698