Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: src/pipe/SkPipeReader.cpp

Issue 2335973003: change write-image to use pipeverbs like everyone else, and add test (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 671 matching lines...) Expand 10 before | Expand all | Expand 10 after
682 } 682 }
683 683
684 static sk_sp<SkImage> make_from_encoded(const sk_sp<SkData>& data) { 684 static sk_sp<SkImage> make_from_encoded(const sk_sp<SkData>& data) {
685 sk_sp<SkImage> image = make_from_skiaimageformat(data->data(), data->size()) ; 685 sk_sp<SkImage> image = make_from_skiaimageformat(data->data(), data->size()) ;
686 if (!image) { 686 if (!image) {
687 image = SkImage::MakeFromEncoded(data); 687 image = SkImage::MakeFromEncoded(data);
688 } 688 }
689 return image; 689 return image;
690 } 690 }
691 691
692 static void defineImage_handler(SkPipeReader& reader, uint32_t packedVerb, SkCan vas* canvas) { 692 static void defineImage_handler(SkPipeReader& reader, uint32_t packedVerb, SkCan vas*) {
693 SkASSERT(SkPipeVerb::kDefineImage == unpack_verb(packedVerb)); 693 SkASSERT(SkPipeVerb::kDefineImage == unpack_verb(packedVerb));
694 SkPipeInflator* inflator = (SkPipeInflator*)reader.getInflator(); 694 SkPipeInflator* inflator = (SkPipeInflator*)reader.getInflator();
695 uint32_t extra = unpack_verb_extra(packedVerb); 695 uint32_t extra = unpack_verb_extra(packedVerb);
696 int index = extra & kIndex_ObjectDefinitionMask; 696 int index = extra & kIndex_ObjectDefinitionMask;
697 697
698 if (extra & kUndef_ObjectDefinitionMask) { 698 if (extra & kUndef_ObjectDefinitionMask) {
699 // zero-index means we are "forgetting" that cache entry 699 // zero-index means we are "forgetting" that cache entry
700 inflator->setImage(index, nullptr); 700 inflator->setImage(index, nullptr);
701 } else { 701 } else {
702 // we are defining a new image 702 // we are defining a new image
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
860 memcpy(&cull, data, sizeof(SkRect)); 860 memcpy(&cull, data, sizeof(SkRect));
861 size -= sizeof(SkRect); data = (const char*)data + sizeof(SkRect); 861 size -= sizeof(SkRect); data = (const char*)data + sizeof(SkRect);
862 862
863 SkPictureRecorder recorder; 863 SkPictureRecorder recorder;
864 this->playback(data, size, recorder.beginRecording(cull)); 864 this->playback(data, size, recorder.beginRecording(cull));
865 return recorder.finishRecordingAsPicture(); 865 return recorder.finishRecordingAsPicture();
866 } 866 }
867 867
868 sk_sp<SkImage> SkPipeDeserializer::readImage(const void* data, size_t size) { 868 sk_sp<SkImage> SkPipeDeserializer::readImage(const void* data, size_t size) {
869 if (size < sizeof(uint32_t)) { 869 if (size < sizeof(uint32_t)) {
870 SkDebugf("-------- data length too short for readImage %d\n", size);
870 return nullptr; 871 return nullptr;
871 } 872 }
872 873
873 uint32_t header; 874 const uint32_t* ptr = (const uint32_t*)data;
874 memcpy(&header, data, 4); size -= 4; data = (const char*)data + 4; 875 uint32_t packedVerb = *ptr++;
875 if (kDefineImage_ExtPipeVerb != header) { 876 size -= 4;
876 return nullptr; 877
878 switch (unpack_verb(packedVerb)) {
879 case SkPipeVerb::kWriteImage:
880 break;
881 case SkPipeVerb::kDefineImage: {
882 SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures,
883 &fImpl->fTypefaces, &fImpl->fFactories,
884 fImpl->fTFDeserializer);
885 SkPipeReader reader(this, ptr, size);
886 reader.setInflator(&inflator);
887 defineImage_handler(reader, packedVerb, nullptr);
888 } break;
889 default:
890 SkDebugf("-------- unexpected verb for readImage %d\n", unpack_verb( packedVerb));
891 return nullptr;
877 } 892 }
878 893 int index = unpack_verb_extra(packedVerb);
879 SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures, 894 if (0 == index) {
880 &fImpl->fTypefaces, &fImpl->fFactories, 895 return nullptr; // writer failed
881 fImpl->fTFDeserializer); 896 }
882 SkPipeReader reader(this, data, size); 897 return sk_ref_sp(fImpl->fImages.get(index - 1));
883 reader.setInflator(&inflator);
884 return sk_sp<SkImage>(reader.readImage());
885 } 898 }
886 899
887 static bool do_playback(SkPipeReader& reader, SkCanvas* canvas, int* endPictureI ndex) { 900 static bool do_playback(SkPipeReader& reader, SkCanvas* canvas, int* endPictureI ndex) {
888 int indent = 0; 901 int indent = 0;
889 902
890 const bool showEachVerb = false; 903 const bool showEachVerb = true;
891 int counter = 0; 904 int counter = 0;
892 while (!reader.eof()) { 905 while (!reader.eof()) {
893 uint32_t prevOffset = reader.offset(); 906 uint32_t prevOffset = reader.offset();
894 uint32_t packedVerb = reader.read32(); 907 uint32_t packedVerb = reader.read32();
895 SkPipeVerb verb = unpack_verb(packedVerb); 908 SkPipeVerb verb = unpack_verb(packedVerb);
896 if ((unsigned)verb >= SK_ARRAY_COUNT(gPipeHandlers)) { 909 if ((unsigned)verb >= SK_ARRAY_COUNT(gPipeHandlers)) {
897 SkDebugf("------- bad verb %d\n", verb); 910 SkDebugf("------- bad verb %d\n", verb);
898 return false; 911 return false;
899 } 912 }
900 if (SkPipeVerb::kRestore == verb) { 913 if (SkPipeVerb::kRestore == verb) {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
935 948
936 bool SkPipeDeserializer::playback(const void* data, size_t size, SkCanvas* canva s) { 949 bool SkPipeDeserializer::playback(const void* data, size_t size, SkCanvas* canva s) {
937 SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures, 950 SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures,
938 &fImpl->fTypefaces, &fImpl->fFactories, 951 &fImpl->fTypefaces, &fImpl->fFactories,
939 fImpl->fTFDeserializer); 952 fImpl->fTFDeserializer);
940 SkPipeReader reader(this, data, size); 953 SkPipeReader reader(this, data, size);
941 reader.setInflator(&inflator); 954 reader.setInflator(&inflator);
942 return do_playback(reader, canvas); 955 return do_playback(reader, canvas);
943 } 956 }
944 957
OLDNEW
« src/pipe/SkPipeCanvas.cpp ('K') | « src/pipe/SkPipeFormat.h ('k') | tests/PipeTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698