summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Boddie <david@boddie.org.uk>2024-02-28 01:58:40 +0100
committerDavid Boddie <david@boddie.org.uk>2024-02-28 01:58:40 +0100
commit3df3f6f7d81cd03b0f10ef557e0c96ab0f6cd702 (patch)
tree6ec39aec0cd71f515befd35798d5b15149c8ba9a
parentcbd016cda002145743d87224f0a9f9068abbfc67 (diff)
Added the usual missing files.
-rw-r--r--libfreetype/freetype.c136
-rw-r--r--libfreetype/mkfile87
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