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 "SkDrawCommand.h" | 8 #include "SkDrawCommand.h" |
9 | 9 |
10 #include "SkBlurMaskFilter.h" | 10 #include "SkBlurMaskFilter.h" |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 , fVisible(true) { | 173 , fVisible(true) { |
174 } | 174 } |
175 | 175 |
176 SkDrawCommand::~SkDrawCommand() { | 176 SkDrawCommand::~SkDrawCommand() { |
177 fInfo.deleteAll(); | 177 fInfo.deleteAll(); |
178 } | 178 } |
179 | 179 |
180 const char* SkDrawCommand::GetCommandString(OpType type) { | 180 const char* SkDrawCommand::GetCommandString(OpType type) { |
181 switch (type) { | 181 switch (type) { |
182 case kBeginDrawPicture_OpType: return "BeginDrawPicture"; | 182 case kBeginDrawPicture_OpType: return "BeginDrawPicture"; |
183 case kBeginDrawShadowedPicture_OpType: return "BeginDrawShadowedPicture"
; | |
184 case kClipPath_OpType: return "ClipPath"; | 183 case kClipPath_OpType: return "ClipPath"; |
185 case kClipRegion_OpType: return "ClipRegion"; | 184 case kClipRegion_OpType: return "ClipRegion"; |
186 case kClipRect_OpType: return "ClipRect"; | 185 case kClipRect_OpType: return "ClipRect"; |
187 case kClipRRect_OpType: return "ClipRRect"; | 186 case kClipRRect_OpType: return "ClipRRect"; |
188 case kConcat_OpType: return "Concat"; | 187 case kConcat_OpType: return "Concat"; |
189 case kDrawAnnotation_OpType: return "DrawAnnotation"; | 188 case kDrawAnnotation_OpType: return "DrawAnnotation"; |
190 case kDrawBitmap_OpType: return "DrawBitmap"; | 189 case kDrawBitmap_OpType: return "DrawBitmap"; |
191 case kDrawBitmapNine_OpType: return "DrawBitmapNine"; | 190 case kDrawBitmapNine_OpType: return "DrawBitmapNine"; |
192 case kDrawBitmapRect_OpType: return "DrawBitmapRect"; | 191 case kDrawBitmapRect_OpType: return "DrawBitmapRect"; |
193 case kDrawClear_OpType: return "DrawClear"; | 192 case kDrawClear_OpType: return "DrawClear"; |
194 case kDrawDRRect_OpType: return "DrawDRRect"; | 193 case kDrawDRRect_OpType: return "DrawDRRect"; |
195 case kDrawImage_OpType: return "DrawImage"; | 194 case kDrawImage_OpType: return "DrawImage"; |
196 case kDrawImageRect_OpType: return "DrawImageRect"; | 195 case kDrawImageRect_OpType: return "DrawImageRect"; |
197 case kDrawOval_OpType: return "DrawOval"; | 196 case kDrawOval_OpType: return "DrawOval"; |
198 case kDrawPaint_OpType: return "DrawPaint"; | 197 case kDrawPaint_OpType: return "DrawPaint"; |
199 case kDrawPatch_OpType: return "DrawPatch"; | 198 case kDrawPatch_OpType: return "DrawPatch"; |
200 case kDrawPath_OpType: return "DrawPath"; | 199 case kDrawPath_OpType: return "DrawPath"; |
201 case kDrawPoints_OpType: return "DrawPoints"; | 200 case kDrawPoints_OpType: return "DrawPoints"; |
202 case kDrawPosText_OpType: return "DrawPosText"; | 201 case kDrawPosText_OpType: return "DrawPosText"; |
203 case kDrawPosTextH_OpType: return "DrawPosTextH"; | 202 case kDrawPosTextH_OpType: return "DrawPosTextH"; |
204 case kDrawRect_OpType: return "DrawRect"; | 203 case kDrawRect_OpType: return "DrawRect"; |
205 case kDrawRRect_OpType: return "DrawRRect"; | 204 case kDrawRRect_OpType: return "DrawRRect"; |
206 case kDrawText_OpType: return "DrawText"; | 205 case kDrawText_OpType: return "DrawText"; |
207 case kDrawTextBlob_OpType: return "DrawTextBlob"; | 206 case kDrawTextBlob_OpType: return "DrawTextBlob"; |
208 case kDrawTextOnPath_OpType: return "DrawTextOnPath"; | 207 case kDrawTextOnPath_OpType: return "DrawTextOnPath"; |
209 case kDrawTextRSXform_OpType: return "DrawTextRSXform"; | 208 case kDrawTextRSXform_OpType: return "DrawTextRSXform"; |
210 case kDrawVertices_OpType: return "DrawVertices"; | 209 case kDrawVertices_OpType: return "DrawVertices"; |
211 case kEndDrawPicture_OpType: return "EndDrawPicture"; | 210 case kEndDrawPicture_OpType: return "EndDrawPicture"; |
212 case kEndDrawShadowedPicture_OpType: return "EndDrawShadowedPicture"; | |
213 case kRestore_OpType: return "Restore"; | 211 case kRestore_OpType: return "Restore"; |
214 case kSave_OpType: return "Save"; | 212 case kSave_OpType: return "Save"; |
215 case kSaveLayer_OpType: return "SaveLayer"; | 213 case kSaveLayer_OpType: return "SaveLayer"; |
216 case kSetMatrix_OpType: return "SetMatrix"; | 214 case kSetMatrix_OpType: return "SetMatrix"; |
217 case kTranslateZ_OpType: return "TranslateZ"; | 215 case kTranslateZ_OpType: return "TranslateZ"; |
218 default: | 216 default: |
219 SkDebugf("OpType error 0x%08x\n", type); | 217 SkDebugf("OpType error 0x%08x\n", type); |
220 SkASSERT(0); | 218 SkASSERT(0); |
221 break; | 219 break; |
222 } | 220 } |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 INSTALL_FACTORY(DrawTextRSXform); | 263 INSTALL_FACTORY(DrawTextRSXform); |
266 INSTALL_FACTORY(DrawTextBlob); | 264 INSTALL_FACTORY(DrawTextBlob); |
267 | 265 |
268 INSTALL_FACTORY(DrawRect); | 266 INSTALL_FACTORY(DrawRect); |
269 INSTALL_FACTORY(DrawRRect); | 267 INSTALL_FACTORY(DrawRRect); |
270 INSTALL_FACTORY(DrawDRRect); | 268 INSTALL_FACTORY(DrawDRRect); |
271 INSTALL_FACTORY(DrawPatch); | 269 INSTALL_FACTORY(DrawPatch); |
272 INSTALL_FACTORY(Save); | 270 INSTALL_FACTORY(Save); |
273 INSTALL_FACTORY(SaveLayer); | 271 INSTALL_FACTORY(SaveLayer); |
274 INSTALL_FACTORY(SetMatrix); | 272 INSTALL_FACTORY(SetMatrix); |
275 #ifdef SK_EXPERIMENTAL_SHADOWING | 273 |
276 INSTALL_FACTORY(TranslateZ); | 274 INSTALL_FACTORY(TranslateZ); |
277 #endif | |
278 } | 275 } |
279 SkString name = SkString(command[SKDEBUGCANVAS_ATTRIBUTE_COMMAND].asCString(
)); | 276 SkString name = SkString(command[SKDEBUGCANVAS_ATTRIBUTE_COMMAND].asCString(
)); |
280 FROM_JSON* factory = factories.find(name); | 277 FROM_JSON* factory = factories.find(name); |
281 if (factory == nullptr) { | 278 if (factory == nullptr) { |
282 SkDebugf("no JSON factory for '%s'\n", name.c_str()); | 279 SkDebugf("no JSON factory for '%s'\n", name.c_str()); |
283 return nullptr; | 280 return nullptr; |
284 } | 281 } |
285 return (*factory)(command, urlDataManager); | 282 return (*factory)(command, urlDataManager); |
286 } | 283 } |
287 | 284 |
(...skipping 1199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1487 | 1484 |
1488 static void extract_json_matrix(Json::Value& matrix, SkMatrix* result) { | 1485 static void extract_json_matrix(Json::Value& matrix, SkMatrix* result) { |
1489 SkScalar values[] = { | 1486 SkScalar values[] = { |
1490 matrix[0][0].asFloat(), matrix[0][1].asFloat(), matrix[0][2].asFloat(), | 1487 matrix[0][0].asFloat(), matrix[0][1].asFloat(), matrix[0][2].asFloat(), |
1491 matrix[1][0].asFloat(), matrix[1][1].asFloat(), matrix[1][2].asFloat(), | 1488 matrix[1][0].asFloat(), matrix[1][1].asFloat(), matrix[1][2].asFloat(), |
1492 matrix[2][0].asFloat(), matrix[2][1].asFloat(), matrix[2][2].asFloat() | 1489 matrix[2][0].asFloat(), matrix[2][1].asFloat(), matrix[2][2].asFloat() |
1493 }; | 1490 }; |
1494 result->set9(values); | 1491 result->set9(values); |
1495 } | 1492 } |
1496 | 1493 |
1497 #ifdef SK_EXPERIMENTAL_SHADOWING | |
1498 // somehow this is only used in shadows... | |
1499 static void extract_json_scalar(Json::Value& scalar, SkScalar* result) { | 1494 static void extract_json_scalar(Json::Value& scalar, SkScalar* result) { |
1500 SkScalar value = scalar.asFloat(); | 1495 SkScalar value = scalar.asFloat(); |
1501 *result = value; | 1496 *result = value; |
1502 } | 1497 } |
1503 #endif | |
1504 | 1498 |
1505 static void extract_json_path(Json::Value& path, SkPath* result) { | 1499 static void extract_json_path(Json::Value& path, SkPath* result) { |
1506 const char* fillType = path[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE].asCString(); | 1500 const char* fillType = path[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE].asCString(); |
1507 if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_WINDING)) { | 1501 if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_WINDING)) { |
1508 result->setFillType(SkPath::kWinding_FillType); | 1502 result->setFillType(SkPath::kWinding_FillType); |
1509 } | 1503 } |
1510 else if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_EVENODD)) { | 1504 else if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_EVENODD)) { |
1511 result->setFillType(SkPath::kEvenOdd_FillType); | 1505 result->setFillType(SkPath::kEvenOdd_FillType); |
1512 } | 1506 } |
1513 else if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING)) { | 1507 else if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING)) { |
(...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2380 | 2374 |
2381 SkEndDrawPictureCommand::SkEndDrawPictureCommand(bool restore) | 2375 SkEndDrawPictureCommand::SkEndDrawPictureCommand(bool restore) |
2382 : INHERITED(kEndDrawPicture_OpType) , fRestore(restore) { } | 2376 : INHERITED(kEndDrawPicture_OpType) , fRestore(restore) { } |
2383 | 2377 |
2384 void SkEndDrawPictureCommand::execute(SkCanvas* canvas) const { | 2378 void SkEndDrawPictureCommand::execute(SkCanvas* canvas) const { |
2385 if (fRestore) { | 2379 if (fRestore) { |
2386 canvas->restore(); | 2380 canvas->restore(); |
2387 } | 2381 } |
2388 } | 2382 } |
2389 | 2383 |
2390 SkBeginDrawShadowedPictureCommand::SkBeginDrawShadowedPictureCommand(const SkPic
ture* picture, | |
2391 const SkMat
rix* matrix, | |
2392 const SkPai
nt* paint) | |
2393 : INHERITED(kBeginDrawShadowedPicture_OpType) | |
2394 , fPicture(SkRef(picture)) { | |
2395 | |
2396 SkString* str = new SkString; | |
2397 str->appendf("SkPicture: L: %f T: %f R: %f B: %f", | |
2398 picture->cullRect().fLeft, picture->cullRect().fTop, | |
2399 picture->cullRect().fRight, picture->cullRect().fBottom); | |
2400 fInfo.push(str); | |
2401 | |
2402 if (matrix) { | |
2403 fMatrix.set(*matrix); | |
2404 fInfo.push(SkObjectParser::MatrixToString(*matrix)); | |
2405 } | |
2406 | |
2407 if (paint) { | |
2408 fPaint.set(*paint); | |
2409 fInfo.push(SkObjectParser::PaintToString(*paint)); | |
2410 } | |
2411 } | |
2412 | |
2413 void SkBeginDrawShadowedPictureCommand::execute(SkCanvas* canvas) const { | |
2414 if (fPaint.isValid()) { | |
2415 SkRect bounds = fPicture->cullRect(); | |
2416 if (fMatrix.isValid()) { | |
2417 fMatrix.get()->mapRect(&bounds); | |
2418 } | |
2419 canvas->saveLayer(&bounds, fPaint.get()); | |
2420 } | |
2421 | |
2422 if (fMatrix.isValid()) { | |
2423 if (!fPaint.isValid()) { | |
2424 canvas->save(); | |
2425 } | |
2426 canvas->concat(*fMatrix.get()); | |
2427 } | |
2428 } | |
2429 | |
2430 bool SkBeginDrawShadowedPictureCommand::render(SkCanvas* canvas) const { | |
2431 canvas->clear(0xFFFFFFFF); | |
2432 canvas->save(); | |
2433 | |
2434 xlate_and_scale_to_bounds(canvas, fPicture->cullRect()); | |
2435 | |
2436 canvas->drawPicture(fPicture.get()); | |
2437 | |
2438 canvas->restore(); | |
2439 | |
2440 return true; | |
2441 } | |
2442 | |
2443 SkEndDrawShadowedPictureCommand::SkEndDrawShadowedPictureCommand(bool restore) | |
2444 : INHERITED(kEndDrawShadowedPicture_OpType) , fRestore(restore) { } | |
2445 | |
2446 void SkEndDrawShadowedPictureCommand::execute(SkCanvas* canvas) const { | |
2447 if (fRestore) { | |
2448 canvas->restore(); | |
2449 } | |
2450 } | |
2451 | |
2452 SkDrawPointsCommand::SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count, | 2384 SkDrawPointsCommand::SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count, |
2453 const SkPoint pts[], const SkPaint& pai
nt) | 2385 const SkPoint pts[], const SkPaint& pai
nt) |
2454 : INHERITED(kDrawPoints_OpType) { | 2386 : INHERITED(kDrawPoints_OpType) { |
2455 fMode = mode; | 2387 fMode = mode; |
2456 fCount = count; | 2388 fCount = count; |
2457 fPts = new SkPoint[count]; | 2389 fPts = new SkPoint[count]; |
2458 memcpy(fPts, pts, count * sizeof(SkPoint)); | 2390 memcpy(fPts, pts, count * sizeof(SkPoint)); |
2459 fPaint = paint; | 2391 fPaint = paint; |
2460 | 2392 |
2461 fInfo.push(SkObjectParser::PointsToString(pts, count)); | 2393 fInfo.push(SkObjectParser::PointsToString(pts, count)); |
(...skipping 916 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3378 return new SkSetMatrixCommand(matrix); | 3310 return new SkSetMatrixCommand(matrix); |
3379 } | 3311 } |
3380 | 3312 |
3381 SkTranslateZCommand::SkTranslateZCommand(SkScalar z) | 3313 SkTranslateZCommand::SkTranslateZCommand(SkScalar z) |
3382 : INHERITED(kTranslateZ_OpType) { | 3314 : INHERITED(kTranslateZ_OpType) { |
3383 fZTranslate = z; | 3315 fZTranslate = z; |
3384 fInfo.push(SkObjectParser::ScalarToString(fZTranslate, "drawDepthTranslation
")); | 3316 fInfo.push(SkObjectParser::ScalarToString(fZTranslate, "drawDepthTranslation
")); |
3385 } | 3317 } |
3386 | 3318 |
3387 void SkTranslateZCommand::execute(SkCanvas* canvas) const { | 3319 void SkTranslateZCommand::execute(SkCanvas* canvas) const { |
3388 #ifdef SK_EXPERIMENTAL_SHADOWING | |
3389 canvas->translateZ(fZTranslate); | 3320 canvas->translateZ(fZTranslate); |
3390 #endif | |
3391 } | 3321 } |
3392 | 3322 |
3393 Json::Value SkTranslateZCommand::toJSON(UrlDataManager& urlDataManager) const { | 3323 Json::Value SkTranslateZCommand::toJSON(UrlDataManager& urlDataManager) const { |
3394 Json::Value result = INHERITED::toJSON(urlDataManager); | 3324 Json::Value result = INHERITED::toJSON(urlDataManager); |
3395 result[SKDEBUGCANVAS_ATTRIBUTE_DRAWDEPTHTRANS] = MakeJsonScalar(fZTranslate)
; | 3325 result[SKDEBUGCANVAS_ATTRIBUTE_DRAWDEPTHTRANS] = MakeJsonScalar(fZTranslate)
; |
3396 return result; | 3326 return result; |
3397 } | 3327 } |
3398 | 3328 |
3399 SkTranslateZCommand* SkTranslateZCommand::fromJSON(Json::Value& command, | 3329 SkTranslateZCommand* SkTranslateZCommand::fromJSON(Json::Value& command, |
3400 UrlDataManager& urlDataManager) { | 3330 UrlDataManager& urlDataManager) { |
3401 SkScalar z; | 3331 SkScalar z; |
3402 #ifdef SK_EXPERIMENTAL_SHADOWING | |
3403 extract_json_scalar(command[SKDEBUGCANVAS_ATTRIBUTE_DRAWDEPTHTRANS], &z); | 3332 extract_json_scalar(command[SKDEBUGCANVAS_ATTRIBUTE_DRAWDEPTHTRANS], &z); |
3404 #else | |
3405 z = 0; | |
3406 #endif | |
3407 return new SkTranslateZCommand(z); | 3333 return new SkTranslateZCommand(z); |
3408 } | 3334 } |
OLD | NEW |