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 "SkCanvas.h" | 8 #include "SkCanvas.h" |
9 #include "SkDeduper.h" | 9 #include "SkDeduper.h" |
10 #include "SkPicture.h" | 10 #include "SkPicture.h" |
(...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
839 SkTypefaceDeserializer* fTFDeserializer = nullptr; | 839 SkTypefaceDeserializer* fTFDeserializer = nullptr; |
840 }; | 840 }; |
841 | 841 |
842 SkPipeDeserializer::SkPipeDeserializer() : fImpl(new Impl) {} | 842 SkPipeDeserializer::SkPipeDeserializer() : fImpl(new Impl) {} |
843 SkPipeDeserializer::~SkPipeDeserializer() {} | 843 SkPipeDeserializer::~SkPipeDeserializer() {} |
844 | 844 |
845 void SkPipeDeserializer::setTypefaceDeserializer(SkTypefaceDeserializer* tfd) { | 845 void SkPipeDeserializer::setTypefaceDeserializer(SkTypefaceDeserializer* tfd) { |
846 fImpl->fTFDeserializer = tfd; | 846 fImpl->fTFDeserializer = tfd; |
847 } | 847 } |
848 | 848 |
849 sk_sp<SkPicture> SkPipeDeserializer::readPicture(const void* data, size_t size)
{ | |
850 if (size < sizeof(uint32_t) + sizeof(SkRect)) { | |
851 return nullptr; | |
852 } | |
853 | |
854 uint32_t header; | |
855 memcpy(&header, data, 4); size -= 4; data = (const char*)data + 4; | |
856 if (kDefinePicture_ExtPipeVerb != header) { | |
857 return nullptr; | |
858 } | |
859 SkRect cull; | |
860 memcpy(&cull, data, sizeof(SkRect)); | |
861 size -= sizeof(SkRect); data = (const char*)data + sizeof(SkRect); | |
862 | |
863 SkPictureRecorder recorder; | |
864 this->playback(data, size, recorder.beginRecording(cull)); | |
865 return recorder.finishRecordingAsPicture(); | |
866 } | |
867 | |
868 sk_sp<SkImage> SkPipeDeserializer::readImage(const void* data, size_t size) { | 849 sk_sp<SkImage> SkPipeDeserializer::readImage(const void* data, size_t size) { |
869 if (size < sizeof(uint32_t)) { | 850 if (size < sizeof(uint32_t)) { |
870 SkDebugf("-------- data length too short for readImage %d\n", size); | 851 SkDebugf("-------- data length too short for readImage %d\n", size); |
871 return nullptr; | 852 return nullptr; |
872 } | 853 } |
873 | 854 |
874 const uint32_t* ptr = (const uint32_t*)data; | 855 const uint32_t* ptr = (const uint32_t*)data; |
875 uint32_t packedVerb = *ptr++; | 856 uint32_t packedVerb = *ptr++; |
876 size -= 4; | 857 size -= 4; |
877 | 858 |
(...skipping 10 matching lines...) Expand all Loading... |
888 SkDebugf("-------- unexpected verb for readImage %d\n", unpack_verb(pack
edVerb)); | 869 SkDebugf("-------- unexpected verb for readImage %d\n", unpack_verb(pack
edVerb)); |
889 return nullptr; | 870 return nullptr; |
890 } | 871 } |
891 int index = unpack_verb_extra(packedVerb); | 872 int index = unpack_verb_extra(packedVerb); |
892 if (0 == index) { | 873 if (0 == index) { |
893 return nullptr; // writer failed | 874 return nullptr; // writer failed |
894 } | 875 } |
895 return sk_ref_sp(fImpl->fImages.get(index - 1)); | 876 return sk_ref_sp(fImpl->fImages.get(index - 1)); |
896 } | 877 } |
897 | 878 |
| 879 sk_sp<SkPicture> SkPipeDeserializer::readPicture(const void* data, size_t size)
{ |
| 880 if (size < sizeof(uint32_t)) { |
| 881 SkDebugf("-------- data length too short for readPicture %d\n", size); |
| 882 return nullptr; |
| 883 } |
| 884 |
| 885 const uint32_t* ptr = (const uint32_t*)data; |
| 886 uint32_t packedVerb = *ptr++; |
| 887 size -= 4; |
| 888 |
| 889 if (SkPipeVerb::kDefinePicture == unpack_verb(packedVerb)) { |
| 890 SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures, |
| 891 &fImpl->fTypefaces, &fImpl->fFactories, |
| 892 fImpl->fTFDeserializer); |
| 893 SkPipeReader reader(this, ptr, size); |
| 894 reader.setInflator(&inflator); |
| 895 definePicture_handler(reader, packedVerb, nullptr); |
| 896 packedVerb = reader.read32(); // read the next verb |
| 897 } |
| 898 if (SkPipeVerb::kWritePicture != unpack_verb(packedVerb)) { |
| 899 SkDebugf("-------- unexpected verb for readPicture %d\n", unpack_verb(pa
ckedVerb)); |
| 900 return nullptr; |
| 901 } |
| 902 int index = unpack_verb_extra(packedVerb); |
| 903 if (0 == index) { |
| 904 return nullptr; // writer failed |
| 905 } |
| 906 return sk_ref_sp(fImpl->fPictures.get(index - 1)); |
| 907 } |
| 908 |
898 static bool do_playback(SkPipeReader& reader, SkCanvas* canvas, int* endPictureI
ndex) { | 909 static bool do_playback(SkPipeReader& reader, SkCanvas* canvas, int* endPictureI
ndex) { |
899 int indent = 0; | 910 int indent = 0; |
900 | 911 |
901 const bool showEachVerb = false; | 912 const bool showEachVerb = false; |
902 int counter = 0; | 913 int counter = 0; |
903 while (!reader.eof()) { | 914 while (!reader.eof()) { |
904 uint32_t prevOffset = reader.offset(); | 915 uint32_t prevOffset = reader.offset(); |
905 uint32_t packedVerb = reader.read32(); | 916 uint32_t packedVerb = reader.read32(); |
906 SkPipeVerb verb = unpack_verb(packedVerb); | 917 SkPipeVerb verb = unpack_verb(packedVerb); |
907 if ((unsigned)verb >= SK_ARRAY_COUNT(gPipeHandlers)) { | 918 if ((unsigned)verb >= SK_ARRAY_COUNT(gPipeHandlers)) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
946 | 957 |
947 bool SkPipeDeserializer::playback(const void* data, size_t size, SkCanvas* canva
s) { | 958 bool SkPipeDeserializer::playback(const void* data, size_t size, SkCanvas* canva
s) { |
948 SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures, | 959 SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures, |
949 &fImpl->fTypefaces, &fImpl->fFactories, | 960 &fImpl->fTypefaces, &fImpl->fFactories, |
950 fImpl->fTFDeserializer); | 961 fImpl->fTFDeserializer); |
951 SkPipeReader reader(this, data, size); | 962 SkPipeReader reader(this, data, size); |
952 reader.setInflator(&inflator); | 963 reader.setInflator(&inflator); |
953 return do_playback(reader, canvas); | 964 return do_playback(reader, canvas); |
954 } | 965 } |
955 | 966 |
OLD | NEW |