📄 pango-context.c
字号:
}/** * pango_context_get_base_dir: * @context: a #PangoContext * * Retrieves the base direction for the context. See * pango_context_set_base_dir(). * * Return value: the base direction for the context. **/PangoDirectionpango_context_get_base_dir (PangoContext *context){ g_return_val_if_fail (context != NULL, PANGO_DIRECTION_LTR); return context->base_dir;}/** * pango_context_set_base_gravity: * @context: a #PangoContext * @gravity: the new base gravity * * Sets the base gravity for the context. * * The base gravity is used in laying vertical text out. * * Since: 1.16 **/voidpango_context_set_base_gravity (PangoContext *context, PangoGravity gravity){ g_return_if_fail (context != NULL); context->base_gravity = gravity; update_resolved_gravity (context);}/** * pango_context_get_base_gravity: * @context: a #PangoContext * * Retrieves the base gravity for the context. See * pango_context_set_base_gravity(). * * Return value: the base gravity for the context. * * Since: 1.16 **/PangoGravitypango_context_get_base_gravity (PangoContext *context){ g_return_val_if_fail (context != NULL, PANGO_GRAVITY_SOUTH); return context->base_gravity;}/** * pango_context_get_gravity: * @context: a #PangoContext * * Retrieves the gravity for the context. This is similar to * pango_context_get_base_gravity(), except for when the base gravity * is %PANGO_GRAVITY_AUTO for which pango_gravity_get_for_matrix() is used * to return the gravity from the current context matrix. * * Return value: the resolved gravity for the context. * * Since: 1.16 **/PangoGravitypango_context_get_gravity (PangoContext *context){ g_return_val_if_fail (context != NULL, PANGO_GRAVITY_SOUTH); return context->resolved_gravity;}/** * pango_context_set_gravity_hint: * @context: a #PangoContext * @hint: the new gravity hint * * Sets the gravity hint for the context. * * The gravity hint is used in laying vertical text out, and is only relevant * if gravity of the context as returned by pango_context_get_gravity() * is set %PANGO_GRAVITY_EAST or %PANGO_GRAVITY_WEST. * * Since: 1.16 **/voidpango_context_set_gravity_hint (PangoContext *context, PangoGravityHint hint){ g_return_if_fail (context != NULL); context->gravity_hint = hint;}/** * pango_context_get_gravity_hint: * @context: a #PangoContext * * Retrieves the gravity hint for the context. See * pango_context_set_gravity_hint() for details. * * Return value: the gravity hint for the context. * * Since: 1.16 **/PangoGravityHintpango_context_get_gravity_hint (PangoContext *context){ g_return_val_if_fail (context != NULL, PANGO_GRAVITY_HINT_NATURAL); return context->gravity_hint;}/**********************************************************************/static gbooleanadvance_attr_iterator_to (PangoAttrIterator *iterator, int start_index){ int start_range, end_range; pango_attr_iterator_range (iterator, &start_range, &end_range); while (start_index >= end_range) { if (!pango_attr_iterator_next (iterator)) return FALSE; pango_attr_iterator_range (iterator, &start_range, &end_range); } if (start_range > start_index) g_warning ("In pango_itemize(), the cached iterator passed in " "had already moved beyond the start_index"); return TRUE;}/*************************************************************************** * We cache the results of character,fontset => font,shaper in a hash table ***************************************************************************/typedef struct { GHashTable *hash;} ShaperFontCache;typedef struct { PangoEngineShape *shape_engine; PangoFont *font;} ShaperFontElement;static voidshaper_font_cache_destroy (ShaperFontCache *cache){ g_hash_table_destroy (cache->hash); g_slice_free (ShaperFontCache, cache);}static voidshaper_font_element_destroy (ShaperFontElement *element){ if (element->font) g_object_unref (element->font); g_slice_free (ShaperFontElement, element);}static ShaperFontCache *get_shaper_font_cache (PangoFontset *fontset){ ShaperFontCache *cache; static GQuark cache_quark = 0; if (!cache_quark) cache_quark = g_quark_from_static_string ("pango-shaper-font-cache"); cache = g_object_get_qdata (G_OBJECT (fontset), cache_quark); if (!cache) { cache = g_slice_new (ShaperFontCache); cache->hash = g_hash_table_new_full (g_direct_hash, NULL, NULL, (GDestroyNotify)shaper_font_element_destroy); g_object_set_qdata_full (G_OBJECT (fontset), cache_quark, cache, (GDestroyNotify)shaper_font_cache_destroy); } return cache;}static gbooleanshaper_font_cache_get (ShaperFontCache *cache, gunichar wc, PangoEngineShape **shape_engine, PangoFont **font){ ShaperFontElement *element; element = g_hash_table_lookup (cache->hash, GUINT_TO_POINTER (wc)); if (element) { *shape_engine = element->shape_engine; *font = element->font; return TRUE; } else return FALSE;}static voidshaper_font_cache_insert (ShaperFontCache *cache, gunichar wc, PangoEngineShape *shape_engine, PangoFont *font){ ShaperFontElement *element = g_slice_new (ShaperFontElement); element->shape_engine = shape_engine; element->font = font; g_hash_table_insert (cache->hash, GUINT_TO_POINTER (wc), element);}/**********************************************************************/typedef enum { EMBEDDING_CHANGED = 1 << 0, SCRIPT_CHANGED = 1 << 1, LANG_CHANGED = 1 << 2, FONT_CHANGED = 1 << 3, DERIVED_LANG_CHANGED = 1 << 4} ChangedFlags;typedef struct _ItemizeState ItemizeState;struct _ItemizeState{ PangoContext *context; const char *text; const char *end; const char *run_start; const char *run_end; GList *result; PangoItem *item; guint8 *embedding_levels; int embedding_end_offset; const char *embedding_end; guint8 embedding; PangoGravity gravity; PangoGravityHint gravity_hint; PangoGravity resolved_gravity; PangoGravity font_desc_gravity; gboolean centered_baseline; PangoAttrIterator *attr_iter; gboolean free_attr_iter; const char *attr_end; PangoFontDescription *font_desc; PangoLanguage *lang; GSList *extra_attrs; gboolean copy_extra_attrs; ChangedFlags changed; PangoScriptIter *script_iter; const char *script_end; PangoScript script; PangoLanguage *derived_lang; PangoEngineLang *lang_engine; PangoFontset *current_fonts; ShaperFontCache *cache; PangoFont *base_font; gboolean enable_fallback; GSList *exact_engines; GSList *fallback_engines;};static voidupdate_embedding_end (ItemizeState *state){ state->embedding = state->embedding_levels[state->embedding_end_offset]; while (state->embedding_end < state->end && state->embedding_levels[state->embedding_end_offset] == state->embedding) { state->embedding_end_offset++; state->embedding_end = g_utf8_next_char (state->embedding_end); } state->changed |= EMBEDDING_CHANGED;}static PangoAttribute *find_attribute (GSList *attr_list, PangoAttrType type){ GSList *node; for (node = attr_list; node; node = node->next) if (((PangoAttribute *) node->data)->klass->type == type) return (PangoAttribute *) node->data; return NULL;}static voidupdate_attr_iterator (ItemizeState *state){ PangoLanguage *old_lang; PangoAttribute *attr; int end_index; pango_attr_iterator_range (state->attr_iter, NULL, &end_index); if (end_index < state->end - state->text) state->attr_end = state->text + end_index; else state->attr_end = state->end; old_lang = state->lang; if (state->font_desc) pango_font_description_free (state->font_desc); state->font_desc = pango_font_description_copy_static (state->context->font_desc); pango_attr_iterator_get_font (state->attr_iter, state->font_desc, &state->lang, &state->extra_attrs); if (pango_font_description_get_set_fields (state->font_desc) & PANGO_FONT_MASK_GRAVITY) state->font_desc_gravity = pango_font_description_get_gravity (state->font_desc); else state->font_desc_gravity = PANGO_GRAVITY_AUTO; state->copy_extra_attrs = FALSE; if (!state->lang) state->lang = state->context->language; attr = find_attribute (state->extra_attrs, PANGO_ATTR_FALLBACK); state->enable_fallback = (attr == NULL || ((PangoAttrInt *)attr)->value); attr = find_attribute (state->extra_attrs, PANGO_ATTR_GRAVITY); state->gravity = attr == NULL ? PANGO_GRAVITY_AUTO : ((PangoAttrInt *)attr)->value; attr = find_attribute (state->extra_attrs, PANGO_ATTR_GRAVITY_HINT); state->gravity_hint = attr == NULL ? state->context->gravity_hint : ((PangoAttrInt *)attr)->value; state->changed |= FONT_CHANGED; if (state->lang != old_lang) state->changed |= LANG_CHANGED;}static voidupdate_end (ItemizeState *state){ state->run_end = state->embedding_end; if (state->attr_end < state->run_end) state->run_end = state->attr_end; if (state->script_end < state->run_end) state->run_end = state->script_end;}static voiditemize_state_init (ItemizeState *state, PangoContext *context, const char *text, PangoDirection base_dir, int start_index, int length, PangoAttrList *attrs, PangoAttrIterator *cached_iter, const PangoFontDescription *desc){ state->context = context; state->text = text; state->end = text + start_index + length; state->result = NULL; state->item = NULL; state->run_start = text + start_index; /* First, apply the bidirectional algorithm to break * the text into directional runs. */ state->embedding_levels = pango_log2vis_get_embedding_levels (text + start_index, length, &base_dir); state->embedding_end_offset = 0; state->embedding_end = text + start_index; update_embedding_end (state); /* Initialize the attribute iterator */ if (cached_iter) { state->attr_iter = cached_iter; state->free_attr_iter = FALSE; } else if (attrs) { state->attr_iter = pango_attr_list_get_iterator (attrs);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -