Страница 15 из 57

Re: САПР на Lazarus

Добавлено: 14.08.2015 21:32:34
Cheb
i5 2450M

Высокая производительность (35 Ватт):

Код: Выделить всё

OpenGL driver info: Intel Intel(R) HD Graphics Family 3.1.0 - Build 8.15.10.2509
Draw 1000000 random lines
Canvas: 6691msec
OpenGL: 321msec

Canvas: 5425msec
OpenGL: 212msec


Режим экономии (10 Ватт):

Код: Выделить всё

Canvas: 7851msec
OpenGL: 341msec

Canvas: 8878msec
OpenGL: 252msec


P.S. Она непрерывно его гоняет безо всякого нажатия, очень неудобно копипастить пока прога висит.

Re: САПР на Lazarus

Добавлено: 15.08.2015 22:02:03
zub
kazalex
>>Ещё прикол в том, что если будешь использовать ExTextOut/ExtUTF8Out для управления межсимвольными интервалами
я специально сделал раззбивку и рисование посимвольно, чтобы небыло проблем с межбуквенным интервалом. Нераз наблюдал, как в программах оперирующих строками или словами ширина текстов немного играет в зависимости от масштаба изображения.

Pavia
>>Только рисуется он в Path, а не в Bitmap. Далее крутиться и растягиваете как хотите
Взял на заметку, спасибо. Похоже это единственный способ приделать "свободный" наклон к шрифтам. Плохо только что патчи не реализованы под линуксом
>>И лучше кэшировать не по одной букве, а словами.
хз. букв в алфовите мало и они постоянно повторяются, слов в языке много и не факт что вообще будут повторения
>>Вместо GDI можно использовать кросплатформенную библиотеку font_freetype
векторное представление шрифта у меня есть, получаю с помощью lazfreetype - тут пока проблем нет никаких
>>Интел в своё время выкладывала алгоритмы умножения матриц. 30 тактов было на PIII, так что у вас не очень оптимально
До этого тоже дело дойдет, но пока я множу примитивно на паскале. Пока хватает простора для алгоритмических оптимизаций.

Cheb
Спасибо!
Странно что виснет, отрисовка там в онпаинте и если он по какойто причине не приходит постоянно, то виснуть неболжно.

Первые результаты. На картинке оба рендера одновременно, крупный - мой "треугольный", мелкий - системный, пока и шрифт не тот, размеры не те и наклона нет, но уже хоть чтот0)) Сразу полезли проблемы - отсутствие реализации SetTextAlign в линуксе и странный сдвиг "системных" символов - похоже на descent из ttf metrics http://i.stack.imgur.com/crGOe.png

Добавлено спустя 21 час 10 минут 53 секунды:
Вроде нашелся способ меня устраивающий - позволяющий и косить, и наклонять и масштабировать без пересоздания шрифта:

Код: Выделить всё

function SetGraphicsMode(hdc:HDC; iMode:longint):longint; external 'gdi32' name 'SetGraphicsMode';
function SetWorldTransform(_para1:HDC; var _para2:XFORM):WINBOOL; external 'gdi32' name 'SetWorldTransform';

Правда видовс онли - в lclintf этого добра нет((, но думаю в gtk и Qt должны быть аналогичные механизмы - если кто знает, подскажите

Re: САПР на Lazarus

Добавлено: 16.08.2015 12:49:31
Cheb
zub писал(а):и если он по какойто причине не приходит постоянно, то виснуть неболжно.

Я имел в виду, онпайнт этот выполняется непрерывным потоком, занимает в 6..8 секунд, т.е. окно приложения реагирует на внешние раздражители раз в эти 6..8 секунд, т.е. былинно подвисая. Даже смена курсора мыши при наведении на чекбокс. Убедиться, то ты выделяешь или промахнулся, тоже трудно. Такого рода мелочи.

По моему опыту, когда я пересел с XP на семёрку - пришлось допиливать работку оконных сообщений своего движка.
Виста и выше
а) гораздо строже соблюдают правила, прописанные в MSDN ещё со времён 95-й, !внезапно! делая их обязательными, и ранее работавший кривой код перестаёт работать. Например, все 256-цветные игры в своё время плевали на запрет менять первые 16 цветов палитры. В 98-й прокатывало, но семёрка просто не даёт им это сделать, и картинка получается вся в цветных разводах (лечится предварительным переключением всего рабочего стола в 256-цветный режим, что закопано глубоко).
б) ожидает от программы определённого отклика, и не обнаруживая его, начинает применять разные хаки. Виста, например, несмотря на то, что мой движок отключил курсор мыши, начала принудительно отображать крутящееся колечко "приложение не отвечает", и раз в секунду срать событиями перемещения мыши с нулевым смещением. Лень было разбираться чё ей надо, заткнул загрузкой полностью прозрачного изображения курсора вместо ShowCursor(false) и игнорированием нулевых перемещений мыши.

