source: libpipi/trunk/pipi/stock.c @ 2844

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

Fix headers.

File size: 5.2 KB
Line 
1/*
2 *  libpipi       Pathetic image processing interface library
3 *  Copyright (c) 2004-2008 Sam Hocevar <sam@zoy.org>
4 *                All Rights Reserved
5 *
6 *  $Id$
7 *
8 *  This library is free software. It comes without any warranty, to
9 *  the extent permitted by applicable law. You can redistribute it
10 *  and/or modify it under the terms of the Do What The Fuck You Want
11 *  To Public License, Version 2, as published by Sam Hocevar. See
12 *  http://sam.zoy.org/wtfpl/COPYING for more details.
13 */
14
15/*
16 * stock.c: stock images
17 */
18
19#include "config.h"
20#include "common.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
29pipi_image_t *pipi_load_stock(char const *name)
30{
31    pipi_image_t *ret;
32    pipi_pixels_t *pix;
33
34    /* Generate a Bayer dithering pattern. */
35    if(!strncmp(name, "bayer:", 6))
36    {
37        int w, h = 0;
38
39        w = atoi(name + 6);
40        name = strchr(name + 6, 'x');
41        if(name)
42            h = atoi(name + 1);
43        if(!h)
44            h = w;
45
46        return pipi_render_bayer(w, h);
47    }
48
49    /* Generate a clustered dithering pattern. */
50    if(!strncmp(name, "halftone:", 9))
51    {
52        int w, h = 0;
53
54        w = atoi(name + 9);
55        name = strchr(name + 9, 'x');
56        if(name)
57            h = atoi(name + 1);
58        if(!h)
59            h = w;
60
61        return pipi_render_halftone(w, h);
62    }
63
64    /* Generate an error diffusion matrix. */
65    if(!strncmp(name, "ediff:", 6))
66    {
67        float const *ker;
68        int w, h;
69
70        if(!strcmp(name + 6, "fs"))
71        {
72            static float const myker[] =
73            {
74                   0.,     1.,  7./16,
75                3./16,  5./16,  1./16,
76            };
77            ker = myker; w = 3; h = 2;
78        }
79        else if(!strcmp(name + 6, "jajuni"))
80        {
81            static float const myker[] =
82            {
83                   0.,     0.,     1.,  7./48,  5./48,
84                3./48,  5./48,  7./48,  5./48,  3./48,
85                1./48,  3./48,  5./48,  3./48,  1./48,
86            };
87            ker = myker; w = 5; h = 3;
88        }
89        else if(!strcmp(name + 6, "atkinson"))
90        {
91            static float const myker[] =
92            {
93                  0.,    1.,  1./8,  1./8,
94                1./8,  1./8,  1./8,    0.,
95                  0.,  1./8,    0.,    0.,
96            };
97            ker = myker; w = 4; h = 3;
98        }
99        else if(!strcmp(name + 6, "fan"))
100        {
101            static float const myker[] =
102            {
103                   0.,     0.,     1.,  7./16,
104                1./16,  3./16,  5./16,     0.,
105            };
106            ker = myker; w = 4; h = 2;
107        }
108        else if(!strcmp(name + 6, "shiaufan"))
109        {
110            static float const myker[] =
111            {
112                  0.,    0.,    1.,  1./2,
113                1./8,  1./8,  1./4,    0.,
114            };
115            ker = myker; w = 4; h = 2;
116        }
117        else if(!strcmp(name + 6, "shiaufan2"))
118        {
119            static float const myker[] =
120            {
121                   0.,     0.,    0.,    1.,  1./2,
122                1./16,  1./16,  1./8,  1./4,    0.,
123            };
124            ker = myker; w = 5; h = 2;
125        }
126        else if(!strcmp(name + 6, "stucki"))
127        {
128            static float const myker[] =
129            {
130                   0.,     0.,     1.,  8./42,  4./42,
131                2./42,  4./42,  8./42,  4./42,  2./42,
132                1./42,  2./42,  4./42,  2./42,  1./42,
133            };
134            ker = myker; w = 5; h = 3;
135        }
136        else if(!strcmp(name + 6, "burkes"))
137        {
138            static float const myker[] =
139            {
140                   0.,     0.,     1.,  4./16,  2./16,
141                1./16,  2./16,  4./16,  2./16,  1./16,
142            };
143            ker = myker; w = 5; h = 2;
144        }
145        else if(!strcmp(name + 6, "sierra"))
146        {
147            static float const myker[] =
148            {
149                   0.,     0.,     1.,  5./32,  3./32,
150                2./32,  4./32,  5./32,  4./32,  2./32,
151                   0.,  2./32,  3./32,  2./32,     0.,
152            };
153            ker = myker; w = 5; h = 3;
154        }
155        else if(!strcmp(name + 6, "sierra2"))
156        {
157            static float const myker[] =
158            {
159                   0.,     0.,     1.,  4./16,  3./16,
160                1./16,  2./16,  3./16,  2./16,  1./16,
161            };
162            ker = myker; w = 5; h = 2;
163        }
164        else if(!strcmp(name + 6, "lite"))
165        {
166            static float const myker[] =
167            {
168                  0.,    1.,  1./2,
169                1./4,  1./4,    0.,
170            };
171            ker = myker; w = 3; h = 2;
172        }
173        else
174            return NULL;
175
176        ret = pipi_new(w, h);
177        pix = pipi_getpixels(ret, PIPI_PIXELS_Y_F);
178        memcpy(pix->pixels, ker, w * h * sizeof(float));
179
180        return ret;
181    }
182
183    /* Generate a completely random image. */
184    if(!strncmp(name, "random:", 7))
185    {
186        int w, h = 0;
187
188        w = atoi(name + 7);
189        name = strchr(name + 7, 'x');
190        if(name)
191            h = atoi(name + 1);
192        if(!h)
193            h = w;
194        if(w <= 0 || h <= 0)
195            return NULL;
196
197        return pipi_render_random(w, h);
198    }
199
200    return NULL;
201}
202
Note: See TracBrowser for help on using the repository browser.