source: libpipi/trunk/pipi/stock.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: 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
21#include <stdio.h>
22#include <stdlib.h>
23#include <string.h>
24
25#include "pipi.h"
26#include "pipi_internals.h"
27
28pipi_image_t *pipi_load_stock(char const *name)
29{
30    pipi_image_t *ret;
31    pipi_pixels_t *pix;
32
33    /* Generate a Bayer dithering pattern. */
34    if(!strncmp(name, "bayer:", 6))
35    {
36        int w, h = 0;
37
38        w = atoi(name + 6);
39        name = strchr(name + 6, 'x');
40        if(name)
41            h = atoi(name + 1);
42        if(!h)
43            h = w;
44
45        return pipi_render_bayer(w, h);
46    }
47
48    /* Generate a clustered dithering pattern. */
49    if(!strncmp(name, "halftone:", 9))
50    {
51        int w, h = 0;
52
53        w = atoi(name + 9);
54        name = strchr(name + 9, 'x');
55        if(name)
56            h = atoi(name + 1);
57        if(!h)
58            h = w;
59
60        return pipi_render_halftone(w, h);
61    }
62
63    /* Generate an error diffusion matrix. */
64    if(!strncmp(name, "ediff:", 6))
65    {
66        float const *ker;
67        int w, h;
68
69        if(!strcmp(name + 6, "fs"))
70        {
71            static float const myker[] =
72            {
73                   0.,     1.,  7./16,
74                3./16,  5./16,  1./16,
75            };
76            ker = myker; w = 3; h = 2;
77        }
78        else if(!strcmp(name + 6, "jajuni"))
79        {
80            static float const myker[] =
81            {
82                   0.,     0.,     1.,  7./48,  5./48,
83                3./48,  5./48,  7./48,  5./48,  3./48,
84                1./48,  3./48,  5./48,  3./48,  1./48,
85            };
86            ker = myker; w = 5; h = 3;
87        }
88        else if(!strcmp(name + 6, "atkinson"))
89        {
90            static float const myker[] =
91            {
92                  0.,    1.,  1./8,  1./8,
93                1./8,  1./8,  1./8,    0.,
94                  0.,  1./8,    0.,    0.,
95            };
96            ker = myker; w = 4; h = 3;
97        }
98        else if(!strcmp(name + 6, "fan"))
99        {
100            static float const myker[] =
101            {
102                   0.,     0.,     1.,  7./16,
103                1./16,  3./16,  5./16,     0.,
104            };
105            ker = myker; w = 4; h = 2;
106        }
107        else if(!strcmp(name + 6, "shiaufan"))
108        {
109            static float const myker[] =
110            {
111                  0.,    0.,    1.,  1./2,
112                1./8,  1./8,  1./4,    0.,
113            };
114            ker = myker; w = 4; h = 2;
115        }
116        else if(!strcmp(name + 6, "shiaufan2"))
117        {
118            static float const myker[] =
119            {
120                   0.,     0.,    0.,    1.,  1./2,
121                1./16,  1./16,  1./8,  1./4,    0.,
122            };
123            ker = myker; w = 5; h = 2;
124        }
125        else if(!strcmp(name + 6, "stucki"))
126        {
127            static float const myker[] =
128            {
129                   0.,     0.,     1.,  8./42,  4./42,
130                2./42,  4./42,  8./42,  4./42,  2./42,
131                1./42,  2./42,  4./42,  2./42,  1./42,
132            };
133            ker = myker; w = 5; h = 3;
134        }
135        else if(!strcmp(name + 6, "burkes"))
136        {
137            static float const myker[] =
138            {
139                   0.,     0.,     1.,  4./16,  2./16,
140                1./16,  2./16,  4./16,  2./16,  1./16,
141            };
142            ker = myker; w = 5; h = 2;
143        }
144        else if(!strcmp(name + 6, "sierra"))
145        {
146            static float const myker[] =
147            {
148                   0.,     0.,     1.,  5./32,  3./32,
149                2./32,  4./32,  5./32,  4./32,  2./32,
150                   0.,  2./32,  3./32,  2./32,     0.,
151            };
152            ker = myker; w = 5; h = 3;
153        }
154        else if(!strcmp(name + 6, "sierra2"))
155        {
156            static float const myker[] =
157            {
158                   0.,     0.,     1.,  4./16,  3./16,
159                1./16,  2./16,  3./16,  2./16,  1./16,
160            };
161            ker = myker; w = 5; h = 2;
162        }
163        else if(!strcmp(name + 6, "lite"))
164        {
165            static float const myker[] =
166            {
167                  0.,    1.,  1./2,
168                1./4,  1./4,    0.,
169            };
170            ker = myker; w = 3; h = 2;
171        }
172        else
173            return NULL;
174
175        ret = pipi_new(w, h);
176        pix = pipi_getpixels(ret, PIPI_PIXELS_Y_F);
177        memcpy(pix->pixels, ker, w * h * sizeof(float));
178
179        return ret;
180    }
181
182    /* Generate a completely random image. */
183    if(!strncmp(name, "random:", 7))
184    {
185        int w, h = 0;
186
187        w = atoi(name + 7);
188        name = strchr(name + 7, 'x');
189        if(name)
190            h = atoi(name + 1);
191        if(!h)
192            h = w;
193        if(w <= 0 || h <= 0)
194            return NULL;
195
196        return pipi_render_random(w, h);
197    }
198
199    return NULL;
200}
201
Note: See TracBrowser for help on using the repository browser.