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

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

Issue 563783003: Ensure blob typeface information survives SkGPipe serialization. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Pass TypefaceBuffer by ptr Created 6 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/core/SkPtrRecorder.h ('k') | src/pipe/SkGPipeWrite.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 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "SkBitmapHeap.h" 10 #include "SkBitmapHeap.h"
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 return fSharedHeap; 187 return fSharedHeap;
188 } 188 }
189 189
190 void addTypeface() { 190 void addTypeface() {
191 size_t size = fReader->read32(); 191 size_t size = fReader->read32();
192 const void* data = fReader->skip(SkAlign4(size)); 192 const void* data = fReader->skip(SkAlign4(size));
193 SkMemoryStream stream(data, size, false); 193 SkMemoryStream stream(data, size, false);
194 *fTypefaces.append() = SkTypeface::Deserialize(&stream); 194 *fTypefaces.append() = SkTypeface::Deserialize(&stream);
195 } 195 }
196 196
197 void setTypeface(SkPaint* paint, unsigned id) { 197 SkTypeface* getTypeface(unsigned id) const {
198 paint->setTypeface(id ? fTypefaces[id - 1] : NULL); 198 return id ? fTypefaces[id - 1] : NULL;
199 } 199 }
200 200
201 private: 201 private:
202 void updateReader() { 202 void updateReader() {
203 if (NULL == fReader) { 203 if (NULL == fReader) {
204 return; 204 return;
205 } 205 }
206 bool crossProcess = SkToBool(fFlags & SkGPipeWriter::kCrossProcess_Flag) ; 206 bool crossProcess = SkToBool(fFlags & SkGPipeWriter::kCrossProcess_Flag) ;
207 fReader->setFlags(SkSetClearMask(fReader->getFlags(), crossProcess, 207 fReader->setFlags(SkSetClearMask(fReader->getFlags(), crossProcess,
208 SkReadBuffer::kCrossProcess_Flag)); 208 SkReadBuffer::kCrossProcess_Flag));
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after
669 static void drawPicture_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 669 static void drawPicture_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
670 SkGPipeState* state) { 670 SkGPipeState* state) {
671 UNIMPLEMENTED 671 UNIMPLEMENTED
672 } 672 }
673 673
674 static void drawTextBlob_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, 674 static void drawTextBlob_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
675 SkGPipeState* state) { 675 SkGPipeState* state) {
676 SkScalar x = reader->readScalar(); 676 SkScalar x = reader->readScalar();
677 SkScalar y = reader->readScalar(); 677 SkScalar y = reader->readScalar();
678 678
679 int typefaceCount = reader->readU32();
680 SkAutoSTMalloc<16, SkTypeface*> typefaceArray(typefaceCount);
681 if (state->getFlags() & SkGPipeWriter::kCrossProcess_Flag) {
682 for (int i = 0; i < typefaceCount; ++i) {
683 typefaceArray[i] = state->getTypeface(reader->readU32());
684 }
685 } else {
686 reader->read(typefaceArray.get(), typefaceCount * sizeof(SkTypeface*));
687 }
688
679 size_t blobSize = reader->readU32(); 689 size_t blobSize = reader->readU32();
680 const void* data = reader->skip(SkAlign4(blobSize)); 690 const void* data = reader->skip(SkAlign4(blobSize));
681 691
682 if (state->shouldDraw()) { 692 if (state->shouldDraw()) {
683 SkReadBuffer blobBuffer(data, blobSize); 693 SkReadBuffer blobBuffer(data, blobSize);
694 blobBuffer.setTypefaceArray(typefaceArray.get(), typefaceCount);
684 SkAutoTUnref<const SkTextBlob> blob(SkTextBlob::CreateFromBuffer(blobBuf fer)); 695 SkAutoTUnref<const SkTextBlob> blob(SkTextBlob::CreateFromBuffer(blobBuf fer));
685 SkASSERT(blob.get()); 696 SkASSERT(blob.get());
686 697
687 canvas->drawTextBlob(blob, x, y, state->paint()); 698 canvas->drawTextBlob(blob, x, y, state->paint());
688 } 699 }
689 } 700 }
690 /////////////////////////////////////////////////////////////////////////////// 701 ///////////////////////////////////////////////////////////////////////////////
691 702
692 static void paintOp_rp(SkCanvas*, SkReader32* reader, uint32_t op32, 703 static void paintOp_rp(SkCanvas*, SkReader32* reader, uint32_t op32,
693 SkGPipeState* state) { 704 SkGPipeState* state) {
(...skipping 30 matching lines...) Expand all
724 case kFlatIndex_PaintOp: { 735 case kFlatIndex_PaintOp: {
725 PaintFlats pf = (PaintFlats)PaintOp_unpackFlags(p32); 736 PaintFlats pf = (PaintFlats)PaintOp_unpackFlags(p32);
726 unsigned index = data; 737 unsigned index = data;
727 set_paintflat(p, state->getFlat(index), pf); 738 set_paintflat(p, state->getFlat(index), pf);
728 break; 739 break;
729 } 740 }
730 741
731 case kTypeface_PaintOp: 742 case kTypeface_PaintOp:
732 SkASSERT(SkToBool(state->getFlags() & 743 SkASSERT(SkToBool(state->getFlags() &
733 SkGPipeWriter::kCrossProcess_Flag)); 744 SkGPipeWriter::kCrossProcess_Flag));
734 state->setTypeface(p, data); break; 745 p->setTypeface(state->getTypeface(data));
746 break;
735 default: SkDEBUGFAIL("bad paintop"); return; 747 default: SkDEBUGFAIL("bad paintop"); return;
736 } 748 }
737 SkASSERT(reader->offset() <= stop); 749 SkASSERT(reader->offset() <= stop);
738 } while (reader->offset() < stop); 750 } while (reader->offset() < stop);
739 } 751 }
740 752
741 static void typeface_rp(SkCanvas*, SkReader32* reader, uint32_t, 753 static void typeface_rp(SkCanvas*, SkReader32* reader, uint32_t,
742 SkGPipeState* state) { 754 SkGPipeState* state) {
743 SkASSERT(!SkToBool(state->getFlags() & SkGPipeWriter::kCrossProcess_Flag)); 755 SkASSERT(!SkToBool(state->getFlags() & SkGPipeWriter::kCrossProcess_Flag));
744 SkPaint* p = state->editPaint(); 756 SkPaint* p = state->editPaint();
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
945 status = kReadAtom_Status; 957 status = kReadAtom_Status;
946 break; 958 break;
947 } 959 }
948 } 960 }
949 961
950 if (bytesRead) { 962 if (bytesRead) {
951 *bytesRead = reader.offset(); 963 *bytesRead = reader.offset();
952 } 964 }
953 return status; 965 return status;
954 } 966 }
OLDNEW
« no previous file with comments | « src/core/SkPtrRecorder.h ('k') | src/pipe/SkGPipeWrite.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698