… | |
… | |
185 | |
185 | |
186 | static void |
186 | static void |
187 | layout_update_font (DC__Layout self) |
187 | layout_update_font (DC__Layout self) |
188 | { |
188 | { |
189 | /* use a random scale factor to account for unknown descenders, 0.8 works |
189 | /* use a random scale factor to account for unknown descenders, 0.8 works |
190 | * reasonably well with bitstream vera |
190 | * reasonably well with dejavu/bistream fonts |
191 | */ |
191 | */ |
192 | PangoFontDescription *font = self->font ? self->font : default_font; |
192 | PangoFontDescription *font = self->font ? self->font : default_font; |
193 | |
193 | |
194 | pango_font_description_set_absolute_size (font, |
194 | pango_font_description_set_absolute_size (font, |
195 | MAX (MIN_FONT_HEIGHT, self->base_height) * (PANGO_SCALE * 8 / 10)); |
195 | MAX (MIN_FONT_HEIGHT, self->base_height) * (PANGO_SCALE * 8 / 10)); |
… | |
… | |
673 | CODE: |
673 | CODE: |
674 | { |
674 | { |
675 | opengl_fontmap = pango_opengl_font_map_new (); |
675 | opengl_fontmap = pango_opengl_font_map_new (); |
676 | pango_opengl_font_map_set_default_substitute ((PangoOpenGLFontMap *)opengl_fontmap, substitute_func, 0, 0); |
676 | pango_opengl_font_map_set_default_substitute ((PangoOpenGLFontMap *)opengl_fontmap, substitute_func, 0, 0); |
677 | opengl_context = pango_opengl_font_map_create_context ((PangoOpenGLFontMap *)opengl_fontmap); |
677 | opengl_context = pango_opengl_font_map_create_context ((PangoOpenGLFontMap *)opengl_fontmap); |
|
|
678 | /*pango_context_set_font_description (opengl_context, default_font);*/ |
678 | #if PANGO_VERSION_CHECK (1, 15, 2) |
679 | #if PANGO_VERSION_CHECK (1, 15, 2) |
679 | pango_context_set_language (opengl_context, pango_language_from_string ("en")); |
680 | pango_context_set_language (opengl_context, pango_language_from_string ("en")); |
680 | /*pango_context_set_base_dir (opengl_context, PANGO_DIRECTION_WEAK_LTR);*/ |
681 | /*pango_context_set_base_dir (opengl_context, PANGO_DIRECTION_WEAK_LTR);*/ |
681 | #endif |
682 | #endif |
682 | } |
683 | } |
… | |
… | |
915 | } |
916 | } |
916 | } |
917 | } |
917 | #endif |
918 | #endif |
918 | } |
919 | } |
919 | |
920 | |
920 | void |
921 | int |
921 | add_font (char *file) |
922 | add_font (char *file) |
922 | CODE: |
923 | CODE: |
923 | FcConfigAppFontAddFile (0, (const FcChar8 *)file); |
924 | RETVAL = FcConfigAppFontAddFile (0, (const FcChar8 *)file); |
|
|
925 | OUTPUT: |
|
|
926 | RETVAL |
924 | |
927 | |
925 | void |
928 | void |
926 | load_image_inline (SV *image_) |
929 | load_image_inline (SV *image_) |
927 | ALIAS: |
930 | ALIAS: |
928 | load_image_file = 1 |
931 | load_image_file = 1 |
… | |
… | |
2289 | else |
2292 | else |
2290 | *data++ = 0; |
2293 | *data++ = 0; |
2291 | } |
2294 | } |
2292 | } |
2295 | } |
2293 | |
2296 | |
|
|
2297 | if (data - (uint8_t *)SvPVX (data_sv) == w * h + 5) |
|
|
2298 | { |
|
|
2299 | SvREFCNT_dec (data_sv); |
|
|
2300 | RETVAL = &PL_sv_undef; |
|
|
2301 | } |
|
|
2302 | else |
|
|
2303 | { |
2294 | SvPOK_only (data_sv); |
2304 | SvPOK_only (data_sv); |
2295 | SvCUR_set (data_sv, data - (uint8_t *)SvPVX (data_sv)); |
2305 | SvCUR_set (data_sv, data - (uint8_t *)SvPVX (data_sv)); |
2296 | RETVAL = data_sv; |
2306 | RETVAL = data_sv; |
|
|
2307 | } |
2297 | } |
2308 | } |
2298 | OUTPUT: |
2309 | OUTPUT: |
2299 | RETVAL |
2310 | RETVAL |
2300 | |
2311 | |
2301 | void |
2312 | void |
2302 | set_rect (DC::Map self, int x0, int y0, uint8_t *data) |
2313 | set_rect (DC::Map self, int x0, int y0, SV *data_sv) |
2303 | PPCODE: |
2314 | PPCODE: |
2304 | { |
2315 | { |
2305 | int x, y, z; |
2316 | int x, y, z; |
2306 | int w, h; |
2317 | int w, h; |
2307 | int x1, y1; |
2318 | int x1, y1; |
|
|
2319 | STRLEN len; |
|
|
2320 | uint8_t *data, *end; |
|
|
2321 | |
|
|
2322 | len = SvLEN (data_sv); |
|
|
2323 | SvGROW (data_sv, len + 7); // reserve at least 7+ bytes more |
|
|
2324 | data = SvPVbyte_nolen (data_sv); |
|
|
2325 | end = data + len + 7; |
|
|
2326 | |
|
|
2327 | if (len < 5) |
|
|
2328 | XSRETURN_EMPTY; |
2308 | |
2329 | |
2309 | if (*data++ != 0) |
2330 | if (*data++ != 0) |
2310 | XSRETURN_EMPTY; /* version mismatch */ |
2331 | XSRETURN_EMPTY; /* version mismatch */ |
2311 | |
2332 | |
2312 | w = *data++ << 8; w |= *data++; |
2333 | w = *data++ << 8; w |= *data++; |
… | |
… | |
2327 | { |
2348 | { |
2328 | maprow *row = map_get_row (self, y); |
2349 | maprow *row = map_get_row (self, y); |
2329 | |
2350 | |
2330 | for (x = x0; x < x1; x++) |
2351 | for (x = x0; x < x1; x++) |
2331 | { |
2352 | { |
|
|
2353 | uint8_t flags; |
|
|
2354 | |
|
|
2355 | if (data + 7 >= end) |
|
|
2356 | XSRETURN_EMPTY; |
|
|
2357 | |
2332 | uint8_t flags = *data++; |
2358 | flags = *data++; |
2333 | |
2359 | |
2334 | if (flags) |
2360 | if (flags) |
2335 | { |
2361 | { |
2336 | mapcell *cell = row_get_cell (row, x); |
2362 | mapcell *cell = row_get_cell (row, x); |
2337 | tileid tile[3] = { 0, 0, 0 }; |
2363 | tileid tile[3] = { 0, 0, 0 }; |