SoUrcerer
Может сразу над новым АПИ подумать для новых шрифтов. Например надо, чтобы функция вписывала текст в ограничивающий прямоугольник, отсекая лишнее.
SysFn 4
Устное предупреждение всем участникам оффтопа. Раз...
Serge, я думаю над более интересными вещами. Займусь начальными исследованиями этой важной для меня области.
Serge, я думаю над более интересными вещами. Займусь начальными исследованиями этой важной для меня области.
Допустим вариант: при ebx = 1 , в eax возвращать ширину строкиSoUrcerer wrote:В трех битах нельзя вернуть данные. В трех битах можно определить новую подфункцию, но это будет нелогично. В общем, нафиг всё, даешь библиотеку.
Это ни как не сломает все работающие программы, так как ebx = [координата по оси x]*65536 + [координата по оси y], что при любом раскладе > 1, собственно добавить в 4 функцию
то что тут затрётся eax, как понимаете, ничего страшного! Так как условие ebx=1 ранее не существовало, и во всех остальных программах, не использовавших это - eax затираться не будет!cmp ebx,1
...
je....
...
mov eax,...
PS: стандарты нарушать не хорошо (согласен с Маратом), как и плодить костыли, но ведь подобное расширение функции допустимо! Это ни чем не хуже этого:
просто еще одно условие, при чём не ресурсоёмкое и много мусора не внесёт (ничего лишнего в ядре не должно быть!) Вообще да, нужна библиотека ответственная за работу со шрифтами и вывод текста во всех извращённых формах, с функциями возвращения размеров каждого символа какого нужно, вывода подчёркнутого наклонного зачёркнутого текста, с функцией вывода текста с установленным шагом и прочче, в общем библиотека!).A=0 - выводить esi символов, A=1 - выводить ASCIIZ-строку
esi = для A=0 длина строки, должна быть не больше 255; для A=1 игнорируется
PPS: у линукса хороший слоган есть. Есть программа, она должна выполнять только свои функции, ничего левого, но должна это делать по максимуму.
4я функция умеет рисовать в относительных координатах. Я частенько рисую в 0,0. Не исключено, что кто-то может нарисовать что-то в 0,1. Это плохое ограничение.
Ok, при ebx = 0xFFFF ? (X=0, Y=65535) врятли такое возможно, а если кто то и рисует в таких суперширокоформатных масштабах) на экране всё равно ничего не изменится!SoUrcerer wrote:4я функция умеет рисовать в относительных координатах. Я частенько рисую в 0,0. Не исключено, что кто-то может нарисовать что-то в 0,1. Это плохое ограничение.
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-системный шрифт переменной ширины
Почему не использовать Y в таком случае?
Почему бы и нет, не вижу в этом трагедии какой то. Это ни чем не хуже этого:SoUrcerer wrote:Почему не использовать Y в таком случае?
Ну я собственно не настаиваю, просто высказал своё мнение и соображения. Работу программ существующих не нарушает, объём кода реализации 5 строк. В общем я за подобное расширение функционала. Другое дело как окажется в итоге, после всех мнений.A=0 - выводить esi символов, A=1 - выводить ASCIIZ-строку
esi = для A=0 длина строки, должна быть не больше 255; для A=1 игнорируется
Можно было и еще безопаснее при теперешней реализации функции 4
Вот кусок описания функции
Накладываем свою жадную лапу на C=1 , edi=0 и спокойно возвращаем в eax или в ecx ширину строки.
Думаю указатель на область пользователя с нулевым адресом точно никто не юзает (а также с адресом 1, 2, 3,... и еще чуть-чуть так что еще и на кучу подфункций в будущем хватит )
Вот кусок описания функции
Code: Select all
* Y=Cnnn (биты):
* C=1 перенаправить вывод в область пользователя, задано в edi
* nnn - не используется в текущем виде, должно быть 0 (zero)
* edx = указатель на начало строки
* esi = для A=0 длина строки, должна быть не больше 255;
для A=1 игнорируется
* edi = цвет для закраски фона, если B=1
* edi = указатель на область пользователя, если C=1
Возвращаемое значение:
* функция не возвращает значения
Думаю указатель на область пользователя с нулевым адресом точно никто не юзает (а также с адресом 1, 2, 3,... и еще чуть-чуть так что еще и на кучу подфункций в будущем хватит )
Заглянул на огонёк
Вот такой код Уже скомпилированный бинарник
В результате при запуске приложения происходит это
и иногда приложение остаётся работать. Но чаще всего приложение просто вылетает, и на BOARD появляется это
svn6549, VirtualBox
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:
Spoiler:
Spoiler:
Есть такое. Вылетает если текст сильно не влезает в окно.
Всё это связано с тем, что вывод на экран производится через промежуточный буфер с шириной экрана.
revision #6899
Теперь слишком длинная строка обрезается.
Теперь слишком длинная строка обрезается.
Разное поведение в зависимости от ревизии
Вот таокй вывод в #7040
а так было в KolibriN8(по моему мнению это правильный вариант) Так как в этом случае происходит вывод не zero-terminated строки, то, соответственно, ноль не может считаться признаком конца строки, а, значит, строка не должна обрываться на символе с кодом 0.
Для вывода zero-terminated строк используется флаг DT_ZSTRING
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.
Для вывода 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 3 guests