Mercurial > emacs
comparison src/font.c @ 91909:a549624ad4bc
Include xterm.h.
[HAVE_NTGUI]: Include w32term.h.
[MAC_OS]: Include macterm.ch.
(font_otf_ValueRecord): Use make_number.
(font_finish_cache): Fix handling of reference count.
(font_clear_cache): Update num_fonts.
(font_open_entity): Update smallest_char_width and
smallest_font_height of the frame.
(font_close_object): Update num_fonts.
(Fclear_font_cache): Fix finding the target cache data.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Sun, 17 Feb 2008 02:03:58 +0000 |
parents | 436548f01688 |
children | c5e5ad126614 |
comparison
equal
deleted
inserted
replaced
91908:6916adc8df33 | 91909:a549624ad4bc |
---|---|
37 #include "charset.h" | 37 #include "charset.h" |
38 #include "character.h" | 38 #include "character.h" |
39 #include "composite.h" | 39 #include "composite.h" |
40 #include "fontset.h" | 40 #include "fontset.h" |
41 #include "font.h" | 41 #include "font.h" |
42 | |
43 #ifdef HAVE_X_WINDOWS | |
44 #include "xterm.h" | |
45 #endif /* HAVE_X_WINDOWS */ | |
46 | |
47 #ifdef HAVE_NTGUI | |
48 #include "w32term.h" | |
49 #endif /* HAVE_NTGUI */ | |
50 | |
51 #ifdef MAC_OS | |
52 #include "macterm.h" | |
53 #endif /* MAC_OS */ | |
42 | 54 |
43 #ifndef FONT_DEBUG | 55 #ifndef FONT_DEBUG |
44 #define FONT_DEBUG | 56 #define FONT_DEBUG |
45 #endif | 57 #endif |
46 | 58 |
1813 OTF_ValueRecord *value_record; | 1825 OTF_ValueRecord *value_record; |
1814 { | 1826 { |
1815 Lisp_Object val = Fmake_vector (make_number (8), Qnil); | 1827 Lisp_Object val = Fmake_vector (make_number (8), Qnil); |
1816 | 1828 |
1817 if (value_format & OTF_XPlacement) | 1829 if (value_format & OTF_XPlacement) |
1818 ASET (val, 0, value_record->XPlacement); | 1830 ASET (val, 0, make_number (value_record->XPlacement)); |
1819 if (value_format & OTF_YPlacement) | 1831 if (value_format & OTF_YPlacement) |
1820 ASET (val, 1, value_record->YPlacement); | 1832 ASET (val, 1, make_number (value_record->YPlacement)); |
1821 if (value_format & OTF_XAdvance) | 1833 if (value_format & OTF_XAdvance) |
1822 ASET (val, 2, value_record->XAdvance); | 1834 ASET (val, 2, make_number (value_record->XAdvance)); |
1823 if (value_format & OTF_YAdvance) | 1835 if (value_format & OTF_YAdvance) |
1824 ASET (val, 3, value_record->YAdvance); | 1836 ASET (val, 3, make_number (value_record->YAdvance)); |
1825 if (value_format & OTF_XPlaDevice) | 1837 if (value_format & OTF_XPlaDevice) |
1826 ASET (val, 4, font_otf_DeviceTable (&value_record->XPlaDevice)); | 1838 ASET (val, 4, font_otf_DeviceTable (&value_record->XPlaDevice)); |
1827 if (value_format & OTF_YPlaDevice) | 1839 if (value_format & OTF_YPlaDevice) |
1828 ASET (val, 4, font_otf_DeviceTable (&value_record->YPlaDevice)); | 1840 ASET (val, 4, font_otf_DeviceTable (&value_record->YPlaDevice)); |
1829 if (value_format & OTF_XAdvDevice) | 1841 if (value_format & OTF_XAdvDevice) |
2195 val = XCDR (XCAR (val)); | 2207 val = XCDR (XCAR (val)); |
2196 XSETCAR (val, make_number (XINT (XCAR (val)) + 1)); | 2208 XSETCAR (val, make_number (XINT (XCAR (val)) + 1)); |
2197 } | 2209 } |
2198 } | 2210 } |
2199 | 2211 |
2212 | |
2200 static void | 2213 static void |
2201 font_finish_cache (f, driver) | 2214 font_finish_cache (f, driver) |
2202 FRAME_PTR f; | 2215 FRAME_PTR f; |
2203 struct font_driver *driver; | 2216 struct font_driver *driver; |
2204 { | 2217 { |
2209 val = XCDR (cache); | 2222 val = XCDR (cache); |
2210 while (CONSP (val) && ! EQ (XCAR (XCAR (val)), driver->type)) | 2223 while (CONSP (val) && ! EQ (XCAR (XCAR (val)), driver->type)) |
2211 cache = val, val = XCDR (val); | 2224 cache = val, val = XCDR (val); |
2212 xassert (! NILP (val)); | 2225 xassert (! NILP (val)); |
2213 tmp = XCDR (XCAR (val)); | 2226 tmp = XCDR (XCAR (val)); |
2227 XSETCAR (tmp, make_number (XINT (XCAR (tmp)) - 1)); | |
2214 if (XINT (XCAR (tmp)) == 0) | 2228 if (XINT (XCAR (tmp)) == 0) |
2215 { | 2229 { |
2216 font_clear_cache (f, XCAR (val), driver); | 2230 font_clear_cache (f, XCAR (val), driver); |
2217 XSETCDR (cache, XCDR (val)); | 2231 XSETCDR (cache, XCDR (val)); |
2218 } | 2232 } |
2219 else | 2233 } |
2220 { | 2234 |
2221 XSETCAR (tmp, make_number (XINT (XCAR (tmp)) - 1)); | |
2222 } | |
2223 } | |
2224 | 2235 |
2225 static Lisp_Object | 2236 static Lisp_Object |
2226 font_get_cache (f, driver) | 2237 font_get_cache (f, driver) |
2227 FRAME_PTR f; | 2238 FRAME_PTR f; |
2228 struct font_driver *driver; | 2239 struct font_driver *driver; |
2236 /* VAL = ((DRIVER-TYPE NUM-FRAMES FONT-CACHE-DATA ...) ...) */ | 2247 /* VAL = ((DRIVER-TYPE NUM-FRAMES FONT-CACHE-DATA ...) ...) */ |
2237 val = XCDR (XCAR (val)); | 2248 val = XCDR (XCAR (val)); |
2238 return val; | 2249 return val; |
2239 } | 2250 } |
2240 | 2251 |
2252 static int num_fonts; | |
2253 | |
2241 static void | 2254 static void |
2242 font_clear_cache (f, cache, driver) | 2255 font_clear_cache (f, cache, driver) |
2243 FRAME_PTR f; | 2256 FRAME_PTR f; |
2244 Lisp_Object cache; | 2257 Lisp_Object cache; |
2245 struct font_driver *driver; | 2258 struct font_driver *driver; |
2271 | 2284 |
2272 xassert (font && driver == font->driver); | 2285 xassert (font && driver == font->driver); |
2273 driver->close (f, font); | 2286 driver->close (f, font); |
2274 p->pointer = NULL; | 2287 p->pointer = NULL; |
2275 p->integer = 0; | 2288 p->integer = 0; |
2289 num_fonts--; | |
2276 } | 2290 } |
2277 if (driver->free_entity) | 2291 if (driver->free_entity) |
2278 driver->free_entity (entity); | 2292 driver->free_entity (entity); |
2279 } | 2293 } |
2280 } | 2294 } |
2404 ASET (spec, FONT_TYPE_INDEX, ftype); | 2418 ASET (spec, FONT_TYPE_INDEX, ftype); |
2405 ASET (spec, FONT_SIZE_INDEX, size); | 2419 ASET (spec, FONT_SIZE_INDEX, size); |
2406 return entity; | 2420 return entity; |
2407 } | 2421 } |
2408 | 2422 |
2409 static int num_fonts; | |
2410 | |
2411 | 2423 |
2412 /* Open a font of ENTITY and PIXEL_SIZE on frame F, and return the | 2424 /* Open a font of ENTITY and PIXEL_SIZE on frame F, and return the |
2413 opened font object. */ | 2425 opened font object. */ |
2414 | 2426 |
2415 static Lisp_Object | 2427 static Lisp_Object |
2417 FRAME_PTR f; | 2429 FRAME_PTR f; |
2418 Lisp_Object entity; | 2430 Lisp_Object entity; |
2419 int pixel_size; | 2431 int pixel_size; |
2420 { | 2432 { |
2421 struct font_driver_list *driver_list; | 2433 struct font_driver_list *driver_list; |
2422 Lisp_Object objlist, size, val; | 2434 Lisp_Object objlist, size, val, font_object; |
2423 struct font *font; | 2435 struct font *font; |
2424 | 2436 |
2425 size = AREF (entity, FONT_SIZE_INDEX); | 2437 size = AREF (entity, FONT_SIZE_INDEX); |
2426 xassert (NATNUMP (size)); | 2438 xassert (NATNUMP (size)); |
2427 if (XINT (size) != 0) | 2439 if (XINT (size) != 0) |
2428 pixel_size = XINT (size); | 2440 pixel_size = XINT (size); |
2429 | 2441 |
2442 font_object = Qnil; | |
2430 for (objlist = AREF (entity, FONT_OBJLIST_INDEX); CONSP (objlist); | 2443 for (objlist = AREF (entity, FONT_OBJLIST_INDEX); CONSP (objlist); |
2431 objlist = XCDR (objlist)) | 2444 objlist = XCDR (objlist)) |
2432 { | 2445 { |
2433 font = XSAVE_VALUE (XCAR (objlist))->pointer; | 2446 font = XSAVE_VALUE (XCAR (objlist))->pointer; |
2434 if (font->pixel_size == pixel_size) | 2447 if (font->pixel_size == pixel_size) |
2435 { | 2448 { |
2436 XSAVE_VALUE (XCAR (objlist))->integer++; | 2449 font_object = XCAR (objlist); |
2437 return XCAR (objlist); | 2450 XSAVE_VALUE (font_object)->integer++; |
2438 } | 2451 break; |
2439 } | 2452 } |
2440 | 2453 } |
2441 xassert (FONT_ENTITY_P (entity)); | 2454 |
2442 val = AREF (entity, FONT_TYPE_INDEX); | 2455 if (NILP (font_object)) |
2443 for (driver_list = f->font_driver_list; | 2456 { |
2444 driver_list && ! EQ (driver_list->driver->type, val); | 2457 val = AREF (entity, FONT_TYPE_INDEX); |
2445 driver_list = driver_list->next); | 2458 for (driver_list = f->font_driver_list; |
2446 if (! driver_list) | 2459 driver_list && ! EQ (driver_list->driver->type, val); |
2447 return Qnil; | 2460 driver_list = driver_list->next); |
2448 | 2461 if (! driver_list) |
2449 font = driver_list->driver->open (f, entity, pixel_size); | 2462 return Qnil; |
2450 if (! font) | 2463 |
2451 return Qnil; | 2464 font = driver_list->driver->open (f, entity, pixel_size); |
2452 font->scalable = XINT (size) == 0; | 2465 if (! font) |
2453 | 2466 return Qnil; |
2454 val = make_save_value (font, 1); | 2467 font->scalable = XINT (size) == 0; |
2455 ASET (entity, FONT_OBJLIST_INDEX, | 2468 |
2456 Fcons (val, AREF (entity, FONT_OBJLIST_INDEX))); | 2469 font_object = make_save_value (font, 1); |
2457 num_fonts++; | 2470 ASET (entity, FONT_OBJLIST_INDEX, |
2458 return val; | 2471 Fcons (font_object, AREF (entity, FONT_OBJLIST_INDEX))); |
2472 num_fonts++; | |
2473 } | |
2474 | |
2475 if (FRAME_SMALLEST_CHAR_WIDTH (f) > font->min_width) | |
2476 FRAME_SMALLEST_CHAR_WIDTH (f) = font->min_width; | |
2477 if (FRAME_SMALLEST_CHAR_WIDTH (f) <= 0) | |
2478 FRAME_SMALLEST_CHAR_WIDTH (f) = 1; | |
2479 if (FRAME_SMALLEST_FONT_HEIGHT (f) > font->font.height) | |
2480 FRAME_SMALLEST_FONT_HEIGHT (f) = font->font.height; | |
2481 if (FRAME_SMALLEST_FONT_HEIGHT (f) <= 0) | |
2482 FRAME_SMALLEST_FONT_HEIGHT (f) = 1; | |
2483 | |
2484 return font_object; | |
2459 } | 2485 } |
2460 | 2486 |
2461 | 2487 |
2462 /* Close FONT_OBJECT that is opened on frame F. */ | 2488 /* Close FONT_OBJECT that is opened on frame F. */ |
2463 | 2489 |
2468 { | 2494 { |
2469 struct font *font = XSAVE_VALUE (font_object)->pointer; | 2495 struct font *font = XSAVE_VALUE (font_object)->pointer; |
2470 Lisp_Object objlist; | 2496 Lisp_Object objlist; |
2471 Lisp_Object tail, prev = Qnil; | 2497 Lisp_Object tail, prev = Qnil; |
2472 | 2498 |
2499 xassert (XSAVE_VALUE (font_object)->integer > 0); | |
2473 XSAVE_VALUE (font_object)->integer--; | 2500 XSAVE_VALUE (font_object)->integer--; |
2474 xassert (XSAVE_VALUE (font_object)->integer >= 0); | |
2475 if (XSAVE_VALUE (font_object)->integer > 0) | 2501 if (XSAVE_VALUE (font_object)->integer > 0) |
2476 return; | 2502 return; |
2477 | 2503 |
2478 objlist = AREF (font->entity, FONT_OBJLIST_INDEX); | 2504 objlist = AREF (font->entity, FONT_OBJLIST_INDEX); |
2479 for (prev = Qnil, tail = objlist; CONSP (tail); | 2505 for (prev = Qnil, tail = objlist; CONSP (tail); |
2485 XSAVE_VALUE (font_object)->pointer = NULL; | 2511 XSAVE_VALUE (font_object)->pointer = NULL; |
2486 if (NILP (prev)) | 2512 if (NILP (prev)) |
2487 ASET (font->entity, FONT_OBJLIST_INDEX, XCDR (objlist)); | 2513 ASET (font->entity, FONT_OBJLIST_INDEX, XCDR (objlist)); |
2488 else | 2514 else |
2489 XSETCDR (prev, XCDR (objlist)); | 2515 XSETCDR (prev, XCDR (objlist)); |
2516 num_fonts--; | |
2490 return; | 2517 return; |
2491 } | 2518 } |
2492 abort (); | 2519 abort (); |
2493 } | 2520 } |
2494 | 2521 |
3362 { | 3389 { |
3363 Lisp_Object cache = driver_list->driver->get_cache (f); | 3390 Lisp_Object cache = driver_list->driver->get_cache (f); |
3364 Lisp_Object val; | 3391 Lisp_Object val; |
3365 | 3392 |
3366 val = XCDR (cache); | 3393 val = XCDR (cache); |
3367 while (! EQ (XCAR (val), driver_list->driver->type)) | 3394 while (! NILP (val) |
3395 && ! EQ (XCAR (XCAR (val)), driver_list->driver->type)) | |
3368 val = XCDR (val); | 3396 val = XCDR (val); |
3397 xassert (! NILP (val)); | |
3369 val = XCDR (XCAR (val)); | 3398 val = XCDR (XCAR (val)); |
3370 if (XINT (XCAR (val)) == 0) | 3399 if (XINT (XCAR (val)) == 0) |
3371 { | 3400 { |
3372 font_clear_cache (f, XCAR (val), driver_list->driver); | 3401 font_clear_cache (f, XCAR (val), driver_list->driver); |
3373 XSETCDR (cache, XCDR (val)); | 3402 XSETCDR (cache, XCDR (val)); |