diff options
| author | David Boddie <david@boddie.org.uk> | 2024-02-28 01:58:40 +0100 |
|---|---|---|
| committer | David Boddie <david@boddie.org.uk> | 2024-02-28 01:58:40 +0100 |
| commit | 3df3f6f7d81cd03b0f10ef557e0c96ab0f6cd702 (patch) | |
| tree | 6ec39aec0cd71f515befd35798d5b15149c8ba9a /libfreetype | |
| parent | cbd016cda002145743d87224f0a9f9068abbfc67 (diff) | |
Added the usual missing files.
Diffstat (limited to 'libfreetype')
| -rw-r--r-- | libfreetype/freetype.c | 136 | ||||
| -rw-r--r-- | libfreetype/mkfile | 87 |
2 files changed, 223 insertions, 0 deletions
diff --git a/libfreetype/freetype.c b/libfreetype/freetype.c new file mode 100644 index 00000000..b76389e7 --- /dev/null +++ b/libfreetype/freetype.c @@ -0,0 +1,136 @@ +#include "lib9.h" + +#include "freetype/freetype.h" +#include "freetype.h" + +static char* fterrstr(int); + +char* +ftnewface(char *path, int index, FTface *f, FTfaceinfo *finfo) +{ + FT_Library ft_lib; + FT_Face ft_face; + char *err; + + err = fterrstr(FT_Init_FreeType(&ft_lib)); + if (err != nil) + return err; + + err = fterrstr(FT_New_Face(ft_lib, path, index, &ft_face)); + if (err != nil) { + FT_Done_FreeType(ft_lib); + return err; + } + + f->ft_lib = ft_lib; + f->ft_face = ft_face; + finfo->nfaces = ft_face->num_faces; + finfo->index = ft_face->face_index; + finfo->style = ft_face->style_flags; + finfo->height = (FT_MulFix(ft_face->height, ft_face->size->metrics.y_scale)+32)/64; + finfo->ascent = (FT_MulFix(ft_face->ascender, ft_face->size->metrics.y_scale)+32)/64; + finfo->familyname = ft_face->family_name; + finfo->stylename = ft_face->style_name; + return nil; +} + +char* +ftloadmemface(void *buf, int nbytes, int index, FTface *f, FTfaceinfo *finfo) +{ + USED(buf); + USED(f); + USED(finfo); + return "not implemented"; +} + +char* +ftsetcharsize(FTface f, int pt, int hdpi, int vdpi, FTfaceinfo *finfo) +{ + FT_Face ft_face = f.ft_face; + char *err; + + err = fterrstr(FT_Set_Char_Size(ft_face, 0, pt, hdpi, vdpi)); + if (err != nil) + return err; + finfo->height = (FT_MulFix(ft_face->height, ft_face->size->metrics.y_scale)+32)/64; + finfo->ascent = (FT_MulFix(ft_face->ascender, ft_face->size->metrics.y_scale)+32)/64; + return nil; +} + +void +ftsettransform(FTface f, FTmatrix *m, FTvector *v) +{ + /* FTMatrix and FTVector are compatible with FT_Matrix and FT_Vector */ + FT_Set_Transform(f.ft_face, (FT_Matrix*)m, (FT_Vector*)v); +} + +int +fthaschar(FTface f, int c) +{ + return FT_Get_Char_Index(f.ft_face, c) != 0; +} + +char* +ftloadglyph(FTface f, int ix, FTglyph *g) +{ + FT_Face ft_face = f.ft_face; + FT_GlyphSlot ft_glyph; + char *err; + + ix = FT_Get_Char_Index(ft_face, ix); + err = fterrstr(FT_Load_Glyph(ft_face, ix, FT_LOAD_NO_BITMAP|FT_LOAD_RENDER|FT_LOAD_CROP_BITMAP)); + if (err != nil) + return err; + + ft_glyph = ft_face->glyph; + g->top = ft_glyph->bitmap_top; + g->left = ft_glyph->bitmap_left; + g->height = ft_glyph->bitmap.rows; + g->width = ft_glyph->bitmap.width; + g->advx = ft_glyph->advance.x; + g->advy = ft_glyph->advance.y; + g->bpr = ft_glyph->bitmap.pitch; + g->bitmap = ft_glyph->bitmap.buffer; + return nil; +} + +void +ftdoneface(FTface f) +{ + if (f.ft_face != nil) + FT_Done_Face(f.ft_face); + if (f.ft_lib != nil) + FT_Done_FreeType(f.ft_lib); +} + +/* + * get the freetype error strings + */ + +typedef struct FTerr FTerr; +struct FTerr { + int code; + char* text; +}; + +#define FT_NOERRORDEF_(l,c,t) +#define FT_ERRORDEF_(l,c,t) c,t, + +static FTerr fterrs[] = { +#include "freetype/fterrdef.h" + -1, "", +}; + +static char* +fterrstr(int code) +{ + int i; + if (code == 0) + return nil; + for (i = 0; fterrs[i].code > 0; i++) { + if (fterrs[i].code == code) + return fterrs[i].text; + } + return "unknown FreeType error"; +} + diff --git a/libfreetype/mkfile b/libfreetype/mkfile new file mode 100644 index 00000000..1a47f53b --- /dev/null +++ b/libfreetype/mkfile @@ -0,0 +1,87 @@ +<../mkconfig + +LIB=libfreetype.a + +OFILES=\ + freetype.$O\ + autofit.$O\ + cff.$O\ + ftbase.$O\ + ftbitmap.$O\ + ftdebug.$O\ + ftgzip.$O\ + ftinit.$O\ + ftsystem_inf.$O\ + pcf.$O\ + pfr.$O\ + psaux.$O\ + pshinter.$O\ + psnames.$O\ + raster.$O\ + sfnt.$O\ + smooth.$O\ + truetype.$O\ + type1.$O\ + type42.$O\ + type1cid.$O\ + winfnt.$O\ + +%.$O: libfreetype/src/autofit/%.c + $CC $CFLAGS -o $target $prereq + +%.$O: libfreetype/src/base/%.c + $CC $CFLAGS -o $target $prereq + +%.$O: libfreetype/src/cff/%.c + $CC $CFLAGS -o $target $prereq + +%.$O: libfreetype/src/cid/%.c + $CC $CFLAGS -o $target $prereq + +%.$O: libfreetype/src/gzip/%.c + $CC $CFLAGS -o $target $prereq + +%.$O: libfreetype/src/pcf/%.c + $CC $CFLAGS -o $target $prereq + +%.$O: libfreetype/src/pfr/%.c + $CC $CFLAGS -o $target $prereq + +%.$O: libfreetype/src/pshinter/%.c + $CC $CFLAGS -o $target $prereq + +%.$O: libfreetype/src/psaux/%.c + $CC $CFLAGS -o $target $prereq + +%.$O: libfreetype/src/psnames/%.c + $CC $CFLAGS -o $target $prereq + +%.$O: libfreetype/src/raster/%.c + $CC $CFLAGS -o $target $prereq + +%.$O: libfreetype/src/sfnt/%.c + $CC $CFLAGS -o $target $prereq + +%.$O: libfreetype/src/smooth/%.c + $CC $CFLAGS -o $target $prereq + +%.$O: libfreetype/src/truetype/%.c + $CC $CFLAGS -o $target $prereq + +%.$O: libfreetype/src/type1/%.c + $CC $CFLAGS -o $target $prereq + +%.$O: libfreetype/src/type1cid/%.c + $CC $CFLAGS -o $target $prereq + +%.$O: libfreetype/src/type42/%.c + $CC $CFLAGS -o $target $prereq + +%.$O: libfreetype/src/winfonts/%.c + $CC $CFLAGS -o $target $prereq + +<$ROOT/mkfiles/mksyslib-$SHELLTYPE + +CFLAGS= $ANSICPP $CFLAGS -DFT2_BUILD_LIBRARY + +freetype.$O: $ROOT/include/freetype.h |
