summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/font/font_sdl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/font/font_sdl.c')
-rw-r--r--src/osd/modules/font/font_sdl.c512
1 files changed, 255 insertions, 257 deletions
diff --git a/src/osd/modules/font/font_sdl.c b/src/osd/modules/font/font_sdl.c
index 6ae72ca4fb3..d10f7209ab1 100644
--- a/src/osd/modules/font/font_sdl.c
+++ b/src/osd/modules/font/font_sdl.c
@@ -32,95 +32,95 @@
class osd_font_sdl : public osd_font
{
public:
- virtual ~osd_font_sdl() {};
+ virtual ~osd_font_sdl() {};
- virtual bool open(const char *font_path, const char *name, int &height);
- virtual void close();
- virtual bool get_bitmap(unicode_char chnum, bitmap_argb32 &bitmap, INT32 &width, INT32 &xoffs, INT32 &yoffs);
+ virtual bool open(const char *font_path, const char *name, int &height);
+ virtual void close();
+ virtual bool get_bitmap(unicode_char chnum, bitmap_argb32 &bitmap, INT32 &width, INT32 &xoffs, INT32 &yoffs);
private:
#ifndef SDLMAME_HAIKU
- TTF_Font *search_font_config(astring name, bool bold, bool italic, bool underline, bool &bakedstyles);
+ TTF_Font *search_font_config(astring name, bool bold, bool italic, bool underline, bool &bakedstyles);
#endif
- bool BDF_Check_Magic(astring name);
- TTF_Font * TTF_OpenFont_Magic(astring name, int fsize);
- TTF_Font *m_font;
+ bool BDF_Check_Magic(astring name);
+ TTF_Font * TTF_OpenFont_Magic(astring name, int fsize);
+ TTF_Font *m_font;
};
bool osd_font_sdl::open(const char *font_path, const char *_name, int &height)
{
- TTF_Font *font = (TTF_Font *)NULL;
- bool bakedstyles = false;
- int style = 0;
-
- // accept qualifiers from the name
- astring name(_name);
-
- if (name == "default")
- {
- name = "Liberation Sans";
- }
-
- bool bold = (name.replace(0, "[B]", "") + name.replace(0, "[b]", "") > 0);
- bool italic = (name.replace(0, "[I]", "") + name.replace(0, "[i]", "") > 0);
- bool underline = (name.replace(0, "[U]", "") + name.replace(0, "[u]", "") > 0);
- bool strike = (name.replace(0, "[S]", "") + name.replace(0, "[s]", "") > 0);
-
- // first up, try it as a filename
- font = TTF_OpenFont_Magic(name, POINT_SIZE);
-
- // if no success, try the font path
-
- if (!font)
- {
- osd_printf_verbose("Searching font %s in -%s\n", name.cstr(), OPTION_FONTPATH);
- //emu_file file(options().font_path(), OPEN_FLAG_READ);
- emu_file file(font_path, OPEN_FLAG_READ);
- if (file.open(name) == FILERR_NONE)
- {
- astring full_name = file.fullpath();
- font = TTF_OpenFont_Magic(full_name, POINT_SIZE);
- if (font)
- osd_printf_verbose("Found font %s\n", full_name.cstr());
- }
- }
-
- // if that didn't work, crank up the FontConfig database
+ TTF_Font *font = (TTF_Font *)NULL;
+ bool bakedstyles = false;
+ int style = 0;
+
+ // accept qualifiers from the name
+ astring name(_name);
+
+ if (name == "default")
+ {
+ name = "Liberation Sans";
+ }
+
+ bool bold = (name.replace(0, "[B]", "") + name.replace(0, "[b]", "") > 0);
+ bool italic = (name.replace(0, "[I]", "") + name.replace(0, "[i]", "") > 0);
+ bool underline = (name.replace(0, "[U]", "") + name.replace(0, "[u]", "") > 0);
+ bool strike = (name.replace(0, "[S]", "") + name.replace(0, "[s]", "") > 0);
+
+ // first up, try it as a filename
+ font = TTF_OpenFont_Magic(name, POINT_SIZE);
+
+ // if no success, try the font path
+
+ if (!font)
+ {
+ osd_printf_verbose("Searching font %s in -%s\n", name.cstr(), OPTION_FONTPATH);
+ //emu_file file(options().font_path(), OPEN_FLAG_READ);
+ emu_file file(font_path, OPEN_FLAG_READ);
+ if (file.open(name) == FILERR_NONE)
+ {
+ astring full_name = file.fullpath();
+ font = TTF_OpenFont_Magic(full_name, POINT_SIZE);
+ if (font)
+ osd_printf_verbose("Found font %s\n", full_name.cstr());
+ }
+ }
+
+ // if that didn't work, crank up the FontConfig database
#ifndef SDLMAME_HAIKU
- if (!font)
- {
- font = search_font_config(name, bold, italic, underline, bakedstyles);
- }
+ if (!font)
+ {
+ font = search_font_config(name, bold, italic, underline, bakedstyles);
+ }
#endif
- if (!font)
- {
- if (!BDF_Check_Magic(name))
- {
- osd_printf_verbose("font %s is not TrueType or BDF, using MAME default\n", name.cstr());
- }
- return NULL;
- }
-
- // apply styles
- if (!bakedstyles)
- {
- style |= bold ? TTF_STYLE_BOLD : 0;
- style |= italic ? TTF_STYLE_ITALIC : 0;
- }
- style |= underline ? TTF_STYLE_UNDERLINE : 0;
- // SDL_ttf 2.0.9 and earlier does not define TTF_STYLE_STRIKETHROUGH
+ if (!font)
+ {
+ if (!BDF_Check_Magic(name))
+ {
+ osd_printf_verbose("font %s is not TrueType or BDF, using MAME default\n", name.cstr());
+ }
+ return NULL;
+ }
+
+ // apply styles
+ if (!bakedstyles)
+ {
+ style |= bold ? TTF_STYLE_BOLD : 0;
+ style |= italic ? TTF_STYLE_ITALIC : 0;
+ }
+ style |= underline ? TTF_STYLE_UNDERLINE : 0;
+ // SDL_ttf 2.0.9 and earlier does not define TTF_STYLE_STRIKETHROUGH
#if SDL_VERSIONNUM(TTF_MAJOR_VERSION, TTF_MINOR_VERSION, TTF_PATCHLEVEL) > SDL_VERSIONNUM(2,0,9)
- style |= strike ? TTF_STYLE_STRIKETHROUGH : 0;
+ style |= strike ? TTF_STYLE_STRIKETHROUGH : 0;
#else
- if (strike)
- osd_printf_warning("Ignoring strikethrough for SDL_TTF older than 2.0.10\n");
+ if (strike)
+ osd_printf_warning("Ignoring strikethrough for SDL_TTF older than 2.0.10\n");
#endif // PATCHLEVEL
- TTF_SetFontStyle(font, style);
+ TTF_SetFontStyle(font, style);
- height = TTF_FontLineSkip(font);
+ height = TTF_FontLineSkip(font);
- m_font = font;
- return true;
+ m_font = font;
+ return true;
}
//-------------------------------------------------
@@ -130,7 +130,7 @@ bool osd_font_sdl::open(const char *font_path, const char *_name, int &height)
void osd_font_sdl::close()
{
- TTF_CloseFont(this->m_font);
+ TTF_CloseFont(this->m_font);
}
//-------------------------------------------------
@@ -143,184 +143,184 @@ void osd_font_sdl::close()
bool osd_font_sdl::get_bitmap(unicode_char chnum, bitmap_argb32 &bitmap, INT32 &width, INT32 &xoffs, INT32 &yoffs)
{
- TTF_Font *ttffont;
- SDL_Surface *drawsurf;
- SDL_Color fcol = { 0xff, 0xff, 0xff };
- UINT16 ustr[16];
+ TTF_Font *ttffont;
+ SDL_Surface *drawsurf;
+ SDL_Color fcol = { 0xff, 0xff, 0xff };
+ UINT16 ustr[16];
- ttffont = m_font;
+ ttffont = m_font;
- memset(ustr,0,sizeof(ustr));
- ustr[0] = (UINT16)chnum;
- drawsurf = TTF_RenderUNICODE_Solid(ttffont, ustr, fcol);
+ memset(ustr,0,sizeof(ustr));
+ ustr[0] = (UINT16)chnum;
+ drawsurf = TTF_RenderUNICODE_Solid(ttffont, ustr, fcol);
- // was nothing returned?
- if (drawsurf)
- {
- // allocate a MAME destination bitmap
- bitmap.allocate(drawsurf->w, drawsurf->h);
+ // was nothing returned?
+ if (drawsurf)
+ {
+ // allocate a MAME destination bitmap
+ bitmap.allocate(drawsurf->w, drawsurf->h);
- // copy the rendered character image into it
- for (int y = 0; y < bitmap.height(); y++)
- {
- UINT32 *dstrow = &bitmap.pix32(y);
- UINT8 *srcrow = (UINT8 *)drawsurf->pixels;
+ // copy the rendered character image into it
+ for (int y = 0; y < bitmap.height(); y++)
+ {
+ UINT32 *dstrow = &bitmap.pix32(y);
+ UINT8 *srcrow = (UINT8 *)drawsurf->pixels;
- srcrow += (y * drawsurf->pitch);
+ srcrow += (y * drawsurf->pitch);
- for (int x = 0; x < drawsurf->w; x++)
- {
- dstrow[x] = srcrow[x] ? rgb_t(0xff,0xff,0xff,0xff) : rgb_t(0x00,0xff,0xff,0xff);
- }
- }
+ for (int x = 0; x < drawsurf->w; x++)
+ {
+ dstrow[x] = srcrow[x] ? rgb_t(0xff,0xff,0xff,0xff) : rgb_t(0x00,0xff,0xff,0xff);
+ }
+ }
- // what are these?
- xoffs = yoffs = 0;
- width = drawsurf->w;
+ // what are these?
+ xoffs = yoffs = 0;
+ width = drawsurf->w;
- SDL_FreeSurface(drawsurf);
- }
+ SDL_FreeSurface(drawsurf);
+ }
- return bitmap.valid();
+ return bitmap.valid();
}
TTF_Font * osd_font_sdl::TTF_OpenFont_Magic(astring name, int fsize)
{
- emu_file file(OPEN_FLAG_READ);
- if (file.open(name) == FILERR_NONE)
- {
- unsigned char buffer[5] = { 0xff, 0xff, 0xff, 0xff, 0xff };
- unsigned char magic[5] = { 0x00, 0x01, 0x00, 0x00, 0x00 };
- file.read(buffer,5);
- if (memcmp(buffer, magic, 5))
- return NULL;
- }
- return TTF_OpenFont(name.cstr(), POINT_SIZE);
+ emu_file file(OPEN_FLAG_READ);
+ if (file.open(name) == FILERR_NONE)
+ {
+ unsigned char buffer[5] = { 0xff, 0xff, 0xff, 0xff, 0xff };
+ unsigned char magic[5] = { 0x00, 0x01, 0x00, 0x00, 0x00 };
+ file.read(buffer,5);
+ if (memcmp(buffer, magic, 5))
+ return NULL;
+ }
+ return TTF_OpenFont(name.cstr(), POINT_SIZE);
}
bool osd_font_sdl::BDF_Check_Magic(astring name)
{
- emu_file file(OPEN_FLAG_READ);
- if (file.open(name) == FILERR_NONE)
- {
- unsigned char buffer[9];
- unsigned char magic[9] = { 'S', 'T', 'A', 'R', 'T', 'F', 'O', 'N', 'T' };
- file.read(buffer, 9);
- file.close();
- if (!memcmp(buffer, magic, 9))
- return true;
- }
-
- return false;
+ emu_file file(OPEN_FLAG_READ);
+ if (file.open(name) == FILERR_NONE)
+ {
+ unsigned char buffer[9];
+ unsigned char magic[9] = { 'S', 'T', 'A', 'R', 'T', 'F', 'O', 'N', 'T' };
+ file.read(buffer, 9);
+ file.close();
+ if (!memcmp(buffer, magic, 9))
+ return true;
+ }
+
+ return false;
}
#ifndef SDLMAME_HAIKU
TTF_Font *osd_font_sdl::search_font_config(astring name, bool bold, bool italic, bool underline, bool &bakedstyles)
{
- TTF_Font *font = (TTF_Font *)NULL;
- FcConfig *config;
- FcPattern *pat;
- FcObjectSet *os;
- FcFontSet *fontset;
- FcValue val;
-
- config = FcConfigGetCurrent();
- pat = FcPatternCreate();
- os = FcObjectSetCreate();
- FcPatternAddString(pat, FC_FAMILY, (const FcChar8 *)name.cstr());
-
- // try and get a font with the requested styles baked-in
- if (bold)
- {
- if (italic)
- {
- FcPatternAddString(pat, FC_STYLE, (const FcChar8 *)"Bold Italic");
- }
- else
- {
- FcPatternAddString(pat, FC_STYLE, (const FcChar8 *)"Bold");
- }
- }
- else if (italic)
- {
- FcPatternAddString(pat, FC_STYLE, (const FcChar8 *)"Italic");
- }
- else
- {
- FcPatternAddString(pat, FC_STYLE, (const FcChar8 *)"Regular");
- }
-
- FcPatternAddString(pat, FC_FONTFORMAT, (const FcChar8 *)"TrueType");
-
- FcObjectSetAdd(os, FC_FILE);
- fontset = FcFontList(config, pat, os);
-
- for (int i = 0; i < fontset->nfont; i++)
- {
- if (FcPatternGet(fontset->fonts[i], FC_FILE, 0, &val) != FcResultMatch)
- {
- continue;
- }
-
- if (val.type != FcTypeString)
- {
- continue;
- }
-
- osd_printf_verbose("Matching font: %s\n", val.u.s);
- {
- astring match_name((const char*)val.u.s);
- font = TTF_OpenFont_Magic(match_name, POINT_SIZE);
- }
-
- if (font)
- {
- bakedstyles = true;
- break;
- }
- }
-
- // didn't get a font above? try again with no baked-in styles
- if (!font)
- {
- FcPatternDestroy(pat);
- FcFontSetDestroy(fontset);
-
- pat = FcPatternCreate();
- FcPatternAddString(pat, FC_FAMILY, (const FcChar8 *)name.cstr());
- FcPatternAddString(pat, FC_STYLE, (const FcChar8 *)"Regular");
- FcPatternAddString(pat, FC_FONTFORMAT, (const FcChar8 *)"TrueType");
- fontset = FcFontList(config, pat, os);
-
- for (int i = 0; i < fontset->nfont; i++)
- {
- if (FcPatternGet(fontset->fonts[i], FC_FILE, 0, &val) != FcResultMatch)
- {
- continue;
- }
-
- if (val.type != FcTypeString)
- {
- continue;
- }
-
- osd_printf_verbose("Matching unstyled font: %s\n", val.u.s);
- {
- astring match_name((const char*)val.u.s);
- font = TTF_OpenFont_Magic(match_name, POINT_SIZE);
- }
-
- if (font)
- {
- break;
- }
- }
- }
-
- FcPatternDestroy(pat);
- FcObjectSetDestroy(os);
- FcFontSetDestroy(fontset);
- return font;
+ TTF_Font *font = (TTF_Font *)NULL;
+ FcConfig *config;
+ FcPattern *pat;
+ FcObjectSet *os;
+ FcFontSet *fontset;
+ FcValue val;
+
+ config = FcConfigGetCurrent();
+ pat = FcPatternCreate();
+ os = FcObjectSetCreate();
+ FcPatternAddString(pat, FC_FAMILY, (const FcChar8 *)name.cstr());
+
+ // try and get a font with the requested styles baked-in
+ if (bold)
+ {
+ if (italic)
+ {
+ FcPatternAddString(pat, FC_STYLE, (const FcChar8 *)"Bold Italic");
+ }
+ else
+ {
+ FcPatternAddString(pat, FC_STYLE, (const FcChar8 *)"Bold");
+ }
+ }
+ else if (italic)
+ {
+ FcPatternAddString(pat, FC_STYLE, (const FcChar8 *)"Italic");
+ }
+ else
+ {
+ FcPatternAddString(pat, FC_STYLE, (const FcChar8 *)"Regular");
+ }
+
+ FcPatternAddString(pat, FC_FONTFORMAT, (const FcChar8 *)"TrueType");
+
+ FcObjectSetAdd(os, FC_FILE);
+ fontset = FcFontList(config, pat, os);
+
+ for (int i = 0; i < fontset->nfont; i++)
+ {
+ if (FcPatternGet(fontset->fonts[i], FC_FILE, 0, &val) != FcResultMatch)
+ {
+ continue;
+ }
+
+ if (val.type != FcTypeString)
+ {
+ continue;
+ }
+
+ osd_printf_verbose("Matching font: %s\n", val.u.s);
+ {
+ astring match_name((const char*)val.u.s);
+ font = TTF_OpenFont_Magic(match_name, POINT_SIZE);
+ }
+
+ if (font)
+ {
+ bakedstyles = true;
+ break;
+ }
+ }
+
+ // didn't get a font above? try again with no baked-in styles
+ if (!font)
+ {
+ FcPatternDestroy(pat);
+ FcFontSetDestroy(fontset);
+
+ pat = FcPatternCreate();
+ FcPatternAddString(pat, FC_FAMILY, (const FcChar8 *)name.cstr());
+ FcPatternAddString(pat, FC_STYLE, (const FcChar8 *)"Regular");
+ FcPatternAddString(pat, FC_FONTFORMAT, (const FcChar8 *)"TrueType");
+ fontset = FcFontList(config, pat, os);
+
+ for (int i = 0; i < fontset->nfont; i++)
+ {
+ if (FcPatternGet(fontset->fonts[i], FC_FILE, 0, &val) != FcResultMatch)
+ {
+ continue;
+ }
+
+ if (val.type != FcTypeString)
+ {
+ continue;
+ }
+
+ osd_printf_verbose("Matching unstyled font: %s\n", val.u.s);
+ {
+ astring match_name((const char*)val.u.s);
+ font = TTF_OpenFont_Magic(match_name, POINT_SIZE);
+ }
+
+ if (font)
+ {
+ break;
+ }
+ }
+ }
+
+ FcPatternDestroy(pat);
+ FcObjectSetDestroy(os);
+ FcFontSetDestroy(fontset);
+ return font;
}
#endif
@@ -328,35 +328,33 @@ TTF_Font *osd_font_sdl::search_font_config(astring name, bool bold, bool italic,
class font_sdl : public osd_module, public font_module
{
public:
- font_sdl()
- : osd_module(OSD_FONT_PROVIDER, "sdl"), font_module()
- {
- }
-
- osd_font *font_alloc()
- {
- return global_alloc(osd_font_sdl);
- }
-
- int init()
- {
- if (TTF_Init() == -1)
- {
- osd_printf_error("SDL_ttf failed: %s\n", TTF_GetError());
- return -1;
- }
- return 0;
- }
-
- virtual void exit()
- {
- TTF_Quit();
- }
+ font_sdl()
+ : osd_module(OSD_FONT_PROVIDER, "sdl"), font_module()
+ {
+ }
+
+ osd_font *font_alloc()
+ {
+ return global_alloc(osd_font_sdl);
+ }
+
+ int init()
+ {
+ if (TTF_Init() == -1)
+ {
+ osd_printf_error("SDL_ttf failed: %s\n", TTF_GetError());
+ return -1;
+ }
+ return 0;
+ }
+
+ virtual void exit()
+ {
+ TTF_Quit();
+ }
};
#else /* SDLMAME_UNIX */
- MODULE_NOT_SUPPORTED(font_sdl, OSD_FONT_PROVIDER, "sdl")
+ MODULE_NOT_SUPPORTED(font_sdl, OSD_FONT_PROVIDER, "sdl")
#endif
MODULE_DEFINITION(FONT_SDL, font_sdl)
-
-