Changeset 2630


Ignore:
Timestamp:
Aug 2, 2008, 2:00:56 AM (14 years ago)
Author:
Sam Hocevar
Message:
  • pixels.c: add support for 24-bpp BGR format.
Location:
libpipi/trunk/pipi
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • libpipi/trunk/pipi/pipi.h

    r2629 r2630  
    3333
    3434    PIPI_PIXELS_RGBA32 = 0,
    35     PIPI_PIXELS_RGBA_F = 1,
     35    PIPI_PIXELS_BGR24 = 1,
     36    PIPI_PIXELS_RGBA_F = 2,
    3637
    37     PIPI_PIXELS_MAX = 2
     38    PIPI_PIXELS_MAX = 3
    3839}
    3940pipi_format_t;
  • libpipi/trunk/pipi/pixels.c

    r2620 r2630  
    5757            bytes = img->w * img->h * 4 * sizeof(uint8_t);
    5858            break;
     59        case PIPI_PIXELS_BGR24:
     60            bytes = img->w * img->h * 3 * sizeof(uint8_t);
     61            break;
    5962        case PIPI_PIXELS_RGBA_F:
    6063            bytes = img->w * img->h * 4 * sizeof(float);
     
    8285                        = u8tof32(src[4 * (y * img->w + x) + i]);
    8386    }
     87    else if(img->last_modified == PIPI_PIXELS_BGR24
     88                       && type == PIPI_PIXELS_RGBA_F)
     89    {
     90        uint8_t *src = (uint8_t *)img->p[PIPI_PIXELS_BGR24].pixels;
     91        float *dest = (float *)img->p[type].pixels;
     92
     93        init_tables();
     94
     95        for(y = 0; y < img->h; y++)
     96            for(x = 0; x < img->w; x++)
     97            {
     98                dest[4 * (y * img->w + x)]
     99                    = u8tof32(src[3 * (y * img->w + x) + 2]);
     100                dest[4 * (y * img->w + x) + 1]
     101                    = u8tof32(src[3 * (y * img->w + x) + 1]);
     102                dest[4 * (y * img->w + x) + 2]
     103                    = u8tof32(src[3 * (y * img->w + x)]);
     104                dest[4 * (y * img->w + x) + 3] = 1.0;
     105            }
     106    }
    84107    else if(img->last_modified == PIPI_PIXELS_RGBA_F
    85108                       && type == PIPI_PIXELS_RGBA32)
     
    118141                }
    119142    }
     143    else if(img->last_modified == PIPI_PIXELS_RGBA_F
     144                       && type == PIPI_PIXELS_BGR24)
     145    {
     146        float *src = (float *)img->p[PIPI_PIXELS_RGBA_F].pixels;
     147        uint8_t *dest = (uint8_t *)img->p[type].pixels;
     148
     149        init_tables();
     150
     151        for(y = 0; y < img->h; y++)
     152            for(x = 0; x < img->w; x++)
     153                for(i = 0; i < 3; i++)
     154                {
     155                    double p, e;
     156                    uint8_t d;
     157
     158                    p = src[4 * (y * img->w + x) + i];
     159
     160                    if(p < 0.) d = 0.;
     161                    else if(p > 1.) d = 255;
     162                    else d = (int)(255.999 * pow(p, 1. / GAMMA));
     163
     164                    dest[3 * (y * img->w + x) + i] = d;
     165
     166                    e = p - u8tof32(d);
     167                    if(x < img->w - 1)
     168                        src[4 * (y * img->w + x + 1) + i] += e * .4375;
     169                    if(y < img->h - 1)
     170                    {
     171                        if(x < img->w - 1)
     172                            src[4 * ((y + 1) * img->w + x - 1) + i] += e * .1875;
     173                        src[4 * ((y + 1) * img->w + x) + i] += e * .3125;
     174                        if(x < img->w - 1)
     175                            src[4 * ((y + 1) * img->w + x + 1) + i] += e * .0625;
     176                    }
     177                }
     178    }
    120179    else
    121180    {
Note: See TracChangeset for help on using the changeset viewer.