code cleanup: vfont's used confusing and over complicated method of storing memory...
authorCampbell Barton <ideasman42@gmail.com>
Tue, 21 Aug 2012 10:39:02 +0000 (10:39 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 21 Aug 2012 10:39:02 +0000 (10:39 +0000)
12 files changed:
intern/guardedalloc/MEM_guardedalloc.h
intern/guardedalloc/intern/mallocn.c
source/blender/blenkernel/BKE_font.h
source/blender/blenkernel/BKE_packedFile.h
source/blender/blenkernel/intern/font.c
source/blender/blenkernel/intern/packedFile.c
source/blender/blenlib/BLI_vfontdata.h
source/blender/blenlib/intern/freetypefont.c
source/blender/blenloader/intern/readfile.c
source/blender/makesdna/DNA_vfont_types.h
source/blender/windowmanager/intern/wm_files.c
source/blender/windowmanager/intern/wm_init_exit.c

index 149483e..6973c19 100644 (file)
@@ -92,7 +92,7 @@ extern "C" {
        /**
         * Duplicates a block of memory, and returns a pointer to the
         * newly allocated block.  */
-       void *MEM_dupallocN(void *vmemh)
+       void *MEM_dupallocN(const void *vmemh)
 #if MEM_GNU_ATTRIBUTES
        __attribute__((warn_unused_result))
 #endif
index df6f4d5..a65871f 100644 (file)
@@ -248,12 +248,12 @@ size_t MEM_allocN_len(const void *vmemh)
        }
 }
 
-void *MEM_dupallocN(void *vmemh)
+void *MEM_dupallocN(const void *vmemh)
 {
        void *newp = NULL;
        
        if (vmemh) {
-               MemHead *memh = vmemh;
+               const MemHead *memh = vmemh;
                memh--;
 
 #ifndef DEBUG_MEMDUPLINAME
index 938a134..cd52dd7 100644 (file)
@@ -76,13 +76,9 @@ void BKE_vfont_builtin_register(void *mem, int size);
 
 void BKE_vfont_free_data(struct VFont *vfont);
 void BKE_vfont_free(struct VFont *sc); 
-void BKE_vfont_free_global_ttf(void);
 struct VFont *BKE_vfont_builtin_get(void);
 struct VFont *BKE_vfont_load(struct Main *bmain, const char *name);
 
-struct TmpFont *BKE_vfont_tmpfont_find(struct VFont *vfont);
-void            BKE_vfont_tmpfont_remove(struct VFont *vfont);
-
 struct CharTrans *BKE_vfont_to_curve(struct Main *bmain, struct Scene *scene, struct Object *ob, int mode);
 
 int BKE_vfont_select_get(struct Object *ob, int *start, int *end);
index 1891840..ecbd2e7 100644 (file)
@@ -43,6 +43,7 @@ struct ReportList;
 struct VFont;
 
 /* pack */
+struct PackedFile *dupPackedFileMemory(const struct PackedFile *pf_src);
 struct PackedFile *newPackedFile(struct ReportList *reports, const char *filename, const char *relabase);
 struct PackedFile *newPackedFileMemory(void *mem, int memlen);
 
index 49c3d77..8689d66 100644 (file)
 #include "BKE_curve.h"
 #include "BKE_displist.h"
 
-static ListBase ttfdata = {NULL, NULL};
+//static ListBase ttfdata = {NULL, NULL};
 
 /* The vfont code */
-
 void BKE_vfont_free_data(struct VFont *vfont)
 {
        if (vfont->data) {
@@ -83,7 +82,10 @@ void BKE_vfont_free_data(struct VFont *vfont)
                vfont->data = NULL;
        }
 
-       BKE_vfont_tmpfont_remove(vfont);
+       if (vfont->temp_pf) {
+               freePackedFile(vfont->temp_pf);  /* NULL when the font file can't be found on disk */
+               vfont->temp_pf = NULL;
+       }
 }
 
 void BKE_vfont_free(struct VFont *vf)
@@ -91,7 +93,7 @@ void BKE_vfont_free(struct VFont *vf)
        if (vf == NULL) return;
 
        BKE_vfont_free_data(vf);
-       
+
        if (vf->packedfile) {
                freePackedFile(vf->packedfile);
                vf->packedfile = NULL;
@@ -128,63 +130,11 @@ static PackedFile *get_builtin_packedfile(void)
        }
 }
 
-static void vfont_tmpfont_free(struct TmpFont *tf)
-{
-       if (tf->pf) {
-               freePackedFile(tf->pf);  /* NULL when the font file can't be found on disk */
-       }
-       MEM_freeN(tf);
-}
-
-void BKE_vfont_free_global_ttf(void)
-{
-       struct TmpFont *tf, *tf_next;
-
-       for (tf = ttfdata.first; tf; tf = tf_next) {
-               tf_next = tf->next;
-               vfont_tmpfont_free(tf);
-       }
-       ttfdata.first = ttfdata.last = NULL;
-}
-
-struct TmpFont *BKE_vfont_tmpfont_find(VFont *vfont)
-{
-       struct TmpFont *tmpfnt = NULL;
-       
-       if (vfont == NULL) return NULL;
-       
-       /* Try finding the font from font list */
-       for (tmpfnt = ttfdata.first; tmpfnt; tmpfnt = tmpfnt->next) {
-               if (tmpfnt->vfont == vfont) {
-                       break;
-               }
-       }
-
-       return tmpfnt;
-}
-
-/* assumes a VFont's tmpfont can't be in the database more then once */
-void BKE_vfont_tmpfont_remove(VFont *vfont)
-{
-       struct TmpFont *tmpfnt;
-
-       tmpfnt = BKE_vfont_tmpfont_find(vfont);
-
-       if (tmpfnt) {
-               vfont_tmpfont_free(tmpfnt);
-               BLI_remlink(&ttfdata, tmpfnt);
-       }
-}
-
 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 = BKE_vfont_tmpfont_find(vfont);
+       if (vfont == NULL) {
+               return NULL;
+       }
 
        /* And then set the data */
        if (!vfont->data) {
@@ -198,30 +148,15 @@ static VFontData *vfont_get_data(Main *bmain, VFont *vfont)
                                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);
+                               if (vfont->temp_pf == NULL) {
+                                       vfont->temp_pf = dupPackedFileMemory(pf);
                                }
                        }
                        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 (vfont->temp_pf == NULL) {
+                                       vfont->temp_pf = newPackedFile(NULL, vfont->name, ID_BLEND_PATH(bmain, &vfont->id));
                                }
                        }
                        if (!pf) {
@@ -252,9 +187,8 @@ VFont *BKE_vfont_load(Main *bmain, const char *name)
        char filename[FILE_MAXFILE];
        VFont *vfont = NULL;
        PackedFile *pf;
-       PackedFile *tpf = NULL; 
+       PackedFile *temp_pf = NULL;
        int is_builtin;
-       struct TmpFont *tmpfnt;
        
        if (strcmp(name, FO_BUILTIN_NAME) == 0) {
                BLI_strncpy(filename, name, sizeof(filename));
@@ -269,7 +203,7 @@ VFont *BKE_vfont_load(Main *bmain, const char *name)
                BLI_splitdirstring(dir, filename);
 
                pf = newPackedFile(NULL, name, bmain->name);
-               tpf = newPackedFile(NULL, name, bmain->name);
+               temp_pf = newPackedFile(NULL, name, bmain->name);
                
                is_builtin = FALSE;
        }
@@ -295,10 +229,7 @@ VFont *BKE_vfont_load(Main *bmain, const char *name)
 
                        /* Do not add FO_BUILTIN_NAME to temporary listbase */
                        if (strcmp(filename, FO_BUILTIN_NAME)) {
-                               tmpfnt = (struct TmpFont *) MEM_callocN(sizeof(struct TmpFont), "temp_font");
-                               tmpfnt->pf = tpf;
-                               tmpfnt->vfont = vfont;
-                               BLI_addtail(&ttfdata, tmpfnt);
+                               vfont->temp_pf = temp_pf;
                        }
                }
 
@@ -324,7 +255,7 @@ static VFont *which_vfont(Curve *cu, CharInfo *info)
                        if (cu->vfontbi) return(cu->vfontbi); else return(cu->vfont);
                default:
                        return(cu->vfont);
-       }                       
+       }
 }
 
 VFont *BKE_vfont_builtin_get(void)
