source: libpipi/trunk/pipi/histogram/histogram.c @ 2902

Last change on this file since 2902 was 2902, checked in by Sam Hocevar, 11 years ago

Support C99 types on Win32 through the same hacks as in libcaca.

File size: 3.9 KB
Line 
1/*
2 *  libpipi       Pathetic image processing interface library
3 *  Copyright (c) 2004-2008 Sam Hocevar <sam@zoy.org>
4 *                2008 Jean-Yves Lamoureux <jylam@lnxscene.org
5 *                All Rights Reserved
6 *
7 *  $Id$
8 *
9 *  This library is free software. It comes without any warranty, to
10 *  the extent permitted by applicable law. You can redistribute it
11 *  and/or modify it under the terms of the Do What The Fuck You Want
12 *  To Public License, Version 2, as published by Sam Hocevar. See
13 *  http://sam.zoy.org/wtfpl/COPYING for more details.
14 */
15
16/*
17 * histogram.c: histogram functions
18 */
19
20#include "config.h"
21
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
25
26#include "pipi.h"
27#include "pipi_internals.h"
28
29
30pipi_histogram_t* pipi_new_histogram(void)
31{
32    return malloc(sizeof(pipi_histogram_t));
33}
34
35
36int pipi_get_image_histogram(pipi_image_t *img, pipi_histogram_t*h, int flags)
37{
38    int i;
39
40    if(!h) return -1;
41
42    uint8_t  *data = (uint8_t *)pipi_getpixels(img, PIPI_PIXELS_RGBA_C)->pixels;
43
44    for(i=0; i< img->w*img->h*4; i+=4)
45    {
46        if(flags&PIPI_COLOR_A)
47        h->a[data[i+3]]++;
48        if(flags&PIPI_COLOR_R)
49        h->r[data[i+2]]++;
50        if(flags&PIPI_COLOR_G)
51        h->g[data[i+1]]++;
52        if(flags&PIPI_COLOR_B)
53        h->b[data[i]]++;
54        if(flags&PIPI_COLOR_Y)
55        {
56            uint32_t p = 0.;
57            p += 0.299 * data[i];
58            p += 0.587 * data[i+1];
59            p += 0.114 * data[i+2];
60
61            h->y[p>255?255:p]++;
62        }
63    }
64
65    /* Normalize dataset */
66    unsigned int max;
67    float n;
68
69    if(flags&PIPI_COLOR_R)
70    {
71        max = 0;
72        for(i=0; i<256; i++)
73            if(h->r[i] > max) max = h->r[i];
74        n = 255.0f / max;
75        for(i=0; i<256; i++)
76            h->r[i]*=n;
77    }
78    if(flags&PIPI_COLOR_G)
79    {
80        max = 0;
81        for(i=0; i<256; i++)
82            if(h->g[i] > max) max = h->g[i];
83        n = 255.0f / max;
84        for(i=0; i<256; i++)
85            h->g[i]*=n;
86    }
87    if(flags&PIPI_COLOR_B)
88    {
89        max = 0;
90        for(i=0; i<256; i++)
91            if(h->b[i] > max) max = h->b[i];
92        n = 255.0f / max;
93        for(i=0; i<256; i++)
94            h->b[i]*=n;
95    }
96    if(flags&PIPI_COLOR_A)
97    {
98        max = 0;
99        for(i=0; i<256; i++)
100            if(h->a[i] > max) max = h->a[i];
101        n = 255.0f / max;
102        for(i=0; i<256; i++)
103            h->a[i]*=n;
104    }
105    if(flags&PIPI_COLOR_Y)
106    {
107        max = 0;
108        for(i=0; i<256; i++)
109            if(h->y[i] > max) max = h->y[i];
110        n = 255.0f / max;
111        for(i=0; i<256; i++)
112            h->y[i]*=n;
113    }
114
115
116    return 0;
117}
118
119int pipi_render_histogram(pipi_image_t *img, pipi_histogram_t*h, int flags)
120{
121    if(!img || !h) return -1;
122
123    int x;
124
125
126    for(x=0; x<256; x++)
127    {
128        if(flags&PIPI_COLOR_R)
129            pipi_draw_line(img,
130                           x, 255,
131                           x, 255 - h->r[x],
132                           0x00FF0000,
133                           0);
134        if(flags&PIPI_COLOR_G)
135            pipi_draw_line(img,
136                           x, 255,
137                           x, 255 - h->g[x],
138                           0x0000FF00,
139                           0);
140        if(flags&PIPI_COLOR_B)
141            pipi_draw_line(img,
142                           x, 255,
143                           x, 255 - h->b[x],
144                           0x000000FF,
145                           0);
146        if(flags&PIPI_COLOR_A)
147            pipi_draw_line(img,
148                           x, 255,
149                           x, 255 - h->a[x],
150                           0x00000FFF,
151                           0);
152        if(flags&PIPI_COLOR_Y)
153            pipi_draw_line(img,
154                           x, 255,
155                           x, 255 - h->y[x],
156                           0x00FFFFFF,
157                           0);
158    }
159
160    return 0;
161}
162
163
164int pipi_free_histogram(pipi_histogram_t* h)
165{
166    if(h) free(h);
167    else  return -1;
168
169    return 0;
170}
Note: See TracBrowser for help on using the repository browser.