OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 "SkBitmap.h" | 8 #include "SkBitmap.h" |
9 #include "SkErrorInternals.h" | 9 #include "SkErrorInternals.h" |
10 #include "SkImage.h" | 10 #include "SkImage.h" |
11 #include "SkImageGenerator.h" | 11 #include "SkImageGenerator.h" |
12 #include "SkReadBuffer.h" | 12 #include "SkReadBuffer.h" |
13 #include "SkStream.h" | 13 #include "SkStream.h" |
14 #include "SkTypeface.h" | 14 #include "SkTypeface.h" |
15 | 15 |
16 static uint32_t default_flags() { | 16 static uint32_t default_flags() { |
17 uint32_t flags = 0; | 17 uint32_t flags = 0; |
18 flags |= SkReadBuffer::kScalarIsFloat_Flag; | 18 flags |= SkReadBuffer::kScalarIsFloat_Flag; |
19 if (8 == sizeof(void*)) { | 19 if (8 == sizeof(void*)) { |
20 flags |= SkReadBuffer::kPtrIs64Bit_Flag; | 20 flags |= SkReadBuffer::kPtrIs64Bit_Flag; |
21 } | 21 } |
22 return flags; | 22 return flags; |
23 } | 23 } |
24 | 24 |
25 SkReadBuffer::SkReadBuffer() { | 25 SkReadBuffer::SkReadBuffer() { |
26 fFlags = default_flags(); | 26 fFlags = default_flags(); |
27 fVersion = 0; | 27 fVersion = 0; |
28 fMemoryPtr = nullptr; | 28 fMemoryPtr = nullptr; |
29 | 29 |
30 fBitmapStorage = nullptr; | |
31 fTFArray = nullptr; | 30 fTFArray = nullptr; |
32 fTFCount = 0; | 31 fTFCount = 0; |
33 | 32 |
34 fFactoryArray = nullptr; | 33 fFactoryArray = nullptr; |
35 fFactoryCount = 0; | 34 fFactoryCount = 0; |
36 fBitmapDecoder = nullptr; | 35 fBitmapDecoder = nullptr; |
37 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT | 36 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT |
38 fDecodedBitmapIndex = -1; | 37 fDecodedBitmapIndex = -1; |
39 #endif // DEBUG_NON_DETERMINISTIC_ASSERT | 38 #endif // DEBUG_NON_DETERMINISTIC_ASSERT |
40 } | 39 } |
41 | 40 |
42 SkReadBuffer::SkReadBuffer(const void* data, size_t size) { | 41 SkReadBuffer::SkReadBuffer(const void* data, size_t size) { |
43 fFlags = default_flags(); | 42 fFlags = default_flags(); |
44 fVersion = 0; | 43 fVersion = 0; |
45 fReader.setMemory(data, size); | 44 fReader.setMemory(data, size); |
46 fMemoryPtr = nullptr; | 45 fMemoryPtr = nullptr; |
47 | 46 |
48 fBitmapStorage = nullptr; | |
49 fTFArray = nullptr; | 47 fTFArray = nullptr; |
50 fTFCount = 0; | 48 fTFCount = 0; |
51 | 49 |
52 fFactoryArray = nullptr; | 50 fFactoryArray = nullptr; |
53 fFactoryCount = 0; | 51 fFactoryCount = 0; |
54 fBitmapDecoder = nullptr; | 52 fBitmapDecoder = nullptr; |
55 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT | 53 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT |
56 fDecodedBitmapIndex = -1; | 54 fDecodedBitmapIndex = -1; |
57 #endif // DEBUG_NON_DETERMINISTIC_ASSERT | 55 #endif // DEBUG_NON_DETERMINISTIC_ASSERT |
58 } | 56 } |
59 | 57 |
60 SkReadBuffer::SkReadBuffer(SkStream* stream) { | 58 SkReadBuffer::SkReadBuffer(SkStream* stream) { |
61 fFlags = default_flags(); | 59 fFlags = default_flags(); |
62 fVersion = 0; | 60 fVersion = 0; |
63 const size_t length = stream->getLength(); | 61 const size_t length = stream->getLength(); |
64 fMemoryPtr = sk_malloc_throw(length); | 62 fMemoryPtr = sk_malloc_throw(length); |
65 stream->read(fMemoryPtr, length); | 63 stream->read(fMemoryPtr, length); |
66 fReader.setMemory(fMemoryPtr, length); | 64 fReader.setMemory(fMemoryPtr, length); |
67 | 65 |
68 fBitmapStorage = nullptr; | |
69 fTFArray = nullptr; | 66 fTFArray = nullptr; |
70 fTFCount = 0; | 67 fTFCount = 0; |
71 | 68 |
72 fFactoryArray = nullptr; | 69 fFactoryArray = nullptr; |
73 fFactoryCount = 0; | 70 fFactoryCount = 0; |
74 fBitmapDecoder = nullptr; | 71 fBitmapDecoder = nullptr; |
75 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT | 72 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT |
76 fDecodedBitmapIndex = -1; | 73 fDecodedBitmapIndex = -1; |
77 #endif // DEBUG_NON_DETERMINISTIC_ASSERT | 74 #endif // DEBUG_NON_DETERMINISTIC_ASSERT |
78 } | 75 } |
79 | 76 |
80 SkReadBuffer::~SkReadBuffer() { | 77 SkReadBuffer::~SkReadBuffer() { |
81 sk_free(fMemoryPtr); | 78 sk_free(fMemoryPtr); |
82 SkSafeUnref(fBitmapStorage); | |
83 } | 79 } |
84 | 80 |
85 bool SkReadBuffer::readBool() { | 81 bool SkReadBuffer::readBool() { |
86 return fReader.readBool(); | 82 return fReader.readBool(); |
87 } | 83 } |
88 | 84 |
89 SkColor SkReadBuffer::readColor() { | 85 SkColor SkReadBuffer::readColor() { |
90 return fReader.readInt(); | 86 return fReader.readInt(); |
91 } | 87 } |
92 | 88 |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 return readArray(values, size, sizeof(SkScalar)); | 175 return readArray(values, size, sizeof(SkScalar)); |
180 } | 176 } |
181 | 177 |
182 uint32_t SkReadBuffer::getArrayCount() { | 178 uint32_t SkReadBuffer::getArrayCount() { |
183 return *(uint32_t*)fReader.peek(); | 179 return *(uint32_t*)fReader.peek(); |
184 } | 180 } |
185 | 181 |
186 bool SkReadBuffer::readBitmap(SkBitmap* bitmap) { | 182 bool SkReadBuffer::readBitmap(SkBitmap* bitmap) { |
187 const int width = this->readInt(); | 183 const int width = this->readInt(); |
188 const int height = this->readInt(); | 184 const int height = this->readInt(); |
| 185 |
189 // The writer stored a boolean value to determine whether an SkBitmapHeap wa
s used during | 186 // The writer stored a boolean value to determine whether an SkBitmapHeap wa
s used during |
190 // writing. | 187 // writing. That feature is deprecated. |
191 if (this->readBool()) { | 188 if (this->readBool()) { |
192 // An SkBitmapHeap was used for writing. Read the index from the stream
and find the | 189 this->readUInt(); // Bitmap index |
193 // corresponding SkBitmap in fBitmapStorage. | 190 this->readUInt(); // Bitmap generation ID |
194 const uint32_t index = this->readUInt(); | 191 SkErrorInternals::SetError(kParseError_SkError, "SkWriteBuffer::writeBit
map " |
195 this->readUInt(); // bitmap generation ID (see SkWriteBuffer::writeBitma
p) | 192 "stored the SkBitmap in an SkBitmapHeap, but
" |
196 if (fBitmapStorage) { | 193 "that feature is no longer supported."); |
197 *bitmap = *fBitmapStorage->getBitmap(index); | |
198 fBitmapStorage->releaseRef(index); | |
199 return true; | |
200 } else { | |
201 // The bitmap was stored in a heap, but there is no way to access it
. Set an error and | |
202 // fall through to use a place holder bitmap. | |
203 SkErrorInternals::SetError(kParseError_SkError, "SkWriteBuffer::writ
eBitmap " | |
204 "stored the SkBitmap in an SkBitmapHeap,
but " | |
205 "SkReadBuffer has no SkBitmapHeapReader t
o " | |
206 "retrieve the SkBitmap."); | |
207 } | |
208 } else { | 194 } else { |
209 // The writer stored false, meaning the SkBitmap was not stored in an Sk
BitmapHeap. | 195 // The writer stored false, meaning the SkBitmap was not stored in an Sk
BitmapHeap. |
210 const size_t length = this->readUInt(); | 196 const size_t length = this->readUInt(); |
211 if (length > 0) { | 197 if (length > 0) { |
212 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT | 198 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT |
213 fDecodedBitmapIndex++; | 199 fDecodedBitmapIndex++; |
214 #endif // DEBUG_NON_DETERMINISTIC_ASSERT | 200 #endif // DEBUG_NON_DETERMINISTIC_ASSERT |
215 // A non-zero size means the SkBitmap was encoded. Read the data and
pixel | 201 // A non-zero size means the SkBitmap was encoded. Read the data and
pixel |
216 // offset. | 202 // offset. |
217 const void* data = this->skip(length); | 203 const void* data = this->skip(length); |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 if (sizeRecorded != sizeRead) { | 371 if (sizeRecorded != sizeRead) { |
386 this->validate(false); | 372 this->validate(false); |
387 return nullptr; | 373 return nullptr; |
388 } | 374 } |
389 } else { | 375 } else { |
390 // we must skip the remaining data | 376 // we must skip the remaining data |
391 fReader.skip(sizeRecorded); | 377 fReader.skip(sizeRecorded); |
392 } | 378 } |
393 return obj.release(); | 379 return obj.release(); |
394 } | 380 } |
OLD | NEW |