ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/Client.xs
(Generate patch)

Comparing deliantra/Deliantra-Client/Client.xs (file contents):
Revision 1.304 by root, Fri Apr 23 16:30:38 2010 UTC vs.
Revision 1.306 by root, Thu Oct 14 00:02:39 2010 UTC

99 99
100#define KMOD_LRAM 0x10000 // our extension 100#define KMOD_LRAM 0x10000 // our extension
101 101
102#define TEXID_SPEECH 1 102#define TEXID_SPEECH 1
103#define TEXID_NOFACE 2 103#define TEXID_NOFACE 2
104
105static char *
106fast_sv_grow (SV *sv, STRLEN need)
107{
108 STRLEN len = SvLEN (sv);
109 STRLEN want = SvCUR (sv) + need;
110
111 if (expect_false (len < want))
112 {
113 do
114 len *= 2;
115 while (len < want);
116
117 sv_grow (sv, len);
118 }
119
120 SvCUR_set (sv, want);
121 return SvEND (sv) - need;
122}
104 123
105static AV *texture_av; 124static AV *texture_av;
106 125
107static struct 126static struct
108{ 127{
460 ev.code = 1; 479 ev.code = 1;
461 ev.data1 = (void *)(long)channel; 480 ev.data1 = (void *)(long)channel;
462 ev.data2 = 0; 481 ev.data2 = 0;
463 482
464 SDL_PushEvent ((SDL_Event *)&ev); 483 SDL_PushEvent ((SDL_Event *)&ev);
484}
485
486static unsigned int
487div255 (unsigned int n)
488{
489 return (n + (n >> 8)) >> 8;
465} 490}
466 491
467static unsigned int 492static unsigned int
468minpot (unsigned int n) 493minpot (unsigned int n)
469{ 494{
1113 RETVAL = FcConfigAppFontAddFile (0, (const FcChar8 *)file); 1138 RETVAL = FcConfigAppFontAddFile (0, (const FcChar8 *)file);
1114 OUTPUT: 1139 OUTPUT:
1115 RETVAL 1140 RETVAL
1116 1141
1117void 1142void
1143IMG_Init (int flags = IMG_INIT_JPG | IMG_INIT_PNG)
1144
1145void
1118load_image_inline (SV *image_) 1146load_image_inline (SV *image_)
1119 ALIAS: 1147 ALIAS:
1120 load_image_file = 1 1148 load_image_file = 1
1121 PPCODE: 1149 PPCODE:
1122{ 1150{
2112 ? self->row + y 2140 ? self->row + y
2113 : 0; 2141 : 0;
2114 2142
2115 for (x = x0; x < x1; x++) 2143 for (x = x0; x < x1; x++)
2116 { 2144 {
2117 int r = 32, g = 32, b = 32, a = 192; 2145 unsigned int r = 32, g = 32, b = 32, a = 192;
2118 2146
2119 if (row && row->c0 <= x && x < row->c1) 2147 if (row && row->c0 <= x && x < row->c1)
2120 { 2148 {
2121 mapcell *cell = row->col + (x - row->c0); 2149 mapcell *cell = row->col + (x - row->c0);
2122 2150
2124 { 2152 {
2125 maptex tex = self->tex [cell->tile [z]]; 2153 maptex tex = self->tex [cell->tile [z]];
2126 int a0 = 255 - tex.a; 2154 int a0 = 255 - tex.a;
2127 int a1 = tex.a; 2155 int a1 = tex.a;
2128 2156
2129 r = (r * a0 + tex.r * a1) / 255; 2157 r = div255 (r * a0 + tex.r * a1);
2130 g = (g * a0 + tex.g * a1) / 255; 2158 g = div255 (g * a0 + tex.g * a1);
2131 b = (b * a0 + tex.b * a1) / 255; 2159 b = div255 (b * a0 + tex.b * a1);
2132 a = (a * a0 + tex.a * a1) / 255; 2160 a = div255 (a * a0 + tex.a * a1);
2133 } 2161 }
2134 } 2162 }
2135 2163
2136 *map++ = (r ) 2164 *map++ = (r )
2137 | (g << 8) 2165 | (g << 8)
2144} 2172}
2145 OUTPUT: 2173 OUTPUT:
2146 RETVAL 2174 RETVAL
2147 2175
2148void 2176void
2149draw (DC::Map self, int mx, int my, int sw, int sh, int T, U32 player = 0xffffffff, int sdx = 0, int sdy = 0) 2177draw (DC::Map self, int mx, int my, int sw, int sh, int Tw, int Th, U32 player = 0xffffffff, int sdx = 0, int sdy = 0)
2150 CODE: 2178 CODE:
2151{ 2179{
2152 int x, y, z; 2180 int x, y, z;
2153 2181
2154 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 2182 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
2238 2266
2239 key.texname = tex.name; 2267 key.texname = tex.name;
2240 arr = rc_array (rc, &key); 2268 arr = rc_array (rc, &key);
2241 } 2269 }
2242 2270
2243 px = (x + 1) * T - tex.w; 2271 px = (x + 1) * Th - tex.w;
2244 py = (y + 1) * T - tex.h; 2272 py = (y + 1) * Tw - tex.h;
2245 2273
2246 if (expect_false (cell->player == player) && expect_false (z == 2)) 2274 if (expect_false (cell->player == player) && expect_false (z == 2))
2247 { 2275 {
2248 pl_x = px; 2276 pl_x = px;
2249 pl_y = py; 2277 pl_y = py;
2302 if (cell->flags & 1) 2330 if (cell->flags & 1)
2303 { 2331 {
2304 rc_key_t key_ov = key; 2332 rc_key_t key_ov = key;
2305 maptex tex = self->tex [TEXID_SPEECH]; 2333 maptex tex = self->tex [TEXID_SPEECH];
2306 rc_array_t *arr; 2334 rc_array_t *arr;
2307 int px = x * T + T * 2 / 32; 2335 int px = x * Tw + Tw * 2 / 32;
2308 int py = y * T - T * 6 / 32; 2336 int py = y * Th - Th * 6 / 32;
2309 2337
2310 key_ov.texname = tex.name; 2338 key_ov.texname = tex.name;
2311 arr = rc_array (rc_ov, &key_ov); 2339 arr = rc_array (rc_ov, &key_ov);
2312 2340
2313 rc_t2f_v3f (arr, 0 , 0 , px , py , 0); 2341 rc_t2f_v3f (arr, 0 , 0 , px , py , 0);
2314 rc_t2f_v3f (arr, 0 , tex.t, px , py + T, 0); 2342 rc_t2f_v3f (arr, 0 , tex.t, px , py + Th, 0);
2315 rc_t2f_v3f (arr, tex.s, tex.t, px + T, py + T, 0); 2343 rc_t2f_v3f (arr, tex.s, tex.t, px + Tw, py + Th, 0);
2316 rc_t2f_v3f (arr, tex.s, 0 , px + T, py , 0); 2344 rc_t2f_v3f (arr, tex.s, 0 , px + Tw, py , 0);
2317 } 2345 }
2318 } 2346 }
2319 } 2347 }
2320 } 2348 }
2321 2349
2348 if (!(bits & 0x1000) 2376 if (!(bits & 0x1000)
2349 && skey->level == level 2377 && skey->level == level
2350 && level > smooth_max [skey->x][skey->y]) 2378 && level > smooth_max [skey->x][skey->y])
2351 { 2379 {
2352 maptex tex = self->tex [skey->tile]; 2380 maptex tex = self->tex [skey->tile];
2353 int px = (((int)skey->x) - 1) * T; 2381 int px = (((int)skey->x) - 1) * Tw;
2354 int py = (((int)skey->y) - 1) * T; 2382 int py = (((int)skey->y) - 1) * Th;
2355 int border = bits & 15; 2383 int border = bits & 15;
2356 int corner = (bits >> 8) & ~(bits >> 4) & 15; 2384 int corner = (bits >> 8) & ~(bits >> 4) & 15;
2357 float dx = tex.s * .0625f; // 16 images/row 2385 float dx = tex.s * .0625f; // 16 images/row
2358 float dy = tex.t * .5f ; // 2 images/column 2386 float dy = tex.t * .5f ; // 2 images/column
2359 2387
2372 2400
2373 if (border) 2401 if (border)
2374 { 2402 {
2375 float ox = border * dx; 2403 float ox = border * dx;
2376 2404
2377 glTexCoord2f (ox , 0.f ); glVertex2i (px , py ); 2405 glTexCoord2f (ox , 0.f ); glVertex2i (px , py );
2378 glTexCoord2f (ox , dy ); glVertex2i (px , py + T); 2406 glTexCoord2f (ox , dy ); glVertex2i (px , py + Th);
2379 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py + T); 2407 glTexCoord2f (ox + dx, dy ); glVertex2i (px + Tw, py + Th);
2380 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + T, py ); 2408 glTexCoord2f (ox + dx, 0.f ); glVertex2i (px + Tw, py );
2381 } 2409 }
2382 2410
2383 if (corner) 2411 if (corner)
2384 { 2412 {
2385 float ox = corner * dx; 2413 float ox = corner * dx;
2386 2414
2387 glTexCoord2f (ox , dy ); glVertex2i (px , py ); 2415 glTexCoord2f (ox , dy ); glVertex2i (px , py );
2388 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + T); 2416 glTexCoord2f (ox , dy * 2.f); glVertex2i (px , py + Th);
2389 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + T, py + T); 2417 glTexCoord2f (ox + dx, dy * 2.f); glVertex2i (px + Tw, py + Th);
2390 glTexCoord2f (ox + dx, dy ); glVertex2i (px + T, py ); 2418 glTexCoord2f (ox + dx, dy ); glVertex2i (px + Tw, py );
2391 } 2419 }
2392 } 2420 }
2393 } 2421 }
2394 } 2422 }
2395 } 2423 }
2436 for (x = 0; x < sw; x++) 2464 for (x = 0; x < sw; x++)
2437 if (row->c0 <= x + mx && x + mx < row->c1) 2465 if (row->c0 <= x + mx && x + mx < row->c1)
2438 { 2466 {
2439 mapcell *cell = row->col + (x + mx - row->c0); 2467 mapcell *cell = row->col + (x + mx - row->c0);
2440 2468
2441 int px = x * T; 2469 int px = x * Tw;
2442 int py = y * T; 2470 int py = y * Th;
2443 2471
2444 if (expect_false (cell->player == player)) 2472 if (expect_false (cell->player == player))
2445 { 2473 {
2446 px += sdx; 2474 px += sdx;
2447 py += sdy; 2475 py += sdy;
2448 } 2476 }
2449 2477
2450 if (cell->stat_hp) 2478 if (cell->stat_hp)
2451 { 2479 {
2452 int width = cell->stat_width * T; 2480 int width = cell->stat_width * Tw;
2453 int thick = (sh * T / 32 + 27) / 28 + 1 + cell->stat_width; 2481 int thick = (sh * Th / 32 + 27) / 28 + 1 + cell->stat_width;
2454 2482
2455 glColor3ub (0, 0, 0); 2483 glColor3ub (0, 0, 0);
2456 glRectf (px + 1, py - thick - 2, 2484 glRectf (px + 1, py - thick - 2,
2457 px + width - 1, py); 2485 px + width - 1, py);
2458 2486

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines