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

📄 basic-x.c

📁 Pango is a library for layout and rendering of text, with an emphasis on internationalization. Pang
💻 C
📖 第 1 页 / 共 2 页
字号:
  g_iconv (cd, (char **)&inptr, &inbytesleft, &outptr, &outbytesleft);  if ((guchar)outbuf[0] < 128)    return outbuf[0];  else    return ((guchar)outbuf[0] & 0x7f) * 256 + ((guchar)outbuf[1] & 0x7f);}static PangoGlyphconv_16bit_MSB_on (CharCache  *cache,		   GIConv      cd,		   const char *input){  char outbuf[2];  const char *inptr = input;  size_t inbytesleft;  char *outptr = outbuf;  size_t outbytesleft = 2;  inbytesleft = g_utf8_next_char (input) - input;  g_iconv (cd, (char **)&inptr, &inbytesleft, &outptr, &outbytesleft);  if ((guchar)outbuf[0] < 128)    return outbuf[0];  else    return (guchar)outbuf[0] * 256 + (guchar)outbuf[1];}static PangoGlyphconv_gb18030_1 (CharCache  *cache,		GIConv      cd,		const char *input){  char outbuf[4];  const char *inptr = input;  size_t inbytesleft;  char *outptr = outbuf;  size_t outbytesleft = 4;  inbytesleft = g_utf8_next_char (input) - input;  g_iconv (cd, (char **)&inptr, &inbytesleft, &outptr, &outbytesleft);  if ((guchar)outbuf[0] < 128)    return outbuf[0];  else    return  12600 * ((guchar)outbuf[0] - 0x81) + 1260 * ((guchar)outbuf[1] - 0x30) + 10 * ((guchar)outbuf[2] - 0x81) + ((guchar)outbuf[3] - 0x30);}static PangoGlyphconv_euctw (CharCache  *cache,	    GIConv      cd,	    const char *input){  char outbuf[4];  const char *inptr = input;  size_t inbytesleft;  char *outptr = outbuf;  size_t outbytesleft = 4;  inbytesleft = g_utf8_next_char (input) - input;  g_iconv (cd, (char **)&inptr, &inbytesleft, &outptr, &outbytesleft);  /* The first two bytes determine which page of CNS to use; we   * get this information from tables-big.i, so ignore them   */  if ((guchar)outbuf[0] < 128)    return outbuf[0];  else    return ((guchar)outbuf[2] & 0x7f) * 256 + ((guchar)outbuf[3] & 0x7f);}static PangoGlyphconv_ucs4 (CharCache  *cache,	   GIConv      cd,	   const char *input){  return g_utf8_get_char (input);}static voidswap_range (PangoGlyphString *glyphs, int start, int end){  int i, j;  for (i = start, j = end - 1; i < j; i++, j--)    {      PangoGlyphInfo glyph_info;      gint log_cluster;      glyph_info = glyphs->glyphs[i];      glyphs->glyphs[i] = glyphs->glyphs[j];      glyphs->glyphs[j] = glyph_info;      log_cluster = glyphs->log_clusters[i];      glyphs->log_clusters[i] = glyphs->log_clusters[j];      glyphs->log_clusters[j] = log_cluster;    }}static voidchar_caches_free (GSList *caches){  GSList *tmp_list = caches;  while (tmp_list)    {      CharCachePointer *pointer = tmp_list->data;      pointer->cache->ref_count--;      if (pointer->cache->ref_count == 0)	char_cache_free (pointer->cache);      g_free (pointer);      tmp_list = tmp_list->next;    }  g_slist_free (caches);}static CharsetOrdering *ordering_for_lang (PangoLanguage *lang){  int i;  for (i = 0; i < (int)G_N_ELEMENTS (charset_orderings) - 1; i++)    {      if (pango_language_matches (lang, charset_orderings[i].langs))	return &charset_orderings[i];    }  return &charset_orderings[i];}static CharCache *get_char_cache (PangoFont     *font,		PangoLanguage *lang){  GQuark cache_id = g_quark_from_string ("basic-char-cache");  CharCache *cache = NULL;  CharCachePointer *pointer;  CharsetOrdering *ordering;  GSList *caches;  GSList *tmp_list;  caches = g_object_get_qdata (G_OBJECT (font), cache_id);  tmp_list = caches;  while (tmp_list)    {      pointer = tmp_list->data;      if (pointer->lang == lang)	return pointer->cache;      tmp_list = tmp_list->next;    }  ordering = ordering_for_lang (lang);  tmp_list = caches;  while (tmp_list)    {      pointer = tmp_list->data;      if (pointer->cache->ordering == ordering)	{	  cache = pointer->cache;	  break;	}      tmp_list = tmp_list->next;    }  if (!cache)    cache = char_cache_new (ordering);  else    cache->ref_count++;  pointer = g_new (CharCachePointer, 1);  pointer->lang = lang;  pointer->cache = cache;  caches = g_slist_prepend (caches, pointer);  g_object_steal_qdata (G_OBJECT (font), cache_id);  g_object_set_qdata_full (G_OBJECT (font), cache_id,			   caches, (GDestroyNotify)char_caches_free);  return cache;}static voidbasic_engine_shape (PangoEngineShape *engine,		    PangoFont        *font,		    const char       *text,		    gint              length,		    const PangoAnalysis *analysis,		    PangoGlyphString *glyphs){  int n_chars;  int i;  const char *p;  CharCache *cache;  g_return_if_fail (font != NULL);  g_return_if_fail (text != NULL);  g_return_if_fail (length >= 0);  g_return_if_fail (analysis != NULL);  cache = get_char_cache (font, analysis->language);  n_chars = g_utf8_strlen (text, length);  pango_glyph_string_set_size (glyphs, n_chars);  p = text;  for (i=0; i < n_chars; i++)    {      gunichar wc;      gunichar mirrored_ch;      PangoGlyph index;      char buf[6];      const char *input;      wc = g_utf8_get_char (p);      input = p;      if (analysis->level % 2)	if (pango_get_mirror_char (wc, &mirrored_ch))	  {	    wc = mirrored_ch;	    g_unichar_to_utf8 (wc, buf);	    input = buf;	  }      if (wc == 0xa0)	/* non-break-space */	{	  wc = 0x20;	  g_unichar_to_utf8 (wc, buf);	  input = buf;	}      if (pango_is_zero_width (wc))	{	  set_glyph (font, glyphs, i, p - text, PANGO_GLYPH_EMPTY);	}      else	{	  index = find_char (cache, font, wc, input);	  if (index)	    {	      set_glyph (font, glyphs, i, p - text, index);	      if (g_unichar_type (wc) == G_UNICODE_NON_SPACING_MARK)		{		  if (i > 0)		    {		      PangoRectangle logical_rect, ink_rect;		      glyphs->glyphs[i].geometry.width = MAX (glyphs->glyphs[i-1].geometry.width,							      glyphs->glyphs[i].geometry.width);		      glyphs->glyphs[i-1].geometry.width = 0;		      glyphs->log_clusters[i] = glyphs->log_clusters[i-1];		      /* Some heuristics to try to guess how overstrike glyphs are		       * done and compensate		       */		      pango_font_get_glyph_extents (font, glyphs->glyphs[i].glyph, &ink_rect, &logical_rect);		      if (logical_rect.width == 0 && ink_rect.x == 0)			glyphs->glyphs[i].geometry.x_offset = (glyphs->glyphs[i].geometry.width - ink_rect.width) / 2;		    }		}	    }	  else	    set_glyph (font, glyphs, i, p - text, PANGO_GET_UNKNOWN_GLYPH (wc));	}      p = g_utf8_next_char (p);    }  /* Simple bidi support... may have separate modules later */  if (analysis->level % 2)    {      int start, end;      /* Swap all glyphs */      swap_range (glyphs, 0, n_chars);      /* Now reorder glyphs within each cluster back to LTR */      for (start=0; start<n_chars;)	{	  end = start;	  while (end < n_chars &&		 glyphs->log_clusters[end] == glyphs->log_clusters[start])	    end++;	  swap_range (glyphs, start, end);	  start = end;	}    }}static PangoCoverageLevelbasic_engine_covers (PangoEngineShape *engine,		     PangoFont        *font,		     PangoLanguage    *lang,		     gunichar          wc){  CharCache *cache = get_char_cache (font, lang);  char buf[6];  g_unichar_to_utf8 (wc, buf);  return find_char (cache, font, wc, buf) ? PANGO_COVERAGE_EXACT : PANGO_COVERAGE_NONE;}static voidbasic_engine_x_class_init (PangoEngineShapeClass *class){  class->covers = basic_engine_covers;  class->script_shape = basic_engine_shape;}PANGO_ENGINE_SHAPE_DEFINE_TYPE (BasicEngineX, basic_engine_x,				basic_engine_x_class_init, NULL)voidPANGO_MODULE_ENTRY(init) (GTypeModule *module){  basic_engine_x_register_type (module);}voidPANGO_MODULE_ENTRY(exit) (void){}voidPANGO_MODULE_ENTRY(list) (PangoEngineInfo **engines,			  int              *n_engines){  *engines = script_engines;  *n_engines = G_N_ELEMENTS (script_engines);}PangoEngine *PANGO_MODULE_ENTRY(create) (const char *id){  if (!strcmp (id, SCRIPT_ENGINE_NAME))    return g_object_new (basic_engine_x_type, NULL);  else    return NULL;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -