1/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkCodec_libbmp.h"
9#include "SkCodecPriv.h"
10#include "SkColorPriv.h"
11#include "SkStream.h"
12
13/*
14 *
15 * Checks if the conversion between the input image and the requested output
16 * image has been implemented
17 *
18 */
19static bool conversion_possible(const SkImageInfo& dst,
20                                const SkImageInfo& src) {
21    // Ensure that the profile type is unchanged
22    if (dst.profileType() != src.profileType()) {
23        return false;
24    }
25
26    // Check for supported alpha types
27    if (src.alphaType() != dst.alphaType()) {
28        if (kOpaque_SkAlphaType == src.alphaType()) {
29            // If the source is opaque, we must decode to opaque
30            return false;
31        }
32
33        // The source is not opaque
34        switch (dst.alphaType()) {
35            case kPremul_SkAlphaType:
36            case kUnpremul_SkAlphaType:
37                // The source is not opaque, so either of these is okay
38                break;
39            default:
40                // We cannot decode a non-opaque image to opaque (or unknown)
41                return false;
42        }
43    }
44
45    // Check for supported color types
46    switch (dst.colorType()) {
47        // Allow output to kN32 from any type of input
48        case kN32_SkColorType:
49            return true;
50        // Allow output to kIndex_8 from compatible inputs
51        case kIndex_8_SkColorType:
52            return kIndex_8_SkColorType == src.colorType();
53        default:
54            return false;
55    }
56}
57
58/*
59 *
60 * Defines the version and type of the second bitmap header
61 *
62 */
63enum BitmapHeaderType {
64    kInfoV1_BitmapHeaderType,
65    kInfoV2_BitmapHeaderType,
66    kInfoV3_BitmapHeaderType,
67    kInfoV4_BitmapHeaderType,
68    kInfoV5_BitmapHeaderType,
69    kOS2V1_BitmapHeaderType,
70    kOS2VX_BitmapHeaderType,
71    kUnknown_BitmapHeaderType
72};
73
74/*
75 *
76 * Possible bitmap compression types
77 *
78 */
79enum BitmapCompressionMethod {
80    kNone_BitmapCompressionMethod =          0,
81    k8BitRLE_BitmapCompressionMethod =       1,
82    k4BitRLE_BitmapCompressionMethod =       2,
83    kBitMasks_BitmapCompressionMethod =      3,
84    kJpeg_BitmapCompressionMethod =          4,
85    kPng_BitmapCompressionMethod =           5,
86    kAlphaBitMasks_BitmapCompressionMethod = 6,
87    kCMYK_BitmapCompressionMethod =          11,
88    kCMYK8BitRLE_BitmapCompressionMethod =   12,
89    kCMYK4BitRLE_BitmapCompressionMethod =   13
90};
91
92/*
93 *
94 * Checks the start of the stream to see if the image is a bitmap
95 *
96 */
97bool SkBmpCodec::IsBmp(SkStream* stream) {
98    // TODO: Support "IC", "PT", "CI", "CP", "BA"
99    const char bmpSig[] = { 'B', 'M' };
100    char buffer[sizeof(bmpSig)];
101    return stream->read(buffer, sizeof(bmpSig)) == sizeof(bmpSig) &&
102            !memcmp(buffer, bmpSig, sizeof(bmpSig));
103}
104
105/*
106 *
107 * Assumes IsBmp was called and returned true
108 * Creates a bmp decoder
109 * Reads enough of the stream to determine the image format
110 *
111 */
112SkCodec* SkBmpCodec::NewFromStream(SkStream* stream) {
113    return SkBmpCodec::NewFromStream(stream, false);
114}
115
116/*
117 *
118 * Creates a bmp decoder for a bmp embedded in ico
119 * Reads enough of the stream to determine the image format
120 *
121 */
122SkCodec* SkBmpCodec::NewFromIco(SkStream* stream) {
123    return SkBmpCodec::NewFromStream(stream, true);
124}
125
126/*
127 *
128 * Read enough of the stream to initialize the SkBmpCodec. Returns a bool
129 * representing success or failure. If it returned true, and codecOut was
130 * not NULL, it will be set to a new SkBmpCodec.
131 * Does *not* take ownership of the passed in SkStream.
132 *
133 */
134bool SkBmpCodec::ReadHeader(SkStream* stream, bool isIco, SkCodec** codecOut) {
135    // Header size constants
136    static const uint32_t kBmpHeaderBytes = 14;
137    static const uint32_t kBmpHeaderBytesPlusFour = kBmpHeaderBytes + 4;
138    static const uint32_t kBmpOS2V1Bytes = 12;
139    static const uint32_t kBmpOS2V2Bytes = 64;
140    static const uint32_t kBmpInfoBaseBytes = 16;
141    static const uint32_t kBmpInfoV1Bytes = 40;
142    static const uint32_t kBmpInfoV2Bytes = 52;
143    static const uint32_t kBmpInfoV3Bytes = 56;
144    static const uint32_t kBmpInfoV4Bytes = 108;
145    static const uint32_t kBmpInfoV5Bytes = 124;
146    static const uint32_t kBmpMaskBytes = 12;
147
148    // The total bytes in the bmp file
149    // We only need to use this value for RLE decoding, so we will only
150    // check that it is valid in the RLE case.
151    uint32_t totalBytes;
152    // The offset from the start of the file where the pixel data begins
153    uint32_t offset;
154    // The size of the second (info) header in bytes
155    uint32_t infoBytes;
156
157    // Bmps embedded in Icos skip the first Bmp header
158    if (!isIco) {
159        // Read the first header and the size of the second header
160        SkAutoTDeleteArray<uint8_t> hBuffer(
161                SkNEW_ARRAY(uint8_t, kBmpHeaderBytesPlusFour));
162        if (stream->read(hBuffer.get(), kBmpHeaderBytesPlusFour) !=
163                kBmpHeaderBytesPlusFour) {
164            SkCodecPrintf("Error: unable to read first bitmap header.\n");
165            return false;
166        }
167
168        totalBytes = get_int(hBuffer.get(), 2);
169        offset = get_int(hBuffer.get(), 10);
170        if (offset < kBmpHeaderBytes + kBmpOS2V1Bytes) {
171            SkCodecPrintf("Error: invalid starting location for pixel data\n");
172            return false;
173        }
174
175        // The size of the second (info) header in bytes
176        // The size is the first field of the second header, so we have already
177        // read the first four infoBytes.
178        infoBytes = get_int(hBuffer.get(), 14);
179        if (infoBytes < kBmpOS2V1Bytes) {
180            SkCodecPrintf("Error: invalid second header size.\n");
181            return false;
182        }
183    } else {
184        // This value is only used by RLE compression.  Bmp in Ico files do not
185        // use RLE.  If the compression field is incorrectly signaled as RLE,
186        // we will catch this and signal an error below.
187        totalBytes = 0;
188
189        // Bmps in Ico cannot specify an offset.  We will always assume that
190        // pixel data begins immediately after the color table.  This value
191        // will be corrected below.
192        offset = 0;
193
194        // Read the size of the second header
195        SkAutoTDeleteArray<uint8_t> hBuffer(
196                SkNEW_ARRAY(uint8_t, 4));
197        if (stream->read(hBuffer.get(), 4) != 4) {
198            SkCodecPrintf("Error: unable to read size of second bitmap header.\n");
199            return false;
200        }
201        infoBytes = get_int(hBuffer.get(), 0);
202        if (infoBytes < kBmpOS2V1Bytes) {
203            SkCodecPrintf("Error: invalid second header size.\n");
204            return false;
205        }
206    }
207
208    // We already read the first four bytes of the info header to get the size
209    const uint32_t infoBytesRemaining = infoBytes - 4;
210
211    // Read the second header
212    SkAutoTDeleteArray<uint8_t> iBuffer(
213            SkNEW_ARRAY(uint8_t, infoBytesRemaining));
214    if (stream->read(iBuffer.get(), infoBytesRemaining) != infoBytesRemaining) {
215        SkCodecPrintf("Error: unable to read second bitmap header.\n");
216        return false;
217    }
218
219    // The number of bits used per pixel in the pixel data
220    uint16_t bitsPerPixel;
221
222    // The compression method for the pixel data
223    uint32_t compression = kNone_BitmapCompressionMethod;
224
225    // Number of colors in the color table, defaults to 0 or max (see below)
226    uint32_t numColors = 0;
227
228    // Bytes per color in the color table, early versions use 3, most use 4
229    uint32_t bytesPerColor;
230
231    // The image width and height
232    int width, height;
233
234    // Determine image information depending on second header format
235    BitmapHeaderType headerType;
236    if (infoBytes >= kBmpInfoBaseBytes) {
237        // Check the version of the header
238        switch (infoBytes) {
239            case kBmpInfoV1Bytes:
240                headerType = kInfoV1_BitmapHeaderType;
241                break;
242            case kBmpInfoV2Bytes:
243                headerType = kInfoV2_BitmapHeaderType;
244                break;
245            case kBmpInfoV3Bytes:
246                headerType = kInfoV3_BitmapHeaderType;
247                break;
248            case kBmpInfoV4Bytes:
249                headerType = kInfoV4_BitmapHeaderType;
250                break;
251            case kBmpInfoV5Bytes:
252                headerType = kInfoV5_BitmapHeaderType;
253                break;
254            case 16:
255            case 20:
256            case 24:
257            case 28:
258            case 32:
259            case 36:
260            case 42:
261            case 46:
262            case 48:
263            case 60:
264            case kBmpOS2V2Bytes:
265                headerType = kOS2VX_BitmapHeaderType;
266                break;
267            default:
268                // We do not signal an error here because there is the
269                // possibility of new or undocumented bmp header types.  Most
270                // of the newer versions of bmp headers are similar to and
271                // build off of the older versions, so we may still be able to
272                // decode the bmp.
273                SkCodecPrintf("Warning: unknown bmp header format.\n");
274                headerType = kUnknown_BitmapHeaderType;
275                break;
276        }
277        // We check the size of the header before entering the if statement.
278        // We should not reach this point unless the size is large enough for
279        // these required fields.
280        SkASSERT(infoBytesRemaining >= 12);
281        width = get_int(iBuffer.get(), 0);
282        height = get_int(iBuffer.get(), 4);
283        bitsPerPixel = get_short(iBuffer.get(), 10);
284
285        // Some versions do not have these fields, so we check before
286        // overwriting the default value.
287        if (infoBytesRemaining >= 16) {
288            compression = get_int(iBuffer.get(), 12);
289            if (infoBytesRemaining >= 32) {
290                numColors = get_int(iBuffer.get(), 28);
291            }
292        }
293
294        // All of the headers that reach this point, store color table entries
295        // using 4 bytes per pixel.
296        bytesPerColor = 4;
297    } else if (infoBytes >= kBmpOS2V1Bytes) {
298        // The OS2V1 is treated separately because it has a unique format
299        headerType = kOS2V1_BitmapHeaderType;
300        width = (int) get_short(iBuffer.get(), 0);
301        height = (int) get_short(iBuffer.get(), 2);
302        bitsPerPixel = get_short(iBuffer.get(), 6);
303        bytesPerColor = 3;
304    } else {
305        // There are no valid bmp headers
306        SkCodecPrintf("Error: second bitmap header size is invalid.\n");
307        return false;
308    }
309
310    // Check for valid dimensions from header
311    RowOrder rowOrder = kBottomUp_RowOrder;
312    if (height < 0) {
313        height = -height;
314        rowOrder = kTopDown_RowOrder;
315    }
316    // The height field for bmp in ico is double the actual height because they
317    // contain an XOR mask followed by an AND mask
318    if (isIco) {
319        height /= 2;
320    }
321    if (width <= 0 || height <= 0) {
322        // TODO: Decide if we want to disable really large bmps as well.
323        // https://code.google.com/p/skia/issues/detail?id=3617
324        SkCodecPrintf("Error: invalid bitmap dimensions.\n");
325        return false;
326    }
327
328    // Create mask struct
329    SkMasks::InputMasks inputMasks;
330    memset(&inputMasks, 0, sizeof(SkMasks::InputMasks));
331
332    // Determine the input compression format and set bit masks if necessary
333    uint32_t maskBytes = 0;
334    BitmapInputFormat inputFormat = kUnknown_BitmapInputFormat;
335    switch (compression) {
336        case kNone_BitmapCompressionMethod:
337            inputFormat = kStandard_BitmapInputFormat;
338            break;
339        case k8BitRLE_BitmapCompressionMethod:
340            if (bitsPerPixel != 8) {
341                SkCodecPrintf("Warning: correcting invalid bitmap format.\n");
342                bitsPerPixel = 8;
343            }
344            inputFormat = kRLE_BitmapInputFormat;
345            break;
346        case k4BitRLE_BitmapCompressionMethod:
347            if (bitsPerPixel != 4) {
348                SkCodecPrintf("Warning: correcting invalid bitmap format.\n");
349                bitsPerPixel = 4;
350            }
351            inputFormat = kRLE_BitmapInputFormat;
352            break;
353        case kAlphaBitMasks_BitmapCompressionMethod:
354        case kBitMasks_BitmapCompressionMethod:
355            // Load the masks
356            inputFormat = kBitMask_BitmapInputFormat;
357            switch (headerType) {
358                case kInfoV1_BitmapHeaderType: {
359                    // The V1 header stores the bit masks after the header
360                    SkAutoTDeleteArray<uint8_t> mBuffer(
361                            SkNEW_ARRAY(uint8_t, kBmpMaskBytes));
362                    if (stream->read(mBuffer.get(), kBmpMaskBytes) !=
363                            kBmpMaskBytes) {
364                        SkCodecPrintf("Error: unable to read bit inputMasks.\n");
365                        return false;
366                    }
367                    maskBytes = kBmpMaskBytes;
368                    inputMasks.red = get_int(mBuffer.get(), 0);
369                    inputMasks.green = get_int(mBuffer.get(), 4);
370                    inputMasks.blue = get_int(mBuffer.get(), 8);
371                    break;
372                }
373                case kInfoV2_BitmapHeaderType:
374                case kInfoV3_BitmapHeaderType:
375                case kInfoV4_BitmapHeaderType:
376                case kInfoV5_BitmapHeaderType:
377                    // Header types are matched based on size.  If the header
378                    // is V2+, we are guaranteed to be able to read at least
379                    // this size.
380                    SkASSERT(infoBytesRemaining >= 48);
381                    inputMasks.red = get_int(iBuffer.get(), 36);
382                    inputMasks.green = get_int(iBuffer.get(), 40);
383                    inputMasks.blue = get_int(iBuffer.get(), 44);
384                    break;
385                case kOS2VX_BitmapHeaderType:
386                    // TODO: Decide if we intend to support this.
387                    //       It is unsupported in the previous version and
388                    //       in chromium.  I have not come across a test case
389                    //       that uses this format.
390                    SkCodecPrintf("Error: huffman format unsupported.\n");
391                    return false;
392                default:
393                   SkCodecPrintf("Error: invalid bmp bit masks header.\n");
394                   return false;
395            }
396            break;
397        case kJpeg_BitmapCompressionMethod:
398            if (24 == bitsPerPixel) {
399                inputFormat = kRLE_BitmapInputFormat;
400                break;
401            }
402            // Fall through
403        case kPng_BitmapCompressionMethod:
404            // TODO: Decide if we intend to support this.
405            //       It is unsupported in the previous version and
406            //       in chromium.  I think it is used mostly for printers.
407            SkCodecPrintf("Error: compression format not supported.\n");
408            return false;
409        case kCMYK_BitmapCompressionMethod:
410        case kCMYK8BitRLE_BitmapCompressionMethod:
411        case kCMYK4BitRLE_BitmapCompressionMethod:
412            // TODO: Same as above.
413            SkCodecPrintf("Error: CMYK not supported for bitmap decoding.\n");
414            return false;
415        default:
416            SkCodecPrintf("Error: invalid format for bitmap decoding.\n");
417            return false;
418    }
419
420    // Most versions of bmps should be rendered as opaque.  Either they do
421    // not have an alpha channel, or they expect the alpha channel to be
422    // ignored.  V3+ bmp files introduce an alpha mask and allow the creator
423    // of the image to use the alpha channels.  However, many of these images
424    // leave the alpha channel blank and expect to be rendered as opaque.  This
425    // is the case for almost all V3 images, so we render these as opaque.  For
426    // V4+, we will use the alpha channel, and fix the image later if it turns
427    // out to be fully transparent.
428    // As an exception, V3 bmp-in-ico may use an alpha mask.
429    SkAlphaType alphaType = kOpaque_SkAlphaType;
430    if ((kInfoV3_BitmapHeaderType == headerType && isIco) ||
431            kInfoV4_BitmapHeaderType == headerType ||
432            kInfoV5_BitmapHeaderType == headerType) {
433        // Header types are matched based on size.  If the header is
434        // V3+, we are guaranteed to be able to read at least this size.
435        SkASSERT(infoBytesRemaining > 52);
436        inputMasks.alpha = get_int(iBuffer.get(), 48);
437        if (inputMasks.alpha != 0) {
438            alphaType = kUnpremul_SkAlphaType;
439        }
440    }
441    iBuffer.free();
442
443    // Additionally, 32 bit bmp-in-icos use the alpha channel.
444    // And, RLE inputs may skip pixels, leaving them as transparent.  This
445    // is uncommon, but we cannot be certain that an RLE bmp will be opaque.
446    if ((isIco && 32 == bitsPerPixel) || (kRLE_BitmapInputFormat == inputFormat)) {
447        alphaType = kUnpremul_SkAlphaType;
448    }
449
450    // Check for valid bits per pixel.
451    // At the same time, use this information to choose a suggested color type
452    // and to set default masks.
453    SkColorType colorType = kN32_SkColorType;
454    switch (bitsPerPixel) {
455        // In addition to more standard pixel compression formats, bmp supports
456        // the use of bit masks to determine pixel components.  The standard
457        // format for representing 16-bit colors is 555 (XRRRRRGGGGGBBBBB),
458        // which does not map well to any Skia color formats.  For this reason,
459        // we will always enable mask mode with 16 bits per pixel.
460        case 16:
461            if (kBitMask_BitmapInputFormat != inputFormat) {
462                inputMasks.red = 0x7C00;
463                inputMasks.green = 0x03E0;
464                inputMasks.blue = 0x001F;
465                inputFormat = kBitMask_BitmapInputFormat;
466            }
467            break;
468        // We want to decode to kIndex_8 for input formats that are already
469        // designed in index format.
470        case 1:
471        case 2:
472        case 4:
473        case 8:
474            // However, we cannot in RLE format since we may need to leave some
475            // pixels as transparent.  Similarly, we also cannot for ICO images
476            // since we may need to apply a transparent mask.
477            if (kRLE_BitmapInputFormat != inputFormat && !isIco) {
478                colorType = kIndex_8_SkColorType;
479            }
480        case 24:
481        case 32:
482            break;
483        default:
484            SkCodecPrintf("Error: invalid input value for bits per pixel.\n");
485            return false;
486    }
487
488    // Check that input bit masks are valid and create the masks object
489    SkAutoTDelete<SkMasks>
490            masks(SkMasks::CreateMasks(inputMasks, bitsPerPixel));
491    if (NULL == masks) {
492        SkCodecPrintf("Error: invalid input masks.\n");
493        return false;
494    }
495
496    // Check for a valid number of total bytes when in RLE mode
497    if (totalBytes <= offset && kRLE_BitmapInputFormat == inputFormat) {
498        SkCodecPrintf("Error: RLE requires valid input size.\n");
499        return false;
500    }
501    const size_t RLEBytes = totalBytes - offset;
502
503    // Calculate the number of bytes read so far
504    const uint32_t bytesRead = kBmpHeaderBytes + infoBytes + maskBytes;
505    if (!isIco && offset < bytesRead) {
506        SkCodecPrintf("Error: pixel data offset less than header size.\n");
507        return false;
508    }
509
510    if (codecOut) {
511        // Return the codec
512        // We will use ImageInfo to store width, height, suggested color type, and
513        // suggested alpha type.
514        const SkImageInfo& imageInfo = SkImageInfo::Make(width, height,
515                colorType, alphaType);
516        *codecOut = SkNEW_ARGS(SkBmpCodec, (imageInfo, stream, bitsPerPixel,
517                                            inputFormat, masks.detach(),
518                                            numColors, bytesPerColor,
519                                            offset - bytesRead, rowOrder,
520                                            RLEBytes, isIco));
521    }
522    return true;
523}
524
525/*
526 *
527 * Creates a bmp decoder
528 * Reads enough of the stream to determine the image format
529 *
530 */
531SkCodec* SkBmpCodec::NewFromStream(SkStream* stream, bool isIco) {
532    SkAutoTDelete<SkStream> streamDeleter(stream);
533    SkCodec* codec = NULL;
534    if (ReadHeader(stream, isIco, &codec)) {
535        // codec has taken ownership of stream, so we do not need to
536        // delete it.
537        SkASSERT(codec);
538        streamDeleter.detach();
539        return codec;
540    }
541    return NULL;
542}
543
544/*
545 *
546 * Creates an instance of the decoder
547 * Called only by NewFromStream
548 *
549 */
550SkBmpCodec::SkBmpCodec(const SkImageInfo& info, SkStream* stream,
551                       uint16_t bitsPerPixel, BitmapInputFormat inputFormat,
552                       SkMasks* masks, uint32_t numColors,
553                       uint32_t bytesPerColor, uint32_t offset,
554                       RowOrder rowOrder, size_t RLEBytes, bool isIco)
555    : INHERITED(info, stream)
556    , fBitsPerPixel(bitsPerPixel)
557    , fInputFormat(inputFormat)
558    , fMasks(masks)
559    , fColorTable(NULL)
560    , fNumColors(numColors)
561    , fBytesPerColor(bytesPerColor)
562    , fOffset(offset)
563    , fRowOrder(rowOrder)
564    , fRLEBytes(RLEBytes)
565    , fIsIco(isIco)
566
567{}
568
569/*
570 *
571 * Initiates the bitmap decode
572 *
573 */
574SkCodec::Result SkBmpCodec::onGetPixels(const SkImageInfo& dstInfo,
575                                        void* dst, size_t dstRowBytes,
576                                        const Options& opts,
577                                        SkPMColor* inputColorPtr,
578                                        int* inputColorCount) {
579    // Check for proper input and output formats
580    SkCodec::RewindState rewindState = this->rewindIfNeeded();
581    if (rewindState == kCouldNotRewind_RewindState) {
582        return kCouldNotRewind;
583    } else if (rewindState == kRewound_RewindState) {
584        if (!ReadHeader(this->stream(), fIsIco, NULL)) {
585            return kCouldNotRewind;
586        }
587    }
588    if (dstInfo.dimensions() != this->getInfo().dimensions()) {
589        SkCodecPrintf("Error: scaling not supported.\n");
590        return kInvalidScale;
591    }
592    if (!conversion_possible(dstInfo, this->getInfo())) {
593        SkCodecPrintf("Error: cannot convert input type to output type.\n");
594        return kInvalidConversion;
595    }
596
597    // Create the color table if necessary and prepare the stream for decode
598    // Note that if it is non-NULL, inputColorCount will be modified
599    if (!createColorTable(dstInfo.alphaType(), inputColorCount)) {
600        SkCodecPrintf("Error: could not create color table.\n");
601        return kInvalidInput;
602    }
603
604    // Copy the color table to the client if necessary
605    copy_color_table(dstInfo, fColorTable, inputColorPtr, inputColorCount);
606
607    // Perform the decode
608    switch (fInputFormat) {
609        case kBitMask_BitmapInputFormat:
610            return decodeMask(dstInfo, dst, dstRowBytes, opts);
611        case kRLE_BitmapInputFormat:
612            return decodeRLE(dstInfo, dst, dstRowBytes, opts);
613        case kStandard_BitmapInputFormat:
614            return decode(dstInfo, dst, dstRowBytes, opts);
615        default:
616            SkASSERT(false);
617            return kInvalidInput;
618    }
619}
620
621/*
622 *
623 * Process the color table for the bmp input
624 *
625 */
626 bool SkBmpCodec::createColorTable(SkAlphaType alphaType, int* numColors) {
627    // Allocate memory for color table
628    uint32_t colorBytes = 0;
629    uint32_t maxColors = 0;
630    SkPMColor colorTable[256];
631    if (fBitsPerPixel <= 8) {
632        // Zero is a default for maxColors
633        // Also set fNumColors to maxColors when it is too large
634        maxColors = 1 << fBitsPerPixel;
635        if (fNumColors == 0 || fNumColors >= maxColors) {
636            fNumColors = maxColors;
637        }
638
639        // Inform the caller of the number of colors
640        if (NULL != numColors) {
641            // We set the number of colors to maxColors in order to ensure
642            // safe memory accesses.  Otherwise, an invalid pixel could
643            // access memory outside of our color table array.
644            *numColors = maxColors;
645        }
646
647        // Read the color table from the stream
648        colorBytes = fNumColors * fBytesPerColor;
649        SkAutoTDeleteArray<uint8_t> cBuffer(SkNEW_ARRAY(uint8_t, colorBytes));
650        if (stream()->read(cBuffer.get(), colorBytes) != colorBytes) {
651            SkCodecPrintf("Error: unable to read color table.\n");
652            return false;
653        }
654
655        // Choose the proper packing function
656        SkPMColor (*packARGB) (uint32_t, uint32_t, uint32_t, uint32_t);
657        switch (alphaType) {
658            case kOpaque_SkAlphaType:
659            case kUnpremul_SkAlphaType:
660                packARGB = &SkPackARGB32NoCheck;
661                break;
662            case kPremul_SkAlphaType:
663                packARGB = &SkPreMultiplyARGB;
664                break;
665            default:
666                // This should not be reached because conversion possible
667                // should fail if the alpha type is not one of the above
668                // values.
669                SkASSERT(false);
670                packARGB = NULL;
671                break;
672        }
673
674        // Fill in the color table
675        uint32_t i = 0;
676        for (; i < fNumColors; i++) {
677            uint8_t blue = get_byte(cBuffer.get(), i*fBytesPerColor);
678            uint8_t green = get_byte(cBuffer.get(), i*fBytesPerColor + 1);
679            uint8_t red = get_byte(cBuffer.get(), i*fBytesPerColor + 2);
680            uint8_t alpha;
681            if (kOpaque_SkAlphaType == alphaType || kRLE_BitmapInputFormat == fInputFormat) {
682                alpha = 0xFF;
683            } else {
684                alpha = (fMasks->getAlphaMask() >> 24) &
685                        get_byte(cBuffer.get(), i*fBytesPerColor + 3);
686            }
687            colorTable[i] = packARGB(alpha, red, green, blue);
688        }
689
690        // To avoid segmentation faults on bad pixel data, fill the end of the
691        // color table with black.  This is the same the behavior as the
692        // chromium decoder.
693        for (; i < maxColors; i++) {
694            colorTable[i] = SkPackARGB32NoCheck(0xFF, 0, 0, 0);
695        }
696
697        // Set the color table
698        fColorTable.reset(SkNEW_ARGS(SkColorTable, (colorTable, maxColors)));
699    }
700
701    // Bmp-in-Ico files do not use an offset to indicate where the pixel data
702    // begins.  Pixel data always begins immediately after the color table.
703    if (!fIsIco) {
704        // Check that we have not read past the pixel array offset
705        if(fOffset < colorBytes) {
706            // This may occur on OS 2.1 and other old versions where the color
707            // table defaults to max size, and the bmp tries to use a smaller
708            // color table.  This is invalid, and our decision is to indicate
709            // an error, rather than try to guess the intended size of the
710            // color table.
711            SkCodecPrintf("Error: pixel data offset less than color table size.\n");
712            return false;
713        }
714
715        // After reading the color table, skip to the start of the pixel array
716        if (stream()->skip(fOffset - colorBytes) != fOffset - colorBytes) {
717            SkCodecPrintf("Error: unable to skip to image data.\n");
718            return false;
719        }
720    }
721
722    // Return true on success
723    return true;
724}
725
726/*
727 *
728 * Get the destination row to start filling from
729 * Used to fill the remainder of the image on incomplete input
730 *
731 */
732static inline void* get_dst_start_row(void* dst, size_t dstRowBytes, int32_t y,
733            SkBmpCodec::RowOrder rowOrder) {
734    return (SkBmpCodec::kTopDown_RowOrder == rowOrder) ?
735            SkTAddOffset<void*>(dst, y * dstRowBytes) : dst;
736}
737
738/*
739 *
740 * Performs the bitmap decoding for bit masks input format
741 *
742 */
743SkCodec::Result SkBmpCodec::decodeMask(const SkImageInfo& dstInfo,
744                                       void* dst, size_t dstRowBytes,
745                                       const Options& opts) {
746    // Set constant values
747    const int width = dstInfo.width();
748    const int height = dstInfo.height();
749    const size_t rowBytes = SkAlign4(compute_row_bytes(width, fBitsPerPixel));
750
751    // Allocate a buffer large enough to hold the full image
752    SkAutoTDeleteArray<uint8_t>
753        srcBuffer(SkNEW_ARRAY(uint8_t, height*rowBytes));
754    uint8_t* srcRow = srcBuffer.get();
755
756    // Create the swizzler
757    SkAutoTDelete<SkMaskSwizzler> maskSwizzler(
758            SkMaskSwizzler::CreateMaskSwizzler(dstInfo, dst, dstRowBytes,
759            fMasks, fBitsPerPixel));
760
761    // Iterate over rows of the image
762    bool transparent = true;
763    for (int y = 0; y < height; y++) {
764        // Read a row of the input
765        if (stream()->read(srcRow, rowBytes) != rowBytes) {
766            SkCodecPrintf("Warning: incomplete input stream.\n");
767            // Fill the destination image on failure
768            SkPMColor fillColor = dstInfo.alphaType() == kOpaque_SkAlphaType ?
769                    SK_ColorBLACK : SK_ColorTRANSPARENT;
770            if (kNo_ZeroInitialized == opts.fZeroInitialized || 0 != fillColor) {
771                void* dstStart = get_dst_start_row(dst, dstRowBytes, y, fRowOrder);
772                SkSwizzler::Fill(dstStart, dstInfo, dstRowBytes, dstInfo.height() - y, fillColor,
773                        NULL);
774            }
775            return kIncompleteInput;
776        }
777
778        // Decode the row in destination format
779        int row = kBottomUp_RowOrder == fRowOrder ? height - 1 - y : y;
780        SkSwizzler::ResultAlpha r = maskSwizzler->next(srcRow, row);
781        transparent &= SkSwizzler::IsTransparent(r);
782
783        // Move to the next row
784        srcRow = SkTAddOffset<uint8_t>(srcRow, rowBytes);
785    }
786
787    // Some fully transparent bmp images are intended to be opaque.  Here, we
788    // correct for this possibility.
789    if (transparent) {
790        const SkImageInfo& opaqueInfo =
791                dstInfo.makeAlphaType(kOpaque_SkAlphaType);
792        SkAutoTDelete<SkMaskSwizzler> opaqueSwizzler(
793                SkMaskSwizzler::CreateMaskSwizzler(opaqueInfo, dst, dstRowBytes,
794                                                   fMasks, fBitsPerPixel));
795        srcRow = srcBuffer.get();
796        for (int y = 0; y < height; y++) {
797            // Decode the row in opaque format
798            int row = kBottomUp_RowOrder == fRowOrder ? height - 1 - y : y;
799            opaqueSwizzler->next(srcRow, row);
800
801            // Move to the next row
802            srcRow = SkTAddOffset<uint8_t>(srcRow, rowBytes);
803        }
804    }
805
806    // Finished decoding the entire image
807    return kSuccess;
808}
809
810/*
811 *
812 * Set an RLE pixel using the color table
813 *
814 */
815void SkBmpCodec::setRLEPixel(void* dst, size_t dstRowBytes,
816                             const SkImageInfo& dstInfo, uint32_t x, uint32_t y,
817                             uint8_t index) {
818    // Set the row
819    int height = dstInfo.height();
820    int row;
821    if (kBottomUp_RowOrder == fRowOrder) {
822        row = height - y - 1;
823    } else {
824        row = y;
825    }
826
827    // Set the pixel based on destination color type
828    switch (dstInfo.colorType()) {
829        case kN32_SkColorType: {
830            SkPMColor* dstRow = SkTAddOffset<SkPMColor>((SkPMColor*) dst,
831                    row * (int) dstRowBytes);
832            dstRow[x] = fColorTable->operator[](index);
833            break;
834        }
835        default:
836            // This case should not be reached.  We should catch an invalid
837            // color type when we check that the conversion is possible.
838            SkASSERT(false);
839            break;
840    }
841}
842
843/*
844 *
845 * Set an RLE pixel from R, G, B values
846 *
847 */
848void SkBmpCodec::setRLE24Pixel(void* dst, size_t dstRowBytes,
849                               const SkImageInfo& dstInfo, uint32_t x,
850                               uint32_t y, uint8_t red, uint8_t green,
851                               uint8_t blue) {
852    // Set the row
853    int height = dstInfo.height();
854    int row;
855    if (kBottomUp_RowOrder == fRowOrder) {
856        row = height - y - 1;
857    } else {
858        row = y;
859    }
860
861    // Set the pixel based on destination color type
862    switch (dstInfo.colorType()) {
863        case kN32_SkColorType: {
864            SkPMColor* dstRow = SkTAddOffset<SkPMColor>((SkPMColor*) dst,
865                    row * (int) dstRowBytes);
866            dstRow[x] = SkPackARGB32NoCheck(0xFF, red, green, blue);
867            break;
868        }
869        default:
870            // This case should not be reached.  We should catch an invalid
871            // color type when we check that the conversion is possible.
872            SkASSERT(false);
873            break;
874    }
875}
876
877/*
878 *
879 * Performs the bitmap decoding for RLE input format
880 * RLE decoding is performed all at once, rather than a one row at a time
881 *
882 */
883SkCodec::Result SkBmpCodec::decodeRLE(const SkImageInfo& dstInfo,
884                                      void* dst, size_t dstRowBytes,
885                                      const Options& opts) {
886    // Set RLE flags
887    static const uint8_t RLE_ESCAPE = 0;
888    static const uint8_t RLE_EOL = 0;
889    static const uint8_t RLE_EOF = 1;
890    static const uint8_t RLE_DELTA = 2;
891
892    // Set constant values
893    const int width = dstInfo.width();
894    const int height = dstInfo.height();
895
896    // Input buffer parameters
897    uint32_t currByte = 0;
898    SkAutoTDeleteArray<uint8_t> buffer(SkNEW_ARRAY(uint8_t, fRLEBytes));
899    size_t totalBytes = stream()->read(buffer.get(), fRLEBytes);
900    if (totalBytes < fRLEBytes) {
901        SkCodecPrintf("Warning: incomplete RLE file.\n");
902    } else if (totalBytes <= 0) {
903        SkCodecPrintf("Error: could not read RLE image data.\n");
904        return kInvalidInput;
905    }
906
907    // Destination parameters
908    int x = 0;
909    int y = 0;
910
911    // Set the background as transparent.  Then, if the RLE code skips pixels,
912    // the skipped pixels will be transparent.
913    // Because of the need for transparent pixels, kN32 is the only color
914    // type that makes sense for the destination format.
915    SkASSERT(kN32_SkColorType == dstInfo.colorType());
916    if (kNo_ZeroInitialized == opts.fZeroInitialized) {
917        SkSwizzler::Fill(dst, dstInfo, dstRowBytes, height, SK_ColorTRANSPARENT, NULL);
918    }
919
920    while (true) {
921        // Every entry takes at least two bytes
922        if ((int) totalBytes - currByte < 2) {
923            SkCodecPrintf("Warning: incomplete RLE input.\n");
924            return kIncompleteInput;
925        }
926
927        // Read the next two bytes.  These bytes have different meanings
928        // depending on their values.  In the first interpretation, the first
929        // byte is an escape flag and the second byte indicates what special
930        // task to perform.
931        const uint8_t flag = buffer.get()[currByte++];
932        const uint8_t task = buffer.get()[currByte++];
933
934        // If we have reached a row that is beyond the image size, and the RLE
935        // code does not indicate end of file, abort and signal a warning.
936        if (y >= height && (flag != RLE_ESCAPE || (task != RLE_EOF))) {
937            SkCodecPrintf("Warning: invalid RLE input.\n");
938            return kIncompleteInput;
939        }
940
941        // Perform decoding
942        if (RLE_ESCAPE == flag) {
943            switch (task) {
944                case RLE_EOL:
945                    x = 0;
946                    y++;
947                    break;
948                case RLE_EOF:
949                    return kSuccess;
950                case RLE_DELTA: {
951                    // Two bytes are needed to specify delta
952                    if ((int) totalBytes - currByte < 2) {
953                        SkCodecPrintf("Warning: incomplete RLE input\n");
954                        return kIncompleteInput;
955                    }
956                    // Modify x and y
957                    const uint8_t dx = buffer.get()[currByte++];
958                    const uint8_t dy = buffer.get()[currByte++];
959                    x += dx;
960                    y += dy;
961                    if (x > width || y > height) {
962                        SkCodecPrintf("Warning: invalid RLE input.\n");
963                        return kIncompleteInput;
964                    }
965                    break;
966                }
967                default: {
968                    // If task does not match any of the above signals, it
969                    // indicates that we have a sequence of non-RLE pixels.
970                    // Furthermore, the value of task is equal to the number
971                    // of pixels to interpret.
972                    uint8_t numPixels = task;
973                    const size_t rowBytes = compute_row_bytes(numPixels,
974                            fBitsPerPixel);
975                    // Abort if setting numPixels moves us off the edge of the
976                    // image.  Also abort if there are not enough bytes
977                    // remaining in the stream to set numPixels.
978                    if (x + numPixels > width ||
979                            (int) totalBytes - currByte < SkAlign2(rowBytes)) {
980                        SkCodecPrintf("Warning: invalid RLE input.\n");
981                        return kIncompleteInput;
982                    }
983                    // Set numPixels number of pixels
984                    while (numPixels > 0) {
985                        switch(fBitsPerPixel) {
986                            case 4: {
987                                SkASSERT(currByte < totalBytes);
988                                uint8_t val = buffer.get()[currByte++];
989                                setRLEPixel(dst, dstRowBytes, dstInfo, x++,
990                                        y, val >> 4);
991                                numPixels--;
992                                if (numPixels != 0) {
993                                    setRLEPixel(dst, dstRowBytes, dstInfo,
994                                            x++, y, val & 0xF);
995                                    numPixels--;
996                                }
997                                break;
998                            }
999                            case 8:
1000                                SkASSERT(currByte < totalBytes);
1001                                setRLEPixel(dst, dstRowBytes, dstInfo, x++,
1002                                        y, buffer.get()[currByte++]);
1003                                numPixels--;
1004                                break;
1005                            case 24: {
1006                                SkASSERT(currByte + 2 < totalBytes);
1007                                uint8_t blue = buffer.get()[currByte++];
1008                                uint8_t green = buffer.get()[currByte++];
1009                                uint8_t red = buffer.get()[currByte++];
1010                                setRLE24Pixel(dst, dstRowBytes, dstInfo,
1011                                            x++, y, red, green, blue);
1012                                numPixels--;
1013                            }
1014                            default:
1015                                SkASSERT(false);
1016                                return kInvalidInput;
1017                        }
1018                    }
1019                    // Skip a byte if necessary to maintain alignment
1020                    if (!SkIsAlign2(rowBytes)) {
1021                        currByte++;
1022                    }
1023                    break;
1024                }
1025            }
1026        } else {
1027            // If the first byte read is not a flag, it indicates the number of
1028            // pixels to set in RLE mode.
1029            const uint8_t numPixels = flag;
1030            const int endX = SkTMin<int>(x + numPixels, width);
1031
1032            if (24 == fBitsPerPixel) {
1033                // In RLE24, the second byte read is part of the pixel color.
1034                // There are two more required bytes to finish encoding the
1035                // color.
1036                if ((int) totalBytes - currByte < 2) {
1037                    SkCodecPrintf("Warning: incomplete RLE input\n");
1038                    return kIncompleteInput;
1039                }
1040
1041                // Fill the pixels up to endX with the specified color
1042                uint8_t blue = task;
1043                uint8_t green = buffer.get()[currByte++];
1044                uint8_t red = buffer.get()[currByte++];
1045                while (x < endX) {
1046                    setRLE24Pixel(dst, dstRowBytes, dstInfo, x++, y, red,
1047                            green, blue);
1048                }
1049            } else {
1050                // In RLE8 or RLE4, the second byte read gives the index in the
1051                // color table to look up the pixel color.
1052                // RLE8 has one color index that gets repeated
1053                // RLE4 has two color indexes in the upper and lower 4 bits of
1054                // the bytes, which are alternated
1055                uint8_t indices[2] = { task, task };
1056                if (4 == fBitsPerPixel) {
1057                    indices[0] >>= 4;
1058                    indices[1] &= 0xf;
1059                }
1060
1061                // Set the indicated number of pixels
1062                for (int which = 0; x < endX; x++) {
1063                    setRLEPixel(dst, dstRowBytes, dstInfo, x, y,
1064                            indices[which]);
1065                    which = !which;
1066                }
1067            }
1068        }
1069    }
1070}
1071
1072/*
1073 *
1074 * Performs the bitmap decoding for standard input format
1075 *
1076 */
1077SkCodec::Result SkBmpCodec::decode(const SkImageInfo& dstInfo,
1078                                   void* dst, size_t dstRowBytes,
1079                                   const Options& opts) {
1080    // Set constant values
1081    const int width = dstInfo.width();
1082    const int height = dstInfo.height();
1083    const size_t rowBytes = SkAlign4(compute_row_bytes(width, fBitsPerPixel));
1084
1085    // Get swizzler configuration and choose the fill value for failures.  We will use
1086    // zero as the default palette index, black for opaque images, and transparent for
1087    // non-opaque images.
1088    SkSwizzler::SrcConfig config;
1089    uint32_t fillColorOrIndex;
1090    bool zeroFill = true;
1091    switch (fBitsPerPixel) {
1092        case 1:
1093            config = SkSwizzler::kIndex1;
1094            fillColorOrIndex = 0;
1095            break;
1096        case 2:
1097            config = SkSwizzler::kIndex2;
1098            fillColorOrIndex = 0;
1099            break;
1100        case 4:
1101            config = SkSwizzler::kIndex4;
1102            fillColorOrIndex = 0;
1103            break;
1104        case 8:
1105            config = SkSwizzler::kIndex;
1106            fillColorOrIndex = 0;
1107            break;
1108        case 24:
1109            config = SkSwizzler::kBGR;
1110            fillColorOrIndex = SK_ColorBLACK;
1111            zeroFill = false;
1112            break;
1113        case 32:
1114            if (kOpaque_SkAlphaType == dstInfo.alphaType()) {
1115                config = SkSwizzler::kBGRX;
1116                fillColorOrIndex = SK_ColorBLACK;
1117                zeroFill = false;
1118            } else {
1119                config = SkSwizzler::kBGRA;
1120                fillColorOrIndex = SK_ColorTRANSPARENT;
1121            }
1122            break;
1123        default:
1124            SkASSERT(false);
1125            return kInvalidInput;
1126    }
1127
1128    // Get a pointer to the color table if it exists
1129    const SkPMColor* colorPtr = NULL != fColorTable.get() ? fColorTable->readColors() : NULL;
1130
1131    // Create swizzler
1132    SkAutoTDelete<SkSwizzler> swizzler(SkSwizzler::CreateSwizzler(config,
1133            colorPtr, dstInfo, dst, dstRowBytes,
1134            SkImageGenerator::kNo_ZeroInitialized));
1135
1136    // Allocate space for a row buffer and a source for the swizzler
1137    SkAutoTDeleteArray<uint8_t> srcBuffer(SkNEW_ARRAY(uint8_t, rowBytes));
1138
1139    // Iterate over rows of the image
1140    // FIXME: bool transparent = true;
1141    for (int y = 0; y < height; y++) {
1142        // Read a row of the input
1143        if (stream()->read(srcBuffer.get(), rowBytes) != rowBytes) {
1144            SkCodecPrintf("Warning: incomplete input stream.\n");
1145            // Fill the destination image on failure
1146            if (kNo_ZeroInitialized == opts.fZeroInitialized || !zeroFill) {
1147                void* dstStart = get_dst_start_row(dst, dstRowBytes, y, fRowOrder);
1148                SkSwizzler::Fill(dstStart, dstInfo, dstRowBytes, dstInfo.height() - y,
1149                        fillColorOrIndex, colorPtr);
1150            }
1151            return kIncompleteInput;
1152        }
1153
1154        // Decode the row in destination format
1155        uint32_t row;
1156        if (kTopDown_RowOrder == fRowOrder) {
1157            row = y;
1158        } else {
1159            row = height - 1 - y;
1160        }
1161
1162        swizzler->next(srcBuffer.get(), row);
1163        // FIXME: SkSwizzler::ResultAlpha r =
1164        //        swizzler->next(srcBuffer.get(), row);
1165        // FIXME: transparent &= SkSwizzler::IsTransparent(r);
1166    }
1167
1168    // FIXME: This code exists to match the behavior in the chromium decoder
1169    // and to follow the bmp specification as it relates to alpha masks.  It is
1170    // commented out because we have yet to discover a test image that provides
1171    // an alpha mask and uses this decode mode.
1172
1173    // Now we adjust the output image with some additional behavior that
1174    // SkSwizzler does not support.  Firstly, all bmp images that contain
1175    // alpha are masked by the alpha mask.  Secondly, many fully transparent
1176    // bmp images are intended to be opaque.  Here, we make those corrections
1177    // in the kN32 case.
1178    /*
1179    SkPMColor* dstRow = (SkPMColor*) dst;
1180    if (SkSwizzler::kBGRA == config) {
1181        for (int y = 0; y < height; y++) {
1182            for (int x = 0; x < width; x++) {
1183                if (transparent) {
1184                    dstRow[x] |= 0xFF000000;
1185                } else {
1186                    dstRow[x] &= alphaMask;
1187                }
1188                dstRow = SkTAddOffset<SkPMColor>(dstRow, dstRowBytes);
1189            }
1190        }
1191    }
1192    */
1193
1194    // Finally, apply the AND mask for bmp-in-ico images
1195    if (fIsIco) {
1196        // The AND mask is always 1 bit per pixel
1197        const size_t rowBytes = SkAlign4(compute_row_bytes(width, 1));
1198
1199        SkPMColor* dstPtr = (SkPMColor*) dst;
1200        for (int y = 0; y < height; y++) {
1201            // The srcBuffer will at least be large enough
1202            if (stream()->read(srcBuffer.get(), rowBytes) != rowBytes) {
1203                SkCodecPrintf("Warning: incomplete AND mask for bmp-in-ico.\n");
1204                return kIncompleteInput;
1205            }
1206
1207            int row;
1208            if (kBottomUp_RowOrder == fRowOrder) {
1209                row = height - y - 1;
1210            } else {
1211                row = y;
1212            }
1213
1214            SkPMColor* dstRow =
1215                    SkTAddOffset<SkPMColor>(dstPtr, row * dstRowBytes);
1216
1217            for (int x = 0; x < width; x++) {
1218                int quotient;
1219                int modulus;
1220                SkTDivMod(x, 8, &quotient, &modulus);
1221                uint32_t shift = 7 - modulus;
1222                uint32_t alphaBit =
1223                        (srcBuffer.get()[quotient] >> shift) & 0x1;
1224                dstRow[x] &= alphaBit - 1;
1225            }
1226        }
1227    }
1228
1229    // Finished decoding the entire image
1230    return kSuccess;
1231}
1232