forked from KolibriOS/kolibrios
'buf2d.obj':
- functions buf_filled_rect_by_size buf_rect_by_size can take on negative dimensions of rectangles - function of the horizontal line is drawn buf2d_line 1 pixel longer - some functions can draw in 8-bit buffers git-svn-id: svn://kolibrios.org@2358 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
2e8cd5b7ac
commit
8504e7bb6d
@ -127,14 +127,14 @@ stdcall [buf2d_clear], edi, buf2d_color ;
|
|||||||
<p>Рисует в буфере линию принимает такиже параметры как и функция <b>buf2d_line</b>. Данная функция рисует сглаженную линию более красивую чем <b>buf2d_line</b>, но работает медленнее неё за счет вычисления смешанных цветов фона и самой линии.</p>
|
<p>Рисует в буфере линию принимает такиже параметры как и функция <b>buf2d_line</b>. Данная функция рисует сглаженную линию более красивую чем <b>buf2d_line</b>, но работает медленнее неё за счет вычисления смешанных цветов фона и самой линии.</p>
|
||||||
|
|
||||||
<h4>buf2d_rect_by_size</h4>
|
<h4>buf2d_rect_by_size</h4>
|
||||||
<p>Рисует прямоугольную рамку, по двум координатам, 2-я координата задана по размеру.</p>
|
<p>Рисует прямоугольную рамку, по двум координатам, 2-я координата задана по размеру. Если размеры отрицательные рамка рисуется в обратном направлении.</p>
|
||||||
<pre>stdcall [buf2d_rect_by_size], buf_0, 10,10,150,100, 0x8080</pre>
|
<pre>stdcall [buf2d_rect_by_size], buf_0, 10,10,150,100, 0x8080</pre>
|
||||||
<p>где buf_0 - структура буфера в котором будет рисоваться прямоугольник; 10, 10 - координаты левого верхнего угла; 150, 100 - размер прямоугольника; 0x8080 - цвет линии.</p>
|
<p>где buf_0 - структура буфера в котором будет рисоваться прямоугольник; 10, 10 - координаты левого верхнего угла (при отрицательных размерах координата правого нижнего); 150, 100 - размер прямоугольника; 0x8080 - цвет линии.</p>
|
||||||
|
|
||||||
<h4>buf2d_filled_rect_by_size</h4>
|
<h4>buf2d_filled_rect_by_size</h4>
|
||||||
<p>Рисует закрашенный прямоугольник, по двум координатам, 2-я координата задана по размеру. Если размер задать 1*1, то будет нарисована точка размером в 1 пиксель, т.е. размер прямоугольника в пикселях будет равен указанному.</p>
|
<p>Рисует закрашенный прямоугольник, по двум координатам, 2-я координата задана по размеру. Если размер задать 1*1, то будет нарисована точка размером в 1 пиксель, т.е. размер прямоугольника в пикселях будет равен указанному. Если размеры отрицательные прямоугольник рисуется в обратном направлении.</p>
|
||||||
<pre>stdcall [buf2d_rect_by_size], buf_0, 10,10,150,100, 0x8080</pre>
|
<pre>stdcall [buf2d_rect_by_size], buf_0, 10,10,150,100, 0x8080</pre>
|
||||||
<p>где buf_0 - структура буфера в котором будет рисоваться прямоугольник; 10, 10 - координаты левого верхнего угла; 150, 100 - размер прямоугольника; 0x8080 - цвет прямоуголика.</p>
|
<p>где buf_0 - структура буфера в котором будет рисоваться прямоугольник; 10, 10 - координаты левого верхнего угла (при отрицательных размерах координата правого нижнего); 150, 100 - размер прямоугольника; 0x8080 - цвет прямоуголика.</p>
|
||||||
|
|
||||||
<h4>buf2d_circle</h4>
|
<h4>buf2d_circle</h4>
|
||||||
<p>Рисует в буфере окружность с заданным цветом и радиусом. Пример:</p>
|
<p>Рисует в буфере окружность с заданным цветом и радиусом. Пример:</p>
|
||||||
@ -176,6 +176,10 @@ stdcall [buf2d_clear], edi, buf2d_color ;
|
|||||||
|
|
||||||
<h4>buf2d_curve_bezier</h4>
|
<h4>buf2d_curve_bezier</h4>
|
||||||
<p>Рисует по трем точкам отрезок кривой безье.</p>
|
<p>Рисует по трем точкам отрезок кривой безье.</p>
|
||||||
|
<pre>stdcall [buf2d_curve_bezier], buf_0, (10 shl 16)+20,(110 shl 16)+10,(50 shl 16)+90, dword 0xff</pre>
|
||||||
|
<p>где buf_0 - структура буфера в котором будет рисоваться кривая;
|
||||||
|
(10 shl 16)+20,(110 shl 16)+10,(50 shl 16)+90 - координаты точек (10,20), (110,10), (50,90);
|
||||||
|
0xff - цвет прямой.</p>
|
||||||
|
|
||||||
<h4>buf2d_convert_text_matrix</h4>
|
<h4>buf2d_convert_text_matrix</h4>
|
||||||
<p>Преобразует матрицу с текстом размером 16*16 в размер 1*256. Необходимо для создания матрицы для рисования текста. Перед использованием данной функции предполагается что есть изображение с полным набором символов размером 16 столбцов на 16 строк, из которого предварительно был создан 8 битный буфер.</p>
|
<p>Преобразует матрицу с текстом размером 16*16 в размер 1*256. Необходимо для создания матрицы для рисования текста. Перед использованием данной функции предполагается что есть изображение с полным набором символов размером 16 столбцов на 16 строк, из которого предварительно был создан 8 битный буфер.</p>
|
||||||
@ -203,7 +207,7 @@ stdcall [buf2d_convert_text_matrix], buf_1</pre>
|
|||||||
<p>Сдвиг изображения в буфере по высоте вверх или вниз.</p>
|
<p>Сдвиг изображения в буфере по высоте вверх или вниз.</p>
|
||||||
|
|
||||||
<h4>buf2d_flood_fill</h4>
|
<h4>buf2d_flood_fill</h4>
|
||||||
<p>Функция для рекурсивной заливки выбранным цветом. Имееться два варианта заливки. Пример:</p>
|
<p>Функция для рекурсивной заливки выбранным цветом. Имеется два варианта заливки. Пример:</p>
|
||||||
<pre>stdcall [buf2d_flood_fill], buf_0, 100,200, 0, 0xff,0xff0000</pre>
|
<pre>stdcall [buf2d_flood_fill], buf_0, 100,200, 0, 0xff,0xff0000</pre>
|
||||||
<p>где buf_0 - структура буфера;
|
<p>где buf_0 - структура буфера;
|
||||||
100,200 - координаты точки, с которой начнется заливка;
|
100,200 - координаты точки, с которой начнется заливка;
|
||||||
@ -304,6 +308,7 @@ import_buf2d_lib:
|
|||||||
<p>25.03.11 - добавлена функция для рисования точки buf2d_set_pixel.</p>
|
<p>25.03.11 - добавлена функция для рисования точки buf2d_set_pixel.</p>
|
||||||
<p>30.08.11 - добавлена функция изменения размеров буфера buf2d_resize.</p>
|
<p>30.08.11 - добавлена функция изменения размеров буфера buf2d_resize.</p>
|
||||||
<p>13.09.11 - оптимизирована работа функций buf_filled_rect_by_size buf_rect_by_size, добавлены примеры использования библиотеки.</p>
|
<p>13.09.11 - оптимизирована работа функций buf_filled_rect_by_size buf_rect_by_size, добавлены примеры использования библиотеки.</p>
|
||||||
<p>22.09.11 - добавлена функция buf2d_line_sm для рисования сглаженной линии.</з>
|
<p>22.09.11 - добавлена функция buf2d_line_sm для рисования сглаженной линии.</p>
|
||||||
|
<p>20.02.12 - функции buf_filled_rect_by_size и buf_rect_by_size могут принимать отрицательные размеры для прямоугольников, в функции buf2d_line горизонтальная линия рисуется на 1 пиксель длинее (раньше не дорисовывало), некоторые функции могут рисовать в 8 битных буферах.</p>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
@ -82,13 +82,19 @@ draw_pixel:
|
|||||||
mov esi,buf2d_w ;size x
|
mov esi,buf2d_w ;size x
|
||||||
imul esi,ecx ;size_x*y
|
imul esi,ecx ;size_x*y
|
||||||
add esi,ebx ;size_x*y+x
|
add esi,ebx ;size_x*y+x
|
||||||
lea esi,[esi+esi*2] ;(size_x*y+x)*3
|
cmp buf2d_bits,8
|
||||||
add esi,buf2d_data ;ptr+(size_x*y+x)*3
|
je .beg8
|
||||||
|
lea esi,[esi+esi*2] ;(size_x*y+x)*3
|
||||||
mov word[esi],dx ;copy pixel color
|
add esi,buf2d_data ;ptr+(size_x*y+x)*3
|
||||||
ror edx,16
|
mov word[esi],dx ;copy pixel color
|
||||||
mov byte[esi+2],dl
|
ror edx,16
|
||||||
ror edx,16
|
mov byte[esi+2],dl
|
||||||
|
ror edx,16
|
||||||
|
jmp .end_draw
|
||||||
|
.beg8: ;à¨á®¢ ¨¥ â®çª¨ ¢ 8 ¡¨â®¬ ¡ãä¥à¥
|
||||||
|
add esi,buf2d_data ;ptr+(size_x*y+x)
|
||||||
|
mov byte[esi],dl
|
||||||
|
.end_draw:
|
||||||
pop esi
|
pop esi
|
||||||
@@:
|
@@:
|
||||||
ret
|
ret
|
||||||
@ -1067,8 +1073,12 @@ endl
|
|||||||
|
|
||||||
mov eax,edi
|
mov eax,edi
|
||||||
mov edi,[buf_struc]
|
mov edi,[buf_struc]
|
||||||
|
cmp buf2d_bits,8
|
||||||
|
je @f
|
||||||
cmp buf2d_bits,24
|
cmp buf2d_bits,24
|
||||||
jne .coord_end
|
je @f
|
||||||
|
jmp .coord_end
|
||||||
|
@@:
|
||||||
|
|
||||||
cmp [napravl],0
|
cmp [napravl],0
|
||||||
jne .coord_yx
|
jne .coord_yx
|
||||||
@ -1251,9 +1261,14 @@ endp
|
|||||||
align 4
|
align 4
|
||||||
proc buf_line_h, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, color:dword
|
proc buf_line_h, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, color:dword
|
||||||
pushad
|
pushad
|
||||||
|
pushfd
|
||||||
mov edi,[buf_struc]
|
mov edi,[buf_struc]
|
||||||
|
cmp buf2d_bits,8
|
||||||
|
je @f
|
||||||
cmp buf2d_bits,24
|
cmp buf2d_bits,24
|
||||||
jne .end24
|
je @f
|
||||||
|
jmp .end24
|
||||||
|
@@: ;®¯à¥¤¥«¥¨¥ ª®®à¤¨ â «¨¨¨ ®â®á¨â¥«ì® ¡ãä¥à
|
||||||
|
|
||||||
mov ecx,dword[coord_y0]
|
mov ecx,dword[coord_y0]
|
||||||
bt ecx,31
|
bt ecx,31
|
||||||
@ -1279,8 +1294,27 @@ proc buf_line_h, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword
|
|||||||
;dec esi
|
;dec esi
|
||||||
@@:
|
@@:
|
||||||
cmp ebx,esi
|
cmp ebx,esi
|
||||||
jge .end24 ;¥á«¨ x0 >= x1 ¬®¦¥â ¢®§¨ªãâì ª®£¤ ®¡¥ ª®®à¤¨ âë x0, x1 室¨«¨áì § ®¤¨¬ ¨§ ¯à¥¤¥«®¢ ¡ãä¥à
|
jg .end24 ;¥á«¨ x0 > x1 ¬®¦¥â ¢®§¨ªãâì ª®£¤ ®¡¥ ª®®à¤¨ âë x0, x1 室¨«¨áì § ®¤¨¬ ¨§ ¯à¥¤¥«®¢ ¡ãä¥à
|
||||||
|
|
||||||
|
cmp buf2d_bits,24
|
||||||
|
je .beg24
|
||||||
|
;à¨á®¢ ¨¥ ¢ 8 ¡¨â®¬ ¡ãä¥à¥
|
||||||
|
;¢ edx ¢ëç¨á«ï¥¬ ç «® 1-© â®çª¨ «¨¨¨ ¢ ¡ãä¥à¥ ¨§®¡à ¦¥¨ï
|
||||||
|
mov edx,buf2d_w ;size x
|
||||||
|
imul edx,ecx ;size_x*y
|
||||||
|
add edx,ebx ;size_x*y+x
|
||||||
|
add edx,buf2d_data ;ptr+(size_x*y+x)
|
||||||
|
mov edi,edx ;⥯¥àì ¬®¦¥¬ ¯®àâ¨âì 㪠§ â¥«ì ¡ãä¥à
|
||||||
|
|
||||||
|
mov ecx,esi
|
||||||
|
sub ecx,ebx ;¢ ecx ª®««¨ç¥á⢮ â®ç¥ª «¨¨¨ ¢ë¢®¤¨¬ëå ¢ ¡ãä¥à
|
||||||
|
inc ecx ;çâ®-¡ë ¯®á«¥¤ïï â®çª «¨¨¨ â ª¦¥ ®â®¡à ¦ « áì
|
||||||
|
mov eax,dword[color] ;¡ã¤¥¬ ¨á¯®«ì§®¢ âì ⮫쪮 § 票¥ ¢ al
|
||||||
|
cld
|
||||||
|
rep stosb ;横« ¯® ®á¨ x ®â x0 ¤® x1 (¢ª«îç ï x1)
|
||||||
|
jmp .end24
|
||||||
|
|
||||||
|
.beg24: ;à¨á®¢ ¨¥ ¢ 24 ¡¨â®¬ ¡ãä¥à¥
|
||||||
;¢ eax ¢ëç¨á«ï¥¬ ç «® 1-© â®çª¨ «¨¨¨ ¢ ¡ãä¥à¥ ¨§®¡à ¦¥¨ï
|
;¢ eax ¢ëç¨á«ï¥¬ ç «® 1-© â®çª¨ «¨¨¨ ¢ ¡ãä¥à¥ ¨§®¡à ¦¥¨ï
|
||||||
mov eax,buf2d_w ;size x
|
mov eax,buf2d_w ;size x
|
||||||
imul eax,ecx ;size_x*y
|
imul eax,ecx ;size_x*y
|
||||||
@ -1290,16 +1324,18 @@ proc buf_line_h, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword
|
|||||||
|
|
||||||
mov ecx,esi
|
mov ecx,esi
|
||||||
sub ecx,ebx ;¢ ecx ª®««¨ç¥á⢮ â®ç¥ª «¨¨¨ ¢ë¢®¤¨¬ëå ¢ ¡ãä¥à
|
sub ecx,ebx ;¢ ecx ª®««¨ç¥á⢮ â®ç¥ª «¨¨¨ ¢ë¢®¤¨¬ëå ¢ ¡ãä¥à
|
||||||
|
inc ecx ;çâ®-¡ë ¯®á«¥¤ïï â®çª «¨¨¨ â ª¦¥ ®â®¡à ¦ « áì
|
||||||
mov edx,dword[color]
|
mov edx,dword[color]
|
||||||
mov ebx,edx ;ª®®à¤¨ â x0 ¢ ebx 㦥 ¥ ã¦
|
mov ebx,edx ;ª®®à¤¨ â x0 ¢ ebx 㦥 ¥ ã¦
|
||||||
ror edx,16 ;¯®¢®à 稢 ¥¬ ॣ¨áâà çâ® ¡ë 3-© ¡ ©â ¯®¯ « ¢ dl
|
ror edx,16 ;¯®¢®à 稢 ¥¬ ॣ¨áâà çâ® ¡ë 3-© ¡ ©â ¯®¯ « ¢ dl
|
||||||
cld
|
cld
|
||||||
@@: ;横« ¯® ®á¨ x ®â x0 ¤® x1
|
@@: ;横« ¯® ®á¨ x ®â x0 ¤® x1 (¢ª«îç ï x1)
|
||||||
mov word[eax],bx ;copy pixel color
|
mov word[eax],bx ;copy pixel color
|
||||||
mov byte[eax+2],dl
|
mov byte[eax+2],dl
|
||||||
add eax,3
|
add eax,3
|
||||||
loop @b
|
loop @b
|
||||||
.end24:
|
.end24:
|
||||||
|
popfd
|
||||||
popad
|
popad
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
@ -1308,19 +1344,37 @@ align 4
|
|||||||
proc buf_rect_by_size, buf_struc:dword, coord_x:dword,coord_y:dword,w:dword,h:dword, color:dword
|
proc buf_rect_by_size, buf_struc:dword, coord_x:dword,coord_y:dword,w:dword,h:dword, color:dword
|
||||||
pushad
|
pushad
|
||||||
mov edi,[buf_struc]
|
mov edi,[buf_struc]
|
||||||
|
cmp buf2d_bits,8
|
||||||
|
je @f
|
||||||
cmp buf2d_bits,24
|
cmp buf2d_bits,24
|
||||||
jne .coord_end
|
je @f
|
||||||
|
jmp .coord_end
|
||||||
|
@@:
|
||||||
|
|
||||||
mov eax,[coord_x]
|
mov eax,[coord_x]
|
||||||
mov ebx,[coord_y]
|
mov ebx,[coord_y]
|
||||||
mov ecx,[w]
|
mov ecx,[w]
|
||||||
cmp ecx,1
|
;cmp ecx,1
|
||||||
jl .coord_end
|
;jl .coord_end
|
||||||
|
cmp ecx,0
|
||||||
|
je .coord_end
|
||||||
|
jg @f
|
||||||
|
add eax,ecx
|
||||||
|
inc eax
|
||||||
|
neg ecx
|
||||||
|
@@:
|
||||||
add ecx,eax
|
add ecx,eax
|
||||||
dec ecx
|
dec ecx
|
||||||
mov edx,[h]
|
mov edx,[h]
|
||||||
cmp edx,1
|
;cmp edx,1
|
||||||
jl .coord_end
|
;jl .coord_end
|
||||||
|
cmp edx,0
|
||||||
|
je .coord_end
|
||||||
|
jg @f
|
||||||
|
add ebx,edx
|
||||||
|
inc ebx
|
||||||
|
neg edx
|
||||||
|
@@:
|
||||||
|
|
||||||
add edx,ebx
|
add edx,ebx
|
||||||
dec edx
|
dec edx
|
||||||
@ -1338,15 +1392,34 @@ align 4
|
|||||||
proc buf_filled_rect_by_size, buf_struc:dword, coord_x:dword,coord_y:dword,w:dword,h:dword, color:dword
|
proc buf_filled_rect_by_size, buf_struc:dword, coord_x:dword,coord_y:dword,w:dword,h:dword, color:dword
|
||||||
pushad
|
pushad
|
||||||
mov edi,[buf_struc]
|
mov edi,[buf_struc]
|
||||||
|
cmp buf2d_bits,8
|
||||||
|
je @f
|
||||||
cmp buf2d_bits,24
|
cmp buf2d_bits,24
|
||||||
jne .coord_end
|
je @f
|
||||||
|
jmp .coord_end
|
||||||
|
@@:
|
||||||
mov eax,[coord_x]
|
mov eax,[coord_x]
|
||||||
mov ebx,[coord_y]
|
mov ebx,[coord_y]
|
||||||
mov edx,[w]
|
mov edx,[w]
|
||||||
|
cmp edx,0
|
||||||
|
je .coord_end ;¥á«¨ ¢ëá®â 0 ¯¨ªá¥«¥©
|
||||||
|
jg @f ;¥á«¨ ¢ëá®â ¯®«®¦¨â¥«ì ï
|
||||||
|
add eax,edx
|
||||||
|
inc eax
|
||||||
|
neg edx ;è¨à¨ã ¤¥« ¥¬ ¯®«®¦¨â¥«ì®©
|
||||||
|
;inc edx ;¯®ç¥¬ã âãâ ¥ ¤®¡ ¢«ï¥¬ 1-æã ï ¥ § î, ® á ¥© à ¡®â ¥â ¥ ¯à ¢¨«ì®
|
||||||
|
@@:
|
||||||
add edx,eax
|
add edx,eax
|
||||||
|
dec edx
|
||||||
mov ecx,[h]
|
mov ecx,[h]
|
||||||
cmp ecx,1 ;áà ¢¥¨¥ á ¬¨¨¬ «ì® ¢®§¬®¦®© ¢ëá®â®©
|
cmp ecx,0
|
||||||
jl .coord_end ;¥á«¨ ¢ëá®â ¬¥ìè¥ 1-£® ¯¨ªá¥«ï
|
je .coord_end ;¥á«¨ ¢ëá®â 0 ¯¨ªá¥«¥©
|
||||||
|
jg @f ;¥á«¨ ¢ëá®â ¯®«®¦¨â¥«ì ï
|
||||||
|
add ebx,ecx ;ᤢ¨£ ¥¬ ¢¥àåîî ª®®à¤¨ âã ¯àאַ㣮«ì¨ª
|
||||||
|
inc ebx
|
||||||
|
neg ecx ;¢ëá®âã ¤¥« ¥¬ ¯®«®¦¨â¥«ì®©
|
||||||
|
;inc ecx ;¯®ç¥¬ã âãâ ¥ ¤®¡ ¢«ï¥¬ 1-æã ï ¥ § î, ® á ¥© à ¡®â ¥â ¥ ¯à ¢¨«ì®
|
||||||
|
@@:
|
||||||
mov esi,dword[color]
|
mov esi,dword[color]
|
||||||
cld
|
cld
|
||||||
@@:
|
@@:
|
||||||
@ -1366,8 +1439,12 @@ locals
|
|||||||
endl
|
endl
|
||||||
pushad
|
pushad
|
||||||
mov edi,dword[buf_struc]
|
mov edi,dword[buf_struc]
|
||||||
|
cmp buf2d_bits,8
|
||||||
|
je @f
|
||||||
cmp buf2d_bits,24
|
cmp buf2d_bits,24
|
||||||
jne .error
|
je @f
|
||||||
|
jmp .error
|
||||||
|
@@:
|
||||||
mov edx,dword[color]
|
mov edx,dword[color]
|
||||||
|
|
||||||
finit
|
finit
|
||||||
@ -1414,7 +1491,7 @@ endl
|
|||||||
jge @b
|
jge @b
|
||||||
jmp .exit_fun
|
jmp .exit_fun
|
||||||
.error:
|
.error:
|
||||||
stdcall print_err,sz_buf2d_circle,txt_err_n24b
|
stdcall print_err,sz_buf2d_circle,txt_err_n8_24b
|
||||||
.exit_fun:
|
.exit_fun:
|
||||||
|
|
||||||
popad
|
popad
|
||||||
@ -1561,8 +1638,12 @@ align 4
|
|||||||
proc buf_set_pixel, buf_struc:dword, coord_x:dword, coord_y:dword, color:dword
|
proc buf_set_pixel, buf_struc:dword, coord_x:dword, coord_y:dword, color:dword
|
||||||
pushad
|
pushad
|
||||||
mov edi,[buf_struc]
|
mov edi,[buf_struc]
|
||||||
|
cmp buf2d_bits,8
|
||||||
|
je @f
|
||||||
cmp buf2d_bits,24
|
cmp buf2d_bits,24
|
||||||
jne .end24
|
je @f
|
||||||
|
jmp .end24
|
||||||
|
@@:
|
||||||
mov ebx,dword[coord_x]
|
mov ebx,dword[coord_x]
|
||||||
mov ecx,dword[coord_y]
|
mov ecx,dword[coord_y]
|
||||||
mov edx,dword[color]
|
mov edx,dword[color]
|
||||||
@ -2544,6 +2625,7 @@ endp
|
|||||||
|
|
||||||
txt_err_n8b db 'need buffer 8 bit',13,10,0
|
txt_err_n8b db 'need buffer 8 bit',13,10,0
|
||||||
txt_err_n24b db 'need buffer 24 bit',13,10,0
|
txt_err_n24b db 'need buffer 24 bit',13,10,0
|
||||||
|
txt_err_n8_24b db 'need buffer 8 or 24 bit',13,10,0
|
||||||
|
|
||||||
align 16
|
align 16
|
||||||
EXPORTS:
|
EXPORTS:
|
||||||
|
Loading…
Reference in New Issue
Block a user