www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - [Font] Getting font folder on all platforms

reply "Flamaros" <flamaros.xavier gmail.com> writes:
I am searching the right way to find fonts folder for each 
platforms (Windows, linux, macOS X)

On Windows it's generally "C:\Windows\Fonts" but a direct access 
seems brutal, it's certainly expected to retrieve this path by 
using some register keys?

Is someone know how it works for linux and/or macOS X?

I need to be able to retrieve fastest as possible the right file 
from the font and family name.
Sep 05 2013
next sibling parent reply Justin Whear <justin economicmodeling.com> writes:
On Thu, 05 Sep 2013 21:48:03 +0200, Flamaros wrote:

 I am searching the right way to find fonts folder for each platforms
 (Windows, linux, macOS X)
 
 On Windows it's generally "C:\Windows\Fonts" but a direct access seems
 brutal, it's certainly expected to retrieve this path by using some
 register keys?
 
 Is someone know how it works for linux and/or macOS X?
 
 I need to be able to retrieve fastest as possible the right file from
 the font and family name.
For linux, see fontconfig: http://en.wikipedia.org/wiki/Fontconfig http://www.freedesktop.org/software/fontconfig/fontconfig-user.html
Sep 05 2013
parent "Flamaros" <flamaros.xavier gmail.com> writes:
On Thursday, 5 September 2013 at 19:59:20 UTC, Justin Whear wrote:
 On Thu, 05 Sep 2013 21:48:03 +0200, Flamaros wrote:

 I am searching the right way to find fonts folder for each 
 platforms
 (Windows, linux, macOS X)
 
 On Windows it's generally "C:\Windows\Fonts" but a direct 
 access seems
 brutal, it's certainly expected to retrieve this path by using 
 some
 register keys?
 
 Is someone know how it works for linux and/or macOS X?
 
 I need to be able to retrieve fastest as possible the right 
 file from
 the font and family name.
For linux, see fontconfig: http://en.wikipedia.org/wiki/Fontconfig http://www.freedesktop.org/software/fontconfig/fontconfig-user.html
Thx
Sep 05 2013
prev sibling next sibling parent Jacob Carlborg <doob me.com> writes:
On 2013-09-05 21:48, Flamaros wrote:
 I am searching the right way to find fonts folder for each platforms
 (Windows, linux, macOS X)

 On Windows it's generally "C:\Windows\Fonts" but a direct access seems
 brutal, it's certainly expected to retrieve this path by using some
 register keys?

 Is someone know how it works for linux and/or macOS X?

 I need to be able to retrieve fastest as possible the right file from
 the font and family name.
The paths used for fonts on Mac OS X are the ones listed in this table: http://support.apple.com/kb/HT2435 To programmatically work with fonts, have a look at these API's: https://developer.apple.com/library/mac/documentation/Carbon/Reference/CTFontRef/Reference/reference.html https://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CGFont/Reference/reference.html https://developer.apple.com/library/mac/documentation/TextFonts/Conceptual/CocoaTextArchitecture/FontHandling/FontHandling.html#//apple_ref/doc/uid/TP40009459-CH5-SW1 That last link describes an Objective-C API. -- /Jacob Carlborg
Sep 05 2013
prev sibling parent reply "Tourist" <gravatar gravatar.com> writes:
On Thursday, 5 September 2013 at 19:48:07 UTC, Flamaros wrote:
 I am searching the right way to find fonts folder for each 
 platforms (Windows, linux, macOS X)

 On Windows it's generally "C:\Windows\Fonts" but a direct 
 access seems brutal, it's certainly expected to retrieve this 
 path by using some register keys?

 Is someone know how it works for linux and/or macOS X?

 I need to be able to retrieve fastest as possible the right 
 file from the font and family name.
