Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 1534 → Rev 1535

/programs/develop/libraries/buf2d/trunk/about.htm
0,0 → 1,242
<html>
<head>
<title>áèáëèîòåêà äëÿ ðàáîòû ñ 2d áóôåðàìè</title>
<meta http-equiv="content-type" content="text/html; charset=WINDOWS-1251">
<style>
body
{
font-size: 15px;
font-family: "Bookman Old Style";
color: black;
text-align: justify;
}
h1 { color: green; font-size: 23px; }
h2 { color: green; font-size: 21px; }
h3 { color: green; font-size: 19px; }
h4 { color: #803f00; font-size: 17px; }
i { color: #0099cc; }
b { color: #0099cc; }
p {
text-indent: 1em;
margin-top: 3px;
margin-bottom: 2px;
margin-left: 0px;
margin-right: 0px;
}
ol, ul, dl{
margin-top: 3px;
margin-bottom: 2px;
}
pre
{
padding: 2px;
padding-left: 20px;
margin-top: 5px;
margin-bottom: 5px;
margin-left: 0px;
margin-right: 0px;
font-family: "Courier New";
font-size: 15px;
color: #004000;
background-color: #ffd0ff;
}
table { font-size: 15px; }
</style>
</head>
 
<body>
 
<h1>Îãëàâëåíèå</h1>
<ul>
<li>Âñòóïëåíèå</li>
<li><a href="#f_buf">Ôîðìàòû áóôåðîâ</a></li>
<li><a href="#fun">Ôóíêöèè</a><br>
<li><a href="#const">Êîíñòàíòû</a><br>
<li><a href="#tabl_e">Òàáëèöà ýêñïîðòà</a></li>
<li><a href="#hist">Èñòîðèÿ</a></li>
</ul>
 
<h1>Âñòóïëåíèå</h1>
<p>Äîêóìåíòàöèÿ ê ñâîáîäíîé áèáëèîòåêå <b>buf2d.asm</b>, äëÿ <b>ÎÑ Êîëèáðè</b>.
Ýòà áèáëèîòåêà ñîçäàíà äëÿ ðàáîòû ñ 2d èçîáðàæåíèÿìè.
Ñ åå ïîìîùüüþ ìîæíî ñîçäàâàòü áóôåðà ñ èçîáðàæåíèÿìè â ïàìÿòè, è ïðè íåîáõîäèìîñòè âûâîäèòü èõ íà ýêðàí.
Èçîáðàæåíèÿ ìîæíî íàêëàäûâàòü îäíî íà äðóãîå, ïîääåðæèâàåòñÿ ðàáîòà ñ ïðîçðà÷íûìè èçîáðàæåíèÿìè, åñòü ôóíêöèÿ ðèñîâàíèÿ ëèíè ïîêà íà ýòîì âñå.</p>
 
<p>Ïîñëåäíåå îáíîâëåíèå áèáëèîòåêè 29.07.10.</p>
 
<h1><a name="f_buf">Ôîðìàòû áóôåðîâ</a></h1>
<p>Ïîääåðæèâàåòñÿ 3 ôîðìàòà áóôåðîâ.
Êàæäàÿ ôóíêöèÿ ïðè ðàáîòå ñ áóôåðàìè ìîæåò áûòü ðàñ÷èòàíà íà ðàáîòó ñ îïðåäåëåííûìè ôîðìàòàìè èçîáðàæåíèé.</p>
 
<h4>8 áèò</h4>
<p>Ñîæåðæèò àëüôà êàíàë <b>a</b> (ïðîçðà÷íîñòü) èçîáðàæåíèÿ. Íà ýêðàí íå âûâîäèòñÿ. Èñïîëüçóåòñÿ äëÿ ñîçäàíÿ 32-áèòíûõ áóôåðîâ.</p>
<h4>24 áèò</h4>
<p>Äàííûé áóôåð ñîäåðæèò èçîáðàæåíèå â ôîðìàòå <b>rgb</b>. Ìîæåò âûâîäèòñÿ íà ýêðàí.</p>
<h4>32 áèò</h4>
<p>Ñîäåðæèò ïðîçðà÷íîå èçîáðàæåíèå â ôîðìàòå <b>rgba</b>. Íà ýêðàí íå âûâîäèòñÿ. Èñïîëüçóåòñÿ äëÿ íàëîæåíèÿ èçîáðàæåíèé.</p>
 
<h1><a name="fun">Ôóíêöèè</a></h1>
 
<p>Ïî÷òè âñå ôóíêöèè 1-ì ïàðàìåòðîì ïðèíèìàþò óêàçàòåëü íà ñòðóêòóðó áóôåðà,
èç êîòîðîé ìîãóò èñïîëüçîâàòüñÿ ïàðàìåòðû, íóæíûå äëÿ ðàáîòû êîíêðåòíîé ôóíêöèè.
Ïðèìåð ñòðóêòóðû áóôåðà èçîáðàæåíèÿ:</p>
<pre>align 4
buf_0:
dd 0 ;+ 0 óêàçàòåëü íà áóôåð èçîáðàæåíèÿ
dw 100 ;+ 4 îòñòóï ñëåâà
dw 10 ;+ 6 îòñòóï ñïðàâà
dd 150 ;+ 8 øèðèíà
dd 100 ;+12 âûñîòà
dd 0x80 ;+16 ôîíîâûé öâåò
db 24 ;+20 áèò íà ïèêñåëü</pre>
 
<h4>lib_init</h4>
<p>Ýòà ôóíêöèÿ ïîëó÷àåò óêàçàòåëè íà ôóíêöèè ðàáîòû ñ ïàìÿòüþ, âûçûâàòñÿ äîëæíà ïðè çàãðóçêå áèáëèîòåêè. Ìîæåòå èñïîëüçîâàòü ìàêðîñ <b>@use_library_mem</b>, äëÿ åå àâòîìàòè÷åñêîé íàñòðîéêè.</p>
 
<h4>buf2d_create</h4>
<p>Ñîçäàåò áóôåð è ÷èñòèò åãî ôîíîâûì öâåòîì.</p>
 
<h4>buf2d_create_f_img</h4>
<p>Ñîçäàåò áóôåð íà îñíîâå èçîáðàæåíèÿ â ôîðìàòå <b>rgb</b>.</p>
 
<h4>buf2d_clear</h4>
<p>×èñòèò áóôåð ôîíîâûì öâåòîì.</p>
 
<h4>buf2d_draw</h4>
<p>Ðèñóåò áóôåð íà ýêðàíå (ðàáîòàåò ÷åðåç ñèñòåìíóþ ô. 7). Ðèñóþòñÿ òîëüêî áóôåðà ñ ãëóáèíîé öâåòà 24 áèòà.</p>
 
<h4>buf2d_delete</h4>
<p>Îñâîáîæäàåò ïàìÿòü çàíÿòóþ èçîáðàæåíèåì áóôåðà.</p>
 
<h4>buf2d_line</h4>
<p>Ðèñóåò â áóôåðå ëèíèþ ñ çàäàííûì öâåòîì è êîîðäèíàòàìè. Ïðèìåð èñïîëüçîâàíèÿ:</p>
<pre>stdcall [buf2d_line], buf_0, 30,10, 110,70, 0xffff00 ;ðèñóåì ëèíèþ</pre>
<p>ãäå buf_0 - ñòðóêòóðà áóôåðà â êîòîðîì áóäåò ðèñîâàòüñÿ ëèíèÿ; 30, 10, 110, 70 - êîîðäèíàòû ëèíèè; 0xffff00 - öâåò ëèíèè.</p>
 
<h4>buf2d_circle</h4>
<p>Ðèñóåò â áóôåðå îêðóæíîñòü ñ çàäàííûì öâåòîì è ðàäèóñîì. Ïðèìåð èñïîëüçîâàíèÿ:</p>
<pre>stdcall [buf2d_circle], buf_0, 25, 70, 15, 0xff0000</pre>
<p>ãäå buf_0 - ñòðóêòóðà áóôåðà â êîòîðîì áóäåò ðèñîâàòüñÿ îêðóæíîñòü; 25, 70 - êîîðäèíàòû öåíòðà; 15 - ðàäèóñ; 0xff0000 - öâåò.</p>
 
<h4>buf2d_img_hdiv2</h4>
<p>Ñæèìàåò èçîáðàæåíèå â áóôåðå ïî âûñîòå â 2 ðàçà, ïðè ýòîì ðàçìåð ñàìîãî áóôåðà íå óìåíüøàåòñÿ.</p>
 
<h4>buf2d_img_wdiv2</h4>
<p>Ñæèìàåò èçîáðàæåíèå â áóôåðå ïî øèðèíå â 2 ðàçà, ïðè ýòîì ðàçìåð ñàìîãî áóôåðà íå óìåíüøàåòñÿ.</p>
 
<h4>buf2d_conv_24_to_8</h4>
<p>Ïðåîáðàçîâàíèå áóôåðà èç 24-áèòíîãî â 8-áèòíûé.
Ïðè ïðåîáðàçîâàíèè óêàçûâàåòñÿ êàêîé öâåò áåðàòü: 0-ñèíèé, 1-çåëåíûé, 2-êðàñíûé.
Îñòàëüíûå öâåòà ïðè ïðåîáðàçîâàíèè òåðÿþòñÿ.</p>
 
<h4>buf2d_conv_24_to_32</h4>
<p>Ïðåîáðàçîâàíèå áóôåðà èç 24-áèòíîãî â 32-áèòíûé.
Ïðè ïðåîáðàçîâàíèè óêàçûâàåòñÿ òàêæå 8-áèòíûé áóôåð, êîòîðûé áóäåò èñïîëüçîâàí äëÿ ñîçäàíèÿ àëüôà êàíàëà. Ïðèìåð:</p>
<pre>stdcall [buf2d_conv_24_to_32],buf_a,buf_b ;äåëàåì áóôåð rgba 32áèò</pre>
<p>Äî âûïîëíåíèÿ ôóíêöèè áóôåð buf_a äîëæåí áûòü 24 áèòíûì, à áóôåð buf_b - 8 áèòíûì.
Ïîñëå âûïîëíåíèÿ ôóíêöèè áóôåð buf_a ñòàíåò 32 áèòíûì, áóôåð buf_b íå èçìåíèòñÿ.</p>
 
<h4>buf2d_bit_blt</h4>
<p>Ðèñóåò â áóôåðå èçîáðàæåíèå èç äðóãîãî áóôåðà â óêàçàííûõ êîîðäèíàòàõ. Áóôåð â êîòîðîì ðèñóò (ïðèåìíèê) äîëæåí áûòü 24 áèòíûì, à òîò êîòîðûé ðèñóåòñÿ (èñòî÷íèê) 24 èëè 32 áèòíûì. Åñëè áóôåð èñòî÷íèê 32 áèòíûé, òî åãî ïðîçðà÷íîñòü ïðè ðèñîâàíèè íå ó÷èòûâàåòñÿ, äëÿ ó÷åòà ïðîçðà÷íîñòè èñïîëüçóåòñÿ ôóíêöèÿ <i>buf2d_bit_blt_transp</i>.</p>
 
<h4>buf2d_bit_blt_transp</h4>
<p>Ðèñóåò â áóôåðå èçîáðàæåíèå èç äðóãîãî áóôåðà â óêàçàííûõ êîîðäèíàòàõ, ïðè ýòîì ó÷èòûâàåòñÿ ïðîçðà÷íîñòü.
Áóôåð êîòîðûé áóäåò íàðèñîâàí äîëæåí áûòü 32 áèòíûì, à òîò â êîòîðîì ðèñóþò 24 áèòíûì.</p>
 
<h4>buf2d_bit_blt_alpha</h4>
<p>Ðèñóåò â áóôåðå èçîáðàæåíèå èç äðóãîãî áóôåðà â óêàçàííûõ êîîðäèíàòàõ, ïðè ýòîì ó÷èòûâàåòñÿ ïðîçðà÷íîñòü.
Áóôåð êîòîðûé áóäåò íàðèñîâàí äîëæåí áûòü 8 áèòíûì, à òîò â êîòîðîì ðèñóþò 24 áèòíûì.</p>
 
<h4>buf2d_cruve_bezier</h4>
<p>Ðèñóåò ïî òðåì òî÷êàì îòðåçîê êðèâîé áåçüå.</p>
 
<h4>buf2d_convert_text_matrix</h4>
<p>Ïðåîáðàçóåò ìàòðèöó ñ òåêñòîì ðàçìåðîì 16*16 â ðàçìåð 1*256. Íåîáõîäèìî äëÿ ñîçäàíèÿ ìàòðèöû äëÿ ðèñîâàíèÿ òåêñòà. Ïåðåä èñïîëüçîâàíèåì äàííîé ôóíêöèè ïðåäïîëàãàåòñÿ ÷òî åñòü èçîáðàæåíèå ñ ïîëíûì íàáîðîì ñèìâîëîâ ðàçìåðîì 16 ñòîëáöîâ íà 16 ñòðîê, èç êîòîðîãî ïðåäâàðèòåëüíî áûë ñîçäàí 8 áèòíûé áóôåð.</p>
<pre>stdcall [buf2d_create_f_img], buf_1,[image_data] ;ñîçäàåì áóôåð 24 áèò íà îñíîâå äàííûõ èçîáðàæåíèÿ
stdcall [buf2d_conv_24_to_8], buf_1,1 ;äåëàåì áóôåð ïðîçðà÷íîñòè 8 áèò
stdcall [buf2d_convert_text_matrix], buf_1</pre>
<p>ãäå buf_1 - ñòðóêòóðà áóôåðà äëÿ ôîðìèðîâàíèÿ òåêñòîâîé ìàòðèöû;
image_data - äàííûå èçîáðàæåíèÿ òåêñòîâîé ìàòðèöû â ôîðìàòå rgb, ðàçìåðîì 16*16 ñèìâîëîâ.</p>
 
<h4>buf2d_draw_text</h4>
<p>Ðèñóåò òåêñò â áóôåðå, èñïîëüçóÿ ìàòðèöó ñ òåêñòîì ðàçìåðîì 1*256 ñèìâîëîâ. Ïðèìåð:</p>
<pre>stdcall [buf2d_draw_text], buf_0, buf_1,some_text,20,10,0x4040ff ;ðèñóåì ñòðîêó ñ òåêñòîì</pre>
<p>ãäå buf_0 - ñòðóêòóðà áóôåðà â êîòîðîì áóäåò ðèñîâàòüñÿ òåêñò;
buf_1 - ñòðóêòóðà áóôåðà ñ òåêñòîâîé ìàòðèöåé â ôîðìàòå 8 áèò, ðàçìåðîì 1*256 ñèìâîëîâ;
some_text - òåêñò, êîòîðûé áóäåò âûâåäåí â áóôåð buf_0.</p>
 
<h4>buf2d_crop_color</h4>
<p>Îáðåçàíèå áóôåðà, ïî óêàçàííîìó öâåòó. Ôóíêöèÿ èñïîëüçóåòñÿ äëÿ óìåíüøåíèÿ ïàìÿòè, çàíèìàåìîé áóôåðîì. Îòðåçàþòñÿ êðàéíèå ÷àñòè áóôåðà èìåþùèå îäèíàêîâûé öâåò. Ïðèìåð:</p>
<pre>stdcall [buf2d_crop_color], buf_0,0xffffff,BUF2D_OPT_CROP_TOP+BUF2D_OPT_CROP_BOTTOM</pre>
<p>ãäå buf_0 - ñòðóêòóðà áóôåðà êîòîðûé áóäåò îáðåçàí;
0xffffff - öâåò ïî êîòîðîìó áóäåò îáðåçàòüñÿ áóôåð;
BUF2D_OPT_CROP_TOP è BUF2D_OPT_CROP_BOTTOM - êîíñòàíòû, óêàçûâàþùèå ñ êàêèõ ñòîðîí îáðåçàòü áóôåð.</p>
 
<h4>buf2d_offset_h</h4>
<p>Ñäâèã èçîáðàæåíèÿ â áóôåðå ïî âûñîòå ââåðõ èëè âíèç.</p>
 
<h1><a name="const">Êîíñòàíòû</a></h1>
<h4>BUF2D_OPT_CROP_TOP equ 1</h4>
<p>Êîíñòàíòà äëÿ ôóíêöèè buf2d_crop_color, îáîçíà÷àåò îáðåçêó áóôåðà ñâåðõó</p>
<h4>BUF2D_OPT_CROP_BOTTOM equ 4</h4>
<p>Êîíñòàíòà äëÿ ôóíêöèè buf2d_crop_color, îáîçíà÷àåò îáðåçêó áóôåðà ñíèçó</p>
<h4>BUF2D_OPT_CROP_RIGHT equ 8</h4>
<p>Êîíñòàíòà äëÿ ôóíêöèè buf2d_crop_color, îáîçíà÷àåò îáðåçêó áóôåðà ñïðàâà</p>
 
<h1><a name="tabl_e">Òàáëèöà ýêñïîðòà</a></h1>
<p>Ïðèìåð òàáëèöû ýêñïîðòà, ðàñ÷èòàííîé íà èñïîëüçîâàíèå ìàêðîñà <b>@use_library_mem</b>:</p>
<pre>align 4
import_buf2d_lib:
dd sz_lib_init
buf2d_create dd sz_buf2d_create
buf2d_create_f_img dd sz_buf2d_create_f_img
buf2d_clear dd sz_buf2d_clear
buf2d_draw dd sz_buf2d_draw
buf2d_delete dd sz_buf2d_delete
buf2d_line dd sz_buf2d_line
buf2d_circle dd sz_buf2d_circle
buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
buf2d_bit_blt dd sz_buf2d_bit_blt
buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
buf2d_cruve_bezier dd sz_buf2d_cruve_bezier
buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
buf2d_draw_text dd sz_buf2d_draw_text
buf2d_crop_color dd sz_buf2d_crop_color
buf2d_offset_h dd sz_buf2d_offset_h
 
dd 0,0
sz_lib_init db 'lib_init',0
sz_buf2d_create db 'buf2d_create',0
sz_buf2d_create_f_img db 'buf2d_create_f_img',0
sz_buf2d_clear db 'buf2d_clear',0
sz_buf2d_draw db 'buf2d_draw',0
sz_buf2d_delete db 'buf2d_delete',0
sz_buf2d_line db 'buf2d_line',0
sz_buf2d_circle db 'buf2d_circle',0
sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
sz_buf2d_bit_blt db 'buf2d_bit_blt',0
sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
sz_buf2d_cruve_bezier db 'buf2d_cruve_bezier',0
sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
sz_buf2d_draw_text db 'buf2d_draw_text',0
sz_buf2d_crop_color db 'buf2d_crop_color',0
sz_buf2d_offset_h db 'buf2d_offset_h',0</pre>
 
<h1><a name="hist">Èñòîðèÿ</a></h1>
<p>02.07.10 - ñàìàÿ ïåðâàÿ âåðñèÿ áèáëèîòåêè, 2 ïðèìåðà èñïîëüçîâàíèÿ.</p>
<p>06.07.10 - ðàñøèðåíû âîçìîæíîñòè ôóíêöèè buf2d_bit_blt, òåïåðü îíà ìîæåò ðèñîâàòü 32 áèòíûå áóôåðû. Äîáàâëåíû 2 íîâûå ôóíêöèè: buf2d_bit_blt_alpha è buf2d_cruve_bezier. Íåáîëüøèå èçìåíåíèÿ â ôóíêöèè buf2d_line.</p>
<p>16.07.10 - èñïðàâëåíî ïî 2 îøèáêè â ôóíêöèÿõ buf2d_img_hdiv2 è buf2d_img_wdiv2, êîòîðûå ìîãëè ïðîÿâëÿòüñÿ ïðè îïðåäåëåííûõ óñëîâèÿõ (åñëè ðàçìåð èçîáðàæåíèÿ áûë êðàòåí 4Êá è äð.). Äîáàâëåíû 2 ôóíêöèè äëÿ âûâîäà òåêñòà â áóôåð buf2d_convert_text_matrix è buf2d_draw_text.</p>
<p>19.07.10 - äîáàâëåíà ôóíêöèÿ ðèñîâàíèÿ îêðóæíîñòè buf2d_circle;
èçìåíåí ôîðìàò áóôåðà - äëÿ øèðèíû è âûñîòû èñïîëüçóþòñÿ 4-õ áàéòíûå ÷èñëà âìåñòî 2-õ áàéòíûõ.</p>
<p>29.07.10 - äîáàâëåíû ôóíêöèè buf2d_crop_color è buf2d_offset_h;
èñïðàâëåíèÿ â ôóíêöèè buf2d_delete.</p>
</body>
</html>
/programs/develop/libraries/buf2d/trunk/buf2d.asm
0,0 → 1,1871
format MS COFF
public EXPORTS
section '.flat' code readable align 16
 
include '../../../../macros.inc'
include '../../../../proc32.inc'
 
;-----------------------------------------------------------------------------
mem.alloc dd ? ;äã­ªæ¨ï ¤«ï ¢ë¤¥«¥­¨ï ¯ ¬ïâ¨
mem.free dd ? ;äã­ªæ¨ï ¤«ï ®á¢®¡®¦¤¥­¨ï ¯ ¬ïâ¨
mem.realloc dd ? ;äã­ªæ¨ï ¤«ï ¯¥à¥à á¯à¥¤¥«¥­¨ï ¯ ¬ïâ¨
dll.load dd ?
 
BUF_STRUCT_SIZE equ 21
buf2d_data equ dword[edi] ;¤ ­­ë¥ ¡ãä¥à  ¨§®¡à ¦¥­¨ï
buf2d_w equ dword[edi+8] ;è¨à¨­  ¡ãä¥à 
buf2d_h equ dword[edi+12] ;¢ëá®â  ¡ãä¥à 
buf2d_t equ word[edi+6] ;®âáâ㯠ᢥàåã
buf2d_size_lt equ dword[edi+4] ;®âáâ㯠᫥¢  ¨ á¯à ¢  ¤«ï ¡ãä¥à 
buf2d_color equ dword[edi+16] ;梥â ä®­  ¡ãä¥à 
buf2d_bits equ byte[edi+20] ;ª®«¨ç¥á⢮ ¡¨â ¢ 1-© â®çª¥ ¨§®¡à ¦¥­¨ï
 
struct buf_2d_header
img_data dd ?
left dw ? ;+4 left
top dw ? ;+6 top
size_x dd ? ;+8 w
size_y dd ? ;+12 h
color dd ? ;+16 color
bit_pp db ? ;+21 bit in pixel
ends
 
macro swap v1, v2 {
push v1
push v2
pop v1
pop v2
}
 
;ä« £¨, ¤«ï ä㭪樨 ®¡à¥§ ­¨ï ¡ãä¥à 
BUF2D_OPT_CROP_TOP equ 1 ;®¡à¥§ª  ᢥàåã
BUF2D_OPT_CROP_LEFT equ 2 ;®¡à¥§ª  á«¥¢ 
BUF2D_OPT_CROP_BOTTOM equ 4 ;®¡à¥§ª  á­¨§ã
BUF2D_OPT_CROP_RIGHT equ 8 ;®¡à¥§ª  á¯à ¢ 
BUF2D_BIT_OPT_CROP_TOP equ 0
BUF2D_BIT_OPT_CROP_LEFT equ 1
BUF2D_BIT_OPT_CROP_BOTTOM equ 2
BUF2D_BIT_OPT_CROP_RIGHT equ 3
 
;input:
; eax = 㪠§ â¥«ì ­  äã­ªæ¨î ¢ë¤¥«¥­¨ï ¯ ¬ïâ¨
; ebx = ... ®á¢®¡®¦¤¥­¨ï ¯ ¬ïâ¨
; ecx = ... ¯¥à¥à á¯à¥¤¥«¥­¨ï ¯ ¬ïâ¨
; edx = ... § £à㧪¨ ¡¨¡«¨®â¥ª¨ (¯®ª  ­¥ ¨á¯®«ì§ã¥âáï)
align 16
lib_init:
mov dword[mem.alloc], eax
mov dword[mem.free], ebx
mov dword[mem.realloc], ecx
mov dword[dll.load], edx
ret
 
;input:
; ebx = coord x
; ecx = coord y
; edx = pixel color
; edi = pointer to buffer struct
align 4
draw_pixel:
;cmp buf2d_bits,24
;jne @f
bt ebx,31
jc @f
bt ecx,31
jc @f
cmp ebx,buf2d_w
jge @f
cmp ecx,buf2d_h
jge @f
push esi
mov esi,buf2d_w ;size x
imul esi,ecx ;size_x*y
add esi,ebx ;size_x*y+x
lea esi,[esi+esi*2] ;(size_x*y+x)*3
add esi,buf2d_data ;ptr+(size_x*y+x)*3
mov word[esi],dx ;copy pixel color
ror edx,16
mov byte[esi+2],dl
ror edx,16
pop esi
@@:
ret
;endp
 
;ᮧ¤ ­¨¥ ¡ãä¥à 
align 4
proc buf_create, buf_struc:dword
pushad
mov edi,dword[buf_struc]
mov ecx,buf2d_w
mov ebx,buf2d_h
imul ecx,ebx
cmp buf2d_bits,24
jne @f
lea ecx,[ecx+ecx*2] ; 24 bit = 3
;;;inc ecx ;§ ¯ á­®© ¡ ©â ¢ ª®­æ¥ ¡ãä¥à , çâ®-¡ë ­¥ £«î稫¨ ­¥ª®â®àë¥ ä㭪樨 ­  ¨§®¡à ¦¥­¨ïå ªà â­ëå 4Š
@@:
cmp buf2d_bits,32
jne @f
shl ecx,2 ; 32 bit = 4
@@:
invoke mem.alloc,ecx
mov buf2d_data,eax
 
stdcall buf_clear,edi,buf2d_color ;®ç¨á⪠ ¡ãä¥à  ä®­®¢ë¬ 梥⮬
popad
ret
endp
 
;ᮧ¤ ­¨¥ ¡ãä¥à  ­  ®á­®¢¥ ¨§®¡à ¦¥­¨ï rgb
align 4
proc buf_create_f_img, buf_struc:dword, rgb_data:dword
pushad
mov edi,dword[buf_struc]
mov ecx,buf2d_w
mov ebx,buf2d_h
imul ecx,ebx
cmp buf2d_bits,24
jne @f
lea ecx,[ecx+ecx*2] ; 24 bit = 3
;;;inc ecx ;§ ¯ á­®© ¡ ©â ¢ ª®­æ¥ ¡ãä¥à , çâ®-¡ë ­¥ £«î稫¨ ­¥ª®â®àë¥ ä㭪樨 ­  ¨§®¡à ¦¥­¨ïå ªà â­ëå 4Š
@@:
cmp buf2d_bits,32
jne @f
shl ecx,2 ; 32 bit = 4
@@:
invoke mem.alloc,ecx
mov buf2d_data,eax
 
cmp buf2d_bits,24
jne @f
cld
mov esi,[rgb_data]
mov edi,eax ;eax=buf2d_data
rep movsb ;ª®¯¨à㥬 ¡¨âë ¨§®¡à ¦¥­¨ï ¢ ¡ãä¥à
jmp .end_create
@@:
stdcall buf_clear,edi,buf2d_color ;®ç¨á⪠ ¡ãä¥à  ä®­®¢ë¬ 梥⮬
.end_create:
popad
ret
endp
 
align 4
proc buf_clear, buf_struc:dword, color:dword ;®ç¨á⪠ ¡ãä¥à  § ¤ ­ë¬ 梥⮬
pushad
mov edi,dword[buf_struc]
 
mov ecx,buf2d_w
mov ebx,buf2d_h
imul ecx,ebx
 
cld
 
cmp buf2d_bits,8
jne .end_clear_8
mov edi,buf2d_data
mov al,byte[color]
rep stosb
jmp .end_clear_32
.end_clear_8:
 
cmp buf2d_bits,24
jne .end_clear_24
mov edi,buf2d_data
mov eax,dword[color]
mov ebx,eax
shr ebx,16
@@:
stosw
mov byte[edi],bl
inc edi
loop @b
jmp .end_clear_32
.end_clear_24:
 
cmp buf2d_bits,32
jne .end_clear_32
mov edi,buf2d_data
mov eax,dword[color]
rep stosd
;jmp .end_clear_32
.end_clear_32:
popad
ret
endp
 
align 4
proc buf_crop_color, buf_struc:dword, color:dword, opt:dword ;®¡à¥§ª  ¡ãä¥à  ¯® § ¤ ­®¬ã 梥⮬ 梥âã
locals
crop_r dd ?
endl
pushad
mov edi,dword[buf_struc]
cmp buf2d_bits,24
jne .24end_f
 
bt dword[opt],BUF2D_BIT_OPT_CROP_BOTTOM
jae .24no_crop_bottom
mov eax,dword[color]
mov edx,eax ;ax = colors - r,g
shr edx,16 ;dl = color - b
mov ecx,buf2d_h
mov ebx,buf2d_w
imul ecx,ebx
lea esi,[ecx+ecx*2] ;esi=3*ecx
add esi,buf2d_data
cld
@@:
sub esi,3
cmp word[esi],ax
jne @f
cmp byte[esi+2],dl
jne @f
loop @b
@@:
lea ebx,[ebx+ebx*2]
xor edx,edx
mov eax,buf2d_h
imul eax,ebx
add eax,buf2d_data ;eax - 㪠§ â¥«ì ­  ª®­¥æ ¡ãä¥à  ¨§®¡à ¦¥­¨ï
@@:
add esi,ebx
cmp esi,eax
jge @f
inc edx ;¢ëç¨á«ï¥¬ ç¨á«® ¯®«­ëå áâப ¤«ï ®¡à¥§ ­¨ï
loop @b
@@:
cmp edx,0
je .24no_crop_bottom
cmp edx,buf2d_h
jge .24no_crop_bottom ;çâ®-¡ë ­¥ ¯®«ãç¨âì ¯ãá⮩ ¡ãä¥à
sub buf2d_h,edx ;㬥­ìè ¥¬ ¢ëá®âã ¡ãä¥à 
mov ecx,buf2d_h
imul ecx,ebx ;ecx = ­®¢ë© à §¬¥à ¨§®¡à ¦¥­¨ï
invoke mem.realloc,buf2d_data,ecx
mov buf2d_data,eax ;­  á«ãç © ¥á«¨ ¨§¬¥­¨«áï 㪠§ â¥«ì ­  ¤ ­­ë¥
.24no_crop_bottom:
 
bt dword[opt],BUF2D_BIT_OPT_CROP_TOP
jae .24no_crop_top
mov eax,dword[color]
mov edx,eax ;ax = colors - r,g
shr edx,16 ;dl = color - b
mov esi,buf2d_data
mov ecx,buf2d_h
dec ecx ;¯à¨ ®¡à¥§ ­¨¨ ¤®«¦­  ®áâ âìáï ¬¨­¨¬ã¬ 1-­  áâப  ¯¨ªá¥«¥©
mov ebx,buf2d_w
imul ecx,ebx
cld
@@:
cmp word[esi],ax
jne @f
cmp byte[esi+2],dl
jne @f
add esi,3
loop @b
@@:
lea ebx,[ebx+ebx*2]
xor edx,edx
@@:
sub esi,ebx
cmp esi,buf2d_data
jl @f
inc edx ;¢ëç¨á«ï¥¬ ç¨á«® ¯®«­ëå áâப ¤«ï ®¡à¥§ ­¨ï
loop @b
@@:
cmp edx,0
je .24no_crop_top
xor eax,eax
sub eax,edx
mov ebx,buf2d_h
sub ebx,edx
stdcall buf_offset_h, edi, eax, edx, ebx ;ᤢ¨£ ¥¬ ¨§®¡à ¦¥­¨¥ ¢ ¡ãä¥à¥ ¢¢¥àå (eax<0)
sub buf2d_h,edx ;㬥­ìè ¥¬ ¢ëá®âã ¡ãä¥à 
mov ecx,buf2d_h
add buf2d_t,dx ;ᤢ¨£ ¥¬ ®âáâ㯠¢­¨§, ­  ç¨á«® ®¡à¥§ ­­ëå áâப
mov ebx,buf2d_w
imul ecx,ebx
lea ecx,[ecx+ecx*2]
invoke mem.realloc,buf2d_data,ecx
mov buf2d_data,eax ;­  á«ãç © ¥á«¨ ¨§¬¥­¨«áï 㪠§ â¥«ì ­  ¤ ­­ë¥
.24no_crop_top:
 
bt dword[opt],BUF2D_BIT_OPT_CROP_RIGHT
jae .24no_crop_right
mov eax,dword[color]
mov edx,eax ;ax = colors - r,g
shr edx,16 ;dl = color - b
mov ebx,buf2d_w
lea ebx,[ebx+ebx*2]
mov esi,ebx
imul esi,buf2d_h
add esi,buf2d_data ;esi - 㪠§ â¥«ì ­  ª®­¥æ ¡ãä¥à  ¨§®¡à ¦¥­¨ï
mov dword[crop_r],0
cld
.found_beg:
sub esi,3 ;¤¢¨£ ¥¬áï ­  1-­ã ª®«®­ªã ¢«¥¢®
mov ecx,buf2d_h ;¢®ááâ ­®¢«¥­¨¥ ecx ¤«ï ­®¢®£® 横« 
@@:
cmp word[esi],ax
jne .found
cmp byte[esi+2],dl
jne .found
sub esi,ebx ;¯à룠¥¬ ­  ¢¥àå­îî áâபã
loop @b
inc dword[crop_r]
 
mov ecx,buf2d_w
dec ecx ;1 ª®«®­ª  ­  § ¯ á
cmp dword[crop_r],ecx
jge .found
 
sub esi,3 ;¤¢¨£ ¥¬áï ­  1-­ã ª®«®­ªã ¢«¥¢®
mov ecx,buf2d_h ;¢®ááâ ­®¢«¥­¨¥ ecx ¤«ï ­®¢®£® 横« 
@@:
add esi,ebx ;¯à룠¥¬ ­  ­¨¦­îî áâபã
cmp word[esi],ax
jne .found
cmp byte[esi+2],dl
jne .found
loop @b
inc dword[crop_r]
 
mov ecx,buf2d_w
dec ecx ;1 ª®«®­ª  ­  § ¯ á
cmp dword[crop_r],ecx
jl .found_beg
 
.found:
cmp dword[crop_r],0
je .24no_crop_right
mov ecx,buf2d_w
sub ecx,dword[crop_r]
stdcall img_rgb_wcrop, buf2d_data, buf2d_w, ecx, buf2d_h ;®¡à¥§ ¥¬ ¡ãä¥à, ¯® ­®¢®¬ã à §¬¥àã
mov buf2d_w,ecx ;áâ ¢¨¬ ­®¢ãî è¨à¨­ã ¤«ï ¡ãä¥à 
mov ebx,buf2d_h
imul ecx,ebx
lea ecx,[ecx+ecx*2]
invoke mem.realloc,buf2d_data,ecx
mov buf2d_data,eax ;­  á«ãç © ¥á«¨ ¨§¬¥­¨«áï 㪠§ â¥«ì ­  ¤ ­­ë¥
.24no_crop_right:
 
.24end_f:
 
 
cmp buf2d_bits,8
jne .8end_f
 
bt dword[opt],BUF2D_BIT_OPT_CROP_BOTTOM
jae .8no_crop_bottom
mov eax,dword[color]
mov esi,buf2d_data
mov ecx,buf2d_h
mov ebx,buf2d_w
imul ecx,ebx
mov esi,ecx
add esi,buf2d_data
cld
@@:
dec esi
cmp byte[esi],al
jne @f
loop @b
@@:
xor edx,edx
mov eax,buf2d_h
imul eax,ebx
add eax,buf2d_data ;eax - 㪠§ â¥«ì ­  ª®­¥æ ¡ãä¥à  ¨§®¡à ¦¥­¨ï
@@:
add esi,ebx
cmp esi,eax
jge @f
inc edx
loop @b
@@:
cmp edx,0
je .8no_crop_bottom
cmp edx,buf2d_h
jge .8no_crop_bottom ;çâ®-¡ë ­¥ ¯®«ãç¨âì ¯ãá⮩ ¡ãä¥à
sub buf2d_h,edx ;㬥­ìè ¥¬ ¢ëá®âã ¡ãä¥à 
mov ecx,buf2d_h
imul ecx,ebx ;ecx = ­®¢ë© à §¬¥à ¨§®¡à ¦¥­¨ï
invoke mem.realloc,buf2d_data,ecx
mov buf2d_data,eax ;­  á«ãç © ¥á«¨ ¨§¬¥­¨«áï 㪠§ â¥«ì ­  ¤ ­­ë¥
.8no_crop_bottom:
 
bt dword[opt],BUF2D_BIT_OPT_CROP_TOP
jae .8no_crop_top
mov eax,dword[color]
mov esi,buf2d_data
mov ecx,buf2d_h
dec ecx ;¯à¨ ®¡à¥§ ­¨¨ ¤®«¦­  ®áâ âìáï ¬¨­¨¬ã¬ 1-­  áâப  ¯¨ªá¥«¥©
mov ebx,buf2d_w
imul ecx,ebx
cld
@@:
cmp byte[esi],al
jne @f
inc esi
loop @b
@@:
xor edx,edx
@@:
sub esi,ebx
cmp esi,buf2d_data
jl @f
inc edx
loop @b
@@:
cmp edx,0
je .8no_crop_top
xor eax,eax
sub eax,edx
mov ebx,buf2d_h
sub ebx,edx
stdcall buf_offset_h, edi, eax, edx, ebx
mov ecx,buf2d_h
sub ecx,edx
mov buf2d_h,ecx ;㬥­ìè ¥¬ ¢ëá®âã ¡ãä¥à 
add buf2d_t,dx ;ᤢ¨£ ¥¬ ®âáâ㯠¢­¨§, ­  ç¨á«® ®¡à¥§ ­­ëå áâப
mov ebx,buf2d_w
imul ecx,ebx
invoke mem.realloc,buf2d_data,ecx
mov buf2d_data,eax ;­  á«ãç © ¥á«¨ ¨§¬¥­¨«áï 㪠§ â¥«ì ­  ¤ ­­ë¥
.8no_crop_top:
 
bt dword[opt],BUF2D_BIT_OPT_CROP_RIGHT
jae .8no_crop_right
mov eax,dword[color]
mov ebx,buf2d_w
mov esi,ebx
imul esi,buf2d_h
add esi,buf2d_data ;esi - 㪠§ â¥«ì ­  ª®­¥æ ¡ãä¥à  ¨§®¡à ¦¥­¨ï
xor edx,edx
cld
 
.8found_beg:
dec esi ;¤¢¨£ ¥¬áï ­  1-­ã ª®«®­ªã ¢«¥¢®
mov ecx,buf2d_h ;¢®ááâ ­®¢«¥­¨¥ ecx ¤«ï ­®¢®£® 横« 
@@:
cmp byte[esi],al
jne .8found
sub esi,ebx ;¯à룠¥¬ ­  ¢¥àå­îî áâபã
loop @b
inc edx
mov ecx,buf2d_w
dec ecx ;1 ª®«®­ª  ­  § ¯ á
cmp edx,ecx
jge .8found
 
dec esi ;¤¢¨£ ¥¬áï ­  1-­ã ª®«®­ªã ¢«¥¢®
mov ecx,buf2d_h ;¢®ááâ ­®¢«¥­¨¥ ecx ¤«ï ­®¢®£® 横« 
@@:
add esi,ebx ;¯à룠¥¬ ­  ­¨¦­îî áâபã
cmp byte[esi],al
jne .8found
loop @b
inc edx
 
mov ecx,buf2d_w
dec ecx ;1 ª®«®­ª  ­  § ¯ á
cmp edx,ecx
jl .8found_beg
 
.8found:
cmp edx,0
je .8no_crop_right
mov ecx,buf2d_w
sub ecx,edx
stdcall img_gray_wcrop, buf2d_data, buf2d_w, ecx, buf2d_h ;®¡à¥§ ¥¬ ¡ãä¥à, ¯® ­®¢®¬ã à §¬¥àã
mov buf2d_w,ecx ;áâ ¢¨¬ ­®¢ãî è¨à¨­ã ¤«ï ¡ãä¥à 
mov ebx,buf2d_h
imul ecx,ebx
invoke mem.realloc,buf2d_data,ecx
mov buf2d_data,eax ;­  á«ãç © ¥á«¨ ¨§¬¥­¨«áï 㪠§ â¥«ì ­  ¤ ­­ë¥
.8no_crop_right:
 
.8end_f:
 
popad
ret
endp
 
;input:
;data_rgb - pointer to rgb data
;size_w_old - width img in pixels
;size_w_new - new width img in pixels
;size_h - height img in pixels
align 4
proc img_rgb_wcrop, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:dword
pushad
mov eax, dword[size_w_old]
lea eax, dword[eax+eax*2] ;eax = width(old) * 3(rgb)
mov ebx, dword[size_w_new]
lea ebx, dword[ebx+ebx*2] ;ebx = width(new) * 3(rgb)
mov edx, dword[size_h]
mov edi, dword[data_rgb] ;edi - ¯®«ã砥⠤ ­­ë¥
mov esi, edi
add edi, ebx
add esi, eax
cld
@@:
dec edx ;㬥­ìè ¥¬ áç¥â稪 ®áâ ¢è¨åáï áâப ­  1
cmp edx,0
jle @f
mov ecx, ebx
rep movsb ;¯¥à¥­®á (ª®¯¨à®¢ ­¨¥) áâப¨ ¯¨ªá¥«¥©
add esi,eax ;¯¥à¥å®¤ ­  ­®¢ãî áâà®çªã ¨§®¡à ¦¥­¨ï
sub esi,ebx
jmp @b
@@:
popad
ret
endp
 
;input:
;data_gray - pointer to gray data
;size_w_old - width img in pixels
;size_w_new - new width img in pixels
;size_h - height img in pixels
align 4
proc img_gray_wcrop, data_gray:dword, size_w_old:dword, size_w_new:dword, size_h:dword
pushad
mov eax, dword[size_w_old]
mov ebx, dword[size_w_new]
mov edx, dword[size_h]
mov edi, dword[data_gray] ;edi - ¯®«ã砥⠤ ­­ë¥
mov esi, edi
add edi, ebx
add esi, eax
cld
@@:
dec edx ;㬥­ìè ¥¬ áç¥â稪 ®áâ ¢è¨åáï áâப ­  1
cmp edx,0
jle @f
mov ecx, ebx
rep movsb ;¯¥à¥­®á (ª®¯¨à®¢ ­¨¥) áâப¨ ¯¨ªá¥«¥©
add esi,eax ;¯¥à¥å®¤ ­  ­®¢ãî áâà®çªã ¨§®¡à ¦¥­¨ï
sub esi,ebx
jmp @b
@@:
popad
ret
endp
 
;hoffs - ª®««¨ç¥á⢮ ¯¨ªá¥«¥© ­  ª®âàë¥ ¯®¤­¨¬ ¥âáï/®¯ã᪠¥âáï ¨§®¡à ¦¥­¨¥
;img_t - ¢ëá®â , á ª®â®à®© ­ ç¨­ ¥âáï ¤¢¨£ îé ïáï ç áâì ¨§®¡à ¦¥­¨ï
align 4
proc buf_offset_h, buf_struc:dword, hoffs:dword, img_t:dword, img_h:dword ;ᤢ¨£ ¥â ¨§®¡à ¦¥­¨¥ ¯® ¢ëá®â¥
pushad
mov edi,dword[buf_struc]
cmp buf2d_bits,24
jne .end_move_24
 
mov eax,[hoffs]
cmp eax,0
je .end_move_24
mov ebx,buf2d_w
mov edx,dword[img_t]
mov ecx,dword[img_h] ;ecx - ¢ëá®â  ᤢ¨£ ¥¬ëå ¤ ­­ëå
cmp ecx,buf2d_h
jge .end_f ;®è¨¡®ç­®¥ ãá«®¢¨¥, ¢ëá®â  ¨§®¡à ¦¥­¨ï ¬¥­ìè¥ ç¥¬ ¢ëá®â  ᤢ¨£ ¥¬®£® ¨§®¡à ¦¥­¨ï
imul ecx,ebx ;ecx - ª®««¨ç¥á⢮ ¯¨ªá¥«¥© ¢ ᤢ¨£ ¥¬ëå ¤ ­­ëå
lea ecx,[ecx+ecx*2]
imul ebx,edx
lea ebx,[ebx+ebx*2]
mov esi,buf2d_data
add esi,ebx
 
add edx,eax ;edx = img_t+hoffs (hoffs<0)
mov ebx,buf2d_w
imul ebx,edx
lea ebx,[ebx+ebx*2]
mov edi,buf2d_data ;¯®§¨æ¨ï, ªã¤  ¡ã¤¥â ¤¢¨£ âìáï ¨§®¡à ¦¥­¨¥
add edi,ebx
 
cmp eax,0
jg .move_down_24
;¤¢¨£ ¥¬ ¨§®¡à ¦¥­¨¥ ¢¢¥àå
cld
rep movsb
jmp .end_f
.move_down_24:
;¤¢¨£ ¥¬ ¨§®¡à ¦¥­¨¥ ¢­¨§
add esi,ecx
dec esi
add edi,ecx
dec edi
std
rep movsb
jmp .end_f
.end_move_24:
 
;stdcall print_err,sz_buf2d_offset_h,txt_err_n24b
 
cmp buf2d_bits,8
jne .end_move_8
 
mov eax,[hoffs]
cmp eax,0
je .end_move_8
;¤¢¨£ ¥¬ ¨§®¡à ¦¥­¨¥ ¢¢¥àå
mov ebx,buf2d_w
mov edx,dword[img_t]
mov ecx,dword[img_h] ;ecx - ¢ëá®â  ᤢ¨£ ¥¬ëå ¤ ­­ëå
cmp ecx,buf2d_h
jge .end_f ;®è¨¡®ç­®¥ ãá«®¢¨¥, ¢ëá®â  ¨§®¡à ¦¥­¨ï ¬¥­ìè¥ ç¥¬ ¢ëá®â  ᤢ¨£ ¥¬®£® ¨§®¡à ¦¥­¨ï
imul ecx,ebx ;ecx - ª®««¨ç¥á⢮ ¯¨ªá¥«¥© ¢ ᤢ¨£ ¥¬ëå ¤ ­­ëå
imul ebx,edx
mov esi,buf2d_data
add esi,ebx
 
add edx,eax ;edx = img_t+hoffs (hoffs<0)
mov ebx,buf2d_w
imul ebx,edx
mov edi,buf2d_data ;¯®§¨æ¨ï, ªã¤  ¡ã¤¥â ¤¢¨£ âìáï ¨§®¡à ¦¥­¨¥
add edi,ebx
 
cmp eax,0
jg .move_down_8
cld
rep movsb
jmp .end_f
.move_down_8:
;¤¢¨£ ¥¬ ¨§®¡à ¦¥­¨¥ ¢­¨§
add esi,ecx
dec esi
add edi,ecx
dec edi
std
rep movsb
jmp .end_f
.end_move_8:
 
.end_f:
popad
ret
endp
 
 
align 4
proc buf_draw_buf, buf_struc:dword
pushad
mov edi,dword[buf_struc]
cmp buf2d_bits,24
jne .error
mov eax,7
mov ebx,buf2d_data
 
mov ecx,buf2d_w
ror ecx,16
mov edx,buf2d_h
mov cx,dx
 
mov edx,buf2d_size_lt
ror edx,16
int 0x40
jmp .end_draw_24
.error:
stdcall print_err,sz_buf2d_draw,txt_err_n24b
.end_draw_24:
popad
ret
endp
 
align 4
proc buf_delete, buf_struc:dword
push edi
mov edi,dword[buf_struc]
invoke mem.free,buf2d_data
pop edi
ret
endp
 
align 4
proc buf_line_brs, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, coord_y1:dword, color:dword
locals
loc_1 dd ?
loc_2 dd ?
napravl db ?
endl
pushad
mov edx,dword[color]
 
mov eax,dword[coord_x1]
sub eax,dword[coord_x0]
bt eax,31
jae @f
neg eax
inc eax
@@:
mov ebx,dword[coord_y1]
sub ebx,dword[coord_y0]
bt ebx,31
jae @f
neg ebx
inc ebx
@@:
 
mov [napravl],byte 0 ;bool steep=false
cmp eax,ebx
jle @f
mov [napravl],byte 1 ;bool steep=true
swap dword[coord_x0],dword[coord_y0] ;swap(x0, y0);
swap dword[coord_x1],dword[coord_y1] ;swap(x1, y1);
@@:
mov eax,dword[coord_y0] ;x0
cmp eax,dword[coord_y1] ;if(x0>x1)
jle @f
swap dword[coord_y0],dword[coord_y1] ;swap(x0, x1);
swap dword[coord_x0],dword[coord_x1] ;swap(y0, y1);
@@:
 
; int deltax esi
; int deltay edi
; int error ebp-6
; int ystep ebp-8
 
mov eax,dword[coord_y0]
mov esi,dword[coord_y1]
sub esi,eax ;deltax = y1-y0
mov ebx,esi
shr ebx,1
mov [loc_1],ebx ;error = deltax/2
 
mov eax,dword[coord_x0]
mov edi,dword[coord_x1]
mov [loc_2],dword -1 ;ystep = -1
cmp eax,edi ;if (x0<x1) ystep = 1;
jge @f
mov [loc_2],dword 1 ;ystep = 1
@@:
sub edi,eax ;x1-x0
 
bts edi,31
jae @f
neg edi
inc edi
@@:
and edi,0x7fffffff ;deltay = abs(x1-x0)
 
mov eax,edi
mov edi,[buf_struc]
cmp buf2d_bits,24
jne .coord_end
 
cmp [napravl],0
jne .coord_yx
mov ebx,dword[coord_x0]
mov ecx,dword[coord_y0]
 
@@: ;for (x=x0 ; x<x1; x++) ;------------------------------------
cmp ecx,dword[coord_y1]
jg @f ;jge ???
call draw_pixel
 
sub dword[loc_1],eax ;error -= deltay
cmp dword[loc_1],0 ;if(error<0)
jge .if0
add ebx,[loc_2] ;y += ystep
add [loc_1],esi ;error += deltax
.if0:
inc ecx
jmp @b
@@:
jmp .coord_end
.coord_yx:
mov ebx,dword[coord_y0]
mov ecx,dword[coord_x0]
 
@@: ;for (x=x0 ; x<x1; x++) ;------------------------------------
cmp ebx,dword[coord_y1]
jg @f ;jge ???
call draw_pixel
 
sub dword[loc_1],eax ;error -= deltay
cmp dword[loc_1],0 ;if(error<0)
jge .if1
add ecx,[loc_2] ;y += ystep
add [loc_1],esi ;error += deltax
.if1:
inc ebx
jmp @b
@@:
.coord_end:
popad
ret
endp
 
align 4
proc buf_circle, buf_struc:dword, coord_x:dword, coord_y:dword, r:dword, color:dword
locals
po_x dd ?
po_y dd ?
endl
pushad
mov edi,dword[buf_struc]
cmp buf2d_bits,24
jne .error
mov edx,dword[color]
 
finit
fild dword[coord_x]
fild dword[coord_y]
fild dword[r]
fldz ;px=0
fld st1 ;py=r
 
fldpi
fmul st0,st3
fistp dword[po_x]
mov esi,dword[po_x] ;esi=pi*r
shl esi,1 ;esi=2*pi*r
 
;st0 = py
;st1 = px
;st2 = r
;st3 = y
;st4 = x
 
@@:
;Point(px + x, y - py)
fld st1 ;st0=px
fadd st0,st5 ;st0=px+x
fistp dword[po_x]
mov ebx,dword[po_x]
fld st3 ;st0=y
fsub st0,st1 ;st0=y-py
fistp dword[po_y]
mov ecx,dword[po_y]
call draw_pixel
;px += py/r
fld st0 ;st0=py
fdiv st0,st3 ;st0=py/r
faddp st2,st0 ;st3+=st0
;py -= px/r
fld st1 ;st0=px
fdiv st0,st3 ;st0=px/r
fsubp st1,st0 ;st2-=st0
 
dec esi
cmp esi,0
jge @b
jmp .exit_fun
.error:
stdcall print_err,sz_buf2d_circle,txt_err_n24b
.exit_fun:
 
popad
ret
endp
 
align 4
proc buf_img_wdiv2, buf_struc:dword
pushad
mov edi,dword[buf_struc]
cmp buf2d_bits,24
jne .end_draw_24
mov eax,buf2d_w
mov ecx,buf2d_h
imul ecx,eax
stdcall img_rgb24_wdiv2, buf2d_data,ecx
.end_draw_24:
popad
ret
endp
 
;input:
;data_rgb - pointer to rgb data
;size - count img pixels (size img data / 3(rgb) )
align 4
proc img_rgb24_wdiv2 data_rgb:dword, size:dword
;push eax ebx ecx edx
mov eax,dword[data_rgb]
mov ecx,dword[size] ;ecx = size
lea ecx,[ecx+ecx*2]
cld
@@: ;§ â¥¬­¥­¨¥ æ¢¥â  ¯¨ªá¥«¥©
shr byte[eax],1
inc eax
loop @b
 
mov eax,dword[data_rgb]
mov ecx,dword[size] ;ecx = size
shr ecx,1
@@: ;á«®¦¥­¨¥ 梥⮢ ¯¨ªá¥«¥©
mov bx,word[eax+3] ;ª®¯¨à㥬 梥â á®á¥¤­¥£® ¯¨ªá¥«ï
add word[eax],bx
mov bl,byte[eax+5] ;ª®¯¨à㥬 梥â á®á¥¤­¥£® ¯¨ªá¥«ï
add byte[eax+2],bl
add eax,6 ;=2*3
loop @b
 
mov eax,dword[data_rgb]
add eax,3
mov ebx,eax
add ebx,3
mov ecx,dword[size] ;ecx = size
shr ecx,1
dec ecx ;«¨è­¨© ¯¨ªá¥«ì
@@: ;¯®¤¦ â¨¥ ¯¨ªá¥«¥©
mov edx,dword[ebx]
mov word[eax],dx
shr edx,16
mov byte[eax+2],dl
 
add eax,3
add ebx,6
loop @b
;pop edx ecx ebx eax
ret
endp
 
align 4
proc buf_img_hdiv2, buf_struc:dword
pushad
mov edi,dword[buf_struc]
cmp buf2d_bits,24
jne .end_draw_24
mov eax,buf2d_w
mov ecx,buf2d_h
imul ecx,eax
stdcall img_rgb24_hdiv2, buf2d_data,ecx,eax
.end_draw_24:
popad
ret
endp
 
;input:
;data_rgb - pointer to rgb data
;size - count img pixels (size img data / 3(rgb) )
;size_w - width img in pixels
align 4
proc img_rgb24_hdiv2, data_rgb:dword, size:dword, size_w:dword
;pushad
 
mov eax,dword[data_rgb] ;eax =
mov ecx,dword[size] ;ecx = size
lea ecx,[ecx+ecx*2]
cld
@@: ;§ â¥¬­¥­¨¥ æ¢¥â  ¯¨ªá¥«¥©
shr byte[eax],1
inc eax
loop @b
 
mov eax,dword[data_rgb] ;eax =
mov edi,dword[size_w]
lea esi,[edi+edi*2] ;esi = width*3(rgb)
mov ebx,esi
add ebx,eax
mov ecx,dword[size] ;ecx = size
shr ecx,1
xor edi,edi
@@: ;á«®¦¥­¨¥ 梥⮢ ¯¨ªá¥«¥©
mov dx,word[ebx] ;ª®¯¨à㥬 梥⠭¨¦­¥£® ¯¨ªá¥«ï
add word[eax],dx
mov dl,byte[ebx+2] ;ª®¯¨à㥬 梥⠭¨¦­¥£® ¯¨ªá¥«ï
add byte[eax+2],dl
 
add eax,3
add ebx,3
inc edi
cmp edi,dword[size_w]
jl .old_line
add eax,esi
add ebx,esi
xor edi,edi
.old_line:
loop @b
 
 
mov eax,dword[data_rgb] ;eax =
add eax,esi ;esi = width*3(rgb)
mov ebx,esi
add ebx,eax
mov ecx,dword[size] ;ecx = size
shr ecx,1
sub ecx,dword[size_w] ;«¨è­ïï áâப  ¯¨ªá¥«¥©
xor edi,edi
@@: ;¯®¤¦ â¨¥ ¯¨ªá¥«¥©
mov edx,dword[ebx] ;ª®¯¨à㥬 梥⠭¨¦­¥£® ¯¨ªá¥«ï
mov word[eax],dx
shr edx,16
mov byte[eax+2],dl
 
add eax,3
add ebx,3
inc edi
cmp edi,dword[size_w]
jl .old_line_2
add ebx,esi
xor edi,edi
.old_line_2:
loop @b
 
;popad
ret
endp
 
;¯à¥®¡à §®¢ ­¨¥ ¡ãä¥à  ¨§ 24-¡¨â­®£® ¢ 8-¡¨â­ë©
; spectr - ®¯à¥¤¥«ï¥â ª ª®© ᯥªâà ¡à âì ¯à¨ ¯à¥®¡à §®¢ ­¨¨ 0-ᨭ¨©, 1-§¥«¥­ë©, 2-ªà á­ë©
align 4
proc buf_conv_24_to_8, buf_struc:dword, spectr:dword
pushad
mov edi,dword[buf_struc]
cmp buf2d_bits,24
jne .error
mov eax,buf2d_w
mov ecx,buf2d_h
imul ecx,eax
mov esi,ecx
;ebx - ¯ ¬ïâì ¨§ ª®â®à®© ª®¯¨àã¥âáï
;edx - ¯ ¬ïâì ªã¤  ª®¯¨àã¥âáï
mov edx,buf2d_data
mov ebx,edx
cmp [spectr],3
jge @f
add ebx,[spectr]
@@:
mov al,byte[ebx]
mov byte[edx],al
add ebx,3
inc edx
loop @b
mov buf2d_bits,8
invoke mem.realloc,buf2d_data,esi ;㬥­ìè ¥¬ ¯ ¬ïâì § ­¨¬ ¥¬ãî ¡ãä¥à®¬
jmp .end_conv
.error:
stdcall print_err,sz_buf2d_conv_24_to_8,txt_err_n24b
.end_conv:
popad
ret
endp
 
;¯à¥®¡à §®¢ ­¨¥ ¡ãä¥à  ¨§ 24-¡¨â­®£® ¢ 32-¡¨â­ë©
align 4
proc buf_conv_24_to_32, buf_struc:dword, buf_str8:dword
pushad
mov edi,dword[buf_struc]
cmp buf2d_bits,24
jne .error1
mov ecx,buf2d_w
mov ebx,buf2d_h
imul ebx,ecx
mov ecx,ebx ;ecx = size 8 b
shl ebx,2 ;ebx = size 32 b
invoke mem.realloc,buf2d_data,ebx ;㢥«¨ç¨¢ ¥¬ ¯ ¬ïâì § ­¨¬ ¥¬ãî ¡ãä¥à®¬
mov buf2d_data,eax ;­  á«ãç © ¥á«¨ ¨§¬¥­¨«áï 㪠§ â¥«ì ­  ¤ ­­ë¥
mov buf2d_bits,32
mov edx,ebx ;edx = size 32 b
sub ebx,ecx ;ebx = size 24 b
mov eax,ecx
;eax - à §¬¥à 8 ¡¨â­ëå ¤ ­­ëå
;ebx - à §¬¥à 24 ¡¨â­ëå ¤ ­­ëå
;edx - à §¬¥à 32 ¡¨â­ëå ¤ ­­ëå
add ebx,buf2d_data
add edx,buf2d_data
mov edi,dword[buf_str8]
cmp buf2d_bits,8
jne .error2
add eax,buf2d_data
mov edi,edx
;eax - 㪠§ â¥«ì ­  ª®­¥æ 8 ¡¨â­ëå ¤ ­­ëå
;ebx - 㪠§ â¥«ì ­  ª®­¥æ 24 ¡¨â­ëå ¤ ­­ëå
;edi - 㪠§ â¥«ì ­  ª®­¥æ 32 ¡¨â­ëå ¤ ­­ëå
@@:
sub edi,4 ;®â­¨¬ ¥¬ ¢ ­ ç «¥ 横« ,
sub ebx,3 ; ¯®â®¬ã, ç⮠㪠§ â¥«¨ áâ®ïâ
dec eax ; §  ¯à¥¤¥« ¬¨ ¡ãä¥à®¢
mov edx,dword[ebx]
mov dword[edi],edx
mov dl,byte[eax]
mov byte[edi+3],dl
loop @b
 
jmp .end_conv
.error1:
stdcall print_err,sz_buf2d_conv_24_to_32,txt_err_n24b
jmp .end_conv
.error2:
stdcall print_err,sz_buf2d_conv_24_to_32,txt_err_n8b
.end_conv:
popad
ret
endp
 
;äã­ªæ¨ï ª®¯¨àã¥â ¨§®¡à ¦¥­¨¥ ¨§ ¡ãä¥à  buf_source (24b|32b) ¢ buf_destination (24b)
; 㪠§ë¢ îâáï ª®®à¤¨­ âë ¢áâ ¢ª¨ ¡ãä¥à  buf_source ®â­®á¨â¥«ì­® buf_destination
; ¯à®§à ç­®áâì ¯à¨ ª®¯¨à®¢ ­¨¨ ­¥ ãç¨â뢠¥âáï
align 4
proc buf_bit_blt, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword
locals
right_bytes dd ?
endl
pushad
 
mov edi,[buf_source]
cmp buf2d_bits,24
je .sou24
cmp buf2d_bits,32
je .sou32
jmp .copy_end ;ä®à¬ â ¡ãä¥à  ­¥ ¯®®¤¥à¦¨¢ ¥âáï
 
.sou24: ;¢ ¨áâ®ç­¨ª¥ 32 ¡¨â­ ï ª à⨭ª 
mov eax,buf2d_w
mov edx,buf2d_h ;¢ëá®â  ª®¯¨à㥬®© ª à⨭ª¨
mov esi,buf2d_data ;¤ ­­ë¥ ª®¯¨à㥬®© ª à⨭ª¨
 
mov edi,[buf_destination]
cmp buf2d_bits,24
jne .copy_end ;ä®à¬ â ¡ãä¥à  ­¥ ¯®®¤¥à¦¨¢ ¥âáï
mov ebx,buf2d_h ;ebx - ¢ëá®â  ®á­®¢­®£® ¡ãä¥à 
mov ecx,[coord_y]
cmp ecx,ebx
jge .copy_end ;¥á«¨ ª®®à¤¨­ â  'y' ¡®«ìè¥ ¢ëá®âë ¡ãä¥à 
add ecx,edx ;ecx - ­¨¦­ïï ª®®à¤¨­ â  ª®¯¨à㥬®© ª à⨭ª¨
cmp ecx,ebx
jle @f
sub ecx,ebx
sub edx,ecx ;㬥­ìè ¥¬ ¢ëá®âã ª®¯¨à㥬®© ª à⨭ª¨, ¢ á«ãç¥ ª®£¤  ®­  ¢ë« §¨â §  ­¨¦­îî £à ­¨æã
@@:
mov ebx,buf2d_w
mov ecx,ebx ;ecx ¨á¯®«ì§ã¥¬ ¤«ï ¢à¥¬¥­­ëå 楫¥©
imul ecx,[coord_y]
add ecx,[coord_x]
lea ecx,[ecx+ecx*2]
add ecx,buf2d_data
sub ebx,eax
mov edi,ecx ;edi 㪠§ â¥«ì ­  ¤ ­­ë¥ ¡ãä¥à , ªã¤  ¡ã¤¥â ¯à®¨§¢®¤¨âáï ª®¯¨à®¢ ­¨¥
 
mov [right_bytes],0
mov ecx,[coord_x]
cmp ecx,ebx
jl @f
sub ecx,ebx
sub eax,ecx ;㪮à ç¨¢ ¥¬ ª®¯¨à㥬ãî áâபã
add ebx,ecx ;㤫¨­­ï¥¬ áâப㠤«ï ᤢ¨£  £« ¢­®© ª à⨭ª¨ ¡ãä¥à 
lea ecx,[ecx+ecx*2] ;ecx - ç¨á«® ¡ ©â ¢ 1-© áâப¥ ª à⨭ª¨, ª®â®àë¥ ¢ë« §ïâ §  ¯à ¢ãî áâ®à®­ã
mov [right_bytes],ecx
@@:
 
lea eax,[eax+eax*2] ;ª®««¨ç¥á⢮ ¡ ©â ¢ 1-© áâப¥ ª®¯¨à㥬®© ª à⨭ª¨
lea ebx,[ebx+ebx*2] ;ª®««¨ç¥á⢮ ¡ ©â ¢ 1-© áâப¥ ¡ãä¥à  ¬¨­ãá ç¨á«® ¡ ©â ¢ 1-© áâப¥ ª®¯¨à㥬®© ª à⨭ª¨
 
cld
cmp [right_bytes],0
jg .copy_1
.copy_0: ;¯à®á⮥ ª®¯¨à®¢ ­¨¥
mov ecx,eax
rep movsb
add edi,ebx
dec edx
cmp edx,0
jg .copy_0
jmp .copy_end
.copy_1: ;­¥ ¯à®á⮥ ª®¯¨à®¢ ­¨¥ (ª à⨭ª  ¢ë« §¨â §  ¯à ¢ãî áâ®à®­ã)
mov ecx,eax
rep movsb
add edi,ebx
add esi,[right_bytes] ;¤®¡ ¢«ï¥¬ ¡ ©âë, ª®â®àë¥ ¢ë« §ïâ §  ¯à ¢ãî £à ­¨æã
dec edx
cmp edx,0
jg .copy_1
jmp .copy_end
 
.sou32: ;¢ ¨áâ®ç­¨ª¥ 32 ¡¨â­ ï ª à⨭ª 
mov eax,buf2d_w
mov edx,buf2d_h ;¢ëá®â  ª®¯¨à㥬®© ª à⨭ª¨
mov esi,buf2d_data ;¤ ­­ë¥ ª®¯¨à㥬®© ª à⨭ª¨
 
mov edi,[buf_destination]
cmp buf2d_bits,24
jne .copy_end ;ä®à¬ â ¡ãä¥à  ­¥ ¯®®¤¥à¦¨¢ ¥âáï
mov ebx,buf2d_h ;ebx - ¢ëá®â  ®á­®¢­®£® ¡ãä¥à 
mov ecx,[coord_y]
cmp ecx,ebx
jge .copy_end ;¥á«¨ ª®®à¤¨­ â  'y' ¡®«ìè¥ ¢ëá®âë ¡ãä¥à 
add ecx,edx ;ecx - ­¨¦­ïï ª®®à¤¨­ â  ª®¯¨à㥬®© ª à⨭ª¨
cmp ecx,ebx
jle @f
sub ecx,ebx
sub edx,ecx ;㬥­ìè ¥¬ ¢ëá®âã ª®¯¨à㥬®© ª à⨭ª¨, ¢ á«ãç¥ ª®£¤  ®­  ¢ë« §¨â §  ­¨¦­îî £à ­¨æã
@@:
mov ebx,buf2d_w
mov ecx,ebx ;ecx ¨á¯®«ì§ã¥¬ ¤«ï ¢à¥¬¥­­ëå 楫¥©
imul ecx,[coord_y]
add ecx,[coord_x]
lea ecx,[ecx+ecx*2]
add ecx,buf2d_data
sub ebx,eax
mov edi,ecx ;edi 㪠§ â¥«ì ­  ¤ ­­ë¥ ¡ãä¥à , ªã¤  ¡ã¤¥â ¯à®¨§¢®¤¨âáï ª®¯¨à®¢ ­¨¥
 
mov [right_bytes],0
mov ecx,[coord_x]
cmp ecx,ebx
jl @f
sub ecx,ebx
sub eax,ecx ;㪮à ç¨¢ ¥¬ ª®¯¨à㥬ãî áâபã
add ebx,ecx ;㤫¨­­ï¥¬ áâப㠤«ï ᤢ¨£  £« ¢­®© ª à⨭ª¨ ¡ãä¥à 
shl ecx,2 ;ecx - ç¨á«® ¡ ©â ¢ 1-© áâப¥ ª à⨭ª¨, ª®â®àë¥ ¢ë« §ïâ §  ¯à ¢ãî áâ®à®­ã
mov [right_bytes],ecx
@@:
 
;eax - ª®««¨ç¥á⢮ ¯¨ªá¥«¥© ¢ 1-© áâப¥ ª®¯¨à㥬®© ª à⨭ª¨
lea ebx,[ebx+ebx*2] ;ª®««¨ç¥á⢮ ¡ ©â ¢ 1-© áâப¥ ¡ãä¥à  ¬¨­ãá ç¨á«® ¡ ©â ¢ 1-© áâப¥ ª®¯¨à㥬®© ª à⨭ª¨
 
cld
cmp [right_bytes],0
jg .copy_3
.copy_2: ;¯à®á⮥ ª®¯¨à®¢ ­¨¥
mov ecx,eax
@@:
movsw
movsb
inc esi
loop @b
add edi,ebx
dec edx
cmp edx,0
jg .copy_2
jmp .copy_end
.copy_3: ;­¥ ¯à®á⮥ ª®¯¨à®¢ ­¨¥ (ª à⨭ª  ¢ë« §¨â §  ¯à ¢ãî áâ®à®­ã)
mov ecx,eax
@@:
movsw
movsb
inc esi
loop @b
add edi,ebx
add esi,[right_bytes] ;¤®¡ ¢«ï¥¬ ¡ ©âë, ª®â®àë¥ ¢ë« §ïâ §  ¯à ¢ãî £à ­¨æã
dec edx
cmp edx,0
jg .copy_3
 
.copy_end:
popad
ret
endp
 
;input:
; esi = pointer to color1 + transparent
; edi = pointer to background color2
;output:
; [edi] = combine color
align 4
combine_colors:
push ax bx cx dx
mov bx,0x00ff ;---get transparent---
mov cl,byte[esi+3] ;pro
xor ch,ch
sub bx,cx ;256-pro
;---red---
xor ah,ah
mov al,byte[esi+2]
imul ax,bx
xor dh,dh
mov dl,byte[edi+2]
imul dx,cx
add ax,dx
mov byte[edi+2],ah
;---green---
xor ah,ah
mov al,byte[esi+1]
imul ax,bx
xor dh,dh
mov dl,byte[edi+1]
imul dx,cx
add ax,dx
mov byte[edi+1],ah
;---blye---
xor ah,ah
mov al,byte[esi]
imul ax,bx
xor dh,dh
mov dl,byte[edi]
imul dx,cx
add ax,dx
mov byte[edi],ah
 
pop dx cx bx ax
ret
 
;äã­ªæ¨ï ª®¯¨àã¥â ¨§®¡à ¦¥­¨¥ ¨§ ¡ãä¥à  buf_source (32b) ¢ buf_destination (24b)
; 㪠§ë¢ îâáï ª®®à¤¨­ âë ¢áâ ¢ª¨ ¡ãä¥à  buf_source ®â­®á¨â¥«ì­® buf_destination
; ¯à¨ ª®¯¨à®¢ ­¨¨ ãç¨â뢠¥âáï ¯à®§à ç­®áâì
align 4
proc buf_bit_blt_transp, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword
locals
right_bytes dd ?
endl
pushad
 
mov edi,[buf_source]
cmp buf2d_bits,32
jne .copy_end ;ä®à¬ â ¡ãä¥à  ­¥ ¯®®¤¥à¦¨¢ ¥âáï
mov eax,buf2d_w
mov edx,buf2d_h ;¢ëá®â  ª®¯¨à㥬®© ª à⨭ª¨
mov esi,buf2d_data ;¤ ­­ë¥ ª®¯¨à㥬®© ª à⨭ª¨
 
mov edi,[buf_destination]
cmp buf2d_bits,24
jne .copy_end ;ä®à¬ â ¡ãä¥à  ­¥ ¯®®¤¥à¦¨¢ ¥âáï
mov ebx,buf2d_h ;ebx - ¢ëá®â  ®á­®¢­®£® ¡ãä¥à 
mov ecx,[coord_y]
cmp ecx,ebx
jge .copy_end ;¥á«¨ ª®®à¤¨­ â  'y' ¡®«ìè¥ ¢ëá®âë ¡ãä¥à 
add ecx,edx ;ecx - ­¨¦­ïï ª®®à¤¨­ â  ª®¯¨à㥬®© ª à⨭ª¨
cmp ecx,ebx
jle @f
sub ecx,ebx
sub edx,ecx ;㬥­ìè ¥¬ ¢ëá®âã ª®¯¨à㥬®© ª à⨭ª¨, ¢ á«ãç¥ ª®£¤  ®­  ¢ë« §¨â §  ­¨¦­îî £à ­¨æã
@@:
mov ebx,buf2d_w
mov ecx,ebx ;ecx ¨á¯®«ì§ã¥¬ ¤«ï ¢à¥¬¥­­ëå 楫¥©
imul ecx,[coord_y]
add ecx,[coord_x]
lea ecx,[ecx+ecx*2]
add ecx,buf2d_data
sub ebx,eax
mov edi,ecx ;edi 㪠§ â¥«ì ­  ¤ ­­ë¥ ¡ãä¥à , ªã¤  ¡ã¤¥â ¯à®¨§¢®¤¨âáï ª®¯¨à®¢ ­¨¥
 
mov [right_bytes],0
mov ecx,[coord_x]
cmp ecx,ebx
jl @f
sub ecx,ebx
sub eax,ecx ;㪮à ç¨¢ ¥¬ ª®¯¨à㥬ãî áâபã
add ebx,ecx ;㤫¨­­ï¥¬ áâப㠤«ï ᤢ¨£  £« ¢­®© ª à⨭ª¨ ¡ãä¥à 
shl ecx,2 ;ecx - ç¨á«® ¡ ©â ¢ 1-© áâப¥ ª à⨭ª¨, ª®â®àë¥ ¢ë« §ïâ §  ¯à ¢ãî áâ®à®­ã
mov [right_bytes],ecx
@@:
 
lea ebx,[ebx+ebx*2] ;ª®««¨ç¥á⢮ ¡ ©â ¢ 1-© áâப¥ ¡ãä¥à  ¬¨­ãá ç¨á«® ¡ ©â ¢ 1-© áâப¥ ª®¯¨à㥬®© ª à⨭ª¨
 
cld
cmp [right_bytes],0
jg .copy_1
.copy_0: ;¯à®á⮥ ª®¯¨à®¢ ­¨¥
mov ecx,eax
@@:
call combine_colors
add edi,3
add esi,4
loop @b
add edi,ebx
dec edx
cmp edx,0
jg .copy_0
jmp .copy_end
.copy_1: ;­¥ ¯à®á⮥ ª®¯¨à®¢ ­¨¥ (ª à⨭ª  ¢ë« §¨â §  ¯à ¢ãî áâ®à®­ã)
mov ecx,eax
@@:
call combine_colors
add edi,3
add esi,4
loop @b
add edi,ebx
add esi,[right_bytes] ;¤®¡ ¢«ï¥¬ ¡ ©âë, ª®â®àë¥ ¢ë« §ïâ §  ¯à ¢ãî £à ­¨æã
dec edx
cmp edx,0
jg .copy_1
 
.copy_end:
popad
ret
endp
 
;input:
; ebx - color1
; esi = pointer to transparent
; edi = pointer to background color2
;output:
; [edi] = combine color
align 4
combine_colors_2:
push ax ebx cx dx si
mov cl,byte[esi] ;pro
xor ch,ch
mov si,0x00ff ;---get transparent---
sub si,cx ;256-pro
 
;---blye---
mov al,bl
xor ah,ah
shr ebx,8
imul ax,si
xor dh,dh
mov dl,byte[edi+2]
imul dx,cx
add ax,dx
mov byte[edi+2],ah
;---green---
mov al,bl
xor ah,ah
shr ebx,8
imul ax,si
xor dh,dh
mov dl,byte[edi+1]
imul dx,cx
add ax,dx
mov byte[edi+1],ah
;---red---
mov al,bl
xor ah,ah
imul ax,si
xor dh,dh
mov dl,byte[edi]
imul dx,cx
add ax,dx
mov byte[edi],ah
 
pop si dx cx ebx ax
ret
 
;äã­ªæ¨ï ª®¯¨àã¥â ¨§®¡à ¦¥­¨¥ ¨§ ¡ãä¥à  buf_source (8b) ¢ buf_destination (24b)
; 㪠§ë¢ îâáï ª®®à¤¨­ âë ¢áâ ¢ª¨ ¡ãä¥à  buf_source ®â­®á¨â¥«ì­® buf_destination
align 4
proc buf_bit_blt_alpha, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword, color:dword
locals
right_bytes dd ?
dest_w_bytes dd ? ;ª®««¨ç¥á⢮ ¡ ©â ¢ ¡ãä¥à¥ ¯à¨¥¬­¨ª¥ ¯® è¨à¨­¥ - è¨à¨­  ¢áâ ¢«ï¥¬®© ª à⨭ª¨
endl
pushad
 
mov edi,[buf_source]
cmp buf2d_bits,8
jne .error1 ;ä®à¬ â ¡ãä¥à  ­¥ ¯®®¤¥à¦¨¢ ¥âáï
mov eax,buf2d_w
mov edx,buf2d_h ;¢ëá®â  ª®¯¨à㥬®© ª à⨭ª¨
mov esi,buf2d_data ;¤ ­­ë¥ ª®¯¨à㥬®© ª à⨭ª¨
 
mov edi,[buf_destination]
cmp buf2d_bits,24
jne .error2 ;ä®à¬ â ¡ãä¥à  ­¥ ¯®®¤¥à¦¨¢ ¥âáï
mov ebx,buf2d_h ;ebx - ¢ëá®â  ®á­®¢­®£® ¡ãä¥à 
mov ecx,[coord_y]
cmp ecx,ebx
jge .copy_end ;¥á«¨ ª®®à¤¨­ â  'y' ¡®«ìè¥ ¢ëá®âë ¡ãä¥à 
add ecx,edx ;ecx - ­¨¦­ïï ª®®à¤¨­ â  ª®¯¨à㥬®© ª à⨭ª¨
cmp ecx,ebx
jle @f
sub ecx,ebx
sub edx,ecx ;㬥­ìè ¥¬ ¢ëá®âã ª®¯¨à㥬®© ª à⨭ª¨, ¢ á«ãç¥ ª®£¤  ®­  ¢ë« §¨â §  ­¨¦­îî £à ­¨æã
@@:
mov ebx,buf2d_w
mov ecx,ebx ;ecx ¨á¯®«ì§ã¥¬ ¤«ï ¢à¥¬¥­­ëå 楫¥©
imul ecx,[coord_y]
add ecx,[coord_x]
lea ecx,[ecx+ecx*2]
add ecx,buf2d_data
sub ebx,eax
mov edi,ecx ;edi 㪠§ â¥«ì ­  ¤ ­­ë¥ ¡ãä¥à , ªã¤  ¡ã¤¥â ¯à®¨§¢®¤¨âáï ª®¯¨à®¢ ­¨¥
 
mov [right_bytes],0
mov ecx,[coord_x]
cmp ecx,ebx
jl @f
sub ecx,ebx
sub eax,ecx ;㪮à ç¨¢ ¥¬ ª®¯¨à㥬ãî áâபã
add ebx,ecx ;㤫¨­­ï¥¬ áâப㠤«ï ᤢ¨£  £« ¢­®© ª à⨭ª¨ ¡ãä¥à 
;ecx - ç¨á«® ¯¨ªá¥«¥© ¢ 1-© áâப¥ ª à⨭ª¨, ª®â®àë¥ ¢ë« §ïâ §  ¯à ¢ãî áâ®à®­ã
mov [right_bytes],ecx
@@:
 
lea ebx,[ebx+ebx*2] ;ª®««¨ç¥á⢮ ¡ ©â ¢ 1-© áâப¥ ¡ãä¥à  ¬¨­ãá ç¨á«® ¡ ©â ¢ 1-© áâப¥ ª®¯¨à㥬®© ª à⨭ª¨
mov [dest_w_bytes],ebx
mov ebx,[color]
 
cld
cmp [right_bytes],0
jg .copy_1
.copy_0: ;¯à®á⮥ ª®¯¨à®¢ ­¨¥
mov ecx,eax
@@:
call combine_colors_2
add edi,3
inc esi
loop @b
add edi,[dest_w_bytes]
dec edx
cmp edx,0
jg .copy_0
jmp .copy_end
.copy_1: ;­¥ ¯à®á⮥ ª®¯¨à®¢ ­¨¥ (ª à⨭ª  ¢ë« §¨â §  ¯à ¢ãî áâ®à®­ã)
mov ecx,eax
@@:
call combine_colors_2
add edi,3
inc esi
loop @b
add edi,[dest_w_bytes]
add esi,[right_bytes] ;¤®¡ ¢«ï¥¬ ¡ ©âë, ª®â®àë¥ ¢ë« §ïâ §  ¯à ¢ãî £à ­¨æã
dec edx
cmp edx,0
jg .copy_1
 
jmp .copy_end
.error1:
stdcall print_err,sz_buf2d_bit_blt_alpha,txt_err_n8b
jmp .copy_end
.error2:
stdcall print_err,sz_buf2d_bit_blt_alpha,txt_err_n24b
.copy_end:
popad
ret
endp
 
;¯à¥®¡à §®¢ ­¨¥ 8-¡¨â­®£® ¡ãä¥à  à §¬¥à®¬ 16*16 ¢ à §¬¥à 1*256 ᨬ¢®«®¢
align 4
proc buf_convert_text_matrix, buf_struc:dword
locals
tmp_mem dd ?
c1 dw ?
c2 dd ?
c3 dw ?
endl
pushad
mov edi,dword[buf_struc]
cmp buf2d_bits,8
jne .error
mov ecx,buf2d_h
mov ebx,ecx
shr ebx,4 ;¯à¥¤¯®« £ ¥¬ çâ® ¢ ¡ãä¥à¥ 16 áâப á ᨬ¢®« ¬¨, ¯®â®¬ã ¤¥«¨¬ ­  2^4
mov edx,buf2d_w
imul ecx,edx ;ecx = size 8 b
invoke mem.alloc,ecx ;¢ë¤¥«ï¥¬ ¢à¥¬¥­­ãî ¯ ¬ïâì
mov [tmp_mem],eax ;eax - new memory
 
shr edx,4 ;¯à¥¤¯®« £ ¥¬ çâ® ¢ ¡ãä¥à¥ 16 ª®«®­®ª á ᨬ¢®« ¬¨, ¯®â®¬ã ¤¥«¨¬ ­  2^4
mov eax,ebx
imul ebx,edx ;¢ëç¨á«ï¥¬ ª®®«¨ç¥á⢮ ¯¨ªá¥«¥© ­  1 ᨬ¢®«
;eax = bhe - ¢ëá®â  ¡ãª¢ë
;ebx = bwi*bhe - ª®««¨ç¥á⢮ ¯¨ªá¥«¥© ¢ 1-© ¡ãª¢¥
;edx = bwi - è¨à¨­  ¡ãª¢ë
;ecx,esi,edi - ¨á¯®«ì§ãîâáï ¢ 横«¥ .c_0
shr buf2d_w,4
shl buf2d_h,4 ;¯à¥®¡à §®¢ë¢ ¥¬ à §¬¥àë ¡ãä¥à 
 
cld
mov esi,buf2d_data
mov edi,[tmp_mem]
mov word[c3],16
.c_3:
mov dword[c2],eax
.c_2:
mov word[c1],16
.c_1:
mov ecx,edx ;.c_0:
rep movsb
add edi,ebx
sub edi,edx ;edi+=(bwi*bhe-bwi)
dec word[c1]
cmp word[c1],0
jg .c_1
add edi,edx
shl ebx,4
sub edi,ebx ;edi-=(16*bwi*bhe-bwi)
shr ebx,4
dec dword[c2]
cmp dword[c2],0
jg .c_2
sub edi,ebx
shl ebx,4
add edi,ebx ;edi+=(15*bwi*bhe)
shr ebx,4
dec word[c3]
cmp word[c3],0
jg .c_3
 
mov edi,dword[buf_struc] ;ª®¯¨à®¢ ­¨¥ ­®¢®© ¬ âà¨æë ¢ ®á­®¢­®© ¡ãä¥à
mov edi,buf2d_data
mov esi,[tmp_mem]
mov ecx,ebx
shl ecx,8
rep movsb
invoke mem.free,[tmp_mem] ;ç¨á⨬ ¢à¥¬¥­­ãî ¯ ¬ïâì
jmp .end_conv
.error:
stdcall print_err,sz_buf2d_convert_text_matrix,txt_err_n8b
.end_conv:
popad
ret
endp
 
align 4
buf_s_matr buf_2d_header ? ;«®ª «ì­ ï ¬ âà¨æ  ᨬ¢®« 
 
align 4
proc buf_draw_text, buf_struc:dword, buf_t_matr:dword, text:dword, coord_x:dword, coord_y:dword, color:dword
locals
buf_t_matr_offs dd ?
endl
pushad
mov edi,dword[buf_struc]
cmp buf2d_bits,24
jne .error2
mov edi,dword[buf_t_matr]
cmp buf2d_bits,8
jne .error1
mov edx,buf2d_data
mov [buf_t_matr_offs],edx
mov ecx,BUF_STRUCT_SIZE ;ª®¯¨à㥬 áâàãªâãàã ⥪á⮢®© ¬ âà¨æë
mov esi,edi
lea edi,[buf_s_matr]
cld
rep movsb
lea edi,[buf_s_matr]
shr buf2d_h,8 ;¤¥«¨¬ ¢ëá®âã ᨬ¢®«ì­®£® ¡ãä¥à  ­  256, ¤«ï ­ å®¦¤¥­¨ï ¢ëá®âë 1-£® ᨬ¢®« 
mov ebx,buf2d_h ;¡¥à¥¬ ¢ëá®âã ᨬ¢®« 
mov ecx,buf2d_w ;¡¥à¥¬ è¨à¨­ã ᨬ¢®« 
 
mov eax,[coord_x]
mov esi,[text]
cmp byte[esi],0
je .end_draw ;¥á«¨ ¯ãáâ ï áâப 
@@:
xor edx,edx
mov dl,byte[esi] ;¡¥à¥¬ ª®¤ ᨬ¢®« 
imul edx,ebx ;㬭®¦ ¥¬ ¥£® ­  ¢ëá®âã ᨬ¢®« 
imul edx,ecx ;㬭®¦ ¥¬ ­  è¨à¨­ã ᨬ¢®« 
add edx,[buf_t_matr_offs] ;¯à¨¡ ¢«ï¥¬ ᬥ饭¨¥ 0-£® ᨬ¢®« , â. ¥. ¯®«ãç ¥âáï ᬥ饭¨¥ ¢ë¢®¤¨¬®£® ᨬ¢®« 
mov buf2d_data,edx ;¢ «®ª «ì­ë© ¡ãä¥à ᨬ¢®« , áâ ¢¨¬ 㪠§ â¥«ì ­  ­ã¦­ë© ᨬ¢®« ¨§ ¡ãä¥à  buf_t_matr
stdcall buf_bit_blt_alpha, [buf_struc], eax,[coord_y], edi,[color]
add eax,ecx
.new_s:
inc esi
cmp byte[esi],13
jne .no_13
mov eax,[coord_x]
add [coord_y],ebx
jmp .new_s
.no_13:
cmp byte[esi],0
jne @b
jmp .end_draw
.error1:
stdcall print_err,sz_buf2d_draw_text,txt_err_n8b
jmp .end_draw
.error2:
stdcall print_err,sz_buf2d_draw_text,txt_err_n24b
.end_draw:
popad
ret
endp
 
align 4
proc print_err, fun:dword, mes:dword ;¢ë¢®¤¨¬ á®®¡é¥­¨¥ ®¡ 訡ª¥ ­  ¤®áªã ®â« ¤ª¨
pushad
mov eax,63
mov ebx,1
 
mov esi,[fun]
@@:
mov cl,byte[esi]
int 0x40
inc esi
cmp byte[esi],0
jne @b
mov cl,':'
int 0x40
mov cl,' '
int 0x40
mov esi,[mes]
@@:
mov cl,byte[esi]
int 0x40
inc esi
cmp byte[esi],0
jne @b
popad
ret
endp
 
;input:
; ebp+8 = p0
; ebp+12 = p1
align 4
line_len4i:
push ebp
mov ebp,esp
finit
fild word [ebp+8]
fisub word [ebp+12]
fmul st0,st0 ;st0=x^2
fild word [ebp+10]
fisub word [ebp+14]
fmul st0,st0 ;st0=y^2
fadd st0,st1
fsqrt
fstp dword [ebp+12]
pop ebp
ret 4 ;8
 
align 4
proc buf_cruve_bezier, buffer:dword, coord_p0:dword,coord_p1:dword,coord_p2:dword, color:dword
locals
delt_t dd ?
opr_param dd ?
v_poi_0 dd ?
endl
pushad
 
;float t, xt,yt;
;for(t=.0;t<1.;t+=.005){
; xt=pow(1.-t,2)*x0+2*t*(1.-t)*x1+pow(t,2)*x2;
; yt=pow(1.-t,2)*y0+2*t*(1.-t)*y1+pow(t,2)*y2;
; dc.SetPixel(xt,yt,255L);
;}
 
mov edx,[color] ;set cruve color
mov edi,[buffer]
xor ebx,ebx
xor ecx,ecx
 
finit
 
; calculate delta t
stdcall line_len4i, dword[coord_p1],dword[coord_p0]
fadd dword[esp]
add esp,4 ;pop ...
 
stdcall line_len4i, dword[coord_p2],dword[coord_p1]
fadd dword[esp]
add esp,4 ;pop ...
 
fadd st0,st0 ; len*=2
ftst
fstsw ax
 
fld1
sahf
jle @f ;¨§¡¥£ ¥¬ ¤¥«¥­¨ï ­  0
fdiv st0,st1
@@:
fstp dword[delt_t]
 
finit
 
;fild word[coord_p2+2] ;y2
fild word[coord_p1+2] ;y1
fild word[coord_p0+2] ;y0
fild word[coord_p2] ;x2
fild word[coord_p1] ;x1
fild word[coord_p0] ;x0
fld dword[delt_t]
fldz ;t=.0
 
@@:
fld1
fsub st0,st1 ;1.-t
fmul st0,st0 ;pow(1.-t,2)
fmul st0,st3 ;...*x0
fstp dword[opr_param]
 
fld1
fsub st0,st1 ;1.-t
fmul st0,st1 ;(1.-t)*t
fadd st0,st0
fmul st0,st4 ;...*x1
mov esi,dword[opr_param]
fstp dword[opr_param]
 
fldz
fadd st0,st1 ;0+t
fmul st0,st0 ;t*t
fmul st0,st5 ;...*x2
 
fadd dword[opr_param]
mov dword[opr_param],esi
fadd dword[opr_param]
fistp word[v_poi_0] ;x
 
fld1
fsub st0,st1 ;1.-t
fmul st0,st0 ;pow(1.-t,2)
fmul st0,st6 ;...*y0
fstp dword[opr_param]
 
fld1
fsub st0,st1 ;1.-t
fmul st0,st1 ;(1.-t)*t
fadd st0,st0
fmul st0,st7 ;...*y1
mov esi,dword[opr_param]
fstp dword[opr_param]
 
fldz
fadd st0,st1 ;0+t
fmul st0,st0 ;t*t
fimul word[coord_p2+2] ;...*y2
 
fadd dword[opr_param]
mov dword[opr_param],esi
fadd dword[opr_param]
fistp word[v_poi_0+2] ;y
 
mov eax,1
mov bx,word[v_poi_0+2]
mov cx,word[v_poi_0]
call draw_pixel
 
fadd st0,st1 ;t+dt
 
fld1
fcomp
fstsw ax
sahf
jae @b
 
popad
ret
endp
 
txt_err_n8b db 'need buffer 8 bit',13,10,0
txt_err_n24b db 'need buffer 24 bit',13,10,0
 
align 16
EXPORTS:
dd sz_lib_init, lib_init
dd sz_buf2d_create, buf_create
dd sz_buf2d_create_f_img, buf_create_f_img
dd sz_buf2d_clear, buf_clear
dd sz_buf2d_draw, buf_draw_buf
dd sz_buf2d_delete, buf_delete
dd sz_buf2d_line, buf_line_brs
dd sz_buf2d_circle, buf_circle
dd sz_buf2d_img_hdiv2, buf_img_hdiv2
dd sz_buf2d_img_wdiv2, buf_img_wdiv2
dd sz_buf2d_conv_24_to_8, buf_conv_24_to_8
dd sz_buf2d_conv_24_to_32, buf_conv_24_to_32
dd sz_buf2d_bit_blt, buf_bit_blt
dd sz_buf2d_bit_blt_transp, buf_bit_blt_transp
dd sz_buf2d_bit_blt_alpha, buf_bit_blt_alpha
dd sz_buf2d_cruve_bezier, buf_cruve_bezier
dd sz_buf2d_convert_text_matrix, buf_convert_text_matrix
dd sz_buf2d_draw_text, buf_draw_text
dd sz_buf2d_crop_color, buf_crop_color
dd sz_buf2d_offset_h, buf_offset_h
dd 0,0
sz_lib_init db 'lib_init',0
sz_buf2d_create db 'buf2d_create',0
sz_buf2d_create_f_img db 'buf2d_create_f_img',0
sz_buf2d_clear db 'buf2d_clear',0 ;®ç¨á⪠ ¡ãä¥à  㪠§ ­­ë¬ 梥⮬
sz_buf2d_draw db 'buf2d_draw',0
sz_buf2d_delete db 'buf2d_delete',0
sz_buf2d_line db 'buf2d_line',0 ;à¨á®¢ ­¨¥ «¨­¨¨
sz_buf2d_circle db 'buf2d_circle',0 ;à¨á®¢ ­¨¥ ®ªà㦭®áâ¨
sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 ;ᦠ⨥ ¨§®¡à ¦¥­¨ï ¯® ¢ëá®â¥ ¢ 2 à §  (à §¬¥à ¡ãä¥à  ­¥ ¬¥­ï¥âáï)
sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 ;ᦠ⨥ ¨§®¡à ¦¥­¨ï ¯® è¨à¨­¥ ¢ 2 à §  (à §¬¥à ¡ãä¥à  ­¥ ¬¥­ï¥âáï)
sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
sz_buf2d_bit_blt db 'buf2d_bit_blt',0
sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
sz_buf2d_cruve_bezier db 'buf2d_cruve_bezier',0
sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
sz_buf2d_draw_text db 'buf2d_draw_text',0
sz_buf2d_crop_color db 'buf2d_crop_color',0
sz_buf2d_offset_h db 'buf2d_offset_h',0
/programs/develop/libraries/buf2d/trunk/build.bat
0,0 → 1,4
if not exist bin mkdir bin
@fasm.exe -m 16384 buf2d.asm bin\buf2d.obj
@kpack bin\buf2d.obj
pause