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

📄 ttfaux.c

📁 字体缩放显示
💻 C
📖 第 1 页 / 共 2 页
字号:
                                    SCRIPT_hani,                                    &script_index);      if (error)        goto check_hang;      error = TT_GSUB_Select_Feature(gsub,                                     FEATURE_vert,                                     script_index,                                     0xFFFF,                                     &feature_index);      if (error)      {        error = TT_GSUB_Select_Language(gsub,                                        LANGUAGE_CHN,                                        script_index,                                        &language_index,                                        &req_feature_index);        if (error)          goto check_hang;        error = TT_GSUB_Select_Feature(gsub,                                       FEATURE_vert,                                       script_index,                                       language_index,                                       &feature_index);        if (error)          goto check_hang;        else          goto Done;      }      else        goto Done;    check_hang:      error = TT_GSUB_Select_Script(gsub,                                    SCRIPT_hang,                                    &script_index);      if (error)        goto Done;      error = TT_GSUB_Select_Feature(gsub,                                     FEATURE_vert,                                     script_index,                                     0xFFFF,                                     &feature_index);      if (error)      {        error = TT_GSUB_Select_Language(gsub,                                        LANGUAGE_KOR,                                        script_index,                                        &language_index,                                        &req_feature_index);        if (error)          goto Done;        error = TT_GSUB_Select_Feature(gsub,                                       FEATURE_vert,                                       script_index,                                       language_index,                                       &feature_index);      }    Done:      if (error)      {        warning("There is no data for vertical typesetting in GSUB table.");        has_gsub = False;      }      if (req_feature_index != 0xFFFF)        TT_GSUB_Add_Feature(gsub, req_feature_index, ALL_GLYPHS);      TT_GSUB_Add_Feature(gsub, feature_index, ALL_GLYPHS);      in.length = 1;      in.pos = 0;      in.string = in_string;      in.properties = NULL;      out.pos = 0;      out.allocated = 0;      out.string = NULL;      out.properties = NULL;    }    initialized = True;  }  if (!quiet)  {    if (only_range)      printf("\n\n%s:\n", fnt->fullname);    printf("\n");    printf("Glyph  Code   Glyph Name                ");    printf("Width  llx    lly      urx    ury\n");    printf("---------------------------------------");    printf("---------------------------------\n");  }  /*   *   We load only glyphs with a valid cmap entry.  Nevertheless, for   *   the default mapping, we use the first 256 glyphs addressed by   *   ascending code points, followed by glyphs not in the cmap.   *   *   If we compute a range, we take the character codes given in   *   the fnt->sf_code array.   *   *   If the -N flag is set, no cmap is used at all.  Instead, the   *   first 256 glyphs (with a valid PS name) are used for the default   *   mapping.   */  if (!only_range)    for (i = 0; i < 257; i++)      index_array[i] = 0;  else    for (i = 0; i < 256; i++)      fnt->inencptrs[i] = 0;  j = 0;  if (fnt->PSnames == Only)    max_k = properties.num_Glyphs - 1;  else    max_k = only_range ? 0xFF : 0x16FFFF;  for (k = 0; k <= max_k; k++)  {    char *an;    if (fnt->PSnames != Only)    {      if (only_range)      {        index = fnt->sf_code[k];        if (index < 0)          continue;        j = k;      }      else        index = k;      Num = TT_Char_Index(char_map, index);      /* now we try to get a vertical glyph form */      if (has_gsub)      {        in_string[0] = Num;        error = TT_GSUB_Apply_String(gsub, &in, &out);        if (error && error != TTO_Err_Not_Covered)          warning("Cannot get the vertical glyph form for glyph index %d.",                  Num);        else          Num = out.string[0];      }      if (Num < 0)        oops("Failure on cmap mapping from %s.", fnt->ttfname);      if (Num == 0)        continue;      if (!only_range)        if (Num <= 256)          index_array[Num] = 1;    }    else    {      Num = k;      index = 0;    }    error = TT_Load_Glyph(instance, glyph, Num, 0);    if (!error)      error = TT_Get_Glyph_Big_Metrics(glyph, &metrics);    if (!error)      error = TT_Get_Glyph_Outline(glyph, &outline);    if (!error)    {      if (fnt->efactor != 1.0 || fnt->slant != 0.0 )        TT_Transform_Outline(&outline, &matrix1);      if (fnt->rotate)        TT_Transform_Outline(&outline, &matrix2);    }    if (!error)      error = TT_Get_Outline_BBox(&outline, &bbox); /* we need the non-                                                       grid-fitted bbox */    if (!error)    {      if (fnt->PSnames)        (void)TT_Get_PS_Name(face, Num, &an);      else        an = code_to_adobename(index);      /* ignore characters not usable for typesetting with TeX */      if (strcmp(an, ".notdef") == 0)        continue;      if (strcmp(an, ".null") == 0)        continue;      if (strcmp(an, "nonmarkingreturn") == 0)        continue;      ti = newchar(fnt);      ti->charcode = index;      ti->glyphindex = Num;      ti->adobename = an;      ti->llx = bbox.xMin * 1000 / fnt->units_per_em;      ti->lly = bbox.yMin * 1000 / fnt->units_per_em;      ti->urx = bbox.xMax * 1000 / fnt->units_per_em;      ti->ury = bbox.yMax * 1000 / fnt->units_per_em;      /*       *   We must now shift the rotated character both horizontally       *   and vertically.  The vertical amount is 25% by default.       */      if (fnt->rotate)      {        ti->llx += (metrics.vertBearingY - bbox.xMin) *                     1000 / fnt->units_per_em;        ti->lly -= 1000 * fnt->y_offset;        ti->urx += (metrics.vertBearingY - bbox.xMin) *                     1000 / fnt->units_per_em;        ti->ury -= 1000 * fnt->y_offset;      }      /*       *   We need to avoid negative heights or depths.  They break accents       *   in math mode, among other things.       */      if (ti->lly > 0)        ti->lly = 0;      if (ti->ury < 0)        ti->ury = 0;      if (fnt->rotate)        ti->width = metrics.vertAdvance * 1000 / fnt->units_per_em;      else        ti->width = transform(metrics.horiAdvance * 1000 / fnt->units_per_em,                              0, fnt->efactor, fnt->slant);      if (!quiet)        printf("%5ld  %05lx  %-25s %5d  % 5d,% 5d -- % 5d,% 5d\n",               Num, index, ti->adobename,               ti->width,               ti->llx, ti->lly, ti->urx, ti->ury);      if (j < 256)      {        fnt->inencptrs[j] = ti;        ti->incode = j;      }      j++;    }  }  /*   *   Now we load glyphs without a cmap entry, provided some slots are   *   still free -- we skip this if we have to compute a range or use   *   PS names.   */  if (!only_range && !fnt->PSnames)  {    for (i = 1; i <= properties.num_Glyphs; i++)    {      char *an;      if (index_array[i] == 0)      {        error = TT_Load_Glyph(instance, glyph, i, 0);        if (!error)          error = TT_Get_Glyph_Big_Metrics(glyph, &metrics);        if (!error)          error = TT_Get_Glyph_Outline(glyph, &outline);        if (!error)          error = TT_Get_Outline_BBox(&outline, &bbox);        if (!error)        {          an = code_to_adobename(i | 0x1000000);          ti = newchar(fnt);          ti->charcode = i | 0x1000000;          ti->glyphindex = i;          ti->adobename = an;          ti->llx = bbox.xMin * 1000 / fnt->units_per_em;          ti->lly = bbox.yMin * 1000 / fnt->units_per_em;          ti->urx = bbox.xMax * 1000 / fnt->units_per_em;          ti->ury = bbox.yMax * 1000 / fnt->units_per_em;          if (ti->lly > 0)            ti->lly = 0;          if (ti->ury < 0)            ti->ury = 0;          ti->width = transform(metrics.horiAdvance*1000 / fnt->units_per_em,                                0, fnt->efactor, fnt->slant);          if (!quiet)            printf("%5d         %-25s %5d  % 5d,% 5d -- % 5d,% 5d\n",                   i, ti->adobename,                   ti->width,                   ti->llx, ti->lly, ti->urx, ti->ury);          if (j < 256)          {            fnt->inencptrs[j] = ti;            ti->incode = j;          }          else            break;          j++;        }      }    }  }  /* Finally, we construct a `Germandbls' glyph if necessary */  if (!only_range)  {    if (NULL == findadobe("Germandbls", fnt->charlist) &&        NULL != (Ti = findadobe("S", fnt->charlist)))    {      pcc *np, *nq;      ti = newchar(fnt);      ti->charcode = properties.num_Glyphs | 0x1000000;      ti->glyphindex = properties.num_Glyphs;      ti->adobename = "Germandbls";      ti->width = Ti->width << 1;      ti->llx = Ti->llx;      ti->lly = Ti->lly;      ti->urx = Ti->width + Ti->urx;      ti->ury = Ti->ury;      ti->kerns = Ti->kerns;      np = newpcc();      np->partname = "S";      nq = newpcc();      nq->partname = "S";      nq->xoffset = Ti->width;      np->next = nq;      ti->pccs = np;      ti->constructed = True;      if (!quiet)        printf("*             %-25s %5d  % 5d,% 5d -- % 5d,% 5d\n",               ti->adobename,               ti->width,               ti->llx, ti->lly, ti->urx, ti->ury);    }  }  /* kerning between subfonts isn't available */  if (!only_range)    readttf_kern(fnt);}/* end */

⌨️ 快捷键说明

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