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

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

Change _C pixel format suffixes into _U8 for more clarity.

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_get_pixels(ret, PIPI_PIXELS_Y_F32);
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.