89 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * fonts.c
 | |
|  *
 | |
|  *  Created on: 23 maj 2021
 | |
|  *      Author: bartool
 | |
|  */
 | |
| 
 | |
| // #include "main.h"
 | |
| #include "font_gfx.h"
 | |
| 
 | |
| static uint8_t font_string_lenght_px(const GFX_font_t *font, uint8_t *text);
 | |
| 
 | |
| /**
 | |
|  * @brief Write string at at the specified (x,y) position.
 | |
|  * @param disp A pointer to display struct
 | |
|  * @param font A pointer to font struct.
 | |
|  * @param text A pointer to string data.
 | |
|  * @param pos_x Top left corner x coordinate
 | |
|  * @param pos_yTop left corner y coordinate
 | |
|  * @param color Color of pixel BM_NORMAL or BM_INVERSE for bitmap.
 | |
|  * @return uint8_t
 | |
|  */
 | |
| uint8_t DISP_writeString(GFX_display_t *disp, const GFX_font_t *font, uint8_t *text, uint8_t pos_x, uint8_t pos_y, GFX_BitmapColor_t color)
 | |
| {
 | |
| 	uint8_t actual_char, char_nr;
 | |
| 	GFX_bitmap_t char_bitmap;
 | |
| 	const GFX_fontChar_t *charinfo;
 | |
| 
 | |
| 	uint8_t height = font->heightPixels;
 | |
| 	uint8_t x = pos_x;
 | |
| 	uint8_t width = font_string_lenght_px(font, text);
 | |
| 
 | |
| 	switch (color)
 | |
| 	{
 | |
| 	case BM_INVERSE:;
 | |
| 		DISP_drawFillRect(disp, pos_x - 1, pos_y - 1, width + 2, height + 2);
 | |
| 		break;
 | |
| 	default:
 | |
| 		DISP_clearRegion(disp, pos_x - 1, pos_y - 1, width + 2, height + 2);
 | |
| 		break;
 | |
| 	}
 | |
| 
 | |
| 	while (*text)
 | |
| 	{
 | |
| 		actual_char = *text++;
 | |
| 		if (actual_char < font->startChar || actual_char > font->endChar)
 | |
| 		{
 | |
| 			if (actual_char == ' ')
 | |
| 			{
 | |
| 				x += font->spacePixels;
 | |
| 			}
 | |
| 			continue;
 | |
| 		}
 | |
| 
 | |
| 		char_nr = actual_char - font->startChar;
 | |
| 		charinfo = &font->charInfo[char_nr];
 | |
| 
 | |
| 		char_bitmap.height = height,
 | |
| 		char_bitmap.width = charinfo->widthBits,
 | |
| 		char_bitmap.bitmap = font->data + charinfo->offset,
 | |
| 
 | |
| 		DISP_drawBitmap(disp, &char_bitmap, x, pos_y, color);
 | |
| 
 | |
| 		x += charinfo->widthBits + font->interspacePixels;
 | |
| 	}
 | |
| 
 | |
| 	return x;
 | |
| }
 | |
| 
 | |
| static uint8_t font_string_lenght_px(const GFX_font_t *font, uint8_t *text)
 | |
| {
 | |
| 	uint8_t width = 0;
 | |
| 	while (*text)
 | |
| 	{
 | |
| 		uint8_t actual_char = *text++;
 | |
| 		uint8_t char_nr = actual_char - font->startChar;
 | |
| 		if (actual_char < font->startChar || actual_char > font->endChar)
 | |
| 		{
 | |
| 			if (actual_char == ' ')
 | |
| 			{
 | |
| 				width += font->spacePixels;
 | |
| 			}
 | |
| 			continue;
 | |
| 		}
 | |
| 		width += font->charInfo[char_nr].widthBits + font->interspacePixels;
 | |
| 	}
 | |
| 	return width;
 | |
| }
 |