Changeset 2616


Ignore:
Timestamp:
Aug 1, 2008, 12:02:17 AM (13 years ago)
Author:
Sam Hocevar
Message:
  • pixels.c: add Floyd-Steinberg dithering to the float32 -> rgba32 conversion.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libpipi/trunk/pipi/pixels.c

    r2609 r2616  
    2828#include "pipi.h"
    2929#include "pipi_internals.h"
     30
     31#define GAMMA 2.2
    3032
    3133static void init_tables(void);
     
    8688        uint8_t *dest = (uint8_t *)img->p[type].pixels;
    8789
     90        init_tables();
     91
    8892        for(y = 0; y < img->h; y++)
    8993            for(x = 0; x < img->w; x++)
    9094                for(i = 0; i < 4; i++)
    9195                {
    92                     double p = src[4 * (y * img->w + x) + i];
    93                     dest[4 * (y * img->w + x) + i]
    94                         = (int)(255.999 * pow(p, 1. / 2.2));
     96                    double p, e;
     97                    uint8_t d;
     98
     99                    p = src[4 * (y * img->w + x) + i];
     100                    d = (int)(255.999 * pow(p, 1. / GAMMA));
     101                    dest[4 * (y * img->w + x) + i] = d;
     102
     103                    e = p - u8tof32(d);
     104                    if(x < img->w - 1)
     105                        src[4 * (y * img->w + x + 1) + i] += e * .4375;
     106                    if(y < img->h - 1)
     107                    {
     108                        if(x < img->w - 1)
     109                            src[4 * ((y + 1) * img->w + x - 1) + i] += e * .1875;
     110                        src[4 * ((y + 1) * img->w + x) + i] += e * .3125;
     111                        if(x < img->w - 1)
     112                            src[4 * ((y + 1) * img->w + x + 1) + i] += e * .0625;
     113                    }
    95114                }
    96115    }
     
    115134
    116135    for(i = 0; i < 256; i++)
    117         u8tof32_table[i] = pow((double)i / 255., 2.2);
     136        u8tof32_table[i] = pow((double)i / 255., GAMMA);
    118137
    119138    done = 1;
Note: See TracChangeset for help on using the changeset viewer.