Board.KolibriOS.org

Official KolibriOS board
It is currently Sun Jul 21, 2019 9:08 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 63 posts ]  Go to page Previous 1 2 3 4 5 Next
Author Message
 Post subject: Re: SysFn 4
PostPosted: Tue Mar 12, 2013 11:35 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
SoUrcerer
Может сразу над новым АПИ подумать для новых шрифтов. Например надо, чтобы функция вписывала текст в ограничивающий прямоугольник, отсекая лишнее.


Top
   
 Post subject: Re: SysFn 4
PostPosted: Tue Mar 12, 2013 11:42 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Устное предупреждение всем участникам оффтопа. Раз...

Serge, я думаю над более интересными вещами. Займусь начальными исследованиями этой важной для меня области.


Top
   
 Post subject: Re: SysFn 4
PostPosted: Tue Mar 12, 2013 11:49 pm 
Offline
KSoC/GSoC Student

Joined: Wed Jul 11, 2012 3:17 am
Posts: 224
SoUrcerer wrote:
В трех битах нельзя вернуть данные. В трех битах можно определить новую подфункцию, но это будет нелогично. В общем, нафиг всё, даешь библиотеку.

Допустим вариант: при ebx = 1 , в eax возвращать ширину строки

Это ни как не сломает все работающие программы, так как ebx = [координата по оси x]*65536 + [координата по оси y], что при любом раскладе > 1, собственно добавить в 4 функцию
Quote:
cmp ebx,1
...
je....
...
mov eax,...

то что тут затрётся eax, как понимаете, ничего страшного! Так как условие ebx=1 ранее не существовало, и во всех остальных программах, не использовавших это - eax затираться не будет!

PS: стандарты нарушать не хорошо (согласен с Маратом), как и плодить костыли, но ведь подобное расширение функции допустимо! Это ни чем не хуже этого:
Quote:
A=0 - выводить esi символов, A=1 - выводить ASCIIZ-строку
esi = для A=0 длина строки, должна быть не больше 255; для A=1 игнорируется

просто еще одно условие, при чём не ресурсоёмкое и много мусора не внесёт (ничего лишнего в ядре не должно быть!) Вообще да, нужна библиотека ответственная за работу со шрифтами и вывод текста во всех извращённых формах, с функциями возвращения размеров каждого символа какого нужно, вывода подчёркнутого наклонного зачёркнутого текста, с функцией вывода текста с установленным шагом и прочче, в общем библиотека!).

PPS: у линукса хороший слоган есть. Есть программа, она должна выполнять только свои функции, ничего левого, но должна это делать по максимуму.


Top
   
 Post subject: Re: SysFn 4
PostPosted: Tue Mar 12, 2013 11:59 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
4я функция умеет рисовать в относительных координатах. Я частенько рисую в 0,0. Не исключено, что кто-то может нарисовать что-то в 0,1. Это плохое ограничение.


Top
   
 Post subject: Re: SysFn 4
PostPosted: Wed Mar 13, 2013 12:04 am 
Offline
KSoC/GSoC Student

Joined: Wed Jul 11, 2012 3:17 am
Posts: 224
SoUrcerer wrote:
4я функция умеет рисовать в относительных координатах. Я частенько рисую в 0,0. Не исключено, что кто-то может нарисовать что-то в 0,1. Это плохое ограничение.

Ok, при ebx = 0xFFFF ? (X=0, Y=65535) врятли такое возможно, а если кто то и рисует в таких суперширокоформатных масштабах) на экране всё равно ничего не изменится!

PS: ebx =0xFFFFFFFF ? О_о

Ну на крайний случай: (хотя вариант выше мне кажется безопаснее)
Quote:
X=ABnn (биты):
nn задает используемый шрифт: 0=системный моноширинный, 1=системный шрифт переменной ширины
У нас получается что на самом деле:
Quote:
X=ABnD (биты):
D задает используемый шрифт: D=0-системный моноширинный, D=1-системный шрифт переменной ширины
Так почему бы не сделать:

X=ABСВ (биты):
    A=0 - выводить esi символов, A=1 - выводить ASCIIZ-строку
    B=1 - закрашивать фон цветом edi
    С=1 - возвращать ширину текста в eax. (при С=0 конечно же eax не меняется)
    D задает используемый шрифт: D=0-системный моноширинный, D=1-системный шрифт переменной ширины

PS: но такой вариант не гарантирует что где-то в бите C не лежит мусор(1), и не порушит тем самым eax/ Шансов конечно такой ситуации мало, но вдруг!


Top
   
 Post subject: Re: SysFn 4
PostPosted: Wed Mar 13, 2013 12:29 am 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Почему не использовать Y в таком случае?


