SysFn 4

Kernel-side graphics support
  • Устное предупреждение всем участникам оффтопа. Раз...

    Serge, я думаю над более интересными вещами. Займусь начальными исследованиями этой важной для меня области.
  • 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: у линукса хороший слоган есть. Есть программа, она должна выполнять только свои функции, ничего левого, но должна это делать по максимуму.
  • 4я функция умеет рисовать в относительных координатах. Я частенько рисую в 0,0. Не исключено, что кто-то может нарисовать что-то в 0,1. Это плохое ограничение.
  • 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/ Шансов конечно такой ситуации мало, но вдруг!
  • Почему не использовать Y в таком случае?
  • SoUrcerer wrote:Почему не использовать Y в таком случае?
    Почему бы и нет, не вижу в этом трагедии какой то. Это ни чем не хуже этого:
    A=0 - выводить esi символов, A=1 - выводить ASCIIZ-строку
    esi = для A=0 длина строки, должна быть не больше 255; для A=1 игнорируется
    Ну я собственно не настаиваю, просто высказал своё мнение и соображения. Работу программ существующих не нарушает, объём кода реализации 5 строк. В общем я за подобное расширение функционала. Другое дело как окажется в итоге, после всех мнений.
  • Можно было и еще безопаснее при теперешней реализации функции 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 так что еще и на кучу подфункций в будущем хватит )
    Заглянул на огонёк
  • Вот такой код
    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
  • Есть такое. Вылетает если текст сильно не влезает в окно.
  • Всё это связано с тем, что вывод на экран производится через промежуточный буфер с шириной экрана.
  • revision #6899

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

    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 11618 times
    а так было в KolibriN8(по моему мнению это правильный вариант)
    2.PNG
    2.PNG (14.1 KiB)
    Viewed 11618 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);
  • Ну так это ты специально такую строку сделал. А где это встречается на практике? В текстовых строках нулей быть не должно. А ещё это полезно, если размер строки указан неправильно - после неё часто встречаются нули.
  • Pathoswithin, ну на практике такие строки редкость, но всё же возможны. И даже бывало видеть их в Винде, по-моему, в отладчике видел. Pascal-строки, например. Обычно, правда, всё таки при ошибках программы. Или попытках открыть подбитый txt файл. Считаю, что если надо вывести строку из 10 байт, значит вывести все 10 байт. И плевать, какие они.
    Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
  • Who is online

    Users browsing this forum: No registered users and 2 guests