add text out capabilities using FreeType and the Inconsolata font
This commit is contained in:
parent
2cfb92d97b
commit
30106490c0
|
@ -19,3 +19,4 @@ upiwin_tmp.filled_rectangle(110, 60, 150, 100, FBPRIMCLR_YELLOW, False)
|
|||
upiwin_tmp.rectangle(10, 110, 150, 150, FBPRIMCLR_WHITE, False)
|
||||
upiwin_tmp.line(10, 110, 150, 150, FBPRIMCLR_WHITE, False)
|
||||
upiwin_tmp.line(10, 150, 150, 110, FBPRIMCLR_WHITE, False)
|
||||
upiwin_tmp.textout(10, 180, 'Amy was here!!!')
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
OBJS=main.o sysinput.o ep_init.o ep_upiwin.o ep_backlight.o ep_upiwin_tmp.o ep_util.o fbinit.o fbprimitive.o \
|
||||
OBJS=main.o sysinput.o ep_init.o ep_upiwin.o ep_backlight.o ep_upiwin_tmp.o ep_util.o fbinit.o fontengine.o 6fbprimitive.o \
|
||||
log.o gpio.o msg_queue.o time_func.o config.o splash.o
|
||||
LIBS=-lpython3.7m -lcrypt -lbcm2835 -lpthread -ldl -lutil -lm
|
||||
CFLAGS=-I/usr/include/python3.7m -Wall -fstack-protector -fwrapv -fno-PIE -g -O3 -DDEBUG_ASSERT
|
||||
LIBS=-lpython3.7m -lcrypt -lfreetype -lbcm2835 -lpthread -ldl -lutil -lm
|
||||
CFLAGS=-I/usr/include/python3.7m -I/usr/include/freetype2 -I/usr/include/libpng16 \
|
||||
-Wall -fstack-protector -fwrapv -fno-PIE -g -O3 -DDEBUG_ASSERT
|
||||
LDFLAGS=-L/usr/lib/python3.7/config-3.7m-arm-linux-gnueabihf -Xlinker -export-dynamic -Wl,-O1 \
|
||||
-Wl,-Bsymbolic-functions
|
||||
|
||||
|
|
|
@ -52,11 +52,23 @@ static PyObject *do_filled_rectangle(PyObject *self, PyObject *args)
|
|||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
static PyObject *do_textout(PyObject *self, PyObject *args)
|
||||
{
|
||||
INT32 x, y;
|
||||
PSTR text;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "iis", &x, &y, &text))
|
||||
return NULL;
|
||||
Fb_textout(x, y, text);
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
static PyMethodDef UPIWIN_tmpMethods[] = {
|
||||
{"setpixel", do_setpixel, METH_VARARGS, "Set a single pixel on the display."},
|
||||
{"line", do_line, METH_VARARGS, "Draw a line on the display."},
|
||||
{"rectangle", do_rectangle, METH_VARARGS, "Draw a rectangle on the display."},
|
||||
{"filled_rectangle", do_filled_rectangle, METH_VARARGS, "Draw a filled rectangle on the display."},
|
||||
{"textout", do_textout, METH_VARARGS, "Draw text on the display."},
|
||||
{NULL, NULL, 0, NULL}
|
||||
};
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
#include <alloca.h>
|
||||
#include "wintype.h"
|
||||
#include "fbinit.h"
|
||||
|
||||
|
@ -112,3 +113,33 @@ void Fb_filled_rectangle(INT32 x1, INT32 y1, INT32 x2, INT32 y2, UINT16 color, B
|
|||
ps += Fb_Info->width;
|
||||
}
|
||||
}
|
||||
|
||||
static void internal_textout(INT32 x, INT32 y, INT32 width, INT32 height, PBYTE gsbits)
|
||||
{
|
||||
INT32 i, j;
|
||||
BYTE b;
|
||||
PUINT16 dptr, lbuf;
|
||||
|
||||
if (((x + width) >= Fb_Info->width) || ((y + height) >= Fb_Info->height))
|
||||
return;
|
||||
dptr = loc_from_coords(x, y);
|
||||
lbuf = (PUINT16)alloca(width * sizeof(UINT16));
|
||||
for (i=0; i<height; i++)
|
||||
{
|
||||
for (j=0; j<width; j++)
|
||||
{
|
||||
b = *gsbits++;
|
||||
lbuf[i] = ((UINT16)(b >> 3) & 0x1F) << 11;
|
||||
lbuf[i] |= ((UINT16)(b >> 2) & 0x3F) << 5;
|
||||
lbuf[i] |= ((UINT16)(b >> 3) & 0x1F);
|
||||
}
|
||||
|
||||
memcpy(dptr, lbuf, width * sizeof(UINT16));
|
||||
dptr += Fb_Info->width;
|
||||
}
|
||||
}
|
||||
|
||||
void Fb_textout(INT32 x, INT32 y, PCSTR pstr)
|
||||
{
|
||||
FontEng_do_text_out(x, y, pstr, internal_textout);
|
||||
}
|
||||
|
|
|
@ -17,5 +17,6 @@ extern UINT16 Fb_setpixel(INT32 x, INT32 y, UINT16 color, BOOL xor);
|
|||
extern void Fb_line(INT32 x1, INT32 y1, INT32 x2, INT32 y2, UINT16 color, BOOL xor);
|
||||
extern void Fb_rectangle(INT32 x1, INT32 y1, INT32 x2, INT32 y2, UINT16 color, BOOL xor);
|
||||
extern void Fb_filled_rectangle(INT32 x1, INT32 y1, INT32 x2, INT32 y2, UINT16 color, BOOL xor);
|
||||
extern void Fb_textout(INT32 x, INT32 y, PCSTR pstr);
|
||||
|
||||
#endif /* __FBPRIMITIVE_H_INCLUDED */
|
||||
|
|
84
src/fontengine.c
Normal file
84
src/fontengine.c
Normal file
|
@ -0,0 +1,84 @@
|
|||
#include <ft2build.h>
|
||||
#include FT_FREETYPE_H
|
||||
#include "scode.h"
|
||||
#include "config.h"
|
||||
#include "log.h"
|
||||
#include "fontengine.h"
|
||||
|
||||
static FT_LIbrary library;
|
||||
static FT_Face stdfont;
|
||||
|
||||
static void fonteng_cleanup(void)
|
||||
{
|
||||
FT_Done_Face(stdfont);
|
||||
FT_Done_FreeType(library);
|
||||
}
|
||||
|
||||
HRESULT FontEng_setup(void)
|
||||
{
|
||||
HRESULT hr = S_OK;
|
||||
FT_Error err;
|
||||
|
||||
err = FT_Init_FreeType(&library);
|
||||
if (err != 0)
|
||||
{
|
||||
Log(LFATAL, "Unable to initialize Freetype (%d)", err);
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
err = FT_New_Face(library, "/usr/local/share/fonts/opentype/Inconsolata.otf", 0, &stdfont);
|
||||
if (err != 0)
|
||||
{
|
||||
Log(LFATAL, "Unable to load font (%d)", err);
|
||||
hr = E_FAIL;
|
||||
goto error_0;
|
||||
}
|
||||
|
||||
err = FT_Set_Pixel_Sizes(stdfont, 0, 16);
|
||||
if (err != 0)
|
||||
{
|
||||
Log(LFATAL, "Unable to set font size (%d)", err);
|
||||
hr = E_FAIL;
|
||||
goto error_1;
|
||||
}
|
||||
|
||||
hr = Config_exitfunc(fonteng_cleanup);
|
||||
if (FAILED(hr))
|
||||
fonteng_cleanup();
|
||||
return hr;
|
||||
|
||||
error_1:
|
||||
FT_Done_Face(stdfont);
|
||||
error_0:
|
||||
FT_Done_FreeType(library);
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT FontEng_do_text_out(INT32 x, INT32 y, PCSTR pstr, TEXTOUTFUNC renderfunc)
|
||||
{
|
||||
HRESULT hr = S_OK;
|
||||
FT_GlyphSlot slot = stdfont->glyph;
|
||||
FT_UInt glyph_index;
|
||||
FT_Error err;
|
||||
|
||||
while (*pstr)
|
||||
{
|
||||
glyph_index = FT_Get_Char_Index(stdfont, *pstr++);
|
||||
err = FT_Load_Glyph(stdfont, glyph_index, FT_LOAD_DEFAULT);
|
||||
if (err != 0)
|
||||
{
|
||||
hr = E_FAIL;
|
||||
break;
|
||||
}
|
||||
err = FT_Render_Glyph(stdfont->glyph, FT_RENDER_MODE_NORMAL);
|
||||
if (err != 0)
|
||||
{
|
||||
hr = E_FAIL;
|
||||
break;
|
||||
}
|
||||
(*renderfunc)(x, y, slot->bitmap.width, slot->bitmap.rows, slot->bitmap.buffer);
|
||||
x += slot->advance.x >> 6;
|
||||
y += slot->advance.y >> 6;
|
||||
}
|
||||
return hr;
|
||||
}
|
11
src/fontengine.h
Normal file
11
src/fontengine.h
Normal file
|
@ -0,0 +1,11 @@
|
|||
#ifndef __FONTENGINE_H_INCLUDED
|
||||
#define __FONTENGINE_H_INCLUDED
|
||||
|
||||
#include "wintype.h"
|
||||
|
||||
typedef void (*TEXTOUTFUNC)(INT32 x, INT32 y, INT32 width, INT32 height, PBYTE gsbits);
|
||||
|
||||
extern HRESULT FontEng_setup(void);
|
||||
extern HRESULT FontEng_do_text_out(INT32 x, INT32 y, PCSTR pstr, TEXTOUTFUNC renderfunc);
|
||||
|
||||
#endif /* __FONTENGINE_H_INCLUDED */
|
|
@ -31,6 +31,8 @@ int main(int argc, char *argv[])
|
|||
return EXIT_SUCCESS;
|
||||
if (FAILED(Fb_setup()))
|
||||
return EXIT_FAILURE;
|
||||
if (FAILED(FontEng_setup()))
|
||||
return EXIT_FAILURE;
|
||||
if (FAILED(Gpio_setup()))
|
||||
return EXIT_FAILURE;
|
||||
if (FAILED(Epython_setup()))
|
||||
|
|
Loading…
Reference in New Issue
Block a user