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

Last change on this file since 2905 was 2905, checked in by Sam Hocevar, 12 years ago

Remove tabs in the code here and there.

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    uint8_t  *data;
39    float n;
40    unsigned int max;
41    int i;
42
43    if(!h) return -1;
44
45    data = (uint8_t *)pipi_getpixels(img, PIPI_PIXELS_RGBA_C)->pixels;
46
47    for(i=0; i< img->w*img->h*4; i+=4)
48    {
49        if(flags&PIPI_COLOR_A)
50        h->a[data[i+3]]++;
51        if(flags&PIPI_COLOR_R)
52        h->r[data[i+2]]++;
53        if(flags&PIPI_COLOR_G)
54        h->g[data[i+1]]++;
55        if(flags&PIPI_COLOR_B)
56        h->b[data[i]]++;
57        if(flags&PIPI_COLOR_Y)
58        {
59            uint32_t p = 0.;
60            p += 0.299 * data[i];
61            p += 0.587 * data[i+1];
62            p += 0.114 * data[i+2];
63
64            h->y[p>255?255:p]++;
65        }
66    }
67
68    /* Normalize dataset */
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    return 0;
116}
117
118int pipi_render_histogram(pipi_image_t *img, pipi_histogram_t*h, int flags)
119{
120    int x;
121
122    if(!img || !h) return -1;
123
124    for(x=0; x<256; x++)
125    {
126        if(flags&PIPI_COLOR_R)
127            pipi_draw_line(img,
128                           x, 255,
129                           x, 255 - h->r[x],
130                           0x00FF0000,
131                           0);
132        if(flags&PIPI_COLOR_G)
133            pipi_draw_line(img,
134                           x, 255,
135                           x, 255 - h->g[x],
136                           0x0000FF00,
137                           0);
138        if(flags&PIPI_COLOR_B)
139            pipi_draw_line(img,
140                           x, 255,
141                           x, 255 - h->b[x],
142                           0x000000FF,
143                           0);
144        if(flags&PIPI_COLOR_A)
145            pipi_draw_line(img,
146                           x, 255,
147                           x, 255 - h->a[x],
148                           0x00000FFF,
149                           0);
150        if(flags&PIPI_COLOR_Y)
151            pipi_draw_line(img,
152                           x, 255,
153                           x, 255 - h->y[x],
154                           0x00FFFFFF,
155                           0);
156    }
157
158    return 0;
159}
160
161
162int pipi_free_histogram(pipi_histogram_t* h)
163{
164    if(h) free(h);
165    else  return -1;
166
167    return 0;
168}
Note: See TracBrowser for help on using the repository browser.