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.rectangle(10, 110, 150, 150, FBPRIMCLR_WHITE, False)
 | 
				
			||||||
upiwin_tmp.line(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.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
 | 
					     log.o gpio.o msg_queue.o time_func.o config.o splash.o
 | 
				
			||||||
LIBS=-lpython3.7m -lcrypt -lbcm2835 -lpthread -ldl -lutil -lm
 | 
					LIBS=-lpython3.7m -lcrypt -lfreetype -lbcm2835 -lpthread -ldl -lutil -lm
 | 
				
			||||||
CFLAGS=-I/usr/include/python3.7m -Wall -fstack-protector -fwrapv -fno-PIE -g -O3 -DDEBUG_ASSERT
 | 
					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 \
 | 
					LDFLAGS=-L/usr/lib/python3.7/config-3.7m-arm-linux-gnueabihf -Xlinker -export-dynamic -Wl,-O1 \
 | 
				
			||||||
        -Wl,-Bsymbolic-functions
 | 
					        -Wl,-Bsymbolic-functions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -52,11 +52,23 @@ static PyObject *do_filled_rectangle(PyObject *self, PyObject *args)
 | 
				
			|||||||
  Py_RETURN_NONE;
 | 
					  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[] = {
 | 
					static PyMethodDef UPIWIN_tmpMethods[] = {
 | 
				
			||||||
  {"setpixel", do_setpixel, METH_VARARGS, "Set a single pixel on the display."},
 | 
					  {"setpixel", do_setpixel, METH_VARARGS, "Set a single pixel on the display."},
 | 
				
			||||||
  {"line", do_line, METH_VARARGS, "Draw a line 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."},
 | 
					  {"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."},
 | 
					  {"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}
 | 
					  {NULL, NULL, 0, NULL}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,3 +1,4 @@
 | 
				
			|||||||
 | 
					#include <alloca.h>
 | 
				
			||||||
#include "wintype.h"
 | 
					#include "wintype.h"
 | 
				
			||||||
#include "fbinit.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;
 | 
					    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_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_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_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 */
 | 
					#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;
 | 
					    return EXIT_SUCCESS;
 | 
				
			||||||
  if (FAILED(Fb_setup()))
 | 
					  if (FAILED(Fb_setup()))
 | 
				
			||||||
    return EXIT_FAILURE;
 | 
					    return EXIT_FAILURE;
 | 
				
			||||||
 | 
					  if (FAILED(FontEng_setup()))
 | 
				
			||||||
 | 
					    return EXIT_FAILURE;
 | 
				
			||||||
  if (FAILED(Gpio_setup()))
 | 
					  if (FAILED(Gpio_setup()))
 | 
				
			||||||
    return EXIT_FAILURE;
 | 
					    return EXIT_FAILURE;
 | 
				
			||||||
  if (FAILED(Epython_setup()))
 | 
					  if (FAILED(Epython_setup()))
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user