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.240 by root, Wed Dec 26 18:09:30 2007 UTC vs.
Revision 1.241 by root, Wed Dec 26 20:46:39 2007 UTC

120 120
121#include "pango-font.c" 121#include "pango-font.c"
122#include "pango-fontmap.c" 122#include "pango-fontmap.c"
123#include "pango-render.c" 123#include "pango-render.c"
124 124
125typedef IV CFPlus__Channel; 125typedef IV dc__Channel;
126typedef SDL_RWops *CFPlus__RW; 126typedef SDL_RWops *dc__RW;
127typedef Mix_Chunk *CFPlus__MixChunk; 127typedef Mix_Chunk *dc__MixChunk;
128typedef Mix_Music *CFPlus__MixMusic; 128typedef Mix_Music *dc__MixMusic;
129 129
130typedef PangoFontDescription *CFPlus__Font; 130typedef PangoFontDescription *dc__Font;
131 131
132static int 132static int
133shape_attr_p (PangoLayoutRun *run) 133shape_attr_p (PangoLayoutRun *run)
134{ 134{
135 GSList *attrs = run->item->analysis.extra_attrs; 135 GSList *attrs = run->item->analysis.extra_attrs;
149 149
150typedef struct cf_layout { 150typedef struct cf_layout {
151 PangoLayout *pl; 151 PangoLayout *pl;
152 float r, g, b, a; // default color for rgba mode 152 float r, g, b, a; // default color for rgba mode
153 int base_height; 153 int base_height;
154 CFPlus__Font font; 154 dc__Font font;
155 rc_t *rc; 155 rc_t *rc;
156} *CFPlus__Layout; 156} *dc__Layout;
157 157
158static CFPlus__Font default_font; 158static dc__Font default_font;
159static PangoContext *opengl_context; 159static PangoContext *opengl_context;
160static PangoFontMap *opengl_fontmap; 160static PangoFontMap *opengl_fontmap;
161 161
162static void 162static void
163substitute_func (FcPattern *pattern, gpointer data) 163substitute_func (FcPattern *pattern, gpointer data)
168#endif 168#endif
169 FcPatternAddBool (pattern, FC_AUTOHINT, 0); 169 FcPatternAddBool (pattern, FC_AUTOHINT, 0);
170} 170}
171 171
172static void 172static void
173layout_update_font (CFPlus__Layout self) 173layout_update_font (dc__Layout self)
174{ 174{
175 /* use a random scale factor to account for unknown descenders, 0.8 works 175 /* use a random scale factor to account for unknown descenders, 0.8 works
176 * reasonably well with bitstream vera 176 * reasonably well with bitstream vera
177 */ 177 */
178 PangoFontDescription *font = self->font ? self->font : default_font; 178 PangoFontDescription *font = self->font ? self->font : default_font;
182 182
183 pango_layout_set_font_description (self->pl, font); 183 pango_layout_set_font_description (self->pl, font);
184} 184}
185 185
186static void 186static void
187layout_get_pixel_size (CFPlus__Layout self, int *w, int *h) 187layout_get_pixel_size (dc__Layout self, int *w, int *h)
188{ 188{
189 PangoRectangle rect; 189 PangoRectangle rect;
190 190
191 // get_pixel_* wrongly rounds down 191 // get_pixel_* wrongly rounds down
192 pango_layout_get_extents (self->pl, 0, &rect); 192 pango_layout_get_extents (self->pl, 0, &rect);
231 int faces; tileid *face2tile; // [faceid] 231 int faces; tileid *face2tile; // [faceid]
232 int texs; maptex *tex; // [tileid] 232 int texs; maptex *tex; // [tileid]
233 233
234 int32_t rows; 234 int32_t rows;
235 maprow *row; 235 maprow *row;
236} *CFPlus__Map; 236} *dc__Map;
237 237
238static char * 238static char *
239prepend (char *ptr, int sze, int inc) 239prepend (char *ptr, int sze, int inc)
240{ 240{
241 char *p; 241 char *p;
279 self->texs *= 2; 279 self->texs *= 2;
280 } 280 }
281} 281}
282 282
283static maprow * 283static maprow *
284map_get_row (CFPlus__Map self, int y) 284map_get_row (dc__Map self, int y)
285{ 285{
286 if (0 > y) 286 if (0 > y)
287 { 287 {
288 int extend = - y + MAP_EXTEND_Y; 288 int extend = - y + MAP_EXTEND_Y;
289 Prepend (maprow, self->row, self->rows, extend); 289 Prepend (maprow, self->row, self->rows, extend);
327 327
328 return row->col + (x - row->c0); 328 return row->col + (x - row->c0);
329} 329}
330 330
331static mapcell * 331static mapcell *
332map_get_cell (CFPlus__Map self, int x, int y) 332map_get_cell (dc__Map self, int x, int y)
333{ 333{
334 return row_get_cell (map_get_row (self, y), x); 334 return row_get_cell (map_get_row (self, y), x);
335} 335}
336 336
337static void 337static void
338map_clear (CFPlus__Map self) 338map_clear (dc__Map self)
339{ 339{
340 int r; 340 int r;
341 341
342 for (r = 0; r < self->rows; r++) 342 for (r = 0; r < self->rows; r++)
343 Safefree (self->row[r].col); 343 Safefree (self->row[r].col);
351 self->row = 0; 351 self->row = 0;
352 self->rows = 0; 352 self->rows = 0;
353} 353}
354 354
355static void 355static void
356map_blank (CFPlus__Map self, int x0, int y0, int w, int h) 356map_blank (dc__Map self, int x0, int y0, int w, int h)
357{ 357{
358 int x, y; 358 int x, y;
359 maprow *row; 359 maprow *row;
360 mapcell *cell; 360 mapcell *cell;
361 361
498 return 0; 498 return 0;
499 499
500 return 1; 500 return 1;
501} 501}
502 502
503MODULE = CFPlus PACKAGE = CFPlus 503MODULE = Deliantra::Client PACKAGE = dc
504 504
505PROTOTYPES: ENABLE 505PROTOTYPES: ENABLE
506 506
507BOOT: 507BOOT:
508{ 508{
509 HV *stash = gv_stashpv ("CFPlus", 1); 509 HV *stash = gv_stashpv ("dc", 1);
510 static const struct { 510 static const struct {
511 const char *name; 511 const char *name;
512 IV iv; 512 IV iv;
513 } *civ, const_iv[] = { 513 } *civ, const_iv[] = {
514# define const_iv(name) { # name, (IV)name } 514# define const_iv(name) { # name, (IV)name }
825 hv_store (hv, "data1", 5, newSViv ((IV)ev.user.data1), 0); 825 hv_store (hv, "data1", 5, newSViv ((IV)ev.user.data1), 0);
826 hv_store (hv, "data2", 5, newSViv ((IV)ev.user.data2), 0); 826 hv_store (hv, "data2", 5, newSViv ((IV)ev.user.data2), 0);
827 break; 827 break;
828 } 828 }
829 829
830 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("CFPlus::UI::Event", 1)))); 830 XPUSHs (sv_2mortal (sv_bless (newRV_noinc ((SV *)hv), gv_stashpv ("dc::UI::Event", 1))));
831 } 831 }
832} 832}
833 833
834int 834int
835Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 4096) 835Mix_OpenAudio (int frequency = 44100, int format = MIX_DEFAULT_FORMAT, int channels = 2, int chunksize = 4096)
1023#if DEBUG 1023#if DEBUG
1024 VALGRIND_DO_LEAK_CHECK; 1024 VALGRIND_DO_LEAK_CHECK;
1025#endif 1025#endif
1026} 1026}
1027 1027
1028MODULE = CFPlus PACKAGE = CFPlus::Font 1028MODULE = Deliantra::Client PACKAGE = dc::Font
1029 1029
1030PROTOTYPES: DISABLE 1030PROTOTYPES: DISABLE
1031 1031
1032CFPlus::Font 1032dc::Font
1033new_from_file (SV *class, char *path, int id = 0) 1033new_from_file (SV *class, char *path, int id = 0)
1034 CODE: 1034 CODE:
1035{ 1035{
1036 int count; 1036 int count;
1037 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)path, id, 0, &count); 1037 FcPattern *pattern = FcFreeTypeQuery ((const FcChar8 *)path, id, 0, &count);
1040} 1040}
1041 OUTPUT: 1041 OUTPUT:
1042 RETVAL 1042 RETVAL
1043 1043
1044void 1044void
1045DESTROY (CFPlus::Font self) 1045DESTROY (dc::Font self)
1046 CODE: 1046 CODE:
1047 pango_font_description_free (self); 1047 pango_font_description_free (self);
1048 1048
1049void 1049void
1050make_default (CFPlus::Font self) 1050make_default (dc::Font self)
1051 PROTOTYPE: $ 1051 PROTOTYPE: $
1052 CODE: 1052 CODE:
1053 default_font = self; 1053 default_font = self;
1054 1054
1055MODULE = CFPlus PACKAGE = CFPlus::Layout 1055MODULE = Deliantra::Client PACKAGE = dc::Layout
1056 1056
1057PROTOTYPES: DISABLE 1057PROTOTYPES: DISABLE
1058 1058
1059void 1059void
1060glyph_cache_backup () 1060glyph_cache_backup ()
1066glyph_cache_restore () 1066glyph_cache_restore ()
1067 PROTOTYPE: 1067 PROTOTYPE:
1068 CODE: 1068 CODE:
1069 tc_restore (); 1069 tc_restore ();
1070 1070
1071CFPlus::Layout 1071dc::Layout
1072new (SV *class) 1072new (SV *class)
1073 CODE: 1073 CODE:
1074 New (0, RETVAL, 1, struct cf_layout); 1074 New (0, RETVAL, 1, struct cf_layout);
1075 1075
1076 RETVAL->pl = pango_layout_new (opengl_context); 1076 RETVAL->pl = pango_layout_new (opengl_context);
1086 layout_update_font (RETVAL); 1086 layout_update_font (RETVAL);
1087 OUTPUT: 1087 OUTPUT:
1088 RETVAL 1088 RETVAL
1089 1089
1090void 1090void
1091DESTROY (CFPlus::Layout self) 1091DESTROY (dc::Layout self)
1092 CODE: 1092 CODE:
1093 g_object_unref (self->pl); 1093 g_object_unref (self->pl);
1094 rc_free (self->rc); 1094 rc_free (self->rc);
1095 Safefree (self); 1095 Safefree (self);
1096 1096
1097void 1097void
1098set_text (CFPlus::Layout self, SV *text_) 1098set_text (dc::Layout self, SV *text_)
1099 CODE: 1099 CODE:
1100{ 1100{
1101 STRLEN textlen; 1101 STRLEN textlen;
1102 char *text = SvPVutf8 (text_, textlen); 1102 char *text = SvPVutf8 (text_, textlen);
1103 1103
1104 pango_layout_set_text (self->pl, text, textlen); 1104 pango_layout_set_text (self->pl, text, textlen);
1105} 1105}
1106 1106
1107void 1107void
1108set_markup (CFPlus::Layout self, SV *text_) 1108set_markup (dc::Layout self, SV *text_)
1109 CODE: 1109 CODE:
1110{ 1110{
1111 STRLEN textlen; 1111 STRLEN textlen;
1112 char *text = SvPVutf8 (text_, textlen); 1112 char *text = SvPVutf8 (text_, textlen);
1113 1113
1114 pango_layout_set_markup (self->pl, text, textlen); 1114 pango_layout_set_markup (self->pl, text, textlen);
1115} 1115}
1116 1116
1117void 1117void
1118set_shapes (CFPlus::Layout self, ...) 1118set_shapes (dc::Layout self, ...)
1119 CODE: 1119 CODE:
1120{ 1120{
1121 PangoAttrList *attrs = 0; 1121 PangoAttrList *attrs = 0;
1122 const char *text = pango_layout_get_text (self->pl); 1122 const char *text = pango_layout_get_text (self->pl);
1123 const char *pos = text; 1123 const char *pos = text;
1158 if (attrs) 1158 if (attrs)
1159 pango_layout_set_attributes (self->pl, attrs); 1159 pango_layout_set_attributes (self->pl, attrs);
1160} 1160}
1161 1161
1162void 1162void
1163get_shapes (CFPlus::Layout self) 1163get_shapes (dc::Layout self)
1164 PPCODE: 1164 PPCODE:
1165{ 1165{
1166 PangoLayoutIter *iter = pango_layout_get_iter (self->pl); 1166 PangoLayoutIter *iter = pango_layout_get_iter (self->pl);
1167 1167
1168 do 1168 do
1183 1183
1184 pango_layout_iter_free (iter); 1184 pango_layout_iter_free (iter);
1185} 1185}
1186 1186
1187int 1187int
1188has_wrapped (CFPlus::Layout self) 1188has_wrapped (dc::Layout self)
1189 CODE: 1189 CODE:
1190{ 1190{
1191 int lines = 1; 1191 int lines = 1;
1192 const char *text = pango_layout_get_text (self->pl); 1192 const char *text = pango_layout_get_text (self->pl);
1193 1193
1198} 1198}
1199 OUTPUT: 1199 OUTPUT:
1200 RETVAL 1200 RETVAL
1201 1201
1202SV * 1202SV *
1203get_text (CFPlus::Layout self) 1203get_text (dc::Layout self)
1204 CODE: 1204 CODE:
1205 RETVAL = newSVpv (pango_layout_get_text (self->pl), 0); 1205 RETVAL = newSVpv (pango_layout_get_text (self->pl), 0);
1206 sv_utf8_decode (RETVAL); 1206 sv_utf8_decode (RETVAL);
1207 OUTPUT: 1207 OUTPUT:
1208 RETVAL 1208 RETVAL
1209 1209
1210void 1210void
1211set_foreground (CFPlus::Layout self, float r, float g, float b, float a = 1.) 1211set_foreground (dc::Layout self, float r, float g, float b, float a = 1.)
1212 CODE: 1212 CODE:
1213 self->r = r; 1213 self->r = r;
1214 self->g = g; 1214 self->g = g;
1215 self->b = b; 1215 self->b = b;
1216 self->a = a; 1216 self->a = a;
1217 1217
1218void 1218void
1219set_font (CFPlus::Layout self, CFPlus::Font font = 0) 1219set_font (dc::Layout self, dc::Font font = 0)
1220 CODE: 1220 CODE:
1221 if (self->font != font) 1221 if (self->font != font)
1222 { 1222 {
1223 self->font = font; 1223 self->font = font;
1224 layout_update_font (self); 1224 layout_update_font (self);
1225 } 1225 }
1226 1226
1227void 1227void
1228set_height (CFPlus::Layout self, int base_height) 1228set_height (dc::Layout self, int base_height)
1229 CODE: 1229 CODE:
1230 if (self->base_height != base_height) 1230 if (self->base_height != base_height)
1231 { 1231 {
1232 self->base_height = base_height; 1232 self->base_height = base_height;
1233 layout_update_font (self); 1233 layout_update_font (self);
1234 } 1234 }
1235 1235
1236void 1236void
1237set_width (CFPlus::Layout self, int max_width = -1) 1237set_width (dc::Layout self, int max_width = -1)
1238 CODE: 1238 CODE:
1239 pango_layout_set_width (self->pl, max_width < 0 ? max_width : max_width * PANGO_SCALE); 1239 pango_layout_set_width (self->pl, max_width < 0 ? max_width : max_width * PANGO_SCALE);
1240 1240
1241void 1241void
1242set_indent (CFPlus::Layout self, int indent) 1242set_indent (dc::Layout self, int indent)
1243 CODE: 1243 CODE:
1244 pango_layout_set_indent (self->pl, indent * PANGO_SCALE); 1244 pango_layout_set_indent (self->pl, indent * PANGO_SCALE);
1245 1245
1246void 1246void
1247set_spacing (CFPlus::Layout self, int spacing) 1247set_spacing (dc::Layout self, int spacing)
1248 CODE: 1248 CODE:
1249 pango_layout_set_spacing (self->pl, spacing * PANGO_SCALE); 1249 pango_layout_set_spacing (self->pl, spacing * PANGO_SCALE);
1250 1250
1251void 1251void
1252set_ellipsise (CFPlus::Layout self, int ellipsise) 1252set_ellipsise (dc::Layout self, int ellipsise)
1253 CODE: 1253 CODE:
1254 pango_layout_set_ellipsize (self->pl, 1254 pango_layout_set_ellipsize (self->pl,
1255 ellipsise == 1 ? PANGO_ELLIPSIZE_START 1255 ellipsise == 1 ? PANGO_ELLIPSIZE_START
1256 : ellipsise == 2 ? PANGO_ELLIPSIZE_MIDDLE 1256 : ellipsise == 2 ? PANGO_ELLIPSIZE_MIDDLE
1257 : ellipsise == 3 ? PANGO_ELLIPSIZE_END 1257 : ellipsise == 3 ? PANGO_ELLIPSIZE_END
1258 : PANGO_ELLIPSIZE_NONE 1258 : PANGO_ELLIPSIZE_NONE
1259 ); 1259 );
1260 1260
1261void 1261void
1262set_single_paragraph_mode (CFPlus::Layout self, int spm) 1262set_single_paragraph_mode (dc::Layout self, int spm)
1263 CODE: 1263 CODE:
1264 pango_layout_set_single_paragraph_mode (self->pl, !!spm); 1264 pango_layout_set_single_paragraph_mode (self->pl, !!spm);
1265 1265
1266void 1266void
1267size (CFPlus::Layout self) 1267size (dc::Layout self)
1268 PPCODE: 1268 PPCODE:
1269{ 1269{
1270 int w, h; 1270 int w, h;
1271 1271
1272 layout_get_pixel_size (self, &w, &h); 1272 layout_get_pixel_size (self, &w, &h);
1275 PUSHs (sv_2mortal (newSViv (w))); 1275 PUSHs (sv_2mortal (newSViv (w)));
1276 PUSHs (sv_2mortal (newSViv (h))); 1276 PUSHs (sv_2mortal (newSViv (h)));
1277} 1277}
1278 1278
1279int 1279int
1280descent (CFPlus::Layout self) 1280descent (dc::Layout self)
1281 CODE: 1281 CODE:
1282{ 1282{
1283 PangoRectangle rect; 1283 PangoRectangle rect;
1284 PangoLayoutLine *line = pango_layout_get_line (self->pl, 0); 1284 PangoLayoutLine *line = pango_layout_get_line (self->pl, 0);
1285 pango_layout_line_get_pixel_extents (line, 0, &rect); 1285 pango_layout_line_get_pixel_extents (line, 0, &rect);
1287} 1287}
1288 OUTPUT: 1288 OUTPUT:
1289 RETVAL 1289 RETVAL
1290 1290
1291int 1291int
1292xy_to_index (CFPlus::Layout self, int x, int y) 1292xy_to_index (dc::Layout self, int x, int y)
1293 CODE: 1293 CODE:
1294{ 1294{
1295 int index, trailing; 1295 int index, trailing;
1296 pango_layout_xy_to_index (self->pl, x * PANGO_SCALE, y * PANGO_SCALE, &index, &trailing); 1296 pango_layout_xy_to_index (self->pl, x * PANGO_SCALE, y * PANGO_SCALE, &index, &trailing);
1297 RETVAL = index + trailing; 1297 RETVAL = index + trailing;
1298} 1298}
1299 OUTPUT: 1299 OUTPUT:
1300 RETVAL 1300 RETVAL
1301 1301
1302void 1302void
1303cursor_pos (CFPlus::Layout self, int index) 1303cursor_pos (dc::Layout self, int index)
1304 PPCODE: 1304 PPCODE:
1305{ 1305{
1306 PangoRectangle strong_pos; 1306 PangoRectangle strong_pos;
1307 pango_layout_get_cursor_pos (self->pl, index, &strong_pos, 0); 1307 pango_layout_get_cursor_pos (self->pl, index, &strong_pos, 0);
1308 1308
1311 PUSHs (sv_2mortal (newSViv (strong_pos.y / PANGO_SCALE))); 1311 PUSHs (sv_2mortal (newSViv (strong_pos.y / PANGO_SCALE)));
1312 PUSHs (sv_2mortal (newSViv (strong_pos.height / PANGO_SCALE))); 1312 PUSHs (sv_2mortal (newSViv (strong_pos.height / PANGO_SCALE)));
1313} 1313}
1314 1314
1315void 1315void
1316index_to_line_x (CFPlus::Layout self, int index, int trailing = 0) 1316index_to_line_x (dc::Layout self, int index, int trailing = 0)
1317 PPCODE: 1317 PPCODE:
1318{ 1318{
1319 int line, x; 1319 int line, x;
1320 1320
1321 pango_layout_index_to_line_x (self->pl, index, trailing, &line, &x); 1321 pango_layout_index_to_line_x (self->pl, index, trailing, &line, &x);
1325 PUSHs (sv_2mortal (newSViv (line - 1))); 1325 PUSHs (sv_2mortal (newSViv (line - 1)));
1326 PUSHs (sv_2mortal (newSViv (x / PANGO_SCALE))); 1326 PUSHs (sv_2mortal (newSViv (x / PANGO_SCALE)));
1327} 1327}
1328 1328
1329void 1329void
1330line_x_to_index (CFPlus::Layout self, int line, int x) 1330line_x_to_index (dc::Layout self, int line, int x)
1331 PPCODE: 1331 PPCODE:
1332{ 1332{
1333 PangoLayoutLine *lp; 1333 PangoLayoutLine *lp;
1334 int index, trailing; 1334 int index, trailing;
1335 1335
1350 PUSHs (sv_2mortal (newSViv (trailing))); 1350 PUSHs (sv_2mortal (newSViv (trailing)));
1351 } 1351 }
1352} 1352}
1353 1353
1354void 1354void
1355render (CFPlus::Layout self, float x, float y, int flags = 0) 1355render (dc::Layout self, float x, float y, int flags = 0)
1356 CODE: 1356 CODE:
1357 rc_clear (self->rc); 1357 rc_clear (self->rc);
1358 pango_opengl_render_layout_subpixel ( 1358 pango_opengl_render_layout_subpixel (
1359 self->pl, 1359 self->pl,
1360 self->rc, 1360 self->rc,
1365 // we assume that context_change actually clears/frees stuff 1365 // we assume that context_change actually clears/frees stuff
1366 // and does not do any recomputation... 1366 // and does not do any recomputation...
1367 pango_layout_context_changed (self->pl); 1367 pango_layout_context_changed (self->pl);
1368 1368
1369void 1369void
1370draw (CFPlus::Layout self) 1370draw (dc::Layout self)
1371 CODE: 1371 CODE:
1372{ 1372{
1373 glEnable (GL_TEXTURE_2D); 1373 glEnable (GL_TEXTURE_2D);
1374 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 1374 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
1375 glEnable (GL_BLEND); 1375 glEnable (GL_BLEND);
1383 glDisable (GL_ALPHA_TEST); 1383 glDisable (GL_ALPHA_TEST);
1384 glDisable (GL_BLEND); 1384 glDisable (GL_BLEND);
1385 glDisable (GL_TEXTURE_2D); 1385 glDisable (GL_TEXTURE_2D);
1386} 1386}
1387 1387
1388MODULE = CFPlus PACKAGE = CFPlus::Texture 1388MODULE = Deliantra::Client PACKAGE = dc::Texture
1389 1389
1390PROTOTYPES: ENABLE 1390PROTOTYPES: ENABLE
1391 1391
1392void 1392void
1393pad (SV *data_, int ow, int oh, int nw, int nh) 1393pad (SV *data_, int ow, int oh, int nw, int nh)
1472 RETVAL = width > 0; 1472 RETVAL = width > 0;
1473} 1473}
1474 OUTPUT: 1474 OUTPUT:
1475 RETVAL 1475 RETVAL
1476 1476
1477MODULE = CFPlus PACKAGE = CFPlus::Map 1477MODULE = Deliantra::Client PACKAGE = dc::Map
1478 1478
1479PROTOTYPES: DISABLE 1479PROTOTYPES: DISABLE
1480 1480
1481CFPlus::Map 1481dc::Map
1482new (SV *class) 1482new (SV *class)
1483 CODE: 1483 CODE:
1484 New (0, RETVAL, 1, struct map); 1484 New (0, RETVAL, 1, struct map);
1485 RETVAL->x = 0; 1485 RETVAL->x = 0;
1486 RETVAL->y = 0; 1486 RETVAL->y = 0;
1494 RETVAL->row = 0; 1494 RETVAL->row = 0;
1495 OUTPUT: 1495 OUTPUT:
1496 RETVAL 1496 RETVAL
1497 1497
1498void 1498void
1499DESTROY (CFPlus::Map self) 1499DESTROY (dc::Map self)
1500 CODE: 1500 CODE:
1501{ 1501{
1502 map_clear (self); 1502 map_clear (self);
1503 Safefree (self->face2tile); 1503 Safefree (self->face2tile);
1504 Safefree (self->tex); 1504 Safefree (self->tex);
1505 Safefree (self); 1505 Safefree (self);
1506} 1506}
1507 1507
1508void 1508void
1509resize (CFPlus::Map self, int map_width, int map_height) 1509resize (dc::Map self, int map_width, int map_height)
1510 CODE: 1510 CODE:
1511 self->w = map_width; 1511 self->w = map_width;
1512 self->h = map_height; 1512 self->h = map_height;
1513 1513
1514void 1514void
1515clear (CFPlus::Map self) 1515clear (dc::Map self)
1516 CODE: 1516 CODE:
1517 map_clear (self); 1517 map_clear (self);
1518 1518
1519void 1519void
1520set_tileid (CFPlus::Map self, int face, int tile) 1520set_tileid (dc::Map self, int face, int tile)
1521 CODE: 1521 CODE:
1522{ 1522{
1523 need_facenum (self, face); self->face2tile [face] = tile; 1523 need_facenum (self, face); self->face2tile [face] = tile;
1524 need_texid (self, tile); 1524 need_texid (self, tile);
1525} 1525}
1526 1526
1527void 1527void
1528set_smooth (CFPlus::Map self, int face, int smooth, int level) 1528set_smooth (dc::Map self, int face, int smooth, int level)
1529 CODE: 1529 CODE:
1530{ 1530{
1531 tileid texid; 1531 tileid texid;
1532 maptex *tex; 1532 maptex *tex;
1533 1533
1546 tex->smoothtile = self->face2tile [smooth]; 1546 tex->smoothtile = self->face2tile [smooth];
1547 tex->smoothlevel = level; 1547 tex->smoothlevel = level;
1548} 1548}
1549 1549
1550void 1550void
1551set_texture (CFPlus::Map self, int texid, int name, int w, int h, float s, float t, int r, int g, int b, int a) 1551set_texture (dc::Map self, int texid, int name, int w, int h, float s, float t, int r, int g, int b, int a)
1552 CODE: 1552 CODE:
1553{ 1553{
1554 need_texid (self, texid); 1554 need_texid (self, texid);
1555 1555
1556 { 1556 {
1576 // from transparent color bleeding and ugly wrapping effects. 1576 // from transparent color bleeding and ugly wrapping effects.
1577 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 1577 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1578} 1578}
1579 1579
1580int 1580int
1581ox (CFPlus::Map self) 1581ox (dc::Map self)
1582 ALIAS: 1582 ALIAS:
1583 oy = 1 1583 oy = 1
1584 x = 2 1584 x = 2
1585 y = 3 1585 y = 3
1586 w = 4 1586 w = 4
1597 } 1597 }
1598 OUTPUT: 1598 OUTPUT:
1599 RETVAL 1599 RETVAL
1600 1600
1601void 1601void
1602scroll (CFPlus::Map self, int dx, int dy) 1602scroll (dc::Map self, int dx, int dy)
1603 CODE: 1603 CODE:
1604{ 1604{
1605 if (dx > 0) 1605 if (dx > 0)
1606 map_blank (self, self->x, self->y, dx, self->h); 1606 map_blank (self, self->x, self->y, dx, self->h);
1607 else if (dx < 0) 1607 else if (dx < 0)
1623 self->y += MAP_EXTEND_Y; 1623 self->y += MAP_EXTEND_Y;
1624 } 1624 }
1625} 1625}
1626 1626
1627SV * 1627SV *
1628map1a_update (CFPlus::Map self, SV *data_, int extmap) 1628map1a_update (dc::Map self, SV *data_, int extmap)
1629 CODE: 1629 CODE:
1630{ 1630{
1631 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_); 1631 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_);
1632 uint8_t *data_end = (uint8_t *)SvEND (data_); 1632 uint8_t *data_end = (uint8_t *)SvEND (data_);
1633 mapcell *cell; 1633 mapcell *cell;
1722} 1722}
1723 OUTPUT: 1723 OUTPUT:
1724 RETVAL 1724 RETVAL
1725 1725
1726SV * 1726SV *
1727mapmap (CFPlus::Map self, int x0, int y0, int w, int h) 1727mapmap (dc::Map self, int x0, int y0, int w, int h)
1728 CODE: 1728 CODE:
1729{ 1729{
1730 int x1, x; 1730 int x1, x;
1731 int y1, y; 1731 int y1, y;
1732 int z; 1732 int z;
1777} 1777}
1778 OUTPUT: 1778 OUTPUT:
1779 RETVAL 1779 RETVAL
1780 1780
1781void 1781void
1782draw (CFPlus::Map self, int mx, int my, int sw, int sh, int T) 1782draw (dc::Map self, int mx, int my, int sw, int sh, int T)
1783 CODE: 1783 CODE:
1784{ 1784{
1785 int x, y, z; 1785 int x, y, z;
1786 1786
1787 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 1787 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
2058 } 2058 }
2059 } 2059 }
2060} 2060}
2061 2061
2062void 2062void
2063draw_magicmap (CFPlus::Map self, int dx, int dy, int w, int h, unsigned char *data) 2063draw_magicmap (dc::Map self, int dx, int dy, int w, int h, unsigned char *data)
2064 CODE: 2064 CODE:
2065{ 2065{
2066 static float color[16][3] = { 2066 static float color[16][3] = {
2067 { 0.00F, 0.00F, 0.00F }, 2067 { 0.00F, 0.00F, 0.00F },
2068 { 1.00F, 1.00F, 1.00F }, 2068 { 1.00F, 1.00F, 1.00F },
2118 glDisable (GL_BLEND); 2118 glDisable (GL_BLEND);
2119 glDisable (GL_TEXTURE_2D); 2119 glDisable (GL_TEXTURE_2D);
2120} 2120}
2121 2121
2122void 2122void
2123fow_texture (CFPlus::Map self, int mx, int my, int sw, int sh) 2123fow_texture (dc::Map self, int mx, int my, int sw, int sh)
2124 PPCODE: 2124 PPCODE:
2125{ 2125{
2126 int x, y; 2126 int x, y;
2127 int sw1 = sw + 2; 2127 int sw1 = sw + 2;
2128 int sh1 = sh + 2; 2128 int sh1 = sh + 2;
2199 PUSHs (sv_2mortal (newSViv (sh3))); 2199 PUSHs (sv_2mortal (newSViv (sh3)));
2200 PUSHs (darkness3_sv); 2200 PUSHs (darkness3_sv);
2201} 2201}
2202 2202
2203SV * 2203SV *
2204get_rect (CFPlus::Map self, int x0, int y0, int w, int h) 2204get_rect (dc::Map self, int x0, int y0, int w, int h)
2205 CODE: 2205 CODE:
2206{ 2206{
2207 int x, y, x1, y1; 2207 int x, y, x1, y1;
2208 SV *data_sv = newSV (w * h * 7 + 5); 2208 SV *data_sv = newSV (w * h * 7 + 5);
2209 uint8_t *data = (uint8_t *)SvPVX (data_sv); 2209 uint8_t *data = (uint8_t *)SvPVX (data_sv);
2274} 2274}
2275 OUTPUT: 2275 OUTPUT:
2276 RETVAL 2276 RETVAL
2277 2277
2278void 2278void
2279set_rect (CFPlus::Map self, int x0, int y0, uint8_t *data) 2279set_rect (dc::Map self, int x0, int y0, uint8_t *data)
2280 PPCODE: 2280 PPCODE:
2281{ 2281{
2282 int x, y, z; 2282 int x, y, z;
2283 int w, h; 2283 int w, h;
2284 int x1, y1; 2284 int x1, y1;
2337 } 2337 }
2338 } 2338 }
2339 } 2339 }
2340} 2340}
2341 2341
2342MODULE = CFPlus PACKAGE = CFPlus::RW 2342MODULE = Deliantra::Client PACKAGE = dc::RW
2343 2343
2344CFPlus::RW 2344dc::RW
2345new (SV *class, SV *data_sv) 2345new (SV *class, SV *data_sv)
2346 CODE: 2346 CODE:
2347{ 2347{
2348 STRLEN datalen; 2348 STRLEN datalen;
2349 char *data = SvPVbyte (data_sv, datalen); 2349 char *data = SvPVbyte (data_sv, datalen);
2351 RETVAL = SDL_RWFromConstMem (data, datalen); 2351 RETVAL = SDL_RWFromConstMem (data, datalen);
2352} 2352}
2353 OUTPUT: 2353 OUTPUT:
2354 RETVAL 2354 RETVAL
2355 2355
2356CFPlus::RW 2356dc::RW
2357new_from_file (SV *class, const char *path, const char *mode = "rb") 2357new_from_file (SV *class, const char *path, const char *mode = "rb")
2358 CODE: 2358 CODE:
2359 RETVAL = SDL_RWFromFile (path, mode); 2359 RETVAL = SDL_RWFromFile (path, mode);
2360 OUTPUT: 2360 OUTPUT:
2361 RETVAL 2361 RETVAL
2362 2362
2363# fails on win32: 2363# fails on win32:
2364# CFPlus.xs(2268) : error C2059: syntax error : '(' 2364# dc.xs(2268) : error C2059: syntax error : '('
2365#void 2365#void
2366#close (CFPlus::RW self) 2366#close (dc::RW self)
2367# CODE: 2367# CODE:
2368# (self->(close)) (self); 2368# (self->(close)) (self);
2369 2369
2370MODULE = CFPlus PACKAGE = CFPlus::Channel 2370MODULE = Deliantra::Client PACKAGE = dc::Channel
2371 2371
2372PROTOTYPES: DISABLE 2372PROTOTYPES: DISABLE
2373 2373
2374CFPlus::Channel 2374dc::Channel
2375find () 2375find ()
2376 CODE: 2376 CODE:
2377{ 2377{
2378 RETVAL = Mix_GroupAvailable (-1); 2378 RETVAL = Mix_GroupAvailable (-1);
2379 2379
2392} 2392}
2393 OUTPUT: 2393 OUTPUT:
2394 RETVAL 2394 RETVAL
2395 2395
2396void 2396void
2397halt (CFPlus::Channel self) 2397halt (dc::Channel self)
2398 CODE: 2398 CODE:
2399 Mix_HaltChannel (self); 2399 Mix_HaltChannel (self);
2400 2400
2401void 2401void
2402expire (CFPlus::Channel self, int ticks = -1) 2402expire (dc::Channel self, int ticks = -1)
2403 CODE: 2403 CODE:
2404 Mix_ExpireChannel (self, ticks); 2404 Mix_ExpireChannel (self, ticks);
2405 2405
2406void 2406void
2407fade_out (CFPlus::Channel self, int ticks = -1) 2407fade_out (dc::Channel self, int ticks = -1)
2408 CODE: 2408 CODE:
2409 Mix_FadeOutChannel (self, ticks); 2409 Mix_FadeOutChannel (self, ticks);
2410 2410
2411int 2411int
2412volume (CFPlus::Channel self, int volume) 2412volume (dc::Channel self, int volume)
2413 CODE: 2413 CODE:
2414 RETVAL = Mix_Volume (self, CLAMP (volume, 0, 128)); 2414 RETVAL = Mix_Volume (self, CLAMP (volume, 0, 128));
2415 OUTPUT: 2415 OUTPUT:
2416 RETVAL 2416 RETVAL
2417 2417
2418void 2418void
2419unregister_all_effects (CFPlus::Channel self) 2419unregister_all_effects (dc::Channel self)
2420 CODE: 2420 CODE:
2421 Mix_UnregisterAllEffects (self); 2421 Mix_UnregisterAllEffects (self);
2422 2422
2423void 2423void
2424set_panning (CFPlus::Channel self, int left, int right) 2424set_panning (dc::Channel self, int left, int right)
2425 CODE: 2425 CODE:
2426 left = CLAMP (left , 0, 255); 2426 left = CLAMP (left , 0, 255);
2427 right = CLAMP (right, 0, 255); 2427 right = CLAMP (right, 0, 255);
2428 Mix_SetPanning (self, left, right); 2428 Mix_SetPanning (self, left, right);
2429 2429
2430void 2430void
2431set_distance (CFPlus::Channel self, int distance) 2431set_distance (dc::Channel self, int distance)
2432 CODE: 2432 CODE:
2433 Mix_SetDistance (self, CLAMP (distance, 0, 255)); 2433 Mix_SetDistance (self, CLAMP (distance, 0, 255));
2434 2434
2435void 2435void
2436set_position (CFPlus::Channel self, int angle, int distance) 2436set_position (dc::Channel self, int angle, int distance)
2437 CODE: 2437 CODE:
2438 2438
2439void 2439void
2440set_position_r (CFPlus::Channel self, int dx, int dy, int maxdistance) 2440set_position_r (dc::Channel self, int dx, int dy, int maxdistance)
2441 CODE: 2441 CODE:
2442{ 2442{
2443 int distance = sqrtf (dx * dx + dy * dy) * (255.f / sqrtf (maxdistance * maxdistance)); 2443 int distance = sqrtf (dx * dx + dy * dy) * (255.f / sqrtf (maxdistance * maxdistance));
2444 int angle = 360 + (int)roundf (atan2f (dx, -dy) * 180.f / (float)M_PI); 2444 int angle = 360 + (int)roundf (atan2f (dx, -dy) * 180.f / (float)M_PI);
2445 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255)); 2445 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255));
2446} 2446}
2447 2447
2448void 2448void
2449set_reverse_stereo (CFPlus::Channel self, int flip) 2449set_reverse_stereo (dc::Channel self, int flip)
2450 CODE: 2450 CODE:
2451 Mix_SetReverseStereo (self, flip); 2451 Mix_SetReverseStereo (self, flip);
2452 2452
2453MODULE = CFPlus PACKAGE = CFPlus::MixChunk 2453MODULE = Deliantra::Client PACKAGE = dc::MixChunk
2454 2454
2455PROTOTYPES: DISABLE 2455PROTOTYPES: DISABLE
2456 2456
2457CFPlus::MixChunk 2457dc::MixChunk
2458new (SV *class, CFPlus::RW rwops) 2458new (SV *class, dc::RW rwops)
2459 CODE: 2459 CODE:
2460 RETVAL = Mix_LoadWAV_RW (rwops, 1); 2460 RETVAL = Mix_LoadWAV_RW (rwops, 1);
2461 OUTPUT: 2461 OUTPUT:
2462 RETVAL 2462 RETVAL
2463 2463
2464void 2464void
2465DESTROY (CFPlus::MixChunk self) 2465DESTROY (dc::MixChunk self)
2466 CODE: 2466 CODE:
2467 Mix_FreeChunk (self); 2467 Mix_FreeChunk (self);
2468 2468
2469int 2469int
2470volume (CFPlus::MixChunk self, int volume = -1) 2470volume (dc::MixChunk self, int volume = -1)
2471 CODE: 2471 CODE:
2472 if (items > 1) 2472 if (items > 1)
2473 volume = CLAMP (volume, 0, 128); 2473 volume = CLAMP (volume, 0, 128);
2474 RETVAL = Mix_VolumeChunk (self, volume); 2474 RETVAL = Mix_VolumeChunk (self, volume);
2475 OUTPUT: 2475 OUTPUT:
2476 RETVAL 2476 RETVAL
2477 2477
2478CFPlus::Channel 2478dc::Channel
2479play (CFPlus::MixChunk self, CFPlus::Channel channel = -1, int loops = 0, int ticks = -1) 2479play (dc::MixChunk self, dc::Channel channel = -1, int loops = 0, int ticks = -1)
2480 CODE: 2480 CODE:
2481{ 2481{
2482 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks); 2482 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks);
2483 2483
2484 if (RETVAL < 0) 2484 if (RETVAL < 0)
2491 } 2491 }
2492} 2492}
2493 OUTPUT: 2493 OUTPUT:
2494 RETVAL 2494 RETVAL
2495 2495
2496MODULE = CFPlus PACKAGE = CFPlus::MixMusic 2496MODULE = Deliantra::Client PACKAGE = dc::MixMusic
2497 2497
2498int 2498int
2499volume (int volume = -1) 2499volume (int volume = -1)
2500 PROTOTYPE: ;$ 2500 PROTOTYPE: ;$
2501 CODE: 2501 CODE:
2513void 2513void
2514halt () 2514halt ()
2515 CODE: 2515 CODE:
2516 Mix_HaltMusic (); 2516 Mix_HaltMusic ();
2517 2517
2518CFPlus::MixMusic 2518dc::MixMusic
2519new (SV *class, CFPlus::RW rwops) 2519new (SV *class, dc::RW rwops)
2520 CODE: 2520 CODE:
2521 RETVAL = Mix_LoadMUS_RW (rwops); 2521 RETVAL = Mix_LoadMUS_RW (rwops);
2522 OUTPUT: 2522 OUTPUT:
2523 RETVAL 2523 RETVAL
2524 2524
2525void 2525void
2526DESTROY (CFPlus::MixMusic self) 2526DESTROY (dc::MixMusic self)
2527 CODE: 2527 CODE:
2528 Mix_FreeMusic (self); 2528 Mix_FreeMusic (self);
2529 2529
2530int 2530int
2531play (CFPlus::MixMusic self, int loops = -1) 2531play (dc::MixMusic self, int loops = -1)
2532 CODE: 2532 CODE:
2533 RETVAL = Mix_PlayMusic (self, loops); 2533 RETVAL = Mix_PlayMusic (self, loops);
2534 OUTPUT: 2534 OUTPUT:
2535 RETVAL 2535 RETVAL
2536 2536
2537void 2537void
2538fade_in_pos (CFPlus::MixMusic self, int loops, int ms, double position) 2538fade_in_pos (dc::MixMusic self, int loops, int ms, double position)
2539 CODE: 2539 CODE:
2540 Mix_FadeInMusicPos (self, loops, ms, position); 2540 Mix_FadeInMusicPos (self, loops, ms, position);
2541 2541
2542MODULE = CFPlus PACKAGE = CFPlus::OpenGL 2542MODULE = Deliantra::Client PACKAGE = dc::OpenGL
2543 2543
2544PROTOTYPES: ENABLE 2544PROTOTYPES: ENABLE
2545 2545
2546BOOT: 2546BOOT:
2547{ 2547{
2548 HV *stash = gv_stashpv ("CFPlus::OpenGL", 1); 2548 HV *stash = gv_stashpv ("dc::OpenGL", 1);
2549 static const struct { 2549 static const struct {
2550 const char *name; 2550 const char *name;
2551 IV iv; 2551 IV iv;
2552 } *civ, const_iv[] = { 2552 } *civ, const_iv[] = {
2553# define const_iv(name) { # name, (IV)name } 2553# define const_iv(name) { # name, (IV)name }
2882 2882
2883void glEndList () 2883void glEndList ()
2884 2884
2885void glCallList (int list) 2885void glCallList (int list)
2886 2886
2887MODULE = CFPlus PACKAGE = CFPlus::UI::Base 2887MODULE = Deliantra::Client PACKAGE = dc::UI::Base
2888 2888
2889PROTOTYPES: DISABLE 2889PROTOTYPES: DISABLE
2890 2890
2891void 2891void
2892find_widget (SV *self, NV x, NV y) 2892find_widget (SV *self, NV x, NV y)
2896 XPUSHs (self); 2896 XPUSHs (self);
2897} 2897}
2898 2898
2899BOOT: 2899BOOT:
2900{ 2900{
2901 hover_gv = gv_fetchpv ("CFPlus::UI::HOVER", 1, SVt_NV); 2901 hover_gv = gv_fetchpv ("dc::UI::HOVER", 1, SVt_NV);
2902 2902
2903 draw_x_gv = gv_fetchpv ("CFPlus::UI::Base::draw_x", 1, SVt_NV); 2903 draw_x_gv = gv_fetchpv ("dc::UI::Base::draw_x", 1, SVt_NV);
2904 draw_y_gv = gv_fetchpv ("CFPlus::UI::Base::draw_y", 1, SVt_NV); 2904 draw_y_gv = gv_fetchpv ("dc::UI::Base::draw_y", 1, SVt_NV);
2905 draw_w_gv = gv_fetchpv ("CFPlus::UI::Base::draw_w", 1, SVt_NV); 2905 draw_w_gv = gv_fetchpv ("dc::UI::Base::draw_w", 1, SVt_NV);
2906 draw_h_gv = gv_fetchpv ("CFPlus::UI::Base::draw_h", 1, SVt_NV); 2906 draw_h_gv = gv_fetchpv ("dc::UI::Base::draw_h", 1, SVt_NV);
2907} 2907}
2908 2908
2909void 2909void
2910draw (SV *self) 2910draw (SV *self)
2911 CODE: 2911 CODE:
2918 SV *draw_w_sv = GvSV (draw_w_gv); 2918 SV *draw_w_sv = GvSV (draw_w_gv);
2919 SV *draw_h_sv = GvSV (draw_h_gv); 2919 SV *draw_h_sv = GvSV (draw_h_gv);
2920 double draw_x, draw_y; 2920 double draw_x, draw_y;
2921 2921
2922 if (!SvROK (self)) 2922 if (!SvROK (self))
2923 croak ("CFPlus::Base::draw: %s not a reference", SvPV_nolen (self)); 2923 croak ("dc::Base::draw: %s not a reference", SvPV_nolen (self));
2924 2924
2925 hv = (HV *)SvRV (self); 2925 hv = (HV *)SvRV (self);
2926 2926
2927 if (SvTYPE (hv) != SVt_PVHV) 2927 if (SvTYPE (hv) != SVt_PVHV)
2928 croak ("CFPlus::Base::draw: %s not a hashref", SvPV_nolen (self)); 2928 croak ("dc::Base::draw: %s not a hashref", SvPV_nolen (self));
2929 2929
2930 svp = hv_fetch (hv, "w", 1, 0); w = svp ? SvNV (*svp) : 0.; 2930 svp = hv_fetch (hv, "w", 1, 0); w = svp ? SvNV (*svp) : 0.;
2931 svp = hv_fetch (hv, "h", 1, 0); h = svp ? SvNV (*svp) : 0.; 2931 svp = hv_fetch (hv, "h", 1, 0); h = svp ? SvNV (*svp) : 0.;
2932 2932
2933 if (!h || !w) 2933 if (!h || !w)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines