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

Side by Side Diff: src/gpu/SkGpuDevice_drawTexture.cpp

Issue 1440763002: In SkGpuDevice;drawTextureAdjuster perform texture w/h divide in texture matrix (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 1 month 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 | « no previous file | 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 2015 Google Inc. 2 * Copyright 2015 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 "SkGpuDevice.h" 8 #include "SkGpuDevice.h"
9 9
10 #include "GrBlurUtils.h" 10 #include "GrBlurUtils.h"
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 const SkRect& clippedDstRect, 113 const SkRect& clippedDstRect,
114 SkCanvas::SrcRectConstraint constraint , 114 SkCanvas::SrcRectConstraint constraint ,
115 const SkMatrix& viewMatrix, 115 const SkMatrix& viewMatrix,
116 const SkMatrix& srcToDstMatrix, 116 const SkMatrix& srcToDstMatrix,
117 const GrClip& clip, 117 const GrClip& clip,
118 const SkPaint& paint) { 118 const SkPaint& paint) {
119 // Specifying the texture coords as local coordinates is an attempt to enabl e more batching 119 // Specifying the texture coords as local coordinates is an attempt to enabl e more batching
120 // by not baking anything about the srcRect, dstRect, or viewMatrix, into th e texture FP. In 120 // by not baking anything about the srcRect, dstRect, or viewMatrix, into th e texture FP. In
121 // the future this should be an opaque optimization enabled by the combinati on of batch/GP and 121 // the future this should be an opaque optimization enabled by the combinati on of batch/GP and
122 // FP. 122 // FP.
123 const SkMatrix* textureFPMatrix; 123 SkMatrix textureFPMatrix;
124 SkMatrix tempMatrix;
125 const SkMaskFilter* mf = paint.getMaskFilter(); 124 const SkMaskFilter* mf = paint.getMaskFilter();
126 GrTexture* texture = adjuster->originalTexture(); 125 GrTexture* texture = adjuster->originalTexture();
127 // The shader expects proper local coords, so we can't replace local coords with texture coords 126 // The shader expects proper local coords, so we can't replace local coords with texture coords
128 // if the shader will be used. If we have a mask filter we will change the u nderlying geometry 127 // if the shader will be used. If we have a mask filter we will change the u nderlying geometry
129 // that is rendered. 128 // that is rendered.
130 bool canUseTextureCoordsAsLocalCoords = !use_shader(alphaTexture, paint) && !mf; 129 bool canUseTextureCoordsAsLocalCoords = !use_shader(alphaTexture, paint) && !mf;
131 if (canUseTextureCoordsAsLocalCoords) { 130 if (canUseTextureCoordsAsLocalCoords) {
132 textureFPMatrix = &SkMatrix::I(); 131 textureFPMatrix.setIDiv(texture->width(), texture->height());
133 } else { 132 } else {
134 if (!srcToDstMatrix.invert(&tempMatrix)) { 133 if (!srcToDstMatrix.invert(&textureFPMatrix)) {
135 return; 134 return;
136 } 135 }
137 tempMatrix.postIDiv(texture->width(), texture->height()); 136 textureFPMatrix.postIDiv(texture->width(), texture->height());
138 textureFPMatrix = &tempMatrix;
139 } 137 }
140 138
141 bool doBicubic; 139 bool doBicubic;
142 GrTextureParams::FilterMode fm = 140 GrTextureParams::FilterMode fm =
143 GrSkFilterQualityToGrFilterMode(paint.getFilterQuality(), viewMatrix, sr cToDstMatrix, 141 GrSkFilterQualityToGrFilterMode(paint.getFilterQuality(), viewMatrix, sr cToDstMatrix,
144 &doBicubic); 142 &doBicubic);
145 const GrTextureParams::FilterMode* filterMode = doBicubic ? nullptr : &fm; 143 const GrTextureParams::FilterMode* filterMode = doBicubic ? nullptr : &fm;
146 144
147 GrTextureAdjuster::FilterConstraint constraintMode; 145 GrTextureAdjuster::FilterConstraint constraintMode;
148 if (SkCanvas::kFast_SrcRectConstraint == constraint) { 146 if (SkCanvas::kFast_SrcRectConstraint == constraint) {
149 constraintMode = GrTextureAdjuster::kNo_FilterConstraint; 147 constraintMode = GrTextureAdjuster::kNo_FilterConstraint;
150 } else { 148 } else {
151 constraintMode = GrTextureAdjuster::kYes_FilterConstraint; 149 constraintMode = GrTextureAdjuster::kYes_FilterConstraint;
152 } 150 }
153 151
154 // If we have to outset for AA then we will generate texture coords outside the src rect. The 152 // If we have to outset for AA then we will generate texture coords outside the src rect. The
155 // same happens for any mask filter that extends the bounds rendered in the dst. 153 // same happens for any mask filter that extends the bounds rendered in the dst.
156 // This is conservative as a mask filter does not have to expand the bounds rendered. 154 // This is conservative as a mask filter does not have to expand the bounds rendered.
157 bool coordsAllInsideSrcRect = !paint.isAntiAlias() && !mf; 155 bool coordsAllInsideSrcRect = !paint.isAntiAlias() && !mf;
158 156
159 SkAutoTUnref<const GrFragmentProcessor> fp(adjuster->createFragmentProcessor ( 157 SkAutoTUnref<const GrFragmentProcessor> fp(adjuster->createFragmentProcessor (
160 *textureFPMatrix, clippedSrcRect, constraintMode, coordsAllInsideSrcRect , filterMode)); 158 textureFPMatrix, clippedSrcRect, constraintMode, coordsAllInsideSrcRect, filterMode));
161 if (!fp) { 159 if (!fp) {
162 return; 160 return;
163 } 161 }
164 fp.reset(mix_texture_fp_with_paint_color_and_shader(fp, alphaTexture, this-> context(), 162 fp.reset(mix_texture_fp_with_paint_color_and_shader(fp, alphaTexture, this-> context(),
165 viewMatrix, paint)); 163 viewMatrix, paint));
166 GrPaint grPaint; 164 GrPaint grPaint;
167 if (!SkPaintToGrPaintReplaceShader(fContext, paint, fp, &grPaint)) { 165 if (!SkPaintToGrPaintReplaceShader(fContext, paint, fp, &grPaint)) {
168 return; 166 return;
169 } 167 }
170 168
171 if (canUseTextureCoordsAsLocalCoords) { 169 if (canUseTextureCoordsAsLocalCoords) {
172 SkRect localRect; 170 fDrawContext->fillRectToRect(clip, grPaint, viewMatrix, clippedDstRect, clippedSrcRect);
173 localRect.fLeft = clippedSrcRect.fLeft / texture->width();
174 localRect.fBottom = clippedSrcRect.fBottom / texture->height();
175 localRect.fRight = clippedSrcRect.fRight / texture->width();
176 localRect.fTop = clippedSrcRect.fTop / texture->height();
177 fDrawContext->fillRectToRect(clip, grPaint, viewMatrix, clippedDstRect, localRect);
178 return; 171 return;
179 } 172 }
180 173
181 if (!mf) { 174 if (!mf) {
182 fDrawContext->drawRect(clip, grPaint, viewMatrix, clippedDstRect); 175 fDrawContext->drawRect(clip, grPaint, viewMatrix, clippedDstRect);
183 return; 176 return;
184 } 177 }
185 178
186 // First see if we can do the draw + mask filter direct to the dst. 179 // First see if we can do the draw + mask filter direct to the dst.
187 SkStrokeRec rec(SkStrokeRec::kFill_InitStyle); 180 SkStrokeRec rec(SkStrokeRec::kFill_InitStyle);
188 SkRRect rrect; 181 SkRRect rrect;
189 rrect.setRect(clippedDstRect); 182 rrect.setRect(clippedDstRect);
190 if (mf->directFilterRRectMaskGPU(fContext->textureProvider(), 183 if (mf->directFilterRRectMaskGPU(fContext->textureProvider(),
191 fDrawContext, 184 fDrawContext,
192 &grPaint, 185 &grPaint,
193 clip, 186 clip,
194 viewMatrix, 187 viewMatrix,
195 rec, 188 rec,
196 rrect)) { 189 rrect)) {
197 return; 190 return;
198 } 191 }
199 SkPath rectPath; 192 SkPath rectPath;
200 rectPath.addRect(clippedDstRect); 193 rectPath.addRect(clippedDstRect);
201 GrBlurUtils::drawPathWithMaskFilter(this->context(), fDrawContext, fRenderTa rget, fClip, 194 GrBlurUtils::drawPathWithMaskFilter(this->context(), fDrawContext, fRenderTa rget, fClip,
202 rectPath, &grPaint, viewMatrix, mf, pain t.getPathEffect(), 195 rectPath, &grPaint, viewMatrix, mf, pain t.getPathEffect(),
203 GrStrokeInfo::FillInfo()); 196 GrStrokeInfo::FillInfo());
204 } 197 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698