| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 #include <new> | 7 #include <new> |
| 8 #include "SkBBoxHierarchy.h" | 8 #include "SkBBoxHierarchy.h" |
| 9 #include "SkOffsetTable.h" | 9 #include "SkOffsetTable.h" |
| 10 #include "SkPicturePlayback.h" | 10 #include "SkPicturePlayback.h" |
| (...skipping 843 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 854 ~SkAutoResetOpID() { | 854 ~SkAutoResetOpID() { |
| 855 if (NULL != fPlayback) { | 855 if (NULL != fPlayback) { |
| 856 fPlayback->resetOpID(); | 856 fPlayback->resetOpID(); |
| 857 } | 857 } |
| 858 } | 858 } |
| 859 | 859 |
| 860 private: | 860 private: |
| 861 SkPicturePlayback* fPlayback; | 861 SkPicturePlayback* fPlayback; |
| 862 }; | 862 }; |
| 863 | 863 |
| 864 void SkPicturePlayback::draw(SkCanvas& canvas, SkDrawPictureCallback* callback)
{ | 864 SkPicturePlayback::Foo* SkPicturePlayback::Bar::lookupStart(size_t start) { |
| 865 for (int i = 0; i < fFoo.count(); ++i) { |
| 866 if (start == fFoo[i].fStart) { |
| 867 return &fFoo[i]; |
| 868 } |
| 869 } |
| 870 |
| 871 return NULL; |
| 872 } |
| 873 |
| 874 SkPicturePlayback::Foo* SkPicturePlayback::Bar::lookupStop(size_t stop) { |
| 875 for (int i = 0; i < fFoo.count(); ++i) { |
| 876 if (stop == fFoo[i].fStop) { |
| 877 return &fFoo[i]; |
| 878 } |
| 879 } |
| 880 |
| 881 return NULL; |
| 882 } |
| 883 |
| 884 void SkPicturePlayback::draw(SkCanvas& canvas, |
| 885 int start, int stop, |
| 886 SkDrawPictureCallback* callback, |
| 887 Bar* foo) { |
| 865 SkAutoResetOpID aroi(this); | 888 SkAutoResetOpID aroi(this); |
| 866 SkASSERT(0 == fCurOffset); | 889 SkASSERT(0 == fCurOffset); |
| 867 | 890 |
| 868 #ifdef ENABLE_TIME_DRAW | 891 #ifdef ENABLE_TIME_DRAW |
| 869 SkAutoTime at("SkPicture::draw", 50); | 892 SkAutoTime at("SkPicture::draw", 50); |
| 870 #endif | 893 #endif |
| 871 | 894 |
| 872 #ifdef SPEW_CLIP_SKIPPING | 895 #ifdef SPEW_CLIP_SKIPPING |
| 873 SkipClipRec skipRect, skipRRect, skipRegion, skipPath, skipCull; | 896 SkipClipRec skipRect, skipRRect, skipRegion, skipPath, skipCull; |
| 874 int opCount = 0; | 897 int opCount = 0; |
| 875 #endif | 898 #endif |
| 876 | 899 |
| 877 #ifdef SK_BUILD_FOR_ANDROID | 900 #ifdef SK_BUILD_FOR_ANDROID |
| 878 SkAutoMutexAcquire autoMutex(fDrawMutex); | 901 SkAutoMutexAcquire autoMutex(fDrawMutex); |
| 879 #endif | 902 #endif |
| 880 | 903 |
| 881 // kDrawComplete will be the signal that we have reached the end of | 904 // kDrawComplete will be the signal that we have reached the end of |
| 882 // the command stream | 905 // the command stream |
| 883 static const uint32_t kDrawComplete = SK_MaxU32; | 906 static const uint32_t kDrawComplete = SK_MaxU32; |
| 884 | 907 |
| 885 SkReader32 reader(fOpData->bytes(), fOpData->size()); | 908 SkReader32 reader(fOpData->bytes(), fOpData->size()); |
| 886 TextContainer text; | 909 TextContainer text; |
| 887 const SkTDArray<void*>* activeOps = NULL; | 910 const SkTDArray<void*>* activeOps = NULL; |
| 888 | 911 |
| 889 if (NULL != fStateTree && NULL != fBoundingHierarchy) { | 912 if (start == -1 ) { |
| 890 SkRect clipBounds; | 913 if (NULL != fStateTree && NULL != fBoundingHierarchy) { |
| 891 if (canvas.getClipBounds(&clipBounds)) { | 914 SkRect clipBounds; |
| 892 SkIRect query; | 915 if (canvas.getClipBounds(&clipBounds)) { |
| 893 clipBounds.roundOut(&query); | 916 SkIRect query; |
| 917 clipBounds.roundOut(&query); |
| 894 | 918 |
| 895 const SkPicture::OperationList& activeOpsList = this->getActiveOps(q
uery); | 919 const SkPicture::OperationList& activeOpsList = this->getActiveO
ps(query); |
| 896 if (activeOpsList.valid()) { | 920 if (activeOpsList.valid()) { |
| 897 if (0 == activeOpsList.numOps()) { | 921 if (0 == activeOpsList.numOps()) { |
| 898 return; // nothing to draw | 922 return; // nothing to draw |
| 923 } |
| 924 |
| 925 // Since the opList is valid we know it is our derived class |
| 926 activeOps = &((const CachedOperationList&)activeOpsList).fOp
s; |
| 899 } | 927 } |
| 900 | |
| 901 // Since the opList is valid we know it is our derived class | |
| 902 activeOps = &((const CachedOperationList&)activeOpsList).fOps; | |
| 903 } | 928 } |
| 904 } | 929 } |
| 905 } | 930 } |
| 906 | 931 |
| 907 SkPictureStateTree::Iterator it = (NULL == activeOps) ? | 932 SkPictureStateTree::Iterator it = (NULL == activeOps) ? |
| 908 SkPictureStateTree::Iterator() : | 933 SkPictureStateTree::Iterator() : |
| 909 fStateTree->getIterator(*activeOps, &canvas); | 934 fStateTree->getIterator(*activeOps, &canvas); |
| 910 | 935 |
| 936 if (start != -1) { |
| 937 reader.setOffset(start); |
| 938 uint32_t size; |
| 939 SkDEBUGCODE(DrawType op =) read_op_and_size(&reader, &size); |
| 940 SkASSERT(SAVE_LAYER == op); |
| 941 reader.setOffset(start+size); |
| 942 } |
| 943 |
| 911 if (it.isValid()) { | 944 if (it.isValid()) { |
| 912 uint32_t skipTo = it.draw(); | 945 uint32_t skipTo = it.draw(); |
| 913 if (kDrawComplete == skipTo) { | 946 if (kDrawComplete == skipTo) { |
| 914 return; | 947 return; |
| 915 } | 948 } |
| 916 reader.setOffset(skipTo); | 949 reader.setOffset(skipTo); |
| 917 } | 950 } |
| 918 | 951 |
| 919 this->preLoadBitmaps(activeOps); | 952 this->preLoadBitmaps(activeOps); |
| 920 | 953 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 933 while (!reader.eof()) { | 966 while (!reader.eof()) { |
| 934 if (callback && callback->abortDrawing()) { | 967 if (callback && callback->abortDrawing()) { |
| 935 canvas.restoreToCount(originalSaveCount); | 968 canvas.restoreToCount(originalSaveCount); |
| 936 return; | 969 return; |
| 937 } | 970 } |
| 938 #ifdef SK_BUILD_FOR_ANDROID | 971 #ifdef SK_BUILD_FOR_ANDROID |
| 939 if (fAbortCurrentPlayback) { | 972 if (fAbortCurrentPlayback) { |
| 940 return; | 973 return; |
| 941 } | 974 } |
| 942 #endif | 975 #endif |
| 976 if (stop != -1) { |
| 977 if (reader.offset() >= (unsigned int) stop) { |
| 978 uint32_t size; |
| 979 SkDEBUGCODE(DrawType op =) read_op_and_size(&reader, &size); |
| 980 SkASSERT(RESTORE == op); |
| 981 return; |
| 982 } |
| 983 } |
| 984 |
| 985 if (NULL != foo) { |
| 986 #if 0 |
| 987 // replace the saveLayer/restore block with a drawBitmap call |
| 988 SkPicturePlayback::Foo* temp = foo->lookupStart(reader.offset()); |
| 989 |
| 990 if (NULL != temp) { |
| 991 SkASSERT(NULL != temp->fBM); |
| 992 canvas.drawBitmap(*temp->fBM, temp->fPos.fX, temp->fPos.fY, temp
->fPaint); |
| 993 |
| 994 reader.setOffset(temp->fStop); |
| 995 uint32_t size; |
| 996 SkDEBUGCODE(DrawType op =) read_op_and_size(&reader, &size); |
| 997 SkASSERT(RESTORE == op); |
| 998 continue; |
| 999 } |
| 1000 #else |
| 1001 // execute the saveLayer/restore block but follow it with a drawBitm
ap call |
| 1002 // This is intended (with conversion of saveLayers to saves) to |
| 1003 // separate out the overhead of the saveLayer render target changes |
| 1004 // from all the other work |
| 1005 SkPicturePlayback::Foo* temp = foo->lookupStop(reader.offset()); |
| 1006 if (NULL != temp) { |
| 1007 SkASSERT(NULL != temp->fBM); |
| 1008 uint32_t size; |
| 1009 SkDEBUGCODE(DrawType op =) read_op_and_size(&reader, &size); |
| 1010 SkASSERT(RESTORE == op); |
| 1011 |
| 1012 canvas.restore(); |
| 1013 |
| 1014 canvas.drawBitmap(*temp->fBM, temp->fPos.fX, temp->fPos.fY, temp
->fPaint); |
| 1015 continue; |
| 1016 } |
| 1017 #endif |
| 1018 } |
| 943 | 1019 |
| 944 #ifdef SPEW_CLIP_SKIPPING | 1020 #ifdef SPEW_CLIP_SKIPPING |
| 945 opCount++; | 1021 opCount++; |
| 946 #endif | 1022 #endif |
| 947 | 1023 |
| 948 fCurOffset = reader.offset(); | 1024 fCurOffset = reader.offset(); |
| 949 uint32_t size; | 1025 uint32_t size; |
| 950 DrawType op = read_op_and_size(&reader, &size); | 1026 DrawType op = read_op_and_size(&reader, &size); |
| 951 size_t skipTo = 0; | 1027 size_t skipTo = 0; |
| 952 if (NOOP == op) { | 1028 if (NOOP == op) { |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1265 case RESTORE: | 1341 case RESTORE: |
| 1266 canvas.restore(); | 1342 canvas.restore(); |
| 1267 break; | 1343 break; |
| 1268 case ROTATE: | 1344 case ROTATE: |
| 1269 canvas.rotate(reader.readScalar()); | 1345 canvas.rotate(reader.readScalar()); |
| 1270 break; | 1346 break; |
| 1271 case SAVE: | 1347 case SAVE: |
| 1272 canvas.save((SkCanvas::SaveFlags) reader.readInt()); | 1348 canvas.save((SkCanvas::SaveFlags) reader.readInt()); |
| 1273 break; | 1349 break; |
| 1274 case SAVE_LAYER: { | 1350 case SAVE_LAYER: { |
| 1351 #if 1 |
| 1275 const SkRect* boundsPtr = this->getRectPtr(reader); | 1352 const SkRect* boundsPtr = this->getRectPtr(reader); |
| 1276 const SkPaint* paint = this->getPaint(reader); | 1353 const SkPaint* paint = this->getPaint(reader); |
| 1277 canvas.saveLayer(boundsPtr, paint, (SkCanvas::SaveFlags) reader.
readInt()); | 1354 canvas.saveLayer(boundsPtr, paint, (SkCanvas::SaveFlags) reader.
readInt()); |
| 1355 #else |
| 1356 // replace all saveLayers with a save |
| 1357 this->getRectPtr(reader); |
| 1358 this->getPaint(reader); |
| 1359 canvas.save((SkCanvas::SaveFlags) reader.readInt()); |
| 1360 #endif |
| 1278 } break; | 1361 } break; |
| 1279 case SCALE: { | 1362 case SCALE: { |
| 1280 SkScalar sx = reader.readScalar(); | 1363 SkScalar sx = reader.readScalar(); |
| 1281 SkScalar sy = reader.readScalar(); | 1364 SkScalar sy = reader.readScalar(); |
| 1282 canvas.scale(sx, sy); | 1365 canvas.scale(sx, sy); |
| 1283 } break; | 1366 } break; |
| 1284 case SET_MATRIX: { | 1367 case SET_MATRIX: { |
| 1285 SkMatrix matrix; | 1368 SkMatrix matrix; |
| 1286 this->getMatrix(reader, &matrix); | 1369 this->getMatrix(reader, &matrix); |
| 1287 matrix.postConcat(initialMatrix); | 1370 matrix.postConcat(initialMatrix); |
| (...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1831 for (index = 0; index < fPictureCount; index++) | 1914 for (index = 0; index < fPictureCount; index++) |
| 1832 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | 1915 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), |
| 1833 "picture%p, ", fPictureRefs[index]); | 1916 "picture%p, ", fPictureRefs[index]); |
| 1834 if (fPictureCount > 0) | 1917 if (fPictureCount > 0) |
| 1835 SkDebugf("%s0};\n", pBuffer); | 1918 SkDebugf("%s0};\n", pBuffer); |
| 1836 | 1919 |
| 1837 const_cast<SkPicturePlayback*>(this)->dumpStream(); | 1920 const_cast<SkPicturePlayback*>(this)->dumpStream(); |
| 1838 } | 1921 } |
| 1839 | 1922 |
| 1840 #endif | 1923 #endif |
| OLD | NEW |