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

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: switch to [define_image] write_image 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
« no previous file with comments | « src/pipe/SkPipeFormat.h ('k') | tests/PipeTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
877
878 if (SkPipeVerb::kDefineImage == unpack_verb(packedVerb)) {
879 SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures,
880 &fImpl->fTypefaces, &fImpl->fFactories,
881 fImpl->fTFDeserializer);
882 SkPipeReader reader(this, ptr, size);
883 reader.setInflator(&inflator);
884 defineImage_handler(reader, packedVerb, nullptr);
885 packedVerb = reader.read32(); // read the next verb
886 }
887 if (SkPipeVerb::kWriteImage != unpack_verb(packedVerb)) {
888 SkDebugf("-------- unexpected verb for readImage %d\n", unpack_verb(pack edVerb));
876 return nullptr; 889 return nullptr;
877 } 890 }
878 891 int index = unpack_verb_extra(packedVerb);
879 SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures, 892 if (0 == index) {
880 &fImpl->fTypefaces, &fImpl->fFactories, 893 return nullptr; // writer failed
881 fImpl->fTFDeserializer); 894 }
882 SkPipeReader reader(this, data, size); 895 return sk_ref_sp(fImpl->fImages.get(index - 1));
883 reader.setInflator(&inflator);
884 return sk_sp<SkImage>(reader.readImage());
885 } 896 }
886 897
887 static bool do_playback(SkPipeReader& reader, SkCanvas* canvas, int* endPictureI ndex) { 898 static bool do_playback(SkPipeReader& reader, SkCanvas* canvas, int* endPictureI ndex) {
888 int indent = 0; 899 int indent = 0;
889 900
890 const bool showEachVerb = false; 901 const bool showEachVerb = false;
891 int counter = 0; 902 int counter = 0;
892 while (!reader.eof()) { 903 while (!reader.eof()) {
893 uint32_t prevOffset = reader.offset(); 904 uint32_t prevOffset = reader.offset();
894 uint32_t packedVerb = reader.read32(); 905 uint32_t packedVerb = reader.read32();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
935 946
936 bool SkPipeDeserializer::playback(const void* data, size_t size, SkCanvas* canva s) { 947 bool SkPipeDeserializer::playback(const void* data, size_t size, SkCanvas* canva s) {
937 SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures, 948 SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures,
938 &fImpl->fTypefaces, &fImpl->fFactories, 949 &fImpl->fTypefaces, &fImpl->fFactories,
939 fImpl->fTFDeserializer); 950 fImpl->fTFDeserializer);
940 SkPipeReader reader(this, data, size); 951 SkPipeReader reader(this, data, size);
941 reader.setInflator(&inflator); 952 reader.setInflator(&inflator);
942 return do_playback(reader, canvas); 953 return do_playback(reader, canvas);
943 } 954 }
944 955
OLDNEW
« no previous file with comments | « src/pipe/SkPipeFormat.h ('k') | tests/PipeTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698