cyross-ruby-miyako 2.0.0 → 2.0.5.1.0
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.
- data/README +106 -154
- data/defines.h +144 -0
- data/{miyako_no_katana/extconf.rb → extconf.rb} +10 -0
- data/extern.h +29 -0
- data/install_miyako.rb +26 -14
- data/lib/Miyako/API/audio.rb +2 -2
- data/lib/Miyako/API/basic_data.rb +183 -41
- data/lib/Miyako/API/bitmap.rb +474 -2
- data/lib/Miyako/API/choices.rb +215 -48
- data/lib/Miyako/API/collision.rb +267 -251
- data/lib/Miyako/API/diagram.rb +58 -70
- data/lib/Miyako/API/drawing.rb +93 -52
- data/lib/Miyako/API/fixedmap.rb +233 -120
- data/lib/Miyako/API/font.rb +59 -40
- data/lib/Miyako/API/input.rb +34 -27
- data/lib/Miyako/API/layout.rb +154 -172
- data/lib/Miyako/API/map.rb +285 -159
- data/lib/Miyako/API/map_event.rb +4 -4
- data/lib/Miyako/API/modules.rb +1 -1
- data/lib/Miyako/API/movie.rb +8 -5
- data/lib/Miyako/API/parts.rb +44 -9
- data/lib/Miyako/API/plane.rb +37 -2
- data/lib/Miyako/API/screen.rb +90 -22
- data/lib/Miyako/API/shape.rb +118 -37
- data/lib/Miyako/API/sprite.rb +475 -61
- data/lib/Miyako/API/sprite_animation.rb +83 -63
- data/lib/Miyako/API/spriteunit.rb +47 -13
- data/lib/Miyako/API/story.rb +123 -47
- data/lib/Miyako/API/textbox.rb +361 -132
- data/lib/Miyako/API/utility.rb +388 -0
- data/lib/Miyako/API/viewport.rb +54 -349
- data/lib/Miyako/API/yuki.rb +570 -353
- data/lib/Miyako/EXT/miyako_cairo.rb +5 -3
- data/lib/Miyako/EXT/slides.rb +22 -1
- data/lib/Miyako/miyako.rb +12 -13
- data/logo/EGSR_logo.png +0 -0
- data/logo/EGSR_logo_bg.png +0 -0
- data/logo/EGSR_logo_fg.png +0 -0
- data/logo/EGSR_title_banner.png +0 -0
- data/logo/EGSR_title_logo.png +0 -0
- data/logo/miyako.png +0 -0
- data/logo/miyako_banner.png +0 -0
- data/logo/space.png +0 -0
- data/miyako_basicdata.c +590 -0
- data/miyako_bitmap.c +1225 -0
- data/miyako_collision.c +403 -0
- data/miyako_drawing.c +187 -0
- data/miyako_font.c +334 -0
- data/miyako_hsv.c +830 -0
- data/miyako_layout.c +191 -0
- data/miyako_no_katana.c +1074 -0
- data/miyako_transform.c +438 -0
- data/miyako_utility.c +288 -0
- data/sample/Animation1/m1ku.rb +10 -31
- data/sample/Animation1/readme.txt +6 -6
- data/sample/Animation2/lex.rb +1 -0
- data/sample/Animation2/readme.txt +6 -6
- data/sample/Diagram_sample/diagram_sample_yuki2.rb +152 -48
- data/sample/Diagram_sample/readme.txt +9 -6
- data/sample/Room3/blue.rb +234 -187
- data/sample/Room3/ending.rb +68 -63
- data/sample/Room3/green.rb +159 -124
- data/sample/Room3/main.rb +50 -32
- data/sample/Room3/main_component.rb +3 -2
- data/sample/Room3/readme.txt +6 -6
- data/sample/Room3/red.rb +161 -134
- data/sample/Room3/room3.rb +1 -0
- data/sample/Room3/title.rb +75 -62
- data/sample/ball_action_sample.rb +204 -0
- data/sample/blit_rop.rb +70 -0
- data/sample/cairo_sample.rb +25 -0
- data/sample/circle_collision_test.rb +66 -0
- data/sample/collision_test.rb +33 -0
- data/sample/collision_test2.rb +108 -0
- data/sample/fixed_map_test/fixed_map_sample.rb +23 -32
- data/sample/fixed_map_test/readme.txt +38 -38
- data/sample/map_test/chara.rb +17 -9
- data/sample/map_test/main_parts.rb +30 -9
- data/sample/map_test/main_scene.rb +57 -41
- data/sample/map_test/map_manager.rb +13 -30
- data/sample/map_test/map_test.rb +2 -2
- data/sample/map_test/oasis.rb +17 -11
- data/sample/map_test/readme.txt +50 -48
- data/sample/map_test/route.rb +46 -33
- data/sample/map_test/town.rb +19 -13
- data/sample/polygon_test.rb +35 -0
- data/sample/rasterscroll.rb +25 -0
- data/sample/takahashi.rb +42 -0
- data/sample/text.png +0 -0
- data/sample/textbox_sample.rb +190 -0
- data/sample/transform.rb +54 -0
- data/sample/utility_test.rb +73 -0
- data/sample/utility_test2.rb +61 -0
- data/sample/utility_test3.rb +64 -0
- data/sample/utility_test4.rb +73 -0
- data/uninstall_miyako.rb +19 -0
- data/win/miyako_no_katana.so +0 -0
- metadata +165 -148
- data/miyako.png +0 -0
- data/miyako_banner.png +0 -0
- data/miyako_no_katana/miyako_no_katana.c +0 -3301
- data/sample/fixed_map_test/map_sample.rb +0 -121
data/miyako_font.c
ADDED
@@ -0,0 +1,334 @@
|
|
1
|
+
/*
|
2
|
+
--
|
3
|
+
Miyako v2.0 Extend Library "Miyako no Katana"
|
4
|
+
Copyright (C) 2008 Cyross Makoto
|
5
|
+
|
6
|
+
This library is free software; you can redistribute it and/or
|
7
|
+
modify it under the terms of the GNU Lesser General Public
|
8
|
+
License as published by the Free Software Foundation; either
|
9
|
+
version 2.1 of the License, or (at your option) any later version.
|
10
|
+
|
11
|
+
This library is distributed in the hope that it will be useful,
|
12
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
+
Lesser General Public License for more details.
|
15
|
+
|
16
|
+
You should have received a copy of the GNU Lesser General Public
|
17
|
+
License along with this library; if not, write to the Free Software
|
18
|
+
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
19
|
+
++
|
20
|
+
*/
|
21
|
+
|
22
|
+
/*
|
23
|
+
=拡張ライブラリmiyako_no_katana
|
24
|
+
Authors:: サイロス誠
|
25
|
+
Version:: 2.0
|
26
|
+
Copyright:: 2007-2008 Cyross Makoto
|
27
|
+
License:: LGPL2.1
|
28
|
+
*/
|
29
|
+
#include "defines.h"
|
30
|
+
#include "extern.h"
|
31
|
+
|
32
|
+
static VALUE mSDL = Qnil;
|
33
|
+
static VALUE mMiyako = Qnil;
|
34
|
+
static VALUE mScreen = Qnil;
|
35
|
+
static VALUE cSurface = Qnil;
|
36
|
+
static VALUE cTTFFont = Qnil;
|
37
|
+
static VALUE cFont = Qnil;
|
38
|
+
static VALUE cEncoding = Qnil;
|
39
|
+
static VALUE nZero = Qnil;
|
40
|
+
static VALUE nOne = Qnil;
|
41
|
+
static volatile ID id_update = Qnil;
|
42
|
+
static volatile ID id_kakko = Qnil;
|
43
|
+
static volatile ID id_render = Qnil;
|
44
|
+
static volatile ID id_to_a = Qnil;
|
45
|
+
static volatile int zero = Qnil;
|
46
|
+
static volatile int one = Qnil;
|
47
|
+
|
48
|
+
static volatile ID id_encode = Qnil;
|
49
|
+
static volatile ID id_utf8 = Qnil;
|
50
|
+
|
51
|
+
typedef struct {
|
52
|
+
TTF_Font* font;
|
53
|
+
} TTFont;
|
54
|
+
|
55
|
+
// from rubysdl_video.c
|
56
|
+
static GLOBAL_DEFINE_GET_STRUCT(Surface, GetSurface, cSurface, "SDL::Surface");
|
57
|
+
// from rubysdl_ttf.c
|
58
|
+
static GLOBAL_DEFINE_GET_STRUCT(TTFont, Get_TTFont, cTTFFont, "SDL::TT::Font");
|
59
|
+
|
60
|
+
static VALUE font_draw_text(VALUE self, VALUE vdst, VALUE str, VALUE vx, VALUE vy)
|
61
|
+
{
|
62
|
+
rb_secure(4);
|
63
|
+
StringValue(str);
|
64
|
+
|
65
|
+
str = rb_funcall(str, id_encode, 1, rb_const_get(cEncoding, id_utf8));
|
66
|
+
|
67
|
+
TTF_Font *font = Get_TTFont(rb_iv_get(self, "@font"))->font;
|
68
|
+
|
69
|
+
VALUE *p_font_color = RARRAY_PTR(rb_iv_get(self, "@color"));
|
70
|
+
SDL_Color fore_color;
|
71
|
+
fore_color.r = NUM2INT(*(p_font_color+0));
|
72
|
+
fore_color.g = NUM2INT(*(p_font_color+1));
|
73
|
+
fore_color.b = NUM2INT(*(p_font_color+2));
|
74
|
+
fore_color.unused = 0;
|
75
|
+
|
76
|
+
VALUE *p_shadow_color = RARRAY_PTR(rb_iv_get(self, "@shadow_color"));
|
77
|
+
SDL_Color shadow_color;
|
78
|
+
shadow_color.r = NUM2INT(*(p_shadow_color+0));
|
79
|
+
shadow_color.g = NUM2INT(*(p_shadow_color+1));
|
80
|
+
shadow_color.b = NUM2INT(*(p_shadow_color+2));
|
81
|
+
shadow_color.unused = 0;
|
82
|
+
|
83
|
+
int font_size = NUM2INT(rb_iv_get(self, "@size"));
|
84
|
+
VALUE use_shadow = rb_iv_get(self, "@use_shadow");
|
85
|
+
VALUE shadow_margin = rb_iv_get(self, "@shadow_margin");
|
86
|
+
int shadow_margin_x = (use_shadow == Qtrue ? NUM2INT(*(RARRAY_PTR(shadow_margin)+0)) : 0);
|
87
|
+
int shadow_margin_y = (use_shadow == Qtrue ? NUM2INT(*(RARRAY_PTR(shadow_margin)+1)) : 0);
|
88
|
+
int hspace = NUM2INT(rb_iv_get(self, "@hspace"));
|
89
|
+
|
90
|
+
SDL_Surface *scr = GetSurface(rb_iv_get(mScreen, "@@screen"))->surface;
|
91
|
+
|
92
|
+
MiyakoBitmap src, dst;
|
93
|
+
_miyako_setup_unit(vdst, scr, &dst, vx, vy, 0);
|
94
|
+
|
95
|
+
char *sptr = RSTRING_PTR(str);
|
96
|
+
|
97
|
+
src.x = dst.x;
|
98
|
+
src.y = dst.y;
|
99
|
+
|
100
|
+
int x, y;
|
101
|
+
|
102
|
+
if(use_shadow == Qtrue)
|
103
|
+
{
|
104
|
+
SDL_Surface *ssrc2 = TTF_RenderUTF8_Blended(font, sptr, shadow_color);
|
105
|
+
|
106
|
+
if(ssrc2 == NULL) return INT2NUM(src.x);
|
107
|
+
Uint32 *psrc2 = (Uint32 *)(ssrc2->pixels);
|
108
|
+
|
109
|
+
src.x += shadow_margin_x;
|
110
|
+
src.y += shadow_margin_y;
|
111
|
+
|
112
|
+
MiyakoSize size2;
|
113
|
+
size2.w = dst.rect.w - (src.x < 0 ? -(src.x) : src.x);
|
114
|
+
size2.h = dst.rect.h - (src.y < 0 ? -(src.y) : src.y);
|
115
|
+
if(size2.w > ssrc2->w){ size2.w = ssrc2->w; }
|
116
|
+
if(size2.h > ssrc2->h){ size2.h = ssrc2->h; }
|
117
|
+
|
118
|
+
SDL_LockSurface(ssrc2);
|
119
|
+
SDL_LockSurface(dst.surface);
|
120
|
+
|
121
|
+
for(y = 0; y < size2.h; y++)
|
122
|
+
{
|
123
|
+
Uint32 *ppsrc2 = psrc2 + y * ssrc2->w;
|
124
|
+
Uint32 *ppdst = dst.ptr + (src.y + y) * dst.surface->w + src.x;
|
125
|
+
for(x = 0; x < size2.w; x++)
|
126
|
+
{
|
127
|
+
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
128
|
+
dst.color.a = (Uint32)(((*ppdst) >> 24) << dst.fmt->Aloss) & 0xff | dst.a255;
|
129
|
+
src.color.a = (Uint32)(((*ppsrc2) >> 24) << ssrc2->format->Aloss) & 0xff;
|
130
|
+
if(src.color.a == 0){ ppsrc2++; ppdst++; continue; }
|
131
|
+
if(dst.color.a == 0 || src.color.a == 255){
|
132
|
+
*ppdst = *ppsrc2;
|
133
|
+
ppsrc2++;
|
134
|
+
ppdst++;
|
135
|
+
continue;
|
136
|
+
}
|
137
|
+
dst.color.r = (Uint32)(((*ppdst) >> 16)) & 0xff;
|
138
|
+
dst.color.g = (Uint32)(((*ppdst) >> 8)) & 0xff;
|
139
|
+
dst.color.b = (Uint32)(((*ppdst))) & 0xff;
|
140
|
+
src.color.r = (Uint32)(((*ppsrc2) >> 16)) & 0xff;
|
141
|
+
src.color.g = (Uint32)(((*ppsrc2) >> 8)) & 0xff;
|
142
|
+
src.color.b = (Uint32)(((*ppsrc2))) & 0xff;
|
143
|
+
int a1 = src.color.a + 1;
|
144
|
+
int a2 = 256 - src.color.a;
|
145
|
+
*ppdst = (((src.color.r * a1 + dst.color.r * a2) >> 8)) << 16 |
|
146
|
+
(((src.color.g * a1 + dst.color.g * a2) >> 8)) << 8 |
|
147
|
+
(((src.color.b * a1 + dst.color.b * a2) >> 8)) |
|
148
|
+
(255 >> dst.fmt->Aloss) << 24;
|
149
|
+
#else
|
150
|
+
dst.color.a = (Uint32)(((*ppdst & dst.fmt->Amask)) << dst.fmt->Aloss) | dst.a255;
|
151
|
+
src.color.a = (Uint32)(((*ppsrc2 & ssrc2->format->Amask)) << ssrc2->format->Aloss);
|
152
|
+
if(src.color.a == 0){ ppsrc2++; ppdst++; continue; }
|
153
|
+
if(dst.color.a == 0 || src.color.a == 255){
|
154
|
+
*ppdst = *ppsrc2;
|
155
|
+
ppsrc2++;
|
156
|
+
ppdst++;
|
157
|
+
continue;
|
158
|
+
}
|
159
|
+
dst.color.r = (Uint32)(((*ppdst & dst.fmt->Rmask) >> dst.fmt->Rshift));
|
160
|
+
dst.color.g = (Uint32)(((*ppdst & dst.fmt->Gmask) >> dst.fmt->Gshift));
|
161
|
+
dst.color.b = (Uint32)(((*ppdst & dst.fmt->Bmask) >> dst.fmt->Bshift));
|
162
|
+
src.color.r = (Uint32)(((*ppsrc2 & ssrc2->format->Rmask) >> ssrc2->format->Rshift));
|
163
|
+
src.color.g = (Uint32)(((*ppsrc2 & ssrc2->format->Gmask) >> ssrc2->format->Gshift));
|
164
|
+
src.color.b = (Uint32)(((*ppsrc2 & ssrc2->format->Bmask) >> ssrc2->format->Bshift));
|
165
|
+
int a1 = src.color.a + 1;
|
166
|
+
int a2 = 256 - src.color.a;
|
167
|
+
*ppdst = (((src.color.r * a1 + dst.color.r * a2) >> 8)) << dst.fmt->Rshift |
|
168
|
+
(((src.color.g * a1 + dst.color.g * a2) >> 8)) << dst.fmt->Gshift |
|
169
|
+
(((src.color.b * a1 + dst.color.b * a2) >> 8)) << dst.fmt->Bshift |
|
170
|
+
(255 >> dst.fmt->Aloss);
|
171
|
+
#endif
|
172
|
+
ppsrc2++;
|
173
|
+
ppdst++;
|
174
|
+
}
|
175
|
+
}
|
176
|
+
|
177
|
+
SDL_UnlockSurface(ssrc2);
|
178
|
+
SDL_UnlockSurface(dst.surface);
|
179
|
+
|
180
|
+
SDL_FreeSurface(ssrc2);
|
181
|
+
|
182
|
+
src.x = dst.x;
|
183
|
+
src.y = dst.y;
|
184
|
+
}
|
185
|
+
|
186
|
+
SDL_Surface *ssrc = TTF_RenderUTF8_Blended(font, sptr, fore_color);
|
187
|
+
|
188
|
+
if(ssrc == NULL) return INT2NUM(src.x);
|
189
|
+
|
190
|
+
Uint32 *psrc = (Uint32 *)(ssrc->pixels);
|
191
|
+
|
192
|
+
MiyakoSize size;
|
193
|
+
size.w = dst.rect.w - (src.x < 0 ? -(src.x) : src.x);
|
194
|
+
size.h = dst.rect.h - (src.y < 0 ? -(src.y) : src.y);
|
195
|
+
if(size.w > ssrc->w){ size.w = ssrc->w; }
|
196
|
+
if(size.h > ssrc->h){ size.h = ssrc->h; }
|
197
|
+
|
198
|
+
SDL_LockSurface(ssrc);
|
199
|
+
SDL_LockSurface(dst.surface);
|
200
|
+
|
201
|
+
for(y = 0; y < size.h; y++)
|
202
|
+
{
|
203
|
+
Uint32 *ppsrc = psrc + y * ssrc->w;
|
204
|
+
Uint32 *ppdst = dst.ptr + (src.y + y) * dst.surface->w + src.x;
|
205
|
+
for(x = 0; x < size.w; x++)
|
206
|
+
{
|
207
|
+
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
208
|
+
dst.color.a = (Uint32)(((*ppdst) >> 24) << dst.fmt->Aloss) & 0xff | dst.a255;
|
209
|
+
src.color.a = (Uint32)(((*ppsrc) >> 24) << ssrc->format->Aloss) & 0xff;
|
210
|
+
if(src.color.a == 0){ ppsrc++; ppdst++; continue; }
|
211
|
+
if(dst.color.a == 0 || src.color.a == 255){
|
212
|
+
*ppdst = *ppsrc;
|
213
|
+
ppsrc++;
|
214
|
+
ppdst++;
|
215
|
+
continue;
|
216
|
+
}
|
217
|
+
dst.color.r = (Uint32)(((*ppdst) >> 16)) & 0xff;
|
218
|
+
dst.color.g = (Uint32)(((*ppdst) >> 8)) & 0xff;
|
219
|
+
dst.color.b = (Uint32)(((*ppdst))) & 0xff;
|
220
|
+
src.color.r = (Uint32)(((*ppsrc) >> 16)) & 0xff;
|
221
|
+
src.color.g = (Uint32)(((*ppsrc) >> 8)) & 0xff;
|
222
|
+
src.color.b = (Uint32)(((*ppsrc))) & 0xff;
|
223
|
+
int a1 = src.color.a + 1;
|
224
|
+
int a2 = 256 - src.color.a;
|
225
|
+
*ppdst = (((src.color.r * a1 + dst.color.r * a2) >> 8)) << 16 |
|
226
|
+
(((src.color.g * a1 + dst.color.g * a2) >> 8)) << 8 |
|
227
|
+
(((src.color.b * a1 + dst.color.b * a2) >> 8)) |
|
228
|
+
(255 >> dst.fmt->Aloss) << 24;
|
229
|
+
#else
|
230
|
+
dst.color.a = (Uint32)(((*ppdst & dst.fmt->Amask)) << dst.fmt->Aloss) | dst.a255;
|
231
|
+
src.color.a = (Uint32)(((*ppsrc & ssrc->format->Amask)) << ssrc->format->Aloss);
|
232
|
+
if(src.color.a == 0){ ppsrc++; ppdst++; continue; }
|
233
|
+
if(dst.color.a == 0 || src.color.a == 255){
|
234
|
+
*ppdst = *ppsrc;
|
235
|
+
ppsrc++;
|
236
|
+
ppdst++;
|
237
|
+
continue;
|
238
|
+
}
|
239
|
+
dst.color.r = (Uint32)(((*ppdst & dst.fmt->Rmask) >> dst.fmt->Rshift));
|
240
|
+
dst.color.g = (Uint32)(((*ppdst & dst.fmt->Gmask) >> dst.fmt->Gshift));
|
241
|
+
dst.color.b = (Uint32)(((*ppdst & dst.fmt->Bmask) >> dst.fmt->Bshift));
|
242
|
+
src.color.r = (Uint32)(((*ppsrc & ssrc->format->Rmask) >> ssrc->format->Rshift));
|
243
|
+
src.color.g = (Uint32)(((*ppsrc & ssrc->format->Gmask) >> ssrc->format->Gshift));
|
244
|
+
src.color.b = (Uint32)(((*ppsrc & ssrc->format->Bmask) >> ssrc->format->Bshift));
|
245
|
+
int a1 = src.color.a + 1;
|
246
|
+
int a2 = 256 - src.color.a;
|
247
|
+
*ppdst = (((src.color.r * a1 + dst.color.r * a2) >> 8)) << dst.fmt->Rshift |
|
248
|
+
(((src.color.g * a1 + dst.color.g * a2) >> 8)) << dst.fmt->Gshift |
|
249
|
+
(((src.color.b * a1 + dst.color.b * a2) >> 8)) << dst.fmt->Bshift |
|
250
|
+
(255 >> dst.fmt->Aloss);
|
251
|
+
#endif
|
252
|
+
ppsrc++;
|
253
|
+
ppdst++;
|
254
|
+
}
|
255
|
+
}
|
256
|
+
|
257
|
+
SDL_UnlockSurface(ssrc);
|
258
|
+
SDL_UnlockSurface(dst.surface);
|
259
|
+
SDL_FreeSurface(ssrc);
|
260
|
+
|
261
|
+
int i, n;
|
262
|
+
const char *ptr = RSTRING_PTR(str);
|
263
|
+
int len = RSTRING_LEN(str);
|
264
|
+
rb_encoding *enc = rb_enc_get(str);
|
265
|
+
for(i=0; i<len; i+=n)
|
266
|
+
{
|
267
|
+
n = rb_enc_mbclen(ptr+i, ptr+len, enc);
|
268
|
+
VALUE chr = rb_str_subseq(str, i, n);
|
269
|
+
int clen = RSTRING_LEN(chr);
|
270
|
+
dst.x += (clen==1 ? font_size>>1 : font_size) + shadow_margin_x + hspace;
|
271
|
+
}
|
272
|
+
return INT2NUM(dst.x);
|
273
|
+
}
|
274
|
+
|
275
|
+
static VALUE font_line_height(VALUE self)
|
276
|
+
{
|
277
|
+
int height = NUM2INT(rb_iv_get(self, "@line_skip"));
|
278
|
+
height += NUM2INT(rb_iv_get(self, "@vspace"));
|
279
|
+
height += (rb_iv_get(self, "@use_shadow") == Qtrue ? NUM2INT(*(RARRAY_PTR(rb_iv_get(self, "@shadow_margin"))+1)) : 0);
|
280
|
+
return INT2NUM(height);
|
281
|
+
}
|
282
|
+
|
283
|
+
static VALUE font_text_size(VALUE self, VALUE str)
|
284
|
+
{
|
285
|
+
int font_size = NUM2INT(rb_iv_get(self, "@size"));
|
286
|
+
VALUE use_shadow = rb_iv_get(self, "@use_shadow");
|
287
|
+
VALUE shadow_margin = rb_iv_get(self, "@shadow_margin");
|
288
|
+
int shadow_margin_x = (use_shadow == Qtrue ? NUM2INT(*(RARRAY_PTR(shadow_margin)+0)) : 0);
|
289
|
+
int hspace = NUM2INT(rb_iv_get(self, "@hspace"));
|
290
|
+
|
291
|
+
int i, n, l=0;
|
292
|
+
const char *ptr = RSTRING_PTR(str);
|
293
|
+
int len = RSTRING_LEN(str);
|
294
|
+
rb_encoding *enc = rb_enc_get(str);
|
295
|
+
for(i=0; i<len; i+=n)
|
296
|
+
{
|
297
|
+
n = rb_enc_mbclen(ptr+i, ptr+len, enc);
|
298
|
+
VALUE chr = rb_str_subseq(str, i, n);
|
299
|
+
int clen = RSTRING_LEN(chr);
|
300
|
+
l += (clen==1 ? font_size>>1 : font_size) + shadow_margin_x + hspace;
|
301
|
+
}
|
302
|
+
VALUE array = rb_ary_new();
|
303
|
+
rb_ary_push(array, INT2NUM(l));
|
304
|
+
rb_ary_push(array, font_line_height(self));
|
305
|
+
return array;
|
306
|
+
}
|
307
|
+
|
308
|
+
void Init_miyako_font()
|
309
|
+
{
|
310
|
+
mSDL = rb_define_module("SDL");
|
311
|
+
mMiyako = rb_define_module("Miyako");
|
312
|
+
mScreen = rb_define_module_under(mMiyako, "Screen");
|
313
|
+
cFont = rb_define_class_under(mMiyako, "Font", rb_cObject);
|
314
|
+
cSurface = rb_define_class_under(mSDL, "Surface", rb_cObject);
|
315
|
+
cTTFFont = rb_define_class_under(mSDL, "TTF", rb_cObject);
|
316
|
+
cEncoding = rb_define_class("Encoding", rb_cObject);
|
317
|
+
|
318
|
+
id_update = rb_intern("update");
|
319
|
+
id_kakko = rb_intern("[]");
|
320
|
+
id_render = rb_intern("render");
|
321
|
+
id_to_a = rb_intern("to_a");
|
322
|
+
|
323
|
+
zero = 0;
|
324
|
+
nZero = INT2NUM(zero);
|
325
|
+
one = 1;
|
326
|
+
nOne = INT2NUM(one);
|
327
|
+
|
328
|
+
id_utf8 = rb_intern("UTF_8");
|
329
|
+
id_encode = rb_intern("encode");
|
330
|
+
|
331
|
+
rb_define_method(cFont, "draw_text", font_draw_text, 4);
|
332
|
+
rb_define_method(cFont, "line_height", font_line_height, 0);
|
333
|
+
rb_define_method(cFont, "text_size", font_text_size, 1);
|
334
|
+
}
|
data/miyako_hsv.c
ADDED
@@ -0,0 +1,830 @@
|
|
1
|
+
/*
|
2
|
+
--
|
3
|
+
Miyako v2.0 Extend Library "Miyako no Katana"
|
4
|
+
Copyright (C) 2008 Cyross Makoto
|
5
|
+
|
6
|
+
This library is free software; you can redistribute it and/or
|
7
|
+
modify it under the terms of the GNU Lesser General Public
|
8
|
+
License as published by the Free Software Foundation; either
|
9
|
+
version 2.1 of the License, or (at your option) any later version.
|
10
|
+
|
11
|
+
This library is distributed in the hope that it will be useful,
|
12
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
+
Lesser General Public License for more details.
|
15
|
+
|
16
|
+
You should have received a copy of the GNU Lesser General Public
|
17
|
+
License along with this library; if not, write to the Free Software
|
18
|
+
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
19
|
+
++
|
20
|
+
*/
|
21
|
+
|
22
|
+
/*
|
23
|
+
=拡張ライブラリmiyako_no_katana
|
24
|
+
Authors:: サイロス誠
|
25
|
+
Version:: 2.0
|
26
|
+
Copyright:: 2007-2008 Cyross Makoto
|
27
|
+
License:: LGPL2.1
|
28
|
+
*/
|
29
|
+
#include "defines.h"
|
30
|
+
#include "extern.h"
|
31
|
+
|
32
|
+
static VALUE mSDL = Qnil;
|
33
|
+
static VALUE mMiyako = Qnil;
|
34
|
+
static VALUE mScreen = Qnil;
|
35
|
+
static VALUE cSurface = Qnil;
|
36
|
+
static VALUE cBitmap = Qnil;
|
37
|
+
static VALUE nZero = Qnil;
|
38
|
+
static VALUE nOne = Qnil;
|
39
|
+
static volatile ID id_update = Qnil;
|
40
|
+
static volatile ID id_kakko = Qnil;
|
41
|
+
static volatile ID id_render = Qnil;
|
42
|
+
static volatile ID id_to_a = Qnil;
|
43
|
+
static volatile int zero = Qnil;
|
44
|
+
static volatile int one = Qnil;
|
45
|
+
|
46
|
+
// from rubysdl_video.c
|
47
|
+
static GLOBAL_DEFINE_GET_STRUCT(Surface, GetSurface, cSurface, "SDL::Surface");
|
48
|
+
|
49
|
+
#define MIYAKO_RGB2HSV(RGBSTRUCT, HSVH, HSVS, HSVV) \
|
50
|
+
Uint32 imax = RGBSTRUCT.r; \
|
51
|
+
Uint32 imin = imax; \
|
52
|
+
imax = imax < RGBSTRUCT.g ? RGBSTRUCT.g : imax; \
|
53
|
+
imax = imax < RGBSTRUCT.b ? RGBSTRUCT.b : imax; \
|
54
|
+
imin = imin > RGBSTRUCT.g ? RGBSTRUCT.g : imin; \
|
55
|
+
imin = imin > RGBSTRUCT.b ? RGBSTRUCT.b : imin; \
|
56
|
+
if(imax == 0){ HSVV = 0.0; HSVH = 0.0; HSVS = 0.0; } \
|
57
|
+
else \
|
58
|
+
{ \
|
59
|
+
HSVV = div255[imax]; \
|
60
|
+
double delta = HSVV - div255[imin]; \
|
61
|
+
HSVS = delta / HSVV; \
|
62
|
+
if(HSVS == 0.0){ HSVH = 0.0; } \
|
63
|
+
else \
|
64
|
+
{ \
|
65
|
+
delta *= 255.0; \
|
66
|
+
if(imax == RGBSTRUCT.r){ HSVH = ((double)(RGBSTRUCT.g) - (double)(RGBSTRUCT.b))/delta; } \
|
67
|
+
if(imax == RGBSTRUCT.g){ HSVH = 2.0 + ((double)(RGBSTRUCT.b) - (double)(RGBSTRUCT.r))/delta; } \
|
68
|
+
if(imax == RGBSTRUCT.b){ HSVH = 4.0 + ((double)(RGBSTRUCT.r) - (double)(RGBSTRUCT.g))/delta; } \
|
69
|
+
HSVH *= 60.0; \
|
70
|
+
if(HSVH < 0){ HSVH += 360.0; } \
|
71
|
+
} \
|
72
|
+
}
|
73
|
+
|
74
|
+
#define MIYAKO_HSV2RGB(HSVH, HSVS, HSVV, RGBSTRUCT) \
|
75
|
+
if(HSVS == 0.0){ RGBSTRUCT.r = RGBSTRUCT.g = RGBSTRUCT.b = (Uint32)(HSVV * 255.0); } \
|
76
|
+
else \
|
77
|
+
{ \
|
78
|
+
double tmp_i = HSVH / 60.0; \
|
79
|
+
if( tmp_i < 1.0){ i = 0.0; } \
|
80
|
+
else if(tmp_i < 2.0){ i = 1.0; } \
|
81
|
+
else if(tmp_i < 3.0){ i = 2.0; } \
|
82
|
+
else if(tmp_i < 4.0){ i = 3.0; } \
|
83
|
+
else if(tmp_i < 5.0){ i = 4.0; } \
|
84
|
+
else if(tmp_i < 6.0){ i = 5.0; } \
|
85
|
+
f = tmp_i - i; \
|
86
|
+
m = HSVV * (1 - HSVS); \
|
87
|
+
n = HSVV * (1 - HSVS * f); \
|
88
|
+
k = HSVV * (1 - HSVS * (1 - f)); \
|
89
|
+
if( i == 0.0){ r = HSVV; g = k, b = m; } \
|
90
|
+
else if(i == 1.0){ r = n; g = HSVV, b = m; } \
|
91
|
+
else if(i == 2.0){ r = m; g = HSVV, b = k; } \
|
92
|
+
else if(i == 3.0){ r = m; g = n, b = HSVV; } \
|
93
|
+
else if(i == 4.0){ r = k; g = m, b = HSVV; } \
|
94
|
+
else if(i == 5.0){ r = HSVV; g = m, b = n; } \
|
95
|
+
RGBSTRUCT.r = (Uint32)(r * 255.0); \
|
96
|
+
RGBSTRUCT.g = (Uint32)(g * 255.0); \
|
97
|
+
RGBSTRUCT.b = (Uint32)(b * 255.0); \
|
98
|
+
}
|
99
|
+
|
100
|
+
static volatile double div255[256];
|
101
|
+
|
102
|
+
/*
|
103
|
+
画像の色相を変更する
|
104
|
+
*/
|
105
|
+
static VALUE bitmap_miyako_hue(VALUE self, VALUE vsrc, VALUE vdst, VALUE degree)
|
106
|
+
{
|
107
|
+
MiyakoBitmap src, dst;
|
108
|
+
MiyakoSize size;
|
109
|
+
SDL_Surface *scr = GetSurface(rb_iv_get(mScreen, "@@screen"))->surface;
|
110
|
+
|
111
|
+
_miyako_setup_unit_2(vsrc, vdst, scr, &src, &dst, Qnil, Qnil, 1);
|
112
|
+
|
113
|
+
if(_miyako_init_rect(&src, &dst, &size) == 0) return Qnil;
|
114
|
+
|
115
|
+
int x, y;
|
116
|
+
|
117
|
+
double deg = NUM2DBL(degree);
|
118
|
+
double d_pi = 360.0;
|
119
|
+
double ph = 0.0, ps = 0.0, pv = 0.0;
|
120
|
+
double r = 0.0, g = 0.0, b = 0.0;
|
121
|
+
double i = 0.0, f, m, n, k;
|
122
|
+
|
123
|
+
if(deg <= -360.0 || deg >= 360.0){ return Qnil; }
|
124
|
+
|
125
|
+
SDL_LockSurface(src.surface);
|
126
|
+
SDL_LockSurface(dst.surface);
|
127
|
+
|
128
|
+
for(y = 0; y < size.h; y++)
|
129
|
+
{
|
130
|
+
Uint32 *psrc = src.ptr + (src.rect.y + y) * src.rect.w + src.rect.x;
|
131
|
+
Uint32 *pdst = dst.ptr + (dst.rect.y + src.y + y) * dst.rect.w + dst.rect.x + src.x;
|
132
|
+
for(x = 0; x < size.w; x++)
|
133
|
+
{
|
134
|
+
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
135
|
+
src.color.r = (*psrc >> 16) & 0xff;
|
136
|
+
src.color.g = (*psrc >> 8) & 0xff;
|
137
|
+
src.color.b = (*psrc ) & 0xff;
|
138
|
+
src.color.a = (*psrc >> 24) & 0xff | src.a255;
|
139
|
+
if(src.color.a == 0){ psrc++; pdst++; continue; }
|
140
|
+
dst.color.r = (*pdst >> 16) & 0xff;
|
141
|
+
dst.color.g = (*pdst >> 8) & 0xff;
|
142
|
+
dst.color.b = (*pdst ) & 0xff;
|
143
|
+
dst.color.a = (*pdst >> 24) & 0xff | dst.a255;
|
144
|
+
MIYAKO_RGB2HSV(src.color, ph, ps, pv);
|
145
|
+
ph += deg;
|
146
|
+
if(ph < 0.0){ ph += d_pi; }
|
147
|
+
if(ph >= d_pi){ ph -= d_pi; }
|
148
|
+
MIYAKO_HSV2RGB(ph, ps, pv, src.color);
|
149
|
+
if(dst.color.a == 0 || src.color.a == 255){
|
150
|
+
*pdst = (src.color.r) << 16 |
|
151
|
+
(src.color.g) << 8 |
|
152
|
+
(src.color.b) |
|
153
|
+
(src.color.a) << 24;
|
154
|
+
psrc++;
|
155
|
+
pdst++;
|
156
|
+
continue;
|
157
|
+
}
|
158
|
+
int a1 = src.color.a + 1;
|
159
|
+
int a2 = 256 - src.color.a;
|
160
|
+
*pdst = ((src.color.r * a1 + dst.color.r * a2) >> 8) << 16 |
|
161
|
+
((src.color.g * a1 + dst.color.g * a2) >> 8) << 8 |
|
162
|
+
((src.color.b * a1 + dst.color.b * a2) >> 8) |
|
163
|
+
0xff << 24;
|
164
|
+
#else
|
165
|
+
src.color.r = (*psrc & src.fmt->Rmask) >> src.fmt->Rshift;
|
166
|
+
src.color.g = (*psrc & src.fmt->Gmask) >> src.fmt->Gshift;
|
167
|
+
src.color.b = (*psrc & src.fmt->Bmask) >> src.fmt->Bshift;
|
168
|
+
src.color.a = (*psrc & src.fmt->Amask) | src.a255;
|
169
|
+
if(src.color.a == 0){ psrc++; pdst++; continue; }
|
170
|
+
dst.color.r = (*pdst & dst.fmt->Rmask) >> dst.fmt->Rshift);
|
171
|
+
dst.color.g = (*pdst & dst.fmt->Gmask) >> dst.fmt->Gshift);
|
172
|
+
dst.color.b = (*pdst & dst.fmt->Bmask) >> dst.fmt->Bshift);
|
173
|
+
dst.color.a = (*pdst & dst.fmt->Amask) | dst.a255;
|
174
|
+
MIYAKO_RGB2HSV(src.color, ph, ps, pv);
|
175
|
+
ph += deg;
|
176
|
+
if(ph < 0.0){ ph += d_pi; }
|
177
|
+
if(ph >= d_pi){ ph -= d_pi; }
|
178
|
+
MIYAKO_HSV2RGB(ph, ps, pv, src.color);
|
179
|
+
if(dst.color.a == 0 || src.color.a == 255){
|
180
|
+
*pdst = src.color.r << dst.fmt->Rshift |
|
181
|
+
src.color.g << dst.fmt->Gshift |
|
182
|
+
src.color.b << dst.fmt->Bshift |
|
183
|
+
src.color.a;
|
184
|
+
psrc++;
|
185
|
+
pdst++;
|
186
|
+
continue;
|
187
|
+
}
|
188
|
+
int a1 = src.color.a + 1;
|
189
|
+
int a2 = 256 - src.color.a;
|
190
|
+
*pdst = ((src.color.r * a1 + dst.color.r * a2) >> 8) << dst.fmt->Rshift |
|
191
|
+
((src.color.g * a1 + dst.color.g * a2) >> 8) << dst.fmt->Gshift |
|
192
|
+
((src.color.b * a1 + dst.color.b * a2) >> 8) << dst.fmt->Bshift |
|
193
|
+
0xff;
|
194
|
+
#endif
|
195
|
+
psrc++;
|
196
|
+
pdst++;
|
197
|
+
}
|
198
|
+
}
|
199
|
+
|
200
|
+
SDL_UnlockSurface(src.surface);
|
201
|
+
SDL_UnlockSurface(dst.surface);
|
202
|
+
|
203
|
+
return vdst;
|
204
|
+
}
|
205
|
+
|
206
|
+
/*
|
207
|
+
画像の彩度を変更する
|
208
|
+
*/
|
209
|
+
static VALUE bitmap_miyako_saturation(VALUE self, VALUE vsrc, VALUE vdst, VALUE saturation)
|
210
|
+
{
|
211
|
+
MiyakoBitmap src, dst;
|
212
|
+
MiyakoSize size;
|
213
|
+
SDL_Surface *scr = GetSurface(rb_iv_get(mScreen, "@@screen"))->surface;
|
214
|
+
|
215
|
+
int x, y;
|
216
|
+
|
217
|
+
double sat = NUM2DBL(saturation);
|
218
|
+
double ph = 0.0, ps = 0.0, pv = 0.0;
|
219
|
+
double r = 0.0, g = 0.0, b = 0.0;
|
220
|
+
double i = 0.0, f, m, n, k;
|
221
|
+
|
222
|
+
_miyako_setup_unit_2(vsrc, vdst, scr, &src, &dst, Qnil, Qnil, 1);
|
223
|
+
|
224
|
+
if(_miyako_init_rect(&src, &dst, &size) == 0) return Qnil;
|
225
|
+
|
226
|
+
SDL_LockSurface(src.surface);
|
227
|
+
SDL_LockSurface(dst.surface);
|
228
|
+
|
229
|
+
for(y = 0; y < size.h; y++)
|
230
|
+
{
|
231
|
+
Uint32 *psrc = src.ptr + (src.rect.y + y) * src.rect.w + src.rect.x;
|
232
|
+
Uint32 *pdst = dst.ptr + (dst.rect.y + src.y + y) * dst.rect.w + dst.rect.x + src.x;
|
233
|
+
for(x = 0; x < size.w; x++)
|
234
|
+
{
|
235
|
+
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
236
|
+
src.color.r = (*psrc >> 16) & 0xff;
|
237
|
+
src.color.g = (*psrc >> 8) & 0xff;
|
238
|
+
src.color.b = (*psrc ) & 0xff;
|
239
|
+
src.color.a = (*psrc >> 24) & 0xff | src.a255;
|
240
|
+
if(src.color.a == 0){ psrc++; pdst++; continue; }
|
241
|
+
dst.color.r = (*pdst >> 16) & 0xff;
|
242
|
+
dst.color.g = (*pdst >> 8) & 0xff;
|
243
|
+
dst.color.b = (*pdst ) & 0xff;
|
244
|
+
dst.color.a = (*pdst >> 24) & 0xff | dst.a255;
|
245
|
+
MIYAKO_RGB2HSV(src.color, ph, ps, pv);
|
246
|
+
ps += sat;
|
247
|
+
if(ps < 0.0){ ps = 0.0; }
|
248
|
+
if(ps > 1.0){ ps = 1.0; }
|
249
|
+
MIYAKO_HSV2RGB(ph, ps, pv, src.color);
|
250
|
+
if(dst.color.a == 0 || src.color.a == 255){
|
251
|
+
*pdst = (src.color.r) << 16 |
|
252
|
+
(src.color.g) << 8 |
|
253
|
+
(src.color.b) |
|
254
|
+
(src.color.a) << 24;
|
255
|
+
psrc++;
|
256
|
+
pdst++;
|
257
|
+
continue;
|
258
|
+
}
|
259
|
+
int a1 = src.color.a + 1;
|
260
|
+
int a2 = 256 - src.color.a;
|
261
|
+
*pdst = ((src.color.r * a1 + dst.color.r * a2) >> 8) << 16 |
|
262
|
+
((src.color.g * a1 + dst.color.g * a2) >> 8) << 8 |
|
263
|
+
((src.color.b * a1 + dst.color.b * a2) >> 8) |
|
264
|
+
0xff << 24;
|
265
|
+
psrc++;
|
266
|
+
pdst++;
|
267
|
+
#else
|
268
|
+
src.color.r = (*psrc & src.fmt->Rmask) >> src.fmt->Rshift;
|
269
|
+
src.color.g = (*psrc & src.fmt->Gmask) >> src.fmt->Gshift;
|
270
|
+
src.color.b = (*psrc & src.fmt->Bmask) >> src.fmt->Bshift;
|
271
|
+
src.color.a = (*psrc & src.fmt->Amask) | src.a255;
|
272
|
+
if(src.color.a == 0){ psrc++; pdst++; continue; }
|
273
|
+
dst.color.r = (*pdst & dst.fmt->Rmask) >> dst.fmt->Rshift);
|
274
|
+
dst.color.g = (*pdst & dst.fmt->Gmask) >> dst.fmt->Gshift);
|
275
|
+
dst.color.b = (*pdst & dst.fmt->Bmask) >> dst.fmt->Bshift);
|
276
|
+
dst.color.a = (*pdst & dst.fmt->Amask) | dst.a255;
|
277
|
+
MIYAKO_RGB2HSV(src.color, ph, ps, pv);
|
278
|
+
ps += sat;
|
279
|
+
if(ps < 0.0){ ps = 0.0; }
|
280
|
+
if(ps > 1.0){ ps = 1.0; }
|
281
|
+
MIYAKO_HSV2RGB(ph, ps, pv, src.color);
|
282
|
+
if(dst.color.a == 0 || src.color.a == 255){
|
283
|
+
*pdst = src.color.r << dst.fmt->Rshift |
|
284
|
+
src.color.g << dst.fmt->Gshift |
|
285
|
+
src.color.b << dst.fmt->Bshift |
|
286
|
+
src.color.a;
|
287
|
+
psrc++;
|
288
|
+
pdst++;
|
289
|
+
continue;
|
290
|
+
}
|
291
|
+
int a1 = src.color.a + 1;
|
292
|
+
int a2 = 256 - src.color.a;
|
293
|
+
*pdst = ((src.color.r * a1 + dst.color.r * a2) >> 8) << dst.fmt->Rshift |
|
294
|
+
((src.color.g * a1 + dst.color.g * a2) >> 8) << dst.fmt->Gshift |
|
295
|
+
((src.color.b * a1 + dst.color.b * a2) >> 8) << dst.fmt->Bshift |
|
296
|
+
0xff;
|
297
|
+
psrc++;
|
298
|
+
pdst++;
|
299
|
+
#endif
|
300
|
+
}
|
301
|
+
}
|
302
|
+
|
303
|
+
SDL_UnlockSurface(src.surface);
|
304
|
+
SDL_UnlockSurface(dst.surface);
|
305
|
+
|
306
|
+
return vdst;
|
307
|
+
}
|
308
|
+
|
309
|
+
/*
|
310
|
+
画像の明度を変更する
|
311
|
+
*/
|
312
|
+
static VALUE bitmap_miyako_value(VALUE self, VALUE vsrc, VALUE vdst, VALUE value)
|
313
|
+
{
|
314
|
+
MiyakoBitmap src, dst;
|
315
|
+
MiyakoSize size;
|
316
|
+
SDL_Surface *scr = GetSurface(rb_iv_get(mScreen, "@@screen"))->surface;
|
317
|
+
double val = NUM2DBL(value);
|
318
|
+
|
319
|
+
int x, y;
|
320
|
+
double ph = 0.0, ps = 0.0, pv = 0.0;
|
321
|
+
double r = 0.0, g = 0.0, b = 0.0;
|
322
|
+
double i = 0.0, f, m, n, k;
|
323
|
+
|
324
|
+
_miyako_setup_unit_2(vsrc, vdst, scr, &src, &dst, Qnil, Qnil, 1);
|
325
|
+
|
326
|
+
if(_miyako_init_rect(&src, &dst, &size) == 0) return Qnil;
|
327
|
+
|
328
|
+
SDL_LockSurface(src.surface);
|
329
|
+
SDL_LockSurface(dst.surface);
|
330
|
+
|
331
|
+
for(y = 0; y < size.h; y++)
|
332
|
+
{
|
333
|
+
Uint32 *psrc = src.ptr + (src.rect.y + y) * src.rect.w + src.rect.x;
|
334
|
+
Uint32 *pdst = dst.ptr + (dst.rect.y + src.y + y) * dst.rect.w + dst.rect.x + src.x;
|
335
|
+
for(x = 0; x < size.w; x++)
|
336
|
+
{
|
337
|
+
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
338
|
+
src.color.r = (*psrc >> 16) & 0xff;
|
339
|
+
src.color.g = (*psrc >> 8) & 0xff;
|
340
|
+
src.color.b = (*psrc ) & 0xff;
|
341
|
+
src.color.a = (*psrc >> 24) & 0xff | src.a255;
|
342
|
+
if(src.color.a == 0){ psrc++; pdst++; continue; }
|
343
|
+
dst.color.r = (*pdst >> 16) & 0xff;
|
344
|
+
dst.color.g = (*pdst >> 8) & 0xff;
|
345
|
+
dst.color.b = (*pdst ) & 0xff;
|
346
|
+
dst.color.a = (*pdst >> 24) & 0xff | dst.a255;
|
347
|
+
MIYAKO_RGB2HSV(src.color, ph, ps, pv);
|
348
|
+
pv += val;
|
349
|
+
if(pv < 0.0){ pv = 0.0; }
|
350
|
+
if(pv > 1.0){ pv = 1.0; }
|
351
|
+
MIYAKO_HSV2RGB(ph, ps, pv, src.color);
|
352
|
+
if(dst.color.a == 0 || src.color.a == 255){
|
353
|
+
*pdst = (src.color.r) << 16 |
|
354
|
+
(src.color.g) << 8 |
|
355
|
+
(src.color.b) |
|
356
|
+
(src.color.a) << 24;
|
357
|
+
psrc++;
|
358
|
+
pdst++;
|
359
|
+
continue;
|
360
|
+
}
|
361
|
+
int a1 = src.color.a + 1;
|
362
|
+
int a2 = 256 - src.color.a;
|
363
|
+
*pdst = ((src.color.r * a1 + dst.color.r * a2) >> 8) << 16 |
|
364
|
+
((src.color.g * a1 + dst.color.g * a2) >> 8) << 8 |
|
365
|
+
((src.color.b * a1 + dst.color.b * a2) >> 8) |
|
366
|
+
0xff << 24;
|
367
|
+
#else
|
368
|
+
src.color.r = (*psrc & src.fmt->Rmask) >> src.fmt->Rshift;
|
369
|
+
src.color.g = (*psrc & src.fmt->Gmask) >> src.fmt->Gshift;
|
370
|
+
src.color.b = (*psrc & src.fmt->Bmask) >> src.fmt->Bshift;
|
371
|
+
src.color.a = (*psrc & src.fmt->Amask) | src.a255;
|
372
|
+
if(src.color.a == 0){ psrc++; pdst++; continue; }
|
373
|
+
dst.color.r = (*pdst & dst.fmt->Rmask) >> dst.fmt->Rshift);
|
374
|
+
dst.color.g = (*pdst & dst.fmt->Gmask) >> dst.fmt->Gshift);
|
375
|
+
dst.color.b = (*pdst & dst.fmt->Bmask) >> dst.fmt->Bshift);
|
376
|
+
dst.color.a = (*pdst & dst.fmt->Amask) | dst.a255;
|
377
|
+
MIYAKO_RGB2HSV(src.color, ph, ps, pv);
|
378
|
+
pv += val;
|
379
|
+
if(pv < 0.0){ pv = 0.0; }
|
380
|
+
if(pv > 1.0){ pv = 1.0; }
|
381
|
+
MIYAKO_HSV2RGB(ph, ps, pv, src.color);
|
382
|
+
if(dst.color.a == 0 || src.color.a == 255){
|
383
|
+
*pdst = src.color.r << dst.fmt->Rshift |
|
384
|
+
src.color.g << dst.fmt->Gshift |
|
385
|
+
src.color.b << dst.fmt->Bshift |
|
386
|
+
src.color.a;
|
387
|
+
psrc++;
|
388
|
+
pdst++;
|
389
|
+
continue;
|
390
|
+
}
|
391
|
+
int a1 = src.color.a + 1;
|
392
|
+
int a2 = 256 - src.color.a;
|
393
|
+
*pdst = ((src.color.r * a1 + dst.color.r * a2) >> 8) << dst.fmt->Rshift |
|
394
|
+
((src.color.g * a1 + dst.color.g * a2) >> 8) << dst.fmt->Gshift |
|
395
|
+
((src.color.b * a1 + dst.color.b * a2) >> 8) << dst.fmt->Bshift |
|
396
|
+
0xff;
|
397
|
+
#endif
|
398
|
+
psrc++;
|
399
|
+
pdst++;
|
400
|
+
}
|
401
|
+
}
|
402
|
+
|
403
|
+
SDL_UnlockSurface(src.surface);
|
404
|
+
SDL_UnlockSurface(dst.surface);
|
405
|
+
|
406
|
+
return vdst;
|
407
|
+
}
|
408
|
+
|
409
|
+
/*
|
410
|
+
画像の色相・彩度・明度を変更する
|
411
|
+
*/
|
412
|
+
static VALUE bitmap_miyako_hsv(VALUE self, VALUE vsrc, VALUE vdst, VALUE degree, VALUE saturation, VALUE value)
|
413
|
+
{
|
414
|
+
MiyakoBitmap src, dst;
|
415
|
+
MiyakoSize size;
|
416
|
+
SDL_Surface *scr = GetSurface(rb_iv_get(mScreen, "@@screen"))->surface;
|
417
|
+
|
418
|
+
int x, y;
|
419
|
+
|
420
|
+
double deg = NUM2DBL(degree);
|
421
|
+
double sat = NUM2DBL(saturation);
|
422
|
+
double val = NUM2DBL(value);
|
423
|
+
double d_pi = 360.0;
|
424
|
+
double ph = 0.0, ps = 0.0, pv = 0.0;
|
425
|
+
double r = 0.0, g = 0.0, b = 0.0;
|
426
|
+
double i = 0.0, f, m, n, k;
|
427
|
+
|
428
|
+
if(deg <= -360.0 || deg >= 360.0){ return Qnil; }
|
429
|
+
|
430
|
+
_miyako_setup_unit_2(vsrc, vdst, scr, &src, &dst, Qnil, Qnil, 1);
|
431
|
+
|
432
|
+
if(_miyako_init_rect(&src, &dst, &size) == 0) return Qnil;
|
433
|
+
|
434
|
+
SDL_LockSurface(src.surface);
|
435
|
+
SDL_LockSurface(dst.surface);
|
436
|
+
|
437
|
+
for(y = 0; y < size.h; y++)
|
438
|
+
{
|
439
|
+
Uint32 *psrc = src.ptr + (src.rect.y + y) * src.rect.w + src.rect.x;
|
440
|
+
Uint32 *pdst = dst.ptr + (dst.rect.y + src.y + y) * dst.rect.w + dst.rect.x + src.x;
|
441
|
+
for(x = 0; x < size.w; x++)
|
442
|
+
{
|
443
|
+
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
444
|
+
src.color.r = (*psrc >> 16) & 0xff;
|
445
|
+
src.color.g = (*psrc >> 8) & 0xff;
|
446
|
+
src.color.b = (*psrc ) & 0xff;
|
447
|
+
src.color.a = (*psrc >> 24) & 0xff | src.a255;
|
448
|
+
if(src.color.a == 0){ psrc++; pdst++; continue; }
|
449
|
+
dst.color.r = (*pdst >> 16) & 0xff;
|
450
|
+
dst.color.g = (*pdst >> 8) & 0xff;
|
451
|
+
dst.color.b = (*pdst ) & 0xff;
|
452
|
+
dst.color.a = (*pdst >> 24) & 0xff | dst.a255;
|
453
|
+
MIYAKO_RGB2HSV(src.color, ph, ps, pv);
|
454
|
+
ph += deg;
|
455
|
+
if(ph < 0.0){ ph += d_pi; }
|
456
|
+
if(ph >= d_pi){ ph -= d_pi; }
|
457
|
+
ps += sat;
|
458
|
+
if(ps < 0.0){ ps = 0.0; }
|
459
|
+
if(ps > 1.0){ ps = 1.0; }
|
460
|
+
pv += val;
|
461
|
+
if(pv < 0.0){ pv = 0.0; }
|
462
|
+
if(pv > 1.0){ pv = 1.0; }
|
463
|
+
MIYAKO_HSV2RGB(ph, ps, pv, src.color);
|
464
|
+
if(dst.color.a == 0 || src.color.a == 255){
|
465
|
+
*pdst = (src.color.r) << 16 |
|
466
|
+
(src.color.g) << 8 |
|
467
|
+
(src.color.b) |
|
468
|
+
(src.color.a) << 24;
|
469
|
+
psrc++;
|
470
|
+
pdst++;
|
471
|
+
continue;
|
472
|
+
}
|
473
|
+
int a1 = src.color.a + 1;
|
474
|
+
int a2 = 256 - src.color.a;
|
475
|
+
*pdst = ((src.color.r * a1 + dst.color.r * a2) >> 8) << 16 |
|
476
|
+
((src.color.g * a1 + dst.color.g * a2) >> 8) << 8 |
|
477
|
+
((src.color.b * a1 + dst.color.b * a2) >> 8) |
|
478
|
+
0xff << 24;
|
479
|
+
psrc++;
|
480
|
+
pdst++;
|
481
|
+
#else
|
482
|
+
src.color.r = (*psrc & src.fmt->Rmask) >> src.fmt->Rshift;
|
483
|
+
src.color.g = (*psrc & src.fmt->Gmask) >> src.fmt->Gshift;
|
484
|
+
src.color.b = (*psrc & src.fmt->Bmask) >> src.fmt->Bshift;
|
485
|
+
src.color.a = (*psrc & src.fmt->Amask) | src.a255;
|
486
|
+
if(src.color.a == 0){ psrc++; pdst++; continue; }
|
487
|
+
dst.color.r = (*pdst & dst.fmt->Rmask) >> dst.fmt->Rshift);
|
488
|
+
dst.color.g = (*pdst & dst.fmt->Gmask) >> dst.fmt->Gshift);
|
489
|
+
dst.color.b = (*pdst & dst.fmt->Bmask) >> dst.fmt->Bshift);
|
490
|
+
dst.color.a = (*pdst & dst.fmt->Amask) | dst.a255;
|
491
|
+
MIYAKO_RGB2HSV(src.color, ph, ps, pv);
|
492
|
+
ph += deg;
|
493
|
+
if(ph < 0.0){ ph += d_pi; }
|
494
|
+
if(ph >= d_pi){ ph -= d_pi; }
|
495
|
+
ps += sat;
|
496
|
+
if(ps < 0.0){ ps = 0.0; }
|
497
|
+
if(ps > 1.0){ ps = 1.0; }
|
498
|
+
pv += val;
|
499
|
+
if(pv < 0.0){ pv = 0.0; }
|
500
|
+
if(pv > 1.0){ pv = 1.0; }
|
501
|
+
MIYAKO_HSV2RGB(ph, ps, pv, src.color);
|
502
|
+
if(dst.color.a == 0 || src.color.a == 255){
|
503
|
+
*pdst = src.color.r << dst.fmt->Rshift |
|
504
|
+
src.color.g << dst.fmt->Gshift |
|
505
|
+
src.color.b << dst.fmt->Bshift |
|
506
|
+
src.color.a;
|
507
|
+
psrc++;
|
508
|
+
pdst++;
|
509
|
+
continue;
|
510
|
+
}
|
511
|
+
int a1 = src.color.a + 1;
|
512
|
+
int a2 = 256 - src.color.a;
|
513
|
+
*pdst = ((src.color.r * a1 + dst.color.r * a2) >> 8) << dst.fmt->Rshift |
|
514
|
+
((src.color.g * a1 + dst.color.g * a2) >> 8) << dst.fmt->Gshift |
|
515
|
+
((src.color.b * a1 + dst.color.b * a2) >> 8) << dst.fmt->Bshift |
|
516
|
+
0xff;
|
517
|
+
psrc++;
|
518
|
+
pdst++;
|
519
|
+
#endif
|
520
|
+
}
|
521
|
+
}
|
522
|
+
|
523
|
+
SDL_UnlockSurface(src.surface);
|
524
|
+
SDL_UnlockSurface(dst.surface);
|
525
|
+
|
526
|
+
return vdst;
|
527
|
+
}
|
528
|
+
|
529
|
+
/*
|
530
|
+
画像の色相を変更する
|
531
|
+
*/
|
532
|
+
static VALUE bitmap_miyako_hue_self(VALUE self, VALUE vdst, VALUE degree)
|
533
|
+
{
|
534
|
+
MiyakoBitmap dst;
|
535
|
+
SDL_Surface *scr = GetSurface(rb_iv_get(mScreen, "@@screen"))->surface;
|
536
|
+
|
537
|
+
_miyako_setup_unit(vdst, scr, &dst, Qnil, Qnil, 1);
|
538
|
+
|
539
|
+
int x, y;
|
540
|
+
double deg = NUM2DBL(degree);
|
541
|
+
double d_pi = 360.0;
|
542
|
+
double ph = 0.0, ps = 0.0, pv = 0.0;
|
543
|
+
double r = 0.0, g = 0.0, b = 0.0;
|
544
|
+
double i = 0.0, f, m, n, k;
|
545
|
+
|
546
|
+
if(deg <= -360.0 || deg >= 360.0){ return Qnil; }
|
547
|
+
|
548
|
+
SDL_LockSurface(dst.surface);
|
549
|
+
|
550
|
+
for(y = 0; y < dst.rect.h; y++)
|
551
|
+
{
|
552
|
+
Uint32 *pdst = dst.ptr + (dst.rect.y + y) * dst.rect.w + dst.rect.x;
|
553
|
+
for(x = 0; x < dst.rect.w; x++)
|
554
|
+
{
|
555
|
+
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
556
|
+
dst.color.r = (*pdst >> 16) & 0xff;
|
557
|
+
dst.color.g = (*pdst >> 8) & 0xff;
|
558
|
+
dst.color.b = (*pdst ) & 0xff;
|
559
|
+
dst.color.a = (*pdst >> 24) & 0xff | dst.a255;
|
560
|
+
if(dst.color.a == 0){ pdst++; continue; }
|
561
|
+
MIYAKO_RGB2HSV(dst.color, ph, ps, pv);
|
562
|
+
ph += deg;
|
563
|
+
if(ph < 0.0){ ph += d_pi; }
|
564
|
+
if(ph >= d_pi){ ph -= d_pi; }
|
565
|
+
MIYAKO_HSV2RGB(ph, ps, pv, dst.color);
|
566
|
+
*pdst = (dst.color.r) << 16 |
|
567
|
+
(dst.color.g) << 8 |
|
568
|
+
(dst.color.b) |
|
569
|
+
(dst.color.a) << 24;
|
570
|
+
#else
|
571
|
+
dst.color.r = (*pdst & dst.fmt->Rmask) >> dst.fmt->Rshift);
|
572
|
+
dst.color.g = (*pdst & dst.fmt->Gmask) >> dst.fmt->Gshift);
|
573
|
+
dst.color.b = (*pdst & dst.fmt->Bmask) >> dst.fmt->Bshift);
|
574
|
+
dst.color.a = (*pdst & dst.fmt->Amask) | dst.a255;
|
575
|
+
if(dst.color.a == 0){ pdst++; continue; }
|
576
|
+
MIYAKO_RGB2HSV(dst.color, ph, ps, pv);
|
577
|
+
ph += deg;
|
578
|
+
if(ph < 0.0){ ph += d_pi; }
|
579
|
+
if(ph >= d_pi){ ph -= d_pi; }
|
580
|
+
MIYAKO_HSV2RGB(ph, ps, pv, dst.color);
|
581
|
+
*pdst = dst.color.r << dst.fmt->Rshift |
|
582
|
+
dst.color.g << dst.fmt->Gshift |
|
583
|
+
dst.color.b << dst.fmt->Bshift |
|
584
|
+
dst.color.a;
|
585
|
+
#endif
|
586
|
+
pdst++;
|
587
|
+
}
|
588
|
+
}
|
589
|
+
|
590
|
+
SDL_UnlockSurface(dst.surface);
|
591
|
+
|
592
|
+
return vdst;
|
593
|
+
}
|
594
|
+
|
595
|
+
/*
|
596
|
+
画像の彩度を変更する
|
597
|
+
*/
|
598
|
+
static VALUE bitmap_miyako_saturation_self(VALUE self, VALUE vdst, VALUE saturation)
|
599
|
+
{
|
600
|
+
MiyakoBitmap dst;
|
601
|
+
SDL_Surface *scr = GetSurface(rb_iv_get(mScreen, "@@screen"))->surface;
|
602
|
+
|
603
|
+
_miyako_setup_unit(vdst, scr, &dst, Qnil, Qnil, 1);
|
604
|
+
|
605
|
+
double sat = NUM2DBL(saturation);
|
606
|
+
double ph = 0.0, ps = 0.0, pv = 0.0;
|
607
|
+
double r = 0.0, g = 0.0, b = 0.0;
|
608
|
+
double i = 0.0, f, m, n, k;
|
609
|
+
|
610
|
+
SDL_LockSurface(dst.surface);
|
611
|
+
|
612
|
+
int x, y;
|
613
|
+
for(y = 0; y < dst.rect.h; y++)
|
614
|
+
{
|
615
|
+
Uint32 *pdst = dst.ptr + (dst.rect.y + y) * dst.rect.w + dst.rect.x;
|
616
|
+
for(x = 0; x < dst.rect.w; x++)
|
617
|
+
{
|
618
|
+
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
619
|
+
dst.color.r = (*pdst >> 16) & 0xff;
|
620
|
+
dst.color.g = (*pdst >> 8) & 0xff;
|
621
|
+
dst.color.b = (*pdst ) & 0xff;
|
622
|
+
dst.color.a = (*pdst >> 24) & 0xff | dst.a255;
|
623
|
+
if(dst.color.a == 0){ pdst++; continue; }
|
624
|
+
MIYAKO_RGB2HSV(dst.color, ph, ps, pv);
|
625
|
+
ps += sat;
|
626
|
+
if(ps < 0.0){ ps = 0.0; }
|
627
|
+
if(ps > 1.0){ ps = 1.0; }
|
628
|
+
MIYAKO_HSV2RGB(ph, ps, pv, dst.color);
|
629
|
+
*pdst = (dst.color.r) << 16 |
|
630
|
+
(dst.color.g) << 8 |
|
631
|
+
(dst.color.b) |
|
632
|
+
(dst.color.a) << 24;
|
633
|
+
#else
|
634
|
+
dst.color.r = (*pdst & dst.fmt->Rmask) >> dst.fmt->Rshift);
|
635
|
+
dst.color.g = (*pdst & dst.fmt->Gmask) >> dst.fmt->Gshift);
|
636
|
+
dst.color.b = (*pdst & dst.fmt->Bmask) >> dst.fmt->Bshift);
|
637
|
+
dst.color.a = (*pdst & dst.fmt->Amask) | dst.a255;
|
638
|
+
if(dst.color.a == 0){ pdst++; continue; }
|
639
|
+
MIYAKO_RGB2HSV(dst.color, ph, ps, pv);
|
640
|
+
ps += sat;
|
641
|
+
if(ps < 0.0){ ps = 0.0; }
|
642
|
+
if(ps > 1.0){ ps = 1.0; }
|
643
|
+
MIYAKO_HSV2RGB(ph, ps, pv, dst.color);
|
644
|
+
*pdst = dst.color.r << dst.fmt->Rshift |
|
645
|
+
dst.color.g << dst.fmt->Gshift |
|
646
|
+
dst.color.b << dst.fmt->Bshift |
|
647
|
+
dst.color.a;
|
648
|
+
#endif
|
649
|
+
pdst++;
|
650
|
+
}
|
651
|
+
}
|
652
|
+
|
653
|
+
SDL_UnlockSurface(dst.surface);
|
654
|
+
|
655
|
+
return vdst;
|
656
|
+
}
|
657
|
+
|
658
|
+
/*
|
659
|
+
画像の明度を変更する
|
660
|
+
*/
|
661
|
+
static VALUE bitmap_miyako_value_self(VALUE self, VALUE vdst, VALUE value)
|
662
|
+
{
|
663
|
+
MiyakoBitmap dst;
|
664
|
+
SDL_Surface *scr = GetSurface(rb_iv_get(mScreen, "@@screen"))->surface;
|
665
|
+
|
666
|
+
_miyako_setup_unit(vdst, scr, &dst, Qnil, Qnil, 1);
|
667
|
+
|
668
|
+
double val = NUM2DBL(value);
|
669
|
+
double ph = 0.0, ps = 0.0, pv = 0.0;
|
670
|
+
double r = 0.0, g = 0.0, b = 0.0;
|
671
|
+
double i = 0.0, f, m, n, k;
|
672
|
+
|
673
|
+
SDL_LockSurface(dst.surface);
|
674
|
+
|
675
|
+
int x, y;
|
676
|
+
for(y = 0; y < dst.rect.h; y++)
|
677
|
+
{
|
678
|
+
Uint32 *pdst = dst.ptr + (dst.rect.y + y) * dst.rect.w + dst.rect.x;
|
679
|
+
for(x = 0; x < dst.rect.w; x++)
|
680
|
+
{
|
681
|
+
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
682
|
+
dst.color.r = (*pdst >> 16) & 0xff;
|
683
|
+
dst.color.g = (*pdst >> 8) & 0xff;
|
684
|
+
dst.color.b = (*pdst ) & 0xff;
|
685
|
+
dst.color.a = (*pdst >> 24) & 0xff | dst.a255;
|
686
|
+
if(dst.color.a == 0){ pdst++; continue; }
|
687
|
+
MIYAKO_RGB2HSV(dst.color, ph, ps, pv);
|
688
|
+
pv += val;
|
689
|
+
if(pv < 0.0){ pv = 0.0; }
|
690
|
+
if(pv > 1.0){ pv = 1.0; }
|
691
|
+
MIYAKO_HSV2RGB(ph, ps, pv, dst.color);
|
692
|
+
*pdst = (dst.color.r) << 16 |
|
693
|
+
(dst.color.g) << 8 |
|
694
|
+
(dst.color.b) |
|
695
|
+
(dst.color.a) << 24;
|
696
|
+
#else
|
697
|
+
dst.color.r = (*pdst & dst.fmt->Rmask) >> dst.fmt->Rshift);
|
698
|
+
dst.color.g = (*pdst & dst.fmt->Gmask) >> dst.fmt->Gshift);
|
699
|
+
dst.color.b = (*pdst & dst.fmt->Bmask) >> dst.fmt->Bshift);
|
700
|
+
dst.color.a = (*pdst & dst.fmt->Amask) | dst.a255;
|
701
|
+
if(dst.color.a == 0){ pdst++; continue; }
|
702
|
+
MIYAKO_RGB2HSV(dst.color, ph, ps, pv);
|
703
|
+
pv += val;
|
704
|
+
if(pv < 0.0){ pv = 0.0; }
|
705
|
+
if(pv > 1.0){ pv = 1.0; }
|
706
|
+
MIYAKO_HSV2RGB(ph, ps, pv, dst.color);
|
707
|
+
*pdst = dst.color.r << dst.fmt->Rshift |
|
708
|
+
dst.color.g << dst.fmt->Gshift |
|
709
|
+
dst.color.b << dst.fmt->Bshift |
|
710
|
+
dst.color.a;
|
711
|
+
#endif
|
712
|
+
pdst++;
|
713
|
+
}
|
714
|
+
}
|
715
|
+
|
716
|
+
SDL_UnlockSurface(dst.surface);
|
717
|
+
|
718
|
+
return vdst;
|
719
|
+
}
|
720
|
+
|
721
|
+
/*
|
722
|
+
画像の色相・彩度・明度を変更する
|
723
|
+
*/
|
724
|
+
static VALUE bitmap_miyako_hsv_self(VALUE self, VALUE vdst, VALUE degree, VALUE saturation, VALUE value)
|
725
|
+
{
|
726
|
+
MiyakoBitmap dst;
|
727
|
+
SDL_Surface *scr = GetSurface(rb_iv_get(mScreen, "@@screen"))->surface;
|
728
|
+
|
729
|
+
_miyako_setup_unit(vdst, scr, &dst, Qnil, Qnil, 1);
|
730
|
+
|
731
|
+
double deg = NUM2DBL(degree);
|
732
|
+
double sat = NUM2DBL(saturation);
|
733
|
+
double val = NUM2DBL(value);
|
734
|
+
double d_pi = 360.0;
|
735
|
+
double ph = 0.0, ps = 0.0, pv = 0.0;
|
736
|
+
double r = 0.0, g = 0.0, b = 0.0;
|
737
|
+
double i = 0.0, f, m, n, k;
|
738
|
+
|
739
|
+
if(deg <= -360.0 || deg >= 360.0){ return Qnil; }
|
740
|
+
|
741
|
+
SDL_LockSurface(dst.surface);
|
742
|
+
|
743
|
+
int x, y;
|
744
|
+
for(y = 0; y < dst.rect.h; y++)
|
745
|
+
{
|
746
|
+
Uint32 *pdst = dst.ptr + (dst.rect.y + y) * dst.rect.w + dst.rect.x;
|
747
|
+
for(x = 0; x < dst.rect.w; x++)
|
748
|
+
{
|
749
|
+
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
750
|
+
dst.color.r = (*pdst >> 16) & 0xff;
|
751
|
+
dst.color.g = (*pdst >> 8) & 0xff;
|
752
|
+
dst.color.b = (*pdst ) & 0xff;
|
753
|
+
dst.color.a = (*pdst >> 24) & 0xff | dst.a255;
|
754
|
+
if(dst.color.a == 0){ pdst++; continue; }
|
755
|
+
MIYAKO_RGB2HSV(dst.color, ph, ps, pv);
|
756
|
+
ph += deg;
|
757
|
+
if(ph < 0.0){ ph += d_pi; }
|
758
|
+
if(ph >= d_pi){ ph -= d_pi; }
|
759
|
+
ps += sat;
|
760
|
+
if(ps < 0.0){ ps = 0.0; }
|
761
|
+
if(ps > 1.0){ ps = 1.0; }
|
762
|
+
pv += val;
|
763
|
+
if(pv < 0.0){ pv = 0.0; }
|
764
|
+
if(pv > 1.0){ pv = 1.0; }
|
765
|
+
MIYAKO_HSV2RGB(ph, ps, pv, dst.color);
|
766
|
+
*pdst = (dst.color.r) << 16 |
|
767
|
+
(dst.color.g) << 8 |
|
768
|
+
(dst.color.b) |
|
769
|
+
(dst.color.a) << 24;
|
770
|
+
#else
|
771
|
+
dst.color.r = (*pdst & dst.fmt->Rmask) >> dst.fmt->Rshift);
|
772
|
+
dst.color.g = (*pdst & dst.fmt->Gmask) >> dst.fmt->Gshift);
|
773
|
+
dst.color.b = (*pdst & dst.fmt->Bmask) >> dst.fmt->Bshift);
|
774
|
+
dst.color.a = (*pdst & dst.fmt->Amask) | dst.a255;
|
775
|
+
if(dst.color.a == 0){ pdst++; continue; }
|
776
|
+
MIYAKO_RGB2HSV(dst.color, ph, ps, pv);
|
777
|
+
ph += deg;
|
778
|
+
if(ph < 0.0){ ph += d_pi; }
|
779
|
+
if(ph >= d_pi){ ph -= d_pi; }
|
780
|
+
ps += sat;
|
781
|
+
if(ps < 0.0){ ps = 0.0; }
|
782
|
+
if(ps > 1.0){ ps = 1.0; }
|
783
|
+
pv += val;
|
784
|
+
if(pv < 0.0){ pv = 0.0; }
|
785
|
+
if(pv > 1.0){ pv = 1.0; }
|
786
|
+
MIYAKO_HSV2RGB(ph, ps, pv, dst.color);
|
787
|
+
*pdst = dst.color.r << dst.fmt->Rshift |
|
788
|
+
dst.color.g << dst.fmt->Gshift |
|
789
|
+
dst.color.b << dst.fmt->Bshift |
|
790
|
+
dst.color.a;
|
791
|
+
#endif
|
792
|
+
pdst++;
|
793
|
+
}
|
794
|
+
}
|
795
|
+
|
796
|
+
SDL_UnlockSurface(dst.surface);
|
797
|
+
|
798
|
+
return vdst;
|
799
|
+
}
|
800
|
+
|
801
|
+
void Init_miyako_hsv()
|
802
|
+
{
|
803
|
+
mSDL = rb_define_module("SDL");
|
804
|
+
mMiyako = rb_define_module("Miyako");
|
805
|
+
mScreen = rb_define_module_under(mMiyako, "Screen");
|
806
|
+
cSurface = rb_define_class_under(mSDL, "Surface", rb_cObject);
|
807
|
+
cBitmap = rb_define_class_under(mMiyako, "Bitmap", rb_cObject);
|
808
|
+
|
809
|
+
id_update = rb_intern("update");
|
810
|
+
id_kakko = rb_intern("[]");
|
811
|
+
id_render = rb_intern("render");
|
812
|
+
id_to_a = rb_intern("to_a");
|
813
|
+
|
814
|
+
zero = 0;
|
815
|
+
nZero = INT2NUM(zero);
|
816
|
+
one = 1;
|
817
|
+
nOne = INT2NUM(one);
|
818
|
+
|
819
|
+
rb_define_singleton_method(cBitmap, "hue", bitmap_miyako_hue, 3);
|
820
|
+
rb_define_singleton_method(cBitmap, "saturation", bitmap_miyako_saturation, 3);
|
821
|
+
rb_define_singleton_method(cBitmap, "value", bitmap_miyako_value, 3);
|
822
|
+
rb_define_singleton_method(cBitmap, "hsv", bitmap_miyako_hsv, 5);
|
823
|
+
rb_define_singleton_method(cBitmap, "hue!", bitmap_miyako_hue_self, 2);
|
824
|
+
rb_define_singleton_method(cBitmap, "saturation!", bitmap_miyako_saturation_self, 2);
|
825
|
+
rb_define_singleton_method(cBitmap, "value!", bitmap_miyako_value_self, 2);
|
826
|
+
rb_define_singleton_method(cBitmap, "hsv!", bitmap_miyako_hsv_self, 4);
|
827
|
+
|
828
|
+
int i;
|
829
|
+
for(i=0; i<256; i++){ div255[i] = (double)i / 255.0; }
|
830
|
+
}
|