Re: САПР на Lazarus

Добавлено: 16.08.2015 13:16:23
zub
Cheb
Это всеголишь одноразовый наколенный тестик, чтобы выяснить стоит ли использовать определенный подход. Цель была получить четыре цифирки, извиняюсь за предоставленные неудобства))
Подобные претензии были бы полезны по самому зкаду - если найдете время глянте пжста, хотя там вроде всё не так плохо

По моему опыту, когда я пересел с XP на семёрку - пришлось допиливать работку оконных сообщений своего движка.

когдато я тоже плотно юзал винапи и сталкивался со многими странностями, сейчас уже и не вспомню. Теперь стараюсь не опускаться ниже того что есть в LCLintf - и странностей нет и кроссплатформенно

Re: САПР на Lazarus

Добавлено: 19.08.2015 20:43:00
zub
Вроде разобрался с математикой - получилось рендерить более менее одинаково разными способами, но "попиксельное" совпадение не получается, системная рисовалка шрифтов почемуто утончает символы - особенно заметно на знаке "!"
На гифке разные варианты рендера текста: TRT_System - гдишный; TRT_ZGL - мой; TRT_Both - оба сразу, причем гдишный происходит цветом фона - хорошо видно разницу
Изображение
Для отображения текста такая разница не критична, а вот для выделения его мышью - существенна((

Также встал вопрос что делать с шрифтами которые не установлены в системе, т.е. не лежат в c:\windows\fonts, а лежат в папке с программой. Возможно загрузить и рисовать такой шрифт средствами гди?

Re: САПР на Lazarus

Добавлено: 19.08.2015 22:07:38
kazalex
zub писал(а):Возможно загрузить и рисовать такой шрифт средствами гди?

https://msdn.microsoft.com/en-us/librar ... 85%29.aspx

Re: САПР на Lazarus

Добавлено: 20.08.2015 00:14:43
zub
Спасибо!
Но в FPC не нашлось определения этой функции, есть только AddFontResource, шрифт она вроде добавляет, но назначить его потом контексту не получается((. Кроме того после нее рекомендуется сделать

Код: Выделить всё

SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

Почемуто это сообщение IDE не обрабатывает. Получается программа "виснет" если лазарь запущен фоном. закрываешь лазаря - программа "развисает"))

Re: САПР на Lazarus

Добавлено: 20.08.2015 01:01:25
kazalex
zub писал(а):Но в FPC не нашлось определения этой функции, есть только AddFontResource, шрифт она вроде добавляет, но назначить его потом контексту не получается((

Код: Выделить всё

const

 FR_PRIVATE = $10;
 FR_NOT_ENUM = $20;

function AddFontResourceEx(_para1:LPCSTR; flags:DWORD; reserved:Pointer) : integer; stdcall; external 'gdi32' name 'AddFontResourceExA';
function RemoveFontResourceEx(_para1:LPCSTR; flags:DWORD; reserved:Pointer) : integer; stdcall; external 'gdi32' name 'RemoveFontResourceExA';

procedure TForm1.Button1Click(Sender: TObject);
Var

 s : String;

begin

  s := ExtractFilePath(ParamStr(0)) + 'monaco.ttf';

//  AddFontResource(LPCSTR(s));
//  SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
  AddFontResourceEx(LPCSTR(s), FR_PRIVATE Or FR_NOT_ENUM, nil);


  Canvas.Font.Name := 'monaco';
  Canvas.Font.Size := 24;

  Canvas.Brush.Style := bsClear;

  Canvas.TextOut(10, 10, 'This is Monaco');

//  RemoveFontResource(LPCSTR(s));
  RemoveFontResourceEx(LPCSTR(s), FR_PRIVATE Or FR_NOT_ENUM, nil);

end;

resource_font.png


zub писал(а):Кроме того после нее рекомендуется сделать

Это не обязательно, и нужно только для оповещения других приложений. Но у тебя-то такой цели не стоит? Я, собственно, и предложил использовать расширенный вариант функции т.к. в этом случае можно сделать шрифт приватным.

zub писал(а):Почемуто это сообщение IDE не обрабатывает. Получается программа "виснет" если лазарь запущен фоном. закрываешь лазаря - программа "развисает"))

У меня такое поведение не воспроизводится, всё работает корректно. Попробовал на XP SP3, Lazarus 1.5, с функцией AddFontResource и последующим вызовом SendMessage(...);

Re: САПР на Lazarus

Добавлено: 20.08.2015 01:35:46
zub
Я пробовал и AddFontResource и добавлять описание AddFontResourceEx - судя по возвращаемым значениям шрифты добавляются. но на контексте отрисовка идет другим шрифтом. Наверно создавать надо както хитрее, я пока на коленке

Код: Выделить всё

  if PGDBfont(PSymbolsParam.pfont)^.DummyDrawerHandle=0
  then
      begin
            lfcp.lfHeight:=deffonth;
            lfcp.lfWidth:=0;
            lfcp.lfEscapement:=0;
            lfcp.lfOrientation:=0;
            lfcp.lfWeight:={0}FW_NORMAL;
            lfcp.lfItalic:=0;
            lfcp.lfUnderline:=0;
            lfcp.lfStrikeOut:=0;
            lfcp.lfCharSet:=0;
            lfcp.lfOutPrecision:=0;
            lfcp.lfClipPrecision:=0;
            lfcp.lfQuality:=0;
            lfcp.lfPitchAndFamily:=0;//{DRAFT_QUALITY}CLEARTYPE_NATURAL_QUALITY;
            lfcp.lfFaceName:=ExtractFileNameonly(PGDBfont(PSymbolsParam.pfont)^.fontfile);
           PGDBfont(PSymbolsParam.pfont)^.DummyDrawerHandle:=CreateFontIndirect(lfcp);
           SelectObject(TZGLGDIDrawer(drawer).OffScreedDC,PGDBfont(PSymbolsParam.pfont)^.DummyDrawerHandle);
      end
  else
      begin
           SelectObject(TZGLGDIDrawer(drawer).OffScreedDC,PGDBfont(PSymbolsParam.pfont)^.DummyDrawerHandle);
      end;

с уже зарегеными шрифтами вроде проблем нет.

Повисание у меня проявляется в семерке, транковые фпц и лазарь, кроме того я недавно ставил на лазаря пакет зависимый от freetype.dll, непомню, вычищал или нет его... возможно он наследил. Как разберусь оформлю репорт при необходимости

Re: САПР на Lazarus

Добавлено: 20.08.2015 01:43:02
kazalex
zub писал(а):lfcp.lfFaceName:=ExtractFileNameonly(PGDBfont(PSymbolsParam.pfont)^.fontfile);

А имя файла точно соответствует имени шрифта?

Re: САПР на Lazarus

Добавлено: 20.08.2015 02:11:19
zub
От тыж. не соответствует. Проблемы с файлом OpenGostTypeB-Regular.ttf, проверте сработает у вас или нет, он свободный и легко гуглится.
если я беру его полное имя TFreeTypeFont.Information[ftiFullName]='OpenGost Type B TT Regular' тоже не срабатывает. в других программах он определяется как 'OpenGost Type B TT', но откуда я узнаю это название?
есть еще

Код: Выделить всё

  TFreeTypeInformation = (ftiCopyrightNotice, ftiFamily, ftiStyle, ftiIdentifier, ftiFullName,
     ftiVersionString, ftiPostscriptName, ftiTrademark, ftiManufacturer, ftiDesigner,
     ftiVendorURL, ftiDesignerURL, ftiLicenseDescription, ftiLicenseInfoURL);

но ничего не подходит((

Re: САПР на Lazarus

Добавлено: 20.08.2015 10:03:09
kazalex
zub писал(а):в других программах он определяется как 'OpenGost Type B TT', но откуда я узнаю это название?

fnt.Family;

zub писал(а):но ничего не подходит((

Странно, ftiFamily должно работать.
font_family.png

Re: САПР на Lazarus

Добавлено: 20.08.2015 11:28:10
zub
Приложил свою нерабочую демку. Стоит в ней заменить 'OpenGost Type B TT' на 'times' - всё работает

Re: САПР на Lazarus

Добавлено: 20.08.2015 11:44:13
Лекс Айрин
zub, скорее всего, вы просто путаете шрифт(OpenGost Type B TT) и семейство шрифтов (times).

Re: САПР на Lazarus

Добавлено: 20.08.2015 12:23:10
zub
там единственная текстовая строчка:

Код: Выделить всё

lfFaceName:='OpenGost Type B TT';

спутать чтото трудно. Я уже и установил этот шрифт, один фиг с ним не работает((

Добавлено спустя 30 минут 25 секунд:
шрифт создается, если получить инфу о нем GetFontData вылазит
record TFONTDATA {
HANDLE = 3121224073,
HEIGHT = 30,
PITCH = FPDEFAULT,
STYLE = [],
CHARSET = 0,
QUALITY = FQDEFAULT,
NAME = 'OpenGost Type B TT',
ORIENTATION = 0}


Почемуто не назначается контексту