1 #include "precompiled.h" 2 // 3 // Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved. 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 // Image.h: Implements the rx::Image class, an abstract base class for the 9 // renderer-specific classes which will define the interface to the underlying 10 // surfaces or resources. 11 12 #include "libGLESv2/renderer/Image.h" 13 14 namespace rx 15 { 16 17 Image::Image() 18 { 19 mWidth = 0; 20 mHeight = 0; 21 mInternalFormat = GL_NONE; 22 mActualFormat = GL_NONE; 23 } 24 25 void Image::loadAlphaDataToBGRA(GLsizei width, GLsizei height, 26 int inputPitch, const void *input, size_t outputPitch, void *output) 27 { 28 const unsigned char *source = NULL; 29 unsigned char *dest = NULL; 30 31 for (int y = 0; y < height; y++) 32 { 33 source = static_cast<const unsigned char*>(input) + y * inputPitch; 34 dest = static_cast<unsigned char*>(output) + y * outputPitch; 35 for (int x = 0; x < width; x++) 36 { 37 dest[4 * x + 0] = 0; 38 dest[4 * x + 1] = 0; 39 dest[4 * x + 2] = 0; 40 dest[4 * x + 3] = source[x]; 41 } 42 } 43 } 44 45 void Image::loadAlphaDataToNative(GLsizei width, GLsizei height, 46 int inputPitch, const void *input, size_t outputPitch, void *output) 47 { 48 const unsigned char *source = NULL; 49 unsigned char *dest = NULL; 50 51 for (int y = 0; y < height; y++) 52 { 53 source = static_cast<const unsigned char*>(input) + y * inputPitch; 54 dest = static_cast<unsigned char*>(output) + y * outputPitch; 55 memcpy(dest, source, width); 56 } 57 } 58 59 void Image::loadAlphaFloatDataToRGBA(GLsizei width, GLsizei height, 60 int inputPitch, const void *input, size_t outputPitch, void *output) 61 { 62 const float *source = NULL; 63 float *dest = NULL; 64 65 for (int y = 0; y < height; y++) 66 { 67 source = reinterpret_cast<const float*>(static_cast<const unsigned char*>(input) + y * inputPitch); 68 dest = reinterpret_cast<float*>(static_cast<unsigned char*>(output) + y * outputPitch); 69 for (int x = 0; x < width; x++) 70 { 71 dest[4 * x + 0] = 0; 72 dest[4 * x + 1] = 0; 73 dest[4 * x + 2] = 0; 74 dest[4 * x + 3] = source[x]; 75 } 76 } 77 } 78 79 void Image::loadAlphaHalfFloatDataToRGBA(GLsizei width, GLsizei height, 80 int inputPitch, const void *input, size_t outputPitch, void *output) 81 { 82 const unsigned short *source = NULL; 83 unsigned short *dest = NULL; 84 85 for (int y = 0; y < height; y++) 86 { 87 source = reinterpret_cast<const unsigned short*>(static_cast<const unsigned char*>(input) + y * inputPitch); 88 dest = reinterpret_cast<unsigned short*>(static_cast<unsigned char*>(output) + y * outputPitch); 89 for (int x = 0; x < width; x++) 90 { 91 dest[4 * x + 0] = 0; 92 dest[4 * x + 1] = 0; 93 dest[4 * x + 2] = 0; 94 dest[4 * x + 3] = source[x]; 95 } 96 } 97 } 98 99 void Image::loadLuminanceDataToNativeOrBGRA(GLsizei width, GLsizei height, 100 int inputPitch, const void *input, size_t outputPitch, void *output, bool native) 101 { 102 const unsigned char *source = NULL; 103 unsigned char *dest = NULL; 104 105 for (int y = 0; y < height; y++) 106 { 107 source = static_cast<const unsigned char*>(input) + y * inputPitch; 108 dest = static_cast<unsigned char*>(output) + y * outputPitch; 109 110 if (!native) // BGRA8 destination format 111 { 112 for (int x = 0; x < width; x++) 113 { 114 dest[4 * x + 0] = source[x]; 115 dest[4 * x + 1] = source[x]; 116 dest[4 * x + 2] = source[x]; 117 dest[4 * x + 3] = 0xFF; 118 } 119 } 120 else // L8 destination format 121 { 122 memcpy(dest, source, width); 123 } 124 } 125 } 126 127 void Image::loadLuminanceFloatDataToRGBA(GLsizei width, GLsizei height, 128 int inputPitch, const void *input, size_t outputPitch, void *output) 129 { 130 const float *source = NULL; 131 float *dest = NULL; 132 133 for (int y = 0; y < height; y++) 134 { 135 source = reinterpret_cast<const float*>(static_cast<const unsigned char*>(input) + y * inputPitch); 136 dest = reinterpret_cast<float*>(static_cast<unsigned char*>(output) + y * outputPitch); 137 for (int x = 0; x < width; x++) 138 { 139 dest[4 * x + 0] = source[x]; 140 dest[4 * x + 1] = source[x]; 141 dest[4 * x + 2] = source[x]; 142 dest[4 * x + 3] = 1.0f; 143 } 144 } 145 } 146 147 void Image::loadLuminanceFloatDataToRGB(GLsizei width, GLsizei height, 148 int inputPitch, const void *input, size_t outputPitch, void *output) 149 { 150 const float *source = NULL; 151 float *dest = NULL; 152 153 for (int y = 0; y < height; y++) 154 { 155 source = reinterpret_cast<const float*>(static_cast<const unsigned char*>(input) + y * inputPitch); 156 dest = reinterpret_cast<float*>(static_cast<unsigned char*>(output) + y * outputPitch); 157 for (int x = 0; x < width; x++) 158 { 159 dest[3 * x + 0] = source[x]; 160 dest[3 * x + 1] = source[x]; 161 dest[3 * x + 2] = source[x]; 162 } 163 } 164 } 165 166 void Image::loadLuminanceHalfFloatDataToRGBA(GLsizei width, GLsizei height, 167 int inputPitch, const void *input, size_t outputPitch, void *output) 168 { 169 const unsigned short *source = NULL; 170 unsigned short *dest = NULL; 171 172 for (int y = 0; y < height; y++) 173 { 174 source = reinterpret_cast<const unsigned short*>(static_cast<const unsigned char*>(input) + y * inputPitch); 175 dest = reinterpret_cast<unsigned short*>(static_cast<unsigned char*>(output) + y * outputPitch); 176 for (int x = 0; x < width; x++) 177 { 178 dest[4 * x + 0] = source[x]; 179 dest[4 * x + 1] = source[x]; 180 dest[4 * x + 2] = source[x]; 181 dest[4 * x + 3] = 0x3C00; // SEEEEEMMMMMMMMMM, S = 0, E = 15, M = 0: 16bit flpt representation of 1 182 } 183 } 184 } 185 186 void Image::loadLuminanceAlphaDataToNativeOrBGRA(GLsizei width, GLsizei height, 187 int inputPitch, const void *input, size_t outputPitch, void *output, bool native) 188 { 189 const unsigned char *source = NULL; 190 unsigned char *dest = NULL; 191 192 for (int y = 0; y < height; y++) 193 { 194 source = static_cast<const unsigned char*>(input) + y * inputPitch; 195 dest = static_cast<unsigned char*>(output) + y * outputPitch; 196 197 if (!native) // BGRA8 destination format 198 { 199 for (int x = 0; x < width; x++) 200 { 201 dest[4 * x + 0] = source[2*x+0]; 202 dest[4 * x + 1] = source[2*x+0]; 203 dest[4 * x + 2] = source[2*x+0]; 204 dest[4 * x + 3] = source[2*x+1]; 205 } 206 } 207 else 208 { 209 memcpy(dest, source, width * 2); 210 } 211 } 212 } 213 214 void Image::loadLuminanceAlphaFloatDataToRGBA(GLsizei width, GLsizei height, 215 int inputPitch, const void *input, size_t outputPitch, void *output) 216 { 217 const float *source = NULL; 218 float *dest = NULL; 219 220 for (int y = 0; y < height; y++) 221 { 222 source = reinterpret_cast<const float*>(static_cast<const unsigned char*>(input) + y * inputPitch); 223 dest = reinterpret_cast<float*>(static_cast<unsigned char*>(output) + y * outputPitch); 224 for (int x = 0; x < width; x++) 225 { 226 dest[4 * x + 0] = source[2*x+0]; 227 dest[4 * x + 1] = source[2*x+0]; 228 dest[4 * x + 2] = source[2*x+0]; 229 dest[4 * x + 3] = source[2*x+1]; 230 } 231 } 232 } 233 234 void Image::loadLuminanceAlphaHalfFloatDataToRGBA(GLsizei width, GLsizei height, 235 int inputPitch, const void *input, size_t outputPitch, void *output) 236 { 237 const unsigned short *source = NULL; 238 unsigned short *dest = NULL; 239 240 for (int y = 0; y < height; y++) 241 { 242 source = reinterpret_cast<const unsigned short*>(static_cast<const unsigned char*>(input) + y * inputPitch); 243 dest = reinterpret_cast<unsigned short*>(static_cast<unsigned char*>(output) + y * outputPitch); 244 for (int x = 0; x < width; x++) 245 { 246 dest[4 * x + 0] = source[2*x+0]; 247 dest[4 * x + 1] = source[2*x+0]; 248 dest[4 * x + 2] = source[2*x+0]; 249 dest[4 * x + 3] = source[2*x+1]; 250 } 251 } 252 } 253 254 void Image::loadRGBUByteDataToBGRX(GLsizei width, GLsizei height, 255 int inputPitch, const void *input, size_t outputPitch, void *output) 256 { 257 const unsigned char *source = NULL; 258 unsigned char *dest = NULL; 259 260 for (int y = 0; y < height; y++) 261 { 262 source = static_cast<const unsigned char*>(input) + y * inputPitch; 263 dest = static_cast<unsigned char*>(output) + y * outputPitch; 264 for (int x = 0; x < width; x++) 265 { 266 dest[4 * x + 0] = source[x * 3 + 2]; 267 dest[4 * x + 1] = source[x * 3 + 1]; 268 dest[4 * x + 2] = source[x * 3 + 0]; 269 dest[4 * x + 3] = 0xFF; 270 } 271 } 272 } 273 274 void Image::loadRGBUByteDataToRGBA(GLsizei width, GLsizei height, 275 int inputPitch, const void *input, size_t outputPitch, void *output) 276 { 277 const unsigned char *source = NULL; 278 unsigned char *dest = NULL; 279 280 for (int y = 0; y < height; y++) 281 { 282 source = static_cast<const unsigned char*>(input) + y * inputPitch; 283 dest = static_cast<unsigned char*>(output) + y * outputPitch; 284 for (int x = 0; x < width; x++) 285 { 286 dest[4 * x + 0] = source[x * 3 + 0]; 287 dest[4 * x + 1] = source[x * 3 + 1]; 288 dest[4 * x + 2] = source[x * 3 + 2]; 289 dest[4 * x + 3] = 0xFF; 290 } 291 } 292 } 293 294 void Image::loadRGB565DataToBGRA(GLsizei width, GLsizei height, 295 int inputPitch, const void *input, size_t outputPitch, void *output) 296 { 297 const unsigned short *source = NULL; 298 unsigned char *dest = NULL; 299 300 for (int y = 0; y < height; y++) 301 { 302 source = reinterpret_cast<const unsigned short*>(static_cast<const unsigned char*>(input) + y * inputPitch); 303 dest = static_cast<unsigned char*>(output) + y * outputPitch; 304 for (int x = 0; x < width; x++) 305 { 306 unsigned short rgba = source[x]; 307 dest[4 * x + 0] = ((rgba & 0x001F) << 3) | ((rgba & 0x001F) >> 2); 308 dest[4 * x + 1] = ((rgba & 0x07E0) >> 3) | ((rgba & 0x07E0) >> 9); 309 dest[4 * x + 2] = ((rgba & 0xF800) >> 8) | ((rgba & 0xF800) >> 13); 310 dest[4 * x + 3] = 0xFF; 311 } 312 } 313 } 314 315 void Image::loadRGB565DataToRGBA(GLsizei width, GLsizei height, 316 int inputPitch, const void *input, size_t outputPitch, void *output) 317 { 318 const unsigned short *source = NULL; 319 unsigned char *dest = NULL; 320 321 for (int y = 0; y < height; y++) 322 { 323 source = reinterpret_cast<const unsigned short*>(static_cast<const unsigned char*>(input) + y * inputPitch); 324 dest = static_cast<unsigned char*>(output) + y * outputPitch; 325 for (int x = 0; x < width; x++) 326 { 327 unsigned short rgba = source[x]; 328 dest[4 * x + 0] = ((rgba & 0xF800) >> 8) | ((rgba & 0xF800) >> 13); 329 dest[4 * x + 1] = ((rgba & 0x07E0) >> 3) | ((rgba & 0x07E0) >> 9); 330 dest[4 * x + 2] = ((rgba & 0x001F) << 3) | ((rgba & 0x001F) >> 2); 331 dest[4 * x + 3] = 0xFF; 332 } 333 } 334 } 335 336 void Image::loadRGBFloatDataToRGBA(GLsizei width, GLsizei height, 337 int inputPitch, const void *input, size_t outputPitch, void *output) 338 { 339 const float *source = NULL; 340 float *dest = NULL; 341 342 for (int y = 0; y < height; y++) 343 { 344 source = reinterpret_cast<const float*>(static_cast<const unsigned char*>(input) + y * inputPitch); 345 dest = reinterpret_cast<float*>(static_cast<unsigned char*>(output) + y * outputPitch); 346 for (int x = 0; x < width; x++) 347 { 348 dest[4 * x + 0] = source[x * 3 + 0]; 349 dest[4 * x + 1] = source[x * 3 + 1]; 350 dest[4 * x + 2] = source[x * 3 + 2]; 351 dest[4 * x + 3] = 1.0f; 352 } 353 } 354 } 355 356 void Image::loadRGBFloatDataToNative(GLsizei width, GLsizei height, 357 int inputPitch, const void *input, size_t outputPitch, void *output) 358 { 359 const float *source = NULL; 360 float *dest = NULL; 361 362 for (int y = 0; y < height; y++) 363 { 364 source = reinterpret_cast<const float*>(static_cast<const unsigned char*>(input) + y * inputPitch); 365 dest = reinterpret_cast<float*>(static_cast<unsigned char*>(output) + y * outputPitch); 366 memcpy(dest, source, width * 12); 367 } 368 } 369 370 void Image::loadRGBHalfFloatDataToRGBA(GLsizei width, GLsizei height, 371 int inputPitch, const void *input, size_t outputPitch, void *output) 372 { 373 const unsigned short *source = NULL; 374 unsigned short *dest = NULL; 375 376 for (int y = 0; y < height; y++) 377 { 378 source = reinterpret_cast<const unsigned short*>(static_cast<const unsigned char*>(input) + y * inputPitch); 379 dest = reinterpret_cast<unsigned short*>(static_cast<unsigned char*>(output) + y * outputPitch); 380 for (int x = 0; x < width; x++) 381 { 382 dest[4 * x + 0] = source[x * 3 + 0]; 383 dest[4 * x + 1] = source[x * 3 + 1]; 384 dest[4 * x + 2] = source[x * 3 + 2]; 385 dest[4 * x + 3] = 0x3C00; // SEEEEEMMMMMMMMMM, S = 0, E = 15, M = 0: 16bit flpt representation of 1 386 } 387 } 388 } 389 390 void Image::loadRGBAUByteDataToBGRA(GLsizei width, GLsizei height, 391 int inputPitch, const void *input, size_t outputPitch, void *output) 392 { 393 const unsigned int *source = NULL; 394 unsigned int *dest = NULL; 395 for (int y = 0; y < height; y++) 396 { 397 source = reinterpret_cast<const unsigned int*>(static_cast<const unsigned char*>(input) + y * inputPitch); 398 dest = reinterpret_cast<unsigned int*>(static_cast<unsigned char*>(output) + y * outputPitch); 399 400 for (int x = 0; x < width; x++) 401 { 402 unsigned int rgba = source[x]; 403 dest[x] = (_rotl(rgba, 16) & 0x00ff00ff) | (rgba & 0xff00ff00); 404 } 405 } 406 } 407 408 void Image::loadRGBAUByteDataToNative(GLsizei width, GLsizei height, 409 int inputPitch, const void *input, size_t outputPitch, void *output) 410 { 411 const unsigned int *source = NULL; 412 unsigned int *dest = NULL; 413 for (int y = 0; y < height; y++) 414 { 415 source = reinterpret_cast<const unsigned int*>(static_cast<const unsigned char*>(input) + y * inputPitch); 416 dest = reinterpret_cast<unsigned int*>(static_cast<unsigned char*>(output) + y * outputPitch); 417 418 memcpy(dest, source, width * 4); 419 } 420 } 421 422 void Image::loadRGBA4444DataToBGRA(GLsizei width, GLsizei height, 423 int inputPitch, const void *input, size_t outputPitch, void *output) 424 { 425 const unsigned short *source = NULL; 426 unsigned char *dest = NULL; 427 428 for (int y = 0; y < height; y++) 429 { 430 source = reinterpret_cast<const unsigned short*>(static_cast<const unsigned char*>(input) + y * inputPitch); 431 dest = static_cast<unsigned char*>(output) + y * outputPitch; 432 for (int x = 0; x < width; x++) 433 { 434 unsigned short rgba = source[x]; 435 dest[4 * x + 0] = ((rgba & 0x00F0) << 0) | ((rgba & 0x00F0) >> 4); 436 dest[4 * x + 1] = ((rgba & 0x0F00) >> 4) | ((rgba & 0x0F00) >> 8); 437 dest[4 * x + 2] = ((rgba & 0xF000) >> 8) | ((rgba & 0xF000) >> 12); 438 dest[4 * x + 3] = ((rgba & 0x000F) << 4) | ((rgba & 0x000F) >> 0); 439 } 440 } 441 } 442 443 void Image::loadRGBA4444DataToRGBA(GLsizei width, GLsizei height, 444 int inputPitch, const void *input, size_t outputPitch, void *output) 445 { 446 const unsigned short *source = NULL; 447 unsigned char *dest = NULL; 448 449 for (int y = 0; y < height; y++) 450 { 451 source = reinterpret_cast<const unsigned short*>(static_cast<const unsigned char*>(input) + y * inputPitch); 452 dest = static_cast<unsigned char*>(output) + y * outputPitch; 453 for (int x = 0; x < width; x++) 454 { 455 unsigned short rgba = source[x]; 456 dest[4 * x + 0] = ((rgba & 0xF000) >> 8) | ((rgba & 0xF000) >> 12); 457 dest[4 * x + 1] = ((rgba & 0x0F00) >> 4) | ((rgba & 0x0F00) >> 8); 458 dest[4 * x + 2] = ((rgba & 0x00F0) << 0) | ((rgba & 0x00F0) >> 4); 459 dest[4 * x + 3] = ((rgba & 0x000F) << 4) | ((rgba & 0x000F) >> 0); 460 } 461 } 462 } 463 464 void Image::loadRGBA5551DataToBGRA(GLsizei width, GLsizei height, 465 int inputPitch, const void *input, size_t outputPitch, void *output) 466 { 467 const unsigned short *source = NULL; 468 unsigned char *dest = NULL; 469 470 for (int y = 0; y < height; y++) 471 { 472 source = reinterpret_cast<const unsigned short*>(static_cast<const unsigned char*>(input) + y * inputPitch); 473 dest = static_cast<unsigned char*>(output) + y * outputPitch; 474 for (int x = 0; x < width; x++) 475 { 476 unsigned short rgba = source[x]; 477 dest[4 * x + 0] = ((rgba & 0x003E) << 2) | ((rgba & 0x003E) >> 3); 478 dest[4 * x + 1] = ((rgba & 0x07C0) >> 3) | ((rgba & 0x07C0) >> 8); 479 dest[4 * x + 2] = ((rgba & 0xF800) >> 8) | ((rgba & 0xF800) >> 13); 480 dest[4 * x + 3] = (rgba & 0x0001) ? 0xFF : 0; 481 } 482 } 483 } 484 485 void Image::loadRGBA5551DataToRGBA(GLsizei width, GLsizei height, 486 int inputPitch, const void *input, size_t outputPitch, void *output) 487 { 488 const unsigned short *source = NULL; 489 unsigned char *dest = NULL; 490 491 for (int y = 0; y < height; y++) 492 { 493 source = reinterpret_cast<const unsigned short*>(static_cast<const unsigned char*>(input) + y * inputPitch); 494 dest = static_cast<unsigned char*>(output) + y * outputPitch; 495 for (int x = 0; x < width; x++) 496 { 497 unsigned short rgba = source[x]; 498 dest[4 * x + 0] = ((rgba & 0xF800) >> 8) | ((rgba & 0xF800) >> 13); 499 dest[4 * x + 1] = ((rgba & 0x07C0) >> 3) | ((rgba & 0x07C0) >> 8); 500 dest[4 * x + 2] = ((rgba & 0x003E) << 2) | ((rgba & 0x003E) >> 3); 501 dest[4 * x + 3] = (rgba & 0x0001) ? 0xFF : 0; 502 } 503 } 504 } 505 506 void Image::loadRGBAFloatDataToRGBA(GLsizei width, GLsizei height, 507 int inputPitch, const void *input, size_t outputPitch, void *output) 508 { 509 const float *source = NULL; 510 float *dest = NULL; 511 512 for (int y = 0; y < height; y++) 513 { 514 source = reinterpret_cast<const float*>(static_cast<const unsigned char*>(input) + y * inputPitch); 515 dest = reinterpret_cast<float*>(static_cast<unsigned char*>(output) + y * outputPitch); 516 memcpy(dest, source, width * 16); 517 } 518 } 519 520 void Image::loadRGBAHalfFloatDataToRGBA(GLsizei width, GLsizei height, 521 int inputPitch, const void *input, size_t outputPitch, void *output) 522 { 523 const unsigned char *source = NULL; 524 unsigned char *dest = NULL; 525 526 for (int y = 0; y < height; y++) 527 { 528 source = static_cast<const unsigned char*>(input) + y * inputPitch; 529 dest = static_cast<unsigned char*>(output) + y * outputPitch; 530 memcpy(dest, source, width * 8); 531 } 532 } 533 534 void Image::loadBGRADataToBGRA(GLsizei width, GLsizei height, 535 int inputPitch, const void *input, size_t outputPitch, void *output) 536 { 537 const unsigned char *source = NULL; 538 unsigned char *dest = NULL; 539 540 for (int y = 0; y < height; y++) 541 { 542 source = static_cast<const unsigned char*>(input) + y * inputPitch; 543 dest = static_cast<unsigned char*>(output) + y * outputPitch; 544 memcpy(dest, source, width*4); 545 } 546 } 547 548 } 549