pikl 0.2.7 → 0.2.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,12 @@
1
+ #ifndef _LIB_PIKL_BLUR_
2
+ #define _LIB_PIKL_BLUR_
3
+
4
+ #include <stdio.h>
5
+ #include <stdlib.h>
6
+ #include <string.h>
7
+ #include <math.h>
8
+
9
+ #include "pikl.h"
10
+ #include "pikl_private.h"
11
+
12
+ #endif
@@ -0,0 +1,126 @@
1
+ #include "pikl_decrease.h"
2
+
3
+ //=============================================================================
4
+ // median
5
+ //=============================================================================
6
+ PKLExport int pkl_mediancut(PKLImage pkl, int ncolors, int dither)
7
+ {
8
+ unsigned char QuantizedPalette[256*3], *Picture256;
9
+ int i, j;
10
+
11
+ if(pkl->color!=PKL_RGB) return(1);
12
+ if(ncolors<=0 || ncolors>256) return(1);
13
+
14
+ Picture256 = malloc(pkl->width*pkl->height);
15
+ if(!Picture256) return(1);
16
+
17
+ to_indexed(pkl->image, ncolors, dither, pkl->width, pkl->height, Picture256, QuantizedPalette);
18
+
19
+ for(i=0,j=0; i<pkl->height*pkl->width*3; i+=3,j++)
20
+ memcpy(&pkl->image[i], &QuantizedPalette[ Picture256[j]*3 ], pkl->channel);
21
+
22
+ free(Picture256);
23
+ return(0);
24
+ }
25
+
26
+ //=============================================================================
27
+ // pkl_neuquant
28
+ //=============================================================================
29
+ PKLExport int pkl_neuquant(PKLImage pkl, int ncolors, int sample)
30
+ {
31
+ unsigned char QuantizedPalette[256*3], *Picture256;
32
+ int i, j;
33
+
34
+ if(pkl->color!=PKL_RGB) return(1);
35
+ if(ncolors<=0 || ncolors>256) return(1);
36
+ if(sample<=0 || sample>30) return(1);
37
+
38
+ Picture256 = malloc(pkl->width*pkl->height);
39
+
40
+ neuReduce(pkl->image, ncolors, pkl->width*pkl->height, sample, Picture256, QuantizedPalette);
41
+
42
+ for(i=0,j=0; i<pkl->height*pkl->width*3; i+=3,j++)
43
+ memcpy(&pkl->image[i], &QuantizedPalette[ Picture256[j]*3 ], pkl->channel);
44
+
45
+ free(Picture256);
46
+ return(0);
47
+ }
48
+
49
+ //=============================================================================
50
+ // pkl_wu
51
+ //=============================================================================
52
+ PKLExport int pkl_wu(PKLImage pkl, int ncolors)
53
+ {
54
+ unsigned char QuantizedPalette[256*3], *QuantizedPicture;
55
+ unsigned char *p, *q;
56
+ int i;
57
+
58
+ if(pkl->color!=PKL_RGB) return(1);
59
+ if(ncolors<=0 || ncolors>256) return(1);
60
+
61
+ QuantizedPicture = malloc(pkl->width*pkl->height);
62
+
63
+ wuReduce(pkl->image, ncolors, pkl->width*pkl->height, QuantizedPicture, QuantizedPalette);
64
+
65
+ p = pkl->image;
66
+ q = QuantizedPicture;
67
+ for(i=0; i<pkl->height*pkl->width; i++){
68
+ *p++ = QuantizedPalette[ (*q)*3+0 ];
69
+ *p++ = QuantizedPalette[ (*q)*3+1 ];
70
+ *p++ = QuantizedPalette[ (*q)*3+2 ];
71
+ q++;
72
+ }
73
+ free(QuantizedPicture);
74
+ return(0);
75
+ }
76
+
77
+ //=============================================================================
78
+ // pkl_posterize
79
+ //=============================================================================
80
+ PKLExport int pkl_posterize(PKLImage pkl, int level)
81
+ {
82
+ unsigned char *p, color[PKL_COLOR];
83
+ int i, j, k;
84
+ double d, n;
85
+
86
+ if(level<1 && level>256) return(1);
87
+
88
+ n = (256.0/(double)level);
89
+ d = 255.0/(double)((double)level-1.0);
90
+
91
+ for(i=0; i<level; i++)
92
+ for(j=floor(i*n); j<floor((i+1)*n); j++)
93
+ color[j]= PKL_COLOR_CLIP(d*i);
94
+
95
+ for(i=0; i<pkl->height; i++){
96
+ for(j=0; j<pkl->width; j++){
97
+ p = &pkl->image[(i*pkl->width+j)*pkl->channel];
98
+ for(k=0; k<pkl->channel; k++,p++)
99
+ *p = color[*p];
100
+ }
101
+ }
102
+ return(0);
103
+ }
104
+
105
+ //=============================================================================
106
+ // pkl_cutcolor
107
+ //=============================================================================
108
+ PKLExport int pkl_cutcolor(PKLImage pkl, int level)
109
+ {
110
+ unsigned char *p;
111
+ int i, j, k;
112
+
113
+ if(level<0 && level>256) return(1);
114
+
115
+ for(i=0; i<pkl->height; i++){
116
+ for(j=0; j<pkl->width; j++){
117
+ p = &pkl->image[(i*pkl->width+j)*pkl->channel];
118
+ for(k=0; k<pkl->channel; k++){
119
+ *p = (*p & level);
120
+ p++;
121
+ }
122
+ }
123
+ }
124
+ return(0);
125
+ }
126
+
@@ -0,0 +1,19 @@
1
+ #ifndef _LIB_PIKL_DECREASE_
2
+ #define _LIB_PIKL_DECREASE_
3
+
4
+ #include <stdio.h>
5
+ #include <stdlib.h>
6
+ #include <string.h>
7
+ #include <math.h>
8
+
9
+ #include "pikl.h"
10
+ #include "pikl_private.h"
11
+
12
+
13
+ #include "decrease/median.h"
14
+ #include "decrease/neuquant.h"
15
+ #include "decrease/wu.h"
16
+ //#include "decrease/dl.h"
17
+ //#include "decrease/ccmap.h"
18
+
19
+ #endif
@@ -0,0 +1,240 @@
1
+ #include "pikl_effect2.h"
2
+
3
+ //=============================================================================
4
+ // pkl_invert
5
+ //=============================================================================
6
+ PKLExport int pkl_invert(PKLImage pkl)
7
+ {
8
+ int i;
9
+ for(i=0; i<pkl->height*pkl->width*pkl->channel; i++)
10
+ pkl->image[i] ^= 0xff;
11
+ return(0);
12
+ }
13
+
14
+ //=============================================================================
15
+ // pkl_composite
16
+ //=============================================================================
17
+ PKLExport int pkl_composite(PKLImage parent, PKLImage child, int xpos, int ypos)
18
+ {
19
+ int tw, th, i, j;
20
+
21
+ if(parent->channel != child->channel) return(1);
22
+ if(xpos<0 || xpos>=parent->width || ypos<0 || ypos>=parent->height) return(1);
23
+
24
+ tw = (xpos+child->width > parent->width) ? parent->width-xpos : child->width;
25
+ th = (ypos+child->height > parent->height) ? parent->height-ypos : child->height;
26
+
27
+ for(i=ypos,j=0; i<th+ypos; i++,j++){
28
+ memcpy(&parent->image[(i*parent->width+xpos)*parent->channel],
29
+ &child->image[j*child->width*child->channel], tw*child->channel);
30
+ }
31
+
32
+ return(0);
33
+ }
34
+
35
+ //=============================================================================
36
+ // pkl_composite2
37
+ //=============================================================================
38
+ PKLExport int pkl_composite2(PKLImage parent, PKLImage child, int xpos, int ypos, int transcolor)
39
+ {
40
+ int tw, th, i, j, s, t, hit;
41
+ unsigned char trans[PKL_CHANNEL];
42
+
43
+ if(parent->channel != child->channel) return(1);
44
+ if(xpos<0 || xpos>=parent->width || ypos<0 || ypos>=parent->height) return(1);
45
+
46
+ for(i=0; i<parent->channel; i++)
47
+ trans[i] = (transcolor>>((parent->channel-i)*8) & 0xFF);
48
+
49
+ tw = (xpos+child->width > parent->width) ? parent->width-xpos : child->width;
50
+ th = (ypos+child->height > parent->height) ? parent->height-ypos : child->height;
51
+
52
+ for(i=ypos,j=0; i<th+ypos; i++,j++){
53
+ for(s=0; s<tw; s++){
54
+ hit = 0;
55
+ for(t=0; t<child->channel; t++){
56
+ if(child->image[(j*child->width+s)*child->channel+t] == trans[t]) hit++;
57
+ }
58
+
59
+ if(hit!=child->channel){
60
+ memcpy(&parent->image[(i*parent->width+xpos+s)*parent->channel],
61
+ &child->image[(j*child->width+s)*child->channel], child->channel);
62
+ }
63
+ }
64
+ }
65
+
66
+ return(0);
67
+ }
68
+
69
+ //=============================================================================
70
+ // pkl_sepia
71
+ //=============================================================================
72
+ PKLExport int pkl_sepia(PKLImage pkl, double red_weight, double green_weight, double blue_weight)
73
+ {
74
+ unsigned char *wrk;
75
+ int i, j, color;
76
+
77
+ if(pkl->color!=PKL_RGB) return(1);
78
+
79
+ wrk = malloc(pkl->width*pkl->height*pkl->channel);
80
+ if(!wrk) return(1);
81
+ memset(wrk, 0, pkl->width*pkl->height*pkl->channel);
82
+
83
+ for(i=0; i<pkl->height; i++){
84
+ for(j=0; j<pkl->width; j++){
85
+ color = ((pkl->image[(i*pkl->width+j)*pkl->channel+0]+
86
+ pkl->image[(i*pkl->width+j)*pkl->channel+1]+
87
+ pkl->image[(i*pkl->width+j)*pkl->channel+2]) / 3);
88
+
89
+ wrk[(i*pkl->width+j)*pkl->channel+0] = PKL_COLOR_CLIP(color*red_weight);
90
+ wrk[(i*pkl->width+j)*pkl->channel+1] = PKL_COLOR_CLIP(color*green_weight);
91
+ wrk[(i*pkl->width+j)*pkl->channel+2] = PKL_COLOR_CLIP(color*blue_weight);
92
+ }
93
+ }
94
+
95
+ free(pkl->image);
96
+ pkl->image = wrk;
97
+ return(0);
98
+ }
99
+
100
+ //=============================================================================
101
+ // pkl_oilpaint
102
+ //=============================================================================
103
+ PKLExport int pkl_oilpaint(PKLImage pkl, int weight)
104
+ {
105
+ int color[PKL_COLOR], gray;
106
+ int i, j, k, max, s, t, sx, sy, tx, ty;
107
+ unsigned char *wrk;
108
+
109
+ wrk = malloc(pkl->width*pkl->height*pkl->channel);
110
+ if(!wrk) return(1);
111
+ memset(wrk, 0, pkl->width*pkl->height*pkl->channel);
112
+
113
+ for(i=0; i<pkl->width*pkl->height*pkl->channel; i+=pkl->channel){
114
+ gray=0;
115
+ for(k=0; k<pkl->channel; k++)
116
+ gray += pkl->image[i+k];
117
+ wrk[i] = PKL_COLOR_CLIP(gray/pkl->channel);
118
+ }
119
+
120
+ //get histgram
121
+ memset(color, 0, sizeof(int)*PKL_COLOR);
122
+ for(i=0; i<pkl->height*pkl->width; i+=pkl->channel) color[wrk[i]]++;
123
+
124
+ //���Ӄs�N�Z������ŕp�F��I��
125
+ for(i=0; i<pkl->height; i++){
126
+ for(j=0; j<pkl->width; j++){
127
+ max = 0;
128
+ tx=j;
129
+ ty=i;
130
+ for(s=0; s<weight; s++){
131
+ for(t=0; t<weight; t++){
132
+ sx = (t+j > pkl->width) ? pkl->width-1 : t+j;
133
+ sy = (s+i > pkl->height) ? pkl->height-1 : s+i;
134
+ if(max<color[wrk[(sy*pkl->width+sx)*pkl->channel]]){
135
+ max = color[wrk[(sy*pkl->width+sx)*pkl->channel]];
136
+ tx = sx;
137
+ ty = sy;
138
+ }
139
+ }
140
+ }
141
+ //�I���W�i���̐F��K�p
142
+ memcpy(&wrk[(i*pkl->width+j)*pkl->channel], &pkl->image[(ty*pkl->width+tx)*pkl->channel], pkl->channel);
143
+ }
144
+ }
145
+
146
+ free(pkl->image);
147
+ pkl->image = wrk;
148
+ return(0);
149
+ }
150
+
151
+ //=============================================================================
152
+ // pkl_focus
153
+ //=============================================================================
154
+ PKLExport int pkl_focus(PKLImage pkl, PKL_FOCUS type)
155
+ {
156
+ unsigned char *wrk;
157
+ int i, j, s, t, k, clipx, clipy, weight=1;
158
+ int *matrix, color[PKL_CHANNEL];
159
+
160
+ //select filter
161
+ matrix=focus_filter[0].matrix;
162
+ for(i=0; i<sizeof(focus_filter)/sizeof(struct PKL_FILTER); i++){
163
+ if(type==focus_filter[i].type){
164
+ matrix=focus_filter[i].matrix;
165
+ break;
166
+ }
167
+ }
168
+
169
+ for(i=0; i<9; i++)
170
+ weight += matrix[i];
171
+
172
+ wrk = malloc(pkl->width*pkl->height*pkl->channel);
173
+ if(!wrk) return(1);
174
+ memset(wrk, 0, pkl->width*pkl->height*pkl->channel);
175
+
176
+ for(i=0; i<pkl->height; i++){
177
+ for(j=0; j<pkl->width; j++){
178
+ memset(color, 0, sizeof(color));
179
+ for(s=0; s<3; s++){
180
+ for(t=0; t<3; t++){
181
+ clipx = (j+t)>=pkl->width ? pkl->width-1 : j+t;
182
+ clipy = (i+s)>=pkl->height ? pkl->height-1 : i+s;
183
+ for(k=0; k<pkl->channel; k++)
184
+ color[k] += pkl->image[(clipy*pkl->width+clipx) * pkl->channel + k] * matrix[t+s*3];
185
+ }
186
+ }
187
+
188
+ for(k=0; k<pkl->channel; k++)
189
+ wrk[(i*pkl->width+j)*pkl->channel+k] = PKL_COLOR_CLIP(color[k]/weight);
190
+ }
191
+ }
192
+
193
+ free(pkl->image);
194
+ pkl->image = wrk;
195
+ return(0);
196
+ }
197
+
198
+ //=============================================================================
199
+ // pkl_emboss
200
+ //=============================================================================
201
+ PKLExport int pkl_emboss(PKLImage pkl, PKL_EMBOSS type)
202
+ {
203
+ unsigned char *wrk;
204
+ int i, j, s, t, k, clipx, clipy;
205
+ int *matrix, color[PKL_CHANNEL];
206
+
207
+ //select filter
208
+ matrix=focus_filter[0].matrix;
209
+ for(i=0; i<sizeof(emboss_filter)/sizeof(struct PKL_FILTER); i++){
210
+ if(type==emboss_filter[i].type){
211
+ matrix=emboss_filter[i].matrix;
212
+ break;
213
+ }
214
+ }
215
+
216
+ wrk = malloc(pkl->width*pkl->height*pkl->channel);
217
+ if(!wrk) return(1);
218
+ memset(wrk, 0, pkl->width*pkl->height*pkl->channel);
219
+
220
+ for(i=0; i<pkl->height; i++){
221
+ for(j=0; j<pkl->width; j++){
222
+ memset(color, 0, sizeof(color));
223
+ for(s=0; s<3; s++){
224
+ for(t=0; t<3; t++){
225
+ clipx = (j+t)>=pkl->width ? pkl->width-1 : j+t;
226
+ clipy = (i+s)>=pkl->height ? pkl->height-1 : i+s;
227
+ for(k=0; k<pkl->channel; k++)
228
+ color[k] += pkl->image[(clipy*pkl->width+clipx) * pkl->channel + k] * matrix[t+s*3];
229
+ }
230
+ }
231
+
232
+ for(k=0; k<pkl->channel; k++)
233
+ wrk[(i*pkl->width+j)*pkl->channel+k] = PKL_COLOR_CLIP(color[k]+127);
234
+ }
235
+ }
236
+
237
+ free(pkl->image);
238
+ pkl->image = wrk;
239
+ return(0);
240
+ }
@@ -0,0 +1,55 @@
1
+ #ifndef _LIB_PIKL_EFFECT2_
2
+ #define _LIB_PIKL_EFFECT2_
3
+
4
+ #include <stdio.h>
5
+ #include <stdlib.h>
6
+ #include <string.h>
7
+ #include <math.h>
8
+
9
+ #include "pikl.h"
10
+ #include "pikl_private.h"
11
+
12
+ struct PKL_FILTER {
13
+ int type;
14
+ int matrix[9];
15
+ };
16
+
17
+ struct PKL_FILTER emboss_filter[] =
18
+ {
19
+ { PKL_EMBOSS_EMBOSS, { 0, 0, -1,
20
+ 0, 0, 0,
21
+ 1, 0, 0 }},
22
+
23
+ { PKL_EMBOSS_LAPLACIAN, {-1, -1, -1,
24
+ -1, 8, -1,
25
+ -1, -1, -1 }},
26
+
27
+ { PKL_EMBOSS_HEAVY, { 2, 0, 0,
28
+ 0, -1, 0,
29
+ 0, 0, -1 }},
30
+
31
+ { PKL_EMBOSS_LIGHT, { 0, 0, 0,
32
+ 0, 1, 0,
33
+ 0, 0, -1 }},
34
+ };
35
+
36
+
37
+ struct PKL_FILTER focus_filter[] =
38
+ {
39
+ { PKL_FOCUS_DETAIL, { 0, -1, 0,
40
+ -1, 10, -1,
41
+ 0, -1, 0 }},
42
+
43
+ { PKL_FOCUS_EDGES, {-1, -1, -1,
44
+ -1, 9, -1,
45
+ -1, -1, -1 }},
46
+
47
+ { PKL_FOCUS_FOCUS, {-1, 0, -1,
48
+ 0, 7, 0,
49
+ -1, 0, -1 }},
50
+ };
51
+
52
+
53
+
54
+
55
+ #endif