САПР на Lazarus

Планы, идеология, архитектура и т.п.

Модератор: Модераторы

Re: САПР на Lazarus

Сообщение Cheb » 14.08.2015 22:32:34

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. Она непрерывно его гоняет безо всякого нажатия, очень неудобно копипастить пока прога висит.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: САПР на Lazarus

Сообщение zub » 15.08.2015 01:51:10

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 должны быть аналогичные механизмы - если кто знает, подскажите
Вложения
gdi.PNG
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение Cheb » 16.08.2015 13:49:31

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

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

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

Re: САПР на Lazarus

Сообщение zub » 16.08.2015 14:16:23

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

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

когдато я тоже плотно юзал винапи и сталкивался со многими странностями, сейчас уже и не вспомню. Теперь стараюсь не опускаться ниже того что есть в LCLintf - и странностей нет и кроссплатформенно
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение zub » 19.08.2015 21:43:00

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

Также встал вопрос что делать с шрифтами которые не установлены в системе, т.е. не лежат в c:\windows\fonts, а лежат в папке с программой. Возможно загрузить и рисовать такой шрифт средствами гди?
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение kazalex » 19.08.2015 23:07:38

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

https://msdn.microsoft.com/en-us/librar ... 85%29.aspx
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: САПР на Lazarus

Сообщение zub » 20.08.2015 01:14:43

Спасибо!
Но в FPC не нашлось определения этой функции, есть только AddFontResource, шрифт она вроде добавляет, но назначить его потом контексту не получается((. Кроме того после нее рекомендуется сделать
Код: Выделить всё
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

Почемуто это сообщение IDE не обрабатывает. Получается программа "виснет" если лазарь запущен фоном. закрываешь лазаря - программа "развисает"))
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение kazalex » 20.08.2015 02:01:25

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(...);
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: САПР на Lazarus

Сообщение zub » 20.08.2015 02:35:46

Я пробовал и 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, непомню, вычищал или нет его... возможно он наследил. Как разберусь оформлю репорт при необходимости
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение kazalex » 20.08.2015 02:43:02

zub писал(а):lfcp.lfFaceName:=ExtractFileNameonly(PGDBfont(PSymbolsParam.pfont)^.fontfile);

А имя файла точно соответствует имени шрифта?
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: САПР на Lazarus

Сообщение zub » 20.08.2015 03:11:19

От тыж. не соответствует. Проблемы с файлом 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);

но ничего не подходит((
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение kazalex » 20.08.2015 11:03:09

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

fnt.Family;

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

Странно, ftiFamily должно работать.
font_family.png
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: САПР на Lazarus

Сообщение zub » 20.08.2015 12:28:10

Приложил свою нерабочую демку. Стоит в ней заменить 'OpenGost Type B TT' на 'times' - всё работает
Вложения
notopengost.png
gdiobliquetext.zip
(156.15 КБ) Скачиваний: 548
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение Лекс Айрин » 20.08.2015 12:44:13

zub, скорее всего, вы просто путаете шрифт(OpenGost Type B TT) и семейство шрифтов (times).
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: САПР на Lazarus

Сообщение zub » 20.08.2015 12:52:45

там единственная текстовая строчка:
Код: Выделить всё
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}


Почемуто не назначается контексту
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Пред.След.

Вернуться в Разработки на нашем сайте

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

Рейтинг@Mail.ru