summaryrefslogtreecommitdiff
path: root/atari
diff options
context:
space:
mode:
authorOle Loots <ole@monochrom.net>2012-08-25 05:23:10 +0200
committerOle Loots <ole@monochrom.net>2012-08-25 05:23:10 +0200
commitc5a84e17f78ff82d98af155c9d075e7b0f4978cf (patch)
tree25c1be6402ecc6616059dd0fc8ce9a7dd41a22be /atari
parentff2f1f1836f4a3b33bbfaafbb2bbdc2c1dba4d63 (diff)
downloadnetsurf-c5a84e17f78ff82d98af155c9d075e7b0f4978cf.tar.gz
netsurf-c5a84e17f78ff82d98af155c9d075e7b0f4978cf.tar.bz2
Merged some features from framebuffer freetype impl.
- Set default font for font faces which failed to load. - Lookup more font faces (Cursive, Fantasy).
Diffstat (limited to 'atari')
-rwxr-xr-xatari/plot/font_freetype.c167
-rwxr-xr-xatari/plot/font_freetype.h2
2 files changed, 106 insertions, 63 deletions
diff --git a/atari/plot/font_freetype.c b/atari/plot/font_freetype.c
index 8b526a743..8eb15e280 100755
--- a/atari/plot/font_freetype.c
+++ b/atari/plot/font_freetype.c
@@ -23,11 +23,16 @@
#include "desktop/options.h"
#include "atari/plot/plot.h"
-#include "atari/plot/font_freetype.h"
+#include "atari/plot/font_freetype.h"
+#include "atari/findfile.h"
+#define DEJAVU_PATH "/usr/share/fonts/truetype/ttf-dejavu/"
+#define CACHE_SIZE 2048
+#define CACHE_MIN_SIZE (100 * 1024)
+#define BOLD_WEIGHT 700
-#define DEJAVU_PATH "/usr/share/fonts/truetype/ttf-dejavu/"
-
+extern css_fixed nscss_screen_dpi;
+
extern unsigned long atari_plot_flags;
extern int atari_plot_vdi_handle;
@@ -123,50 +128,64 @@ ft_new_face(const char *option, const char *resname, const char *fontfile)
newf = font_faces[FONT_FACE_DEFAULT]; /* use default */
}
return newf;
-}
-
-static void ft_fill_scalar(const plot_font_style_t *fstyle, FTC_Scaler srec)
-{
- int selected_face = FONT_FACE_DEFAULT;
-
- switch (fstyle->family) {
-/*
- case PLOT_FONT_FAMILY_CURSIVE:
- break;
- case PLOT_FONT_FAMILY_FANTASY:
- break;
-*/
- case PLOT_FONT_FAMILY_SERIF:
- if (fstyle->weight >= 700)
- selected_face = FONT_FACE_SERIF_BOLD;
- else
- selected_face = FONT_FACE_SERIF;
-
- break;
-
- case PLOT_FONT_FAMILY_MONOSPACE:
- selected_face = FONT_FACE_MONOSPACE;
- break;
-
- case PLOT_FONT_FAMILY_SANS_SERIF:
- default:
- if ((fstyle->flags & FONTF_ITALIC) || (fstyle->flags & FONTF_OBLIQUE)) {
- if (fstyle->weight >= 700)
- selected_face = FONT_FACE_SANS_SERIF_ITALIC_BOLD;
- else
- selected_face = FONT_FACE_SANS_SERIF_ITALIC;
- } else {
- if (fstyle->weight >= 700)
- selected_face = FONT_FACE_SANS_SERIF_BOLD;
- else
- selected_face = FONT_FACE_SANS_SERIF;
- }
- }
-
- srec->face_id = (FTC_FaceID)font_faces[selected_face];
- srec->width = srec->height = (fstyle->size * 64) / FONT_SIZE_SCALE;
- srec->pixel = 0;
- srec->x_res = srec->y_res = 72;
+}
+
+static void ft_fill_scalar(const plot_font_style_t *fstyle, FTC_Scaler srec)
+{
+ int selected_face = FONT_FACE_DEFAULT;
+
+ switch (fstyle->family) {
+
+ case PLOT_FONT_FAMILY_SERIF:
+ if (fstyle->weight >= BOLD_WEIGHT) {
+ selected_face = FONT_FACE_SERIF_BOLD;
+ } else {
+ selected_face = FONT_FACE_SERIF;
+ }
+ break;
+
+ case PLOT_FONT_FAMILY_MONOSPACE:
+ if (fstyle->weight >= BOLD_WEIGHT) {
+ selected_face = FONT_FACE_MONOSPACE_BOLD;
+ } else {
+ selected_face = FONT_FACE_MONOSPACE;
+ }
+ break;
+
+ case PLOT_FONT_FAMILY_CURSIVE:
+ selected_face = FONT_FACE_CURSIVE;
+ break;
+
+ case PLOT_FONT_FAMILY_FANTASY:
+ selected_face = FONT_FACE_FANTASY;
+ break;
+
+ case PLOT_FONT_FAMILY_SANS_SERIF:
+ default:
+ if ((fstyle->flags & FONTF_ITALIC) ||
+ (fstyle->flags & FONTF_OBLIQUE)) {
+ if (fstyle->weight >= BOLD_WEIGHT) {
+ selected_face = FONT_FACE_SANS_SERIF_ITALIC_BOLD;
+ } else {
+ selected_face = FONT_FACE_SANS_SERIF_ITALIC;
+ }
+ } else {
+ if (fstyle->weight >= BOLD_WEIGHT) {
+ selected_face = FONT_FACE_SANS_SERIF_BOLD;
+ } else {
+ selected_face = FONT_FACE_SANS_SERIF;
+ }
+ }
+ }
+
+ srec->face_id = (FTC_FaceID)font_faces[selected_face];
+
+ srec->width = srec->height = (fstyle->size * 64) / FONT_SIZE_SCALE;
+ srec->pixel = 0;
+
+ /* calculate x/y resolution, when nscss_screen_dpi isn't available */
+ /* 72 is an good value. */
+ srec->x_res = srec->y_res = FIXTOINT(nscss_screen_dpi);
}
static FT_Glyph ft_getglyph(const plot_font_style_t *fstyle, uint32_t ucs4)
@@ -198,7 +217,8 @@ static bool ft_font_init(void)
{
FT_Error error;
FT_ULong max_cache_size;
- FT_UInt max_faces = 6;
+ FT_UInt max_faces = 6;
+ int i;
/* freetype library initialise */
error = FT_Init_FreeType( &library );
@@ -206,8 +226,12 @@ static bool ft_font_init(void)
LOG(("Freetype could not initialised (code %d)\n", error));
return false;
}
-
- max_cache_size = 2 * 1024 *1024; /* 2MB should be enough */
+
+ /* set the Glyph cache size up */
+ max_cache_size = CACHE_SIZE * 1024;
+ if (max_cache_size < CACHE_MIN_SIZE) {
+ max_cache_size = CACHE_MIN_SIZE;
+ }
/* cache manager initialise */
error = FTC_Manager_New(library,
@@ -225,7 +249,11 @@ static bool ft_font_init(void)
error = FTC_CMapCache_New(ft_cmanager, &ft_cmap_cache);
error = FTC_ImageCache_New(ft_cmanager, &ft_image_cache);
-
+
+ /* Optain font faces */
+
+
+ /* Default font, Sans Serif */
font_faces[FONT_FACE_SANS_SERIF] = NULL;
font_faces[FONT_FACE_SANS_SERIF] = ft_new_face(
nsoption_charp(atari_face_sans_serif),
@@ -234,55 +262,70 @@ static bool ft_font_init(void)
);
if (font_faces[FONT_FACE_SANS_SERIF] == NULL) {
LOG(("Could not find default font (code %d)\n", error));
- FTC_Manager_Done(ft_cmanager );
+ FTC_Manager_Done(ft_cmanager);
FT_Done_FreeType(library);
return false;
}
-
+
+ /* Sans Serif Bold*/
font_faces[FONT_FACE_SANS_SERIF_BOLD] =
ft_new_face(nsoption_charp(atari_face_sans_serif_bold),
"fonts/ssb.ttf",
- DEJAVU_PATH"DejaVuSans-Bold.ttf");
-
+ DEJAVU_PATH"DejaVuSans-Bold.ttf");
+
+ /* Sans Serif Italic */
font_faces[FONT_FACE_SANS_SERIF_ITALIC] =
ft_new_face(nsoption_charp(atari_face_sans_serif_italic),
"fonts/ssi.ttf",
DEJAVU_PATH"DejaVuSans-Oblique.ttf");
-
+
+ /* Sans Serif Italic Bold */
font_faces[FONT_FACE_SANS_SERIF_ITALIC_BOLD] =
ft_new_face(nsoption_charp(atari_face_sans_serif_italic_bold),
"fonts/ssib.ttf",
DEJAVU_PATH"DejaVuSans-BoldOblique.ttf");
-
+
+ /* Monospaced */
font_faces[FONT_FACE_MONOSPACE] =
ft_new_face(nsoption_charp(atari_face_monospace),
"fonts/mono.ttf",
DEJAVU_PATH"DejaVuSansMono.ttf");
-
+
+ /* Mospaced Bold */
font_faces[FONT_FACE_MONOSPACE_BOLD] =
ft_new_face(nsoption_charp(atari_face_monospace_bold),
"fonts/monob.ttf",
DEJAVU_PATH"DejaVuSansMono-Bold.ttf");
-
+
+ /* Serif */
font_faces[FONT_FACE_SERIF] =
ft_new_face(nsoption_charp(atari_face_serif),
"fonts/s.ttf",
DEJAVU_PATH"DejaVuSerif.ttf");
-
+
+ /* Serif Bold */
font_faces[FONT_FACE_SERIF_BOLD] =
ft_new_face(nsoption_charp(atari_face_serif_bold),
"fonts/sb.ttf",
DEJAVU_PATH"DejaVuSerif-Bold.ttf");
-
+
+ /* Cursive */
font_faces[FONT_FACE_CURSIVE] =
ft_new_face(nsoption_charp(atari_face_cursive),
"fonts/cursive.ttf",
DEJAVU_PATH"DejaVuSansMono-Oblique.ttf");
-
+
+ /* Fantasy */
font_faces[FONT_FACE_FANTASY] =
ft_new_face(nsoption_charp(atari_face_fantasy),
"fonts/fantasy.ttf",
DEJAVU_PATH"DejaVuSerifCondensed-Bold.ttf");
+
+ for (i=1; i<FONT_FACE_COUNT; i++) {
+ if (font_faces[i] == NULL){
+ font_faces[i] = font_faces[FONT_FACE_SANS_SERIF];
+ }
+ }
return true;
}
diff --git a/atari/plot/font_freetype.h b/atari/plot/font_freetype.h
index bca6d9956..1e64ebc5d 100755
--- a/atari/plot/font_freetype.h
+++ b/atari/plot/font_freetype.h
@@ -48,4 +48,4 @@ struct font_desc {
/* extern int ft_load_type; */
int ctor_font_plotter_freetype( FONT_PLOTTER self );
-#endif \ No newline at end of file
+#endif