static int objchr_to_ftvfontdata(VFont *vfont, FT_ULong charcode) { // Freetype2 FT_Face face; struct TmpFont *tf; // Find the correct FreeType font tf= vfont_find_tmpfont(vfont); // What, no font found. Something strange here if(!tf) return FALSE; // Load the font to memory if(tf->pf) { err= FT_New_Memory_Face( library, tf->pf->data, tf->pf->size, 0, &face); if (err) return FALSE; } else { err = TRUE; return FALSE; } // Read the char freetypechar_to_vchar(face, charcode, vfont->data); // And everything went ok return TRUE; }
static VFontData *vfont_get_data(Main *bmain, VFont *vfont) { struct TmpFont *tmpfnt = NULL; PackedFile *tpf; if (vfont==NULL) return NULL; // Try finding the font from font list tmpfnt = vfont_find_tmpfont(vfont); // And then set the data if (!vfont->data) { PackedFile *pf; if (strcmp(vfont->name, FO_BUILTIN_NAME)==0) { pf= get_builtin_packedfile(); } else { if (vfont->packedfile) { pf= vfont->packedfile; // We need to copy a tmp font to memory unless it is already there if (!tmpfnt) { tpf= MEM_callocN(sizeof(*tpf), "PackedFile"); tpf->data= MEM_mallocN(pf->size, "packFile"); tpf->size= pf->size; memcpy(tpf->data, pf->data, pf->size); // Add temporary packed file to globals tmpfnt= (struct TmpFont *) MEM_callocN(sizeof(struct TmpFont), "temp_font"); tmpfnt->pf= tpf; tmpfnt->vfont= vfont; BLI_addtail(&ttfdata, tmpfnt); } } else { pf= newPackedFile(NULL, vfont->name, ID_BLEND_PATH(bmain, &vfont->id)); if (!tmpfnt) { tpf= newPackedFile(NULL, vfont->name, ID_BLEND_PATH(bmain, &vfont->id)); // Add temporary packed file to globals tmpfnt= (struct TmpFont *) MEM_callocN(sizeof(struct TmpFont), "temp_font"); tmpfnt->pf= tpf; tmpfnt->vfont= vfont; BLI_addtail(&ttfdata, tmpfnt); } } if (!pf) { printf("Font file doesn't exist: %s\n", vfont->name); strcpy(vfont->name, FO_BUILTIN_NAME); pf= get_builtin_packedfile(); } } if (pf) { vfont->data= BLI_vfontdata_from_freetypefont(pf); if (pf != vfont->packedfile) { freePackedFile(pf); } } } return vfont->data; }