Windows: call SHGetKnownFolderPath with FOLDERID_Fonts as rfid. http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188%28v=vs.85%29.aspx
Sep 06 2013
parent reply "Flamaros" <flamaros.xavier gmail.com> writes:
On Friday, 6 September 2013 at 16:05:43 UTC, Tourist wrote:
 On Thursday, 5 September 2013 at 19:48:07 UTC, Flamaros wrote:
 I am searching the right way to find fonts folder for each 
 platforms (Windows, linux, macOS X)

 On Windows it's generally "C:\Windows\Fonts" but a direct 
 access seems brutal, it's certainly expected to retrieve this 
 path by using some register keys?

 Is someone know how it works for linux and/or macOS X?

 I need to be able to retrieve fastest as possible the right 
 file from the font and family name.
Windows: call SHGetKnownFolderPath with FOLDERID_Fonts as rfid. http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188%28v=vs.85%29.aspx
Nice, thx. Do you know if there is a table of fonts and there family, or need open all font file my self?
Sep 06 2013
parent reply "Flamaros" <flamaros.xavier gmail.com> writes:
On Friday, 6 September 2013 at 20:54:53 UTC, Flamaros wrote:
 On Friday, 6 September 2013 at 16:05:43 UTC, Tourist wrote:
 On Thursday, 5 September 2013 at 19:48:07 UTC, Flamaros wrote:
 I am searching the right way to find fonts folder for each 
 platforms (Windows, linux, macOS X)

 On Windows it's generally "C:\Windows\Fonts" but a direct 
 access seems brutal, it's certainly expected to retrieve this 
 path by using some register keys?

 Is someone know how it works for linux and/or macOS X?

 I need to be able to retrieve fastest as possible the right 
 file from the font and family name.
Windows: call SHGetKnownFolderPath with FOLDERID_Fonts as rfid. http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188%28v=vs.85%29.aspx
Nice, thx. Do you know if there is a table of fonts and there family, or need open all font file my self?
I need to do some more tests, but scanning the registry seems working under Windows. Here is my test code : string fontPathFromName(in string name, in Font.Family family = Font.Family.Regular) { version(Windows) { import std.windows.registry; string fontPath = "C:/Windows/Fonts/"; string fontFileName; Key fontKey; fontKey = Registry.localMachine().getKey("Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"); if (family == Font.Family.Regular) fontFileName = fontKey.getValue(name ~ " (TrueType)").value_EXPAND_SZ(); else if (family == Font.Family.Bold) fontFileName = fontKey.getValue(name ~ " Bold (TrueType)").value_EXPAND_SZ(); else if (family == Font.Family.Italic) fontFileName = fontKey.getValue(name ~ " Italic (TrueType)").value_EXPAND_SZ(); else if (family == (Font.Family.Bold | Font.Family.Italic)) fontFileName = fontKey.getValue(name ~ " Bold Italic (TrueType)").value_EXPAND_SZ(); return fontPath ~ fontFileName; } } unittest { assert(fontPathFromName("Arial") == "C:/Windows/Fonts/arial.ttf"); assert(fontPathFromName("arial") == "C:/Windows/Fonts/arial.ttf"); // Test with wrong case assert(fontPathFromName("Arial", Font.Family.Bold | Font.Family.Italic) == "C:/Windows/Fonts/arialbi.ttf"); }
Oct 15 2013
parent reply "Flamaros" <flamaros.xavier gmail.com> writes:
On Tuesday, 15 October 2013 at 23:10:32 UTC, Flamaros wrote:
 On Friday, 6 September 2013 at 20:54:53 UTC, Flamaros wrote:
 On Friday, 6 September 2013 at 16:05:43 UTC, Tourist wrote:
 On Thursday, 5 September 2013 at 19:48:07 UTC, Flamaros wrote:
 I am searching the right way to find fonts folder for each 
 platforms (Windows, linux, macOS X)

 On Windows it's generally "C:\Windows\Fonts" but a direct 
 access seems brutal, it's certainly expected to retrieve 
 this path by using some register keys?

 Is someone know how it works for linux and/or macOS X?

 I need to be able to retrieve fastest as possible the right 
 file from the font and family name.
Windows: call SHGetKnownFolderPath with FOLDERID_Fonts as rfid. http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188%28v=vs.85%29.aspx
Nice, thx. Do you know if there is a table of fonts and there family, or need open all font file my self?
I need to do some more tests, but scanning the registry seems working under Windows. Here is my test code : string fontPathFromName(in string name, in Font.Family family = Font.Family.Regular) { version(Windows) { import std.windows.registry; string fontPath = "C:/Windows/Fonts/"; string fontFileName; Key fontKey; fontKey = Registry.localMachine().getKey("Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"); if (family == Font.Family.Regular) fontFileName = fontKey.getValue(name ~ " (TrueType)").value_EXPAND_SZ(); else if (family == Font.Family.Bold) fontFileName = fontKey.getValue(name ~ " Bold (TrueType)").value_EXPAND_SZ(); else if (family == Font.Family.Italic) fontFileName = fontKey.getValue(name ~ " Italic (TrueType)").value_EXPAND_SZ(); else if (family == (Font.Family.Bold | Font.Family.Italic)) fontFileName = fontKey.getValue(name ~ " Bold Italic (TrueType)").value_EXPAND_SZ(); return fontPath ~ fontFileName; } } unittest { assert(fontPathFromName("Arial") == "C:/Windows/Fonts/arial.ttf"); assert(fontPathFromName("arial") == "C:/Windows/Fonts/arial.ttf"); // Test with wrong case assert(fontPathFromName("Arial", Font.Family.Bold | Font.Family.Italic) == "C:/Windows/Fonts/arialbi.ttf"); }
I did some progress with fontconfig under linux, I'll try to use it for Windows too.
Nov 08 2013
parent Xavier Bigand <flamaros.xavier gmail.com> writes:
Le 08/11/2013 21:05, Flamaros a écrit :
 On Tuesday, 15 October 2013 at 23:10:32 UTC, Flamaros wrote:
 On Friday, 6 September 2013 at 20:54:53 UTC, Flamaros wrote:
 On Friday, 6 September 2013 at 16:05:43 UTC, Tourist wrote:
 On Thursday, 5 September 2013 at 19:48:07 UTC, Flamaros wrote:
 I am searching the right way to find fonts folder for each
 platforms (Windows, linux, macOS X)

 On Windows it's generally "C:\Windows\Fonts" but a direct access
 seems brutal, it's certainly expected to retrieve this path by
 using some register keys?

 Is someone know how it works for linux and/or macOS X?

 I need to be able to retrieve fastest as possible the right file
 from the font and family name.
Windows: call SHGetKnownFolderPath with FOLDERID_Fonts as rfid. http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188%28v=vs.85%29.aspx
Nice, thx. Do you know if there is a table of fonts and there family, or need open all font file my self?
I need to do some more tests, but scanning the registry seems working under Windows. Here is my test code : string fontPathFromName(in string name, in Font.Family family = Font.Family.Regular) { version(Windows) { import std.windows.registry; string fontPath = "C:/Windows/Fonts/"; string fontFileName; Key fontKey; fontKey = Registry.localMachine().getKey("Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"); if (family == Font.Family.Regular) fontFileName = fontKey.getValue(name ~ " (TrueType)").value_EXPAND_SZ(); else if (family == Font.Family.Bold) fontFileName = fontKey.getValue(name ~ " Bold (TrueType)").value_EXPAND_SZ(); else if (family == Font.Family.Italic) fontFileName = fontKey.getValue(name ~ " Italic (TrueType)").value_EXPAND_SZ(); else if (family == (Font.Family.Bold | Font.Family.Italic)) fontFileName = fontKey.getValue(name ~ " Bold Italic (TrueType)").value_EXPAND_SZ(); return fontPath ~ fontFileName; } } unittest { assert(fontPathFromName("Arial") == "C:/Windows/Fonts/arial.ttf"); assert(fontPathFromName("arial") == "C:/Windows/Fonts/arial.ttf"); // Test with wrong case assert(fontPathFromName("Arial", Font.Family.Bold | Font.Family.Italic) == "C:/Windows/Fonts/arialbi.ttf"); }
I did some progress with fontconfig under linux, I'll try to use it for Windows too.
I find a way to make it work under Windows. I also bind almost all fontconfig API in a similar way of Derelict. If someone is interested look font.d at : https://github.com/D-Quick/DQuick PS : I took fontconfig dll from GTK packages
Nov 12 2013