Добрый день.
В принципе, если не использовать Win32 и прочих системозависимых вызовов, то проблемы с переносом из .NET на Mono как бы и нет. Но наша команда столкнулась с проблемой в виде отсутствия в Mono аналога GetFontData.
Напомню, что Windows приложение с помощью GetFontData может получить доступ к содержимому файла фонта (или коллекций фонтов). Для чего это может понадобиться? Например, для создания PDF документа — данные шрифта необходимы для расчёта ширин символов, а также для внедрения в документ используемых шрифтов. И если внедрение шрифтов — это полезная, но необязательная возможность, то без расчёта ширин, сформированный PDF документ принимает «вырвиглазный» вид.
Разумеется, прежде чем публиковать этот вопрос, я внимательно погуглил на эту тему и обнаружил аналогичный вопрос, заданный неким иностранным господином на добром десятке форумов. Ответа (на этих форумах) он не получил. Впрочем, Бог с ним, вот фрагмент кода, который не работает в Mono.
my_font — объект типа System.Drawing.Font. Нужно получить содержимое файла фонта в font_data.
FontType CollectionMode;
Bitmap tempBitmap = new Bitmap(1, 1);
font_data = IntPtr.Zero;
fonts_collection = new ArrayList();
using (Graphics g = Graphics.FromImage(tempBitmap))
{
IntPtr hdc = g.GetHdc();
IntPtr f = my_font.ToHfont();
SelectObject(hdc, f);
CollectionMode = FontType.TrueTypeCollection;
uint fontDataSize = GetFontData(hdc, (uint)CollectionMode, 0, IntPtr.Zero, 0);
if (fontDataSize == uint.MaxValue)
{
CollectionMode = FontType.TrueTypeFont;
fontDataSize = GetFontData(hdc, (uint)CollectionMode, 0, IntPtr.Zero, 0);
}
font_data = Marshal.AllocHGlobal((int)fontDataSize);
GetFontData(hdc, (uint) CollectionMode, 0, font_data, fontDataSize);
}
Собственно говоря, ищется красивое и универсальное решение для реализации этого кода под Mono.