Top
   
 Post subject: Re: SysFn 4
PostPosted: Wed Mar 13, 2013 12:37 am 
Offline
KSoC/GSoC Student

Joined: Wed Jul 11, 2012 3:17 am
Posts: 224
SoUrcerer wrote:
Почему не использовать Y в таком случае?

Почему бы и нет, не вижу в этом трагедии какой то. Это ни чем не хуже этого:
Quote:
A=0 - выводить esi символов, A=1 - выводить ASCIIZ-строку
esi = для A=0 длина строки, должна быть не больше 255; для A=1 игнорируется

Ну я собственно не настаиваю, просто высказал своё мнение и соображения. Работу программ существующих не нарушает, объём кода реализации 5 строк. В общем я за подобное расширение функционала. Другое дело как окажется в итоге, после всех мнений.


Top
   
 Post subject: Re: SysFn 4
PostPosted: Sun Jul 07, 2013 7:20 pm 
Offline
User avatar

Joined: Fri May 18, 2007 11:11 pm
Posts: 125
Можно было и еще безопаснее при теперешней реализации функции 4 :D

Вот кусок описания функции
Code:
   * Y=Cnnn (биты):
      * C=1 перенаправить вывод в область пользователя, задано в edi
      * nnn - не используется в текущем виде, должно быть 0 (zero)
  * edx = указатель на начало строки
  * esi = для A=0 длина строки, должна быть не больше 255;
          для A=1 игнорируется
  * edi = цвет для закраски фона, если B=1
  * edi = указатель на область пользователя, если C=1
Возвращаемое значение:
  * функция не возвращает значения


Накладываем свою жадную лапу на C=1 , edi=0 и спокойно возвращаем в eax или в ecx ширину строки.
Думаю указатель на область пользователя с нулевым адресом точно никто не юзает :D (а также с адресом 1, 2, 3,... и еще чуть-чуть :D так что еще и на кучу подфункций в будущем хватит )

_________________
Заглянул на огонёк


Top
   
 Post subject: Re: SysFn 4
PostPosted: Wed Sep 28, 2016 4:41 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Вот такой код
Spoiler: Show
Code:
ORG 0
BITS 32
; ---------------------------------------------------------------------------- ;
  STACK_SIZE          equ 256

 ;  Charset specifiers for DrawText
  DT_CP866_6X9        equ 0x00000000
  DT_CP866_8X16       equ 0x10000000
  DT_UTF_16LE_8X16    equ 0x20000000
  DT_UTF_8_8X16       equ 0x30000000

 ;  Fill styles for DrawText
  DT_FILL_TRANSPARENT equ 0x00000000
  DT_FILL_OPAQUE      equ 0x40000000

 ;  Draw zero terminated string for DrawText
  DT_ZSTRING          equ 0x80000000

 ;  Size multipliers for DrawText
  DT_X1               equ  0x0000000
  DT_X2               equ  0x1000000
  DT_X3               equ  0x2000000
  DT_X4               equ  0x3000000
  DT_X5               equ  0x4000000
  DT_X6               equ  0x5000000
  DT_X7               equ  0x6000000
  DT_X8               equ  0x7000000

 ; Colors
  COLOR_BLUE          equ 0x000000FF
  COLOR_RED           equ 0x00FF0000
  COLOR_GREEN         equ 0x0000FF00
  COLOR_WHITE         equ 0x00FFFFFF
  COLOR_BLACK         equ 0x00000000

 ; Event mask constants
  EM_REDRAW           equ 0b1
  EM_KEY              equ 0b10
  EM_BUTTON           equ 0b100
  EM_MOUSE            equ 0b100000
; ---------------------------------------------------------------------------- ;
MENUET01              db 'MENUET01'
version               dd 1
program.start         dd START
program.end           dd END
program.memory        dd END + STACK_SIZE
program.stack         dd END + STACK_SIZE
program.params        dd 0
program.path          dd 0
; ---------------------------------------------------------------------------- ;
sz_caption            db "test",0
sz_test               db 'Qwerty Uiop Asdfg Hjkl Zxcv Bn',0
; ---------------------------------------------------------------------------- ;
START:
; SetEventMask
        mov    eax, 40
        mov    ebx, EM_REDRAW + EM_BUTTON
        int    64
on_redraw:
; BeginDraw
        mov    eax, 12
        mov    ebx, 1
        int    64
; DrawWindow
        xor    eax, eax
        mov    ebx, 200
        mov    ecx, 100
        mov    edx, 0x34FFFFFF
        mov    edi, sz_caption
        int    64
; DrawText
        mov    eax, 4
        mov    ebx, 10                                                 ;[x]
        shl    ebx, 16
        add    ebx, 10                                                 ;[y]
        mov    ecx, DT_CP866_6X9 | DT_X7 | DT_FILL_OPAQUE | DT_ZSTRING ;[Flags]
        or     ecx, COLOR_RED                                          ;[ForeColor]
        mov    edx, sz_test                                            ;[Text]
        mov    edi, COLOR_GREEN                                        ;[BackColor]
        mov    esi, 0                                                  ;[Count]
        int    64
; EndDraw
        mov    eax, 12
        mov    ebx, 2
        int    64
; WaitEvent
        mov    eax, 10
        int    64
        dec    eax
        jz     on_redraw
; ThreadTerminate
        or     eax, -1
        int    64
; ---------------------------------------------------------------------------- ;
END:
Уже скомпилированный бинарник
Attachment:
test.kex [191 Bytes]
Downloaded 77 times

В результате при запуске приложения происходит это
Spoiler: Show
Image
и иногда приложение остаётся работать. Но чаще всего приложение просто вылетает, и на BOARD появляется это
Spoiler: Show
Image
svn6549, VirtualBox


Top
   
 Post subject: Re: SysFn 4
PostPosted: Wed Sep 28, 2016 5:14 pm 
Offline

Joined: Tue Mar 08, 2016 11:00 pm
Posts: 436
Есть такое. Вылетает если текст сильно не влезает в окно.


Top
   
 Post subject: Re: SysFn 4
PostPosted: Wed Sep 28, 2016 5:52 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1262
Всё это связано с тем, что вывод на экран производится через промежуточный буфер с шириной экрана.


Top
   
 Post subject: Re: SysFn 4
PostPosted: Wed May 17, 2017 11:04 am 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1262
revision #6899

Теперь слишком длинная строка обрезается.


Top
   
 Post subject: Re: SysFn 4
PostPosted: Mon Oct 16, 2017 3:17 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Разное поведение в зависимости от ревизии
Code:
Unit Unit1;
Interface
Uses KolibriOS;
Procedure Main;
Implementation
Procedure Main;
Begin
  SetEventMask(EM_BUTTON + EM_REDRAW); 
  While TRUE Do Begin
    Case WaitEvent Of
      REDRAW_EVENT:
        Begin
          BeginDraw;
          DrawWindow(100, 50, 150, 130, 'Test', $00FFFFFF, WS_SKINNED_FIXED + WS_COORD_CLIENT + WS_CAPTION, CAPTION_MOVABLE);
          DrawText(20, 50, 'ABCDE'#0'FGHIJKLMNOPQRSTUVWXYZ', $00000000, $00FFFFFF, DT_FILL_OPAQUE, 12);
          EndDraw;       
        End;
      BUTTON_EVENT: ThreadTerminate;
    End;   
  End;
End;
End.
Attachment:
Unit1.kex [464 Bytes]
Downloaded 60 times

Вот таокй вывод в #7040
Attachment:
1.PNG
1.PNG [ 5.8 KiB | Viewed 1322 times ]

а так было в KolibriN8(по моему мнению это правильный вариант)
Attachment:
2.PNG
2.PNG [ 14.1 KiB | Viewed 1322 times ]
Так как в этом случае происходит вывод не zero-terminated строки, то, соответственно, ноль не может считаться признаком конца строки, а, значит, строка не должна обрываться на символе с кодом 0.
Для вывода zero-terminated строк используется флаг DT_ZSTRING
Code:
          DrawText(20, 50, 'ABCDE'#0'FGHIJKLMNOPQRSTUVWXYZ', $00000000, $00FFFFFF, DT_FILL_OPAQUE + DT_ZSTRING, 0);


Top
   
 Post subject: Re: SysFn 4
PostPosted: Tue Oct 17, 2017 2:01 am 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1262
Ну так это ты специально такую строку сделал. А где это встречается на практике? В текстовых строках нулей быть не должно. А ещё это полезно, если размер строки указан неправильно - после неё часто встречаются нули.


Top
   
 Post subject: Re: SysFn 4
PostPosted: Tue Oct 17, 2017 11:23 am 
Offline
User avatar

Joined: Mon Nov 19, 2012 5:22 pm
Posts: 455
Pathoswithin, ну на практике такие строки редкость, но всё же возможны. И даже бывало видеть их в Винде, по-моему, в отладчике видел. Pascal-строки, например. Обычно, правда, всё таки при ошибках программы. Или попытках открыть подбитый txt файл. Считаю, что если надо вывести строку из 10 байт, значит вывести все 10 байт. И плевать, какие они.

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 63 posts ]  Go to page Previous 1 2 3 4 5 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited