| 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 |