OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
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 "SkMovie.h" | 10 #include "SkMovie.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 protected: | 28 protected: |
29 virtual bool onGetInfo(Info*); | 29 virtual bool onGetInfo(Info*); |
30 virtual bool onSetTime(SkMSec); | 30 virtual bool onSetTime(SkMSec); |
31 virtual bool onGetBitmap(SkBitmap*); | 31 virtual bool onGetBitmap(SkBitmap*); |
32 | 32 |
33 private: | 33 private: |
34 GifFileType* fGIF; | 34 GifFileType* fGIF; |
35 int fCurrIndex; | 35 int fCurrIndex; |
36 int fLastDrawIndex; | 36 int fLastDrawIndex; |
37 SkBitmap fBackup; | 37 SkBitmap fBackup; |
| 38 SkColor fPaintingColor; |
38 }; | 39 }; |
39 | 40 |
40 static int Decode(GifFileType* fileType, GifByteType* out, int size) { | 41 static int Decode(GifFileType* fileType, GifByteType* out, int size) { |
41 SkStream* stream = (SkStream*) fileType->UserData; | 42 SkStream* stream = (SkStream*) fileType->UserData; |
42 return (int) stream->read(out, size); | 43 return (int) stream->read(out, size); |
43 } | 44 } |
44 | 45 |
45 SkGIFMovie::SkGIFMovie(SkStream* stream) | 46 SkGIFMovie::SkGIFMovie(SkStream* stream) |
46 { | 47 { |
47 #if GIFLIB_MAJOR < 5 | 48 #if GIFLIB_MAJOR < 5 |
48 fGIF = DGifOpen( stream, Decode ); | 49 fGIF = DGifOpen( stream, Decode ); |
49 #else | 50 #else |
50 fGIF = DGifOpen( stream, Decode, NULL ); | 51 fGIF = DGifOpen( stream, Decode, NULL ); |
51 #endif | 52 #endif |
52 if (NULL == fGIF) | 53 if (NULL == fGIF) |
53 return; | 54 return; |
54 | 55 |
55 if (DGifSlurp(fGIF) != GIF_OK) | 56 if (DGifSlurp(fGIF) != GIF_OK) |
56 { | 57 { |
57 DGifCloseFile(fGIF, NULL); | 58 DGifCloseFile(fGIF, NULL); |
58 fGIF = NULL; | 59 fGIF = NULL; |
59 } | 60 } |
60 fCurrIndex = -1; | 61 fCurrIndex = -1; |
61 fLastDrawIndex = -1; | 62 fLastDrawIndex = -1; |
| 63 fPaintingColor = SkPackARGB32(0, 0, 0, 0); |
62 } | 64 } |
63 | 65 |
64 SkGIFMovie::~SkGIFMovie() | 66 SkGIFMovie::~SkGIFMovie() |
65 { | 67 { |
66 if (fGIF) | 68 if (fGIF) |
67 DGifCloseFile(fGIF, NULL); | 69 DGifCloseFile(fGIF, NULL); |
68 } | 70 } |
69 | 71 |
70 static SkMSec savedimage_duration(const SavedImage* image) | 72 static SkMSec savedimage_duration(const SavedImage* image) |
71 { | 73 { |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 // this block must not be reached. | 390 // this block must not be reached. |
389 lastIndex = fGIF->ImageCount - 1; | 391 lastIndex = fGIF->ImageCount - 1; |
390 } | 392 } |
391 | 393 |
392 SkColor bgColor = SkPackARGB32(0, 0, 0, 0); | 394 SkColor bgColor = SkPackARGB32(0, 0, 0, 0); |
393 if (gif->SColorMap != NULL) { | 395 if (gif->SColorMap != NULL) { |
394 const GifColorType& col = gif->SColorMap->Colors[fGIF->SBackGroundColor]
; | 396 const GifColorType& col = gif->SColorMap->Colors[fGIF->SBackGroundColor]
; |
395 bgColor = SkColorSetARGB(0xFF, col.Red, col.Green, col.Blue); | 397 bgColor = SkColorSetARGB(0xFF, col.Red, col.Green, col.Blue); |
396 } | 398 } |
397 | 399 |
398 static SkColor paintingColor = SkPackARGB32(0, 0, 0, 0); | |
399 // draw each frames - not intelligent way | 400 // draw each frames - not intelligent way |
400 for (int i = startIndex; i <= lastIndex; i++) { | 401 for (int i = startIndex; i <= lastIndex; i++) { |
401 const SavedImage* cur = &fGIF->SavedImages[i]; | 402 const SavedImage* cur = &fGIF->SavedImages[i]; |
402 if (i == 0) { | 403 if (i == 0) { |
403 bool trans; | 404 bool trans; |
404 int disposal; | 405 int disposal; |
405 getTransparencyAndDisposalMethod(cur, &trans, &disposal); | 406 getTransparencyAndDisposalMethod(cur, &trans, &disposal); |
406 if (!trans && gif->SColorMap != NULL) { | 407 if (!trans && gif->SColorMap != NULL) { |
407 paintingColor = bgColor; | 408 fPaintingColor = bgColor; |
408 } else { | 409 } else { |
409 paintingColor = SkColorSetARGB(0, 0, 0, 0); | 410 fPaintingColor = SkColorSetARGB(0, 0, 0, 0); |
410 } | 411 } |
411 | 412 |
412 bm->eraseColor(paintingColor); | 413 bm->eraseColor(fPaintingColor); |
413 fBackup.eraseColor(paintingColor); | 414 fBackup.eraseColor(fPaintingColor); |
414 } else { | 415 } else { |
415 // Dispose previous frame before move to next frame. | 416 // Dispose previous frame before move to next frame. |
416 const SavedImage* prev = &fGIF->SavedImages[i-1]; | 417 const SavedImage* prev = &fGIF->SavedImages[i-1]; |
417 disposeFrameIfNeeded(bm, prev, cur, &fBackup, paintingColor); | 418 disposeFrameIfNeeded(bm, prev, cur, &fBackup, fPaintingColor); |
418 } | 419 } |
419 | 420 |
420 // Draw frame | 421 // Draw frame |
421 // We can skip this process if this index is not last and disposal | 422 // We can skip this process if this index is not last and disposal |
422 // method == 2 or method == 3 | 423 // method == 2 or method == 3 |
423 if (i == lastIndex || !checkIfWillBeCleared(cur)) { | 424 if (i == lastIndex || !checkIfWillBeCleared(cur)) { |
424 drawFrame(bm, cur, gif->SColorMap); | 425 drawFrame(bm, cur, gif->SColorMap); |
425 } | 426 } |
426 } | 427 } |
427 | 428 |
(...skipping 14 matching lines...) Expand all Loading... |
442 memcmp(GIF89_STAMP, buf, GIF_STAMP_LEN) == 0) { | 443 memcmp(GIF89_STAMP, buf, GIF_STAMP_LEN) == 0) { |
443 // must rewind here, since our construct wants to re-read the data | 444 // must rewind here, since our construct wants to re-read the data |
444 stream->rewind(); | 445 stream->rewind(); |
445 return SkNEW_ARGS(SkGIFMovie, (stream)); | 446 return SkNEW_ARGS(SkGIFMovie, (stream)); |
446 } | 447 } |
447 } | 448 } |
448 return NULL; | 449 return NULL; |
449 } | 450 } |
450 | 451 |
451 static SkTRegistry<SkMovie*(*)(SkStreamRewindable*)> gReg(Factory); | 452 static SkTRegistry<SkMovie*(*)(SkStreamRewindable*)> gReg(Factory); |
OLD | NEW |