📄 pangocairo-win32font.c
字号:
static intmax_glyph_width (PangoLayout *layout){ int max_width = 0; GSList *l, *r; for (l = pango_layout_get_lines_readonly (layout); l; l = l->next) { PangoLayoutLine *line = l->data; for (r = line->runs; r; r = r->next) { PangoGlyphString *glyphs = ((PangoGlyphItem *)r->data)->glyphs; int i; for (i = 0; i < glyphs->num_glyphs; i++) if (glyphs->glyphs[i].geometry.width > max_width) max_width = glyphs->glyphs[i].geometry.width; } } return max_width;}static PangoFontMetrics *create_metrics_for_context (PangoFont *font, PangoContext *context){ PangoCairoWin32Font *cwfont = PANGO_CAIRO_WIN32_FONT (font); PangoFontMetrics *metrics; PangoFontDescription *font_desc; PangoLayout *layout; PangoRectangle extents; PangoLanguage *language = pango_context_get_language (context); const char *sample_str = pango_language_get_sample_string (language); cairo_scaled_font_t *scaled_font; cairo_font_extents_t font_extents; double height; metrics = pango_font_metrics_new (); scaled_font = pango_cairo_win32_font_get_scaled_font (PANGO_CAIRO_FONT (cwfont)); cairo_scaled_font_extents (scaled_font, &font_extents); cairo_win32_scaled_font_done_font (scaled_font); metrics->ascent = font_extents.ascent * PANGO_SCALE; metrics->descent = font_extents.descent * PANGO_SCALE; /* FIXME: Should get the real settings for these from the TrueType * font file. */ height = metrics->ascent + metrics->descent; metrics->underline_thickness = height / 14; metrics->underline_position = - metrics->underline_thickness; metrics->strikethrough_thickness = metrics->underline_thickness; metrics->strikethrough_position = height / 4; pango_quantize_line_geometry (&metrics->underline_thickness, &metrics->underline_position); pango_quantize_line_geometry (&metrics->strikethrough_thickness, &metrics->strikethrough_position); layout = pango_layout_new (context); font_desc = pango_font_describe_with_absolute_size (font); pango_layout_set_font_description (layout, font_desc); pango_layout_set_text (layout, sample_str, -1); pango_layout_get_extents (layout, NULL, &extents); metrics->approximate_char_width = extents.width / g_utf8_strlen (sample_str, -1); pango_layout_set_text (layout, "0123456789", -1); metrics->approximate_digit_width = max_glyph_width (layout); pango_font_description_free (font_desc); g_object_unref (layout); return metrics;}static PangoFontMetrics *pango_cairo_win32_font_get_metrics (PangoFont *font, PangoLanguage *language){ PangoWin32Font *win32font = PANGO_WIN32_FONT (font); PangoCairoWin32Font *cwfont = PANGO_CAIRO_WIN32_FONT (font); PangoWin32MetricsInfo *info = NULL; /* Quiet gcc */ GSList *tmp_list; const char *sample_str = pango_language_get_sample_string (language); tmp_list = cwfont->metrics_by_lang; while (tmp_list) { info = tmp_list->data; if (info->sample_str == sample_str) /* We _don't_ need strcmp */ break; tmp_list = tmp_list->next; } if (!tmp_list) { PangoContext *context; if (!win32font->fontmap) return pango_font_metrics_new (); info = g_slice_new0 (PangoWin32MetricsInfo); cwfont->metrics_by_lang = g_slist_prepend (cwfont->metrics_by_lang, info); info->sample_str = sample_str; context = pango_context_new (); pango_context_set_font_map (context, win32font->fontmap); pango_context_set_language (context, language); pango_cairo_context_set_font_options (context, cwfont->options); info->metrics = create_metrics_for_context (font, context); g_object_unref (context); } return pango_font_metrics_ref (info->metrics);}static gbooleanpango_cairo_win32_font_select_font (PangoFont *font, HDC hdc){ cairo_scaled_font_t *scaled_font = pango_cairo_win32_font_get_scaled_font (PANGO_CAIRO_FONT (font)); return cairo_win32_scaled_font_select_font (scaled_font, hdc) == CAIRO_STATUS_SUCCESS;}static voidpango_cairo_win32_font_done_font (PangoFont *font){ cairo_scaled_font_t *scaled_font = pango_cairo_win32_font_get_scaled_font (PANGO_CAIRO_FONT (font)); cairo_win32_scaled_font_done_font (scaled_font);}static doublepango_cairo_win32_font_get_metrics_factor (PangoFont *font){ PangoWin32Font *win32font = PANGO_WIN32_FONT (font); cairo_scaled_font_t *scaled_font = pango_cairo_win32_font_get_scaled_font (PANGO_CAIRO_FONT (font)); return cairo_win32_scaled_font_get_metrics_factor (scaled_font) * win32font->size;}static voidpango_cairo_win32_font_class_init (PangoCairoWin32FontClass *class){ GObjectClass *object_class = G_OBJECT_CLASS (class); PangoFontClass *font_class = PANGO_FONT_CLASS (class); PangoWin32FontClass *win32_font_class = PANGO_WIN32_FONT_CLASS (class); object_class->finalize = pango_cairo_win32_font_finalize; font_class->get_glyph_extents = pango_cairo_win32_font_get_glyph_extents; font_class->get_metrics = pango_cairo_win32_font_get_metrics; win32_font_class->select_font = pango_cairo_win32_font_select_font; win32_font_class->done_font = pango_cairo_win32_font_done_font; win32_font_class->get_metrics_factor = pango_cairo_win32_font_get_metrics_factor;}static voidpango_cairo_win32_font_init (PangoCairoWin32Font *cwfont){ cwfont->glyph_info = g_hash_table_new_full (g_direct_hash, NULL, NULL, (GDestroyNotify)g_free);}/******************** * Private API * ********************/PangoFont *_pango_cairo_win32_font_new (PangoCairoWin32FontMap *cwfontmap, PangoContext *context, PangoWin32Face *face, const PangoFontDescription *desc){ PangoCairoWin32Font *cwfont; PangoWin32Font *win32font; const PangoMatrix *pango_ctm; double size; double dpi;#define USE_FACE_CACHED_FONTS#ifdef USE_FACE_CACHED_FONTS PangoWin32FontMap *win32fontmap; GSList *tmp_list;#endif g_return_val_if_fail (PANGO_IS_CAIRO_WIN32_FONT_MAP (cwfontmap), NULL); size = (double) pango_font_description_get_size (desc) / PANGO_SCALE; if (context) { dpi = pango_cairo_context_get_resolution (context); if (dpi <= 0) dpi = cwfontmap->dpi; } else dpi = cwfontmap->dpi; if (!pango_font_description_get_size_is_absolute (desc)) size *= dpi / 72.;#ifdef USE_FACE_CACHED_FONTS win32fontmap = PANGO_WIN32_FONT_MAP (cwfontmap); tmp_list = face->cached_fonts; while (tmp_list) { win32font = tmp_list->data; if (ABS (win32font->size - size * PANGO_SCALE) < 2) { g_object_ref (win32font); if (win32font->in_cache) pango_win32_fontmap_cache_remove (PANGO_FONT_MAP (win32fontmap), win32font); return PANGO_FONT (win32font); } tmp_list = tmp_list->next; }#endif cwfont = g_object_new (PANGO_TYPE_CAIRO_WIN32_FONT, NULL); win32font = PANGO_WIN32_FONT (cwfont); win32font->fontmap = PANGO_FONT_MAP (cwfontmap); g_object_ref (cwfontmap); win32font->win32face = face;#ifdef USE_FACE_CACHED_FONTS face->cached_fonts = g_slist_prepend (face->cached_fonts, win32font);#endif /* FIXME: This is a pixel size, so not really what we want for describe(), * but it's what we need when computing the scale factor. */ win32font->size = size * PANGO_SCALE; cairo_matrix_init_scale (&cwfont->font_matrix, size, size); pango_ctm = pango_context_get_matrix (context); if (pango_ctm) cairo_matrix_init (&cwfont->ctm, pango_ctm->xx, pango_ctm->yx, pango_ctm->xy, pango_ctm->yy, 0., 0.); else cairo_matrix_init_identity (&cwfont->ctm); pango_win32_make_matching_logfont (win32font->fontmap, &face->logfont, win32font->size, &win32font->logfont); cwfont->options = cairo_font_options_copy (_pango_cairo_context_get_merged_font_options (context)); return PANGO_FONT (cwfont);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -