Home | History | Annotate | Download | only in renderer
      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