mirror of
https://github.com/VincentWei/MiniGUI.git
synced 2026-09-25 19:13:46 +08:00
231 lines
5.7 KiB
C
231 lines
5.7 KiB
C
|
|
/*
|
|
* Copyright (C) 2000-2007 Beijing Komoxo Inc.
|
|
* All rights reserved.
|
|
*/
|
|
|
|
#include "se_minigui.h"
|
|
#include "stdio.h"
|
|
#include "string.h"
|
|
|
|
#include "kmx_latin1_ttf.h"
|
|
#include "fzxh_gb2312_ttf.h"
|
|
#include "fzxh_gb18030_1_ttf_stub.h"
|
|
#include "fzxh_gb18030_2_ttf_stub.h"
|
|
|
|
#define ASSERT(a)
|
|
|
|
#ifdef SE_FONT_DYNAMIC_LOADING_SUPPORT
|
|
#define MAX_PATH 256
|
|
#define MAX_LOGICAL_FONT_SIZE 16 /* Physical font count per logical font */
|
|
#endif
|
|
|
|
#define MAX_LOGICAL_TABLE_SIZE 256
|
|
|
|
/* Script Easy font description data definition */
|
|
|
|
static void* font_table[] =
|
|
{
|
|
(void*) &kmx_latin1_ttf, 0,
|
|
(void*) &fzxh_gb2312_ttf, 0,
|
|
(void*) &fzxh_gb18030_1_ttf, 0,
|
|
(void*) &fzxh_gb18030_2_ttf, 0,
|
|
|
|
0
|
|
};
|
|
|
|
#define FONT_TABLE_SIZE ((sizeof(font_table) / sizeof(void*) - 1) / 2)
|
|
|
|
static unsigned char logical_font_table_config[][MAX_LOGICAL_FONT_SIZE] =
|
|
{
|
|
{4, 0, 1, 2, 3}
|
|
};
|
|
#define LOGICAL_FONT_TABLE_SIZE (sizeof(logical_font_table_config) / (MAX_LOGICAL_FONT_SIZE * sizeof(unsigned char)))
|
|
#define DEFAULT_LOGICAL_FONT_INDEX 0
|
|
|
|
static unsigned char logical_font_table[MAX_LOGICAL_TABLE_SIZE];
|
|
|
|
static unsigned int logical_font_table_index_map[LOGICAL_FONT_TABLE_SIZE];
|
|
|
|
#ifdef SE_FONT_DYNAMIC_LOADING_SUPPORT
|
|
static const
|
|
struct {
|
|
const char *font_name;
|
|
int logical_font_index;
|
|
}
|
|
font_name_config[] =
|
|
{
|
|
{0, 0},
|
|
{0, 0},
|
|
{"fzxh_gb18030_1_ttf.le", 0},
|
|
{"fzxh_gb18030_2_ttf.le", 0},
|
|
};
|
|
#endif /* #ifdef SE_FONT_DYNAMIC_LOADING_SUPPORT */
|
|
|
|
static const se_font_name_map font_name_map[] = {
|
|
/* iso8859-1 */
|
|
{"ttf-fzxh-rrncnn-0-0-iso8859-1", 0},
|
|
/* GB2312 */
|
|
{"ttf-fzxh-rrncnn-0-0-GB2312", 0},
|
|
/* utf-8 */
|
|
{"ttf-fzxh-rrncnn-0-0-utf-8", 0},
|
|
};
|
|
|
|
#define FONT_NAME_MAP_SIZE (sizeof(font_name_map) / sizeof(se_font_name_map))
|
|
|
|
const se_font_description se_font_desc = {
|
|
FONT_TABLE_SIZE,
|
|
FONT_NAME_MAP_SIZE,
|
|
(const se_font_name_map*)font_name_map,
|
|
(const void **)font_table,
|
|
logical_font_table
|
|
};
|
|
|
|
/* The following is the scripteasy mem pool definition */
|
|
|
|
#define SE_MEM_POOL_SIZE (64 * 1024)
|
|
#define SE_CACHE_MEM_POOL_SIZE (256 * 1024)
|
|
|
|
int se_minigui_mem_pool[SE_MEM_POOL_SIZE];
|
|
int se_minigui_mem_pool_size = SE_MEM_POOL_SIZE * sizeof(int);
|
|
int se_minigui_cache_mem_pool[SE_CACHE_MEM_POOL_SIZE];
|
|
int se_minigui_cache_mem_pool_size = SE_CACHE_MEM_POOL_SIZE * sizeof(int);
|
|
|
|
|
|
/* The Following is for initializing font */
|
|
|
|
#ifdef SE_FONT_DYNAMIC_LOADING_SUPPORT
|
|
static const char * se_minigui_get_font_dir(void)
|
|
{
|
|
/* TO BE CUSTOMIZED */
|
|
static char font_dir[MAX_PATH + 1] = "/usr/minigui/se_new/minigui/src/fonts/";
|
|
|
|
return font_dir;
|
|
}
|
|
|
|
static FILE* se_minigui_open_font_file(const char *name)
|
|
{
|
|
static char path[MAX_PATH + 1];
|
|
const char *font_dir;
|
|
FILE *handle = 0;
|
|
|
|
font_dir = se_minigui_get_font_dir();
|
|
|
|
if(!font_dir)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
strcpy(path, font_dir);
|
|
strcat(path, name);
|
|
|
|
handle = fopen(path, "rb");
|
|
|
|
return handle;
|
|
}
|
|
|
|
unsigned int se_minigui_read_font(
|
|
void* name,
|
|
void* buffer,
|
|
unsigned int offset,
|
|
unsigned int size)
|
|
{
|
|
FILE* handle = (FILE*) name;
|
|
unsigned int read = 0;
|
|
int result = 0;
|
|
|
|
if(!handle)
|
|
return 0;
|
|
|
|
fseek(handle, offset, SEEK_SET);
|
|
printf("In se_minigui_read_font...\n");
|
|
return fread(buffer, 1, size, handle);
|
|
}
|
|
|
|
#endif /* #ifdef SE_FONT_DYNAMIC_LOADING_SUPPORT */
|
|
|
|
static int append_logical_font(int pos, const unsigned char *logical_font)
|
|
{
|
|
memcpy (logical_font_table + pos, logical_font, logical_font[0] + 1);
|
|
return logical_font[0] + 1;
|
|
}
|
|
|
|
static void build_logical_font_table (void)
|
|
{
|
|
unsigned int i = 0;
|
|
int pos = 0;
|
|
for (; i < LOGICAL_FONT_TABLE_SIZE; ++i)
|
|
{
|
|
pos += append_logical_font (pos, logical_font_table_config[logical_font_table_index_map[i]]);
|
|
}
|
|
|
|
logical_font_table[pos] = (unsigned char) 0;
|
|
}
|
|
|
|
static void init_logical_font_map(void)
|
|
{
|
|
unsigned int i = 0;
|
|
|
|
for (; i < LOGICAL_FONT_TABLE_SIZE; ++i)
|
|
{
|
|
logical_font_table_index_map[i] = i;
|
|
}
|
|
}
|
|
|
|
void se_minigui_destroy_fonts(void)
|
|
{
|
|
#ifdef SE_FONT_DYNAMIC_LOADING_SUPPORT
|
|
int i = 0;
|
|
for(; i < FONT_TABLE_SIZE; ++i)
|
|
{
|
|
if(font_table[i * 2 + 1])
|
|
{
|
|
fclose((FILE*) font_table[i * 2 + 1]);
|
|
font_table[i * 2 + 1] = 0;
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void se_minigui_init_fonts(void)
|
|
{
|
|
int i = 0;
|
|
int pos = 0;
|
|
|
|
ASSERT (DEFAULT_LOGICAL_FONT_INDEX >= 0 &&
|
|
DEFAULT_LOGICAL_FONT_INDEX < LOGICAL_FONT_TABLE_SIZE);
|
|
|
|
se_minigui_destroy_fonts();
|
|
|
|
init_logical_font_map();
|
|
|
|
#ifdef SE_FONT_DYNAMIC_LOADING_SUPPORT
|
|
for(; i < FONT_TABLE_SIZE; ++i)
|
|
{
|
|
if(font_name_config[i].font_name)
|
|
{
|
|
FILE* handle;
|
|
|
|
handle = se_minigui_open_font_file(font_name_config[i].font_name);
|
|
|
|
ASSERT (font_table[i * 2 + 1] == 0);
|
|
|
|
if (handle)
|
|
{
|
|
font_table[i * 2 + 1] = (void*)handle;
|
|
}
|
|
else
|
|
{
|
|
ASSERT (font_name_config[i].logical_font_index >= 0 &&
|
|
font_name_config[i].logical_font_index < LOGICAL_FONT_TABLE_SIZE);
|
|
ASSERT (logical_font_table_index_map[font_name_config[i].logical_font_index] == font_name_config[i].logical_font_index);
|
|
|
|
logical_font_table_index_map[font_name_config[i].logical_font_index] = DEFAULT_LOGICAL_FONT_INDEX;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
build_logical_font_table();
|
|
}
|