Page 3 of 5

Re: SysFn 4

Posted: Tue Mar 12, 2013 11:35 pm
by Serge
SoUrcerer
Может сразу над новым АПИ подумать для новых шрифтов. Например надо, чтобы функция вписывала текст в ограничивающий прямоугольник, отсекая лишнее.

Re: SysFn 4

Posted: Tue Mar 12, 2013 11:42 pm
by SoUrcerer
Устное предупреждение всем участникам оффтопа. Раз...

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

Re: SysFn 4

Posted: Tue Mar 12, 2013 11:49 pm
by Akyltist
SoUrcerer wrote:В трех битах нельзя вернуть данные. В трех битах можно определить новую подфункцию, но это будет нелогично. В общем, нафиг всё, даешь библиотеку.
Допустим вариант: при ebx = 1 , в eax возвращать ширину строки

Это ни как не сломает все работающие программы, так как ebx = [координата по оси x]*65536 + [координата по оси y], что при любом раскладе > 1, собственно добавить в 4 функцию
cmp ebx,1
...
je....
...
mov eax,...
то что тут затрётся eax, как понимаете, ничего страшного! Так как условие ebx=1 ранее не существовало, и во всех остальных программах, не использовавших это - eax затираться не будет!

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

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

Re: SysFn 4

Posted: Tue Mar 12, 2013 11:59 pm
by SoUrcerer
4я функция умеет рисовать в относительных координатах. Я частенько рисую в 0,0. Не исключено, что кто-то может нарисовать что-то в 0,1. Это плохое ограничение.

Re: SysFn 4

Posted: Wed Mar 13, 2013 12:04 am
by Akyltist
SoUrcerer wrote:4я функция умеет рисовать в относительных координатах. Я частенько рисую в 0,0. Не исключено, что кто-то может нарисовать что-то в 0,1. Это плохое ограничение.
Ok, при ebx = 0xFFFF ? (X=0, Y=65535) врятли такое возможно, а если кто то и рисует в таких суперширокоформатных масштабах) на экране всё равно ничего не изменится!

PS: ebx =0xFFFFFFFF ? О_о

Ну на крайний случай: (хотя вариант выше мне кажется безопаснее)
X=ABnn (биты):
nn задает используемый шрифт: 0=системный моноширинный, 1=системный шрифт переменной ширины
У нас получается что на самом деле:
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/ Шансов конечно такой ситуации мало, но вдруг!

Re: SysFn 4

Posted: Wed Mar 13, 2013 12:29 am
by SoUrcerer
Почему не использовать Y в таком случае?

Re: SysFn 4

Posted: Wed Mar 13, 2013 12:37 am
by Akyltist
SoUrcerer wrote:Почему не использовать Y в таком случае?
Почему бы и нет, не вижу в этом трагедии какой то. Это ни чем не хуже этого:
A=0 - выводить esi символов, A=1 - выводить ASCIIZ-строку
esi = для A=0 длина строки, должна быть не больше 255; для A=1 игнорируется
Ну я собственно не настаиваю, просто высказал своё мнение и соображения. Работу программ существующих не нарушает, объём кода реализации 5 строк. В общем я за подобное расширение функционала. Другое дело как окажется в итоге, после всех мнений.

Re: SysFn 4

Posted: Sun Jul 07, 2013 7:20 pm
by Alver
Можно было и еще безопаснее при теперешней реализации функции 4 :D

Вот кусок описания функции

Code: Select all

   * 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 так что еще и на кучу подфункций в будущем хватит )

Re: SysFn 4

Posted: Wed Sep 28, 2016 4:41 pm
by 0CodErr
Вот такой код
Spoiler:

Code: Select all

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:
Уже скомпилированный бинарник
test.kex (191 Bytes)
Downloaded 353 times
В результате при запуске приложения происходит это
Spoiler:Image
и иногда приложение остаётся работать. Но чаще всего приложение просто вылетает, и на BOARD появляется это
Spoiler:Image
svn6549, VirtualBox

Re: SysFn 4

Posted: Wed Sep 28, 2016 5:14 pm
by Siemargl
Есть такое. Вылетает если текст сильно не влезает в окно.

Re: SysFn 4

Posted: Wed Sep 28, 2016 5:52 pm
by Pathoswithin
Всё это связано с тем, что вывод на экран производится через промежуточный буфер с шириной экрана.

Re: SysFn 4

Posted: Wed May 17, 2017 11:04 am
by Pathoswithin
revision #6899

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

Re: SysFn 4

Posted: Mon Oct 16, 2017 3:17 pm
by 0CodErr
Разное поведение в зависимости от ревизии

Code: Select all

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.
Unit1.kex (464 Bytes)
Downloaded 295 times
Вот таокй вывод в #7040
1.PNG
1.PNG (5.8 KiB)
Viewed 11614 times
а так было в KolibriN8(по моему мнению это правильный вариант)
2.PNG
2.PNG (14.1 KiB)
Viewed 11614 times
Так как в этом случае происходит вывод не zero-terminated строки, то, соответственно, ноль не может считаться признаком конца строки, а, значит, строка не должна обрываться на символе с кодом 0.
Для вывода zero-terminated строк используется флаг DT_ZSTRING

Code: Select all

          DrawText(20, 50, 'ABCDE'#0'FGHIJKLMNOPQRSTUVWXYZ', $00000000, $00FFFFFF, DT_FILL_OPAQUE + DT_ZSTRING, 0);

Re: SysFn 4

Posted: Tue Oct 17, 2017 2:01 am
by Pathoswithin
Ну так это ты специально такую строку сделал. А где это встречается на практике? В текстовых строках нулей быть не должно. А ещё это полезно, если размер строки указан неправильно - после неё часто встречаются нули.

Re: SysFn 4

Posted: Tue Oct 17, 2017 11:23 am
by GerdtR
Pathoswithin, ну на практике такие строки редкость, но всё же возможны. И даже бывало видеть их в Винде, по-моему, в отладчике видел. Pascal-строки, например. Обычно, правда, всё таки при ошибках программы. Или попытках открыть подбитый txt файл. Считаю, что если надо вывести строку из 10 байт, значит вывести все 10 байт. И плевать, какие они.