@@ -344,6 +275,7 @@ static VChar *find_vfont_char(VFontData *vfd, intptr_t character)
 {
        VChar *che = NULL;
 
+       /* TODO: use ghash */
        for (che = vfd->characters.first; che; che = che->next) {
                if (che->index == character)
                        break;
index f115a41..ed2f4af 100644 (file)
@@ -158,7 +158,17 @@ void freePackedFile(PackedFile *pf)
        else
                printf("freePackedFile: Trying to free a NULL pointer\n");
 }
-       
+
+PackedFile *dupPackedFileMemory(const PackedFile *pf_src)
+{
+       PackedFile *pf_dst;
+
+       pf_dst       = MEM_dupallocN(pf_src);
+       pf_dst->data = MEM_dupallocN(pf_src->data);
+
+       return pf_dst;
+}
+
 PackedFile *newPackedFileMemory(void *mem, int memlen)
 {
        PackedFile *pf = MEM_callocN(sizeof(*pf), "PackedFile");
index a63ec8e..ed7d10a 100644 (file)
 struct PackedFile;
 struct VFont;
 
-#define MAX_VF_CHARS 256
-
 typedef struct VFontData {
        ListBase characters;
-       // ListBase nurbsbase[MAX_VF_CHARS];
-       // float            resol[MAX_VF_CHARS];
-       // float            width[MAX_VF_CHARS];
-       // float            *points[MAX_VF_CHARS];
        char name[128];
 } VFontData;
 
@@ -59,12 +53,6 @@ typedef struct VChar {
        float           *points;
 } VChar;
 
-struct TmpFont {
-       struct TmpFont *next, *prev;
-       struct PackedFile *pf;
-       struct VFont *vfont;
-};
-
 /**
  * Construct a new VFontData structure from 
  * Freetype font data in a PackedFile.
index 60999e7..597a645 100644 (file)
@@ -293,19 +293,12 @@ static int objchr_to_ftvfontdata(VFont *vfont, FT_ULong charcode)
 {
        /* Freetype2 */
        FT_Face face;
-       struct TmpFont *tf;
-
-       /* Find the correct FreeType font */
-       tf = BKE_vfont_tmpfont_find(vfont);
-
-       /* What, no font found. Something strange here */
-       if (!tf) return FALSE;
 
        /* Load the font to memory */
-       if (tf->pf) {
+       if (vfont->temp_pf) {
                err = FT_New_Memory_Face(library,
-                                        tf->pf->data,
-                                        tf->pf->size,
+                                        vfont->temp_pf->data,
+                                        vfont->temp_pf->size,
                                         0,
                                         &face);
                if (err) return FALSE;
index eb22b9a..719081e 100644 (file)
@@ -2913,6 +2913,7 @@ static void lib_link_vfont(FileData *UNUSED(fd), Main *main)
 static void direct_link_vfont(FileData *fd, VFont *vf)
 {
        vf->data = NULL;
+       vf->temp_pf = NULL;
        vf->packedfile = direct_link_packedfile(fd, vf->packedfile);
 }
 
index 3cccfe6..7aaeaf2 100644 (file)
@@ -46,6 +46,10 @@ typedef struct VFont {
        
        struct VFontData *data;
        struct PackedFile *packedfile;
+
+       /* runtime only, holds memory for freetype to read from
+        * TODO, replace this with blf_font_new() style loading */
+       struct PackedFile *temp_pf;
 } VFont;
 
 /* *************** FONT ****************** */
index 660117d..48b552a 100644 (file)
@@ -380,8 +380,6 @@ void WM_file_read(bContext *C, const char *filepath, ReportList *reports)
                /* assume automated tasks with background, don't write recent file list */
                const int do_history = (G.background == FALSE) && (CTX_wm_manager(C)->op_undo_depth == 0);
 
-               BKE_vfont_free_global_ttf();
-
                /* put aside screens to match with persistent windows later */
                /* also exit screens and editors */
                wm_window_match_init(C, &wmbase); 
@@ -490,9 +488,7 @@ int WM_homefile_read(bContext *C, ReportList *UNUSED(reports), short from_memory
        ListBase wmbase;
        char tstr[FILE_MAX];
        int success = 0;
-       
-       BKE_vfont_free_global_ttf();
-               
+
        G.relbase_valid = 0;
        if (!from_memory) {
                char *cfgdir = BLI_get_folder(BLENDER_USER_CONFIG, NULL);
index af24ea8..8c2272e 100644 (file)
@@ -399,8 +399,6 @@ void WM_exit_ext(bContext *C, const short do_python)
 //     BIF_GlobalReebFree();
 //     BIF_freeRetarget();
        BIF_freeTemplates(C);
-       
-       BKE_vfont_free_global_ttf(); /* bke_font.h */
 
        free_openrecent();