/* allocate a fontquerynode and fill in properties */ static struct FontQueryNode * fnt_getfqnode(DFBDISPLAY *mod, TSTRPTR filename, TINT pxsize) { TAPTR exec = TGetExecBase(mod); struct FontQueryNode *fqnode = TNULL; /* allocate fquery node */ fqnode = TExecAlloc0(exec, mod->dfb_MemMgr, sizeof(struct FontQueryNode)); if (fqnode) { /* fquerynode ready - fill in attributes */ TSTRPTR myfname = TNULL; TINT flen = strlen(filename)-4; /* discard '.ttf' */ if (flen > 0) myfname = TExecAlloc0(exec, mod->dfb_MemMgr, flen + 1); else TDBPRINTF(TDB_ERROR,("found invalid font: '%s'\n", filename)); if (myfname) { TExecCopyMem(exec, filename, myfname, flen); fqnode->tags[0].tti_Tag = TVisual_FontName; fqnode->tags[0].tti_Value = (TTAG) myfname; } else { if (flen > 0) TDBPRINTF(TDB_FAIL,("out of memory :(\n")); } if (fqnode->tags[0].tti_Value) { TINT i = 1; fqnode->tags[i].tti_Tag = TVisual_FontPxSize; fqnode->tags[i++].tti_Value = (TTAG) pxsize; /* always true */ fqnode->tags[i].tti_Tag = TVisual_FontScaleable; fqnode->tags[i++].tti_Value = (TTAG) TTRUE; fqnode->tags[i].tti_Tag = TTAG_DONE; } else { TExecFree(exec, fqnode); fqnode = TNULL; } } /* endif fqnode */ else TDBPRINTF(TDB_FAIL,("out of memory :(\n")); return fqnode; }
TLIBAPI TAPTR TNewInstance(TAPTR mod, TUINT possize, TUINT negsize) { TAPTR exec = TGetExecBase(mod); TAPTR inst = TExecAlloc(exec, TNULL, possize + negsize); if (inst) { TUINT size = TMIN(((struct TModule *) mod)->tmd_NegSize, negsize); inst = (TINT8 *) inst + negsize; if (size > 0) TExecCopyMem(exec, (TINT8 *) mod - size, (TINT8 *) inst - size, size); size = TMIN(((struct TModule *) mod)->tmd_PosSize, possize); TExecCopyMem(exec, mod, inst, size); ((struct TModule *) inst)->tmd_PosSize = possize; ((struct TModule *) inst)->tmd_NegSize = negsize; ((struct TModule *) inst)->tmd_InitTask = TExecFindTask(exec, TNULL); } return inst; }
/* parses a single fontname or a comma separated list of fontnames ** and returns a list of fontnames, spaces are NOT filtered, so ** "helvetica, fixed" will result in "helvetica" and " fixed" */ static void fnt_getfnnodes(DFBDISPLAY *mod, struct TList *fnlist, TSTRPTR fname) { TINT i, p = 0; TBOOL lastrun = TFALSE; TINT fnlen = strlen(fname); TAPTR exec = TGetExecBase(mod); for (i = 0; i < fnlen; i++) { if (i == fnlen-1) lastrun = TTRUE; if (fname[i] == ',' || lastrun) { TINT len = (i > p) ? (lastrun ? (i-p+1) : (i-p)) : fnlen+1; TSTRPTR ts = TExecAlloc0(exec, mod->dfb_MemMgr, len+1); if (ts) { struct fnt_node *fnn; TExecCopyMem(exec, fname+p, ts, len); fnn = TExecAlloc0(exec, mod->dfb_MemMgr, sizeof(struct fnt_node)); if (fnn) { /* add fnnode to fnlist */ fnn->fname = ts; TAddTail(fnlist, &fnn->node); } else { TDBPRINTF(TDB_FAIL,("out of memory :(\n")); break; } } else { TDBPRINTF(TDB_FAIL,("out of memory :(\n")); break; } p = i+1; } } }