- plist = xfont_registry_list (frame, registry);
- if (MPLIST_TAIL_P (plist))
- return NULL;
- best_score = -1, best_font = NULL;
- MPLIST_DO (plist, plist)
- {
- if (family == Mnil || family == MPLIST_KEY (plist))
- {
- MXFontList *xfont_table = MPLIST_VAL (plist);
-
- for (i = 0; i < xfont_table->used; i++)
- {
- MXFont *xfont = xfont_table->fonts + i;
- MFont *font = (MFont *) xfont;
- unsigned int sizes = xfont->sizes;
- int orig_size = font->property[MFONT_SIZE];
- int size;
-
- if (sizes == 0)
- size = orig_size / 10;
- else if (requested_size < xfont->smallest)
- size = orig_size == 0 ? 0 : xfont->smallest;
- else if (requested_size > xfont->largest)
- size = orig_size == 0 ? 0 : xfont->largest;
- else if (HAVE_SIZE (sizes, requested_size))
- size = requested_size;
- else if (orig_size == 0)
- size = 0;
- else
- {
- for (size = requested_size - 1;
- size > xfont->smallest && ! HAVE_SIZE (sizes, size);
- size--);
- if (! limited_size)
- {
- int s;
- for (s = requested_size;
- s < xfont->largest && ! HAVE_SIZE (sizes, s);
- s++);
- if (s - requested_size < requested_size - size)
- size = s;
- }
- }
- font->property[MFONT_SIZE] = size * 10;
- score = mfont__score (font, spec, request, limited_size);
- font->property[MFONT_SIZE] = orig_size;
- if (score >= 0 && (best_score < 0 || score < best_score))
- {
- best_size = size * 10;
- best_score = score;
- best_font = (MFont *) (xfont_table->fonts + i);
- if (best_score == 0)
- break;
- }
- }
- if (best_score == 0)