From b549688c443e796784c4ae63cbd7191571551df0 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 22 Jan 2018 18:49:45 -0800 Subject: [PATCH] Add a bunch of Rasterizer functions; --- src/api/types/rasterizer.c | 58 ++++++++++++++++++++++++++++++++++++++ src/data/rasterizer.c | 21 ++++++++++++++ src/data/rasterizer.h | 5 ++++ 3 files changed, 84 insertions(+) diff --git a/src/api/types/rasterizer.c b/src/api/types/rasterizer.c index 50706909..2b6ad417 100644 --- a/src/api/types/rasterizer.c +++ b/src/api/types/rasterizer.c @@ -1,5 +1,63 @@ #include "api.h" +#include "data/rasterizer.h" + +int l_lovrRasterizerGetHeight(lua_State* L) { + Rasterizer* rasterizer = luax_checktype(L, 1, Rasterizer); + lua_pushinteger(L, rasterizer->height); + return 1; +} + +int l_lovrRasterizerGetAdvance(lua_State* L) { + Rasterizer* rasterizer = luax_checktype(L, 1, Rasterizer); + lua_pushinteger(L, rasterizer->advance); + return 1; +} + +int l_lovrRasterizerGetAscent(lua_State* L) { + Rasterizer* rasterizer = luax_checktype(L, 1, Rasterizer); + lua_pushinteger(L, rasterizer->ascent); + return 1; +} + +int l_lovrRasterizerGetDescent(lua_State* L) { + Rasterizer* rasterizer = luax_checktype(L, 1, Rasterizer); + lua_pushinteger(L, rasterizer->descent); + return 1; +} + +int l_lovrRasterizerGetLineHeight(lua_State* L) { + Rasterizer* rasterizer = luax_checktype(L, 1, Rasterizer); + lua_pushinteger(L, rasterizer->height * 1.25f); + return 1; +} + +int l_lovrRasterizerGetGlyphCount(lua_State* L) { + Rasterizer* rasterizer = luax_checktype(L, 1, Rasterizer); + lua_pushinteger(L, rasterizer->glyphCount); + return 1; +} + +int l_lovrRasterizerHasGlyphs(lua_State* L) { + Rasterizer* rasterizer = luax_checktype(L, 1, Rasterizer); + bool hasGlyphs = true; + for (int i = 2; i <= lua_gettop(L); i++) { + if (lua_type(L, i) == LUA_TSTRING) { + hasGlyphs &= lovrRasterizerHasGlyphs(rasterizer, lua_tostring(L, i)); + } else { + hasGlyphs &= lovrRasterizerHasGlyph(rasterizer, luaL_checkinteger(L, i)); + } + } + lua_pushboolean(L, hasGlyphs); + return 1; +} const luaL_Reg lovrRasterizer[] = { + { "getHeight", l_lovrRasterizerGetHeight }, + { "getAdvance", l_lovrRasterizerGetAdvance }, + { "getAscent", l_lovrRasterizerGetAscent }, + { "getDescent", l_lovrRasterizerGetDescent }, + { "getLineHeight", l_lovrRasterizerGetLineHeight }, + { "getGlyphCount", l_lovrRasterizerGetGlyphCount }, + { "hasGlyphs", l_lovrRasterizerHasGlyphs }, { NULL, NULL } }; diff --git a/src/data/rasterizer.c b/src/data/rasterizer.c index e7124a28..555ed8af 100644 --- a/src/data/rasterizer.c +++ b/src/data/rasterizer.c @@ -81,9 +81,11 @@ Rasterizer* lovrRasterizerCreate(Blob* blob, int size) { rasterizer->ftHandle = face; rasterizer->blob = blob; rasterizer->size = size; + rasterizer->glyphCount = face->num_glyphs; FT_Size_Metrics metrics = face->size->metrics; rasterizer->height = metrics.height >> 6; + rasterizer->advance = metrics.max_advance >> 6; rasterizer->ascent = metrics.ascender >> 6; rasterizer->descent = metrics.descender >> 6; @@ -99,6 +101,25 @@ void lovrRasterizerDestroy(const Ref* ref) { free(rasterizer); } +bool lovrRasterizerHasGlyph(Rasterizer* rasterizer, uint32_t character) { + FT_Face face = rasterizer->ftHandle; + return FT_Get_Char_Index(face, character) != 0; +} + +bool lovrRasterizerHasGlyphs(Rasterizer* rasterizer, const char* str) { + int len = strlen(str); + const char* end = str + len; + unsigned int codepoint; + size_t bytes; + + bool hasGlyphs = true; + while ((bytes = utf8_decode(str, end, &codepoint)) > 0) { + hasGlyphs &= lovrRasterizerHasGlyph(rasterizer, codepoint); + str += bytes; + } + return hasGlyphs; +} + void lovrRasterizerLoadGlyph(Rasterizer* rasterizer, uint32_t character, Glyph* glyph) { FT_Face face = rasterizer->ftHandle; FT_Error err = FT_Err_Ok; diff --git a/src/data/rasterizer.h b/src/data/rasterizer.h index 48c44fe4..e11fd94a 100644 --- a/src/data/rasterizer.h +++ b/src/data/rasterizer.h @@ -2,6 +2,7 @@ #include "lib/map/map.h" #include "util.h" #include +#include #pragma once @@ -12,7 +13,9 @@ typedef struct { void* ftHandle; Blob* blob; int size; + int glyphCount; int height; + int advance; int ascent; int descent; } Rasterizer; @@ -34,5 +37,7 @@ typedef map_t(Glyph) map_glyph_t; Rasterizer* lovrRasterizerCreate(Blob* blob, int size); void lovrRasterizerDestroy(const Ref* ref); +bool lovrRasterizerHasGlyph(Rasterizer* fontData, uint32_t character); +bool lovrRasterizerHasGlyphs(Rasterizer* fontData, const char* str); void lovrRasterizerLoadGlyph(Rasterizer* fontData, uint32_t character, Glyph* glyph); int lovrRasterizerGetKerning(Rasterizer* fontData, uint32_t left, uint32_t right);