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.331 by root, Mon Nov 19 00:10:34 2018 UTC vs.
Revision 1.335 by root, Mon Nov 19 01:56:11 2018 UTC

77# include <netinet/tcp.h> 77# include <netinet/tcp.h>
78# include <inttypes.h> 78# include <inttypes.h>
79#endif 79#endif
80 80
81#include "ecb.h" 81#include "ecb.h"
82#include "salloc.h"
82 83
83#define OBJ_STR "\xef\xbf\xbc" /* U+FFFC, object replacement character */ 84#define OBJ_STR "\xef\xbf\xbc" /* U+FFFC, object replacement character */
84 85
85/* this is used as fow flag as well, so has to have a different value */ 86/* this is used as fow flag as well, so has to have a different value */
86/* then anything that is computed by incoming darkness */ 87/* then anything that is computed by incoming darkness */
97 98
98#define KMOD_LRAM 0x10000 // our extension 99#define KMOD_LRAM 0x10000 // our extension
99 100
100#define TEXID_SPEECH 1 101#define TEXID_SPEECH 1
101#define TEXID_NOFACE 2 102#define TEXID_NOFACE 2
103
104// approximately divide by 255
105static unsigned int
106div255 (unsigned int n)
107{
108 return (n + (n >> 8)) >> 8;
109}
110
111static unsigned int
112minpot (unsigned int n)
113{
114 if (!n)
115 return 0;
116
117 --n;
118
119 n |= n >> 1;
120 n |= n >> 2;
121 n |= n >> 4;
122 n |= n >> 8;
123 n |= n >> 16;
124
125 return n + 1;
126}
102 127
103static char * 128static char *
104fast_sv_grow (SV *sv, STRLEN need) 129fast_sv_grow (SV *sv, STRLEN need)
105{ 130{
106 STRLEN len = SvLEN (sv); 131 STRLEN len = SvLEN (sv);
292}; 317};
293 318
294typedef mapgrid *DC__Map; 319typedef mapgrid *DC__Map;
295 320
296template<typename T> 321template<typename T>
297static void 322ecb_cold static void
298prepend (T *&ptr, int sze, int inc) 323prepend (T *&ptr, int sze, int inc)
299{ 324{
300 T *p; 325 T *p;
301 326
302 Newx (p, inc + sze, T); 327 Newx (p, inc + sze, T);
306 331
307 ptr = p; 332 ptr = p;
308} 333}
309 334
310template<typename T> 335template<typename T>
311static void 336ecb_cold static void
312append (T *&ptr, int sze, int inc) 337append (T *&ptr, int sze, int inc)
313{ 338{
314 Renew (ptr, sze + inc, T); 339 Renew (ptr, sze + inc, T);
315 Zero (ptr + sze, inc, T); 340 Zero (ptr + sze, inc, T);
316} 341}
317 342
318static void 343static void
319need_facenum (struct mapgrid *self, faceid face) 344need_facenum (struct mapgrid *self, faceid face)
320{ 345{
321 while (self->faces <= face) 346 if (ecb_expect_true (self->faces > face))
322 { 347 return;
348
349 size_t newsize = minpot (face + 1);
323 append (self->face2tile, self->faces, self->faces); 350 append (self->face2tile, self->faces, newsize - self->faces);
324 self->faces *= 2; 351 self->faces = newsize;
325 }
326} 352}
327 353
328static void 354static void
329need_texid (struct mapgrid *self, int texid) 355need_texid (struct mapgrid *self, int texid)
330{ 356{
331 while (self->texs <= texid) 357 if (ecb_expect_true (self->texs > texid))
332 { 358 return;
359
360 size_t newsize = minpot (texid + 1);
333 append (self->tex, self->texs, self->texs); 361 append (self->tex, self->texs, newsize - self->texs);
334 self->texs *= 2; 362 self->texs = newsize;
335 }
336} 363}
337 364
338static maprow * 365static maprow *
339map_get_row (mapgrid *self, int y) 366map_get_row (mapgrid *self, int y)
340{ 367{
454 { 481 {
455 return tile == o.tile && x == o.x && y == o.y && level == o.level; 482 return tile == o.tile && x == o.x && y == o.y && level == o.level;
456 } 483 }
457}; 484};
458 485
459typedef ska::flat_hash_map<smooth_key, IV> smooth_hash; 486typedef ska::flat_hash_map<smooth_key, IV, std::hash<smooth_key>, std::equal_to<smooth_key>, slice_allocator<smooth_key>> smooth_hash;
460 487
461namespace std { 488namespace std {
462 template <> 489 template <>
463 struct hash<smooth_key> 490 struct hash<smooth_key>
464 { 491 {
502 ev.code = 1; 529 ev.code = 1;
503 ev.data1 = (void *)(long)channel; 530 ev.data1 = (void *)(long)channel;
504 ev.data2 = 0; 531 ev.data2 = 0;
505 532
506 SDL_PushEvent ((SDL_Event *)&ev); 533 SDL_PushEvent ((SDL_Event *)&ev);
507}
508
509// approximately divide by 255
510static unsigned int
511div255 (unsigned int n)
512{
513 return (n + (n >> 8)) >> 8;
514}
515
516static unsigned int
517minpot (unsigned int n)
518{
519 if (!n)
520 return 0;
521
522 --n;
523
524 n |= n >> 1;
525 n |= n >> 2;
526 n |= n >> 4;
527 n |= n >> 8;
528 n |= n >> 16;
529
530 return n + 1;
531} 534}
532 535
533/* SDL should provide this, really. */ 536/* SDL should provide this, really. */
534#define SDLK_MODIFIER_MIN 300 537#define SDLK_MODIFIER_MIN 300
535#define SDLK_MODIFIER_MAX 314 538#define SDLK_MODIFIER_MAX 314
865NV floor (NV x) 868NV floor (NV x)
866 869
867NV ceil (NV x) 870NV ceil (NV x)
868 871
869IV minpot (UV n) 872IV minpot (UV n)
873
874UV ld32 (UV n)
875 CODE:
876 RETVAL = ecb_ld32 (n);
877 OUTPUT:
878 RETVAL
870 879
871IV popcount (UV n) 880IV popcount (UV n)
872 CODE: 881 CODE:
873 RETVAL = ecb_popcount32 (n); 882 RETVAL = ecb_popcount32 (n);
874 OUTPUT: 883 OUTPUT:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines