File library for Bitmap images (*.bmp, *.dib). Currently supports only Windows V3 format with 24-bit-per-pixel color depth.
BMPFile.cpp@2:89b273c12b0a, 2015-03-05 (annotated)
- Committer:
- kayekss
- Date:
- Thu Mar 05 01:56:29 2015 +0000
- Revision:
- 2:89b273c12b0a
- Parent:
- 1:8cf4beca9695
- Child:
- 3:be3e831a86c1
Fixed wrong array index in function "red"
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kayekss | 0:4617bf407fe5 | 1 | // ==================================================== Mar 04 2015, kayeks == |
kayekss | 0:4617bf407fe5 | 2 | // BMPFile.cpp |
kayekss | 0:4617bf407fe5 | 3 | // =========================================================================== |
kayekss | 0:4617bf407fe5 | 4 | // File library for Bitmap images (*.bmp, *.dib). |
kayekss | 0:4617bf407fe5 | 5 | |
kayekss | 0:4617bf407fe5 | 6 | #include "BMPFile.h" |
kayekss | 0:4617bf407fe5 | 7 | |
kayekss | 0:4617bf407fe5 | 8 | const char* BMPFile::StatusString[] = { |
kayekss | 0:4617bf407fe5 | 9 | "Success", |
kayekss | 0:4617bf407fe5 | 10 | "NullFileName", |
kayekss | 0:4617bf407fe5 | 11 | "NoSuchFile", |
kayekss | 0:4617bf407fe5 | 12 | "NotABitmapFile", |
kayekss | 0:4617bf407fe5 | 13 | "UnsupportedFormat", |
kayekss | 0:4617bf407fe5 | 14 | "UnsupportedDepth", |
kayekss | 0:4617bf407fe5 | 15 | "AllocationFailed" |
kayekss | 0:4617bf407fe5 | 16 | }; |
kayekss | 0:4617bf407fe5 | 17 | const char* BMPFile::FormatString[] = { |
kayekss | 1:8cf4beca9695 | 18 | "OS2_V1", |
kayekss | 1:8cf4beca9695 | 19 | "OS2_V2", |
kayekss | 0:4617bf407fe5 | 20 | "Windows_V3", |
kayekss | 0:4617bf407fe5 | 21 | "Windows_V4", |
kayekss | 0:4617bf407fe5 | 22 | "Windows_V5", |
kayekss | 0:4617bf407fe5 | 23 | "Unknown" |
kayekss | 0:4617bf407fe5 | 24 | }; |
kayekss | 0:4617bf407fe5 | 25 | |
kayekss | 0:4617bf407fe5 | 26 | BMPFile::BMPFile(const char* filename) { |
kayekss | 0:4617bf407fe5 | 27 | FILE* fp; |
kayekss | 0:4617bf407fe5 | 28 | uint8_t buf8[2]; |
kayekss | 0:4617bf407fe5 | 29 | uint16_t buf16[2]; |
kayekss | 0:4617bf407fe5 | 30 | uint32_t buf32[3]; |
kayekss | 1:8cf4beca9695 | 31 | |
kayekss | 0:4617bf407fe5 | 32 | status = Success; |
kayekss | 0:4617bf407fe5 | 33 | format = Unknown; |
kayekss | 0:4617bf407fe5 | 34 | fileSize = 0; |
kayekss | 1:8cf4beca9695 | 35 | paletteSize = 0; |
kayekss | 0:4617bf407fe5 | 36 | dataSize = 0; |
kayekss | 1:8cf4beca9695 | 37 | stride = 0; |
kayekss | 0:4617bf407fe5 | 38 | width = 0; |
kayekss | 0:4617bf407fe5 | 39 | height = 0; |
kayekss | 0:4617bf407fe5 | 40 | colorDepth = 0; |
kayekss | 1:8cf4beca9695 | 41 | palette = NULL; |
kayekss | 0:4617bf407fe5 | 42 | data = NULL; |
kayekss | 0:4617bf407fe5 | 43 | |
kayekss | 0:4617bf407fe5 | 44 | // Open file |
kayekss | 0:4617bf407fe5 | 45 | if (!filename) { |
kayekss | 0:4617bf407fe5 | 46 | status = NullFilename; |
kayekss | 0:4617bf407fe5 | 47 | return; |
kayekss | 0:4617bf407fe5 | 48 | } |
kayekss | 0:4617bf407fe5 | 49 | fp = fopen(filename, "rb"); |
kayekss | 0:4617bf407fe5 | 50 | if (!fp) { |
kayekss | 0:4617bf407fe5 | 51 | status = NoSuchFile; |
kayekss | 0:4617bf407fe5 | 52 | return; |
kayekss | 0:4617bf407fe5 | 53 | } |
kayekss | 0:4617bf407fe5 | 54 | |
kayekss | 0:4617bf407fe5 | 55 | // (0 +2) Magic number ("BM") |
kayekss | 0:4617bf407fe5 | 56 | fread(buf8, 1, 2, fp); |
kayekss | 0:4617bf407fe5 | 57 | if (buf8[0] != 'B' || buf8[1] != 'M') { |
kayekss | 0:4617bf407fe5 | 58 | status = NotABitmapFile; |
kayekss | 0:4617bf407fe5 | 59 | fclose(fp); |
kayekss | 0:4617bf407fe5 | 60 | return; |
kayekss | 0:4617bf407fe5 | 61 | } |
kayekss | 0:4617bf407fe5 | 62 | |
kayekss | 0:4617bf407fe5 | 63 | // (2 +4) File size |
kayekss | 0:4617bf407fe5 | 64 | // (6 +4) Reserved area |
kayekss | 0:4617bf407fe5 | 65 | // (10 +4) Image data offset (unconfirmed) |
kayekss | 0:4617bf407fe5 | 66 | fread(buf32, 4, 3, fp); |
kayekss | 0:4617bf407fe5 | 67 | fileSize = buf32[0]; |
kayekss | 0:4617bf407fe5 | 68 | |
kayekss | 0:4617bf407fe5 | 69 | // (14 +4) Header size |
kayekss | 0:4617bf407fe5 | 70 | fread(buf32, 4, 1, fp); |
kayekss | 0:4617bf407fe5 | 71 | switch (buf32[0]) { |
kayekss | 1:8cf4beca9695 | 72 | case 12: // OS/2 V1 format |
kayekss | 1:8cf4beca9695 | 73 | format = OS2_V1; |
kayekss | 1:8cf4beca9695 | 74 | break; |
kayekss | 1:8cf4beca9695 | 75 | case 64: // OS/2 V2 format |
kayekss | 1:8cf4beca9695 | 76 | format = OS2_V2; |
kayekss | 1:8cf4beca9695 | 77 | break; |
kayekss | 0:4617bf407fe5 | 78 | case 40: // Windows V3 format |
kayekss | 0:4617bf407fe5 | 79 | format = Windows_V3; |
kayekss | 0:4617bf407fe5 | 80 | break; |
kayekss | 0:4617bf407fe5 | 81 | case 108: // Windows V4 format |
kayekss | 0:4617bf407fe5 | 82 | format = Windows_V4; |
kayekss | 0:4617bf407fe5 | 83 | break; |
kayekss | 0:4617bf407fe5 | 84 | case 124: // Windows V5 format |
kayekss | 0:4617bf407fe5 | 85 | format = Windows_V5; |
kayekss | 0:4617bf407fe5 | 86 | break; |
kayekss | 0:4617bf407fe5 | 87 | default: |
kayekss | 0:4617bf407fe5 | 88 | format = Unknown; |
kayekss | 0:4617bf407fe5 | 89 | } |
kayekss | 0:4617bf407fe5 | 90 | |
kayekss | 0:4617bf407fe5 | 91 | switch (format) { |
kayekss | 1:8cf4beca9695 | 92 | case OS2_V1: |
kayekss | 1:8cf4beca9695 | 93 | // (18 +2) Bitmap width |
kayekss | 1:8cf4beca9695 | 94 | // (20 +2) Bitmap height |
kayekss | 1:8cf4beca9695 | 95 | fread(buf16, 4, 2, fp); |
kayekss | 1:8cf4beca9695 | 96 | width = (uint32_t) buf16[0]; |
kayekss | 1:8cf4beca9695 | 97 | height = (uint32_t) buf16[1]; |
kayekss | 1:8cf4beca9695 | 98 | |
kayekss | 1:8cf4beca9695 | 99 | // (22 +2) Number of planes (unconfirmed) |
kayekss | 1:8cf4beca9695 | 100 | // (24 +2) Color depth |
kayekss | 1:8cf4beca9695 | 101 | fread(buf16, 2, 2, fp); |
kayekss | 1:8cf4beca9695 | 102 | colorDepth = buf16[1]; |
kayekss | 1:8cf4beca9695 | 103 | switch (colorDepth) { |
kayekss | 1:8cf4beca9695 | 104 | case 1: case 4: case 8: |
kayekss | 1:8cf4beca9695 | 105 | paletteSize = paletteElemSize(format) * (1ul << colorDepth); |
kayekss | 1:8cf4beca9695 | 106 | break; |
kayekss | 1:8cf4beca9695 | 107 | case 16: case 24: case 32: // No palette |
kayekss | 1:8cf4beca9695 | 108 | paletteSize = 0; |
kayekss | 1:8cf4beca9695 | 109 | break; |
kayekss | 1:8cf4beca9695 | 110 | default: |
kayekss | 1:8cf4beca9695 | 111 | paletteSize = 0; |
kayekss | 1:8cf4beca9695 | 112 | status = UnsupportedDepth; |
kayekss | 1:8cf4beca9695 | 113 | fclose(fp); |
kayekss | 1:8cf4beca9695 | 114 | return; |
kayekss | 1:8cf4beca9695 | 115 | } |
kayekss | 1:8cf4beca9695 | 116 | break; |
kayekss | 0:4617bf407fe5 | 117 | case Windows_V3: |
kayekss | 0:4617bf407fe5 | 118 | // (18 +4) Bitmap width |
kayekss | 0:4617bf407fe5 | 119 | // (22 +4) Bitmap height |
kayekss | 0:4617bf407fe5 | 120 | fread(buf32, 4, 2, fp); |
kayekss | 0:4617bf407fe5 | 121 | width = buf32[0]; |
kayekss | 0:4617bf407fe5 | 122 | height = buf32[1]; |
kayekss | 0:4617bf407fe5 | 123 | |
kayekss | 0:4617bf407fe5 | 124 | // (26 +2) Number of planes (unconfirmed) |
kayekss | 0:4617bf407fe5 | 125 | // (28 +2) Color depth |
kayekss | 0:4617bf407fe5 | 126 | fread(buf16, 2, 2, fp); |
kayekss | 0:4617bf407fe5 | 127 | colorDepth = buf16[1]; |
kayekss | 1:8cf4beca9695 | 128 | switch (colorDepth) { |
kayekss | 1:8cf4beca9695 | 129 | case 1: case 4: case 8: |
kayekss | 1:8cf4beca9695 | 130 | paletteSize = paletteElemSize(format) * (1ul << colorDepth); |
kayekss | 1:8cf4beca9695 | 131 | break; |
kayekss | 1:8cf4beca9695 | 132 | case 16: case 24: case 32: // No palette |
kayekss | 1:8cf4beca9695 | 133 | paletteSize = 0; |
kayekss | 1:8cf4beca9695 | 134 | break; |
kayekss | 1:8cf4beca9695 | 135 | default: |
kayekss | 1:8cf4beca9695 | 136 | paletteSize = 0; |
kayekss | 0:4617bf407fe5 | 137 | status = UnsupportedDepth; |
kayekss | 0:4617bf407fe5 | 138 | fclose(fp); |
kayekss | 0:4617bf407fe5 | 139 | return; |
kayekss | 0:4617bf407fe5 | 140 | } |
kayekss | 0:4617bf407fe5 | 141 | |
kayekss | 0:4617bf407fe5 | 142 | // (30 +4) Compression method (unconfirmed) |
kayekss | 0:4617bf407fe5 | 143 | // (34 +4) Bitmap data size (unconfirmed) |
kayekss | 0:4617bf407fe5 | 144 | // (38 +4) Horizontal resolution (unused) |
kayekss | 0:4617bf407fe5 | 145 | // (42 +4) Vertical resolution (unconfirmed) |
kayekss | 0:4617bf407fe5 | 146 | // (46 +4) Colors (unconfirmed) |
kayekss | 0:4617bf407fe5 | 147 | // (50 +4) Important colors (unconfirmed) |
kayekss | 0:4617bf407fe5 | 148 | fread(buf32, 4, 3, fp); |
kayekss | 0:4617bf407fe5 | 149 | fread(buf32, 4, 3, fp); |
kayekss | 0:4617bf407fe5 | 150 | break; |
kayekss | 1:8cf4beca9695 | 151 | case OS2_V2: |
kayekss | 0:4617bf407fe5 | 152 | case Windows_V4: |
kayekss | 0:4617bf407fe5 | 153 | case Windows_V5: |
kayekss | 0:4617bf407fe5 | 154 | case Unknown: |
kayekss | 0:4617bf407fe5 | 155 | status = UnsupportedFormat; |
kayekss | 0:4617bf407fe5 | 156 | fclose(fp); |
kayekss | 0:4617bf407fe5 | 157 | return; |
kayekss | 0:4617bf407fe5 | 158 | } |
kayekss | 1:8cf4beca9695 | 159 | |
kayekss | 1:8cf4beca9695 | 160 | // Allocate palette space if needed |
kayekss | 1:8cf4beca9695 | 161 | if (paletteSize) { |
kayekss | 1:8cf4beca9695 | 162 | palette = new uint8_t[paletteSize]; |
kayekss | 1:8cf4beca9695 | 163 | |
kayekss | 1:8cf4beca9695 | 164 | // Read palette data |
kayekss | 1:8cf4beca9695 | 165 | fread(palette, 1, paletteSize, fp); |
kayekss | 1:8cf4beca9695 | 166 | } |
kayekss | 0:4617bf407fe5 | 167 | |
kayekss | 1:8cf4beca9695 | 168 | // Calculate stride / data length |
kayekss | 1:8cf4beca9695 | 169 | if (colorDepth == 1) { |
kayekss | 1:8cf4beca9695 | 170 | stride = ALIGN_BY_4((width + 7) / 8); |
kayekss | 1:8cf4beca9695 | 171 | } else if (colorDepth == 4) { |
kayekss | 1:8cf4beca9695 | 172 | stride = ALIGN_BY_4((width + 1) / 2); |
kayekss | 1:8cf4beca9695 | 173 | } else { |
kayekss | 1:8cf4beca9695 | 174 | // Color depth: 8, 16, 24, 32 |
kayekss | 1:8cf4beca9695 | 175 | stride = ALIGN_BY_4(width * colorDepth / 8); |
kayekss | 1:8cf4beca9695 | 176 | } |
kayekss | 1:8cf4beca9695 | 177 | dataSize = stride * height; |
kayekss | 0:4617bf407fe5 | 178 | |
kayekss | 0:4617bf407fe5 | 179 | // Allocate data space |
kayekss | 0:4617bf407fe5 | 180 | data = new uint8_t[dataSize]; |
kayekss | 0:4617bf407fe5 | 181 | |
kayekss | 0:4617bf407fe5 | 182 | // Read bitmap data |
kayekss | 0:4617bf407fe5 | 183 | fread(data, 1, dataSize, fp); |
kayekss | 0:4617bf407fe5 | 184 | |
kayekss | 0:4617bf407fe5 | 185 | fclose(fp); |
kayekss | 0:4617bf407fe5 | 186 | } |
kayekss | 0:4617bf407fe5 | 187 | |
kayekss | 0:4617bf407fe5 | 188 | BMPFile::~BMPFile() { |
kayekss | 1:8cf4beca9695 | 189 | if (palette) { |
kayekss | 1:8cf4beca9695 | 190 | delete[] palette; |
kayekss | 1:8cf4beca9695 | 191 | } |
kayekss | 0:4617bf407fe5 | 192 | if (data) { |
kayekss | 0:4617bf407fe5 | 193 | delete[] data; |
kayekss | 0:4617bf407fe5 | 194 | } |
kayekss | 0:4617bf407fe5 | 195 | } |
kayekss | 1:8cf4beca9695 | 196 | |
kayekss | 1:8cf4beca9695 | 197 | uint32_t BMPFile::paletteElemSize(BMPFile::Format format) { |
kayekss | 1:8cf4beca9695 | 198 | switch (format) { |
kayekss | 1:8cf4beca9695 | 199 | case OS2_V1: case OS2_V2: |
kayekss | 1:8cf4beca9695 | 200 | // BGR888 |
kayekss | 1:8cf4beca9695 | 201 | return 3; |
kayekss | 1:8cf4beca9695 | 202 | case Windows_V3: case Windows_V4: case Windows_V5: |
kayekss | 1:8cf4beca9695 | 203 | // BGRX8888 |
kayekss | 1:8cf4beca9695 | 204 | return 4; |
kayekss | 1:8cf4beca9695 | 205 | default: |
kayekss | 1:8cf4beca9695 | 206 | return 0; |
kayekss | 1:8cf4beca9695 | 207 | } |
kayekss | 1:8cf4beca9695 | 208 | } |
kayekss | 1:8cf4beca9695 | 209 | |
kayekss | 1:8cf4beca9695 | 210 | int32_t BMPFile::paletteRed(uint8_t index) { |
kayekss | 1:8cf4beca9695 | 211 | if (!palette) { |
kayekss | 1:8cf4beca9695 | 212 | return -1; |
kayekss | 1:8cf4beca9695 | 213 | } |
kayekss | 1:8cf4beca9695 | 214 | switch (colorDepth) { |
kayekss | 1:8cf4beca9695 | 215 | case 1: case 4: case 8: |
kayekss | 1:8cf4beca9695 | 216 | if (index >= 1ul << colorDepth) { |
kayekss | 1:8cf4beca9695 | 217 | return -1; |
kayekss | 1:8cf4beca9695 | 218 | } else { |
kayekss | 1:8cf4beca9695 | 219 | return palette[paletteElemSize(format) * index + 2]; |
kayekss | 1:8cf4beca9695 | 220 | } |
kayekss | 1:8cf4beca9695 | 221 | default: |
kayekss | 1:8cf4beca9695 | 222 | return -1; |
kayekss | 1:8cf4beca9695 | 223 | } |
kayekss | 1:8cf4beca9695 | 224 | } |
kayekss | 1:8cf4beca9695 | 225 | |
kayekss | 1:8cf4beca9695 | 226 | int32_t BMPFile::paletteGreen(uint8_t index) { |
kayekss | 1:8cf4beca9695 | 227 | if (!palette) { |
kayekss | 1:8cf4beca9695 | 228 | return -1; |
kayekss | 1:8cf4beca9695 | 229 | } |
kayekss | 1:8cf4beca9695 | 230 | switch (colorDepth) { |
kayekss | 1:8cf4beca9695 | 231 | case 1: case 4: case 8: |
kayekss | 1:8cf4beca9695 | 232 | if (index >= 1ul << colorDepth) { |
kayekss | 1:8cf4beca9695 | 233 | return -1; |
kayekss | 1:8cf4beca9695 | 234 | } else { |
kayekss | 1:8cf4beca9695 | 235 | return palette[paletteElemSize(format) * index + 1]; |
kayekss | 1:8cf4beca9695 | 236 | } |
kayekss | 1:8cf4beca9695 | 237 | default: |
kayekss | 1:8cf4beca9695 | 238 | return -1; |
kayekss | 1:8cf4beca9695 | 239 | } |
kayekss | 1:8cf4beca9695 | 240 | } |
kayekss | 1:8cf4beca9695 | 241 | |
kayekss | 1:8cf4beca9695 | 242 | int32_t BMPFile::paletteBlue(uint8_t index) { |
kayekss | 1:8cf4beca9695 | 243 | if (!palette) { |
kayekss | 1:8cf4beca9695 | 244 | return -1; |
kayekss | 1:8cf4beca9695 | 245 | } |
kayekss | 1:8cf4beca9695 | 246 | switch (colorDepth) { |
kayekss | 1:8cf4beca9695 | 247 | case 1: case 4: case 8: |
kayekss | 1:8cf4beca9695 | 248 | if (index >= 1ul << colorDepth) { |
kayekss | 1:8cf4beca9695 | 249 | return -1; |
kayekss | 1:8cf4beca9695 | 250 | } else { |
kayekss | 1:8cf4beca9695 | 251 | return palette[paletteElemSize(format) * index]; |
kayekss | 1:8cf4beca9695 | 252 | } |
kayekss | 1:8cf4beca9695 | 253 | default: |
kayekss | 1:8cf4beca9695 | 254 | return -1; |
kayekss | 1:8cf4beca9695 | 255 | } |
kayekss | 1:8cf4beca9695 | 256 | } |
kayekss | 1:8cf4beca9695 | 257 | |
kayekss | 1:8cf4beca9695 | 258 | int32_t BMPFile::red(uint32_t x, uint32_t y) { |
kayekss | 1:8cf4beca9695 | 259 | if (x >= width || y >= height) { |
kayekss | 1:8cf4beca9695 | 260 | return -1; |
kayekss | 1:8cf4beca9695 | 261 | } |
kayekss | 1:8cf4beca9695 | 262 | if (!data) { |
kayekss | 1:8cf4beca9695 | 263 | return -1; |
kayekss | 1:8cf4beca9695 | 264 | } |
kayekss | 1:8cf4beca9695 | 265 | switch (colorDepth) { |
kayekss | 1:8cf4beca9695 | 266 | case 1: // Indexed from palette |
kayekss | 1:8cf4beca9695 | 267 | return paletteRed((data[stride * y + x / 8] >> 7 - x % 8) & 0x01); |
kayekss | 1:8cf4beca9695 | 268 | case 4: // Indexed from palette |
kayekss | 1:8cf4beca9695 | 269 | return paletteRed((data[stride * y + x / 2] >> 4 * (1 - x % 2)) & 0x0f); |
kayekss | 1:8cf4beca9695 | 270 | case 8: // Indexed from palette |
kayekss | 1:8cf4beca9695 | 271 | return paletteRed(data[stride * y + x]); |
kayekss | 1:8cf4beca9695 | 272 | case 16: // BGR565 (bbbbbggg:gggrrrrr) |
kayekss | 1:8cf4beca9695 | 273 | return data[stride * y + 2 * x + 1] & 0x1f; |
kayekss | 1:8cf4beca9695 | 274 | case 24: // BGR888 |
kayekss | 2:89b273c12b0a | 275 | return data[stride * y + 3 * x + 2]; |
kayekss | 1:8cf4beca9695 | 276 | case 32: // BGRX8888 |
kayekss | 2:89b273c12b0a | 277 | return data[stride * y + 4 * x + 2]; |
kayekss | 1:8cf4beca9695 | 278 | default: |
kayekss | 1:8cf4beca9695 | 279 | return -1; |
kayekss | 1:8cf4beca9695 | 280 | } |
kayekss | 1:8cf4beca9695 | 281 | } |
kayekss | 1:8cf4beca9695 | 282 | |
kayekss | 1:8cf4beca9695 | 283 | int32_t BMPFile::green(uint32_t x, uint32_t y) { |
kayekss | 1:8cf4beca9695 | 284 | if (x >= width || y >= height) { |
kayekss | 1:8cf4beca9695 | 285 | return -1; |
kayekss | 1:8cf4beca9695 | 286 | } |
kayekss | 1:8cf4beca9695 | 287 | if (!data) { |
kayekss | 1:8cf4beca9695 | 288 | return -1; |
kayekss | 1:8cf4beca9695 | 289 | } |
kayekss | 1:8cf4beca9695 | 290 | switch (colorDepth) { |
kayekss | 1:8cf4beca9695 | 291 | case 1: // Indexed from palette |
kayekss | 1:8cf4beca9695 | 292 | return paletteGreen((data[stride * y + x / 8] >> 7 - x % 8) & 0x01); |
kayekss | 1:8cf4beca9695 | 293 | case 4: // Indexed from palette |
kayekss | 1:8cf4beca9695 | 294 | return paletteGreen((data[stride * y + x / 2] >> 4 * (1 - x % 2)) & 0x0f); |
kayekss | 1:8cf4beca9695 | 295 | case 8: // Indexed from palette |
kayekss | 1:8cf4beca9695 | 296 | return paletteGreen(data[stride * y + x]); |
kayekss | 1:8cf4beca9695 | 297 | case 16: // BGR565 (bbbbbggg:gggrrrrr) |
kayekss | 1:8cf4beca9695 | 298 | return (data[stride * y + 2 * x] & 0x07) << 3 |
kayekss | 1:8cf4beca9695 | 299 | | data[stride * y + 2 * x + 1] >> 5; |
kayekss | 1:8cf4beca9695 | 300 | case 24: // BGR888 |
kayekss | 1:8cf4beca9695 | 301 | return data[stride * y + 3 * x + 1]; |
kayekss | 1:8cf4beca9695 | 302 | case 32: // BGRX8888 |
kayekss | 1:8cf4beca9695 | 303 | return data[stride * y + 4 * x + 1]; |
kayekss | 1:8cf4beca9695 | 304 | default: |
kayekss | 1:8cf4beca9695 | 305 | return -1; |
kayekss | 1:8cf4beca9695 | 306 | } |
kayekss | 1:8cf4beca9695 | 307 | } |
kayekss | 1:8cf4beca9695 | 308 | |
kayekss | 1:8cf4beca9695 | 309 | int32_t BMPFile::blue(uint32_t x, uint32_t y) { |
kayekss | 1:8cf4beca9695 | 310 | if (x >= width || y >= height) { |
kayekss | 1:8cf4beca9695 | 311 | return -1; |
kayekss | 1:8cf4beca9695 | 312 | } |
kayekss | 1:8cf4beca9695 | 313 | if (!data) { |
kayekss | 1:8cf4beca9695 | 314 | return -1; |
kayekss | 1:8cf4beca9695 | 315 | } |
kayekss | 1:8cf4beca9695 | 316 | switch (colorDepth) { |
kayekss | 1:8cf4beca9695 | 317 | case 1: // Indexed from palette |
kayekss | 1:8cf4beca9695 | 318 | return paletteBlue((data[stride * y + x / 8] >> 7 - x % 8) & 0x01); |
kayekss | 1:8cf4beca9695 | 319 | case 4: // Indexed from palette |
kayekss | 1:8cf4beca9695 | 320 | return paletteBlue((data[stride * y + x / 2] >> 4 * (1 - x % 2)) & 0x0f); |
kayekss | 1:8cf4beca9695 | 321 | case 8: // Indexed from palette |
kayekss | 1:8cf4beca9695 | 322 | return paletteBlue(data[stride * y + x]); |
kayekss | 1:8cf4beca9695 | 323 | case 16: // RGB565 (bbbbbggg:gggrrrrr) |
kayekss | 1:8cf4beca9695 | 324 | return data[stride * y + 2 * x] >> 3; |
kayekss | 1:8cf4beca9695 | 325 | case 24: // BGR888 |
kayekss | 1:8cf4beca9695 | 326 | return data[stride * y + 3 * x]; |
kayekss | 1:8cf4beca9695 | 327 | case 32: // BGRX8888 |
kayekss | 1:8cf4beca9695 | 328 | return data[stride * y + 4 * x]; |
kayekss | 1:8cf4beca9695 | 329 | default: |
kayekss | 1:8cf4beca9695 | 330 | return -1; |
kayekss | 1:8cf4beca9695 | 331 | } |
kayekss | 1:8cf4beca9695 | 332 | } |