跳转到内容

Aros/开发者/文档/库/DiskFont

来自维基教科书,开放的书籍,为了一个开放的世界
Aros 维基教科书的导航栏
Aros 用户
Aros 用户文档
Aros 用户常见问题解答
Aros 用户应用程序
Aros 用户 DOS Shell
Aros/用户/AmigaLegacy
Aros 开发文档
Aros 开发者文档
从 AmigaOS/SDL 移植软件
针对 Zune 初学者
Zune .MUI 类
针对 SDL 初学者
Aros 开发者构建系统
特定平台
Aros x86 完整系统 HCL
Aros x86 音频/视频支持
Aros x86 网络支持
Aros Intel AMD x86 安装
Aros 存储支持 IDE SATA 等
Aros Poseidon USB 支持
x86-64 支持
摩托罗拉 68k Amiga 支持
Linux 和 FreeBSD 支持
Windows Mingw 和 MacOSX 支持
Android 支持
Arm 覆盆子派支持
PPC Power Architecture
杂项
Aros 公共许可证

AROS 可以使用两种不同的字体以及其他字体类型,例如更常见的 TrueType 字体(AROS 使用 FreeType 等效字体),您需要使用另一个库

字体基本上是字形(字母形状)、样式(粗体、普通、斜体)和大小(以字体大小为单位)的混合体。AROS 内置了一个名为 Topaz 的字体,可以随时访问。如果使用基于磁盘的字体,则需要使用 diskfont.library 从磁盘加载字体。


位图字体

[编辑 | 编辑源代码]

自定义格式的位平面数据,以及每个字符的水平偏移量和左右侧宽度的元数据。加载器位于 Diskfont.library 中,名为 OpenDiskFont()。加载后,位图字体由 OpenFont() 处理

Wanderer 使用 NULL 字体调用 IconList,因为 diskfont.library 无法打开“arial.font”。另一方面,这是因为 diskfont.library 无法在 FONTS: 中找到 arial.font,因为 ExAll 调用在其第一次调用时返回 0 (== 完成)。这意味着并非所有字体都被返回,因为传递的 1024 字节缓冲区太小,无法一次性获取所有字体。

加载磁盘字体

要加载磁盘字体,请使用 OpenDiskFont() 函数。您需要指定一个 TextAttr 结构来指定您需要的字体,命令的格式是

TextFont font = OpenDiskFont(struct TextAttr textAttr)

TextAttr 的格式是

struct TextAttr {
   STRPTR ta_Name; /* name of the font */
   UWORD ta_YSize; /* height of the font */
   UBYTE ta_Style; /* intrinsic font style */
   UBYTE ta_Flags; /* font preferences and flags */
};

例如,要指定 Topaz 字体,大小为 11,粗体和斜体

struct TextAttr myta = {
   "topaz.font"
   11,
   FSF_ITALIC | FSF_BOLD,
   NULL
};

如果您使用此字体进行绘图,可以使用 SetFont() 命令更改默认 Rastport 字体,并在使用完后使用 CloseFont() 函数:例如

struct TextFont *myfont, *oldfont;
struct RastPort *myrp;
struct Window *mywin;

if (myfont = OpenDiskFont(&myta))
{
  /* you would probably set the font of the rastport you are going to use */
  myrp = mywin->RPort
  oldfont = myrp->Font;
  SetFont(myrp, myfont);

  /* perform whatever drawing you need to do */

  /* time to clean up. If the rastport is not exclusively yours,
  you may need to restore the original font or other Rasport values */
  SetFont(myrp, oldfont);
  CloseFont(myfont);
}

如果您想在尝试从磁盘加载字体之前知道程序中有哪些可用字体,可以使用 AvailFonts() 函数,该函数可以读取内存和磁盘中的所有字体,并将它们显示在 AvailFontsHeader 结构中,随后是一系列 AvailFonts 结构,供您的程序读取。在调用此函数之前,您需要分配一些内存来存储字体信息。

LONG error = AvailFonts(struct AvailFontsHeader *buffer, LONG bufBytes, ULONG flags )

例如,

int afShortage, afSize;
struct AvailFontsHeader *afh;

afSize = 400;
do {
   afh = (struct AvailFontsHeader *) AllocMem(afSize, 0);
   if (afh) {
       afShortage = AvailFonts(afh, afSize, AFF_MEMORY|AFF_DISK);
       if (afShortage) {
         FreeMem(afh, afSize);
         afSize += afShortage;
       }
  }
  else {
     fail("AllocMem of AvailFonts buffer afh failedn");
     break;
  }
}while (afShortage);

对于 FontContents(或 TFontContents)结构中描述的每个字体大小,该字体的目录中都存在一个相应的文件,其名称为其大小。例如,对于字体大小 Sapphire-19,Sapphire 目录中有一个名为 19 的文件。该文件基本上是一个 DiskFontHeader,伪装成一个可加载的 DOS 段,被称为字体描述符文件。

对于位图字体,“.font” 文件是一个 FontContentsHeader 结构

