1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2010 Jonathan Gordon
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
30 #include "skin_buffer.h"
31 #include "skin_fonts.h"
33 static struct skin_font_info
{
38 int ref_count
; /* how many times has this font been loaded? */
39 } font_table
[MAXUSERFONTS
];
41 /* need this to know if we should be closing font fd's on the next init */
42 static bool first_load
= true;
44 void skin_font_init(void)
47 for(i
=0;i
<MAXUSERFONTS
;i
++)
50 font_unload(font_table
[i
].font_id
);
51 font_table
[i
].font_id
= -1;
52 font_table
[i
].name
[0] = '\0';
53 font_table
[i
].buffer
= NULL
;
54 font_table
[i
].ref_count
= 0;
59 /* load a font into the skin buffer. return the font id. */
60 int skin_font_load(char* font_name
, int glyphs
)
63 int skin_font_size
= 0;
65 struct skin_font_info
*font
= NULL
;
66 char filename
[MAX_PATH
];
69 if (!strcmp(font_name
, global_settings
.font_file
))
71 #ifdef HAVE_REMOTE_LCD
72 if (!strcmp(font_name
, global_settings
.remote_font_file
))
73 return FONT_UI_REMOTE
;
75 snprintf(tmp
, MAX_PATH
, FONT_DIR
"/%s.fnt", font_name
);
76 get_user_file_path(tmp
, FORCE_BUFFER_COPY
, filename
, sizeof(filename
));
78 for(i
=0;i
<MAXUSERFONTS
;i
++)
80 if (font_table
[i
].font_id
>= 0 && !strcmp(font_table
[i
].name
, filename
))
82 font_table
[i
].ref_count
++;
83 return font_table
[i
].font_id
;
85 else if (!font
&& font_table
[i
].font_id
== -1)
87 font
= &font_table
[i
];
88 strcpy(font_table
[i
].name
, filename
);
92 return -1; /* too many fonts loaded */
98 glyphs
= GLYPHS_TO_CACHE
;
100 skin_font_size
= font_glyphs_to_bufsize(filename
, glyphs
);
102 if ( !skin_font_size
)
104 skin_font_size
= SKIN_FONT_SIZE
;
106 pf
->buffer_start
= (char*)skin_buffer_alloc(skin_font_size
);
107 if (!pf
->buffer_start
)
109 font
->buffer
= pf
->buffer_start
;
110 pf
->buffer_size
= skin_font_size
;
114 pf
->buffer_start
= font
->buffer
;
118 font
->font_id
= font_load(pf
, filename
);
120 if (font
->font_id
< 0)
124 return font
->font_id
;
126 /* unload a skin font. If a font has been loaded more than once it wont actually
127 * be unloaded untill all references have been unloaded */
128 void skin_font_unload(int font_id
)
131 for(i
=0;i
<MAXUSERFONTS
;i
++)
133 if (font_table
[i
].font_id
== font_id
)
135 if (--font_table
[i
].ref_count
== 0)
137 font_unload(font_id
);
138 font_table
[i
].font_id
= -1;
139 font_table
[i
].name
[0] = '\0';