Перенос C# программы из .NET на Mono

Добрый день.

В принципе, если не использовать 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.
  • Вопрос задан
  • 3550 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы