⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exfont.cpp

📁 1616点阵字幕产生软件
💻 CPP
字号:
#include <stdlib.h>
#include <string.h>
#include "ExFont.h"

char EXFONT_init(PEXFONT font,  char* name, int foreground_color, int background_color, 
				 unsigned char bk_mode, draw_pixel_func draw_pixel)
{
	if(font != NULL)
	{
		memset(font, 0x00, sizeof(*font));

		font->name = name;
		font->draw_pixel = draw_pixel;

		font->foreground_color = foreground_color;
		font->background_color = background_color;
		font->bk_mode = bk_mode;

		if(draw_pixel != NULL)
		{
			return 0;
		}
	}

	return -1;
}

char EXFONT_set_thin_font_data(PEXFONT font, PEXFONT_DATA thin_font_data)
{
	if(font != NULL)
	{
		font->thin_font_data = thin_font_data;	

		return 0;
	}
	else
	{
		return -1;
	}
}

char EXFONT_set_wide_font_data(PEXFONT font, PEXFONT_DATA wide_font_data)
{
	if(font != NULL)
	{
		font->wide_font_data = wide_font_data;

		return 0;
	}
	else
	{
		return -1;
	}
}

int EXFONT_font_index(CONST PEXFONT_DATA font_data, unsigned short cChar)
{
	int low = 0;
	int hign = font_data->nr;
	int mid = (low + hign) / 2;

	if(font_data == NULL) return -1;
	
	if(font_data != NULL)
	{
		while(low <= hign)
		{
			if(font_data->items[mid].value == cChar)
			{
				return mid;
			}

			if(font_data->items[mid].value > cChar)
			{
				hign = mid - 1;
			}
			else
			{
				low = mid + 1;
			}

			mid = (low + hign) / 2;
		}
	}

	return -1;
}

#define is_thin_char(c) (c < 128)

static void EXFONT_draw_one_char(CONST PEXFONT font, int x, int y, int index, unsigned char is_thin_char)
{
	PEXFONT_DATA thin_wide_font_data = is_thin_char ? font->thin_font_data : font->wide_font_data;

	int w;
	int h;
	int max_w = x + thin_wide_font_data->width;
	int max_h = y + thin_wide_font_data->height;
	unsigned char* font_data = thin_wide_font_data->items[index].data;

	unsigned short i = 0;
	unsigned char byte = 0;
	unsigned char bit = 0;

	for(h = y; h < max_h; h++)
	{
		for(w = x; w < max_w; w++)
		{
			bit = 7 - (w - x) % 8;

			if(byte & (1 << bit))
			{
				font->draw_pixel(w, h, font->foreground_color);
			}
			else if(font->bk_mode == BKMODE_OPAQUE)
			{
				font->draw_pixel(w, h, font->background_color);
			}

			if(bit == 0)
			{
				i++;
				byte = font_data[i];
			}
		}
	}

	return;
}

char EXFONT_draw_w(CONST PEXFONT font, int x, int y, CONST wchar_t* text)
{ 
	if(font != NULL && text != NULL)
	{
		unsigned short i = 0;
		int index = 0;
		unsigned char  thin_char = 0;
		int left = x;
		int top = y;

		while(text[i])
		{
			thin_char = is_thin_char(text[i]);
			if(thin_char)
			{
				index = EXFONT_font_index(font->thin_font_data, text[i]);
				if(index > font->thin_font_data->nr)
				{
					return -1;
				}
			}
			else
			{
				index = EXFONT_font_index(font->wide_font_data, text[i]);
				if(index > font->wide_font_data->nr)
				{
					return -1;
				}
			}

			EXFONT_draw_one_char(font, left, top, index, thin_char);
			left += thin_char ? font->thin_font_data->width : font->wide_font_data->width;

			i++;
		}

		return 0;
	}
	else
	{
		return -1;
	}
}

char EXFONT_draw_a(CONST PEXFONT font, int x, int y, CONST char* text)
{
	if(font != NULL && text != NULL)
	{
		unsigned short i = 0;
		unsigned short index = 0;
		unsigned char  thin_char = 0;
		int left = x;
		int top = y;

		while(text[i])
		{
			thin_char = is_thin_char((unsigned char)text[i]);
			if(thin_char)
			{
				index = EXFONT_font_index(font->thin_font_data, text[i]);
				if(index > font->thin_font_data->nr)
				{
					return -1;
				}
				i++;
			}
			else
			{
				index = EXFONT_font_index(font->wide_font_data, *(unsigned short*)(text+i));
				if(index > font->wide_font_data->nr)
				{
					return -1;
				}
				i += 2;
			}

			EXFONT_draw_one_char(font, left, top, index, thin_char);
			left += thin_char ? font->thin_font_data->width : font->wide_font_data->width;
		}

		return 0;
	}
	else
	{
		return -1;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -