Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 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 "SkPathEffect.h" | 8 #include "SkPathEffect.h" |
| 9 #include "SkShadowPaintFilterCanvas.h" | 9 #include "SkShadowPaintFilterCanvas.h" |
| 10 | 10 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 44 | 44 |
| 45 *paint->writable() = newPaint; | 45 *paint->writable() = newPaint; |
| 46 } | 46 } |
| 47 | 47 |
| 48 return true; | 48 return true; |
| 49 } | 49 } |
| 50 | 50 |
| 51 SkISize SkShadowPaintFilterCanvas::ComputeDepthMapSize(const SkLights::Light& li ght, int maxDepth, | 51 SkISize SkShadowPaintFilterCanvas::ComputeDepthMapSize(const SkLights::Light& li ght, int maxDepth, |
| 52 int width, int height) { | 52 int width, int height) { |
| 53 if (light.type() != SkLights::Light::kDirectional_LightType) { | 53 if (light.type() != SkLights::Light::kDirectional_LightType) { |
| 54 return SkISize::Make(width *2 , height * 2); | 54 return SkISize::Make(width * 2, height * 2); |
| 55 } | 55 } |
| 56 | 56 |
| 57 int dMapWidth = SkMin32(maxDepth * fabs(light.dir().fX) + width, | 57 int dMapWidth = SkMin32(maxDepth * fabs(light.dir().fX) + width, |
| 58 width * 2); | 58 width * 2); |
| 59 int dMapHeight = SkMin32(maxDepth * fabs(light.dir().fY) + height, | 59 int dMapHeight = SkMin32(maxDepth * fabs(light.dir().fY) + height, |
| 60 height * 2); | 60 height * 2); |
| 61 return SkISize::Make(dMapWidth, dMapHeight); | 61 return SkISize::Make(dMapWidth, dMapHeight); |
| 62 } | 62 } |
| 63 | 63 |
| 64 void SkShadowPaintFilterCanvas::setShadowParams(const SkShadowParams ¶ms) { | 64 void SkShadowPaintFilterCanvas::setShadowParams(const SkShadowParams ¶ms) { |
| 65 fShadowParams = params; | 65 fShadowParams = params; |
| 66 } | 66 } |
| 67 | 67 |
| 68 void SkShadowPaintFilterCanvas::onDrawPicture(const SkPicture *picture, const Sk Matrix *matrix, | 68 void SkShadowPaintFilterCanvas::onDrawPicture(const SkPicture *picture, const Sk Matrix *matrix, |
| 69 const SkPaint *paint) { | 69 const SkPaint *paint) { |
| 70 SkTCopyOnFirstWrite<SkPaint> filteredPaint(paint); | 70 SkTCopyOnFirstWrite<SkPaint> filteredPaint(paint); |
| 71 if (this->onFilter(&filteredPaint, kPicture_Type)) { | 71 if (this->onFilter(&filteredPaint, kPicture_Type)) { |
| 72 SkCanvas::onDrawPicture(picture, matrix, filteredPaint); | 72 SkCanvas::onDrawPicture(picture, matrix, filteredPaint); |
| 73 } | 73 } |
| 74 } | 74 } |
| 75 | 75 |
|
robertphillips
2016/08/31 22:18:19
const SkRect&
vjiaoblack
2016/09/01 19:22:47
Done.
| |
| 76 void SkShadowPaintFilterCanvas::updateMatrix() { | 76 void SkShadowPaintFilterCanvas::updateMatrix(const SkRect boundRect) { |
| 77 this->save(); | 77 this->save(); |
| 78 | 78 |
| 79 // It is up to the user to set the 0th light in fLights to | 79 // It is up to the user to set the 0th light in fLights to |
| 80 // the light the want to render the depth map with. | 80 // the light the want to render the depth map with. |
| 81 if (this->fLights->light(0).type() == SkLights::Light::kDirectional_LightTyp e) { | 81 if (this->fLights->light(0).type() == SkLights::Light::kDirectional_LightTyp e) { |
| 82 const SkVector3& lightDir = this->fLights->light(0).dir(); | 82 const SkVector3& lightDir = this->fLights->light(0).dir(); |
| 83 SkScalar x = lightDir.fX * this->getZ(); | 83 SkScalar x = lightDir.fX * this->getZ(); |
| 84 SkScalar y = lightDir.fY * this->getZ(); | 84 SkScalar y = lightDir.fY * this->getZ(); |
| 85 | 85 |
| 86 this->translate(x, y); | 86 this->translate(x, y); |
| 87 } else if (this->fLights->light(0).type() == SkLights::Light::kPoint_LightTy pe) { | |
|
robertphillips
2016/08/31 22:18:19
How does all this interact with the CTM and saveLa
vjiaoblack
2016/09/01 19:22:47
I'll test it.
| |
| 88 const SkPoint3& lightPos = this->fLights->light(0).pos(); | |
| 89 | |
| 90 SkScalar scale = (lightPos.fZ) / (lightPos.fZ - this->getZ()); | |
| 91 | |
| 92 this->translate(-boundRect.centerX() * scale, -boundRect.centerY() * sca le); | |
| 93 this->scale(scale, scale); | |
| 94 this->translate(boundRect.centerX() / scale, boundRect.centerY() / scale ); | |
| 95 | |
|
robertphillips
2016/08/31 22:18:19
Why 400?
vjiaoblack
2016/09/01 19:22:48
because it's the current height of the diffuse map
| |
| 96 // pass in 400 as height | |
| 97 this->translate((boundRect.centerX() - lightPos.fX) * | |
| 98 (this->getZ() / (lightPos.fZ - this->getZ())) / scale, | |
| 99 - ((400 - boundRect.centerY()) - lightPos.fY) * | |
| 100 (this->getZ() / (lightPos.fZ - this->getZ())) / scale); | |
| 87 } | 101 } |
| 88 } | 102 } |
| 89 | 103 |
| 90 void SkShadowPaintFilterCanvas::onDrawPaint(const SkPaint &paint) { | 104 void SkShadowPaintFilterCanvas::onDrawPaint(const SkPaint &paint) { |
| 91 this->updateMatrix(); | 105 SkISize size = this->getBaseLayerSize(); |
| 106 this->updateMatrix(SkRect::MakeIWH(size.fWidth, size.fHeight)); | |
| 92 this->INHERITED::onDrawPaint(paint); | 107 this->INHERITED::onDrawPaint(paint); |
| 93 this->restore(); | 108 this->restore(); |
| 94 } | 109 } |
| 95 | 110 |
| 96 void SkShadowPaintFilterCanvas::onDrawPoints(PointMode mode, size_t count, const SkPoint pts[], | 111 void SkShadowPaintFilterCanvas::onDrawPoints(PointMode mode, size_t count, const SkPoint pts[], |
| 97 const SkPaint &paint) { | 112 const SkPaint &paint) { |
| 98 this->updateMatrix(); | 113 SkISize size = this->getBaseLayerSize(); |
| 114 this->updateMatrix(SkRect::MakeIWH(size.fWidth, size.fHeight)); | |
| 99 this->INHERITED::onDrawPoints(mode, count, pts, paint); | 115 this->INHERITED::onDrawPoints(mode, count, pts, paint); |
| 100 this->restore(); | 116 this->restore(); |
| 101 } | 117 } |
| 102 | 118 |
| 103 void SkShadowPaintFilterCanvas::onDrawRect(const SkRect &rect, const SkPaint &pa int) { | 119 void SkShadowPaintFilterCanvas::onDrawRect(const SkRect &rect, const SkPaint &pa int) { |
| 104 this->updateMatrix(); | 120 this->updateMatrix(rect); |
| 105 this->INHERITED::onDrawRect(rect, paint); | 121 this->INHERITED::onDrawRect(rect, paint); |
| 106 this->restore(); | 122 this->restore(); |
| 107 } | 123 } |
| 108 | 124 |
| 109 void SkShadowPaintFilterCanvas::onDrawRRect(const SkRRect &rrect, const SkPaint &paint) { | 125 void SkShadowPaintFilterCanvas::onDrawRRect(const SkRRect &rrect, const SkPaint &paint) { |
| 110 this->updateMatrix(); | 126 this->updateMatrix(rrect.getBounds()); |
| 111 this->INHERITED::onDrawRRect(rrect, paint); | 127 this->INHERITED::onDrawRRect(rrect, paint); |
| 112 this->restore(); | 128 this->restore(); |
| 113 } | 129 } |
| 114 | 130 |
| 115 void SkShadowPaintFilterCanvas::onDrawDRRect(const SkRRect &outer, const SkRRect &inner, | 131 void SkShadowPaintFilterCanvas::onDrawDRRect(const SkRRect &outer, const SkRRect &inner, |
| 116 const SkPaint &paint) { | 132 const SkPaint &paint) { |
| 117 this->updateMatrix(); | 133 this->updateMatrix(outer.getBounds()); |
| 118 this->INHERITED::onDrawDRRect(outer, inner, paint); | 134 this->INHERITED::onDrawDRRect(outer, inner, paint); |
| 119 this->restore(); | 135 this->restore(); |
| 120 } | 136 } |
| 121 | 137 |
| 122 void SkShadowPaintFilterCanvas::onDrawOval(const SkRect &rect, const SkPaint &pa int) { | 138 void SkShadowPaintFilterCanvas::onDrawOval(const SkRect &rect, const SkPaint &pa int) { |
| 123 this->updateMatrix(); | 139 this->updateMatrix(rect); |
| 124 this->INHERITED::onDrawOval(rect, paint); | 140 this->INHERITED::onDrawOval(rect, paint); |
| 125 this->restore(); | 141 this->restore(); |
| 126 } | 142 } |
| 127 | 143 |
| 128 void SkShadowPaintFilterCanvas::onDrawArc(const SkRect &rect, SkScalar startAngl e, | 144 void SkShadowPaintFilterCanvas::onDrawArc(const SkRect &rect, SkScalar startAngl e, |
| 129 SkScalar sweepAngle, bool useCenter, | 145 SkScalar sweepAngle, bool useCenter, |
| 130 const SkPaint &paint) { | 146 const SkPaint &paint) { |
| 131 this->updateMatrix(); | 147 this->updateMatrix(rect); |
| 132 this->INHERITED::onDrawArc(rect, startAngle, sweepAngle, useCenter, paint); | 148 this->INHERITED::onDrawArc(rect, startAngle, sweepAngle, useCenter, paint); |
| 133 this->restore(); | 149 this->restore(); |
| 134 } | 150 } |
| 135 | 151 |
| 136 void SkShadowPaintFilterCanvas::onDrawPath(const SkPath &path, const SkPaint &pa int) { | 152 void SkShadowPaintFilterCanvas::onDrawPath(const SkPath &path, const SkPaint &pa int) { |
| 137 this->updateMatrix(); | 153 this->updateMatrix(path.getBounds()); |
| 138 this->INHERITED::onDrawPath(path, paint); | 154 this->INHERITED::onDrawPath(path, paint); |
| 139 this->restore(); | 155 this->restore(); |
| 140 } | 156 } |
| 141 | 157 |
| 142 void SkShadowPaintFilterCanvas::onDrawBitmap(const SkBitmap &bm, SkScalar left, SkScalar top, | 158 void SkShadowPaintFilterCanvas::onDrawBitmap(const SkBitmap &bm, SkScalar left, SkScalar top, |
| 143 const SkPaint *paint) { | 159 const SkPaint *paint) { |
| 144 this->updateMatrix(); | 160 this->updateMatrix(SkRect::MakeXYWH(left, top, bm.width(), bm.height())); |
| 145 this->INHERITED::onDrawBitmap(bm, left, top, paint); | 161 this->INHERITED::onDrawBitmap(bm, left, top, paint); |
| 146 this->restore(); | 162 this->restore(); |
| 147 } | 163 } |
| 148 | 164 |
| 149 void SkShadowPaintFilterCanvas::onDrawBitmapRect(const SkBitmap &bm, const SkRec t *src, | 165 void SkShadowPaintFilterCanvas::onDrawBitmapRect(const SkBitmap &bm, const SkRec t *src, |
| 150 const SkRect &dst, const SkPain t *paint, | 166 const SkRect &dst, const SkPain t *paint, |
| 151 SrcRectConstraint constraint) { | 167 SrcRectConstraint constraint) { |
| 152 this->updateMatrix(); | 168 this->updateMatrix(dst); |
| 153 this->INHERITED::onDrawBitmapRect(bm, src, dst, paint, constraint); | 169 this->INHERITED::onDrawBitmapRect(bm, src, dst, paint, constraint); |
| 154 this->restore(); | 170 this->restore(); |
| 155 } | 171 } |
| 156 | 172 |
| 157 void SkShadowPaintFilterCanvas::onDrawBitmapNine(const SkBitmap &bm, const SkIRe ct ¢er, | 173 void SkShadowPaintFilterCanvas::onDrawBitmapNine(const SkBitmap &bm, const SkIRe ct ¢er, |
| 158 const SkRect &dst, const SkPain t *paint) { | 174 const SkRect &dst, const SkPain t *paint) { |
| 159 this->updateMatrix(); | 175 this->updateMatrix(dst); |
| 160 this->INHERITED::onDrawBitmapNine(bm, center, dst, paint); | 176 this->INHERITED::onDrawBitmapNine(bm, center, dst, paint); |
| 161 this->restore(); | 177 this->restore(); |
| 162 } | 178 } |
| 163 | 179 |
| 164 void SkShadowPaintFilterCanvas::onDrawImage(const SkImage *image, SkScalar left, | 180 void SkShadowPaintFilterCanvas::onDrawImage(const SkImage *image, SkScalar left, |
| 165 SkScalar top, const SkPaint *paint) { | 181 SkScalar top, const SkPaint *paint) { |
| 166 this->updateMatrix(); | 182 this->updateMatrix(SkRect::MakeXYWH(left, top, image->width(), image->height ())); |
| 167 this->INHERITED::onDrawImage(image, left, top, paint); | 183 this->INHERITED::onDrawImage(image, left, top, paint); |
| 168 this->restore(); | 184 this->restore(); |
| 169 } | 185 } |
| 170 | 186 |
| 171 void SkShadowPaintFilterCanvas::onDrawImageRect(const SkImage *image, const SkRe ct *src, | 187 void SkShadowPaintFilterCanvas::onDrawImageRect(const SkImage *image, const SkRe ct *src, |
| 172 const SkRect &dst, const SkPaint *paint, | 188 const SkRect &dst, const SkPaint *paint, |
| 173 SrcRectConstraint constraint) { | 189 SrcRectConstraint constraint) { |
| 174 this->updateMatrix(); | 190 this->updateMatrix(dst); |
| 175 this->INHERITED::onDrawImageRect(image, src, dst, paint, constraint); | 191 this->INHERITED::onDrawImageRect(image, src, dst, paint, constraint); |
| 176 this->restore(); | 192 this->restore(); |
| 177 } | 193 } |
| 178 | 194 |
| 179 void SkShadowPaintFilterCanvas::onDrawImageNine(const SkImage *image, const SkIR ect ¢er, | 195 void SkShadowPaintFilterCanvas::onDrawImageNine(const SkImage *image, const SkIR ect ¢er, |
| 180 const SkRect &dst, const SkPaint *paint) { | 196 const SkRect &dst, const SkPaint *paint) { |
| 181 this->updateMatrix(); | 197 this->updateMatrix(dst); |
| 182 this->INHERITED::onDrawImageNine(image, center, dst, paint); | 198 this->INHERITED::onDrawImageNine(image, center, dst, paint); |
| 183 this->restore(); | 199 this->restore(); |
| 184 } | 200 } |
| 185 | 201 |
| 186 | 202 |
| 187 void SkShadowPaintFilterCanvas::onDrawVertices(VertexMode vmode, int vertexCount , | 203 void SkShadowPaintFilterCanvas::onDrawVertices(VertexMode vmode, int vertexCount , |
| 188 const SkPoint vertices[], const S kPoint texs[], | 204 const SkPoint vertices[], const S kPoint texs[], |
| 189 const SkColor colors[], SkXfermod e *xmode, | 205 const SkColor colors[], SkXfermod e *xmode, |
| 190 const uint16_t indices[], int ind exCount, | 206 const uint16_t indices[], int ind exCount, |
| 191 const SkPaint &paint) { | 207 const SkPaint &paint) { |
| 192 this->updateMatrix(); | 208 SkISize size = this->getBaseLayerSize(); |
| 209 this->updateMatrix(SkRect::MakeIWH(size.fWidth, size.fHeight)); | |
| 193 this->INHERITED::onDrawVertices(vmode, vertexCount, vertices, texs, colors, | 210 this->INHERITED::onDrawVertices(vmode, vertexCount, vertices, texs, colors, |
| 194 xmode, indices, indexCount, paint); | 211 xmode, indices, indexCount, paint); |
| 195 this->restore(); | 212 this->restore(); |
| 196 } | 213 } |
| 197 | 214 |
| 198 void SkShadowPaintFilterCanvas::onDrawPatch(const SkPoint cubics[], const SkColo r colors[], | 215 void SkShadowPaintFilterCanvas::onDrawPatch(const SkPoint cubics[], const SkColo r colors[], |
| 199 const SkPoint texCoords[], SkXfermod e *xmode, | 216 const SkPoint texCoords[], SkXfermod e *xmode, |
| 200 const SkPaint &paint) { | 217 const SkPaint &paint) { |
| 201 this->updateMatrix(); | 218 SkISize size = this->getBaseLayerSize(); |
| 219 this->updateMatrix(SkRect::MakeIWH(size.fWidth, size.fHeight)); | |
| 202 this->INHERITED::onDrawPatch(cubics, colors, texCoords, xmode, paint); | 220 this->INHERITED::onDrawPatch(cubics, colors, texCoords, xmode, paint); |
| 203 this->restore(); | 221 this->restore(); |
| 204 } | 222 } |
| 205 | 223 |
| 206 void SkShadowPaintFilterCanvas::onDrawText(const void *text, size_t byteLength, SkScalar x, | 224 void SkShadowPaintFilterCanvas::onDrawText(const void *text, size_t byteLength, SkScalar x, |
| 207 SkScalar y, const SkPaint &paint) { | 225 SkScalar y, const SkPaint &paint) { |
| 208 this->updateMatrix(); | 226 this->updateMatrix(paint.getFontBounds().makeOffset(x, y)); |
| 209 this->INHERITED::onDrawText(text, byteLength, x, y, paint); | 227 this->INHERITED::onDrawText(text, byteLength, x, y, paint); |
| 210 this->restore(); | 228 this->restore(); |
| 211 } | 229 } |
| 212 | 230 |
| 213 void SkShadowPaintFilterCanvas::onDrawPosText(const void *text, size_t byteLengt h, | 231 void SkShadowPaintFilterCanvas::onDrawPosText(const void *text, size_t byteLengt h, |
| 214 const SkPoint pos[], const SkPaint &paint) { | 232 const SkPoint pos[], const SkPaint &paint) { |
| 215 this->updateMatrix(); | 233 SkISize size = this->getBaseLayerSize(); |
| 234 this->updateMatrix(SkRect::MakeIWH(size.fWidth, size.fHeight)); | |
| 216 this->INHERITED::onDrawPosText(text, byteLength, pos, paint); | 235 this->INHERITED::onDrawPosText(text, byteLength, pos, paint); |
| 217 this->restore(); | 236 this->restore(); |
| 218 } | 237 } |
| 219 | 238 |
| 220 void SkShadowPaintFilterCanvas::onDrawPosTextH(const void *text, size_t byteLeng th, | 239 void SkShadowPaintFilterCanvas::onDrawPosTextH(const void *text, size_t byteLeng th, |
| 221 const SkScalar xpos[], | 240 const SkScalar xpos[], |
| 222 SkScalar constY, const SkPaint &p aint) { | 241 SkScalar constY, const SkPaint &p aint) { |
| 223 this->updateMatrix(); | 242 SkISize size = this->getBaseLayerSize(); |
| 243 this->updateMatrix(SkRect::MakeIWH(size.fWidth, size.fHeight)); | |
| 224 this->INHERITED::onDrawPosTextH(text, byteLength, xpos, constY, paint); | 244 this->INHERITED::onDrawPosTextH(text, byteLength, xpos, constY, paint); |
| 225 this->restore(); | 245 this->restore(); |
| 226 } | 246 } |
| 227 | 247 |
| 228 void SkShadowPaintFilterCanvas::onDrawTextOnPath(const void *text, size_t byteLe ngth, | 248 void SkShadowPaintFilterCanvas::onDrawTextOnPath(const void *text, size_t byteLe ngth, |
| 229 const SkPath &path, const SkMat rix *matrix, | 249 const SkPath &path, const SkMat rix *matrix, |
| 230 const SkPaint &paint) { | 250 const SkPaint &paint) { |
| 231 this->updateMatrix(); | 251 this->updateMatrix(path.getBounds()); |
| 232 this->INHERITED::onDrawTextOnPath(text, byteLength, path, matrix, paint); | 252 this->INHERITED::onDrawTextOnPath(text, byteLength, path, matrix, paint); |
| 233 this->restore(); | 253 this->restore(); |
| 234 } | 254 } |
| 235 | 255 |
| 236 void SkShadowPaintFilterCanvas::onDrawTextRSXform(const void *text, size_t byteL ength, | 256 void SkShadowPaintFilterCanvas::onDrawTextRSXform(const void *text, size_t byteL ength, |
| 237 const SkRSXform xform[], const SkRect *cull, | 257 const SkRSXform xform[], const SkRect *cull, |
| 238 const SkPaint &paint) { | 258 const SkPaint &paint) { |
|
robertphillips
2016/08/31 22:18:19
Isn't the cull parameter optional?
vjiaoblack
2016/09/01 19:22:47
Done.
| |
| 239 this->updateMatrix(); | 259 this->updateMatrix(*cull); |
| 240 this->INHERITED::onDrawTextRSXform(text, byteLength, xform, cull, paint); | 260 this->INHERITED::onDrawTextRSXform(text, byteLength, xform, cull, paint); |
| 241 this->restore(); | 261 this->restore(); |
| 242 } | 262 } |
| 243 | 263 |
| 244 void SkShadowPaintFilterCanvas::onDrawTextBlob(const SkTextBlob *blob, SkScalar x, SkScalar y, | 264 void SkShadowPaintFilterCanvas::onDrawTextBlob(const SkTextBlob *blob, SkScalar x, SkScalar y, |
| 245 const SkPaint &paint) { | 265 const SkPaint &paint) { |
| 246 this->updateMatrix(); | 266 SkISize size = this->getBaseLayerSize(); |
| 267 this->updateMatrix(SkRect::MakeIWH(size.fWidth, size.fHeight)); | |
| 247 this->INHERITED::onDrawTextBlob(blob, x, y, paint); | 268 this->INHERITED::onDrawTextBlob(blob, x, y, paint); |
| 248 this->restore(); | 269 this->restore(); |
| 249 } | 270 } |
| 250 | 271 |
| 251 #endif | 272 #endif |
| OLD | NEW |