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.236 by root, Mon Oct 8 16:10:14 2007 UTC vs.
Revision 1.243 by root, Thu Dec 27 06:54:36 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 }
700 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL); 700 m = SDL_ListModes (0, SDL_FULLSCREEN | SDL_OPENGL);
701 701
702 if (m && m != (SDL_Rect **)-1) 702 if (m && m != (SDL_Rect **)-1)
703 while (*m) 703 while (*m)
704 { 704 {
705 if ((*m)->w >= 640 && (*m)->h >= 480) 705 if ((*m)->w >= 800 && (*m)->h >= 480)
706 { 706 {
707 AV *av = newAV (); 707 AV *av = newAV ();
708 av_push (av, newSViv ((*m)->w)); 708 av_push (av, newSViv ((*m)->w));
709 av_push (av, newSViv ((*m)->h)); 709 av_push (av, newSViv ((*m)->h));
710 av_push (av, newSViv (rgb)); 710 av_push (av, newSViv (rgb));
734 734
735 if (RETVAL) 735 if (RETVAL)
736 { 736 {
737 av_clear (texture_av); 737 av_clear (texture_av);
738 738
739 SDL_WM_SetCaption ("Crossfire TRT Client " VERSION, "Crossfire TRT"); 739 SDL_WM_SetCaption ("Deliantra MORPG Client " VERSION, "Deliantra");
740#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name); 740#define GL_FUNC(ptr,name) gl.name = (ptr)SDL_GL_GetProcAddress ("gl" # name);
741#include "glfunc.h" 741#include "glfunc.h"
742#undef GL_FUNC 742#undef GL_FUNC
743 } 743 }
744} 744}
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)
993void 993void
994error (char *message) 994error (char *message)
995 CODE: 995 CODE:
996 fprintf (stderr, "ERROR: %s\n", message); 996 fprintf (stderr, "ERROR: %s\n", message);
997#ifdef _WIN32 997#ifdef _WIN32
998 MessageBox (0, message, "Crossfire+ Error", MB_OK | MB_ICONERROR); 998 MessageBox (0, message, "Deliantra Client Error", MB_OK | MB_ICONERROR);
999#endif 999#endif
1000 1000
1001void 1001void
1002fatal (char *message) 1002fatal (char *message)
1003 CODE: 1003 CODE:
1004 fprintf (stderr, "FATAL: %s\n", message); 1004 fprintf (stderr, "FATAL: %s\n", message);
1005#ifdef _WIN32 1005#ifdef _WIN32
1006 MessageBox (0, message, "Crossfire+ Fatal Error", MB_OK | MB_ICONERROR); 1006 MessageBox (0, message, "Deliantra Client Fatal Error", MB_OK | MB_ICONERROR);
1007#endif 1007#endif
1008 _exit (1); 1008 _exit (1);
1009 1009
1010void 1010void
1011_exit (int retval = 0) 1011_exit (int retval = 0)
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
1060reset_glyph_cache () 1060glyph_cache_backup ()
1061 PROTOTYPE: 1061 PROTOTYPE:
1062 CODE: 1062 CODE:
1063 tc_backup ();
1064
1065void
1066glyph_cache_restore ()
1067 PROTOTYPE:
1068 CODE:
1063 tc_clear (); 1069 tc_restore ();
1064 1070
1065CFPlus::Layout 1071DC::Layout
1066new (SV *class) 1072new (SV *class)
1067 CODE: 1073 CODE:
1068 New (0, RETVAL, 1, struct cf_layout); 1074 New (0, RETVAL, 1, struct cf_layout);
1069 1075
1070 RETVAL->pl = pango_layout_new (opengl_context); 1076 RETVAL->pl = pango_layout_new (opengl_context);
1080 layout_update_font (RETVAL); 1086 layout_update_font (RETVAL);
1081 OUTPUT: 1087 OUTPUT:
1082 RETVAL 1088 RETVAL
1083 1089
1084void 1090void
1085DESTROY (CFPlus::Layout self) 1091DESTROY (DC::Layout self)
1086 CODE: 1092 CODE:
1087 g_object_unref (self->pl); 1093 g_object_unref (self->pl);
1088 rc_free (self->rc); 1094 rc_free (self->rc);
1089 Safefree (self); 1095 Safefree (self);
1090 1096
1091void 1097void
1092set_text (CFPlus::Layout self, SV *text_) 1098set_text (DC::Layout self, SV *text_)
1093 CODE: 1099 CODE:
1094{ 1100{
1095 STRLEN textlen; 1101 STRLEN textlen;
1096 char *text = SvPVutf8 (text_, textlen); 1102 char *text = SvPVutf8 (text_, textlen);
1097 1103
1098 pango_layout_set_text (self->pl, text, textlen); 1104 pango_layout_set_text (self->pl, text, textlen);
1099} 1105}
1100 1106
1101void 1107void
1102set_markup (CFPlus::Layout self, SV *text_) 1108set_markup (DC::Layout self, SV *text_)
1103 CODE: 1109 CODE:
1104{ 1110{
1105 STRLEN textlen; 1111 STRLEN textlen;
1106 char *text = SvPVutf8 (text_, textlen); 1112 char *text = SvPVutf8 (text_, textlen);
1107 1113
1108 pango_layout_set_markup (self->pl, text, textlen); 1114 pango_layout_set_markup (self->pl, text, textlen);
1109} 1115}
1110 1116
1111void 1117void
1112set_shapes (CFPlus::Layout self, ...) 1118set_shapes (DC::Layout self, ...)
1113 CODE: 1119 CODE:
1114{ 1120{
1115 PangoAttrList *attrs = 0; 1121 PangoAttrList *attrs = 0;
1116 const char *text = pango_layout_get_text (self->pl); 1122 const char *text = pango_layout_get_text (self->pl);
1117 const char *pos = text; 1123 const char *pos = text;
1152 if (attrs) 1158 if (attrs)
1153 pango_layout_set_attributes (self->pl, attrs); 1159 pango_layout_set_attributes (self->pl, attrs);
1154} 1160}
1155 1161
1156void 1162void
1157get_shapes (CFPlus::Layout self) 1163get_shapes (DC::Layout self)
1158 PPCODE: 1164 PPCODE:
1159{ 1165{
1160 PangoLayoutIter *iter = pango_layout_get_iter (self->pl); 1166 PangoLayoutIter *iter = pango_layout_get_iter (self->pl);
1161 1167
1162 do 1168 do
1177 1183
1178 pango_layout_iter_free (iter); 1184 pango_layout_iter_free (iter);
1179} 1185}
1180 1186
1181int 1187int
1182has_wrapped (CFPlus::Layout self) 1188has_wrapped (DC::Layout self)
1183 CODE: 1189 CODE:
1184{ 1190{
1185 int lines = 1; 1191 int lines = 1;
1186 const char *text = pango_layout_get_text (self->pl); 1192 const char *text = pango_layout_get_text (self->pl);
1187 1193
1192} 1198}
1193 OUTPUT: 1199 OUTPUT:
1194 RETVAL 1200 RETVAL
1195 1201
1196SV * 1202SV *
1197get_text (CFPlus::Layout self) 1203get_text (DC::Layout self)
1198 CODE: 1204 CODE:
1199 RETVAL = newSVpv (pango_layout_get_text (self->pl), 0); 1205 RETVAL = newSVpv (pango_layout_get_text (self->pl), 0);
1200 sv_utf8_decode (RETVAL); 1206 sv_utf8_decode (RETVAL);
1201 OUTPUT: 1207 OUTPUT:
1202 RETVAL 1208 RETVAL
1203 1209
1204void 1210void
1205set_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.)
1206 CODE: 1212 CODE:
1207 self->r = r; 1213 self->r = r;
1208 self->g = g; 1214 self->g = g;
1209 self->b = b; 1215 self->b = b;
1210 self->a = a; 1216 self->a = a;
1211 1217
1212void 1218void
1213set_font (CFPlus::Layout self, CFPlus::Font font = 0) 1219set_font (DC::Layout self, DC::Font font = 0)
1214 CODE: 1220 CODE:
1215 if (self->font != font) 1221 if (self->font != font)
1216 { 1222 {
1217 self->font = font; 1223 self->font = font;
1218 layout_update_font (self); 1224 layout_update_font (self);
1219 } 1225 }
1220 1226
1221void 1227void
1222set_height (CFPlus::Layout self, int base_height) 1228set_height (DC::Layout self, int base_height)
1223 CODE: 1229 CODE:
1224 if (self->base_height != base_height) 1230 if (self->base_height != base_height)
1225 { 1231 {
1226 self->base_height = base_height; 1232 self->base_height = base_height;
1227 layout_update_font (self); 1233 layout_update_font (self);
1228 } 1234 }
1229 1235
1230void 1236void
1231set_width (CFPlus::Layout self, int max_width = -1) 1237set_width (DC::Layout self, int max_width = -1)
1232 CODE: 1238 CODE:
1233 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);
1234 1240
1235void 1241void
1236set_indent (CFPlus::Layout self, int indent) 1242set_indent (DC::Layout self, int indent)
1237 CODE: 1243 CODE:
1238 pango_layout_set_indent (self->pl, indent * PANGO_SCALE); 1244 pango_layout_set_indent (self->pl, indent * PANGO_SCALE);
1239 1245
1240void 1246void
1241set_spacing (CFPlus::Layout self, int spacing) 1247set_spacing (DC::Layout self, int spacing)
1242 CODE: 1248 CODE:
1243 pango_layout_set_spacing (self->pl, spacing * PANGO_SCALE); 1249 pango_layout_set_spacing (self->pl, spacing * PANGO_SCALE);
1244 1250
1245void 1251void
1246set_ellipsise (CFPlus::Layout self, int ellipsise) 1252set_ellipsise (DC::Layout self, int ellipsise)
1247 CODE: 1253 CODE:
1248 pango_layout_set_ellipsize (self->pl, 1254 pango_layout_set_ellipsize (self->pl,
1249 ellipsise == 1 ? PANGO_ELLIPSIZE_START 1255 ellipsise == 1 ? PANGO_ELLIPSIZE_START
1250 : ellipsise == 2 ? PANGO_ELLIPSIZE_MIDDLE 1256 : ellipsise == 2 ? PANGO_ELLIPSIZE_MIDDLE
1251 : ellipsise == 3 ? PANGO_ELLIPSIZE_END 1257 : ellipsise == 3 ? PANGO_ELLIPSIZE_END
1252 : PANGO_ELLIPSIZE_NONE 1258 : PANGO_ELLIPSIZE_NONE
1253 ); 1259 );
1254 1260
1255void 1261void
1256set_single_paragraph_mode (CFPlus::Layout self, int spm) 1262set_single_paragraph_mode (DC::Layout self, int spm)
1257 CODE: 1263 CODE:
1258 pango_layout_set_single_paragraph_mode (self->pl, !!spm); 1264 pango_layout_set_single_paragraph_mode (self->pl, !!spm);
1259 1265
1260void 1266void
1261size (CFPlus::Layout self) 1267size (DC::Layout self)
1262 PPCODE: 1268 PPCODE:
1263{ 1269{
1264 int w, h; 1270 int w, h;
1265 1271
1266 layout_get_pixel_size (self, &w, &h); 1272 layout_get_pixel_size (self, &w, &h);
1269 PUSHs (sv_2mortal (newSViv (w))); 1275 PUSHs (sv_2mortal (newSViv (w)));
1270 PUSHs (sv_2mortal (newSViv (h))); 1276 PUSHs (sv_2mortal (newSViv (h)));
1271} 1277}
1272 1278
1273int 1279int
1274descent (CFPlus::Layout self) 1280descent (DC::Layout self)
1275 CODE: 1281 CODE:
1276{ 1282{
1277 PangoRectangle rect; 1283 PangoRectangle rect;
1278 PangoLayoutLine *line = pango_layout_get_line (self->pl, 0); 1284 PangoLayoutLine *line = pango_layout_get_line (self->pl, 0);
1279 pango_layout_line_get_pixel_extents (line, 0, &rect); 1285 pango_layout_line_get_pixel_extents (line, 0, &rect);
1281} 1287}
1282 OUTPUT: 1288 OUTPUT:
1283 RETVAL 1289 RETVAL
1284 1290
1285int 1291int
1286xy_to_index (CFPlus::Layout self, int x, int y) 1292xy_to_index (DC::Layout self, int x, int y)
1287 CODE: 1293 CODE:
1288{ 1294{
1289 int index, trailing; 1295 int index, trailing;
1290 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);
1291 RETVAL = index + trailing; 1297 RETVAL = index + trailing;
1292} 1298}
1293 OUTPUT: 1299 OUTPUT:
1294 RETVAL 1300 RETVAL
1295 1301
1296void 1302void
1297cursor_pos (CFPlus::Layout self, int index) 1303cursor_pos (DC::Layout self, int index)
1298 PPCODE: 1304 PPCODE:
1299{ 1305{
1300 PangoRectangle strong_pos; 1306 PangoRectangle strong_pos;
1301 pango_layout_get_cursor_pos (self->pl, index, &strong_pos, 0); 1307 pango_layout_get_cursor_pos (self->pl, index, &strong_pos, 0);
1302 1308
1305 PUSHs (sv_2mortal (newSViv (strong_pos.y / PANGO_SCALE))); 1311 PUSHs (sv_2mortal (newSViv (strong_pos.y / PANGO_SCALE)));
1306 PUSHs (sv_2mortal (newSViv (strong_pos.height / PANGO_SCALE))); 1312 PUSHs (sv_2mortal (newSViv (strong_pos.height / PANGO_SCALE)));
1307} 1313}
1308 1314
1309void 1315void
1310index_to_line_x (CFPlus::Layout self, int index, int trailing = 0) 1316index_to_line_x (DC::Layout self, int index, int trailing = 0)
1311 PPCODE: 1317 PPCODE:
1312{ 1318{
1313 int line, x; 1319 int line, x;
1314 1320
1315 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);
1319 PUSHs (sv_2mortal (newSViv (line - 1))); 1325 PUSHs (sv_2mortal (newSViv (line - 1)));
1320 PUSHs (sv_2mortal (newSViv (x / PANGO_SCALE))); 1326 PUSHs (sv_2mortal (newSViv (x / PANGO_SCALE)));
1321} 1327}
1322 1328
1323void 1329void
1324line_x_to_index (CFPlus::Layout self, int line, int x) 1330line_x_to_index (DC::Layout self, int line, int x)
1325 PPCODE: 1331 PPCODE:
1326{ 1332{
1327 PangoLayoutLine *lp; 1333 PangoLayoutLine *lp;
1328 int index, trailing; 1334 int index, trailing;
1329 1335
1344 PUSHs (sv_2mortal (newSViv (trailing))); 1350 PUSHs (sv_2mortal (newSViv (trailing)));
1345 } 1351 }
1346} 1352}
1347 1353
1348void 1354void
1349render (CFPlus::Layout self, float x, float y, int flags = 0) 1355render (DC::Layout self, float x, float y, int flags = 0)
1350 CODE: 1356 CODE:
1351 rc_clear (self->rc); 1357 rc_clear (self->rc);
1352 pango_opengl_render_layout_subpixel ( 1358 pango_opengl_render_layout_subpixel (
1353 self->pl, 1359 self->pl,
1354 self->rc, 1360 self->rc,
1359 // we assume that context_change actually clears/frees stuff 1365 // we assume that context_change actually clears/frees stuff
1360 // and does not do any recomputation... 1366 // and does not do any recomputation...
1361 pango_layout_context_changed (self->pl); 1367 pango_layout_context_changed (self->pl);
1362 1368
1363void 1369void
1364draw (CFPlus::Layout self) 1370draw (DC::Layout self)
1365 CODE: 1371 CODE:
1366{ 1372{
1367 glEnable (GL_TEXTURE_2D); 1373 glEnable (GL_TEXTURE_2D);
1368 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 1374 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
1369 glEnable (GL_BLEND); 1375 glEnable (GL_BLEND);
1377 glDisable (GL_ALPHA_TEST); 1383 glDisable (GL_ALPHA_TEST);
1378 glDisable (GL_BLEND); 1384 glDisable (GL_BLEND);
1379 glDisable (GL_TEXTURE_2D); 1385 glDisable (GL_TEXTURE_2D);
1380} 1386}
1381 1387
1382MODULE = CFPlus PACKAGE = CFPlus::Texture 1388MODULE = Deliantra::Client PACKAGE = DC::Texture
1383 1389
1384PROTOTYPES: ENABLE 1390PROTOTYPES: ENABLE
1385 1391
1386void 1392void
1387pad (SV *data_, int ow, int oh, int nw, int nh) 1393pad (SV *data_, int ow, int oh, int nw, int nh)
1466 RETVAL = width > 0; 1472 RETVAL = width > 0;
1467} 1473}
1468 OUTPUT: 1474 OUTPUT:
1469 RETVAL 1475 RETVAL
1470 1476
1471MODULE = CFPlus PACKAGE = CFPlus::Map 1477MODULE = Deliantra::Client PACKAGE = DC::Map
1472 1478
1473PROTOTYPES: DISABLE 1479PROTOTYPES: DISABLE
1474 1480
1475CFPlus::Map 1481DC::Map
1476new (SV *class) 1482new (SV *class)
1477 CODE: 1483 CODE:
1478 New (0, RETVAL, 1, struct map); 1484 New (0, RETVAL, 1, struct map);
1479 RETVAL->x = 0; 1485 RETVAL->x = 0;
1480 RETVAL->y = 0; 1486 RETVAL->y = 0;
1488 RETVAL->row = 0; 1494 RETVAL->row = 0;
1489 OUTPUT: 1495 OUTPUT:
1490 RETVAL 1496 RETVAL
1491 1497
1492void 1498void
1493DESTROY (CFPlus::Map self) 1499DESTROY (DC::Map self)
1494 CODE: 1500 CODE:
1495{ 1501{
1496 map_clear (self); 1502 map_clear (self);
1497 Safefree (self->face2tile); 1503 Safefree (self->face2tile);
1498 Safefree (self->tex); 1504 Safefree (self->tex);
1499 Safefree (self); 1505 Safefree (self);
1500} 1506}
1501 1507
1502void 1508void
1503resize (CFPlus::Map self, int map_width, int map_height) 1509resize (DC::Map self, int map_width, int map_height)
1504 CODE: 1510 CODE:
1505 self->w = map_width; 1511 self->w = map_width;
1506 self->h = map_height; 1512 self->h = map_height;
1507 1513
1508void 1514void
1509clear (CFPlus::Map self) 1515clear (DC::Map self)
1510 CODE: 1516 CODE:
1511 map_clear (self); 1517 map_clear (self);
1512 1518
1513void 1519void
1514set_tileid (CFPlus::Map self, int face, int tile) 1520set_tileid (DC::Map self, int face, int tile)
1515 CODE: 1521 CODE:
1516{ 1522{
1517 need_facenum (self, face); self->face2tile [face] = tile; 1523 need_facenum (self, face); self->face2tile [face] = tile;
1518 need_texid (self, tile); 1524 need_texid (self, tile);
1519} 1525}
1520 1526
1521void 1527void
1522set_smooth (CFPlus::Map self, int face, int smooth, int level) 1528set_smooth (DC::Map self, int face, int smooth, int level)
1523 CODE: 1529 CODE:
1524{ 1530{
1525 tileid texid; 1531 tileid texid;
1526 maptex *tex; 1532 maptex *tex;
1527 1533
1540 tex->smoothtile = self->face2tile [smooth]; 1546 tex->smoothtile = self->face2tile [smooth];
1541 tex->smoothlevel = level; 1547 tex->smoothlevel = level;
1542} 1548}
1543 1549
1544void 1550void
1545set_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)
1546 CODE: 1552 CODE:
1547{ 1553{
1548 need_texid (self, texid); 1554 need_texid (self, texid);
1549 1555
1550 { 1556 {
1570 // from transparent color bleeding and ugly wrapping effects. 1576 // from transparent color bleeding and ugly wrapping effects.
1571 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 1577 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1572} 1578}
1573 1579
1574int 1580int
1575ox (CFPlus::Map self) 1581ox (DC::Map self)
1576 ALIAS: 1582 ALIAS:
1577 oy = 1 1583 oy = 1
1578 x = 2 1584 x = 2
1579 y = 3 1585 y = 3
1580 w = 4 1586 w = 4
1591 } 1597 }
1592 OUTPUT: 1598 OUTPUT:
1593 RETVAL 1599 RETVAL
1594 1600
1595void 1601void
1596scroll (CFPlus::Map self, int dx, int dy) 1602scroll (DC::Map self, int dx, int dy)
1597 CODE: 1603 CODE:
1598{ 1604{
1599 if (dx > 0) 1605 if (dx > 0)
1600 map_blank (self, self->x, self->y, dx, self->h); 1606 map_blank (self, self->x, self->y, dx, self->h);
1601 else if (dx < 0) 1607 else if (dx < 0)
1617 self->y += MAP_EXTEND_Y; 1623 self->y += MAP_EXTEND_Y;
1618 } 1624 }
1619} 1625}
1620 1626
1621SV * 1627SV *
1622map1a_update (CFPlus::Map self, SV *data_, int extmap) 1628map1a_update (DC::Map self, SV *data_, int extmap)
1623 CODE: 1629 CODE:
1624{ 1630{
1625 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_); 1631 uint8_t *data = (uint8_t *)SvPVbyte_nolen (data_);
1626 uint8_t *data_end = (uint8_t *)SvEND (data_); 1632 uint8_t *data_end = (uint8_t *)SvEND (data_);
1627 mapcell *cell; 1633 mapcell *cell;
1716} 1722}
1717 OUTPUT: 1723 OUTPUT:
1718 RETVAL 1724 RETVAL
1719 1725
1720SV * 1726SV *
1721mapmap (CFPlus::Map self, int x0, int y0, int w, int h) 1727mapmap (DC::Map self, int x0, int y0, int w, int h)
1722 CODE: 1728 CODE:
1723{ 1729{
1724 int x1, x; 1730 int x1, x;
1725 int y1, y; 1731 int y1, y;
1726 int z; 1732 int z;
1771} 1777}
1772 OUTPUT: 1778 OUTPUT:
1773 RETVAL 1779 RETVAL
1774 1780
1775void 1781void
1776draw (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)
1777 CODE: 1783 CODE:
1778{ 1784{
1779 int x, y, z; 1785 int x, y, z;
1780 1786
1781 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ()); 1787 HV *smooth = (HV *)sv_2mortal ((SV *)newHV ());
2052 } 2058 }
2053 } 2059 }
2054} 2060}
2055 2061
2056void 2062void
2057draw_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)
2058 CODE: 2064 CODE:
2059{ 2065{
2060 static float color[16][3] = { 2066 static float color[16][3] = {
2061 { 0.00F, 0.00F, 0.00F }, 2067 { 0.00F, 0.00F, 0.00F },
2062 { 1.00F, 1.00F, 1.00F }, 2068 { 1.00F, 1.00F, 1.00F },
2112 glDisable (GL_BLEND); 2118 glDisable (GL_BLEND);
2113 glDisable (GL_TEXTURE_2D); 2119 glDisable (GL_TEXTURE_2D);
2114} 2120}
2115 2121
2116void 2122void
2117fow_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)
2118 PPCODE: 2124 PPCODE:
2119{ 2125{
2120 int x, y; 2126 int x, y;
2121 int sw1 = sw + 2; 2127 int sw1 = sw + 2;
2122 int sh1 = sh + 2; 2128 int sh1 = sh + 2;
2193 PUSHs (sv_2mortal (newSViv (sh3))); 2199 PUSHs (sv_2mortal (newSViv (sh3)));
2194 PUSHs (darkness3_sv); 2200 PUSHs (darkness3_sv);
2195} 2201}
2196 2202
2197SV * 2203SV *
2198get_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)
2199 CODE: 2205 CODE:
2200{ 2206{
2201 int x, y, x1, y1; 2207 int x, y, x1, y1;
2202 SV *data_sv = newSV (w * h * 7 + 5); 2208 SV *data_sv = newSV (w * h * 7 + 5);
2203 uint8_t *data = (uint8_t *)SvPVX (data_sv); 2209 uint8_t *data = (uint8_t *)SvPVX (data_sv);
2268} 2274}
2269 OUTPUT: 2275 OUTPUT:
2270 RETVAL 2276 RETVAL
2271 2277
2272void 2278void
2273set_rect (CFPlus::Map self, int x0, int y0, uint8_t *data) 2279set_rect (DC::Map self, int x0, int y0, uint8_t *data)
2274 PPCODE: 2280 PPCODE:
2275{ 2281{
2276 int x, y, z; 2282 int x, y, z;
2277 int w, h; 2283 int w, h;
2278 int x1, y1; 2284 int x1, y1;
2331 } 2337 }
2332 } 2338 }
2333 } 2339 }
2334} 2340}
2335 2341
2336MODULE = CFPlus PACKAGE = CFPlus::RW 2342MODULE = Deliantra::Client PACKAGE = DC::RW
2337 2343
2338CFPlus::RW 2344DC::RW
2339new (SV *class, SV *data_sv) 2345new (SV *class, SV *data_sv)
2340 CODE: 2346 CODE:
2341{ 2347{
2342 STRLEN datalen; 2348 STRLEN datalen;
2343 char *data = SvPVbyte (data_sv, datalen); 2349 char *data = SvPVbyte (data_sv, datalen);
2345 RETVAL = SDL_RWFromConstMem (data, datalen); 2351 RETVAL = SDL_RWFromConstMem (data, datalen);
2346} 2352}
2347 OUTPUT: 2353 OUTPUT:
2348 RETVAL 2354 RETVAL
2349 2355
2350CFPlus::RW 2356DC::RW
2351new_from_file (SV *class, const char *path, const char *mode = "rb") 2357new_from_file (SV *class, const char *path, const char *mode = "rb")
2352 CODE: 2358 CODE:
2353 RETVAL = SDL_RWFromFile (path, mode); 2359 RETVAL = SDL_RWFromFile (path, mode);
2354 OUTPUT: 2360 OUTPUT:
2355 RETVAL 2361 RETVAL
2356 2362
2357# fails on win32: 2363# fails on win32:
2358# CFPlus.xs(2268) : error C2059: syntax error : '(' 2364# dc.xs(2268) : error C2059: syntax error : '('
2359#void 2365#void
2360#close (CFPlus::RW self) 2366#close (DC::RW self)
2361# CODE: 2367# CODE:
2362# (self->(close)) (self); 2368# (self->(close)) (self);
2363 2369
2364MODULE = CFPlus PACKAGE = CFPlus::Channel 2370MODULE = Deliantra::Client PACKAGE = DC::Channel
2365 2371
2366PROTOTYPES: DISABLE 2372PROTOTYPES: DISABLE
2367 2373
2368CFPlus::Channel 2374DC::Channel
2369find () 2375find ()
2370 CODE: 2376 CODE:
2371{ 2377{
2372 RETVAL = Mix_GroupAvailable (-1); 2378 RETVAL = Mix_GroupAvailable (-1);
2373 2379
2386} 2392}
2387 OUTPUT: 2393 OUTPUT:
2388 RETVAL 2394 RETVAL
2389 2395
2390void 2396void
2391halt (CFPlus::Channel self) 2397halt (DC::Channel self)
2392 CODE: 2398 CODE:
2393 Mix_HaltChannel (self); 2399 Mix_HaltChannel (self);
2394 2400
2395void 2401void
2396expire (CFPlus::Channel self, int ticks = -1) 2402expire (DC::Channel self, int ticks = -1)
2397 CODE: 2403 CODE:
2398 Mix_ExpireChannel (self, ticks); 2404 Mix_ExpireChannel (self, ticks);
2399 2405
2400void 2406void
2401fade_out (CFPlus::Channel self, int ticks = -1) 2407fade_out (DC::Channel self, int ticks = -1)
2402 CODE: 2408 CODE:
2403 Mix_FadeOutChannel (self, ticks); 2409 Mix_FadeOutChannel (self, ticks);
2404 2410
2405int 2411int
2406volume (CFPlus::Channel self, int volume) 2412volume (DC::Channel self, int volume)
2407 CODE: 2413 CODE:
2408 RETVAL = Mix_Volume (self, CLAMP (volume, 0, 128)); 2414 RETVAL = Mix_Volume (self, CLAMP (volume, 0, 128));
2409 OUTPUT: 2415 OUTPUT:
2410 RETVAL 2416 RETVAL
2411 2417
2412void 2418void
2413unregister_all_effects (CFPlus::Channel self) 2419unregister_all_effects (DC::Channel self)
2414 CODE: 2420 CODE:
2415 Mix_UnregisterAllEffects (self); 2421 Mix_UnregisterAllEffects (self);
2416 2422
2417void 2423void
2418set_panning (CFPlus::Channel self, int left, int right) 2424set_panning (DC::Channel self, int left, int right)
2419 CODE: 2425 CODE:
2420 left = CLAMP (left , 0, 255); 2426 left = CLAMP (left , 0, 255);
2421 right = CLAMP (right, 0, 255); 2427 right = CLAMP (right, 0, 255);
2422 Mix_SetPanning (self, left, right); 2428 Mix_SetPanning (self, left, right);
2423 2429
2424void 2430void
2425set_distance (CFPlus::Channel self, int distance) 2431set_distance (DC::Channel self, int distance)
2426 CODE: 2432 CODE:
2427 Mix_SetDistance (self, CLAMP (distance, 0, 255)); 2433 Mix_SetDistance (self, CLAMP (distance, 0, 255));
2428 2434
2429void 2435void
2430set_position (CFPlus::Channel self, int angle, int distance) 2436set_position (DC::Channel self, int angle, int distance)
2431 CODE: 2437 CODE:
2432 2438
2433void 2439void
2434set_position_r (CFPlus::Channel self, int dx, int dy, int maxdistance) 2440set_position_r (DC::Channel self, int dx, int dy, int maxdistance)
2435 CODE: 2441 CODE:
2436{ 2442{
2437 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));
2438 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);
2439 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255)); 2445 Mix_SetPosition (self, angle, CLAMP (distance, 0, 255));
2440} 2446}
2441 2447
2442void 2448void
2443set_reverse_stereo (CFPlus::Channel self, int flip) 2449set_reverse_stereo (DC::Channel self, int flip)
2444 CODE: 2450 CODE:
2445 Mix_SetReverseStereo (self, flip); 2451 Mix_SetReverseStereo (self, flip);
2446 2452
2447MODULE = CFPlus PACKAGE = CFPlus::MixChunk 2453MODULE = Deliantra::Client PACKAGE = DC::MixChunk
2448 2454
2449PROTOTYPES: DISABLE 2455PROTOTYPES: DISABLE
2450 2456
2451CFPlus::MixChunk 2457DC::MixChunk
2452new (SV *class, CFPlus::RW rwops) 2458new (SV *class, DC::RW rwops)
2453 CODE: 2459 CODE:
2454 RETVAL = Mix_LoadWAV_RW (rwops, 1); 2460 RETVAL = Mix_LoadWAV_RW (rwops, 1);
2455 OUTPUT: 2461 OUTPUT:
2456 RETVAL 2462 RETVAL
2457 2463
2458void 2464void
2459DESTROY (CFPlus::MixChunk self) 2465DESTROY (DC::MixChunk self)
2460 CODE: 2466 CODE:
2461 Mix_FreeChunk (self); 2467 Mix_FreeChunk (self);
2462 2468
2463int 2469int
2464volume (CFPlus::MixChunk self, int volume = -1) 2470volume (DC::MixChunk self, int volume = -1)
2465 CODE: 2471 CODE:
2466 if (items > 1) 2472 if (items > 1)
2467 volume = CLAMP (volume, 0, 128); 2473 volume = CLAMP (volume, 0, 128);
2468 RETVAL = Mix_VolumeChunk (self, volume); 2474 RETVAL = Mix_VolumeChunk (self, volume);
2469 OUTPUT: 2475 OUTPUT:
2470 RETVAL 2476 RETVAL
2471 2477
2472CFPlus::Channel 2478DC::Channel
2473play (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)
2474 CODE: 2480 CODE:
2475{ 2481{
2476 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks); 2482 RETVAL = Mix_PlayChannelTimed (channel, self, loops, ticks);
2477 2483
2478 if (RETVAL < 0) 2484 if (RETVAL < 0)
2485 } 2491 }
2486} 2492}
2487 OUTPUT: 2493 OUTPUT:
2488 RETVAL 2494 RETVAL
2489 2495
2490MODULE = CFPlus PACKAGE = CFPlus::MixMusic 2496MODULE = Deliantra::Client PACKAGE = DC::MixMusic
2491 2497
2492int 2498int
2493volume (int volume = -1) 2499volume (int volume = -1)
2494 PROTOTYPE: ;$ 2500 PROTOTYPE: ;$
2495 CODE: 2501 CODE:
2507void 2513void
2508halt () 2514halt ()
2509 CODE: 2515 CODE:
2510 Mix_HaltMusic (); 2516 Mix_HaltMusic ();
2511 2517
2512CFPlus::MixMusic 2518DC::MixMusic
2513new (SV *class, CFPlus::RW rwops) 2519new (SV *class, DC::RW rwops)
2514 CODE: 2520 CODE:
2515 RETVAL = Mix_LoadMUS_RW (rwops); 2521 RETVAL = Mix_LoadMUS_RW (rwops);
2516 OUTPUT: 2522 OUTPUT:
2517 RETVAL 2523 RETVAL
2518 2524
2519void 2525void
2520DESTROY (CFPlus::MixMusic self) 2526DESTROY (DC::MixMusic self)
2521 CODE: 2527 CODE:
2522 Mix_FreeMusic (self); 2528 Mix_FreeMusic (self);
2523 2529
2524int 2530int
2525play (CFPlus::MixMusic self, int loops = -1) 2531play (DC::MixMusic self, int loops = -1)
2526 CODE: 2532 CODE:
2527 RETVAL = Mix_PlayMusic (self, loops); 2533 RETVAL = Mix_PlayMusic (self, loops);
2528 OUTPUT: 2534 OUTPUT:
2529 RETVAL 2535 RETVAL
2530 2536
2531void 2537void
2532fade_in_pos (CFPlus::MixMusic self, int loops, int ms, double position) 2538fade_in_pos (DC::MixMusic self, int loops, int ms, double position)
2533 CODE: 2539 CODE:
2534 Mix_FadeInMusicPos (self, loops, ms, position); 2540 Mix_FadeInMusicPos (self, loops, ms, position);
2535 2541
2536MODULE = CFPlus PACKAGE = CFPlus::OpenGL 2542MODULE = Deliantra::Client PACKAGE = DC::OpenGL
2537 2543
2538PROTOTYPES: ENABLE 2544PROTOTYPES: ENABLE
2539 2545
2540BOOT: 2546BOOT:
2541{ 2547{
2542 HV *stash = gv_stashpv ("CFPlus::OpenGL", 1); 2548 HV *stash = gv_stashpv ("DC::OpenGL", 1);
2543 static const struct { 2549 static const struct {
2544 const char *name; 2550 const char *name;
2545 IV iv; 2551 IV iv;
2546 } *civ, const_iv[] = { 2552 } *civ, const_iv[] = {
2547# define const_iv(name) { # name, (IV)name } 2553# define const_iv(name) { # name, (IV)name }
2876 2882
2877void glEndList () 2883void glEndList ()
2878 2884
2879void glCallList (int list) 2885void glCallList (int list)
2880 2886
2881MODULE = CFPlus PACKAGE = CFPlus::UI::Base 2887MODULE = Deliantra::Client PACKAGE = DC::UI::Base
2882 2888
2883PROTOTYPES: DISABLE 2889PROTOTYPES: DISABLE
2884 2890
2885void 2891void
2886find_widget (SV *self, NV x, NV y) 2892find_widget (SV *self, NV x, NV y)
2890 XPUSHs (self); 2896 XPUSHs (self);
2891} 2897}
2892 2898
2893BOOT: 2899BOOT:
2894{ 2900{
2895 hover_gv = gv_fetchpv ("CFPlus::UI::HOVER", 1, SVt_NV); 2901 hover_gv = gv_fetchpv ("DC::UI::HOVER", 1, SVt_NV);
2896 2902
2897 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);
2898 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);
2899 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);
2900 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);
2901} 2907}
2902 2908
2903void 2909void
2904draw (SV *self) 2910draw (SV *self)
2905 CODE: 2911 CODE:
2912 SV *draw_w_sv = GvSV (draw_w_gv); 2918 SV *draw_w_sv = GvSV (draw_w_gv);
2913 SV *draw_h_sv = GvSV (draw_h_gv); 2919 SV *draw_h_sv = GvSV (draw_h_gv);
2914 double draw_x, draw_y; 2920 double draw_x, draw_y;
2915 2921
2916 if (!SvROK (self)) 2922 if (!SvROK (self))
2917 croak ("CFPlus::Base::draw: %s not a reference", SvPV_nolen (self)); 2923 croak ("DC::Base::draw: %s not a reference", SvPV_nolen (self));
2918 2924
2919 hv = (HV *)SvRV (self); 2925 hv = (HV *)SvRV (self);
2920 2926
2921 if (SvTYPE (hv) != SVt_PVHV) 2927 if (SvTYPE (hv) != SVt_PVHV)
2922 croak ("CFPlus::Base::draw: %s not a hashref", SvPV_nolen (self)); 2928 croak ("DC::Base::draw: %s not a hashref", SvPV_nolen (self));
2923 2929
2924 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.;
2925 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.;
2926 2932
2927 if (!h || !w) 2933 if (!h || !w)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines