unsigned int font_data_id;
Font_Source *src;
void *ft; // Font_Info
- Fash_Glyph2 *glyph_entries; // Fast access to the Glyph_Entry objects
+ Fash_Glyph2 *glyph_entries[3]; // Fast access to the Glyph_Entry objects
Shared_Array *glyph_datas; // Contains the Glyph_Data objects
unsigned int nglyphs;
Eina_Bool unused : 1;
_font_entry_free(Font_Entry *fe)
{
Font_Data *fd;
- int size;
+ int size, k;
if (!fe) return;
size = _font_entry_memory_usage_get(fe);
cserve2_shared_string_del(fd->name);
}
- fash_gl_free(fe->glyph_entries);
+ for (k = 0; k < 3; k++)
+ fash_gl_free(fe->glyph_entries[k]);
cserve2_shared_array_del(fe->glyph_datas);
cserve2_shared_mempool_del(fe->mempool);
cserve2_font_ft_free(fe->ft);
static Eina_Bool
_glyphs_request_check(Glyphs_Request *req, Eina_Bool report_load)
{
- unsigned int i;
+ unsigned int i, hint;
Font_Entry *fe = req->fe;
req->answer = malloc(sizeof(*req->answer) * req->nglyphs);
req->nanswer = 0;
+ hint = req->hint;
+ if (hint > 2)
+ {
+ WRN("Invalid font hint requested. Defaulting to 0.");
+ hint = 0;
+ }
+
for (i = req->current; i < req->nglyphs; i++)
{
Glyph_Entry *ge;
- ge = fash_gl_find(fe->glyph_entries, req->glyphs[i]);
+ ge = fash_gl_find(fe->glyph_entries[hint], req->glyphs[i]);
if (ge)
{
req->answer[req->nanswer++] = ge;
size = sizeof(Msg_Font_Glyphs_Loaded);
size += sizeof(int) * 2;
size += shmname_size;
- size += req->nanswer * 9 * sizeof(int);
+ size += req->nanswer * 10 * sizeof(int);
response = malloc(size);
if (!response) return NULL;
buf += sizeof(int);
memcpy(buf, &gldata->pixel_mode, sizeof(int));
buf += sizeof(int);
+ memcpy(buf, &gldata->hint, sizeof(int));
+ buf += sizeof(int);
}
*resp_size = size;
static void
_glyphs_load_request_prepare(Glyphs_Request *req)
{
- unsigned int i, max;
+ unsigned int i, max, hint;
req->nrender = 0;
Font_Entry *fe = req->fe;
return;
}
+ hint = req->hint;
+ if (hint > 2)
+ {
+ WRN("Invalid font hint requested. Defaulting to 0.");
+ hint = 0;
+ }
+
// Won't render more than this number of glyphs
max = req->nglyphs - req->nanswer;
req->render = malloc(sizeof(*req->render) * max);
for (i = req->current; i < req->nglyphs; i++)
{
Glyph_Entry *ge;
- ge = fash_gl_find(fe->glyph_entries, req->glyphs[i]);
+ ge = fash_gl_find(fe->glyph_entries[hint], req->glyphs[i]);
if (ge)
{
req->answer[req->nanswer++] = ge;
{
Font_Entry *fe = req->fe;
Shared_Mempool *mempool = msg->mempool;
- unsigned int j;
+ unsigned int j, hint;
string_t shm_id = 0;
Font_Data *fd;
if (!msg->nglyphs)
return _glyphs_loaded_msg_create(req, size);
+ hint = req->hint;
+ if (hint > 2)
+ {
+ WRN("Invalid font hint requested. Defaulting to 0.");
+ hint = 0;
+ }
+
fd = _font_data_find(fe->font_data_id);
DBG("Font memory usage [begin]: %d / %d", font_mem_usage, max_font_usage);
{
Glyph_Entry *gl;
- gl = fash_gl_find(fe->glyph_entries, msg->glyphs[j].index);
+ gl = fash_gl_find(fe->glyph_entries[hint], msg->glyphs[j].index);
if (!gl)
{
int glyph_id, orig_mapsize, new_mapsize;
gldata->pitch = msg->glyphs[j].pitch;
gldata->num_grays = msg->glyphs[j].num_grays;
gldata->pixel_mode = msg->glyphs[j].pixel_mode;
+ gldata->hint = hint;
fe->nglyphs++;
- fash_gl_add(fe->glyph_entries, gldata->index, gl);
+ fash_gl_add(fe->glyph_entries[hint], gldata->index, gl);
new_mapsize = cserve2_shared_array_map_size_get(fe->glyph_datas);
font_mem_usage += new_mapsize - orig_mapsize;
Font_Entry *fe;
char *fullname;
int fd_index;
+ int k;
if (source && !*source)
source = NULL;
fe->size = size;
fe->dpi = dpi;
fe->base.type = CSERVE2_FONT_ENTRY;
- fe->glyph_entries = fash_gl_new(_glyph_free_cb);
+ for (k = 0; k < 3; k++)
+ fe->glyph_entries[k] = fash_gl_new(_glyph_free_cb);
ref = _entry_reference_add((Entry *)fe, client, 0);
client->fonts.referencing = eina_list_append(client->fonts.referencing, ref);
fe->unused = EINA_FALSE;
int nglyphs = 0;
int mem_used = 0;
- printf(" GlyphID Refcnt Index Size Rows Width Pitch Grays Mode "
+ printf(" GlyphID Refcnt Index Size Rows Width Pitch Grays H M "
"BufID Offset ShmPath\n");
for (k = 0; k < sf->header->count; k++)
if (!gd) break;
if (!gd->id) continue;
- printf(" %8u %6u %6u %5u %5u %5u %5u %5u %5u %6u %6u '%s'\n",
+ printf(" %8u %6u %6u %5u %5u %5u %5u %5u %1u %1u %6u %6u '%s'\n",
gd->id, gd->refcount, gd->index, gd->size, gd->rows, gd->width,
- gd->pitch, gd->num_grays, gd->pixel_mode, gd->buffer_id,
+ gd->pitch, gd->num_grays, gd->hint, gd->pixel_mode, gd->buffer_id,
gd->offset, _shared_string_get(gd->shm_id));
nglyphs++;
printf("List of loaded fonts: %s\n", eina_file_filename_get(sf_fonts->f));
printf("Rendering flags: "
- "R: Regular, S: Slanted, W: Weight, X: Invalid\n\n");
+ "R: Regular, S: Slanted, W: Weight, X: Invalid\n");
+ printf("H: Hint, M: Pixel mode\n\n");
printf_newline(0);
for (k = 0; k < sf_fonts->header->count; k++)
gd = &(fe->map->index.entries.gldata[k]);
if (!gd->id) break;
if (!gd->refcount) continue;
+ if (gd->hint != hints) continue;
tot++;
gl = fash_gl_find(fe->fash[hints], gd->index);
for (i = 0; i < nglyphs; i++)
{
string_t shm_id;
- unsigned int idx, offset, glsize;
+ unsigned int idx, offset, glsize, hints;
int rows, width, pitch, num_grays, pixel_mode;
CS_Glyph_Out *gl;
buf += sizeof(int);
memcpy(&pixel_mode, buf, sizeof(int));
buf += sizeof(int);
+ memcpy(&hints, buf, sizeof(int));
+ buf += sizeof(int);
+ if (hints != grd->hints)
+ {
+ WRN("Invalid hints received: %d vs %d. Skip.", hints, grd->hints);
+ continue;
+ }
- gl = fash_gl_find(fe->fash[grd->hints], idx);
+ gl = fash_gl_find(fe->fash[hints], idx);
if (gl)
{
gl->map = fe->map;