struct FontContentsHeader {
    UWORD   fch_FileID;             /* FCH_ID */
    UWORD   fch_NumEntries;         /* the number of FontContents elements */
    struct  FontContents fch_FC[];  /* or struct TFontContents fch_TFC[];  */
};

#define MAXFONTPATH 256

其中 fch_FileID 字段可以是

FCH_ID    0x0f00    uses FontContents structures to describe the available sizes of this font.
TFCH_ID   0x0f02    uses TFontContents structures to describe the available sizes of this font.

FontContents 结构

struct FontContents {
    char    fc_FileName[MAXFONTPATH];
    UWORD   fc_YSize;
    UBYTE   fc_Style;
    UBYTE   fc_Flags;
};
struct TFontContents {
    char    tfc_FileName[MAXFONTPATH-2];
    UWORD   tfc_TagCount;       /* including the TAG_DONE tag */
        /*
         *  if tfc_TagCount is non-zero, tfc_FileName is overlaid with
         *  Text Tags starting at:  (struct TagItem *)
         *      &tfc_FileName[MAXFONTPATH-(tfc_TagCount*sizeof
         *                                 (struct TagItem))]
         */
    UWORD   tfc_YSize;
    UBYTE   tfc_Style;
    UBYTE   tfc_Flags;
};
struct DiskFontHeader {
    ULONG     dfh_NextSegment;
    ULONG     dfh_ReturnCode;
    STRUCT    dfh,LN_SIZE;
    UWORD     dfh_FileID;
    UWORD     dfh_Revision;
    LONG      dfh_Segment;
    STRUCT    dfh,MAXFONTNAME;
    STRUCT    dfh-TF,tf_SIZEOF;
};


有人知道使用什么程序生成 ttcourier 字体吗?它们由 Georg 在 2001 年提交。

据我所知,BitLine(参见 Aminet,附带源代码)。使用 diskfont.library 将字体加载到内存中,然后将其保存到磁盘。源字体是 TrueType 字体,diskfont.library 在加载时将其转换为位图字体(如果有像基于 freetype 的字体引擎,可以处理它)。

这些字体存在一个小问题:字形都与它们框的左侧对齐,而不是居中(这是纸张切割错误之一)。

快速查看 ttcourier 字体(使用 sys:tools/fontinfo 和 sys:extras/misc/aminet/ 中的位图字体编辑器“TypeFace”)。似乎只有某些大小(例如 14)存在问题,问题是缺少/为零的字距/间距表。

同样查看工作台/fonts/ 中字体文件(“14”等)的 svn 日志,似乎问题可能是当欧元字符被(手动)添加到字体中时发生的(据我所知,使用在 AROS 下运行的 TypeFace 字体编辑器 -> 可能那里存在一个错误),因为我对“14”文件的初始修订版进行了快速测试,它似乎没有缺少字距/间距表。


FreeType 轮廓字体

[编辑 | 编辑源代码]

请注意,根据样式和其他因素,字体并不总是使用相同的 HIDD 方法渲染。参见 rom/graphics/text.c。截图中不可见的文本是使用 BlitColorexpansion 方法渲染的文本。


#include <diskfont/diskfont.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/diskfont.h>
#include <proto/utility.h>
#include <proto/graphics.h>

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

struct Library *DiskfontBase;
struct UtilityBase *UtilityBase;

UBYTE *buf;

void cleanup(char *msg)
{
    if (msg) printf("aftest: %s\n", msg);
    
    if (buf) FreeVec(buf);
    
    if (UtilityBase) CloseLibrary((struct Library *)UtilityBase);
    if (DiskfontBase) CloseLibrary(DiskfontBase);
    
    exit(0);
}

void openlibs(void)
{
    DiskfontBase = OpenLibrary("diskfont.library", 0);
    if (!DiskfontBase) cleanup("Cant open diskfont.library!");
    UtilityBase = (struct UtilityBase *) OpenLibrary("utility.library", 0);
    if (!UtilityBase) cleanup("Cant open utility.library!");
}

void action(void)
{
    struct TextFont *font;
    struct TextAttr ta;

    ta.ta_Name = "Vera Sans Bold Italic.font";
    ta.ta_Name = "xhelvetica.font";
    ta.ta_YSize = 11;
    ta.ta_Style = 0;
    ta.ta_Flags = 0;

    font = OpenDiskFont(&ta);
    if (font)
    {
	CloseFont(font);
    }
}

int main(void)
{
    openlibs();
    action();
    cleanup(0);

    return 0; /* keep compiler happy */
}

参考文献

[编辑 | 编辑源代码]
struct TextFont *OpenDiskFont(struct TextAttr *textAttr)

LONG AvailFonts(STRPTR buffer, LONG bufBytes, LONG flags) 
 AFF_MEMORY
 AFF_DISK
 AFF_SCALED
 AFF_TAGGED
struct FontContentsHeader *NewFontContents(BPTR fontsLock, STRPTR fontName) 
struct DiskFont *NewScaledDiskFont(struct TextFont *sourceFont, struct TextAttr *destTextAttr)

void DisposeFontContents(struct FontContentsHeader *fontContentsHeader) 
华夏公益教科书