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));