⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pango-context.c

📁 linux
💻 C
📖 第 1 页 / 共 4 页
字号:
}/** * 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 + -