pikl 0.2.8-x86-mswin32 → 0.3.0-x86-mswin32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. data/History.txt +9 -0
  2. data/License.txt +0 -0
  3. data/Manifest.txt +17 -17
  4. data/README.txt +0 -0
  5. data/config/hoe.rb +9 -6
  6. data/config/requirements.rb +0 -0
  7. data/ext/pikl/pikl.h +617 -465
  8. data/ext/pikl/pikl_affine.c +38 -91
  9. data/ext/pikl/pikl_affine.h +0 -0
  10. data/ext/pikl/pikl_bitmap.c +0 -0
  11. data/ext/pikl/pikl_bitmap.h +0 -0
  12. data/ext/pikl/pikl_blur.c +4 -8
  13. data/ext/pikl/pikl_blur.h +0 -0
  14. data/ext/pikl/pikl_camera.c +218 -0
  15. data/ext/pikl/{pikl_effect3.h → pikl_camera.h} +2 -2
  16. data/ext/pikl/pikl_composite.c +175 -0
  17. data/ext/pikl/pikl_composite.h +12 -0
  18. data/ext/pikl/pikl_decrease.c +110 -45
  19. data/ext/pikl/pikl_decrease.h +0 -7
  20. data/ext/pikl/pikl_divide.c +116 -0
  21. data/ext/pikl/pikl_divide.h +11 -0
  22. data/ext/pikl/pikl_effect.c +583 -151
  23. data/ext/pikl/pikl_effect.h +32 -6
  24. data/ext/pikl/pikl_enhance.c +274 -0
  25. data/ext/pikl/pikl_enhance.h +20 -0
  26. data/ext/pikl/pikl_io.c +174 -23
  27. data/ext/pikl/pikl_io.h +0 -0
  28. data/ext/pikl/pikl_jpeg.c +0 -0
  29. data/ext/pikl/pikl_jpeg.h +0 -0
  30. data/ext/pikl/pikl_pattern.c +383 -357
  31. data/ext/pikl/pikl_pattern.h +0 -0
  32. data/ext/pikl/pikl_pixel.c +173 -0
  33. data/ext/pikl/{pikl_trim.h → pikl_pixel.h} +2 -2
  34. data/ext/pikl/pikl_png.c +0 -0
  35. data/ext/pikl/pikl_png.h +0 -0
  36. data/ext/pikl/pikl_private.h +12 -5
  37. data/ext/pikl/pikl_resize.c +0 -0
  38. data/ext/pikl/pikl_resize.h +0 -0
  39. data/ext/pikl/pikl_rotate.c +409 -51
  40. data/ext/pikl/pikl_rotate.h +8 -0
  41. data/ext/pikl/pikl_scrap.c +263 -483
  42. data/ext/pikl/pikl_scrap.h +0 -0
  43. data/ext/pikl/pikl_special.c +168 -0
  44. data/ext/pikl/{pikl_effect4.h → pikl_special.h} +2 -2
  45. data/ext/pikl/pikl_voronoi.c +320 -0
  46. data/ext/pikl/pikl_voronoi.h +37 -0
  47. data/lib/pikl.rb +4 -2
  48. data/lib/pikl/color.rb +47 -0
  49. data/lib/pikl/const.rb +106 -22
  50. data/lib/pikl/errors.rb +0 -0
  51. data/lib/pikl/ext.rb +115 -8
  52. data/lib/pikl/filter.rb +371 -0
  53. data/lib/pikl/image.rb +124 -117
  54. data/lib/pikl/pikl.dll +0 -0
  55. data/lib/pikl/version.rb +2 -2
  56. data/setup.rb +0 -0
  57. data/test/sample.jpg +0 -0
  58. data/test/test_helper.rb +0 -0
  59. data/test/test_pikl_image.rb +0 -14
  60. data/test/test_pikl_image2.rb +541 -0
  61. metadata +35 -23
  62. data/ext/pikl/decrease/fsdither.h +0 -554
  63. data/ext/pikl/decrease/median.c +0 -1179
  64. data/ext/pikl/decrease/median.h +0 -7
  65. data/ext/pikl/decrease/neuquan5.c +0 -563
  66. data/ext/pikl/decrease/neuquant.h +0 -62
  67. data/ext/pikl/decrease/wu.c +0 -447
  68. data/ext/pikl/decrease/wu.h +0 -7
  69. data/ext/pikl/pikl_effect2.c +0 -240
  70. data/ext/pikl/pikl_effect2.h +0 -55
  71. data/ext/pikl/pikl_effect3.c +0 -266
  72. data/ext/pikl/pikl_effect4.c +0 -495
  73. data/ext/pikl/pikl_rotate2.c +0 -312
  74. data/ext/pikl/pikl_rotate2.h +0 -19
  75. data/ext/pikl/pikl_trim.c +0 -28
File without changes
@@ -0,0 +1,173 @@
1
+ #include "pikl_pixel.h"
2
+
3
+ static int check_offset(PKLImage pkl, int x, int y, PKL_COLOR_MODEL target);
4
+
5
+ //=============================================================================
6
+ // pkl_color_create
7
+ //=============================================================================
8
+ PKLExport PKLColor pkl_color_create(unsigned char a, unsigned char b, unsigned char c, unsigned char d)
9
+ {
10
+ PKLColor pcolor;
11
+
12
+ pcolor = malloc(sizeof(struct _PKLColor));
13
+ if(!pcolor) return(NULL);
14
+ memset(pcolor, 0, sizeof(struct _PKLColor));
15
+
16
+ pcolor->color[0] = a;
17
+ pcolor->color[1] = b;
18
+ pcolor->color[2] = c;
19
+ pcolor->color[3] = d;
20
+ return(pcolor);
21
+ }
22
+
23
+ //=============================================================================
24
+ // pkl_color_gray
25
+ //=============================================================================
26
+ PKLExport PKLColor pkl_color_gray(unsigned char gray)
27
+ {
28
+ return pkl_color_create(gray, 0, 0, 0);
29
+ }
30
+
31
+ //=============================================================================
32
+ // pkl_color_rgb
33
+ //=============================================================================
34
+ PKLExport PKLColor pkl_color_rgb(unsigned char red, unsigned char green, unsigned char blue)
35
+ {
36
+ return pkl_color_create(red, green, blue, 0);
37
+ }
38
+
39
+ //=============================================================================
40
+ // pkl_color_cmyk
41
+ //=============================================================================
42
+ PKLExport PKLColor pkl_color_cmyk(unsigned char c, unsigned char m, unsigned char y, unsigned char k)
43
+ {
44
+ return pkl_color_create(c, m, y, k);
45
+ }
46
+
47
+ //=============================================================================
48
+ // pkl_color_close
49
+ //=============================================================================
50
+ PKLExport void pkl_color_close(PKLColor color)
51
+ {
52
+ if(color) free(color);
53
+ }
54
+
55
+ //=============================================================================
56
+ // pkl_color_get
57
+ //=============================================================================
58
+ PKLExport unsigned char pkl_get_color(PKLImage pkl, int x, int y, PKL_COLOR_MODEL target)
59
+ {
60
+ int offset=0;
61
+
62
+ if((offset=check_offset(pkl, x, y, target)) == -1) return(0);
63
+ return pkl->image[(y*pkl->width+x)*pkl->channel+offset];
64
+ }
65
+
66
+ //=============================================================================
67
+ // pkl_color_set
68
+ //=============================================================================
69
+ PKLExport int pkl_set_color(PKLImage pkl, int x, int y, PKL_COLOR_MODEL target, unsigned char color)
70
+ {
71
+ int offset=0;
72
+
73
+ if((offset=check_offset(pkl, x, y, target)) == -1) return(1);
74
+ pkl->image[(y*pkl->width+x)*pkl->channel+offset]=color;
75
+ return(0);
76
+ }
77
+
78
+ //=============================================================================
79
+ // check_offset
80
+ //=============================================================================
81
+ static int check_offset(PKLImage pkl, int x, int y, PKL_COLOR_MODEL target)
82
+ {
83
+ if(x<0 || x>=pkl->width || y<0 || y>=pkl->height) return(-1);
84
+
85
+ switch(pkl->color){
86
+ case PKL_GRAYSCALE:
87
+ if(target != PKL_GRAY) return(-1);
88
+ return(0);
89
+ case PKL_RGB:
90
+ switch(target){
91
+ case PKL_RED: return(0);
92
+ case PKL_GREEN: return(1);
93
+ case PKL_BLUE: return(2);
94
+ default:
95
+ return(-1);
96
+ }
97
+ break;
98
+ case PKL_CMYK:
99
+ switch(target){
100
+ case PKL_CYAN: return(0);
101
+ case PKL_MAGENTA: return(1);
102
+ case PKL_YELLOW: return(2);
103
+ case PKL_BLACK: return(3);
104
+ default:
105
+ return(-1);
106
+ }
107
+ break;
108
+ case PKL_UNKNOWN:
109
+ case PKL_BLACKWHITE:
110
+ case PKL_RGBA:
111
+ case PKL_YCbCr:
112
+ case PKL_YCCK:
113
+ default:
114
+ return(-1);
115
+ }
116
+ return(-1);
117
+ }
118
+
119
+ //=============================================================================
120
+ // pkl_pixel_get
121
+ //=============================================================================
122
+ PKLExport PKLColor pkl_get_pixel(PKLImage pkl, int x, int y)
123
+ {
124
+ PKLColor pcolor;
125
+
126
+ if(x<0 || x>=pkl->width || y<0 || y>=pkl->height) return(NULL);
127
+
128
+ pcolor = malloc(sizeof(struct _PKLColor));
129
+ if(!pcolor) return(NULL);
130
+ memset(pcolor, 0, sizeof(struct _PKLColor));
131
+ memcpy(pcolor->color, &pkl->image[(y*pkl->width+x)*pkl->channel], pkl->channel);
132
+ return(pcolor);
133
+ }
134
+
135
+ //=============================================================================
136
+ // pkl_pixel_set
137
+ //=============================================================================
138
+ PKLExport int pkl_set_pixel(PKLImage pkl, int x, int y, PKLColor color)
139
+ {
140
+ if(x<0 || x>=pkl->width || y<0 || y>=pkl->height) return(1);
141
+ memcpy(&pkl->image[(y*pkl->width+x)*pkl->channel], color->color, pkl->channel);
142
+ return(0);
143
+ }
144
+
145
+ //=============================================================================
146
+ // pkl_color
147
+ //=============================================================================
148
+ PKLExport unsigned char pkl_color(PKLColor color, PKL_COLOR_MODEL target)
149
+ {
150
+ int offset;
151
+
152
+ switch(target){
153
+ case PKL_GRAY:
154
+ case PKL_RED:
155
+ case PKL_CYAN:
156
+ offset=0;
157
+ break;
158
+ case PKL_GREEN:
159
+ case PKL_MAGENTA:
160
+ offset=1;
161
+ break;
162
+ case PKL_BLUE:
163
+ case PKL_YELLOW:
164
+ offset=2;
165
+ break;
166
+ case PKL_BLACK:
167
+ offset=3;
168
+ break;
169
+ default:
170
+ return(0);
171
+ }
172
+ return color->color[offset];
173
+ }
@@ -1,5 +1,5 @@
1
- #ifndef _LIB_PIKL_TRIM_
2
- #define _LIB_PIKL_TRIM_
1
+ #ifndef _LIB_PIKL_PIXEL_
2
+ #define _LIB_PIKL_PIXEL_
3
3
 
4
4
  #include <stdio.h>
5
5
  #include <stdlib.h>
data/ext/pikl/pikl_png.c CHANGED
File without changes
data/ext/pikl/pikl_png.h CHANGED
File without changes
@@ -1,7 +1,13 @@
1
1
  #ifndef _LIB_PIKL_PRIVATE_
2
2
  #define _LIB_PIKL_PRIVATE_
3
3
 
4
+ #ifdef DEBUG
5
+ #include "dbg/dbg.h"
6
+ #endif
7
+
4
8
  #define PKL_MINMAX(a,b,i) (((a>=i)?a:((b<=i)?b:i)))
9
+ #define PKL_MIN(a,b) ((a<b)?a:b)
10
+ #define PKL_MAX(a,b) ((a>b)?a:b)
5
11
  #define PKL_COLOR_CLIP(v) v<0?0:v>255?255:v
6
12
  #define PKL_CHANNEL 4
7
13
  #define PKL_COLOR 256
@@ -19,11 +25,12 @@ struct _PKLImage {
19
25
  unsigned char *image;
20
26
  PKL_FORMAT format;
21
27
  int compress;
22
-
23
- //affine
24
- double x_scale, y_scale;
25
- double angle;
26
- double x_trns, y_trns;
27
28
  };
28
29
 
30
+ //=============================================================================
31
+ // PKLColor
32
+ //=============================================================================
33
+ struct _PKLColor {
34
+ unsigned char color[PKL_CHANNEL];
35
+ };
29
36
  #endif
File without changes
File without changes
@@ -1,70 +1,428 @@
1
1
  #include "pikl_rotate.h"
2
2
 
3
+ static int rotate_90(PKLImage pkl, float angle);
4
+ static int rotate_custom(PKLImage pkl, float angle, PKL_SAMPLE sample, PKLColor backcolor);
5
+ static void bsort(int *p);
6
+
7
+ static int pkl_rotate_nr(PKLImage pkl, PIKL_ROTATE *ri);
8
+ static int pkl_rotate_nn(PKLImage pkl, PIKL_ROTATE *ri);
9
+ static int pkl_rotate_bl(PKLImage pkl, PIKL_ROTATE *ri);
10
+ static int pkl_rotate_bc(PKLImage pkl, PIKL_ROTATE *ri);
11
+ //static int pkl_rotate_pa(PKLImage pkl, float angle, int backcolor);
12
+
3
13
  //=================================================================================
4
14
  // pkl_rotate
5
15
  //=================================================================================
6
- PKLExport int pkl_rotate(PKLImage pkl, PKL_ANGLE angle)
16
+ PKLExport int pkl_rotate(PKLImage pkl, float angle, PKL_SAMPLE sample, PKLColor backcolor)
7
17
  {
8
- unsigned char *wrk;
9
- int rsin, rcos;
10
- int width, height;
11
- int sx, sy, ex, ey;
12
- int i, j, x, y;
13
-
14
- switch(angle){
15
- case PKL_ANGLE_000:
16
- return(0);
17
- case PKL_ANGLE_090:
18
- rcos = 0;
19
- rsin = 1;
20
- width = pkl->height;
21
- height = pkl->width;
22
- sx = 0;
23
- sy = -(pkl->width-1);
24
- ex = pkl->height-1;
25
- ey = 0;
26
- break;
27
- case PKL_ANGLE_180:
28
- rcos = -1;
29
- rsin = 0;
30
- width = pkl->width;
31
- height = pkl->height;
32
- sx = -(pkl->width-1);
33
- sy = -(pkl->height-1);
34
- ex = 0;
35
- ey = 0;
36
- break;
37
- case PKL_ANGLE_270:
38
- rcos = 0;
39
- rsin = -1;
40
- width = pkl->height;
41
- height = pkl->width;
42
- sx = -(pkl->height-1);
43
- sy = 0;
44
- ex = 0;
45
- ey = pkl->width-1;
46
- break;
18
+ /* 90�x�̔{�p���ǂ����ŏ����𕪂���(�덷����̂���) */
19
+ if((int)angle%90){
20
+ return rotate_custom(pkl, angle, sample, backcolor);
21
+ }else{
22
+ return rotate_90(pkl, angle);
23
+ }
24
+ return(1);
25
+ }
26
+
27
+ //=============================================================================
28
+ // rotate_90
29
+ //=============================================================================
30
+ static int rotate_90(PKLImage pkl, float angle)
31
+ {
32
+ PIKL_ROTATE ri;
33
+ float c, s, rad;
34
+
35
+ rad = -angle*M_PI/180.0;
36
+ c = cos(rad);
37
+ s = sin(rad);
38
+ ri.rcos = (int)c==0 ? 0.0 : (int)c==1 ? 1.0 : -1.0;
39
+ ri.rsin = (int)s==0 ? 0.0 : (int)s==1 ? 1.0 : -1.0;
40
+
41
+ /*90*/
42
+ if(ri.rcos==0 && ri.rsin==1){
43
+ ri.width = pkl->height;
44
+ ri.height = pkl->width;
45
+ ri.sx = 0;
46
+ ri.sy = -(pkl->width-1);
47
+ ri.ex = pkl->height-1;
48
+ ri.ey = 0;
49
+ }else
50
+ /*180*/
51
+ if(ri.rcos==-1 && ri.rsin==0){
52
+ ri.width = pkl->width;
53
+ ri.height = pkl->height;
54
+ ri.sx = -(pkl->width-1);
55
+ ri.sy = -(pkl->height-1);
56
+ ri.ex = 0;
57
+ ri.ey = 0;
58
+ }else
59
+ /*270*/
60
+ if(ri.rcos==0 && ri.rsin==-1){
61
+ ri.width = pkl->height;
62
+ ri.height = pkl->width;
63
+ ri.sx = -(pkl->height-1);
64
+ ri.sy = 0;
65
+ ri.ex = 0;
66
+ ri.ey = pkl->width-1;
67
+ }
68
+
69
+ return pkl_rotate_nr(pkl, &ri);
70
+ }
71
+
72
+ //=============================================================================
73
+ // rotate_custom
74
+ //=============================================================================
75
+ static int rotate_custom(PKLImage pkl, float angle, PKL_SAMPLE sample, PKLColor backcolor)
76
+ {
77
+ PIKL_ROTATE ri;
78
+ float rad;
79
+ int px[4], py[4], i, x, y;
80
+
81
+ rad = -angle*M_PI/180.0;
82
+ ri.rcos = cos(rad);
83
+ ri.rsin = sin(rad);
84
+
85
+ px[0] = 0;
86
+ py[0] = 0;
87
+ px[1] = pkl->width;
88
+ py[1] = 0;
89
+ px[2] = 0;
90
+ py[2] = pkl->height;
91
+ px[3] = pkl->width;
92
+ py[3] = pkl->height;
93
+
94
+ for(i=0; i<4; i++){
95
+ x = (int)(cos(-rad)*px[i] - sin(-rad)*py[i]);
96
+ y = (int)(sin(-rad)*px[i] + cos(-rad)*py[i]);
97
+ px[i] = x;
98
+ py[i] = y;
99
+ }
100
+
101
+ //�����ɕ��т���(qsort���g���ƒx���̂Ńo�u���\�[�g�A���S���Y����)
102
+ bsort(px);
103
+ bsort(py);
104
+ ri.sx = px[0];
105
+ ri.sy = py[0];
106
+ ri.ex = px[3];
107
+ ri.ey = py[3];
108
+ ri.width = ri.ex - ri.sx;
109
+ ri.height = ri.ey - ri.sy;
110
+
111
+ //for(i=0; i<pkl->channel; i++)
112
+ // ri.back[i] = (backcolor>>((pkl->channel-i)*8) & 0xFF);
113
+ if(backcolor)
114
+ memcpy(ri.back, backcolor->color, PKL_CHANNEL);
115
+ else
116
+ memset(ri.back, 0xff, PKL_CHANNEL);
117
+
118
+ switch(sample){
119
+ case PKL_SAMPLE_BL:
120
+ return pkl_rotate_bl(pkl, &ri);
121
+ case PKL_SAMPLE_BC:
122
+ case PKL_SAMPLE_PA:
123
+ case PKL_SAMPLE_LZ:
124
+ return pkl_rotate_bc(pkl, &ri);
125
+ case PKL_SAMPLE_NN:
47
126
  default:
48
- return(1);
127
+ return pkl_rotate_nn(pkl, &ri);
49
128
  }
129
+ return(1);
130
+ }
131
+
132
+ //=============================================================================
133
+ // bsort
134
+ //=============================================================================
135
+ static void bsort(int *p)
136
+ {
137
+ int i, j, k, t;
50
138
 
51
- wrk = malloc(width * height * pkl->channel);
52
- if(!wrk) return(1);
139
+ k=3;
140
+ while(k>=0){
141
+ j=-1;
142
+ for(i=1; i<=k; i++){
143
+ if(p[i-1] > p[i]){
144
+ j = i-1;
145
+ t=p[j]; p[i-1]=p[i]; p[i]=t;
146
+ }
147
+ }
148
+ k=j;
149
+ }
150
+ }
53
151
 
54
- for(i=sy; i<=ey; i++){
55
- for(j=sx; j<=ex; j++){
56
- x = rcos * j - rsin * i;
57
- y = rsin * j + rcos * i;
58
- memcpy(&wrk[((i-sy)*width+j-sx)*pkl->channel], &pkl->image[(y*pkl->width+x)*pkl->channel], pkl->channel);
152
+ //=============================================================================
153
+ // pkl_rotate_nr
154
+ //=============================================================================
155
+ static int pkl_rotate_nr(PKLImage pkl, PIKL_ROTATE *ri)
156
+ {
157
+ unsigned char *wrk;
158
+ int i, j, px, py;
159
+
160
+ wrk = malloc(ri->width * ri->height * pkl->channel);
161
+ if(!wrk) return(1);
162
+
163
+ for(i=ri->sy; i<=ri->ey; i++){
164
+ for(j=ri->sx; j<=ri->ex; j++){
165
+ px = (int)ri->rcos * j - (int)ri->rsin * i;
166
+ py = (int)ri->rsin * j + (int)ri->rcos * i;
167
+ memcpy(&wrk[((i-ri->sy)*ri->width+j-ri->sx)*pkl->channel], &pkl->image[(py*pkl->width+px)*pkl->channel], pkl->channel);
59
168
  }
60
169
  }
61
170
 
62
171
  free(pkl->image);
63
- pkl->image = wrk;
64
- pkl->width = width;
65
- pkl->height = height;
172
+ pkl->image = wrk;
173
+ pkl->width = ri->width;
174
+ pkl->height = ri->height;
175
+ return(0);
176
+ }
177
+
178
+ //=============================================================================
179
+ // pkl_rotate_nn
180
+ //=============================================================================
181
+ static int pkl_rotate_nn(PKLImage pkl, PIKL_ROTATE *ri)
182
+ {
183
+ unsigned char *wrk;
184
+ int i, j, px, py;
185
+ float x, y;
66
186
 
187
+ wrk = malloc(ri->width * ri->height * pkl->channel);
188
+ if(!wrk) return(1);
189
+
190
+ for(i=ri->sy; i<ri->ey; i++){
191
+ for(j=ri->sx; j<ri->ex; j++){
192
+ x = ri->rcos * j - ri->rsin * i;
193
+ y = ri->rsin * j + ri->rcos * i;
194
+ px = x < 0.0f ? (int)(x-0.5f) : (int)(x+0.5f);
195
+ py = y < 0.0f ? (int)(y-0.5f) : (int)(y+0.5f);
196
+ //px = ri->rcos * j - ri->rsin * i;
197
+ //py = ri->rsin * j + ri->rcos * i;
198
+ if(px>=0 && px<pkl->width && py>=0 && py<pkl->height){
199
+ memcpy(&wrk[((i-ri->sy)*ri->width+j-ri->sx)*pkl->channel],
200
+ &pkl->image[(py*pkl->width+px)*pkl->channel], pkl->channel);
201
+ }else{
202
+ memcpy(&wrk[((i-ri->sy)*ri->width+j-ri->sx)*pkl->channel], ri->back, pkl->channel);
203
+ }
204
+ }
205
+ }
206
+
207
+ free(pkl->image);
208
+ pkl->image = wrk;
209
+ pkl->width = ri->width;
210
+ pkl->height = ri->height;
67
211
  return(0);
68
212
  }
69
213
 
214
+ //=============================================================================
215
+ // pkl_rotate_bl
216
+ // +----+----+
217
+ // | d0 | d1 |
218
+ // +----+----+
219
+ // | d2 | d3 |
220
+ // +----+----+
221
+ //=============================================================================
222
+ static int pkl_rotate_bl(PKLImage pkl, PIKL_ROTATE *ri)
223
+ {
224
+ unsigned char *wrk, *d0, *d1, *d2, *d3;
225
+ int p0x, p0y, i, j, k;
226
+ double dx, dy, fracx, fracy;
227
+ double pixel[PKL_CHANNEL];
228
+
229
+ wrk = malloc(ri->width * ri->height * pkl->channel);
230
+ if(!wrk) return(1);
231
+
232
+ for(i=ri->sy; i<ri->ey; i++){
233
+ for(j=ri->sx; j<ri->ex; j++){
234
+ dx = ri->rcos*j-ri->rsin*i;
235
+ dy = ri->rsin*j+ri->rcos*i;
236
+ p0x = (int)floor(dx);
237
+ p0y = (int)floor(dy);
238
+ fracx = dx - p0x;
239
+ fracy = dy - p0y;
240
+ //if(p0x<0 || p0x>=pkl->width || p0y<0 || p0y>=pkl->height){
241
+ if(p0x<-1 || p0x>=pkl->width || p0y<-1 || p0y>=pkl->height){
242
+ memcpy(&wrk[((i-ri->sy)*ri->width+j-ri->sx)*pkl->channel], ri->back, pkl->channel);
243
+ continue;
244
+ }
245
+
246
+ //if((p0x==-1 && p0y==-1) || (p0x+1>=pkl->width && p0y+1>=pkl->height)){
247
+ if((p0x==-1 && p0y==-1) || (p0x+1>=pkl->width && p0y+1>=pkl->height) ||
248
+ (p0x==-1 && p0y+1>=pkl->height) || (p0x+1>=pkl->width && p0y==-1)){
249
+ //�e���_
250
+ d0 = &pkl->image[(p0y*pkl->width+p0x)*pkl->channel];
251
+ d1 = &pkl->image[(p0y*pkl->width+p0x)*pkl->channel];
252
+ d2 = &pkl->image[(p0y*pkl->width+p0x)*pkl->channel];
253
+ d3 = &pkl->image[(p0y*pkl->width+p0x)*pkl->channel];
254
+ }else{
255
+ if(p0x==-1 && p0y>-1){
256
+ //���G�b�W
257
+ d0 = ri->back;
258
+ d1 = &pkl->image[(p0y*pkl->width+p0x+1)*pkl->channel];
259
+ d2 = ri->back;
260
+ d3 = &pkl->image[((p0y+1)*pkl->width+p0x+1)*pkl->channel];
261
+ }else if(p0x>-1 && p0y==-1){
262
+ //��G�b�W
263
+ d0 = ri->back;
264
+ d1 = ri->back;
265
+ d2 = &pkl->image[((p0y+1)*pkl->width+p0x)*pkl->channel];
266
+ d3 = &pkl->image[((p0y+1)*pkl->width+p0x+1)*pkl->channel];
267
+ }else if(p0x+1<pkl->width && p0y+1>=pkl->height){
268
+ //���G�b�W
269
+ d0 = &pkl->image[(p0y*pkl->width+p0x)*pkl->channel];
270
+ d1 = &pkl->image[(p0y*pkl->width+p0x+1)*pkl->channel];
271
+ d2 = ri->back;
272
+ d3 = ri->back;
273
+ }else if(p0x+1>=pkl->width && p0y+1<pkl->height){
274
+ //�E�G�b�W
275
+ d0 = &pkl->image[(p0y*pkl->width+p0x)*pkl->channel];
276
+ d1 = ri->back;
277
+ d2 = &pkl->image[((p0y+1)*pkl->width+p0x)*pkl->channel];
278
+ d3 = ri->back;
279
+ }else{
280
+ //�G�b�W�ȊO
281
+ d0 = &pkl->image[(p0y*pkl->width+p0x)*pkl->channel];
282
+ d1 = &pkl->image[(p0y*pkl->width+p0x+1)*pkl->channel];
283
+ d2 = &pkl->image[((p0y+1)*pkl->width+p0x)*pkl->channel];
284
+ d3 = &pkl->image[((p0y+1)*pkl->width+p0x+1)*pkl->channel];
285
+ }
286
+ }
287
+
288
+ memset(pixel, 0, sizeof(double)*PKL_CHANNEL);
289
+ for(k=0; k<pkl->channel; k++){
290
+ pixel[k] += d0[k] * (1-fracx)*(1-fracy);
291
+ pixel[k] += d1[k] * fracx*(1-fracy);
292
+ pixel[k] += d2[k] * (1-fracx)*fracy;
293
+ pixel[k] += d3[k] * fracx*fracy;
294
+ }
295
+ for(k=0; k<pkl->channel; k++)
296
+ wrk[((i-ri->sy)*ri->width+j-ri->sx)*pkl->channel+k] = PKL_COLOR_CLIP(pixel[k]);
297
+ }
298
+ }
299
+
300
+ free(pkl->image);
301
+ pkl->image = wrk;
302
+ pkl->width = ri->width;
303
+ pkl->height = ri->height;
304
+ return(0);
305
+ }
306
+
307
+ //=============================================================================
308
+ // pkl_rotate_bc
309
+ //=============================================================================
310
+ static int pkl_rotate_bc(PKLImage pkl, PIKL_ROTATE *ri)
311
+ {
312
+ unsigned char *wrk;
313
+ int i, j, k, px, py;
314
+ float wx, wy, dx, dy, sx, sy;
315
+ float data[PKL_CHANNEL];
316
+
317
+ wrk = malloc(ri->width * ri->height * pkl->channel);
318
+ if(!wrk) return(1);
319
+
320
+ for(i=ri->sy; i<ri->ey; i++){
321
+ for(j=ri->sx; j<ri->ex; j++){
322
+ sx = ri->rcos * j - ri->rsin * i;
323
+ sy = ri->rsin * j + ri->rcos * i;
324
+
325
+ if(sx<0 || sx>=pkl->width || sy<0 || sy>=pkl->height){
326
+ memcpy(&wrk[((i-ri->sy)*ri->width+j-ri->sx)*pkl->channel], ri->back, pkl->channel);
327
+ continue;
328
+ }
329
+
330
+ memset(&data, 0, sizeof(data));
331
+ for(py=(int)sy-1; py<=(int)sy+2; py++){
332
+ for(px=(int)sx-1; px<=(int)sx+2; px++){
333
+ dx = fabs(sx-px);
334
+ dy = fabs(sy-py);
335
+ wx = (dx<1) ? (dx-1)*(dx*dx-dx-1) : -(dx-1)*(dx-2)*(dx-2);
336
+ wy = (dy<1) ? (dy-1)*(dy*dy-dy-1) : -(dy-1)*(dy-2)*(dy-2);
337
+
338
+ if(px>=0 && px<pkl->width && py>=0 && py<pkl->height){
339
+ for(k=0; k<pkl->channel; k++)
340
+ data[k] += pkl->image[(py*pkl->width+px)*pkl->channel+k]*wx*wy;
341
+ }else{
342
+ for(k=0; k<pkl->channel; k++)
343
+ data[k] += ri->back[k]*wx*wy;
344
+ }
345
+ }
346
+ }
347
+ for(k=0; k<pkl->channel; k++)
348
+ wrk[((i-ri->sy)*ri->width+j-ri->sx)*pkl->channel+k] = PKL_COLOR_CLIP(data[k]);
349
+ }
350
+ }
351
+
352
+ free(pkl->image);
353
+ pkl->image = wrk;
354
+ pkl->width = ri->width;
355
+ pkl->height = ri->height;
356
+ return(0);
357
+ }
70
358
 
359
+ ////=============================================================================
360
+ //// pkl_rotate_pa
361
+ ////=============================================================================
362
+ //static int pkl_rotate_pa(PKLImage pkl, float angle, int backcolor)
363
+ //{
364
+ // int width, height;
365
+ // PIKL_RECT rect;
366
+ // float rad;
367
+ // unsigned char *wrk, back[PKL_CHANNEL];
368
+ // int i, j;
369
+ // double zx, zy, power;
370
+ //
371
+ // rad = -angle*M_PI/180;
372
+ // get_rect(&rect, pkl->width, pkl->height, rad);
373
+ // width = rect.right - rect.left;
374
+ // height = rect.bottom - rect.top;
375
+ //
376
+ // wrk = malloc(width * height * pkl->channel);
377
+ // if(!wrk) return(1);
378
+ // memset(wrk, 0, width*height*pkl->channel);
379
+ //
380
+ // for(i=0; i<pkl->channel; i++)
381
+ // back[i] = (backcolor>>((pkl->channel-i)*8) & 0xFF);
382
+ //
383
+ // zx = (double)pkl->width / (double)width;
384
+ // zy = (double)pkl->height / (double)height;
385
+ // //���_�����������ϒl�Z�o�l
386
+ // power= zx*zy + (zx*zy * angle*M_PI/180 * angle*M_PI/180);
387
+ //
388
+ // for(i=rect.top; i<rect.bottom; i++){
389
+ // for(j=rect.left; j<rect.right; j++){
390
+ // double w1, w2, h1, h2;
391
+ // double w1b, w2b, h1b, h2b;
392
+ // double bi, ixg[PKL_CHANNEL] = {0.0, 0.0, 0.0, 0.0};
393
+ // int fsx ,fsy, s, t, k;
394
+ //
395
+ // w1b = modf(cos(rad)*j -sin(rad)*i, &w1);
396
+ // w2b = modf(cos(rad)*(j+1)-sin(rad)*i, &w2);
397
+ // h1b = modf(sin(rad)*j +cos(rad)*i, &h1);
398
+ // h2b = modf(sin(rad)*j+cos(rad)*(i+1), &h2);
399
+ //
400
+ // for(s=(int)w1; s<=(int)w2; s++){
401
+ // for(t=(int)h1; t<=(int)h2; t++){
402
+ // bi = 1.0;
403
+ // if(s == (int)w1) bi*=(1-w1b);
404
+ // if(s == (int)w2) bi*=(w2b);
405
+ // if(t == (int)h1) bi*=(1-h1b);
406
+ // if(t == (int)h2) bi*=(h2b);
407
+ // fsx = (s < 0) ? 0 : (s > pkl->width -1) ? pkl->width -1 : s;
408
+ // fsy = (t < 0) ? 0 : (t > pkl->height-1) ? pkl->height-1 : t;
409
+ // for(k=0; k<pkl->channel; k++)
410
+ // ixg[k] += pkl->image[(fsy*pkl->width+fsx)*pkl->channel+k] * bi;
411
+ // }
412
+ // }
413
+ //
414
+ // if((int)w1>=0 && (int)w1<pkl->width && (int)h1>=0 && (int)h1<pkl->height){
415
+ // for(k=0; k<pkl->channel; k++)
416
+ // wrk[((i-rect.top)*width+j-rect.left)*pkl->channel+k] = PKL_RGB(ixg[k]/power);
417
+ // }else{
418
+ // memcpy(&wrk[((i-rect.top)*width+j-rect.left)*pkl->channel], back, pkl->channel);
419
+ // }
420
+ //
421
+ // }
422
+ // }
423
+ // free(pkl->image);
424
+ // pkl->image = wrk;
425
+ // pkl->width = width;
426
+ // pkl->height = height;
427
+ // return(0);
428
+ //}