- if (registry == Mnil
- || ! strchr (MSYMBOL_NAME (registry), '-'))
- return NULL;
-
- 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 size;
-
- if (sizes == 0)
- {
- size = font->property[MFONT_SIZE];
- score = mfont__score (font, spec, request, limited_size);
- }
- else
- {
- unsigned short orig_size = font->property[MFONT_SIZE];
- int smallest = orig_size / 10;
- int s0, s1;
-
- size = requested_size / 10;
- if (size > 32)
- size = 32;
- /* Find an exact or smaller size. */
- if (size < smallest)
- s0 = 0;
- else
- for (s0 = size;
- s0 > smallest && s0 > 0 && ! HAVE_SIZE (sizes, s0);
- s0--);
- if (s0 == size)
- /* Exact size match. */
- ;
- else if (smallest == 0)
- /* Scalable font exists. */
- size = 0;
- else if (size < smallest)
- {
- /* No smaller size font. Select the smallest one. */
- if (limited_size)
- /* Can't use a larger font. */
- continue;
- size = smallest;
- }
- else if (size < 32)
- {
- /* Check if there's a better larger size font. */
- int largest = size + (size - s0);
-
- if (largest > 33)
- largest = 33;
-
- for (s1 = size + 1;
- s1 < largest && ! HAVE_SIZE (sizes, s1);
- s1++);
- size = (s1 < largest ? s1 : s0);
- }
- size *= 10;
- font->property[MFONT_SIZE] = size;
- 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;
- best_score = score;
- best_font = (MFont *) (xfont_table->fonts + i);
- if (best_score == 0)
- break;
- }
- }
- if (best_score == 0)