| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 "GrSWMaskHelper.h" | 8 #include "GrSWMaskHelper.h" |
| 9 | 9 |
| 10 #include "GrCaps.h" | 10 #include "GrCaps.h" |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 fDraw.fDst = fPixels; | 92 fDraw.fDst = fPixels; |
| 93 fRasterClip.setRect(bounds); | 93 fRasterClip.setRect(bounds); |
| 94 fDraw.fRC = &fRasterClip; | 94 fDraw.fRC = &fRasterClip; |
| 95 fDraw.fMatrix = &fMatrix; | 95 fDraw.fMatrix = &fMatrix; |
| 96 return true; | 96 return true; |
| 97 } | 97 } |
| 98 | 98 |
| 99 /** | 99 /** |
| 100 * Get a texture (from the texture cache) of the correct size & format. | 100 * Get a texture (from the texture cache) of the correct size & format. |
| 101 */ | 101 */ |
| 102 GrTexture* GrSWMaskHelper::createTexture() { | 102 GrTexture* GrSWMaskHelper::createTexture(TextureType textureType) { |
| 103 GrSurfaceDesc desc; | 103 GrSurfaceDesc desc; |
| 104 desc.fWidth = fPixels.width(); | 104 desc.fWidth = fPixels.width(); |
| 105 desc.fHeight = fPixels.height(); | 105 desc.fHeight = fPixels.height(); |
| 106 desc.fConfig = kAlpha_8_GrPixelConfig; | 106 desc.fConfig = kAlpha_8_GrPixelConfig; |
| 107 | 107 |
| 108 return fTexProvider->createApproxTexture(desc); | 108 if (TextureType::kApproximateFit == textureType) { |
| 109 return fTexProvider->createApproxTexture(desc); |
| 110 } else { |
| 111 return fTexProvider->createTexture(desc, SkBudgeted::kYes); |
| 112 } |
| 109 } | 113 } |
| 110 | 114 |
| 111 /** | 115 /** |
| 112 * Move the result of the software mask generation back to the gpu | 116 * Move the result of the software mask generation back to the gpu |
| 113 */ | 117 */ |
| 114 void GrSWMaskHelper::toTexture(GrTexture *texture) { | 118 void GrSWMaskHelper::toTexture(GrTexture *texture) { |
| 115 // Since we're uploading to it, and it's compressed, 'texture' shouldn't | 119 // Since we're uploading to it, and it's compressed, 'texture' shouldn't |
| 116 // have a render target. | 120 // have a render target. |
| 117 SkASSERT(!texture->asRenderTarget()); | 121 SkASSERT(!texture->asRenderTarget()); |
| 118 | 122 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 131 | 135 |
| 132 //////////////////////////////////////////////////////////////////////////////// | 136 //////////////////////////////////////////////////////////////////////////////// |
| 133 /** | 137 /** |
| 134 * Software rasterizes shape to A8 mask and uploads the result to a scratch text
ure. Returns the | 138 * Software rasterizes shape to A8 mask and uploads the result to a scratch text
ure. Returns the |
| 135 * resulting texture on success; nullptr on failure. | 139 * resulting texture on success; nullptr on failure. |
| 136 */ | 140 */ |
| 137 GrTexture* GrSWMaskHelper::DrawShapeMaskToTexture(GrTextureProvider* texProvider
, | 141 GrTexture* GrSWMaskHelper::DrawShapeMaskToTexture(GrTextureProvider* texProvider
, |
| 138 const GrShape& shape, | 142 const GrShape& shape, |
| 139 const SkIRect& resultBounds, | 143 const SkIRect& resultBounds, |
| 140 bool antiAlias, | 144 bool antiAlias, |
| 145 TextureType textureType, |
| 141 const SkMatrix* matrix) { | 146 const SkMatrix* matrix) { |
| 142 GrSWMaskHelper helper(texProvider); | 147 GrSWMaskHelper helper(texProvider); |
| 143 | 148 |
| 144 if (!helper.init(resultBounds, matrix)) { | 149 if (!helper.init(resultBounds, matrix)) { |
| 145 return nullptr; | 150 return nullptr; |
| 146 } | 151 } |
| 147 | 152 |
| 148 helper.drawShape(shape, SkRegion::kReplace_Op, antiAlias, 0xFF); | 153 helper.drawShape(shape, SkRegion::kReplace_Op, antiAlias, 0xFF); |
| 149 | 154 |
| 150 GrTexture* texture(helper.createTexture()); | 155 GrTexture* texture(helper.createTexture(textureType)); |
| 151 if (!texture) { | 156 if (!texture) { |
| 152 return nullptr; | 157 return nullptr; |
| 153 } | 158 } |
| 154 | 159 |
| 155 helper.toTexture(texture); | 160 helper.toTexture(texture); |
| 156 | 161 |
| 157 return texture; | 162 return texture; |
| 158 } | 163 } |
| 159 | 164 |
| 160 void GrSWMaskHelper::DrawToTargetWithShapeMask(GrTexture* texture, | 165 void GrSWMaskHelper::DrawToTargetWithShapeMask(GrTexture* texture, |
| 161 GrDrawContext* drawContext, | 166 GrDrawContext* drawContext, |
| 162 const GrPaint& paint, | 167 const GrPaint& paint, |
| 163 const GrUserStencilSettings& user
StencilSettings, | 168 const GrUserStencilSettings& user
StencilSettings, |
| 164 const GrClip& clip, | 169 const GrClip& clip, |
| 165 const SkMatrix& viewMatrix, | 170 const SkMatrix& viewMatrix, |
| 166 const SkIRect& rect) { | 171 const SkIPoint& textureOriginInDe
viceSpace, |
| 172 const SkIRect& deviceSpaceRectToD
raw) { |
| 167 SkMatrix invert; | 173 SkMatrix invert; |
| 168 if (!viewMatrix.invert(&invert)) { | 174 if (!viewMatrix.invert(&invert)) { |
| 169 return; | 175 return; |
| 170 } | 176 } |
| 171 | 177 |
| 172 SkRect dstRect = SkRect::MakeLTRB(SK_Scalar1 * rect.fLeft, | 178 SkRect dstRect = SkRect::Make(deviceSpaceRectToDraw); |
| 173 SK_Scalar1 * rect.fTop, | |
| 174 SK_Scalar1 * rect.fRight, | |
| 175 SK_Scalar1 * rect.fBottom); | |
| 176 | 179 |
| 177 // We use device coords to compute the texture coordinates. We take the devi
ce coords and apply | 180 // We use device coords to compute the texture coordinates. We take the devi
ce coords and apply |
| 178 // a translation so that the top-left of the device bounds maps to 0,0, and
then a scaling | 181 // a translation so that the top-left of the device bounds maps to 0,0, and
then a scaling |
| 179 // matrix to normalized coords. | 182 // matrix to normalized coords. |
| 180 SkMatrix maskMatrix; | 183 SkMatrix maskMatrix; |
| 181 maskMatrix.setIDiv(texture->width(), texture->height()); | 184 maskMatrix.setIDiv(texture->width(), texture->height()); |
| 182 maskMatrix.preTranslate(SkIntToScalar(-rect.fLeft), SkIntToScalar(-rect.fTop
)); | 185 maskMatrix.preTranslate(SkIntToScalar(-textureOriginInDeviceSpace.fX), |
| 186 SkIntToScalar(-textureOriginInDeviceSpace.fY)); |
| 183 | 187 |
| 184 GrPipelineBuilder pipelineBuilder(paint, drawContext->mustUseHWAA(paint)); | 188 GrPipelineBuilder pipelineBuilder(paint, drawContext->mustUseHWAA(paint)); |
| 185 pipelineBuilder.setUserStencil(&userStencilSettings); | 189 pipelineBuilder.setUserStencil(&userStencilSettings); |
| 186 | 190 |
| 187 pipelineBuilder.addCoverageFragmentProcessor( | 191 pipelineBuilder.addCoverageFragmentProcessor( |
| 188 GrSimpleTextureEffect::Make(texture, | 192 GrSimpleTextureEffect::Make(texture, |
| 189 nullptr, | 193 nullptr, |
| 190 maskMatrix, | 194 maskMatrix, |
| 191 GrTextureParams::kNone_Filt
erMode, | 195 GrTextureParams::kNone_Filt
erMode, |
| 192 kDevice_GrCoordSet)); | 196 kDevice_GrCoordSet)); |
| 193 | 197 |
| 194 SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateNonAAFill(paint.ge
tColor(), | 198 SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateNonAAFill(paint.ge
tColor(), |
| 195 SkMatrix
::I(), | 199 SkMatrix
::I(), |
| 196 dstRect,
nullptr, &invert)); | 200 dstRect,
nullptr, &invert)); |
| 197 drawContext->drawBatch(pipelineBuilder, clip, batch); | 201 drawContext->drawBatch(pipelineBuilder, clip, batch); |
| 198 } | 202 } |
| OLD | NEW |