Changeset 2630


Ignore:
Timestamp:
08/02/08 02:00:56 (5 years ago)
Author:
sam
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.