OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 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 "SkFrontBufferedStream.h" | 9 #include "SkFrontBufferedStream.h" |
10 #include "SkImageDecoder.h" | 10 #include "SkImageDecoder.h" |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 | 124 |
125 // A custom class whose isAtEnd behaves the way Android's stream does - since it
is an adaptor to a | 125 // A custom class whose isAtEnd behaves the way Android's stream does - since it
is an adaptor to a |
126 // Java InputStream, it does not know that it is at the end until it has attempt
ed to read beyond | 126 // Java InputStream, it does not know that it is at the end until it has attempt
ed to read beyond |
127 // the end and failed. Used by test_read_beyond_buffer. | 127 // the end and failed. Used by test_read_beyond_buffer. |
128 class AndroidLikeMemoryStream : public SkMemoryStream { | 128 class AndroidLikeMemoryStream : public SkMemoryStream { |
129 public: | 129 public: |
130 AndroidLikeMemoryStream(void* data, size_t size, bool ownMemory) | 130 AndroidLikeMemoryStream(void* data, size_t size, bool ownMemory) |
131 : INHERITED(data, size, ownMemory) | 131 : INHERITED(data, size, ownMemory) |
132 , fIsAtEnd(false) {} | 132 , fIsAtEnd(false) {} |
133 | 133 |
134 size_t read(void* dst, size_t requested) SK_OVERRIDE { | 134 size_t read(void* dst, size_t requested) override { |
135 size_t bytesRead = this->INHERITED::read(dst, requested); | 135 size_t bytesRead = this->INHERITED::read(dst, requested); |
136 if (bytesRead < requested) { | 136 if (bytesRead < requested) { |
137 fIsAtEnd = true; | 137 fIsAtEnd = true; |
138 } | 138 } |
139 return bytesRead; | 139 return bytesRead; |
140 } | 140 } |
141 | 141 |
142 bool isAtEnd() const SK_OVERRIDE { | 142 bool isAtEnd() const override { |
143 return fIsAtEnd; | 143 return fIsAtEnd; |
144 } | 144 } |
145 | 145 |
146 private: | 146 private: |
147 bool fIsAtEnd; | 147 bool fIsAtEnd; |
148 typedef SkMemoryStream INHERITED; | 148 typedef SkMemoryStream INHERITED; |
149 }; | 149 }; |
150 | 150 |
151 // This test ensures that buffering the exact length of the stream and attemptin
g to read beyond it | 151 // This test ensures that buffering the exact length of the stream and attemptin
g to read beyond it |
152 // does not invalidate the buffer. | 152 // does not invalidate the buffer. |
(...skipping 15 matching lines...) Expand all Loading... |
168 | 168 |
169 // Dummy stream that optionally has a length and/or position. Tests that FrontBu
fferedStream's | 169 // Dummy stream that optionally has a length and/or position. Tests that FrontBu
fferedStream's |
170 // length depends on the stream it's buffering having a length and position. | 170 // length depends on the stream it's buffering having a length and position. |
171 class LengthOptionalStream : public SkStream { | 171 class LengthOptionalStream : public SkStream { |
172 public: | 172 public: |
173 LengthOptionalStream(bool hasLength, bool hasPosition) | 173 LengthOptionalStream(bool hasLength, bool hasPosition) |
174 : fHasLength(hasLength) | 174 : fHasLength(hasLength) |
175 , fHasPosition(hasPosition) | 175 , fHasPosition(hasPosition) |
176 {} | 176 {} |
177 | 177 |
178 bool hasLength() const SK_OVERRIDE { | 178 bool hasLength() const override { |
179 return fHasLength; | 179 return fHasLength; |
180 } | 180 } |
181 | 181 |
182 bool hasPosition() const SK_OVERRIDE { | 182 bool hasPosition() const override { |
183 return fHasPosition; | 183 return fHasPosition; |
184 } | 184 } |
185 | 185 |
186 size_t read(void*, size_t) SK_OVERRIDE { | 186 size_t read(void*, size_t) override { |
187 return 0; | 187 return 0; |
188 } | 188 } |
189 | 189 |
190 bool isAtEnd() const SK_OVERRIDE { | 190 bool isAtEnd() const override { |
191 return true; | 191 return true; |
192 } | 192 } |
193 | 193 |
194 private: | 194 private: |
195 const bool fHasLength; | 195 const bool fHasLength; |
196 const bool fHasPosition; | 196 const bool fHasPosition; |
197 }; | 197 }; |
198 | 198 |
199 // Test all possible combinations of the wrapped stream having a length and a po
sition. | 199 // Test all possible combinations of the wrapped stream having a length and a po
sition. |
200 static void test_length_combos(skiatest::Reporter* reporter, size_t bufferSize)
{ | 200 static void test_length_combos(skiatest::Reporter* reporter, size_t bufferSize)
{ |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 | 257 |
258 // Test that a FrontBufferedStream does not allow reading after the end of a str
eam. | 258 // Test that a FrontBufferedStream does not allow reading after the end of a str
eam. |
259 // This class is a dummy SkStream which reports that it is at the end on the fir
st | 259 // This class is a dummy SkStream which reports that it is at the end on the fir
st |
260 // read (simulating a failure). Then it tracks whether someone calls read() agai
n. | 260 // read (simulating a failure). Then it tracks whether someone calls read() agai
n. |
261 class FailingStream : public SkStream { | 261 class FailingStream : public SkStream { |
262 public: | 262 public: |
263 FailingStream() | 263 FailingStream() |
264 : fAtEnd(false) | 264 : fAtEnd(false) |
265 , fReadAfterEnd(false) | 265 , fReadAfterEnd(false) |
266 {} | 266 {} |
267 size_t read(void* buffer, size_t size) SK_OVERRIDE { | 267 size_t read(void* buffer, size_t size) override { |
268 if (fAtEnd) { | 268 if (fAtEnd) { |
269 fReadAfterEnd = true; | 269 fReadAfterEnd = true; |
270 } else { | 270 } else { |
271 fAtEnd = true; | 271 fAtEnd = true; |
272 } | 272 } |
273 return 0; | 273 return 0; |
274 } | 274 } |
275 | 275 |
276 bool isAtEnd() const SK_OVERRIDE { | 276 bool isAtEnd() const override { |
277 return fAtEnd; | 277 return fAtEnd; |
278 } | 278 } |
279 | 279 |
280 bool readAfterEnd() const { | 280 bool readAfterEnd() const { |
281 return fReadAfterEnd; | 281 return fReadAfterEnd; |
282 } | 282 } |
283 private: | 283 private: |
284 bool fAtEnd; | 284 bool fAtEnd; |
285 bool fReadAfterEnd; | 285 bool fReadAfterEnd; |
286 }; | 286 }; |
287 | 287 |
288 DEF_TEST(ShortFrontBufferedStream, reporter) { | 288 DEF_TEST(ShortFrontBufferedStream, reporter) { |
289 FailingStream* failingStream = SkNEW(FailingStream); | 289 FailingStream* failingStream = SkNEW(FailingStream); |
290 SkAutoTDelete<SkStreamRewindable> stream(SkFrontBufferedStream::Create(faili
ngStream, 64)); | 290 SkAutoTDelete<SkStreamRewindable> stream(SkFrontBufferedStream::Create(faili
ngStream, 64)); |
291 SkBitmap bm; | 291 SkBitmap bm; |
292 // The return value of DecodeStream is not important. We are just using Deco
deStream because | 292 // The return value of DecodeStream is not important. We are just using Deco
deStream because |
293 // it simulates a bug. DecodeStream will read the stream, then rewind, then
attempt to read | 293 // it simulates a bug. DecodeStream will read the stream, then rewind, then
attempt to read |
294 // again. FrontBufferedStream::read should not continue to read its underlyi
ng stream beyond | 294 // again. FrontBufferedStream::read should not continue to read its underlyi
ng stream beyond |
295 // its end. | 295 // its end. |
296 SkImageDecoder::DecodeStream(stream, &bm); | 296 SkImageDecoder::DecodeStream(stream, &bm); |
297 REPORTER_ASSERT(reporter, !failingStream->readAfterEnd()); | 297 REPORTER_ASSERT(reporter, !failingStream->readAfterEnd()); |
298 } | 298 } |
OLD | NEW |