1 // 2 // Copyright (c) 2013 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 7 // imageformats.h: Defines image format types with functions for mip generation 8 // and copying. 9 10 #ifndef LIBGLESV2_RENDERER_IMAGEFORMATS_H_ 11 #define LIBGLESV2_RENDERER_IMAGEFORMATS_H_ 12 13 #include "common/mathutil.h" 14 15 namespace rx 16 { 17 18 // Several structures share functionality for reading, writing or mipmapping but the layout 19 // must match the texture format which the structure represents. If collapsing or typedefing 20 // structs in this header, make sure the functionality and memory layout is exactly the same. 21 22 struct L8 23 { 24 unsigned char L; 25 26 static void readColor(gl::ColorF *dst, const L8 *src) 27 { 28 const float lum = gl::normalizedToFloat(src->L); 29 dst->red = lum; 30 dst->green = lum; 31 dst->blue = lum; 32 dst->alpha = 1.0f; 33 } 34 35 static void writeColor(L8 *dst, const gl::ColorF *src) 36 { 37 dst->L = gl::floatToNormalized<unsigned char>((src->red + src->green + src->blue) / 3.0f); 38 } 39 40 static void average(L8 *dst, const L8 *src1, const L8 *src2) 41 { 42 dst->L = gl::average(src1->L, src2->L); 43 } 44 }; 45 46 struct R8 47 { 48 unsigned char R; 49 50 static void readColor(gl::ColorF *dst, const R8 *src) 51 { 52 dst->red = gl::normalizedToFloat(src->R); 53 dst->green = 0.0f; 54 dst->blue = 0.0f; 55 dst->alpha = 1.0f; 56 } 57 58 static void readColor(gl::ColorUI *dst, const R8 *src) 59 { 60 dst->red = src->R; 61 dst->green = 0; 62 dst->blue = 0; 63 dst->alpha = 1; 64 } 65 66 static void writeColor(R8 *dst, const gl::ColorF *src) 67 { 68 dst->R = gl::floatToNormalized<unsigned char>(src->red); 69 } 70 71 static void writeColor(R8 *dst, const gl::ColorUI *src) 72 { 73 dst->R = static_cast<unsigned char>(src->red); 74 } 75 76 static void average(R8 *dst, const R8 *src1, const R8 *src2) 77 { 78 dst->R = gl::average(src1->R, src2->R); 79 } 80 }; 81 82 struct A8 83 { 84 unsigned char A; 85 86 static void readColor(gl::ColorF *dst, const A8 *src) 87 { 88 dst->red = 0.0f; 89 dst->green = 0.0f; 90 dst->blue = 0.0f; 91 dst->alpha = gl::normalizedToFloat(src->A); 92 } 93 94 static void writeColor(A8 *dst, const gl::ColorF *src) 95 { 96 dst->A = gl::floatToNormalized<unsigned char>(src->alpha); 97 } 98 99 static void average(A8 *dst, const A8 *src1, const A8 *src2) 100 { 101 dst->A = gl::average(src1->A, src2->A); 102 } 103 }; 104 105 struct L8A8 106 { 107 unsigned char L; 108 unsigned char A; 109 110 static void readColor(gl::ColorF *dst, const L8A8 *src) 111 { 112 const float lum = gl::normalizedToFloat(src->L); 113 dst->red = lum; 114 dst->green = lum; 115 dst->blue = lum; 116 dst->alpha = gl::normalizedToFloat(src->A); 117 } 118 119 static void writeColor(L8A8 *dst, const gl::ColorF *src) 120 { 121 dst->L = gl::floatToNormalized<unsigned char>((src->red + src->green + src->blue) / 3.0f); 122 dst->A = gl::floatToNormalized<unsigned char>(src->alpha); 123 } 124 125 static void average(L8A8 *dst, const L8A8 *src1, const L8A8 *src2) 126 { 127 *(unsigned short*)dst = (((*(unsigned short*)src1 ^ *(unsigned short*)src2) & 0xFEFE) >> 1) + (*(unsigned short*)src1 & *(unsigned short*)src2); 128 } 129 }; 130 131 struct A8L8 132 { 133 unsigned char A; 134 unsigned char L; 135 136 static void readColor(gl::ColorF *dst, const A8L8 *src) 137 { 138 const float lum = gl::normalizedToFloat(src->L); 139 dst->red = lum; 140 dst->green = lum; 141 dst->blue = lum; 142 dst->alpha = gl::normalizedToFloat(src->A); 143 } 144 145 static void writeColor(A8L8 *dst, const gl::ColorF *src) 146 { 147 dst->L = gl::floatToNormalized<unsigned char>((src->red + src->green + src->blue) / 3.0f); 148 dst->A = gl::floatToNormalized<unsigned char>(src->alpha); 149 } 150 151 static void average(A8L8 *dst, const A8L8 *src1, const A8L8 *src2) 152 { 153 *(unsigned short*)dst = (((*(unsigned short*)src1 ^ *(unsigned short*)src2) & 0xFEFE) >> 1) + (*(unsigned short*)src1 & *(unsigned short*)src2); 154 } 155 }; 156 157 struct R8G8 158 { 159 unsigned char R; 160 unsigned char G; 161 162 static void readColor(gl::ColorF *dst, const R8G8 *src) 163 { 164 dst->red = gl::normalizedToFloat(src->R); 165 dst->green = gl::normalizedToFloat(src->G); 166 dst->blue = 0.0f; 167 dst->alpha = 1.0f; 168 } 169 170 static void readColor(gl::ColorUI *dst, const R8G8 *src) 171 { 172 dst->red = src->R; 173 dst->green = src->G; 174 dst->blue = 0; 175 dst->alpha = 1; 176 } 177 178 static void writeColor(R8G8 *dst, const gl::ColorF *src) 179 { 180 dst->R = gl::floatToNormalized<unsigned char>(src->red); 181 dst->G = gl::floatToNormalized<unsigned char>(src->green); 182 } 183 184 static void writeColor(R8G8 *dst, const gl::ColorUI *src) 185 { 186 dst->R = static_cast<unsigned char>(src->red); 187 dst->G = static_cast<unsigned char>(src->green); 188 } 189 190 static void average(R8G8 *dst, const R8G8 *src1, const R8G8 *src2) 191 { 192 *(unsigned short*)dst = (((*(unsigned short*)src1 ^ *(unsigned short*)src2) & 0xFEFE) >> 1) + (*(unsigned short*)src1 & *(unsigned short*)src2); 193 } 194 }; 195 196 struct R8G8B8 197 { 198 unsigned char R; 199 unsigned char G; 200 unsigned char B; 201 202 static void readColor(gl::ColorF *dst, const R8G8B8 *src) 203 { 204 dst->red = gl::normalizedToFloat(src->R); 205 dst->green = gl::normalizedToFloat(src->G); 206 dst->blue = gl::normalizedToFloat(src->B); 207 dst->alpha = 1.0f; 208 } 209 210 static void readColor(gl::ColorUI *dst, const R8G8B8 *src) 211 { 212 dst->red = src->R; 213 dst->green = src->G; 214 dst->blue = src->G; 215 dst->alpha = 1; 216 } 217 218 static void writeColor(R8G8B8 *dst, const gl::ColorF *src) 219 { 220 dst->R = gl::floatToNormalized<unsigned char>(src->red); 221 dst->G = gl::floatToNormalized<unsigned char>(src->green); 222 dst->B = gl::floatToNormalized<unsigned char>(src->blue); 223 } 224 225 static void writeColor(R8G8B8 *dst, const gl::ColorUI *src) 226 { 227 dst->R = static_cast<unsigned char>(src->red); 228 dst->G = static_cast<unsigned char>(src->green); 229 dst->B = static_cast<unsigned char>(src->blue); 230 } 231 232 static void average(R8G8B8 *dst, const R8G8B8 *src1, const R8G8B8 *src2) 233 { 234 dst->R = gl::average(src1->R, src2->R); 235 dst->G = gl::average(src1->G, src2->G); 236 dst->B = gl::average(src1->B, src2->B); 237 } 238 }; 239 240 struct B8G8R8 241 { 242 unsigned char B; 243 unsigned char G; 244 unsigned char R; 245 246 static void readColor(gl::ColorF *dst, const B8G8R8 *src) 247 { 248 dst->red = gl::normalizedToFloat(src->R); 249 dst->green = gl::normalizedToFloat(src->G); 250 dst->blue = gl::normalizedToFloat(src->B); 251 dst->alpha = 1.0f; 252 } 253 254 static void readColor(gl::ColorUI *dst, const B8G8R8 *src) 255 { 256 dst->red = src->R; 257 dst->green = src->G; 258 dst->blue = src->G; 259 dst->alpha = 1; 260 } 261 262 static void writeColor(B8G8R8 *dst, const gl::ColorF *src) 263 { 264 dst->R = gl::floatToNormalized<unsigned char>(src->red); 265 dst->G = gl::floatToNormalized<unsigned char>(src->green); 266 dst->B = gl::floatToNormalized<unsigned char>(src->blue); 267 } 268 269 static void writeColor(B8G8R8 *dst, const gl::ColorUI *src) 270 { 271 dst->R = static_cast<unsigned char>(src->red); 272 dst->G = static_cast<unsigned char>(src->green); 273 dst->B = static_cast<unsigned char>(src->blue); 274 } 275 276 static void average(B8G8R8 *dst, const B8G8R8 *src1, const B8G8R8 *src2) 277 { 278 dst->R = gl::average(src1->R, src2->R); 279 dst->G = gl::average(src1->G, src2->G); 280 dst->B = gl::average(src1->B, src2->B); 281 } 282 }; 283 284 struct R5G6B5 285 { 286 unsigned short RGB; 287 288 static void readColor(gl::ColorF *dst, const R5G6B5 *src) 289 { 290 dst->red = gl::normalizedToFloat<5>(gl::getShiftedData<5, 11>(src->RGB)); 291 dst->green = gl::normalizedToFloat<6>(gl::getShiftedData<6, 5>(src->RGB)); 292 dst->blue = gl::normalizedToFloat<5>(gl::getShiftedData<5, 0>(src->RGB)); 293 dst->alpha = 1.0f; 294 } 295 296 static void writeColor(R5G6B5 *dst, const gl::ColorF *src) 297 { 298 dst->RGB = gl::shiftData<5, 11>(gl::floatToNormalized<5, unsigned short>(src->red)) | 299 gl::shiftData<6, 5>(gl::floatToNormalized<6, unsigned short>(src->green)) | 300 gl::shiftData<5, 0>(gl::floatToNormalized<5, unsigned short>(src->blue)); 301 } 302 303 static void average(R5G6B5 *dst, const R5G6B5 *src1, const R5G6B5 *src2) 304 { 305 dst->RGB = gl::shiftData<5, 11>(gl::average(gl::getShiftedData<5, 11>(src1->RGB), gl::getShiftedData<5, 11>(src2->RGB))) | 306 gl::shiftData<6, 5>(gl::average(gl::getShiftedData<6, 5>(src1->RGB), gl::getShiftedData<6, 5>(src2->RGB))) | 307 gl::shiftData<5, 0>(gl::average(gl::getShiftedData<5, 0>(src1->RGB), gl::getShiftedData<5, 0>(src2->RGB))); 308 } 309 }; 310 311 struct A8R8G8B8 312 { 313 unsigned char A; 314 unsigned char R; 315 unsigned char G; 316 unsigned char B; 317 318 static void readColor(gl::ColorF *dst, const A8R8G8B8 *src) 319 { 320 dst->red = gl::normalizedToFloat(src->R); 321 dst->green = gl::normalizedToFloat(src->G); 322 dst->blue = gl::normalizedToFloat(src->B); 323 dst->alpha = gl::normalizedToFloat(src->A); 324 } 325 326 static void readColor(gl::ColorUI *dst, const A8R8G8B8 *src) 327 { 328 dst->red = src->R; 329 dst->green = src->G; 330 dst->blue = src->B; 331 dst->alpha = src->A; 332 } 333 334 static void writeColor(A8R8G8B8 *dst, const gl::ColorF *src) 335 { 336 dst->R = gl::floatToNormalized<unsigned char>(src->red); 337 dst->G = gl::floatToNormalized<unsigned char>(src->green); 338 dst->B = gl::floatToNormalized<unsigned char>(src->blue); 339 dst->A = gl::floatToNormalized<unsigned char>(src->alpha); 340 } 341 342 static void writeColor(A8R8G8B8 *dst, const gl::ColorUI *src) 343 { 344 dst->R = static_cast<unsigned char>(src->red); 345 dst->G = static_cast<unsigned char>(src->green); 346 dst->B = static_cast<unsigned char>(src->blue); 347 dst->A = static_cast<unsigned char>(src->alpha); 348 } 349 350 static void average(A8R8G8B8 *dst, const A8R8G8B8 *src1, const A8R8G8B8 *src2) 351 { 352 *(unsigned int*)dst = (((*(unsigned int*)src1 ^ *(unsigned int*)src2) & 0xFEFEFEFE) >> 1) + (*(unsigned int*)src1 & *(unsigned int*)src2); 353 } 354 }; 355 356 struct R8G8B8A8 357 { 358 unsigned char R; 359 unsigned char G; 360 unsigned char B; 361 unsigned char A; 362 363 static void readColor(gl::ColorF *dst, const R8G8B8A8 *src) 364 { 365 dst->red = gl::normalizedToFloat(src->R); 366 dst->green = gl::normalizedToFloat(src->G); 367 dst->blue = gl::normalizedToFloat(src->B); 368 dst->alpha = gl::normalizedToFloat(src->A); 369 } 370 371 static void readColor(gl::ColorUI *dst, const R8G8B8A8 *src) 372 { 373 dst->red = src->R; 374 dst->green = src->G; 375 dst->blue = src->B; 376 dst->alpha = src->A; 377 } 378 379 static void writeColor(R8G8B8A8 *dst, const gl::ColorF *src) 380 { 381 dst->R = gl::floatToNormalized<unsigned char>(src->red); 382 dst->G = gl::floatToNormalized<unsigned char>(src->green); 383 dst->B = gl::floatToNormalized<unsigned char>(src->blue); 384 dst->A = gl::floatToNormalized<unsigned char>(src->alpha); 385 } 386 387 static void writeColor(R8G8B8A8 *dst, const gl::ColorUI *src) 388 { 389 dst->R = static_cast<unsigned char>(src->red); 390 dst->G = static_cast<unsigned char>(src->green); 391 dst->B = static_cast<unsigned char>(src->blue); 392 dst->A = static_cast<unsigned char>(src->alpha); 393 } 394 395 static void average(R8G8B8A8 *dst, const R8G8B8A8 *src1, const R8G8B8A8 *src2) 396 { 397 *(unsigned int*)dst = (((*(unsigned int*)src1 ^ *(unsigned int*)src2) & 0xFEFEFEFE) >> 1) + (*(unsigned int*)src1 & *(unsigned int*)src2); 398 } 399 }; 400 401 struct B8G8R8A8 402 { 403 unsigned char B; 404 unsigned char G; 405 unsigned char R; 406 unsigned char A; 407 408 static void readColor(gl::ColorF *dst, const B8G8R8A8 *src) 409 { 410 dst->red = gl::normalizedToFloat(src->R); 411 dst->green = gl::normalizedToFloat(src->G); 412 dst->blue = gl::normalizedToFloat(src->B); 413 dst->alpha = gl::normalizedToFloat(src->A); 414 } 415 416 static void readColor(gl::ColorUI *dst, const B8G8R8A8 *src) 417 { 418 dst->red = src->R; 419 dst->green = src->G; 420 dst->blue = src->B; 421 dst->alpha = src->A; 422 } 423 424 static void writeColor(B8G8R8A8 *dst, const gl::ColorF *src) 425 { 426 dst->R = gl::floatToNormalized<unsigned char>(src->red); 427 dst->G = gl::floatToNormalized<unsigned char>(src->green); 428 dst->B = gl::floatToNormalized<unsigned char>(src->blue); 429 dst->A = gl::floatToNormalized<unsigned char>(src->alpha); 430 } 431 432 static void writeColor(B8G8R8A8 *dst, const gl::ColorUI *src) 433 { 434 dst->R = static_cast<unsigned char>(src->red); 435 dst->G = static_cast<unsigned char>(src->green); 436 dst->B = static_cast<unsigned char>(src->blue); 437 dst->A = static_cast<unsigned char>(src->alpha); 438 } 439 440 static void average(B8G8R8A8 *dst, const B8G8R8A8 *src1, const B8G8R8A8 *src2) 441 { 442 *(unsigned int*)dst = (((*(unsigned int*)src1 ^ *(unsigned int*)src2) & 0xFEFEFEFE) >> 1) + (*(unsigned int*)src1 & *(unsigned int*)src2); 443 } 444 }; 445 446 struct B8G8R8X8 447 { 448 unsigned char B; 449 unsigned char G; 450 unsigned char R; 451 unsigned char X; 452 453 static void readColor(gl::ColorF *dst, const B8G8R8X8 *src) 454 { 455 dst->red = gl::normalizedToFloat(src->R); 456 dst->green = gl::normalizedToFloat(src->G); 457 dst->blue = gl::normalizedToFloat(src->B); 458 dst->alpha = 1.0f; 459 } 460 461 static void readColor(gl::ColorUI *dst, const B8G8R8X8 *src) 462 { 463 dst->red = src->R; 464 dst->green = src->G; 465 dst->blue = src->B; 466 dst->alpha = 1; 467 } 468 469 static void writeColor(B8G8R8X8 *dst, const gl::ColorF *src) 470 { 471 dst->R = gl::floatToNormalized<unsigned char>(src->red); 472 dst->G = gl::floatToNormalized<unsigned char>(src->green); 473 dst->B = gl::floatToNormalized<unsigned char>(src->blue); 474 dst->X = 255; 475 } 476 477 static void writeColor(B8G8R8X8 *dst, const gl::ColorUI *src) 478 { 479 dst->R = static_cast<unsigned char>(src->red); 480 dst->G = static_cast<unsigned char>(src->green); 481 dst->B = static_cast<unsigned char>(src->blue); 482 dst->X = 255; 483 } 484 485 static void average(B8G8R8X8 *dst, const B8G8R8X8 *src1, const B8G8R8X8 *src2) 486 { 487 *(unsigned int*)dst = (((*(unsigned int*)src1 ^ *(unsigned int*)src2) & 0xFEFEFEFE) >> 1) + (*(unsigned int*)src1 & *(unsigned int*)src2); 488 dst->X = 255; 489 } 490 }; 491 492 struct B5G5R5A1 493 { 494 unsigned short BGRA; 495 496 static void readColor(gl::ColorF *dst, const B5G5R5A1 *src) 497 { 498 dst->alpha = gl::normalizedToFloat<1>(gl::getShiftedData<1, 15>(src->BGRA)); 499 dst->red = gl::normalizedToFloat<5>(gl::getShiftedData<5, 10>(src->BGRA)); 500 dst->green = gl::normalizedToFloat<5>(gl::getShiftedData<5, 5>(src->BGRA)); 501 dst->blue = gl::normalizedToFloat<5>(gl::getShiftedData<5, 0>(src->BGRA)); 502 } 503 504 static void writeColor(B5G5R5A1 *dst, const gl::ColorF *src) 505 { 506 dst->BGRA = gl::shiftData<1, 15>(gl::floatToNormalized<1, unsigned short>(src->alpha)) | 507 gl::shiftData<5, 10>(gl::floatToNormalized<5, unsigned short>(src->red)) | 508 gl::shiftData<5, 5>(gl::floatToNormalized<5, unsigned short>(src->green)) | 509 gl::shiftData<5, 0>(gl::floatToNormalized<5, unsigned short>(src->blue)); 510 } 511 512 static void average(B5G5R5A1 *dst, const B5G5R5A1 *src1, const B5G5R5A1 *src2) 513 { 514 dst->BGRA = gl::shiftData<1, 15>(gl::average(gl::getShiftedData<1, 15>(src1->BGRA), gl::getShiftedData<1, 15>(src2->BGRA))) | 515 gl::shiftData<5, 10>(gl::average(gl::getShiftedData<5, 10>(src1->BGRA), gl::getShiftedData<5, 10>(src2->BGRA))) | 516 gl::shiftData<5, 5>(gl::average(gl::getShiftedData<5, 5>(src1->BGRA), gl::getShiftedData<5, 5>(src2->BGRA))) | 517 gl::shiftData<5, 0>(gl::average(gl::getShiftedData<5, 0>(src1->BGRA), gl::getShiftedData<5, 0>(src2->BGRA))); 518 } 519 }; 520 521 struct R5G5B5A1 522 { 523 unsigned short RGBA; 524 525 static void readColor(gl::ColorF *dst, const R5G5B5A1 *src) 526 { 527 dst->alpha = gl::normalizedToFloat<1>(gl::getShiftedData<1, 15>(src->RGBA)); 528 dst->blue = gl::normalizedToFloat<5>(gl::getShiftedData<5, 10>(src->RGBA)); 529 dst->green = gl::normalizedToFloat<5>(gl::getShiftedData<5, 5>(src->RGBA)); 530 dst->red = gl::normalizedToFloat<5>(gl::getShiftedData<5, 0>(src->RGBA)); 531 } 532 533 static void writeColor(R5G5B5A1 *dst, const gl::ColorF *src) 534 { 535 dst->RGBA = gl::shiftData<1, 15>(gl::floatToNormalized<1, unsigned short>(src->alpha)) | 536 gl::shiftData<5, 10>(gl::floatToNormalized<5, unsigned short>(src->blue)) | 537 gl::shiftData<5, 5>(gl::floatToNormalized<5, unsigned short>(src->green)) | 538 gl::shiftData<5, 0>(gl::floatToNormalized<5, unsigned short>(src->red)); 539 } 540 541 static void average(R5G5B5A1 *dst, const R5G5B5A1 *src1, const R5G5B5A1 *src2) 542 { 543 dst->RGBA = gl::shiftData<1, 15>(gl::average(gl::getShiftedData<1, 15>(src1->RGBA), gl::getShiftedData<1, 15>(src2->RGBA))) | 544 gl::shiftData<5, 10>(gl::average(gl::getShiftedData<5, 10>(src1->RGBA), gl::getShiftedData<5, 10>(src2->RGBA))) | 545 gl::shiftData<5, 5>(gl::average(gl::getShiftedData<5, 5>(src1->RGBA), gl::getShiftedData<5, 5>(src2->RGBA))) | 546 gl::shiftData<5, 0>(gl::average(gl::getShiftedData<5, 0>(src1->RGBA), gl::getShiftedData<5, 0>(src2->RGBA))); 547 } 548 }; 549 550 struct R4G4B4A4 551 { 552 unsigned char R : 4; 553 unsigned char G : 4; 554 unsigned char B : 4; 555 unsigned char A : 4; 556 557 static void readColor(gl::ColorF *dst, const R4G4B4A4 *src) 558 { 559 dst->red = gl::normalizedToFloat<4>(src->R); 560 dst->green = gl::normalizedToFloat<4>(src->G); 561 dst->blue = gl::normalizedToFloat<4>(src->B); 562 dst->alpha = gl::normalizedToFloat<4>(src->A); 563 } 564 565 static void writeColor(R4G4B4A4 *dst, const gl::ColorF *src) 566 { 567 dst->R = gl::floatToNormalized<4, unsigned char>(src->red); 568 dst->G = gl::floatToNormalized<4, unsigned char>(src->green); 569 dst->B = gl::floatToNormalized<4, unsigned char>(src->blue); 570 dst->A = gl::floatToNormalized<4, unsigned char>(src->alpha); 571 } 572 573 static void average(R4G4B4A4 *dst, const R4G4B4A4 *src1, const R4G4B4A4 *src2) 574 { 575 dst->R = gl::average(src1->R, src2->R); 576 dst->G = gl::average(src1->G, src2->G); 577 dst->B = gl::average(src1->B, src2->B); 578 dst->A = gl::average(src1->A, src2->A); 579 } 580 }; 581 582 struct A4R4G4B4 583 { 584 unsigned char A : 4; 585 unsigned char R : 4; 586 unsigned char G : 4; 587 unsigned char B : 4; 588 589 static void readColor(gl::ColorF *dst, const A4R4G4B4 *src) 590 { 591 dst->red = gl::normalizedToFloat<4>(src->R); 592 dst->green = gl::normalizedToFloat<4>(src->G); 593 dst->blue = gl::normalizedToFloat<4>(src->B); 594 dst->alpha = gl::normalizedToFloat<4>(src->A); 595 } 596 597 static void writeColor(A4R4G4B4 *dst, const gl::ColorF *src) 598 { 599 dst->R = gl::floatToNormalized<4, unsigned char>(src->red); 600 dst->G = gl::floatToNormalized<4, unsigned char>(src->green); 601 dst->B = gl::floatToNormalized<4, unsigned char>(src->blue); 602 dst->A = gl::floatToNormalized<4, unsigned char>(src->alpha); 603 } 604 605 static void average(A4R4G4B4 *dst, const A4R4G4B4 *src1, const A4R4G4B4 *src2) 606 { 607 dst->R = gl::average(src1->R, src2->R); 608 dst->G = gl::average(src1->G, src2->G); 609 dst->B = gl::average(src1->B, src2->B); 610 dst->A = gl::average(src1->A, src2->A); 611 } 612 }; 613 614 struct B4G4R4A4 615 { 616 unsigned char B : 4; 617 unsigned char G : 4; 618 unsigned char R : 4; 619 unsigned char A : 4; 620 621 static void readColor(gl::ColorF *dst, const B4G4R4A4 *src) 622 { 623 dst->red = gl::normalizedToFloat<4>(src->R); 624 dst->green = gl::normalizedToFloat<4>(src->G); 625 dst->blue = gl::normalizedToFloat<4>(src->B); 626 dst->alpha = gl::normalizedToFloat<4>(src->A); 627 } 628 629 static void writeColor(B4G4R4A4 *dst, const gl::ColorF *src) 630 { 631 dst->R = gl::floatToNormalized<4, unsigned char>(src->red); 632 dst->G = gl::floatToNormalized<4, unsigned char>(src->green); 633 dst->B = gl::floatToNormalized<4, unsigned char>(src->blue); 634 dst->A = gl::floatToNormalized<4, unsigned char>(src->alpha); 635 } 636 637 static void average(B4G4R4A4 *dst, const B4G4R4A4 *src1, const B4G4R4A4 *src2) 638 { 639 dst->R = gl::average(src1->R, src2->R); 640 dst->G = gl::average(src1->G, src2->G); 641 dst->B = gl::average(src1->B, src2->B); 642 dst->A = gl::average(src1->A, src2->A); 643 } 644 }; 645 646 struct R16 647 { 648 unsigned short R; 649 650 static void readColor(gl::ColorF *dst, const R16 *src) 651 { 652 dst->red = gl::normalizedToFloat(src->R); 653 dst->green = 0.0f; 654 dst->blue = 0.0f; 655 dst->alpha = 1.0f; 656 } 657 658 static void readColor(gl::ColorUI *dst, const R16 *src) 659 { 660 dst->red = src->R; 661 dst->green = 0; 662 dst->blue = 0; 663 dst->alpha = 1; 664 } 665 666 static void writeColor(R16 *dst, const gl::ColorF *src) 667 { 668 dst->R = gl::floatToNormalized<unsigned short>(src->red); 669 } 670 671 static void writeColor(R16 *dst, const gl::ColorUI *src) 672 { 673 dst->R = static_cast<unsigned short>(src->red); 674 } 675 676 static void average(R16 *dst, const R16 *src1, const R16 *src2) 677 { 678 dst->R = gl::average(src1->R, src2->R); 679 } 680 }; 681 682 struct R16G16 683 { 684 unsigned short R; 685 unsigned short G; 686 687 static void readColor(gl::ColorF *dst, const R16G16 *src) 688 { 689 dst->red = gl::normalizedToFloat(src->R); 690 dst->green = gl::normalizedToFloat(src->G); 691 dst->blue = 0.0f; 692 dst->alpha = 1.0f; 693 } 694 695 static void readColor(gl::ColorUI *dst, const R16G16 *src) 696 { 697 dst->red = src->R; 698 dst->green = src->G; 699 dst->blue = 0; 700 dst->alpha = 1; 701 } 702 703 static void writeColor(R16G16 *dst, const gl::ColorF *src) 704 { 705 dst->R = gl::floatToNormalized<unsigned short>(src->red); 706 dst->G = gl::floatToNormalized<unsigned short>(src->green); 707 } 708 709 static void writeColor(R16G16 *dst, const gl::ColorUI *src) 710 { 711 dst->R = static_cast<unsigned short>(src->red); 712 dst->G = static_cast<unsigned short>(src->green); 713 } 714 715 static void average(R16G16 *dst, const R16G16 *src1, const R16G16 *src2) 716 { 717 dst->R = gl::average(src1->R, src2->R); 718 dst->G = gl::average(src1->G, src2->G); 719 } 720 }; 721 722 struct R16G16B16 723 { 724 unsigned short R; 725 unsigned short G; 726 unsigned short B; 727 728 static void readColor(gl::ColorF *dst, const R16G16B16 *src) 729 { 730 dst->red = gl::normalizedToFloat(src->R); 731 dst->green = gl::normalizedToFloat(src->G); 732 dst->blue = gl::normalizedToFloat(src->B); 733 dst->alpha = 1.0f; 734 } 735 736 static void readColor(gl::ColorUI *dst, const R16G16B16 *src) 737 { 738 dst->red = src->R; 739 dst->green = src->G; 740 dst->blue = src->B; 741 dst->alpha = 1; 742 } 743 744 static void writeColor(R16G16B16 *dst, const gl::ColorF *src) 745 { 746 dst->R = gl::floatToNormalized<unsigned short>(src->red); 747 dst->G = gl::floatToNormalized<unsigned short>(src->green); 748 dst->B = gl::floatToNormalized<unsigned short>(src->blue); 749 } 750 751 static void writeColor(R16G16B16 *dst, const gl::ColorUI *src) 752 { 753 dst->R = static_cast<unsigned short>(src->red); 754 dst->G = static_cast<unsigned short>(src->green); 755 dst->B = static_cast<unsigned short>(src->blue); 756 } 757 758 static void average(R16G16B16 *dst, const R16G16B16 *src1, const R16G16B16 *src2) 759 { 760 dst->R = gl::average(src1->R, src2->R); 761 dst->G = gl::average(src1->G, src2->G); 762 dst->B = gl::average(src1->B, src2->B); 763 } 764 }; 765 766 struct R16G16B16A16 767 { 768 unsigned short R; 769 unsigned short G; 770 unsigned short B; 771 unsigned short A; 772 773 static void readColor(gl::ColorF *dst, const R16G16B16A16 *src) 774 { 775 dst->red = gl::normalizedToFloat(src->R); 776 dst->green = gl::normalizedToFloat(src->G); 777 dst->blue = gl::normalizedToFloat(src->B); 778 dst->alpha = gl::normalizedToFloat(src->A); 779 } 780 781 static void readColor(gl::ColorUI *dst, const R16G16B16A16 *src) 782 { 783 dst->red = src->R; 784 dst->green = src->G; 785 dst->blue = src->B; 786 dst->alpha = src->A; 787 } 788 789 static void writeColor(R16G16B16A16 *dst, const gl::ColorF *src) 790 { 791 dst->R = gl::floatToNormalized<unsigned short>(src->red); 792 dst->G = gl::floatToNormalized<unsigned short>(src->green); 793 dst->B = gl::floatToNormalized<unsigned short>(src->blue); 794 dst->A = gl::floatToNormalized<unsigned short>(src->alpha); 795 } 796 797 static void writeColor(R16G16B16A16 *dst, const gl::ColorUI *src) 798 { 799 dst->R = static_cast<unsigned short>(src->red); 800 dst->G = static_cast<unsigned short>(src->green); 801 dst->B = static_cast<unsigned short>(src->blue); 802 dst->A = static_cast<unsigned short>(src->alpha); 803 } 804 805 static void average(R16G16B16A16 *dst, const R16G16B16A16 *src1, const R16G16B16A16 *src2) 806 { 807 dst->R = gl::average(src1->R, src2->R); 808 dst->G = gl::average(src1->G, src2->G); 809 dst->B = gl::average(src1->B, src2->B); 810 dst->A = gl::average(src1->A, src2->A); 811 } 812 }; 813 814 struct R32 815 { 816 unsigned int R; 817 818 static void readColor(gl::ColorF *dst, const R32 *src) 819 { 820 dst->red = gl::normalizedToFloat(src->R); 821 dst->green = 0.0f; 822 dst->blue = 0.0f; 823 dst->alpha = 1.0f; 824 } 825 826 static void readColor(gl::ColorUI *dst, const R32 *src) 827 { 828 dst->red = src->R; 829 dst->green = 0; 830 dst->blue = 0; 831 dst->alpha = 1; 832 } 833 834 static void writeColor(R32 *dst, const gl::ColorF *src) 835 { 836 dst->R = gl::floatToNormalized<unsigned int>(src->red); 837 } 838 839 static void writeColor(R32 *dst, const gl::ColorUI *src) 840 { 841 dst->R = static_cast<unsigned int>(src->red); 842 } 843 844 static void average(R32 *dst, const R32 *src1, const R32 *src2) 845 { 846 dst->R = gl::average(src1->R, src2->R); 847 } 848 }; 849 850 struct R32G32 851 { 852 unsigned int R; 853 unsigned int G; 854 855 static void readColor(gl::ColorF *dst, const R32G32 *src) 856 { 857 dst->red = gl::normalizedToFloat(src->R); 858 dst->green = gl::normalizedToFloat(src->G); 859 dst->blue = 0.0f; 860 dst->alpha = 1.0f; 861 } 862 863 static void readColor(gl::ColorUI *dst, const R32G32 *src) 864 { 865 dst->red = src->R; 866 dst->green = src->G; 867 dst->blue = 0; 868 dst->alpha = 1; 869 } 870 871 static void writeColor(R32G32 *dst, const gl::ColorF *src) 872 { 873 dst->R = gl::floatToNormalized<unsigned int>(src->red); 874 dst->G = gl::floatToNormalized<unsigned int>(src->green); 875 } 876 877 static void writeColor(R32G32 *dst, const gl::ColorUI *src) 878 { 879 dst->R = static_cast<unsigned int>(src->red); 880 dst->G = static_cast<unsigned int>(src->green); 881 } 882 883 static void average(R32G32 *dst, const R32G32 *src1, const R32G32 *src2) 884 { 885 dst->R = gl::average(src1->R, src2->R); 886 dst->G = gl::average(src1->G, src2->G); 887 } 888 }; 889 890 struct R32G32B32 891 { 892 unsigned int R; 893 unsigned int G; 894 unsigned int B; 895 896 static void readColor(gl::ColorF *dst, const R32G32B32 *src) 897 { 898 dst->red = gl::normalizedToFloat(src->R); 899 dst->green = gl::normalizedToFloat(src->G); 900 dst->blue = gl::normalizedToFloat(src->B); 901 dst->alpha = 1.0f; 902 } 903 904 static void readColor(gl::ColorUI *dst, const R32G32B32 *src) 905 { 906 dst->red = src->R; 907 dst->green = src->G; 908 dst->blue = src->B; 909 dst->alpha = 1; 910 } 911 912 static void writeColor(R32G32B32 *dst, const gl::ColorF *src) 913 { 914 dst->R = gl::floatToNormalized<unsigned int>(src->red); 915 dst->G = gl::floatToNormalized<unsigned int>(src->green); 916 dst->B = gl::floatToNormalized<unsigned int>(src->blue); 917 } 918 919 static void writeColor(R32G32B32 *dst, const gl::ColorUI *src) 920 { 921 dst->R = static_cast<unsigned int>(src->red); 922 dst->G = static_cast<unsigned int>(src->green); 923 dst->B = static_cast<unsigned int>(src->blue); 924 } 925 926 static void average(R32G32B32 *dst, const R32G32B32 *src1, const R32G32B32 *src2) 927 { 928 dst->R = gl::average(src1->R, src2->R); 929 dst->G = gl::average(src1->G, src2->G); 930 dst->B = gl::average(src1->B, src2->B); 931 } 932 }; 933 934 struct R32G32B32A32 935 { 936 unsigned int R; 937 unsigned int G; 938 unsigned int B; 939 unsigned int A; 940 941 static void readColor(gl::ColorF *dst, const R32G32B32A32 *src) 942 { 943 dst->red = gl::normalizedToFloat(src->R); 944 dst->green = gl::normalizedToFloat(src->G); 945 dst->blue = gl::normalizedToFloat(src->B); 946 dst->alpha = gl::normalizedToFloat(src->A); 947 } 948 949 static void readColor(gl::ColorUI *dst, const R32G32B32A32 *src) 950 { 951 dst->red = src->R; 952 dst->green = src->G; 953 dst->blue = src->B; 954 dst->alpha = src->A; 955 } 956 957 static void writeColor(R32G32B32A32 *dst, const gl::ColorF *src) 958 { 959 dst->R = gl::floatToNormalized<unsigned int>(src->red); 960 dst->G = gl::floatToNormalized<unsigned int>(src->green); 961 dst->B = gl::floatToNormalized<unsigned int>(src->blue); 962 dst->A = gl::floatToNormalized<unsigned int>(src->alpha); 963 } 964 965 static void writeColor(R32G32B32A32 *dst, const gl::ColorUI *src) 966 { 967 dst->R = static_cast<unsigned int>(src->red); 968 dst->G = static_cast<unsigned int>(src->green); 969 dst->B = static_cast<unsigned int>(src->blue); 970 dst->A = static_cast<unsigned int>(src->alpha); 971 } 972 973 static void average(R32G32B32A32 *dst, const R32G32B32A32 *src1, const R32G32B32A32 *src2) 974 { 975 dst->R = gl::average(src1->R, src2->R); 976 dst->G = gl::average(src1->G, src2->G); 977 dst->B = gl::average(src1->B, src2->B); 978 dst->A = gl::average(src1->A, src2->A); 979 } 980 }; 981 982 struct R8S 983 { 984 char R; 985 986 static void readColor(gl::ColorF *dst, const R8S *src) 987 { 988 dst->red = gl::normalizedToFloat(src->R); 989 dst->green = 0.0f; 990 dst->blue = 0.0f; 991 dst->alpha = 1.0f; 992 } 993 994 static void readColor(gl::ColorI *dst, const R8S *src) 995 { 996 dst->red = src->R; 997 dst->green = 0; 998 dst->blue = 0; 999 dst->alpha = 1; 1000 } 1001 1002 static void writeColor(R8S *dst, const gl::ColorF *src) 1003 { 1004 dst->R = gl::floatToNormalized<char>(src->red); 1005 } 1006 1007 static void writeColor(R8S *dst, const gl::ColorI *src) 1008 { 1009 dst->R = static_cast<char>(src->red); 1010 } 1011 1012 static void average(R8S *dst, const R8S *src1, const R8S *src2) 1013 { 1014 dst->R = gl::average(src1->R, src2->R); 1015 } 1016 }; 1017 1018 struct R8G8S 1019 { 1020 char R; 1021 char G; 1022 1023 static void readColor(gl::ColorF *dst, const R8G8S *src) 1024 { 1025 dst->red = gl::normalizedToFloat(src->R); 1026 dst->green = gl::normalizedToFloat(src->G); 1027 dst->blue = 0.0f; 1028 dst->alpha = 1.0f; 1029 } 1030 1031 static void readColor(gl::ColorI *dst, const R8G8S *src) 1032 { 1033 dst->red = src->R; 1034 dst->green = src->G; 1035 dst->blue = 0; 1036 dst->alpha = 1; 1037 } 1038 1039 static void writeColor(R8G8S *dst, const gl::ColorF *src) 1040 { 1041 dst->R = gl::floatToNormalized<char>(src->red); 1042 dst->G = gl::floatToNormalized<char>(src->green); 1043 } 1044 1045 static void writeColor(R8G8S *dst, const gl::ColorI *src) 1046 { 1047 dst->R = static_cast<char>(src->red); 1048 dst->G = static_cast<char>(src->green); 1049 } 1050 1051 static void average(R8G8S *dst, const R8G8S *src1, const R8G8S *src2) 1052 { 1053 dst->R = gl::average(src1->R, src2->R); 1054 dst->G = gl::average(src1->G, src2->G); 1055 } 1056 }; 1057 1058 struct R8G8B8S 1059 { 1060 char R; 1061 char G; 1062 char B; 1063 1064 static void readColor(gl::ColorF *dst, const R8G8B8S *src) 1065 { 1066 dst->red = gl::normalizedToFloat(src->R); 1067 dst->green = gl::normalizedToFloat(src->G); 1068 dst->blue = gl::normalizedToFloat(src->B); 1069 dst->alpha = 1.0f; 1070 } 1071 1072 static void readColor(gl::ColorI *dst, const R8G8B8S *src) 1073 { 1074 dst->red = src->R; 1075 dst->green = src->G; 1076 dst->blue = src->B; 1077 dst->alpha = 1; 1078 } 1079 1080 static void writeColor(R8G8B8S *dst, const gl::ColorF *src) 1081 { 1082 dst->R = gl::floatToNormalized<char>(src->red); 1083 dst->G = gl::floatToNormalized<char>(src->green); 1084 dst->B = gl::floatToNormalized<char>(src->blue); 1085 } 1086 1087 static void writeColor(R8G8B8S *dst, const gl::ColorI *src) 1088 { 1089 dst->R = static_cast<char>(src->red); 1090 dst->G = static_cast<char>(src->green); 1091 dst->B = static_cast<char>(src->blue); 1092 } 1093 1094 static void average(R8G8B8S *dst, const R8G8B8S *src1, const R8G8B8S *src2) 1095 { 1096 dst->R = gl::average(src1->R, src2->R); 1097 dst->G = gl::average(src1->G, src2->G); 1098 dst->B = gl::average(src1->B, src2->B); 1099 } 1100 }; 1101 1102 struct R8G8B8A8S 1103 { 1104 char R; 1105 char G; 1106 char B; 1107 char A; 1108 1109 static void readColor(gl::ColorF *dst, const R8G8B8A8S *src) 1110 { 1111 dst->red = gl::normalizedToFloat(src->R); 1112 dst->green = gl::normalizedToFloat(src->G); 1113 dst->blue = gl::normalizedToFloat(src->B); 1114 dst->alpha = gl::normalizedToFloat(src->A); 1115 } 1116 1117 static void readColor(gl::ColorI *dst, const R8G8B8A8S *src) 1118 { 1119 dst->red = src->R; 1120 dst->green = src->G; 1121 dst->blue = src->B; 1122 dst->alpha = src->A; 1123 } 1124 1125 static void writeColor(R8G8B8A8S *dst, const gl::ColorF *src) 1126 { 1127 dst->R = gl::floatToNormalized<char>(src->red); 1128 dst->G = gl::floatToNormalized<char>(src->green); 1129 dst->B = gl::floatToNormalized<char>(src->blue); 1130 dst->A = gl::floatToNormalized<char>(src->alpha); 1131 } 1132 1133 static void writeColor(R8G8B8A8S *dst, const gl::ColorI *src) 1134 { 1135 dst->R = static_cast<char>(src->red); 1136 dst->G = static_cast<char>(src->green); 1137 dst->B = static_cast<char>(src->blue); 1138 dst->A = static_cast<char>(src->alpha); 1139 } 1140 1141 static void average(R8G8B8A8S *dst, const R8G8B8A8S *src1, const R8G8B8A8S *src2) 1142 { 1143 dst->R = gl::average(src1->R, src2->R); 1144 dst->G = gl::average(src1->G, src2->G); 1145 dst->B = gl::average(src1->B, src2->B); 1146 dst->A = gl::average(src1->A, src2->A); 1147 } 1148 }; 1149 1150 struct R16S 1151 { 1152 short R; 1153 1154 static void readColor(gl::ColorF *dst, const R16S *src) 1155 { 1156 dst->red = gl::normalizedToFloat(src->R); 1157 dst->green = 0.0f; 1158 dst->blue = 0.0f; 1159 dst->alpha = 1.0f; 1160 } 1161 1162 static void readColor(gl::ColorI *dst, const R16S *src) 1163 { 1164 dst->red = src->R; 1165 dst->green = 0; 1166 dst->blue = 0; 1167 dst->alpha = 1; 1168 } 1169 1170 static void writeColor(R16S *dst, const gl::ColorF *src) 1171 { 1172 dst->R = gl::floatToNormalized<short>(src->red); 1173 } 1174 1175 static void writeColor(R16S *dst, const gl::ColorI *src) 1176 { 1177 dst->R = static_cast<short>(src->red); 1178 } 1179 1180 static void average(R16S *dst, const R16S *src1, const R16S *src2) 1181 { 1182 dst->R = gl::average(src1->R, src2->R); 1183 } 1184 }; 1185 1186 struct R16G16S 1187 { 1188 short R; 1189 short G; 1190 1191 static void readColor(gl::ColorF *dst, const R16G16S *src) 1192 { 1193 dst->red = gl::normalizedToFloat(src->R); 1194 dst->green = gl::normalizedToFloat(src->G); 1195 dst->blue = 0.0f; 1196 dst->alpha = 1.0f; 1197 } 1198 1199 static void readColor(gl::ColorI *dst, const R16G16S *src) 1200 { 1201 dst->red = src->R; 1202 dst->green = src->G; 1203 dst->blue = 0; 1204 dst->alpha = 1; 1205 } 1206 1207 static void writeColor(R16G16S *dst, const gl::ColorF *src) 1208 { 1209 dst->R = gl::floatToNormalized<short>(src->red); 1210 dst->G = gl::floatToNormalized<short>(src->green); 1211 } 1212 1213 static void writeColor(R16G16S *dst, const gl::ColorI *src) 1214 { 1215 dst->R = static_cast<short>(src->red); 1216 dst->G = static_cast<short>(src->green); 1217 } 1218 1219 static void average(R16G16S *dst, const R16G16S *src1, const R16G16S *src2) 1220 { 1221 dst->R = gl::average(src1->R, src2->R); 1222 dst->G = gl::average(src1->G, src2->G); 1223 } 1224 }; 1225 1226 struct R16G16B16S 1227 { 1228 short R; 1229 short G; 1230 short B; 1231 1232 static void readColor(gl::ColorF *dst, const R16G16B16S *src) 1233 { 1234 dst->red = gl::normalizedToFloat(src->R); 1235 dst->green = gl::normalizedToFloat(src->G); 1236 dst->blue = gl::normalizedToFloat(src->B); 1237 dst->alpha = 1.0f; 1238 } 1239 1240 static void readColor(gl::ColorI *dst, const R16G16B16S *src) 1241 { 1242 dst->red = src->R; 1243 dst->green = src->G; 1244 dst->blue = src->B; 1245 dst->alpha = 1; 1246 } 1247 1248 static void writeColor(R16G16B16S *dst, const gl::ColorF *src) 1249 { 1250 dst->R = gl::floatToNormalized<short>(src->red); 1251 dst->G = gl::floatToNormalized<short>(src->green); 1252 dst->B = gl::floatToNormalized<short>(src->blue); 1253 } 1254 1255 static void writeColor(R16G16B16S *dst, const gl::ColorI *src) 1256 { 1257 dst->R = static_cast<short>(src->red); 1258 dst->G = static_cast<short>(src->green); 1259 dst->B = static_cast<short>(src->blue); 1260 } 1261 1262 static void average(R16G16B16S *dst, const R16G16B16S *src1, const R16G16B16S *src2) 1263 { 1264 dst->R = gl::average(src1->R, src2->R); 1265 dst->G = gl::average(src1->G, src2->G); 1266 dst->B = gl::average(src1->B, src2->B); 1267 } 1268 }; 1269 1270 struct R16G16B16A16S 1271 { 1272 short R; 1273 short G; 1274 short B; 1275 short A; 1276 1277 static void readColor(gl::ColorF *dst, const R16G16B16A16S *src) 1278 { 1279 dst->red = gl::normalizedToFloat(src->R); 1280 dst->green = gl::normalizedToFloat(src->G); 1281 dst->blue = gl::normalizedToFloat(src->B); 1282 dst->alpha = gl::normalizedToFloat(src->A); 1283 } 1284 1285 static void readColor(gl::ColorI *dst, const R16G16B16A16S *src) 1286 { 1287 dst->red = src->R; 1288 dst->green = src->G; 1289 dst->blue = src->B; 1290 dst->alpha = src->A; 1291 } 1292 1293 static void writeColor(R16G16B16A16S *dst, const gl::ColorF *src) 1294 { 1295 dst->R = gl::floatToNormalized<short>(src->red); 1296 dst->G = gl::floatToNormalized<short>(src->green); 1297 dst->B = gl::floatToNormalized<short>(src->blue); 1298 dst->A = gl::floatToNormalized<short>(src->alpha); 1299 } 1300 1301 static void writeColor(R16G16B16A16S *dst, const gl::ColorI *src) 1302 { 1303 dst->R = static_cast<short>(src->red); 1304 dst->G = static_cast<short>(src->green); 1305 dst->B = static_cast<short>(src->blue); 1306 dst->A = static_cast<short>(src->alpha); 1307 } 1308 1309 static void average(R16G16B16A16S *dst, const R16G16B16A16S *src1, const R16G16B16A16S *src2) 1310 { 1311 dst->R = gl::average(src1->R, src2->R); 1312 dst->G = gl::average(src1->G, src2->G); 1313 dst->B = gl::average(src1->B, src2->B); 1314 dst->A = gl::average(src1->A, src2->A); 1315 } 1316 }; 1317 1318 struct R32S 1319 { 1320 int R; 1321 1322 static void readColor(gl::ColorF *dst, const R32S *src) 1323 { 1324 dst->red = gl::normalizedToFloat(src->R); 1325 dst->green = 0.0f; 1326 dst->blue = 0.0f; 1327 dst->alpha = 1.0f; 1328 } 1329 1330 static void readColor(gl::ColorI *dst, const R32S *src) 1331 { 1332 dst->red = src->R; 1333 dst->green = 0; 1334 dst->blue = 0; 1335 dst->alpha = 1; 1336 } 1337 1338 static void writeColor(R32S *dst, const gl::ColorF *src) 1339 { 1340 dst->R = gl::floatToNormalized<int>(src->red); 1341 } 1342 1343 static void writeColor(R32S *dst, const gl::ColorI *src) 1344 { 1345 dst->R = static_cast<int>(src->red); 1346 } 1347 1348 static void average(R32S *dst, const R32S *src1, const R32S *src2) 1349 { 1350 dst->R = gl::average(src1->R, src2->R); 1351 } 1352 }; 1353 1354 struct R32G32S 1355 { 1356 int R; 1357 int G; 1358 1359 static void readColor(gl::ColorF *dst, const R32G32S *src) 1360 { 1361 dst->red = gl::normalizedToFloat(src->R); 1362 dst->green = gl::normalizedToFloat(src->G); 1363 dst->blue = 0.0f; 1364 dst->alpha = 1.0f; 1365 } 1366 1367 static void readColor(gl::ColorI *dst, const R32G32S *src) 1368 { 1369 dst->red = src->R; 1370 dst->green = src->G; 1371 dst->blue = 0; 1372 dst->alpha = 1; 1373 } 1374 1375 static void writeColor(R32G32S *dst, const gl::ColorF *src) 1376 { 1377 dst->R = gl::floatToNormalized<int>(src->red); 1378 dst->G = gl::floatToNormalized<int>(src->green); 1379 } 1380 1381 static void writeColor(R32G32S *dst, const gl::ColorI *src) 1382 { 1383 dst->R = static_cast<int>(src->red); 1384 dst->G = static_cast<int>(src->green); 1385 } 1386 1387 static void average(R32G32S *dst, const R32G32S *src1, const R32G32S *src2) 1388 { 1389 dst->R = gl::average(src1->R, src2->R); 1390 dst->G = gl::average(src1->G, src2->G); 1391 } 1392 }; 1393 1394 struct R32G32B32S 1395 { 1396 int R; 1397 int G; 1398 int B; 1399 1400 static void readColor(gl::ColorF *dst, const R32G32B32S *src) 1401 { 1402 dst->red = gl::normalizedToFloat(src->R); 1403 dst->green = gl::normalizedToFloat(src->G); 1404 dst->blue = gl::normalizedToFloat(src->B); 1405 dst->alpha = 1.0f; 1406 } 1407 1408 static void readColor(gl::ColorI *dst, const R32G32B32S *src) 1409 { 1410 dst->red = src->R; 1411 dst->green = src->G; 1412 dst->blue = src->B; 1413 dst->alpha = 1; 1414 } 1415 1416 static void writeColor(R32G32B32S *dst, const gl::ColorF *src) 1417 { 1418 dst->R = gl::floatToNormalized<int>(src->red); 1419 dst->G = gl::floatToNormalized<int>(src->green); 1420 dst->B = gl::floatToNormalized<int>(src->blue); 1421 } 1422 1423 static void writeColor(R32G32B32S *dst, const gl::ColorI *src) 1424 { 1425 dst->R = static_cast<int>(src->red); 1426 dst->G = static_cast<int>(src->green); 1427 dst->B = static_cast<int>(src->blue); 1428 } 1429 1430 static void average(R32G32B32S *dst, const R32G32B32S *src1, const R32G32B32S *src2) 1431 { 1432 dst->R = gl::average(src1->R, src2->R); 1433 dst->G = gl::average(src1->G, src2->G); 1434 dst->B = gl::average(src1->B, src2->B); 1435 } 1436 }; 1437 1438 struct R32G32B32A32S 1439 { 1440 int R; 1441 int G; 1442 int B; 1443 int A; 1444 1445 static void readColor(gl::ColorF *dst, const R32G32B32A32S *src) 1446 { 1447 dst->red = gl::normalizedToFloat(src->R); 1448 dst->green = gl::normalizedToFloat(src->G); 1449 dst->blue = gl::normalizedToFloat(src->B); 1450 dst->alpha = gl::normalizedToFloat(src->A); 1451 } 1452 1453 static void readColor(gl::ColorI *dst, const R32G32B32A32S *src) 1454 { 1455 dst->red = src->R; 1456 dst->green = src->G; 1457 dst->blue = src->B; 1458 dst->alpha = src->A; 1459 } 1460 1461 static void writeColor(R32G32B32A32S *dst, const gl::ColorF *src) 1462 { 1463 dst->R = gl::floatToNormalized<int>(src->red); 1464 dst->G = gl::floatToNormalized<int>(src->green); 1465 dst->B = gl::floatToNormalized<int>(src->blue); 1466 dst->A = gl::floatToNormalized<int>(src->alpha); 1467 } 1468 1469 static void writeColor(R32G32B32A32S *dst, const gl::ColorI *src) 1470 { 1471 dst->R = static_cast<int>(src->red); 1472 dst->G = static_cast<int>(src->green); 1473 dst->B = static_cast<int>(src->blue); 1474 dst->A = static_cast<int>(src->alpha); 1475 } 1476 1477 static void average(R32G32B32A32S *dst, const R32G32B32A32S *src1, const R32G32B32A32S *src2) 1478 { 1479 dst->R = gl::average(src1->R, src2->R); 1480 dst->G = gl::average(src1->G, src2->G); 1481 dst->B = gl::average(src1->B, src2->B); 1482 dst->A = gl::average(src1->A, src2->A); 1483 } 1484 }; 1485 1486 struct A16B16G16R16F 1487 { 1488 unsigned short A; 1489 unsigned short R; 1490 unsigned short G; 1491 unsigned short B; 1492 1493 static void readColor(gl::ColorF *dst, const A16B16G16R16F *src) 1494 { 1495 dst->red = gl::float16ToFloat32(src->R); 1496 dst->green = gl::float16ToFloat32(src->G); 1497 dst->blue = gl::float16ToFloat32(src->B); 1498 dst->alpha = gl::float16ToFloat32(src->A); 1499 } 1500 1501 static void writeColor(A16B16G16R16F *dst, const gl::ColorF *src) 1502 { 1503 dst->R = gl::float32ToFloat16(src->red); 1504 dst->G = gl::float32ToFloat16(src->green); 1505 dst->B = gl::float32ToFloat16(src->blue); 1506 dst->A = gl::float32ToFloat16(src->alpha); 1507 } 1508 1509 static void average(A16B16G16R16F *dst, const A16B16G16R16F *src1, const A16B16G16R16F *src2) 1510 { 1511 dst->R = gl::averageHalfFloat(src1->R, src2->R); 1512 dst->G = gl::averageHalfFloat(src1->G, src2->G); 1513 dst->B = gl::averageHalfFloat(src1->B, src2->B); 1514 dst->A = gl::averageHalfFloat(src1->A, src2->A); 1515 } 1516 }; 1517 1518 struct R16G16B16A16F 1519 { 1520 unsigned short R; 1521 unsigned short G; 1522 unsigned short B; 1523 unsigned short A; 1524 1525 static void readColor(gl::ColorF *dst, const R16G16B16A16F *src) 1526 { 1527 dst->red = gl::float16ToFloat32(src->R); 1528 dst->green = gl::float16ToFloat32(src->G); 1529 dst->blue = gl::float16ToFloat32(src->B); 1530 dst->alpha = gl::float16ToFloat32(src->A); 1531 } 1532 1533 static void writeColor(R16G16B16A16F *dst, const gl::ColorF *src) 1534 { 1535 dst->R = gl::float32ToFloat16(src->red); 1536 dst->G = gl::float32ToFloat16(src->green); 1537 dst->B = gl::float32ToFloat16(src->blue); 1538 dst->A = gl::float32ToFloat16(src->alpha); 1539 } 1540 1541 static void average(R16G16B16A16F *dst, const R16G16B16A16F *src1, const R16G16B16A16F *src2) 1542 { 1543 dst->R = gl::averageHalfFloat(src1->R, src2->R); 1544 dst->G = gl::averageHalfFloat(src1->G, src2->G); 1545 dst->B = gl::averageHalfFloat(src1->B, src2->B); 1546 dst->A = gl::averageHalfFloat(src1->A, src2->A); 1547 } 1548 }; 1549 1550 struct R16F 1551 { 1552 unsigned short R; 1553 1554 static void readColor(gl::ColorF *dst, const R16F *src) 1555 { 1556 dst->red = gl::float16ToFloat32(src->R); 1557 dst->green = 0.0f; 1558 dst->blue = 0.0f; 1559 dst->alpha = 1.0f; 1560 } 1561 1562 static void writeColor(R16F *dst, const gl::ColorF *src) 1563 { 1564 dst->R = gl::float32ToFloat16(src->red); 1565 } 1566 1567 static void average(R16F *dst, const R16F *src1, const R16F *src2) 1568 { 1569 dst->R = gl::averageHalfFloat(src1->R, src2->R); 1570 } 1571 }; 1572 1573 struct A16F 1574 { 1575 unsigned short A; 1576 1577 static void readColor(gl::ColorF *dst, const A16F *src) 1578 { 1579 dst->red = 0.0f; 1580 dst->green = 0.0f; 1581 dst->blue = 0.0f; 1582 dst->alpha = gl::float16ToFloat32(src->A); 1583 } 1584 1585 static void writeColor(A16F *dst, const gl::ColorF *src) 1586 { 1587 dst->A = gl::float32ToFloat16(src->alpha); 1588 } 1589 1590 static void average(A16F *dst, const A16F *src1, const A16F *src2) 1591 { 1592 dst->A = gl::averageHalfFloat(src1->A, src2->A); 1593 } 1594 }; 1595 1596 struct L16F 1597 { 1598 unsigned short L; 1599 1600 static void readColor(gl::ColorF *dst, const L16F *src) 1601 { 1602 float lum = gl::float16ToFloat32(src->L); 1603 dst->red = lum; 1604 dst->green = lum; 1605 dst->blue = lum; 1606 dst->alpha = 1.0f; 1607 } 1608 1609 static void writeColor(L16F *dst, const gl::ColorF *src) 1610 { 1611 dst->L = gl::float32ToFloat16((src->red + src->green + src->blue) / 3.0f); 1612 } 1613 1614 static void average(L16F *dst, const L16F *src1, const L16F *src2) 1615 { 1616 dst->L = gl::averageHalfFloat(src1->L, src2->L); 1617 } 1618 }; 1619 1620 struct L16A16F 1621 { 1622 unsigned short L; 1623 unsigned short A; 1624 1625 static void readColor(gl::ColorF *dst, const L16A16F *src) 1626 { 1627 float lum = gl::float16ToFloat32(src->L); 1628 dst->red = lum; 1629 dst->green = lum; 1630 dst->blue = lum; 1631 dst->alpha = gl::float16ToFloat32(src->A); 1632 } 1633 1634 static void writeColor(L16A16F *dst, const gl::ColorF *src) 1635 { 1636 dst->L = gl::float32ToFloat16((src->red + src->green + src->blue) / 3.0f); 1637 dst->A = gl::float32ToFloat16(src->alpha); 1638 } 1639 1640 static void average(L16A16F *dst, const L16A16F *src1, const L16A16F *src2) 1641 { 1642 dst->L = gl::averageHalfFloat(src1->L, src2->L); 1643 dst->A = gl::averageHalfFloat(src1->A, src2->A); 1644 } 1645 }; 1646 1647 struct R16G16F 1648 { 1649 unsigned short R; 1650 unsigned short G; 1651 1652 static void readColor(gl::ColorF *dst, const R16G16F *src) 1653 { 1654 dst->red = gl::float16ToFloat32(src->R); 1655 dst->green = gl::float16ToFloat32(src->G); 1656 dst->blue = 0.0f; 1657 dst->alpha = 1.0f; 1658 } 1659 1660 static void writeColor(R16G16F *dst, const gl::ColorF *src) 1661 { 1662 dst->R = gl::float32ToFloat16(src->red); 1663 dst->G = gl::float32ToFloat16(src->green); 1664 } 1665 1666 static void average(R16G16F *dst, const R16G16F *src1, const R16G16F *src2) 1667 { 1668 dst->R = gl::averageHalfFloat(src1->R, src2->R); 1669 dst->G = gl::averageHalfFloat(src1->G, src2->G); 1670 } 1671 }; 1672 1673 struct R16G16B16F 1674 { 1675 unsigned short R; 1676 unsigned short G; 1677 unsigned short B; 1678 1679 static void readColor(gl::ColorF *dst, const R16G16B16F *src) 1680 { 1681 dst->red = gl::float16ToFloat32(src->R); 1682 dst->green = gl::float16ToFloat32(src->G); 1683 dst->blue = gl::float16ToFloat32(src->B); 1684 dst->alpha = 1.0f; 1685 } 1686 1687 static void writeColor(R16G16B16F *dst, const gl::ColorF *src) 1688 { 1689 dst->R = gl::float32ToFloat16(src->red); 1690 dst->G = gl::float32ToFloat16(src->green); 1691 dst->B = gl::float32ToFloat16(src->blue); 1692 } 1693 1694 static void average(R16G16B16F *dst, const R16G16B16F *src1, const R16G16B16F *src2) 1695 { 1696 dst->R = gl::averageHalfFloat(src1->R, src2->R); 1697 dst->G = gl::averageHalfFloat(src1->G, src2->G); 1698 dst->B = gl::averageHalfFloat(src1->B, src2->B); 1699 } 1700 }; 1701 1702 struct A32B32G32R32F 1703 { 1704 float A; 1705 float R; 1706 float G; 1707 float B; 1708 1709 static void readColor(gl::ColorF *dst, const A32B32G32R32F *src) 1710 { 1711 dst->red = src->R; 1712 dst->green = src->G; 1713 dst->blue = src->B; 1714 dst->alpha = src->A; 1715 } 1716 1717 static void writeColor(A32B32G32R32F *dst, const gl::ColorF *src) 1718 { 1719 dst->R = src->red; 1720 dst->G = src->green; 1721 dst->B = src->blue; 1722 dst->A = src->alpha; 1723 } 1724 1725 static void average(A32B32G32R32F *dst, const A32B32G32R32F *src1, const A32B32G32R32F *src2) 1726 { 1727 dst->R = gl::average(src1->R, src2->R); 1728 dst->G = gl::average(src1->G, src2->G); 1729 dst->B = gl::average(src1->B, src2->B); 1730 dst->A = gl::average(src1->A, src2->A); 1731 } 1732 }; 1733 1734 struct R32G32B32A32F 1735 { 1736 float R; 1737 float G; 1738 float B; 1739 float A; 1740 1741 static void readColor(gl::ColorF *dst, const R32G32B32A32F *src) 1742 { 1743 dst->red = src->R; 1744 dst->green = src->G; 1745 dst->blue = src->B; 1746 dst->alpha = src->A; 1747 } 1748 1749 static void writeColor(R32G32B32A32F *dst, const gl::ColorF *src) 1750 { 1751 dst->R = src->red; 1752 dst->G = src->green; 1753 dst->B = src->blue; 1754 dst->A = src->alpha; 1755 } 1756 1757 static void average(R32G32B32A32F *dst, const R32G32B32A32F *src1, const R32G32B32A32F *src2) 1758 { 1759 dst->R = gl::average(src1->R, src2->R); 1760 dst->G = gl::average(src1->G, src2->G); 1761 dst->B = gl::average(src1->B, src2->B); 1762 dst->A = gl::average(src1->A, src2->A); 1763 } 1764 }; 1765 1766 struct R32F 1767 { 1768 float R; 1769 1770 static void readColor(gl::ColorF *dst, const R32F *src) 1771 { 1772 dst->red = src->R; 1773 dst->green = 0.0f; 1774 dst->blue = 0.0f; 1775 dst->alpha = 1.0f; 1776 } 1777 1778 static void writeColor(R32F *dst, const gl::ColorF *src) 1779 { 1780 dst->R = src->red; 1781 } 1782 1783 static void average(R32F *dst, const R32F *src1, const R32F *src2) 1784 { 1785 dst->R = gl::average(src1->R, src2->R); 1786 } 1787 }; 1788 1789 struct A32F 1790 { 1791 float A; 1792 1793 static void readColor(gl::ColorF *dst, const A32F *src) 1794 { 1795 dst->red = 0.0f; 1796 dst->green = 0.0f; 1797 dst->blue = 0.0f; 1798 dst->alpha = src->A; 1799 } 1800 1801 static void writeColor(A32F *dst, const gl::ColorF *src) 1802 { 1803 dst->A = src->alpha; 1804 } 1805 1806 static void average(A32F *dst, const A32F *src1, const A32F *src2) 1807 { 1808 dst->A = gl::average(src1->A, src2->A); 1809 } 1810 }; 1811 1812 struct L32F 1813 { 1814 float L; 1815 1816 static void readColor(gl::ColorF *dst, const L32F *src) 1817 { 1818 dst->red = src->L; 1819 dst->green = src->L; 1820 dst->blue = src->L; 1821 dst->alpha = 1.0f; 1822 } 1823 1824 static void writeColor(L32F *dst, const gl::ColorF *src) 1825 { 1826 dst->L = (src->red + src->green + src->blue) / 3.0f; 1827 } 1828 1829 static void average(L32F *dst, const L32F *src1, const L32F *src2) 1830 { 1831 dst->L = gl::average(src1->L, src2->L); 1832 } 1833 }; 1834 1835 struct L32A32F 1836 { 1837 float L; 1838 float A; 1839 1840 static void readColor(gl::ColorF *dst, const L32A32F *src) 1841 { 1842 dst->red = src->L; 1843 dst->green = src->L; 1844 dst->blue = src->L; 1845 dst->alpha = src->A; 1846 } 1847 1848 static void writeColor(L32A32F *dst, const gl::ColorF *src) 1849 { 1850 dst->L = (src->red + src->green + src->blue) / 3.0f; 1851 dst->A = src->alpha; 1852 } 1853 1854 static void average(L32A32F *dst, const L32A32F *src1, const L32A32F *src2) 1855 { 1856 dst->L = gl::average(src1->L, src2->L); 1857 dst->A = gl::average(src1->A, src2->A); 1858 } 1859 }; 1860 1861 struct R32G32F 1862 { 1863 float R; 1864 float G; 1865 1866 static void readColor(gl::ColorF *dst, const R32G32F *src) 1867 { 1868 dst->red = src->R; 1869 dst->green = src->G; 1870 dst->blue = 0.0f; 1871 dst->alpha = 1.0f; 1872 } 1873 1874 static void writeColor(R32G32F *dst, const gl::ColorF *src) 1875 { 1876 dst->R = src->red; 1877 dst->G = src->green; 1878 } 1879 1880 static void average(R32G32F *dst, const R32G32F *src1, const R32G32F *src2) 1881 { 1882 dst->R = gl::average(src1->R, src2->R); 1883 dst->G = gl::average(src1->G, src2->G); 1884 } 1885 }; 1886 1887 struct R32G32B32F 1888 { 1889 float R; 1890 float G; 1891 float B; 1892 1893 static void readColor(gl::ColorF *dst, const R32G32B32F *src) 1894 { 1895 dst->red = src->R; 1896 dst->green = src->G; 1897 dst->blue = src->B; 1898 dst->alpha = 1.0f; 1899 } 1900 1901 static void writeColor(R32G32B32F *dst, const gl::ColorF *src) 1902 { 1903 dst->R = src->red; 1904 dst->G = src->green; 1905 dst->B = src->blue; 1906 } 1907 1908 static void average(R32G32B32F *dst, const R32G32B32F *src1, const R32G32B32F *src2) 1909 { 1910 dst->R = gl::average(src1->R, src2->R); 1911 dst->G = gl::average(src1->G, src2->G); 1912 dst->B = gl::average(src1->B, src2->B); 1913 } 1914 }; 1915 1916 struct R10G10B10A2 1917 { 1918 unsigned int R : 10; 1919 unsigned int G : 10; 1920 unsigned int B : 10; 1921 unsigned int A : 2; 1922 1923 static void readColor(gl::ColorF *dst, const R10G10B10A2 *src) 1924 { 1925 dst->red = gl::normalizedToFloat<10>(src->R); 1926 dst->green = gl::normalizedToFloat<10>(src->G); 1927 dst->blue = gl::normalizedToFloat<10>(src->B); 1928 dst->alpha = gl::normalizedToFloat< 2>(src->A); 1929 } 1930 1931 static void readColor(gl::ColorUI *dst, const R10G10B10A2 *src) 1932 { 1933 dst->red = src->R; 1934 dst->green = src->G; 1935 dst->blue = src->B; 1936 dst->alpha = src->A; 1937 } 1938 1939 static void writeColor(R10G10B10A2 *dst, const gl::ColorF *src) 1940 { 1941 dst->R = gl::floatToNormalized<10, unsigned int>(src->red); 1942 dst->G = gl::floatToNormalized<10, unsigned int>(src->green); 1943 dst->B = gl::floatToNormalized<10, unsigned int>(src->blue); 1944 dst->A = gl::floatToNormalized< 2, unsigned int>(src->alpha); 1945 } 1946 1947 static void writeColor(R10G10B10A2 *dst, const gl::ColorUI *src) 1948 { 1949 dst->R = static_cast<unsigned int>(src->red); 1950 dst->G = static_cast<unsigned int>(src->green); 1951 dst->B = static_cast<unsigned int>(src->blue); 1952 dst->A = static_cast<unsigned int>(src->alpha); 1953 } 1954 1955 static void average(R10G10B10A2 *dst, const R10G10B10A2 *src1, const R10G10B10A2 *src2) 1956 { 1957 dst->R = gl::average(src1->R, src2->R); 1958 dst->G = gl::average(src1->G, src2->G); 1959 dst->B = gl::average(src1->B, src2->B); 1960 dst->A = gl::average(src1->A, src2->A); 1961 } 1962 }; 1963 1964 struct R9G9B9E5 1965 { 1966 unsigned int R : 9; 1967 unsigned int G : 9; 1968 unsigned int B : 9; 1969 unsigned int E : 5; 1970 1971 static void readColor(gl::ColorF *dst, const R9G9B9E5 *src) 1972 { 1973 gl::convert999E5toRGBFloats(gl::bitCast<unsigned int>(*src), &dst->red, &dst->green, &dst->blue); 1974 dst->alpha = 1.0f; 1975 } 1976 1977 static void writeColor(R9G9B9E5 *dst, const gl::ColorF *src) 1978 { 1979 *reinterpret_cast<unsigned int*>(dst) = gl::convertRGBFloatsTo999E5(src->red, 1980 src->green, 1981 src->blue); 1982 } 1983 1984 static void average(R9G9B9E5 *dst, const R9G9B9E5 *src1, const R9G9B9E5 *src2) 1985 { 1986 float r1, g1, b1; 1987 gl::convert999E5toRGBFloats(*reinterpret_cast<const unsigned int*>(src1), &r1, &g1, &b1); 1988 1989 float r2, g2, b2; 1990 gl::convert999E5toRGBFloats(*reinterpret_cast<const unsigned int*>(src2), &r2, &g2, &b2); 1991 1992 *reinterpret_cast<unsigned int*>(dst) = gl::convertRGBFloatsTo999E5(gl::average(r1, r2), 1993 gl::average(g1, g2), 1994 gl::average(b1, b2)); 1995 } 1996 }; 1997 1998 struct R11G11B10F 1999 { 2000 unsigned int R : 11; 2001 unsigned int G : 11; 2002 unsigned int B : 10; 2003 2004 static void readColor(gl::ColorF *dst, const R11G11B10F *src) 2005 { 2006 dst->red = gl::float11ToFloat32(src->R); 2007 dst->green = gl::float11ToFloat32(src->G); 2008 dst->blue = gl::float10ToFloat32(src->B); 2009 dst->alpha = 1.0f; 2010 } 2011 2012 static void writeColor(R11G11B10F *dst, const gl::ColorF *src) 2013 { 2014 dst->R = gl::float32ToFloat11(src->red); 2015 dst->G = gl::float32ToFloat11(src->green); 2016 dst->B = gl::float32ToFloat10(src->blue); 2017 } 2018 2019 static void average(R11G11B10F *dst, const R11G11B10F *src1, const R11G11B10F *src2) 2020 { 2021 dst->R = gl::averageFloat11(src1->R, src2->R); 2022 dst->G = gl::averageFloat11(src1->G, src2->G); 2023 dst->B = gl::averageFloat10(src1->B, src2->B); 2024 } 2025 }; 2026 2027 } 2028 2029 #endif // LIBGLESV2_RENDERER_IMAGEFORMATS_H_ 2030