164 lines
6.6 KiB
NASM
164 lines
6.6 KiB
NASM
; -----------------------------
|
||
; Рисует кнопку с текстовой меткой
|
||
; input: pLabel - указатель на структуру LABEL
|
||
; id - идентификатор кнопки
|
||
; xPosition - позиция X
|
||
; yPosition - позиция Y
|
||
; bWidth - ширина кнопки
|
||
; bHeight - высота кнопки
|
||
; -----------------------------
|
||
proc draw.Button pLabel, id, xPosition, yPosition, bWidth, bHeight
|
||
mcall 8, <[xPosition], [bWidth]>, <[yPosition], [bHeight]>, [id], [button_color]
|
||
; позиция X для размещения текста
|
||
mov eax, [bHeight]
|
||
shr eax, 1
|
||
add [yPosition], eax
|
||
; позиция Y для размещения текста
|
||
mov eax, [pLabel]
|
||
mov eax, [eax+LABEL.size]
|
||
neg eax
|
||
mul [configFont.width]
|
||
add eax, [bWidth]
|
||
add eax, 4
|
||
shr eax, 1
|
||
add [xPosition], eax
|
||
; размещаем текст на кнопке
|
||
stdcall draw.Label, [pLabel], [xPosition], [yPosition]
|
||
ret
|
||
endp
|
||
; -----------------------------
|
||
; Рисует текст по yPosition и центрируя текст по ширине экрана
|
||
; с учетом длины текста и указанного смещения в символах
|
||
; input: pLabel - указатель на структуру LABEL
|
||
; yPosition - позиция Y
|
||
; countOffset - кол-во символов для смещения
|
||
; -----------------------------
|
||
proc draw.Navigation pLabel, yPosition, countOffset
|
||
mov eax, [pLabel]
|
||
mov eax, [eax + LABEL.size]
|
||
sub eax, [countOffset]
|
||
stdcall draw.GetNavigationX, eax
|
||
stdcall draw.Label, [pLabel], eax, [yPosition], 0
|
||
ret
|
||
endp
|
||
; -----------------------------
|
||
; Рисует число по yPosition и центрируя число по ширине экрана
|
||
; с учетом длины числа и указанного смещения в символах
|
||
; input: pLabel - указатель на структуру LABEL
|
||
; yPosition - позиция Y
|
||
; countOffset - кол-во символов для смещения
|
||
; -----------------------------
|
||
proc draw.NavigationNumber pLabel, yPosition, countOffset
|
||
mov eax, [pLabel]
|
||
mov eax, [eax + LABEL.size]
|
||
sub eax, [countOffset]
|
||
stdcall draw.GetNavigationX, eax
|
||
stdcall draw.Number, [pLabel], eax, [yPosition], 0
|
||
ret
|
||
endp
|
||
; -----------------------------
|
||
; Возвращает координату X для размещения текста по центру экрана
|
||
; с учетом указанного смещения в символах
|
||
; input: countOffset - кол-во символов для смещения
|
||
; output: eax - координата X
|
||
; -----------------------------
|
||
proc draw.GetNavigationX countOffset
|
||
mov eax, [countOffset]
|
||
neg eax
|
||
mul [configFont.width]
|
||
add eax, [window_width]
|
||
sub eax, 10
|
||
shr eax, 1
|
||
ret
|
||
endp
|
||
; -----------------------------
|
||
; Формирует в одном регистре координаты в нужном формате добавляя
|
||
; ширину смещения символов по X если указано кол-во
|
||
; input: xPosition - позиция по X
|
||
; yPosition - позиция по Y
|
||
; countOffset - кол-во символов для смещения
|
||
; output: eax - координата в формате X*65536+Y
|
||
; -----------------------------
|
||
proc draw._prepareCoord xPosition, yPosition, countOffset
|
||
mov eax, [countOffset]
|
||
mul [configFont.width]
|
||
add eax, [xPosition]
|
||
shl eax, 16
|
||
|
||
mov ebx, [configFont.height]
|
||
shr ebx, 1
|
||
sub [yPosition], ebx
|
||
add eax, [yPosition]
|
||
ret
|
||
endp
|
||
; -----------------------------
|
||
; Рисует текст по указанной позиции X и Y
|
||
; и смещает на ширину символов по X если указано
|
||
; input: pLabel - указатель на структуру LABEL
|
||
; xPosition - позиция X
|
||
; yPosition - позиция Y
|
||
; countOffset - кол-во символов для смещения
|
||
; -----------------------------
|
||
proc draw.Label pLabel, xPosition, yPosition, countOffset
|
||
stdcall draw._prepareCoord, [xPosition], [yPosition], [countOffset]
|
||
mov ebx, eax
|
||
mov eax, [pLabel]
|
||
mov ecx, [configFont.mask]
|
||
or ecx, [eax + LABEL.color]
|
||
mov edx, [eax + LABEL.value]
|
||
mcall 4
|
||
ret
|
||
endp
|
||
; -----------------------------
|
||
; Рисует число по указанной позиции X и Y
|
||
; и смещает на ширину символов по X если указано
|
||
; input: pLabel - указатель на структуру LABEL
|
||
; xPosition - позиция X
|
||
; yPosition - позиция Y
|
||
; countOffset - кол-во символов для смещения
|
||
; -----------------------------
|
||
proc draw.Number pLabel, xPosition, yPosition, countOffset
|
||
stdcall draw._prepareCoord, [xPosition], [yPosition], [countOffset]
|
||
mov edx, eax
|
||
mov eax, [pLabel]
|
||
mov ebx, [eax + LABEL.size]
|
||
shl ebx, 16
|
||
mov ecx, [eax + LABEL.value]
|
||
mov esi, [configFont.maskNumber]
|
||
or esi, [eax + LABEL.color]
|
||
mcall 47, , , , ,[background_color]
|
||
ret
|
||
endp
|
||
; -----------------------------
|
||
; Установить настройки шрифта в зависимости от размера ячейки
|
||
; устанавливает высоту, ширину символа и маску для рисования текста и числа
|
||
; input: squareSideLength - размер ячейки
|
||
; -----------------------------
|
||
proc draw.setConfigFont squareSideLength
|
||
cmp [squareSideLength], MIN_SQUARE_SIDE_LENGTH_FONT
|
||
jg @f
|
||
cmp [configFont.flag], FONT_SMALL
|
||
je .return
|
||
mov [configFont.flag], FONT_SMALL
|
||
jmp .set
|
||
@@:
|
||
cmp [configFont.flag], FONT_LARGE
|
||
je .return
|
||
mov [configFont.flag], FONT_LARGE
|
||
.set:
|
||
mov eax, [configFont.flag]
|
||
lea ebx, [eax + 8]
|
||
shl ebx, 28
|
||
mov [configFont.mask], ebx
|
||
lea ebx, [eax*2 + 6]
|
||
mov [configFont.width], ebx
|
||
lea ebx, [7 + eax*4]
|
||
lea ebx, [ebx + eax*2]
|
||
mov [configFont.height], ebx
|
||
lea ebx, [eax + 4]
|
||
shl ebx, 28
|
||
mov [configFont.maskNumber], ebx
|
||
.return:
|
||
ret
|
||
endp
|