Changeset 464 for libcaca


Ignore:
Timestamp:
Jan 14, 2005, 12:59:55 AM (17 years ago)
Author:
Sam Hocevar
Message:
  • src/bitmap.c: + Implemented caca_set_bitmap_gamma().
Location:
libcaca/trunk/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/src/bitmap.c

    r378 r464  
    4646#include <limits.h>
    4747#include <string.h>
     48#include <math.h>
    4849
    4950#include "caca.h"
     
    171172    void (*get_hsv)(struct caca_bitmap *, char *, int, int);
    172173    int red[256], green[256], blue[256], alpha[256];
     174    float gammaval;
     175    int gammatab[4097];
    173176};
    174177#endif
     
    224227{
    225228    struct caca_bitmap *bitmap;
     229    int i;
    226230
    227231    /* Minor sanity test */
     
    258262    if(bpp == 8)
    259263    {
    260         int i;
    261264        bitmap->has_palette = 1;
    262265        bitmap->has_alpha = 0;
     
    268271        }
    269272    }
     273
     274    /* Default gamma value */
     275    for(i = 0; i < 4096; i++)
     276        bitmap->gammatab[i] = i;
    270277
    271278    return bitmap;
     
    312319
    313320    bitmap->has_alpha = has_alpha;
     321}
     322
     323/**
     324 * \brief Set the gamma of a bitmap object.
     325 *
     326 * Set the gamma of bitmap.
     327 *
     328 * \param bitmap Bitmap object.
     329 * \param red Gamma value.
     330 */
     331void caca_set_bitmap_gamma(struct caca_bitmap *bitmap, float gammaval)
     332{
     333    int i;
     334
     335    if(gammaval <= 0.0)
     336        return;
     337
     338    bitmap->gammaval = gammaval;
     339
     340    for(i = 0; i < 4096; i++)
     341        bitmap->gammatab[i] = 4096.0 * powf((float)i / 4096.0, 1.0 / gammaval);
    314342}
    315343
     
    371399    if(bitmap->has_palette)
    372400    {
    373         *r += bitmap->red[bits];
    374         *g += bitmap->green[bits];
    375         *b += bitmap->blue[bits];
     401        *r += bitmap->gammatab[bitmap->red[bits]];
     402        *g += bitmap->gammatab[bitmap->green[bits]];
     403        *b += bitmap->gammatab[bitmap->blue[bits]];
    376404        *a += bitmap->alpha[bits];
    377405    }
    378406    else
    379407    {
    380         *r += ((bits & bitmap->rmask) >> bitmap->rright) << bitmap->rleft;
    381         *g += ((bits & bitmap->gmask) >> bitmap->gright) << bitmap->gleft;
    382         *b += ((bits & bitmap->bmask) >> bitmap->bright) << bitmap->bleft;
     408        *r += bitmap->gammatab[((bits & bitmap->rmask) >> bitmap->rright) << bitmap->rleft];
     409        *g += bitmap->gammatab[((bits & bitmap->gmask) >> bitmap->gright) << bitmap->gleft];
     410        *b += bitmap->gammatab[((bits & bitmap->bmask) >> bitmap->bright) << bitmap->bleft];
    383411        *a += ((bits & bitmap->amask) >> bitmap->aright) << bitmap->aleft;
    384412    }
  • libcaca/trunk/src/caca.h

    r463 r464  
    348348                             unsigned int r[], unsigned int g[],
    349349                             unsigned int b[], unsigned int a[]);
     350void caca_set_bitmap_gamma(struct caca_bitmap *, float);
    350351void caca_draw_bitmap(int, int, int, int, struct caca_bitmap const *, void *);
    351352void caca_free_bitmap(struct caca_bitmap *);
Note: See TracChangeset for help on using the changeset viewer.