OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "SkBmpCodec.h" | 8 #include "SkBmpCodec.h" |
9 #include "SkCodec_libico.h" | 9 #include "SkCodec_libico.h" |
10 #include "SkCodec_libpng.h" | 10 #include "SkCodec_libpng.h" |
11 #include "SkCodecPriv.h" | 11 #include "SkCodecPriv.h" |
12 #include "SkColorPriv.h" | 12 #include "SkColorPriv.h" |
13 #include "SkData.h" | 13 #include "SkData.h" |
14 #include "SkStream.h" | 14 #include "SkStream.h" |
15 #include "SkTDArray.h" | 15 #include "SkTDArray.h" |
16 #include "SkTSort.h" | 16 #include "SkTSort.h" |
17 | 17 |
18 /* | 18 /* |
19 * Checks the start of the stream to see if the image is an Ico or Cur | 19 * Checks the start of the stream to see if the image is an Ico or Cur |
20 */ | 20 */ |
21 bool SkIcoCodec::IsIco(SkStream* stream) { | 21 bool SkIcoCodec::IsIco(const char* buffer, size_t bytesRead) { |
22 const char icoSig[] = { '\x00', '\x00', '\x01', '\x00' }; | 22 const char icoSig[] = { '\x00', '\x00', '\x01', '\x00' }; |
23 const char curSig[] = { '\x00', '\x00', '\x02', '\x00' }; | 23 const char curSig[] = { '\x00', '\x00', '\x02', '\x00' }; |
24 char buffer[sizeof(icoSig)]; | 24 return bytesRead >= sizeof(icoSig) && |
25 return stream->read(buffer, sizeof(icoSig)) == sizeof(icoSig) && | |
26 (!memcmp(buffer, icoSig, sizeof(icoSig)) || | 25 (!memcmp(buffer, icoSig, sizeof(icoSig)) || |
27 !memcmp(buffer, curSig, sizeof(curSig))); | 26 !memcmp(buffer, curSig, sizeof(curSig))); |
28 } | 27 } |
29 | 28 |
30 /* | 29 /* |
31 * Assumes IsIco was called and returned true | 30 * Assumes IsIco was called and returned true |
32 * Creates an Ico decoder | 31 * Creates an Ico decoder |
33 * Reads enough of the stream to determine the image format | 32 * Reads enough of the stream to determine the image format |
34 */ | 33 */ |
35 SkCodec* SkIcoCodec::NewFromStream(SkStream* stream) { | 34 SkCodec* SkIcoCodec::NewFromStream(SkStream* stream) { |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 SkAutoTUnref<SkData> data( | 131 SkAutoTUnref<SkData> data( |
133 SkData::NewFromStream(inputStream.get(), size)); | 132 SkData::NewFromStream(inputStream.get(), size)); |
134 if (nullptr == data.get()) { | 133 if (nullptr == data.get()) { |
135 SkCodecPrintf("Warning: could not create embedded stream.\n"); | 134 SkCodecPrintf("Warning: could not create embedded stream.\n"); |
136 break; | 135 break; |
137 } | 136 } |
138 SkAutoTDelete<SkMemoryStream> embeddedStream(new SkMemoryStream(data.get
())); | 137 SkAutoTDelete<SkMemoryStream> embeddedStream(new SkMemoryStream(data.get
())); |
139 bytesRead += size; | 138 bytesRead += size; |
140 | 139 |
141 // Check if the embedded codec is bmp or png and create the codec | 140 // Check if the embedded codec is bmp or png and create the codec |
142 const bool isPng = SkPngCodec::IsPng(embeddedStream); | |
143 SkAssertResult(embeddedStream->rewind()); | |
144 SkCodec* codec = nullptr; | 141 SkCodec* codec = nullptr; |
145 if (isPng) { | 142 if (SkPngCodec::IsPng((const char*) data->bytes(), data->size())) { |
146 codec = SkPngCodec::NewFromStream(embeddedStream.detach()); | 143 codec = SkPngCodec::NewFromStream(embeddedStream.detach()); |
147 } else { | 144 } else { |
148 codec = SkBmpCodec::NewFromIco(embeddedStream.detach()); | 145 codec = SkBmpCodec::NewFromIco(embeddedStream.detach()); |
149 } | 146 } |
150 | 147 |
151 // Save a valid codec | 148 // Save a valid codec |
152 if (nullptr != codec) { | 149 if (nullptr != codec) { |
153 codecs->push_back().reset(codec); | 150 codecs->push_back().reset(codec); |
154 } | 151 } |
155 } | 152 } |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 } | 290 } |
294 | 291 |
295 // On success or partial success, return the result | 292 // On success or partial success, return the result |
296 return result; | 293 return result; |
297 } | 294 } |
298 } | 295 } |
299 | 296 |
300 SkCodecPrintf("Error: No matching candidate image in ico.\n"); | 297 SkCodecPrintf("Error: No matching candidate image in ico.\n"); |
301 return result; | 298 return result; |
302 } | 299 } |
OLD | NEW |