Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1491)

Side by Side Diff: Source/platform/image-decoders/bmp/BMPImageReader.h

Issue 279433002: BMP-in-ICO should respect alpha in Windows V3 32bpp RGB bitmaps. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | Source/platform/image-decoders/bmp/BMPImageReader.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2008, 2009, Google Inc. All rights reserved. 2 * Copyright (c) 2008, 2009, Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 #if CPU(BIG_ENDIAN) 61 #if CPU(BIG_ENDIAN)
62 result = ((result & 0xff) << 24) | ((result & 0xff00) << 8) | ((result & 0xff0000) >> 8) | ((result & 0xff000000) >> 24); 62 result = ((result & 0xff) << 24) | ((result & 0xff00) << 8) | ((result & 0xff0000) >> 8) | ((result & 0xff000000) >> 24);
63 #endif 63 #endif
64 return result; 64 return result;
65 } 65 }
66 66
67 // |parent| is the decoder that owns us. 67 // |parent| is the decoder that owns us.
68 // |startOffset| points to the start of the BMP within the file. 68 // |startOffset| points to the start of the BMP within the file.
69 // |buffer| points at an empty ImageFrame that we'll initialize and 69 // |buffer| points at an empty ImageFrame that we'll initialize and
70 // fill with decoded data. 70 // fill with decoded data.
71 BMPImageReader(ImageDecoder* parent, size_t decodedAndHeaderOffset, size_t i mgDataOffset, bool usesAndMask); 71 BMPImageReader(ImageDecoder* parent, size_t decodedAndHeaderOffset, size_t i mgDataOffset, bool m_isInICO);
Stephen White 2014/05/07 22:38:55 Spurious m_.
Peter Kasting 2014/05/07 22:41:29 Darn! Good catch. Will fix.
72 72
73 void setBuffer(ImageFrame* buffer) { m_buffer = buffer; } 73 void setBuffer(ImageFrame* buffer) { m_buffer = buffer; }
74 void setData(SharedBuffer* data) { m_data = data; } 74 void setData(SharedBuffer* data) { m_data = data; }
75 75
76 // Does the actual decoding. If |onlySize| is true, decoding only 76 // Does the actual decoding. If |onlySize| is true, decoding only
77 // progresses as far as necessary to get the image size. Returns 77 // progresses as far as necessary to get the image size. Returns
78 // whether decoding succeeded. 78 // whether decoding succeeded.
79 bool decodeBMP(bool onlySize); 79 bool decodeBMP(bool onlySize);
80 80
81 private: 81 private:
82 // The various BMP compression types. We don't currently decode all 82 // The various BMP compression types. We don't currently decode all
83 // these. 83 // these.
84 enum CompressionType { 84 enum CompressionType {
85 // Universal types 85 // Universal types
86 RGB = 0, 86 RGB = 0,
87 RLE8 = 1, 87 RLE8 = 1,
88 RLE4 = 2, 88 RLE4 = 2,
89 // Windows V3+ only 89 // Windows V3+ only
90 BITFIELDS = 3, 90 BITFIELDS = 3,
91 JPEG = 4, 91 JPEG = 4,
92 PNG = 5, 92 PNG = 5,
93 // OS/2 2.x-only 93 // OS/2 2.x-only
94 HUFFMAN1D, // Stored in file as 3 94 HUFFMAN1D, // Stored in file as 3
95 RLE24, // Stored in file as 4 95 RLE24, // Stored in file as 4
96 }; 96 };
97 enum AndMaskState {
98 None,
99 NotYetDecoded,
100 Decoding,
101 };
102 enum ProcessingResult { 97 enum ProcessingResult {
103 Success, 98 Success,
104 Failure, 99 Failure,
105 InsufficientData, 100 InsufficientData,
106 }; 101 };
107 102
108 // These are based on the Windows BITMAPINFOHEADER and RGBTRIPLE 103 // These are based on the Windows BITMAPINFOHEADER and RGBTRIPLE
109 // structs, but with unnecessary entries removed. 104 // structs, but with unnecessary entries removed.
110 struct BitmapInfoHeader { 105 struct BitmapInfoHeader {
111 uint32_t biSize; 106 uint32_t biSize;
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 331
337 // The coordinate to which we've decoded the image. 332 // The coordinate to which we've decoded the image.
338 IntPoint m_coord; 333 IntPoint m_coord;
339 334
340 // Variables that track whether we've seen pixels with alpha values != 0 335 // Variables that track whether we've seen pixels with alpha values != 0
341 // and == 0, respectively. See comments in processNonRLEData() on how 336 // and == 0, respectively. See comments in processNonRLEData() on how
342 // these are used. 337 // these are used.
343 bool m_seenNonZeroAlphaPixel; 338 bool m_seenNonZeroAlphaPixel;
344 bool m_seenZeroAlphaPixel; 339 bool m_seenZeroAlphaPixel;
345 340
341 // BMPs-in-ICOs have a few differences from standalone BMPs, so we need to
342 // know if we're in an ICO container.
343 bool m_isInICO;
344
346 // ICOs store a 1bpp "mask" immediately after the main bitmap image data 345 // ICOs store a 1bpp "mask" immediately after the main bitmap image data
347 // (and, confusingly, add its height to the biHeight value in the info 346 // (and, confusingly, add its height to the biHeight value in the info
348 // header, thus doubling it). This variable tracks whether we have such 347 // header, thus doubling it). If |m_isInICO| is true, this variable tracks
349 // a mask and if we've started decoding it yet. 348 // whether we've begun decoding this mask yet.
350 AndMaskState m_andMaskState; 349 bool m_decodingAndMask;
351 }; 350 };
352 351
353 } // namespace WebCore 352 } // namespace WebCore
354 353
355 #endif 354 #endif
OLDNEW
« no previous file with comments | « no previous file | Source/platform/image-decoders/bmp/BMPImageReader.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698