| OLD | NEW |
| 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 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 * Needed to be a non-abstract subclass of SkBitmapHeapReader. | 171 * Needed to be a non-abstract subclass of SkBitmapHeapReader. |
| 172 */ | 172 */ |
| 173 void releaseRef(int32_t) override {} | 173 void releaseRef(int32_t) override {} |
| 174 | 174 |
| 175 void setSharedHeap(SkBitmapHeap* heap) { | 175 void setSharedHeap(SkBitmapHeap* heap) { |
| 176 SkASSERT(!shouldFlattenBitmaps(fFlags) || NULL == heap); | 176 SkASSERT(!shouldFlattenBitmaps(fFlags) || NULL == heap); |
| 177 SkRefCnt_SafeAssign(fSharedHeap, heap); | 177 SkRefCnt_SafeAssign(fSharedHeap, heap); |
| 178 this->updateReader(); | 178 this->updateReader(); |
| 179 } | 179 } |
| 180 | 180 |
| 181 void setImageHeap(SkImageHeap* heap) { | |
| 182 fImageHeap.reset(SkRef(heap)); | |
| 183 } | |
| 184 | |
| 185 /** | 181 /** |
| 186 * Access the shared heap. Only used in the case when bitmaps are not | 182 * Access the shared heap. Only used in the case when bitmaps are not |
| 187 * flattened. | 183 * flattened. |
| 188 */ | 184 */ |
| 189 SkBitmapHeap* getSharedHeap() const { | 185 SkBitmapHeap* getSharedHeap() const { |
| 190 SkASSERT(!shouldFlattenBitmaps(fFlags)); | 186 SkASSERT(!shouldFlattenBitmaps(fFlags)); |
| 191 return fSharedHeap; | 187 return fSharedHeap; |
| 192 } | 188 } |
| 193 | 189 |
| 194 void addTypeface() { | 190 void addTypeface() { |
| 195 size_t size = fReader->read32(); | 191 size_t size = fReader->read32(); |
| 196 const void* data = fReader->skip(SkAlign4(size)); | 192 const void* data = fReader->skip(SkAlign4(size)); |
| 197 SkMemoryStream stream(data, size, false); | 193 SkMemoryStream stream(data, size, false); |
| 198 *fTypefaces.append() = SkTypeface::Deserialize(&stream); | 194 *fTypefaces.append() = SkTypeface::Deserialize(&stream); |
| 199 } | 195 } |
| 200 | 196 |
| 201 SkTypeface* getTypeface(unsigned id) const { | 197 SkTypeface* getTypeface(unsigned id) const { |
| 202 return id ? fTypefaces[id - 1] : NULL; | 198 return id ? fTypefaces[id - 1] : NULL; |
| 203 } | 199 } |
| 204 | 200 |
| 205 const SkImage* getImage(int32_t slot) const { | |
| 206 return fImageHeap->get(slot); | |
| 207 } | |
| 208 | |
| 209 private: | 201 private: |
| 210 void updateReader() { | 202 void updateReader() { |
| 211 if (NULL == fReader) { | 203 if (NULL == fReader) { |
| 212 return; | 204 return; |
| 213 } | 205 } |
| 214 bool crossProcess = SkToBool(fFlags & SkGPipeWriter::kCrossProcess_Flag)
; | 206 bool crossProcess = SkToBool(fFlags & SkGPipeWriter::kCrossProcess_Flag)
; |
| 215 fReader->setFlags(SkSetClearMask(fReader->getFlags(), crossProcess, | 207 fReader->setFlags(SkSetClearMask(fReader->getFlags(), crossProcess, |
| 216 SkReadBuffer::kCrossProcess_Flag)); | 208 SkReadBuffer::kCrossProcess_Flag)); |
| 217 if (crossProcess) { | 209 if (crossProcess) { |
| 218 fReader->setFactoryArray(&fFactoryArray); | 210 fReader->setFactoryArray(&fFactoryArray); |
| 219 } else { | 211 } else { |
| 220 fReader->setFactoryArray(NULL); | 212 fReader->setFactoryArray(NULL); |
| 221 } | 213 } |
| 222 | 214 |
| 223 if (shouldFlattenBitmaps(fFlags)) { | 215 if (shouldFlattenBitmaps(fFlags)) { |
| 224 fReader->setBitmapStorage(this); | 216 fReader->setBitmapStorage(this); |
| 225 } else { | 217 } else { |
| 226 fReader->setBitmapStorage(fSharedHeap); | 218 fReader->setBitmapStorage(fSharedHeap); |
| 227 } | 219 } |
| 228 } | 220 } |
| 229 SkReadBuffer* fReader; | 221 SkReadBuffer* fReader; |
| 230 SkPaint fPaint; | 222 SkPaint fPaint; |
| 231 SkTDArray<SkFlattenable*> fFlatArray; | 223 SkTDArray<SkFlattenable*> fFlatArray; |
| 232 SkTDArray<SkTypeface*> fTypefaces; | 224 SkTDArray<SkTypeface*> fTypefaces; |
| 233 SkTDArray<SkFlattenable::Factory> fFactoryArray; | 225 SkTDArray<SkFlattenable::Factory> fFactoryArray; |
| 234 SkTDArray<SkBitmap*> fBitmaps; | 226 SkTDArray<SkBitmap*> fBitmaps; |
| 235 bool fSilent; | 227 bool fSilent; |
| 236 // Only used when sharing bitmaps with the writer. | 228 // Only used when sharing bitmaps with the writer. |
| 237 SkBitmapHeap* fSharedHeap; | 229 SkBitmapHeap* fSharedHeap; |
| 238 SkAutoTUnref<SkImageHeap> fImageHeap; | |
| 239 unsigned fFlags; | 230 unsigned fFlags; |
| 240 }; | 231 }; |
| 241 | 232 |
| 242 /////////////////////////////////////////////////////////////////////////////// | 233 /////////////////////////////////////////////////////////////////////////////// |
| 243 | 234 |
| 244 template <typename T> const T* skip(SkReader32* reader, size_t count = 1) { | 235 template <typename T> const T* skip(SkReader32* reader, size_t count = 1) { |
| 245 size_t size = sizeof(T) * count; | 236 size_t size = sizeof(T) * count; |
| 246 SkASSERT(SkAlign4(size) == size); | 237 SkASSERT(SkAlign4(size) == size); |
| 247 return reinterpret_cast<const T*>(reader->skip(size)); | 238 return reinterpret_cast<const T*>(reader->skip(size)); |
| 248 } | 239 } |
| (...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 631 SkGPipeState* state) { | 622 SkGPipeState* state) { |
| 632 BitmapHolder holder(reader, op32, state); | 623 BitmapHolder holder(reader, op32, state); |
| 633 bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_Dra
wOpFlag); | 624 bool hasPaint = SkToBool(DrawOp_unpackFlags(op32) & kDrawBitmap_HasPaint_Dra
wOpFlag); |
| 634 const SkIPoint* point = skip<SkIPoint>(reader); | 625 const SkIPoint* point = skip<SkIPoint>(reader); |
| 635 const SkBitmap* bitmap = holder.getBitmap(); | 626 const SkBitmap* bitmap = holder.getBitmap(); |
| 636 if (state->shouldDraw()) { | 627 if (state->shouldDraw()) { |
| 637 canvas->drawSprite(*bitmap, point->fX, point->fY, hasPaint ? &state->pai
nt() : NULL); | 628 canvas->drawSprite(*bitmap, point->fX, point->fY, hasPaint ? &state->pai
nt() : NULL); |
| 638 } | 629 } |
| 639 } | 630 } |
| 640 | 631 |
| 641 static void drawImage_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, Sk
GPipeState* state) { | |
| 642 unsigned slot = DrawOp_unpackData(op32); | |
| 643 unsigned flags = DrawOp_unpackFlags(op32); | |
| 644 bool hasPaint = SkToBool(flags & kDrawBitmap_HasPaint_DrawOpFlag); | |
| 645 SkScalar x = reader->readScalar(); | |
| 646 SkScalar y = reader->readScalar(); | |
| 647 const SkImage* image = state->getImage(slot); | |
| 648 if (state->shouldDraw()) { | |
| 649 canvas->drawImage(image, x, y, hasPaint ? &state->paint() : NULL); | |
| 650 } | |
| 651 } | |
| 652 | |
| 653 static void drawImageRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32
, | |
| 654 SkGPipeState* state) { | |
| 655 unsigned slot = DrawOp_unpackData(op32); | |
| 656 unsigned flags = DrawOp_unpackFlags(op32); | |
| 657 bool hasPaint = SkToBool(flags & kDrawBitmap_HasPaint_DrawOpFlag); | |
| 658 bool hasSrc = SkToBool(flags & kDrawBitmap_HasSrcRect_DrawOpFlag); | |
| 659 const SkRect* src = NULL; | |
| 660 if (hasSrc) { | |
| 661 src = skip<SkRect>(reader); | |
| 662 } | |
| 663 const SkRect* dst = skip<SkRect>(reader); | |
| 664 const SkImage* image = state->getImage(slot); | |
| 665 if (state->shouldDraw()) { | |
| 666 canvas->drawImageRect(image, src, *dst, hasPaint ? &state->paint() : NUL
L); | |
| 667 } | |
| 668 } | |
| 669 | |
| 670 /////////////////////////////////////////////////////////////////////////////// | 632 /////////////////////////////////////////////////////////////////////////////// |
| 671 | 633 |
| 672 static void drawPicture_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, | 634 static void drawPicture_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, |
| 673 SkGPipeState* state) { | 635 SkGPipeState* state) { |
| 674 UNIMPLEMENTED | 636 UNIMPLEMENTED |
| 675 } | 637 } |
| 676 | 638 |
| 677 static void drawTextBlob_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, | 639 static void drawTextBlob_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, |
| 678 SkGPipeState* state) { | 640 SkGPipeState* state) { |
| 679 SkScalar x = reader->readScalar(); | 641 SkScalar x = reader->readScalar(); |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 805 (void)reader->skip(bytes); | 767 (void)reader->skip(bytes); |
| 806 } | 768 } |
| 807 | 769 |
| 808 static void reportFlags_rp(SkCanvas*, SkReader32*, uint32_t op32, | 770 static void reportFlags_rp(SkCanvas*, SkReader32*, uint32_t op32, |
| 809 SkGPipeState* state) { | 771 SkGPipeState* state) { |
| 810 unsigned flags = DrawOp_unpackFlags(op32); | 772 unsigned flags = DrawOp_unpackFlags(op32); |
| 811 state->setFlags(flags); | 773 state->setFlags(flags); |
| 812 } | 774 } |
| 813 | 775 |
| 814 static void shareBitmapHeap_rp(SkCanvas*, SkReader32* reader, uint32_t, | 776 static void shareBitmapHeap_rp(SkCanvas*, SkReader32* reader, uint32_t, |
| 815 SkGPipeState* state) { | 777 SkGPipeState* state) { |
| 816 state->setSharedHeap(static_cast<SkBitmapHeap*>(reader->readPtr())); | 778 state->setSharedHeap(static_cast<SkBitmapHeap*>(reader->readPtr())); |
| 817 } | 779 } |
| 818 | 780 |
| 819 static void shareImageHeap_rp(SkCanvas*, SkReader32* reader, uint32_t, SkGPipeSt
ate* state) { | |
| 820 state->setImageHeap(static_cast<SkImageHeap*>(reader->readPtr())); | |
| 821 } | |
| 822 | |
| 823 static void done_rp(SkCanvas*, SkReader32*, uint32_t, SkGPipeState*) {} | 781 static void done_rp(SkCanvas*, SkReader32*, uint32_t, SkGPipeState*) {} |
| 824 | 782 |
| 825 typedef void (*ReadProc)(SkCanvas*, SkReader32*, uint32_t op32, SkGPipeState*); | 783 typedef void (*ReadProc)(SkCanvas*, SkReader32*, uint32_t op32, SkGPipeState*); |
| 826 | 784 |
| 827 static const ReadProc gReadTable[] = { | 785 static const ReadProc gReadTable[] = { |
| 828 skip_rp, | 786 skip_rp, |
| 829 clipPath_rp, | 787 clipPath_rp, |
| 830 clipRegion_rp, | 788 clipRegion_rp, |
| 831 clipRect_rp, | 789 clipRect_rp, |
| 832 clipRRect_rp, | 790 clipRRect_rp, |
| 833 concat_rp, | 791 concat_rp, |
| 834 drawBitmap_rp, | 792 drawBitmap_rp, |
| 835 drawBitmapNine_rp, | 793 drawBitmapNine_rp, |
| 836 drawBitmapRect_rp, | 794 drawBitmapRect_rp, |
| 837 drawDRRect_rp, | 795 drawDRRect_rp, |
| 838 drawImage_rp, | |
| 839 drawImageRect_rp, | |
| 840 drawOval_rp, | 796 drawOval_rp, |
| 841 drawPaint_rp, | 797 drawPaint_rp, |
| 842 drawPatch_rp, | 798 drawPatch_rp, |
| 843 drawPath_rp, | 799 drawPath_rp, |
| 844 drawPicture_rp, | 800 drawPicture_rp, |
| 845 drawPoints_rp, | 801 drawPoints_rp, |
| 846 drawPosText_rp, | 802 drawPosText_rp, |
| 847 drawPosTextH_rp, | 803 drawPosTextH_rp, |
| 848 drawRect_rp, | 804 drawRect_rp, |
| 849 drawRRect_rp, | 805 drawRRect_rp, |
| (...skipping 15 matching lines...) Expand all Loading... |
| 865 typeface_rp, | 821 typeface_rp, |
| 866 annotation_rp, | 822 annotation_rp, |
| 867 | 823 |
| 868 def_Typeface_rp, | 824 def_Typeface_rp, |
| 869 def_PaintFlat_rp, | 825 def_PaintFlat_rp, |
| 870 def_Bitmap_rp, | 826 def_Bitmap_rp, |
| 871 def_Factory_rp, | 827 def_Factory_rp, |
| 872 | 828 |
| 873 reportFlags_rp, | 829 reportFlags_rp, |
| 874 shareBitmapHeap_rp, | 830 shareBitmapHeap_rp, |
| 875 shareImageHeap_rp, | |
| 876 done_rp | 831 done_rp |
| 877 }; | 832 }; |
| 878 | 833 |
| 879 /////////////////////////////////////////////////////////////////////////////// | 834 /////////////////////////////////////////////////////////////////////////////// |
| 880 | 835 |
| 881 SkGPipeState::SkGPipeState() | 836 SkGPipeState::SkGPipeState() |
| 882 : fReader(0) | 837 : fReader(0) |
| 883 , fSilent(false) | 838 , fSilent(false) |
| 884 , fSharedHeap(NULL) | 839 , fSharedHeap(NULL) |
| 885 , fFlags(0) { | 840 , fFlags(0) { |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 964 status = kReadAtom_Status; | 919 status = kReadAtom_Status; |
| 965 break; | 920 break; |
| 966 } | 921 } |
| 967 } | 922 } |
| 968 | 923 |
| 969 if (bytesRead) { | 924 if (bytesRead) { |
| 970 *bytesRead = reader.offset(); | 925 *bytesRead = reader.offset(); |
| 971 } | 926 } |
| 972 return status; | 927 return status; |
| 973 } | 928 } |
| OLD | NEW |