<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>mike &#187; Графика</title>
	<atom:link href="http://mikhail.krivyy.com/category/zametki/grafika/feed/" rel="self" type="application/rss+xml" />
	<link>http://mikhail.krivyy.com</link>
	<description>мнение автора может не совпадать с его точкой зрения ©</description>
	<lastBuildDate>Fri, 10 Feb 2012 08:08:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<mikes>en</mikes>		<item>
		<title>Установка MapNik в Gentoo Linux</title>
		<link>http://mikhail.krivyy.com/2009/10/02/mapnik-gentoo-linux/</link>
		<comments>http://mikhail.krivyy.com/2009/10/02/mapnik-gentoo-linux/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 13:26:50 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Графика]]></category>
		<category><![CDATA[Интернет и сеть]]></category>
		<category><![CDATA[mapnik]]></category>
		<category><![CDATA[postgis]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/?p=1918</guid>
		<description><![CDATA[Все что описано выше проверено на: Linux 2.6.23-gentoo-r3k1 Mapnik 0.6.0 (sci-geosciences/mapnik) osm2pgsql 20090707 (sci-geosciences/osm2pgsql) PostgreSQL 8.3.7 (dev-db/postgresql-base, dev-db/postgresql-server) Python 2.6.2-r1 Установка PostGIS и PostgreSQL 1. Устанавливаем Postgis и PostgreSQL: ACCEPT_KEYWORDS="~x86" USE="proj geos" emerge postgis emerge postgresql-server --config 2. Запускаем PostgreSQL: /etc/init.d/postgresql-8.3 start 3. Создаем базу данных PostGIS: su su - postgres createuser mike createdb -E [...]]]></description>
			<content:encoded><![CDATA[<p>Все что описано выше проверено на:</p>
<ul>
<li>Linux 2.6.23-gentoo-r3k1</li>
<li>Mapnik 0.6.0 (sci-geosciences/mapnik)</li>
<li>osm2pgsql 20090707 (sci-geosciences/osm2pgsql)</li>
<li>PostgreSQL 8.3.7 (dev-db/postgresql-base, dev-db/postgresql-server)</li>
<li>Python 2.6.2-r1</li>
</ul>
<p><span id="more-1918"></span></p>
<p><strong>Установка PostGIS и PostgreSQL</strong></p>
<p>1. Устанавливаем Postgis и PostgreSQL:</p>
<pre>ACCEPT_KEYWORDS="~x86" USE="proj geos" emerge postgis
emerge postgresql-server --config</pre>
<p>2. Запускаем PostgreSQL:</p>
<pre>/etc/init.d/postgresql-8.3 start</pre>
<p>3. Создаем базу данных PostGIS:</p>
<pre>su
su - postgres
createuser mike
createdb -E UTF8 -O mike gis
createlang plpgsql gis
psql -d gis -f /usr/share/postgresql/contrib/lwpostgis.sql
echo "ALTER TABLE geometry_columns OWNER TO mike; ALTER TABLE spatial_ref_sys OWNER TO mike;"  | psql -d gis
ACCEPT_KEYWORDS="~x86" USE="postgres proj doc gdal python bidi" emerge mapnik
ACCEPT_KEYWORDS="~x86" emerge osm2pgsql
psql -d gis -f /usr/share/postgresql/contrib/90000.sql</pre>
<p><strong>Установка Mapnik</strong></p>
<p>4. Устанавливаем Mapnik:</p>
<pre>USE="postgres proj debug doc gdal python bidi" emerge mapnik</pre>
<p>5. Устанавливаем данных Mapnik:</p>
<p>Более подробные инструкции можно найти на <a href="http://wiki.openstreetmap.org/index.php/Mapnik">http://wiki.openstreetmap.org/index.php/Mapnik</a>. Ниже только самое главное:</p>
<p>World boundaries (Границы, 51MB) and coastlines (Береговые линии) (~200MB):</p>
<pre>wget http://tile.openstreetmap.org/world_boundaries-spherical.tgz
wget http://hypercube.telascience.org/~kleptog/processed_p.zip
tar -zxvf world_boundaries-spherical.tgz
unzip processed_p.zip
mv coastlines/* world_boundaries/
rmdir coastlines
chmod -R 755 world_boundaries

mkdir /usr/local/share/mapnik
mv world_boundaries /usr/local/share/mapnik</pre>
<p><strong>Установка osm2pgsql</strong></p>
<p>6. Устанавливаем osm2pgsql:</p>
<pre>ACCEPT_KEYWORDS="~x86" emerge osm2pgsql</pre>
<p>7. Получаем данные OSM по заданным координатам:</p>
<pre>wget -O map.osm "http://www.informationfreeway.org/api/0.6/*[bbox=29.637569,56.918102,36.227985,59.435345]"</pre>
<p>7. Добавляем скачанные данных в базу данных:</p>
<pre>./osm2pgsql -d gis ../map.osm</pre>
<p><strong>Генерация карты</strong></p>
<p>8. Скачиваем с <a href="http://svn.openstreetmap.org/applications/rendering/mapnik/">http://svn.openstreetmap.org/applications/rendering/mapnik/</a> Pyhton скрипты для генерации квадратов &#8212; http://svn.openstreetmap.org/applications/rendering/mapnik/generate_image.py и http://svn.openstreetmap.org/applications/rendering/mapnik/generate_tiles.py. Также скачиваем XML файлы описывающие стили карт &#8212; osm.xml;</p>
<p>9. В самом конце файла <strong>generate_tiles.py</strong> правим координаты квадрата и уровни масштабирования. Запускаем <strong>generate_tiles.py</strong>;</p>
<p>10. Используем квадраты по своему усмотрению, например с Google Maps API.</p>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2009/10/02/mapnik-gentoo-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Алгоритм Брезенхема для вывода эллипса</title>
		<link>http://mikhail.krivyy.com/2002/12/28/ellipse-c/</link>
		<comments>http://mikhail.krivyy.com/2002/12/28/ellipse-c/#comments</comments>
		<pubDate>Sat, 28 Dec 2002 13:40:37 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Графика]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/2002/12/28/ellipse-c/</guid>
		<description><![CDATA[Одно время у меня была мания на, всякого рода, графические библиотечки :) Они еще не раз появятся на этом сайте. Казалось бы &#8212; убитое время: Ан нет, опыт написания подобных очень пригодился при разработке своего клона GD, который выводит курс валют и информер погоды на www.novgorod.ru, счетчик и кое-какие графики на top.novgorod.ru. Здесь приведена неотъемлемая [...]]]></description>
			<content:encoded><![CDATA[<p>Одно время у меня была мания на, всякого рода, графические библиотечки :) Они еще не раз появятся на этом сайте. </p>
<p>Казалось бы &#8212; убитое время: Ан нет, опыт написания подобных очень пригодился при разработке своего клона GD, который выводит курс валют и информер погоды на <a href="http://www.novgorod.ru/">www.novgorod.ru</a>, счетчик и кое-какие графики на <a href="http://top.novgorod.ru/">top.novgorod.ru</a>. </p>
<p>Здесь приведена неотъемлемая часть такое библиотек &#8212; Алгоритм Брезенхема для вывода эллипса, самый быстрый из подобных.</p>
<p><span id="more-90"></span></p>
<ol class="codelist">
<li class="tab0 odd"><code>#include &lt;conio.h&gt;</code></li>
<li class="tab0 even"><code>#include &lt;stdlib.h&gt;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>//############################ Вывод точки ##################################</code></li>
<li class="tab0 odd"><code>void putpixel(unsigned int X,unsigned int Y,unsigned char Color)</code></li>
<li class="tab1 even"><code>{</code></li>
<li class="tab2 odd"><code>asm {</code></li>
<li class="tab8 even"><code>mov     ax, [Y]</code></li>
<li class="tab8 odd"><code>mov     dx, 320</code></li>
<li class="tab8 even"><code>imul    dx</code></li>
<li class="tab8 odd"><code>add     ax, [X]</code></li>
<li class="tab8 even"><code>mov     di, ax</code></li>
<li class="tab8 odd"><code>push    es</code></li>
<li class="tab8 even"><code>mov     ax, 0xA000</code></li>
<li class="tab8 odd"><code>mov     es, ax</code></li>
<li class="tab8 even"><code>mov     al,[Color]</code></li>
<li class="tab8 odd"><code>stosb</code></li>
<li class="tab8 even"><code>pop     es</code></li>
<li class="tab6 odd"><code>}</code></li>
<li class="tab1 even"><code>}</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>//################ Алгорит Брезенхема для рисования эллипса #################</code></li>
<li class="tab0 odd"><code>void ellipse(int x, int y, int a, int b, int color)</code></li>
<li class="tab0 even"><code>{</code></li>
<li class="tab1 odd"><code>int col,i,row,bnew;</code></li>
<li class="tab1 even"><code>long a_square,b_square,two_a_square,two_b_square,four_a_square,four_b_square,d;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab2 even"><code>b_square=b*b;</code></li>
<li class="tab2 odd"><code>a_square=a*a;</code></li>
<li class="tab2 even"><code>row=b;</code></li>
<li class="tab2 odd"><code>col=0;</code></li>
<li class="tab2 even"><code>two_a_square=a_square&lt;&lt;1;</code></li>
<li class="tab2 odd"><code>four_a_square=a_square&lt;&lt;2;</code></li>
<li class="tab2 even"><code>four_b_square=b_square&lt;&lt;2;</code></li>
<li class="tab2 odd"><code>two_b_square=b_square&lt;&lt;1;</code></li>
<li class="tab2 even"><code>d=two_a_square*((row-1)*(row))+a_square+two_b_square*(1-a_square);</code></li>
<li class="tab2 odd"><code>while(a_square*(row)&gt;b_square*(col))</code></li>
<li class="tab2 even"><code>{</code></li>
<li class="tab3 odd"><code>putpixel(col+x,row+y,color);</code></li>
<li class="tab3 even"><code>putpixel(col+x,y-row,color);</code></li>
<li class="tab3 odd"><code>putpixel(x-col,row+y,color);</code></li>
<li class="tab3 even"><code>putpixel(x-col,y-row,color);</code></li>
<li class="tab3 odd"><code>if (d&gt;=0)</code></li>
<li class="tab3 even"><code>{</code></li>
<li class="tab4 odd"><code>row--;</code></li>
<li class="tab4 even"><code>d-=four_a_square*(row);</code></li>
<li class="tab3 odd"><code>}</code></li>
<li class="tab3 even"><code>d+=two_b_square*(3+(col&lt;&lt;1));</code></li>
<li class="tab3 odd"><code>col++;</code></li>
<li class="tab2 even"><code>}</code></li>
<li class="tab2 odd"><code>d=two_b_square*(col+1)*col+two_a_square*(row*(row-2)+1)+(1-two_a_square)*b_square;</code></li>
<li class="tab2 even"><code>while ((row) + 1)</code></li>
<li class="tab2 odd"><code>{</code></li>
<li class="tab3 even"><code>putpixel(col+x,row+y,color);</code></li>
<li class="tab3 odd"><code>putpixel(col+x,y-row,color);</code></li>
<li class="tab3 even"><code>putpixel(x-col,row+y,color);</code></li>
<li class="tab3 odd"><code>putpixel(x-col,y-row,color);</code></li>
<li class="tab3 even"><code>if (d&lt;=0)</code></li>
<li class="tab3 odd"><code>{</code></li>
<li class="tab4 even"><code>col++;</code></li>
<li class="tab4 odd"><code>d+=four_b_square*col;</code></li>
<li class="tab3 even"><code>}</code></li>
<li class="tab3 odd"><code>row--;</code></li>
<li class="tab3 even"><code>d+=two_a_square*(3-(row &lt;&lt;1));</code></li>
<li class="tab2 odd"><code>}</code></li>
<li class="tab1 even"><code>}</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>void main(void)</code></li>
<li class="tab1 odd"><code>{</code></li>
<li class="tab1 even"><code>int X,Y;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab1 even"><code>asm mov    ax,0x0013</code></li>
<li class="tab1 odd"><code>asm int    0x10</code></li>
<li class="tab1 even"><code>while (!kbhit()) putpixel(random(320),random(200),random(255));</code></li>
<li class="tab1 odd"><code>getch();</code></li>
<li class="tab1 even"><code>while (!kbhit())</code></li>
<li class="tab2 odd"><code>{</code></li>
<li class="tab4 even"><code>X=50+random(220);</code></li>
<li class="tab4 odd"><code>Y=50+random(100);</code></li>
<li class="tab4 even"><code>ellipse(X,Y,1+random(48),1+random(48),random(255));</code></li>
<li class="tab2 odd"><code>}</code></li>
<li class="tab1 even"><code>getch();</code></li>
<li class="tab1 odd"><code>}</code></li>
</ol>
<p> <P><strong>Download this code:</strong> <a href="/wp-content/uploads/2006/09/demo_320.cpp">demo_320.cpp</a></li>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2002/12/28/ellipse-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Функции для работы с XMode (320x200x256)</title>
		<link>http://mikhail.krivyy.com/2002/12/27/xmode-gl-assembler/</link>
		<comments>http://mikhail.krivyy.com/2002/12/27/xmode-gl-assembler/#comments</comments>
		<pubDate>Fri, 27 Dec 2002 08:43:54 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Графика]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/2002/12/27/xmode-gl-assembler/</guid>
		<description><![CDATA[Эхххх, какой был видео-режим&#8230;какие для него писали демки. Приведенный ниже код содержит простейшие функции для работы с XMode: включить режим, восстановить режим, вывести точку, изменить палитру, подождать обратного хода луча (интересно, как это выглядит на LCD мониторах :)), вывести символ и очистить экран. Вообще приведенный код вряд ли может быть использован для дела&#8230; разве что [...]]]></description>
			<content:encoded><![CDATA[<p>Эхххх, какой был видео-режим&#8230;какие для него писали демки.</p>
<p>Приведенный ниже код содержит простейшие функции для работы с XMode: включить режим, восстановить режим, вывести точку, изменить палитру, подождать обратного хода луча (интересно, как это выглядит на LCD мониторах :)), вывести символ и очистить экран.</p>
<p><span id="more-137"></span></p>
<p>Вообще приведенный код вряд ли может быть использован для дела&#8230; разве что лабораторные сдавать или поэкспериментировать&#8230;или так, для истории :)</p>
<ol class="codelist">
<li class="tab0 odd"><code>SMART</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>CODE    SEGMENT</code></li>
<li class="tab8 even"><code>ASSUME  cs:Code</code></li>
<li class="odd">&nbsp;</li>
<li class="tab8 even"><code>P386</code></li>
<li class="odd">&nbsp;</li>
<li class="tab8 even"><code>PUBLIC _mSetMode</code></li>
<li class="tab8 odd"><code>PUBLIC _mRestoreMode</code></li>
<li class="tab8 even"><code>PUBLIC _mPutPixel</code></li>
<li class="tab8 odd"><code>PUBLIC _mWaitRetRace</code></li>
<li class="tab8 even"><code>PUBLIC _mChangePalette</code></li>
<li class="tab8 odd"><code>PUBLIC _mWriteSymb</code></li>
<li class="tab8 even"><code>PUBLIC _mClrScr</code></li>
<li class="odd">&nbsp;</li>
<li class="tab8 even"><code>PUBLIC _OldMode</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>_OLDMODE      DB 0</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>;################## SetMode ##################################################</code></li>
<li class="tab0 odd"><code>_mSetMode    PROC Far</code></li>
<li class="tab13 even"><code>mov     ah,0Fh</code></li>
<li class="tab13 odd"><code>int     10h</code></li>
<li class="tab13 even"><code>mov     [_OldMode],Al</code></li>
<li class="tab13 odd"><code>mov     ax,0013h        ; 320x200x256</code></li>
<li class="tab13 even"><code>int     10h</code></li>
<li class="tab13 odd"><code>ret</code></li>
<li class="tab0 even"><code>_mSetMode    ENDP</code></li>
<li class="tab0 odd"><code>;################## SetMode ##################################################</code></li>
<li class="tab0 even"><code>_mRestoreMode PROC Far</code></li>
<li class="tab13 odd"><code>xor     ah,ah</code></li>
<li class="tab13 even"><code>mov     al,[_OldMode]</code></li>
<li class="tab13 odd"><code>int     10h</code></li>
<li class="tab13 even"><code>ret</code></li>
<li class="tab0 odd"><code>_mRestoreMode ENDP</code></li>
<li class="tab0 even"><code>;################## PutPixel #################################################</code></li>
<li class="tab0 odd"><code>_mPutPixel    PROC Far</code></li>
<li class="tab13 even"><code>push    bp</code></li>
<li class="tab13 odd"><code>mov     bp,sp</code></li>
<li class="tab13 even"><code>mov     ax,0A000h</code></li>
<li class="tab13 odd"><code>mov     es,ax</code></li>
<li class="tab13 even"><code>mov     cx,320</code></li>
<li class="tab13 odd"><code>mov     ax,ss:[bp+08]     ;Y</code></li>
<li class="tab13 even"><code>mov     bx,ss:[bp+10]     ;X</code></li>
<li class="tab13 odd"><code>mul     cx</code></li>
<li class="tab13 even"><code>add     ax,bx</code></li>
<li class="tab13 odd"><code>mov     dx,ss:[bp+06]     ;Color</code></li>
<li class="tab13 even"><code>mov     di,ax</code></li>
<li class="tab13 odd"><code>mov     Byte Ptr es:[di],dl</code></li>
<li class="tab13 even"><code>pop     bp</code></li>
<li class="tab13 odd"><code>ret     6</code></li>
<li class="tab0 even"><code>_mPutPixel    ENDP</code></li>
<li class="tab0 odd"><code>;################## WaitRetRace ##############################################</code></li>
<li class="tab0 even"><code>_mWaitRetRace PROC Far</code></li>
<li class="tab13 odd"><code>mov   dx,03DAh</code></li>
<li class="tab0 even"><code>RetR1:       in    al,dx</code></li>
<li class="tab13 odd"><code>test  al,08h</code></li>
<li class="tab13 even"><code>jne   RetR1</code></li>
<li class="tab0 odd"><code>RetR2:       in    al,dx</code></li>
<li class="tab13 even"><code>test  al,08h</code></li>
<li class="tab13 odd"><code>je    RetR2</code></li>
<li class="tab13 even"><code>ret</code></li>
<li class="tab0 odd"><code>_mWaitRetRace ENDP</code></li>
<li class="tab0 even"><code>;################## ChangePalette ############################################</code></li>
<li class="tab0 odd"><code>_mChangePalette PROC Far</code></li>
<li class="tab13 even"><code>push    bp</code></li>
<li class="tab13 odd"><code>mov     bp,sp</code></li>
<li class="tab13 even"><code>mov     ax, ss:[bp+12]</code></li>
<li class="tab13 odd"><code>mov     dx, 3C8h</code></li>
<li class="tab13 even"><code>out     dx, al</code></li>
<li class="tab13 odd"><code>inc     dx         ;DX = 3C9h (Pal DATA REG)</code></li>
<li class="tab13 even"><code>mov     ax, ss:[bp+10]</code></li>
<li class="tab13 odd"><code>out     dx, al     ;красная составляющая</code></li>
<li class="tab13 even"><code>mov     ax, ss:[bp+08]</code></li>
<li class="tab13 odd"><code>out     dx, al     ;зеленая составляющая</code></li>
<li class="tab13 even"><code>mov     ax, ss:[bp+06]</code></li>
<li class="tab13 odd"><code>out     dx, al     ;синяя составляющая</code></li>
<li class="tab13 even"><code>pop     bp</code></li>
<li class="tab13 odd"><code>ret     8</code></li>
<li class="tab0 even"><code>_mChangePalette ENDP</code></li>
<li class="tab0 odd"><code>;############## Write ########################################################</code></li>
<li class="tab0 even"><code>_mWriteSymb   PROC Far</code></li>
<li class="tab13 odd"><code>push    bp</code></li>
<li class="tab13 even"><code>mov     bp,sp                   ;6-Символ</code></li>
<li class="tab13 odd"><code>mov     ax,[bp+10]              ;8-Color</code></li>
<li class="tab13 even"><code>mov     dh,al                   ;10-Y</code></li>
<li class="tab13 odd"><code>mov     bx,[bp+12]              ;12-X</code></li>
<li class="tab13 even"><code>mov     dl,bl</code></li>
<li class="tab13 odd"><code>mov     ah,02h</code></li>
<li class="tab13 even"><code>int     10h</code></li>
<li class="tab13 odd"><code>mov     cx,1</code></li>
<li class="tab13 even"><code>mov     ax,[bp+06]</code></li>
<li class="tab13 odd"><code>xor     ah,ah</code></li>
<li class="tab13 even"><code>mov     bx,[bp+08]</code></li>
<li class="tab13 odd"><code>mov     ah,09h</code></li>
<li class="tab13 even"><code>int     10h</code></li>
<li class="tab13 odd"><code>pop     bp</code></li>
<li class="tab13 even"><code>ret     8</code></li>
<li class="tab0 odd"><code>_mWriteSymb   ENDP</code></li>
<li class="tab0 even"><code>;############## Clear Screen #################################################</code></li>
<li class="tab0 odd"><code>_mClrScr     PROC Far</code></li>
<li class="tab13 even"><code>push    es</code></li>
<li class="tab13 odd"><code>push    0A000h</code></li>
<li class="tab13 even"><code>pop     es</code></li>
<li class="tab13 odd"><code>xor     di,di</code></li>
<li class="tab13 even"><code>xor     eax,eax</code></li>
<li class="tab13 odd"><code>mov     cx,16000</code></li>
<li class="tab13 even"><code>rep     stosd</code></li>
<li class="tab13 odd"><code>pop     es</code></li>
<li class="tab13 even"><code>ret</code></li>
<li class="tab0 odd"><code>_mClrScr     ENDP</code></li>
<li class="tab0 even"><code>CODE         ENDS</code></li>
<li class="tab13 odd"><code>END</code></li>
</ol>
<p> <P><strong>Download this code:</strong> <a href="/wp-content/uploads/2006/09/xmode.asm">xmode.asm</a></li>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2002/12/27/xmode-gl-assembler/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Игрушка с использованием DirectX SDK</title>
		<link>http://mikhail.krivyy.com/2002/01/01/simple-directx-game/</link>
		<comments>http://mikhail.krivyy.com/2002/01/01/simple-directx-game/#comments</comments>
		<pubDate>Tue, 01 Jan 2002 08:32:05 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Графика]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/2002/01/01/simple-directx-game/</guid>
		<description><![CDATA[Эта игрушка писалась для проверки недавно скачанного DirectX SDK. Проверка прошла успешно :) Если у кого-то есть желание дописать сие чудо, то ради бога. Особенно интересно было бы сделать сетевую версию &#8212; при выбивании кубка с одной стороны, он отправляется противнику. Получилось бы аля-банана. Скачать исходники (MSVC;883Kb).]]></description>
			<content:encoded><![CDATA[<p>Эта игрушка писалась для проверки недавно скачанного <a href="http://download.com.com/3000-2383-3663199.html?tag=list" target="_blank">DirectX SDK</a>. Проверка прошла успешно :) Если у кого-то есть желание дописать сие чудо, то ради бога. Особенно интересно было бы сделать сетевую версию &#8212; при выбивании кубка с одной стороны, он отправляется противнику. Получилось бы аля-банана. </P></p>
<p><center><br />
<img src="http://mikhail.krivyy.com/wp-content/uploads/2006/09/i2.jpg"><br />
</center></p>
<p><span id="more-130"></span></p>
<p>Скачать <a href="http://mikhail.krivyy.com/wp-content/uploads/2006/09/pala.zip">исходники</A> (MSVC;883Kb).</p>
<p><center><br />
<img src="http://mikhail.krivyy.com/wp-content/uploads/2006/09/i1.jpg"><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2002/01/01/simple-directx-game/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Вывод BMP в видеорежимах VESA</title>
		<link>http://mikhail.krivyy.com/2000/09/17/bmp-vesa-view-2/</link>
		<comments>http://mikhail.krivyy.com/2000/09/17/bmp-vesa-view-2/#comments</comments>
		<pubDate>Sun, 17 Sep 2000 08:10:17 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Графика]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/2000/09/17/bmp-vesa-view-2/</guid>
		<description><![CDATA[Очень часто в форумах всплывают такие вопросы, как вывод на экран BMP и работа с видеорежимами VESA. Этот пример ответит на оба вопроса. Программа писалась в студенческие годы, в качестве лабораторной работы. Студенты должны были получить спецификации и писать модули для поддержки файлов разных графических форматов, но были выставлены автоматы, и все замялось. Все закончилось [...]]]></description>
			<content:encoded><![CDATA[<p>Очень часто в форумах всплывают такие вопросы, как вывод на экран BMP и работа с видеорежимами VESA. Этот пример ответит на оба вопроса.</p>
<p>Программа писалась в студенческие годы, в качестве лабораторной работы. Студенты должны были получить спецификации и писать модули для поддержки файлов разных графических форматов, но были выставлены автоматы, и все замялось.</p>
<p>Все закончилось на том, что включался видеорежим, были написаны кое-какие функции для него (blt(), putpixel() и line())</p>
<p><span id="more-126"></span></p>
<p><a href=http://mikhail.krivyy.com/wp-content/uploads/2006/09/igs.zip>Скачать в архиве</a></p>
<h3>bmp.cpp</h3>
<ol class="codelist">
<li class="tab0 odd"><code>#include &quot;vesa.h&quot;;</code></li>
<li class="tab0 even"><code>#include &lt;math.h&gt;;</code></li>
<li class="tab0 odd"><code>#include &quot;bmp.h&quot;;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>void BMP_PutFromFile(TMode m, int x, int y, char * fname) {</code></li>
<li class="tab4 even"><code>FILE* fp;</code></li>
<li class="tab4 odd"><code>struct BMPHeader bmp;</code></li>
<li class="tab4 even"><code>TPallete pal[256];  // Палитра</code></li>
<li class="tab4 odd"><code>char paloffset;     // Смещение в палитре;</code></li>
<li class="even">&nbsp;</li>
<li class="tab4 odd"><code>if (x&gt;m.w || y&gt;m.h) return; // Если не влезает в экран.</code></li>
<li class="even">&nbsp;</li>
<li class="tab4 odd"><code>fp=fopen(fname,&quot;rb&quot;);</code></li>
<li class="tab4 even"><code>fread(&amp;bmp,54,1,fp);</code></li>
<li class="odd">&nbsp;</li>
<li class="tab4 even"><code>if (bmp.ID==0x4D42) { // Проверим ID</code></li>
<li class="odd">&nbsp;</li>
<li class="tab8 even"><code>int rw=m.w-x-1; if (rw&gt;bmp.Width)  rw=bmp.Width;  // Требуемая ширина</code></li>
<li class="tab8 odd"><code>int rh=m.h-y-1; if (rh&gt;bmp.Height) rh=bmp.Height; // Требуемая высота</code></li>
<li class="tab8 even"><code>int bpl=bmp.ISize/bmp.Height;                   // Байт на строку у BMP</code></li>
<li class="odd">&nbsp;</li>
<li class="tab8 even"><code>ul pnt=(ul)m.VLFB;</code></li>
<li class="tab8 odd"><code>pnt=pnt+(y+rh)*m.bpl+x*m.bytespp; // Установим указатель на нижнюю строку картинки</code></li>
<li class="even">&nbsp;</li>
<li class="tab8 odd"><code>// 24 бита не пакованая ##############################################</code></li>
<li class="tab8 even"><code>if (bmp.Bits==24 &amp;&amp; bmp.Comp==0) {</code></li>
<li class="tab12 odd"><code>if (bmp.Height-rh!=0) fseek(fp, (bmp.Height-rh)*bpl ,SEEK_CUR);</code></li>
<li class="even">&nbsp;</li>
<li class="tab12 odd"><code>int fseeksize=bpl-rw*3; // Пропускаемая часть в файле</code></li>
<li class="tab12 even"><code>int pntmove=m.bpl+rw*4; // Смещене указателя на экране</code></li>
<li class="tab12 odd"><code>for (int i=0;i&lt;rh;i++) {</code></li>
<li class="tab16 even"><code>for (int j=0;j&lt;rw;j++) {</code></li>
<li class="tab20 odd"><code>fread((void *)pnt, 3, 1, fp);</code></li>
<li class="tab20 even"><code>pnt+=4;</code></li>
<li class="tab20 odd"><code>}</code></li>
<li class="tab16 even"><code>fseek(fp, fseeksize, SEEK_CUR);</code></li>
<li class="tab16 odd"><code>pnt-=pntmove;</code></li>
<li class="tab16 even"><code>}</code></li>
<li class="tab12 odd"><code>}</code></li>
<li class="tab8 even"><code>// 8 бит не пакованая ################################################</code></li>
<li class="tab8 odd"><code>if (bmp.Bits==8 &amp;&amp; bmp.Comp==0) {</code></li>
<li class="tab12 even"><code>if (bpl==0) bpl=bmp.Width;</code></li>
<li class="tab12 odd"><code>fread(&amp;pal,1024,1,fp);  // Читаем палитру</code></li>
<li class="even">&nbsp;</li>
<li class="tab12 odd"><code>if (bmp.Height-rh!=0) fseek(fp, (bmp.Height-rh)*bpl ,SEEK_CUR);</code></li>
<li class="even">&nbsp;</li>
<li class="tab12 odd"><code>int fseeksize=bpl-rw;   // Пропускаемая часть в файле</code></li>
<li class="tab12 even"><code>int pntmove=m.bpl+rw*4; // Смещене указателя на экране</code></li>
<li class="tab12 odd"><code>char * pnto;</code></li>
<li class="tab12 even"><code>for (int i=0;i&lt;rh;i++) {</code></li>
<li class="tab16 odd"><code>for (int j=0;j&lt;rw;j++) {</code></li>
<li class="tab20 even"><code>fread(&amp;paloffset, 1, 1, fp);</code></li>
<li class="tab20 odd"><code>pnto=(char *)pnt;</code></li>
<li class="tab20 even"><code>pnto[2]=pal[paloffset].r;</code></li>
<li class="tab20 odd"><code>pnto[1]=pal[paloffset].g;</code></li>
<li class="tab20 even"><code>pnto[0]=pal[paloffset].b;</code></li>
<li class="tab20 odd"><code>pnt+=4;</code></li>
<li class="tab20 even"><code>}</code></li>
<li class="tab16 odd"><code>fseek(fp, fseeksize, SEEK_CUR);</code></li>
<li class="tab16 even"><code>pnt-=pntmove;</code></li>
<li class="tab16 odd"><code>}</code></li>
<li class="tab12 even"><code>} // end of 8 bit</code></li>
<li class="tab8 odd"><code>}</code></li>
<li class="tab4 even"><code>fclose(fp);</code></li>
<li class="tab4 odd"><code>}</code></li>
</ol>
<p> <P><strong>Download this code:</strong> <a href="/wp-content/uploads/2006/09/bmp.cpp">bmp.cpp</a></li>
<h3>glib2000.cpp</h3>
<ol class="codelist">
<li class="tab0 odd"><code>#include &lt;conio.h&gt;;</code></li>
<li class="tab0 even"><code>#include &quot;vesa.h&quot;;</code></li>
<li class="tab0 odd"><code>#include &quot;bmp.h&quot;;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>char VScreen[1024*768*4];</code></li>
<li class="even">&nbsp;</li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>void DrawHistogram(char * scr, int size, char *s) {</code></li>
<li class="tab5 odd"><code>int R[256];</code></li>
<li class="tab5 even"><code>int G[256];</code></li>
<li class="tab5 odd"><code>int B[256];</code></li>
<li class="tab5 even"><code>int i,val;</code></li>
<li class="tab5 odd"><code>char value;</code></li>
<li class="even">&nbsp;</li>
<li class="tab5 odd"><code>memset (&amp;R, 0, sizeof(R));</code></li>
<li class="tab5 even"><code>memset (&amp;G, 0, sizeof(G));</code></li>
<li class="tab5 odd"><code>memset (&amp;B, 0, sizeof(B));</code></li>
<li class="tab5 even"><code>for (i=0;i&lt;size;i=i+4) { // Рассчитываются гистограммы</code></li>
<li class="tab9 odd"><code>value=scr[i];   R[value]=R[value]+1;//s[i]=255-value;</code></li>
<li class="tab9 even"><code>value=scr[i+1]; G[value]=G[value]+1;//s[i+1]=255-value;</code></li>
<li class="tab9 odd"><code>value=scr[i+2]; B[value]=B[value]+1;//s[i+2]=255-value;</code></li>
<li class="tab9 even"><code>}</code></li>
<li class="odd">&nbsp;</li>
<li class="tab5 even"><code>int sumR=0;for (i=0;i&lt;255;i++) sumR=sumR+R[i];</code></li>
<li class="tab5 odd"><code>int maxR=sumR&gt;&gt;6;</code></li>
<li class="tab5 even"><code>int sumG=0;for (i=0;i&lt;255;i++) sumG=sumG+G[i];</code></li>
<li class="tab5 odd"><code>int maxG=sumG&gt;&gt;6;</code></li>
<li class="tab5 even"><code>int sumB=0;for (i=0;i&lt;255;i++) sumB=sumB+B[i];</code></li>
<li class="tab5 odd"><code>int maxB=sumB&gt;&gt;6;</code></li>
<li class="even">&nbsp;</li>
<li class="tab5 odd"><code>int maxM=(maxR+maxG+maxB)/3;</code></li>
<li class="tab5 even"><code>maxR=maxM;</code></li>
<li class="tab5 odd"><code>maxG=maxM;</code></li>
<li class="tab5 even"><code>maxB=maxM;</code></li>
<li class="odd">&nbsp;</li>
<li class="even">&nbsp;</li>
<li class="tab5 odd"><code>// Вывод гистограммы для R</code></li>
<li class="tab5 even"><code>Line(9,151,9,10,0xFFFFFF);Line(9,151,522,151,0xFFFFFF);</code></li>
<li class="tab5 odd"><code>for (i=0;i&lt;256;i++) {</code></li>
<li class="tab9 even"><code>val=(R[i]*140)/maxR;if (val&gt;140) val=140;</code></li>
<li class="tab9 odd"><code>Line(10+(i&lt;&lt;1),150,10+(i&lt;&lt;1),150-val,i&lt;&lt;16);</code></li>
<li class="tab9 even"><code>Line(11+(i&lt;&lt;1),150,11+(i&lt;&lt;1),150-val+1,0xC0C0C0);</code></li>
<li class="tab9 odd"><code>}</code></li>
<li class="even">&nbsp;</li>
<li class="tab5 odd"><code>Line(9,301,9,160,0xFFFFFF);Line(9,301,522,301,0xFFFFFF);</code></li>
<li class="tab5 even"><code>for (i=0;i&lt;256;i++) {</code></li>
<li class="tab9 odd"><code>val=(G[i]*140)/maxG;if (val&gt;140) val=140;</code></li>
<li class="tab9 even"><code>Line(10+(i&lt;&lt;1),300,10+(i&lt;&lt;1),300-val,i&lt;&lt;8);</code></li>
<li class="tab9 odd"><code>Line(11+(i&lt;&lt;1),300,11+(i&lt;&lt;1),300-val+1,0xC0C0C0);</code></li>
<li class="tab9 even"><code>}</code></li>
<li class="odd">&nbsp;</li>
<li class="tab5 even"><code>Line(9,451,9,310,0xFFFFFF);Line(9,451,522,451,0xFFFFFF);</code></li>
<li class="tab5 odd"><code>for (i=0;i&lt;256;i++) {</code></li>
<li class="tab9 even"><code>val=(B[i]*140)/maxB;if (val&gt;140) val=140;</code></li>
<li class="tab9 odd"><code>Line(10+(i&lt;&lt;1),450,10+(i&lt;&lt;1),450-val,i);</code></li>
<li class="tab9 even"><code>Line(11+(i&lt;&lt;1),450,11+(i&lt;&lt;1),450-val+1,0xC0C0C0);</code></li>
<li class="tab9 odd"><code>}</code></li>
<li class="tab5 even"><code>}</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>void main(void) {</code></li>
<li class="tab5 odd"><code>cm=SetVESAMode(640,480,32);    // Включение видеорежима.</code></li>
<li class="tab5 even"><code>cm.VLFB=(uc *)VScreen;          // Установка виртуального экрана.</code></li>
<li class="tab5 odd"><code>InitGraph();</code></li>
<li class="even">&nbsp;</li>
<li class="tab5 odd"><code>BMP_PutFromFile(cm,0,0,&quot;29sc091.bmp&quot;);</code></li>
<li class="even">&nbsp;</li>
<li class="tab5 odd"><code>DrawHistogram((char *)cm.VLFB, cm.w*cm.h*cm.bytespp, (char *)cm.LFB);</code></li>
<li class="tab5 even"><code>blt(cm);</code></li>
<li class="odd">&nbsp;</li>
<li class="tab5 even"><code>getch();</code></li>
<li class="tab5 odd"><code>SetVGAMode(3);</code></li>
<li class="tab5 even"><code>}</code></li>
</ol>
<p> <P><strong>Download this code:</strong> <a href="/wp-content/uploads/2006/09/glib2000.cpp">glib2000.cpp</a></li>
<h3>vesa.cpp</h3>
<ol class="codelist">
<li class="tab0 odd"><code>#include &quot;vesa.h&quot;;</code></li>
<li class="tab0 even"><code>#include &lt;conio.h&gt;;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>VBE_InfoBlock far *        vinfo;</code></li>
<li class="tab0 odd"><code>VBE_ModeInfoBlock far *    minfo;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>int *scr;</code></li>
<li class="tab0 even"><code>int dwpl;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>// Возвращает версию VESA ####################################################</code></li>
<li class="tab0 odd"><code>int GetVBEVersion(void) {</code></li>
<li class="tab4 even"><code>union REGS              r;</code></li>
<li class="tab4 odd"><code>us                      seg,sel;</code></li>
<li class="tab4 even"><code>static VBE_RMI          RMI;</code></li>
<li class="tab4 odd"><code>struct SREGS            sr;</code></li>
<li class="tab4 even"><code>ul                      ver;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab4 even"><code>memset (&amp;cm, 0, sizeof(cm));</code></li>
<li class="tab4 odd"><code>r.x.eax=0x0100;</code></li>
<li class="tab4 even"><code>r.x.ebx=600&gt;&gt;4;</code></li>
<li class="tab4 odd"><code>int386(0x31,&amp;r,&amp;r);</code></li>
<li class="tab4 even"><code>if (r.x.cflag) {</code></li>
<li class="tab7 odd"><code>puts (&quot; ¦ DOS memory alocate error.&quot;);</code></li>
<li class="tab7 even"><code>return(0);</code></li>
<li class="tab7 odd"><code>}</code></li>
<li class="tab4 even"><code>seg = r.w.ax;                         // RM segment</code></li>
<li class="tab4 odd"><code>sel = r.w.dx;                         // PM selector</code></li>
<li class="tab4 even"><code>vinfo = (VBE_InfoBlock far *) MK_FP (sel, 0);</code></li>
<li class="tab4 odd"><code>memset (&amp;sr, 0, sizeof (sr));</code></li>
<li class="tab4 even"><code>memset (&amp;RMI, 0, sizeof (RMI));</code></li>
<li class="tab4 odd"><code>RMI.EAX = 0x00004f00;   // Get VBE Info</code></li>
<li class="tab4 even"><code>RMI.ES = seg;</code></li>
<li class="tab4 odd"><code>RMI.EDI = 0;</code></li>
<li class="tab4 even"><code>r.w.ax = 0x0300;</code></li>
<li class="tab4 odd"><code>r.h.bl = 0x10;</code></li>
<li class="tab4 even"><code>r.h.bh = 0;</code></li>
<li class="tab4 odd"><code>r.w.cx = 0;</code></li>
<li class="tab4 even"><code>sr.es = FP_SEG (&amp;RMI);</code></li>
<li class="tab4 odd"><code>r.x.edi = FP_OFF (&amp;RMI);</code></li>
<li class="tab4 even"><code>int386x (0x31, &amp;r, &amp;r, &amp;sr);</code></li>
<li class="tab4 odd"><code>if (r.x.cflag) {</code></li>
<li class="tab7 even"><code>puts (&quot; ¦ DPMI 300h failed.&quot;);</code></li>
<li class="tab7 odd"><code>return(0);</code></li>
<li class="tab7 even"><code>}</code></li>
<li class="tab4 odd"><code>if ((us) RMI.EAX != 0x004f) {</code></li>
<li class="tab7 even"><code>puts (&quot; ¦ Error Getting Video Controller Info.&quot;);</code></li>
<li class="tab7 odd"><code>return(0);</code></li>
<li class="tab7 even"><code>}</code></li>
<li class="tab4 odd"><code>return(vinfo -&gt; VbeVersion);</code></li>
<li class="tab4 even"><code>}</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>void PutVBEVersion(void) {</code></li>
<li class="tab4 odd"><code>int ver=GetVBEVersion();</code></li>
<li class="tab4 even"><code>printf(&quot;%d.%d&quot;,(ver &amp; 0xFF00)&gt;&gt;8 ,ver &amp; 0x00FF);</code></li>
<li class="tab4 odd"><code>}</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>// Включение VESA видео-режима ###########################</code></li>
<li class="tab0 even"><code>// 0 - Ok</code></li>
<li class="tab0 odd"><code>// 1 - DPMI 300h failed</code></li>
<li class="tab0 even"><code>// 2 - Error Getting Video Controller Info</code></li>
<li class="tab0 odd"><code>// 3 - DOS memory alocate error</code></li>
<li class="tab0 even"><code>// 4 - Video mode no found</code></li>
<li class="tab0 odd"><code>// 5 - Error mapping physical to linear</code></li>
<li class="tab0 even"><code>// 6 - Error Init Mode</code></li>
<li class="tab0 odd"><code>TMode SetVESAMode(int xmax, int ymax, int bpp) {</code></li>
<li class="tab4 even"><code>static VBE_RMI          RMI;</code></li>
<li class="tab4 odd"><code>union REGS              r;</code></li>
<li class="tab4 even"><code>struct SREGS            sr;</code></li>
<li class="tab4 odd"><code>us                      sel,seg,x,y,ic;</code></li>
<li class="tab4 even"><code>ul                      phys;</code></li>
<li class="tab4 odd"><code>int                     mmode;</code></li>
<li class="tab4 even"><code>TMode                   cm;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab4 even"><code>r.x.eax=0x0100;</code></li>
<li class="tab4 odd"><code>r.x.ebx=600&gt;&gt;4;</code></li>
<li class="tab4 even"><code>int386(0x31,&amp;r,&amp;r);</code></li>
<li class="tab4 odd"><code>if (r.x.cflag) {</code></li>
<li class="tab7 even"><code>cm.error=1;</code></li>
<li class="tab7 odd"><code>return(cm);</code></li>
<li class="tab7 even"><code>}</code></li>
<li class="tab4 odd"><code>seg = r.w.ax;                         // RM segment</code></li>
<li class="tab4 even"><code>sel = r.w.dx;                         // PM selector</code></li>
<li class="tab4 odd"><code>vinfo = (VBE_InfoBlock far *) MK_FP (sel, 0);</code></li>
<li class="tab4 even"><code>memset (&amp;sr, 0, sizeof (sr));</code></li>
<li class="tab4 odd"><code>memset (&amp;RMI, 0, sizeof (RMI));</code></li>
<li class="tab4 even"><code>RMI.EAX = 0x00004f00;   // Get VBE Info</code></li>
<li class="tab4 odd"><code>RMI.ES = seg;</code></li>
<li class="tab4 even"><code>RMI.EDI = 0;</code></li>
<li class="tab4 odd"><code>r.w.ax = 0x0300;</code></li>
<li class="tab4 even"><code>r.h.bl = 0x10;</code></li>
<li class="tab4 odd"><code>r.h.bh = 0;</code></li>
<li class="tab4 even"><code>r.w.cx = 0;</code></li>
<li class="tab4 odd"><code>sr.es = FP_SEG (&amp;RMI);</code></li>
<li class="tab4 even"><code>r.x.edi = FP_OFF (&amp;RMI);</code></li>
<li class="tab4 odd"><code>int386x (0x31, &amp;r, &amp;r, &amp;sr);</code></li>
<li class="tab4 even"><code>if (r.x.cflag) {</code></li>
<li class="tab8 odd"><code>cm.error=1;</code></li>
<li class="tab8 even"><code>return(cm);</code></li>
<li class="tab8 odd"><code>}</code></li>
<li class="tab4 even"><code>if ((us) RMI.EAX != 0x004f) {</code></li>
<li class="tab8 odd"><code>cm.error=2;</code></li>
<li class="tab8 even"><code>return(cm);</code></li>
<li class="tab8 odd"><code>}</code></li>
<li class="tab4 even"><code>r.x.eax = 0x0100;</code></li>
<li class="tab4 odd"><code>r.x.ebx = 300 &gt;&gt; 4;</code></li>
<li class="tab4 even"><code>int386 (0x31, &amp;r, &amp;r);</code></li>
<li class="tab4 odd"><code>if (r.x.cflag) {</code></li>
<li class="tab7 even"><code>cm.error=3;</code></li>
<li class="tab7 odd"><code>return(cm);</code></li>
<li class="tab7 even"><code>}</code></li>
<li class="tab4 odd"><code>seg = r.w.ax;    // RM segment</code></li>
<li class="tab4 even"><code>sel = r.w.dx;    // PM selector</code></li>
<li class="tab4 odd"><code>minfo = (VBE_ModeInfoBlock far *) MK_FP (sel, 0);</code></li>
<li class="tab4 even"><code>memset (&amp;sr, 0, sizeof (sr));</code></li>
<li class="tab4 odd"><code>memset (&amp;RMI, 0, sizeof (RMI));</code></li>
<li class="tab4 even"><code>mmode=0;</code></li>
<li class="tab4 odd"><code>if (vinfo -&gt; VbeVersion &gt;= 0x0200) {</code></li>
<li class="tab8 even"><code>for (ic=0x4100;ic&lt;0x4200;ic++) {</code></li>
<li class="tab12 odd"><code>RMI.EAX = 0x00004f01;   // Get VBE Mode Info</code></li>
<li class="tab12 even"><code>RMI.ECX = ic;</code></li>
<li class="tab12 odd"><code>RMI.ES = seg;</code></li>
<li class="tab12 even"><code>RMI.EDI = 0;</code></li>
<li class="tab12 odd"><code>r.w.ax = 0x0300;</code></li>
<li class="tab12 even"><code>r.h.bl = 0x10;</code></li>
<li class="tab12 odd"><code>r.h.bh = 0;</code></li>
<li class="tab12 even"><code>r.w.cx = 0;</code></li>
<li class="tab12 odd"><code>sr.es = FP_SEG (&amp;RMI);</code></li>
<li class="tab12 even"><code>r.x.edi = FP_OFF (&amp;RMI);</code></li>
<li class="tab12 odd"><code>int386x (0x31, &amp;r, &amp;r, &amp;sr);</code></li>
<li class="tab12 even"><code>if (r.x.cflag) {</code></li>
<li class="tab15 odd"><code>cm.error=1;</code></li>
<li class="tab15 even"><code>return(cm);</code></li>
<li class="tab15 odd"><code>}</code></li>
<li class="tab12 even"><code>if ((minfo-&gt;BitsPerPixel==bpp) &amp;&amp;</code></li>
<li class="tab15 odd"><code>(minfo-&gt;XResolution==xmax) &amp;&amp;</code></li>
<li class="tab15 even"><code>(minfo-&gt;YResolution==ymax) &amp;&amp;</code></li>
<li class="tab15 odd"><code>((us)RMI.EAX==0x004f)) {</code></li>
<li class="tab15 even"><code>if (mmode==0) {mmode=ic;}</code></li>
<li class="tab15 odd"><code>}</code></li>
<li class="tab12 even"><code>}</code></li>
<li class="tab8 odd"><code>if (mmode!=0) cm.banked=1; else cm.banked=0;</code></li>
<li class="tab8 even"><code>}</code></li>
<li class="tab4 odd"><code>if (mmode==0) {</code></li>
<li class="tab8 even"><code>for (ic=0x0100;ic&lt;0x0200;ic++) {</code></li>
<li class="tab12 odd"><code>RMI.EAX = 0x00004f01;   // Get VBE Mode Info</code></li>
<li class="tab12 even"><code>RMI.ECX = ic;</code></li>
<li class="tab12 odd"><code>RMI.ES = seg;</code></li>
<li class="tab12 even"><code>RMI.EDI = 0;</code></li>
<li class="tab12 odd"><code>r.w.ax = 0x0300;</code></li>
<li class="tab12 even"><code>r.h.bl = 0x10;</code></li>
<li class="tab12 odd"><code>r.h.bh = 0;</code></li>
<li class="tab12 even"><code>r.w.cx = 0;</code></li>
<li class="tab12 odd"><code>sr.es = FP_SEG (&amp;RMI);</code></li>
<li class="tab12 even"><code>r.x.edi = FP_OFF (&amp;RMI);</code></li>
<li class="tab12 odd"><code>int386x (0x31, &amp;r, &amp;r, &amp;sr);</code></li>
<li class="tab12 even"><code>if (r.x.cflag) {</code></li>
<li class="tab15 odd"><code>cm.error=1;</code></li>
<li class="tab15 even"><code>return(cm);</code></li>
<li class="tab15 odd"><code>}</code></li>
<li class="tab12 even"><code>if ((minfo-&gt;BitsPerPixel==bpp)&amp;&amp;</code></li>
<li class="tab15 odd"><code>(minfo-&gt;XResolution==xmax)&amp;&amp;</code></li>
<li class="tab15 even"><code>(minfo-&gt;YResolution==ymax)&amp;&amp;</code></li>
<li class="tab15 odd"><code>((us)RMI.EAX==0x004f)) {</code></li>
<li class="tab15 even"><code>if (mmode==0) {mmode=ic;}</code></li>
<li class="tab15 odd"><code>}</code></li>
<li class="tab12 even"><code>}</code></li>
<li class="tab8 odd"><code>}</code></li>
<li class="tab4 even"><code>if (mmode==0) {</code></li>
<li class="tab7 odd"><code>cm.error=4;</code></li>
<li class="tab7 even"><code>return(cm);</code></li>
<li class="tab7 odd"><code>}</code></li>
<li class="tab4 even"><code>RMI.EAX = 0x00004f01;   // Get VBE Mode Info</code></li>
<li class="tab4 odd"><code>RMI.ECX = mmode;</code></li>
<li class="tab4 even"><code>RMI.ES = seg;</code></li>
<li class="tab4 odd"><code>RMI.EDI = 0;</code></li>
<li class="tab4 even"><code>r.w.ax = 0x0300;</code></li>
<li class="tab4 odd"><code>r.h.bl = 0x10;</code></li>
<li class="tab4 even"><code>r.h.bh = 0;</code></li>
<li class="tab4 odd"><code>r.w.cx = 0;</code></li>
<li class="tab4 even"><code>sr.es = FP_SEG (&amp;RMI);</code></li>
<li class="tab4 odd"><code>r.x.edi = FP_OFF (&amp;RMI);</code></li>
<li class="tab4 even"><code>int386x (0x31, &amp;r, &amp;r, &amp;sr);</code></li>
<li class="tab4 odd"><code>phys=minfo-&gt;PhysBasePtr;</code></li>
<li class="tab4 even"><code>cm.bpp=minfo-&gt;BitsPerPixel;</code></li>
<li class="tab4 odd"><code>cm.bytespp=cm.bpp/8;</code></li>
<li class="tab4 even"><code>cm.h=minfo-&gt;YResolution;</code></li>
<li class="tab4 odd"><code>cm.w=minfo-&gt;XResolution;</code></li>
<li class="tab4 even"><code>cm.bpl=minfo-&gt;BytesPerScanLine;</code></li>
<li class="tab4 odd"><code>r.w.ax = 0x0800;</code></li>
<li class="tab4 even"><code>r.w.bx = (phys &gt;&gt; 0x10);</code></li>
<li class="tab4 odd"><code>r.w.cx = (phys &amp; 0xffff);</code></li>
<li class="tab4 even"><code>r.w.si = (long)((minfo-&gt;YResolution * minfo-&gt;BytesPerScanLine)&gt;&gt;16);</code></li>
<li class="tab4 odd"><code>r.w.di = minfo-&gt;YResolution * minfo-&gt;BytesPerScanLine;</code></li>
<li class="tab4 even"><code>int386 (0x31, &amp;r, &amp;r);</code></li>
<li class="tab4 odd"><code>if (r.x.cflag) {</code></li>
<li class="tab7 even"><code>cm.error=5;</code></li>
<li class="tab7 odd"><code>return(cm);</code></li>
<li class="tab7 even"><code>}</code></li>
<li class="tab4 odd"><code>cm.LFB = (uc near *) (((ul) r.w.bx &lt;&lt; 16) | r.w.cx);</code></li>
<li class="tab4 even"><code>r.w.ax = 0x4f02;</code></li>
<li class="tab4 odd"><code>r.w.bx = mmode;</code></li>
<li class="tab4 even"><code>int386 (0x10, &amp;r, &amp;r);</code></li>
<li class="tab4 odd"><code>if (r.w.ax != 0x004f) {</code></li>
<li class="tab7 even"><code>cm.error=6;</code></li>
<li class="tab7 odd"><code>return(cm);</code></li>
<li class="tab7 even"><code>}</code></li>
<li class="tab3 odd"><code>cm.error=0;</code></li>
<li class="tab3 even"><code>return(cm);</code></li>
<li class="tab3 odd"><code>}</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>// Установка VGA режима ######################################################</code></li>
<li class="tab0 even"><code>void SetVGAMode(int mode) {</code></li>
<li class="tab4 odd"><code>static VBE_RMI          RMI;</code></li>
<li class="tab4 even"><code>union REGS              r;</code></li>
<li class="tab4 odd"><code>struct SREGS            sr;</code></li>
<li class="even">&nbsp;</li>
<li class="tab4 odd"><code>memset (&amp;sr, 0, sizeof (sr));</code></li>
<li class="tab4 even"><code>memset (&amp;RMI, 0, sizeof (RMI));</code></li>
<li class="tab4 odd"><code>memset (&amp;r, 0, sizeof (r));</code></li>
<li class="tab4 even"><code>RMI.EAX = mode;   // Get VBE Mode Info</code></li>
<li class="tab4 odd"><code>r.w.ax = 0x0300;</code></li>
<li class="tab4 even"><code>r.h.bl = 0x10;</code></li>
<li class="tab4 odd"><code>r.h.bh = 0;</code></li>
<li class="tab4 even"><code>r.w.cx = 0;</code></li>
<li class="tab4 odd"><code>sr.es = FP_SEG (&amp;RMI);</code></li>
<li class="tab4 even"><code>r.x.edi = FP_OFF (&amp;RMI);</code></li>
<li class="tab4 odd"><code>int386x (0x31, &amp;r, &amp;r, &amp;sr);</code></li>
<li class="tab4 even"><code>}</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>void blt(TMode m) {</code></li>
<li class="tab5 odd"><code>if (m.bpp==32 &amp;&amp; m.banked==1) { // Если включен 32 битный LFB режим</code></li>
<li class="tab8 even"><code>memcpy((void *)m.LFB, (void *)m.VLFB, m.w * m.h * m.bytespp);</code></li>
<li class="tab8 odd"><code>}</code></li>
<li class="tab5 even"><code>}</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>void InitGraph(void) {</code></li>
<li class="tab5 odd"><code>dwpl=cm.bpl&gt;&gt;2;</code></li>
<li class="tab5 even"><code>scr=(int *)cm.VLFB;</code></li>
<li class="tab5 odd"><code>}</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>void PutPixel(int x,int y,int color) {</code></li>
<li class="tab5 even"><code>scr[y*dwpl+x]=color;</code></li>
<li class="tab5 odd"><code>}</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>int sgn(int i) {</code></li>
<li class="tab4 even"><code>if (i==0) return(0);</code></li>
<li class="tab4 odd"><code>if (i&gt;0) return(1);</code></li>
<li class="tab4 even"><code>return(-1);</code></li>
<li class="tab4 odd"><code>}</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>void Line(int x1,int y1,int x2,int y2,int color) {</code></li>
<li class="tab4 even"><code>int dx,dy,r,dr1,dr2,x,y,sx,sy;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab4 even"><code>dx=abs(x2-x1);</code></li>
<li class="tab4 odd"><code>dy=abs(y2-y1);</code></li>
<li class="tab4 even"><code>sx=sgn(x2-x1);</code></li>
<li class="tab4 odd"><code>sy=sgn(y2-y1);</code></li>
<li class="tab4 even"><code>if (dx&gt;dy) {</code></li>
<li class="odd">&nbsp;</li>
<li class="tab8 even"><code>r=dx;</code></li>
<li class="tab8 odd"><code>dr1=-dy&lt;&lt;1;</code></li>
<li class="tab8 even"><code>dr2=(dx-dy)&lt;&lt;1;</code></li>
<li class="tab8 odd"><code>y=y1;</code></li>
<li class="tab8 even"><code>x=x1;</code></li>
<li class="tab8 odd"><code>x2=x2+sx;</code></li>
<li class="tab8 even"><code>do {</code></li>
<li class="tab12 odd"><code>PutPixel(x,y,color);</code></li>
<li class="tab12 even"><code>if (r&gt;0) r=r+dr1;</code></li>
<li class="tab12 odd"><code>else {</code></li>
<li class="tab16 even"><code>r=r+dr2;</code></li>
<li class="tab16 odd"><code>y=y+sy;</code></li>
<li class="tab16 even"><code>PutPixel(x,y,color);</code></li>
<li class="tab16 odd"><code>}</code></li>
<li class="tab12 even"><code>x=x+sx;</code></li>
<li class="tab12 odd"><code>} while (x!=x2);</code></li>
<li class="tab8 even"><code>}</code></li>
<li class="tab4 odd"><code>else {</code></li>
<li class="tab8 even"><code>r=dy;</code></li>
<li class="tab8 odd"><code>dr1=-dx&lt;&lt;1;</code></li>
<li class="tab8 even"><code>dr2=(dy-dx)&lt;&lt;1;</code></li>
<li class="tab8 odd"><code>y=y1;</code></li>
<li class="tab8 even"><code>x=x1;</code></li>
<li class="tab8 odd"><code>y2=y2+sy;</code></li>
<li class="tab8 even"><code>do {</code></li>
<li class="tab12 odd"><code>PutPixel(x,y,color);</code></li>
<li class="tab12 even"><code>if (r&gt;0) r=r+dr1;</code></li>
<li class="tab12 odd"><code>else {</code></li>
<li class="tab16 even"><code>r=r+dr2;</code></li>
<li class="tab16 odd"><code>x=x+sx;</code></li>
<li class="tab16 even"><code>PutPixel(x,y,color);</code></li>
<li class="tab16 odd"><code>}</code></li>
<li class="tab12 even"><code>y=y+sy;</code></li>
<li class="tab12 odd"><code>} while (y!=y2);</code></li>
<li class="tab8 even"><code>}</code></li>
<li class="tab4 odd"><code>}</code></li>
</ol>
<p> <P><strong>Download this code:</strong> <a href="/wp-content/uploads/2006/09/vesa.cpp">vesa.cpp</a></li>
<h3>bmp.h</h3>
<ol class="codelist">
<li class="tab0 odd"><code>struct BMPHeader</code></li>
<li class="tab1 even"><code>{</code></li>
<li class="tab3 odd"><code>unsigned short ID;    // 'BM' for a Windows BitMaP</code></li>
<li class="tab3 even"><code>unsigned int   FSize; // Size of file</code></li>
<li class="tab3 odd"><code>unsigned short Res1;  // Not used</code></li>
<li class="tab3 even"><code>unsigned short Res2;  // Not used</code></li>
<li class="tab3 odd"><code>unsigned int   Image; // Offset of image into file</code></li>
<li class="even">&nbsp;</li>
<li class="tab3 odd"><code>unsigned int   stSize;       // число байт, занимаемых структурой BITMAPINFOHEADER</code></li>
<li class="tab3 even"><code>unsigned int   Width;        // Width of image</code></li>
<li class="tab3 odd"><code>unsigned int   Height;       // Height of image</code></li>
<li class="tab3 even"><code>unsigned short Num;          // число битовых плоскостей устройства</code></li>
<li class="tab3 odd"><code>unsigned short Bits;         // Number of bits per pixel</code></li>
<li class="tab3 even"><code>unsigned int   Comp;         // Type of compression, 0 for uncompressed, 1,2 for RLE</code></li>
<li class="tab3 odd"><code>unsigned int   ISize;        // Size of image in bytes</code></li>
<li class="tab3 even"><code>unsigned int   XRes;         // X dots per metre (not inches! for US, unbelievable!)</code></li>
<li class="tab3 odd"><code>unsigned int   YRes;         // Y dots per metre</code></li>
<li class="tab3 even"><code>unsigned int   PSize;        // Palette size (number of colours) if not zero</code></li>
<li class="tab3 odd"><code>unsigned int   PImportant;   // Probably reserved, currently 0</code></li>
<li class="tab1 even"><code>};</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>typedef struct SPallete {       // Тип описывающий элемент палитры.</code></li>
<li class="tab4 odd"><code>char b,g,r,x;</code></li>
<li class="tab0 even"><code>} TPallete;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>void BMP_PutFromFile(TMode cm, int x, int y, char * fname);</code></li>
</ol>
<p> <P><strong>Download this code:</strong> <a href="/wp-content/uploads/2006/09/bmp.h">bmp.h</a></li>
<p><a id=p121 href="">bmp.cpp</a></p>
<h3>vesa.h</h3>
<ol class="codelist">
<li class="tab0 odd"><code>#include &lt;string.h&gt;</code></li>
<li class="tab0 even"><code>#include &lt;stdio.h&gt;</code></li>
<li class="tab0 odd"><code>#include &lt;stdlib.h&gt;</code></li>
<li class="tab0 even"><code>#include &lt;dos.h&gt;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>typedef unsigned short us;</code></li>
<li class="tab0 odd"><code>typedef unsigned int   ui;</code></li>
<li class="tab0 even"><code>typedef unsigned char  uc;</code></li>
<li class="tab0 odd"><code>typedef unsigned long  ul;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>typedef struct SVBE_InfoBlock {</code></li>
<li class="tab2 even"><code>uc VbeSignature[4];           // VBE Signature</code></li>
<li class="tab2 odd"><code>us VbeVersion;                // VBE Version</code></li>
<li class="tab2 even"><code>ul OemStringPtr;              // Pointer to OEM String</code></li>
<li class="tab2 odd"><code>ul Capabilities;              // Capabilities of graphics cont.</code></li>
<li class="tab2 even"><code>ul VideoModePtr;              // Pointer to Video Mode List</code></li>
<li class="tab32 odd"><code>// Added for VBE 1.2+</code></li>
<li class="tab2 even"><code>us TotalMemory;               // Number of 64kb memory blocks</code></li>
<li class="tab32 odd"><code>// Added for VBE 2.0+</code></li>
<li class="tab2 even"><code>us OemSoftwareRev;            // VBE implementation Software revision</code></li>
<li class="tab2 odd"><code>ul OemVendorNamePtr;          // Pointer to Vendor Name String</code></li>
<li class="tab2 even"><code>ul OemProductNamePtr;         // Pointer to Product Name String</code></li>
<li class="tab2 odd"><code>ul OemProductRevPtr;          // Pointer to Product Revision String</code></li>
<li class="tab2 even"><code>us AccelVbeVersion;           // VBE/AF Version</code></li>
<li class="tab2 odd"><code>ul AccelVideoModePtr;         // Pointer to Acclelerated Mode List</code></li>
<li class="tab2 even"><code>uc Reserved20[216];           // Reserved for VBE implementation</code></li>
<li class="tab32 odd"><code>// scratch area</code></li>
<li class="tab2 even"><code>uc OemData[256];              // Data Area for OEM Strings</code></li>
<li class="tab2 odd"><code>uc NaVsyakiySloochay[100];    // 2e</code></li>
<li class="tab0 even"><code>} VBE_InfoBlock;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>typedef struct SVBE_ModeInfoBlock {</code></li>
<li class="tab2 odd"><code>us ModeAttributes;            // mode attributes</code></li>
<li class="tab2 even"><code>uc WinAAttributes;            // window A attributes</code></li>
<li class="tab2 odd"><code>uc WinBAttributes;            // window B attributes</code></li>
<li class="tab2 even"><code>us WinGranularity;            // window granularity</code></li>
<li class="tab2 odd"><code>us WinSize;                   // window size</code></li>
<li class="tab2 even"><code>us WinASegment;               // window A start segment</code></li>
<li class="tab2 odd"><code>us WinBSegment;               // window B start segment</code></li>
<li class="tab2 even"><code>ul WinFuncPtr;                // pointer to window function</code></li>
<li class="tab2 odd"><code>us BytesPerScanLine;          // bytes per scan line</code></li>
<li class="tab32 even"><code>// Mandatory information for VBE 1.2 and above</code></li>
<li class="tab2 odd"><code>us XResolution;               // horizontal resolution in pixels or chars</code></li>
<li class="tab2 even"><code>us YResolution;               // vertical resolution in pixels or chars</code></li>
<li class="tab2 odd"><code>uc XCharSize;                 // character cell width in pixels</code></li>
<li class="tab2 even"><code>uc YCharSize;                 // character cell height in pixels</code></li>
<li class="tab2 odd"><code>uc NumberOfPlanes;            // number of memory planes</code></li>
<li class="tab2 even"><code>uc BitsPerPixel;              // bits per pixel</code></li>
<li class="tab2 odd"><code>uc NumberOfBanks;             // number of banks</code></li>
<li class="tab2 even"><code>uc MemoryModel;               // memory model type</code></li>
<li class="tab2 odd"><code>uc BankSize;                  // bank size in KB</code></li>
<li class="tab2 even"><code>uc NumberOfImagePages;        // number of images</code></li>
<li class="tab2 odd"><code>uc Reserved12;                // reserved for page function</code></li>
<li class="tab32 even"><code>// Direct Color fields (required</code></li>
<li class="tab32 odd"><code>// for direct/6 and YUV/7 memory models)</code></li>
<li class="tab2 even"><code>uc RedMaskSize;               // size of direct color red mask in bits</code></li>
<li class="tab2 odd"><code>uc RedFieldPosition;          // bit position of lsb of red mask</code></li>
<li class="tab2 even"><code>uc GreenMaskSize;             // size of direct color green mask in bits</code></li>
<li class="tab2 odd"><code>uc GreenFieldPosition;        // bit position of lsb of green mask</code></li>
<li class="tab2 even"><code>uc BlueMaskSize;              // size of direct color blue mask in bits</code></li>
<li class="tab2 odd"><code>uc BlueFieldPosition;         // bit position of lsb of blue mask</code></li>
<li class="tab2 even"><code>uc RsvdMaskSize;              // size of direct color reserved mask in bits</code></li>
<li class="tab2 odd"><code>uc RsvdFieldPosition;         // bit position of lsb of reserved mask</code></li>
<li class="tab2 even"><code>uc DirectColorModeInfo;       // direct color mode attributes</code></li>
<li class="tab32 odd"><code>// Mandatory information for VBE 2.0 and above</code></li>
<li class="tab2 even"><code>ul PhysBasePtr;               // physical address for flat frame buffer</code></li>
<li class="tab2 odd"><code>ul OffScreenMemOffset;        // pointer to start of off screen memory</code></li>
<li class="tab2 even"><code>us OffScreenMemSize;          // amount of off screen memory in 1k units</code></li>
<li class="tab2 odd"><code>uc Reserved20[206];           // remainder of ModeInfoBlock</code></li>
<li class="tab2 even"><code>uc NaVsyakiySloochay[100];    // 2e</code></li>
<li class="tab0 odd"><code>} VBE_ModeInfoBlock;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>typedef struct SVBE_RMI {       // Rreal Mode Interrupt (RMI) structure</code></li>
<li class="tab2 even"><code>ul EDI, ESI, EBP, ReservedByRMI,</code></li>
<li class="tab5 odd"><code>EBX, EDX, ECX, EAX;</code></li>
<li class="tab2 even"><code>us flags,</code></li>
<li class="tab5 odd"><code>ES, DS,</code></li>
<li class="tab5 even"><code>FS, GS,</code></li>
<li class="tab5 odd"><code>IP, CS,</code></li>
<li class="tab5 even"><code>SP, SS;</code></li>
<li class="tab0 odd"><code>} VBE_RMI;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>typedef struct SMode {       // Тип описывающий видео-режим.</code></li>
<li class="tab4 even"><code>ul  bpl;        // Байт на строку растра.</code></li>
<li class="tab4 odd"><code>ul  w;          // Ширина</code></li>
<li class="tab4 even"><code>ul  h;          // Высота</code></li>
<li class="tab4 odd"><code>ul  bpp;        // Бит на точку</code></li>
<li class="tab4 even"><code>ul  bytespp;    // Байт на точку</code></li>
<li class="tab4 odd"><code>ul  banked;     // (1)LFB or (0)Banked</code></li>
<li class="tab4 even"><code>ul  error;      // Ошибка (обязательно надо проверять)</code></li>
<li class="tab4 odd"><code>uc* LFB;        // Указатель на LFB</code></li>
<li class="tab4 even"><code>uc* VLFB;        // Указатель на Виртуальный экран</code></li>
<li class="tab0 odd"><code>} TMode;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>TMode           cm;            // Текущий видеорежим.</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>int GetVBEVersion(void);</code></li>
<li class="tab0 even"><code>void PutVBEVersion(void);</code></li>
<li class="tab0 odd"><code>TMode SetVESAMode(int xmax, int ymax, int bpp);</code></li>
<li class="tab0 even"><code>void SetVGAMode(int mode);</code></li>
<li class="tab0 odd"><code>void InitGraph(void);</code></li>
<li class="tab0 even"><code>void blt(TMode m);</code></li>
<li class="tab0 odd"><code>void PutPixel(int x,int y,int color);</code></li>
<li class="tab0 even"><code>void Line(int x1,int y1,int x2,int y2,int color);</code></li>
</ol>
<p> <P><strong>Download this code:</strong> <a href="/wp-content/uploads/2006/09/vesa.h">vesa.h</a></li>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2000/09/17/bmp-vesa-view-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Простой редактор чертежей</title>
		<link>http://mikhail.krivyy.com/2000/07/22/vector-editor/</link>
		<comments>http://mikhail.krivyy.com/2000/07/22/vector-editor/#comments</comments>
		<pubDate>Sat, 22 Jul 2000 08:36:11 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Графика]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/2000/07/22/prostoy-redaktor-chertezhey/</guid>
		<description><![CDATA[Как то, когда я еще учился на четвертом курсе, меня попросили написать графический для простых чертежей. Главная особенность &#8212; это сохранение чертежей в компактные файлы. Позже предполагалось, что это будут не файлы, а обыкновенное текстовок поле в обыкновенной таблице обыкновенной базы данных. Рисунок 1 &#8212; Редактирование списка объектов чертежа Потом, как на Руси принято, проект [...]]]></description>
			<content:encoded><![CDATA[<p>Как то, когда я еще учился на четвертом курсе, меня попросили написать графический для простых чертежей. Главная особенность &#8212; это сохранение чертежей в компактные файлы. Позже предполагалось, что это будут не файлы, а обыкновенное текстовок поле в обыкновенной таблице обыкновенной базы данных.</p>
<p><center><br />
<img src=http://mikhail.krivyy.com/wp-content/uploads/2006/09/12.jpg></p>
<p>Рисунок 1 &#8212; Редактирование списка объектов чертежа</p>
<p></center></p>
<p><span id="more-135"></span></p>
<p>Потом, как на Руси принято, проект загнулся, а редактор остался. К тому времени он уже умел создавать, удалять и изменять графические объекты. Был реализован репозиторий графических примитивов, выбор цветов с поддержкой цветовых таблиц Adobe PhotoShop, сохранение/чтение чертежей из файла. И еще много чего.</p>
<p>Написан редактор на Borland C++ Builder 5.0.<br />
Скачать на <a href="http://sources.codenet.ru/download/348/vbase.html" target="_blank">http://sources.codenet.ru/</a> (ZIP ~631Kb)</p>
<p><H3>Другие скриншоты</H3></p>
<p><center><br />
<img src=http://mikhail.krivyy.com/wp-content/uploads/2006/09/21.jpg></p>
<p>Рисунок 2 &#8212; Репозиторий</p>
<p><img src=http://mikhail.krivyy.com/wp-content/uploads/2006/09/31.jpg></p>
<p>Рисунок 3 &#8212; Выбор цвета</p>
<p></center></p>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2000/07/22/vector-editor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Трехмерный ландшафт</title>
		<link>http://mikhail.krivyy.com/1999/11/06/3d-landscape/</link>
		<comments>http://mikhail.krivyy.com/1999/11/06/3d-landscape/#comments</comments>
		<pubDate>Sat, 06 Nov 1999 13:55:06 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Графика]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/1999/11/06/3d-landscape/</guid>
		<description><![CDATA[Пример создания трехмерного ландшафта. Версия под Windows работает c DirectX, а DOS версия работает используя стандарт VESA. Пример показывает как работать с видео напрямую. Использует свои процедуры отрисовки графических примитивов (Точек и треугольников). Легко адаптируется под любую ОС. Скриншоты: Классический ландшафт Совсем перспективная проекция Обратная сторона &#171;Луны&#187; Скачать исходник lscape_dx.zip [MSVC;DirectX] (*) Скачать исходник lscape_vesa.zip [...]]]></description>
			<content:encoded><![CDATA[<p>Пример создания трехмерного ландшафта. Версия под Windows работает c DirectX, а DOS версия работает используя стандарт VESA. Пример показывает как работать с видео напрямую. </p>
<p>Использует свои процедуры отрисовки графических примитивов (Точек и треугольников). Легко адаптируется под любую ОС. </p>
<p>Скриншоты: </p>
<p><center><br />
<img id="image113" alt=lscape3.gif src="http://mikhail.krivyy.com/wp-content/uploads/2006/09/lscape1.gif" /><br />Классический ландшафт<br />
</center><br />
<span id="more-114"></span><br />
<center></p>
<p><img id="image112" alt=lscape3.gif src="http://mikhail.krivyy.com/wp-content/uploads/2006/09/lscape3.gif" /><br />Совсем перспективная проекция</p>
<p><img id="image111" alt=lscape2.gif src="http://mikhail.krivyy.com/wp-content/uploads/2006/09/lscape2.gif" /><br />Обратная сторона &#171;Луны&#187;<br />
</center></p>
<p><UL><br />
<LI>Скачать исходник <a id=p109 href="http://mikhail.krivyy.com/wp-content/uploads/2006/09/lscape_dx.zip">lscape_dx.zip</a> [MSVC;DirectX] (*)<br />
<LI>Скачать исходник <a id="p110" title=lscape_vesa.zip href="http://mikhail.krivyy.com/wp-admin/lscape_vesa.zip">lscape_vesa.zip</a> [WATCOM C++; VESA]<br />
</UL></p>
<p><P>(*) У DirectX версии в исходных текстах есть ошибка &#8212; при инициализации DirectX&#8217;а не обнуляется какая-то структура, из-за этого иногда программа может не работать :). </p>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/1999/11/06/3d-landscape/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Салют</title>
		<link>http://mikhail.krivyy.com/1999/07/05/salute-pascal/</link>
		<comments>http://mikhail.krivyy.com/1999/07/05/salute-pascal/#comments</comments>
		<pubDate>Sun, 04 Jul 1999 22:32:36 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Графика]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/2003/04/17/salute-pascal/</guid>
		<description><![CDATA[Просто &#171;салют&#187;. Программа писалась в прошлом веке :), на TMT Паскале, но не смотря на это эффект своей красоты не потерял. Не работает по Windows NT/2000/XP, так как эти операционные системы блокируют включение видеорежимов VESA. Скачать в архиве (ZIP;22Kb) salutss.pas program BLUR; &#160; uses Crt,mVBE; &#160; Type TSalut=Record X:Real; Y:Real; NX:Word; NY:Word; End; &#160; var [...]]]></description>
			<content:encoded><![CDATA[<p>Просто &#171;салют&#187;. Программа писалась в прошлом веке :), на <a href="http://www.tmt.com/" target="_blank">TMT Паскале</a>, но не смотря на это эффект своей красоты не потерял. </p>
<p>Не работает по Windows NT/2000/XP, так как эти операционные системы блокируют<br />
включение видеорежимов VESA. </p>
<p><span id="more-68"></span></p>
<p>Скачать в <a href="http://mikhail.krivyy.com/wp-content/uploads/2006/09/salut.zip">архиве</a> (ZIP;22Kb) </p>
<h2>salutss.pas</h2>
<ol class="codelist">
<li class="tab0 odd"><code>program BLUR;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>uses Crt,mVBE;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>Type TSalut=Record</code></li>
<li class="tab8 even"><code>X:Real;</code></li>
<li class="tab8 odd"><code>Y:Real;</code></li>
<li class="tab8 even"><code>NX:Word;</code></li>
<li class="tab8 odd"><code>NY:Word;</code></li>
<li class="tab5 even"><code>End;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>var Scr                   :Array[0..256000] of Byte;  {Виртуальный видео-буффер}</code></li>
<li class="tab4 odd"><code>F                     :File;</code></li>
<li class="tab4 even"><code>RSize                 :DWord;</code></li>
<li class="tab4 odd"><code>Salut                 :Array[1..10,1..40] of TSalut;</code></li>
<li class="tab4 even"><code>SalDown               :Array[1..10] of Real;</code></li>
<li class="tab4 odd"><code>SalColor              :Array[1..10] of DWord;</code></li>
<li class="tab4 even"><code>SalTimer              :Array[1..10] of Word;</code></li>
<li class="tab4 odd"><code>X                     :DWord;</code></li>
<li class="tab4 even"><code>Exit                  :Boolean;</code></li>
<li class="tab4 odd"><code>Mode                  :Word;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>Procedure PrintBuf;   {Копирование виртуального видео-буфера в реальный}</code></li>
<li class="tab0 even"><code>var I,S:Word;</code></li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab1 even"><code>asm</code></li>
<li class="tab3 odd"><code>cld</code></li>
<li class="tab3 even"><code>lea     esi,Scr;</code></li>
<li class="tab3 odd"><code>mov     edi,[VBE_VideoMem]</code></li>
<li class="tab3 even"><code>mov     ecx,64000</code></li>
<li class="tab3 odd"><code>repe    movsd</code></li>
<li class="tab1 even"><code>end;</code></li>
<li class="tab0 odd"><code>End;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>Procedure Blur;   {Сам Блюр}</code></li>
<li class="tab1 even"><code>var I:DWord;</code></li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab1 even"><code>asm</code></li>
<li class="tab3 odd"><code>lea      edi,Scr</code></li>
<li class="tab3 even"><code>add      edi,1280</code></li>
<li class="tab3 odd"><code>mov      ecx,253440</code></li>
<li class="tab3 even"><code>xor      ebx,ebx</code></li>
<li class="tab0 odd"><code>@1:</code></li>
<li class="tab3 even"><code>xor      eax,eax</code></li>
<li class="tab3 odd"><code>mov      bl,[edi-4]</code></li>
<li class="tab3 even"><code>add      eax,ebx</code></li>
<li class="tab3 odd"><code>mov      bl,[edi-1280]</code></li>
<li class="tab3 even"><code>add      eax,ebx</code></li>
<li class="tab3 odd"><code>mov      bl,[edi+1280]</code></li>
<li class="tab3 even"><code>add      eax,ebx</code></li>
<li class="tab3 odd"><code>mov      bl,[edi+4]</code></li>
<li class="tab3 even"><code>add      eax,ebx</code></li>
<li class="odd">&nbsp;</li>
<li class="tab3 even"><code>shr      eax,2</code></li>
<li class="tab3 odd"><code>mov      [edi],al</code></li>
<li class="tab3 even"><code>inc      edi</code></li>
<li class="tab3 odd"><code>loop     @1</code></li>
<li class="tab1 even"><code>end;</code></li>
<li class="tab0 odd"><code>End;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>Procedure Plot(X,Y,Color:DWord);</code></li>
<li class="tab1 even"><code>var Addr:DWord;</code></li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab1 even"><code>asm</code></li>
<li class="tab3 odd"><code>lea     ebx,Scr       {ebx = адресс видео-буфера}</code></li>
<li class="tab3 even"><code>mov     edi,[X]       {edi = X}</code></li>
<li class="tab3 odd"><code>cmp     edi,1         {Проверка попадания в экран}</code></li>
<li class="tab3 even"><code>jna     @NoPlot</code></li>
<li class="tab3 odd"><code>cmp     edi,318</code></li>
<li class="tab3 even"><code>ja      @NoPlot</code></li>
<li class="tab3 odd"><code>mov     eax,[Y]       {eax = Y}</code></li>
<li class="tab3 even"><code>cmp     eax,1         {Проверка попадания в экран}</code></li>
<li class="tab3 odd"><code>jna     @NoPlot</code></li>
<li class="tab3 even"><code>cmp     eax,198</code></li>
<li class="tab3 odd"><code>ja      @NoPlot</code></li>
<li class="tab3 even"><code>imul    eax,eax,1280   {Вычисление видео-адресса - Base+X*3+Y*960}</code></li>
<li class="tab3 odd"><code>shl     edi,2</code></li>
<li class="tab3 even"><code>add     edi,eax</code></li>
<li class="tab3 odd"><code>mov     eax,[Color]   {И наконец выставление точки}</code></li>
<li class="tab3 even"><code>mov     [edi+ebx],eax</code></li>
<li class="tab0 odd"><code>@NoPlot:</code></li>
<li class="tab1 even"><code>end;</code></li>
<li class="tab0 odd"><code>End;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>Procedure InitSalutNum(Num:Word);</code></li>
<li class="tab1 even"><code>var X1,Y1,X,Y:Word;</code></li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab1 even"><code>SalDown[Num]:=0;</code></li>
<li class="tab1 odd"><code>SalColor[Num]:=Random($FFFFFF);</code></li>
<li class="tab1 even"><code>SalTimer[Num]:=Random(7000);</code></li>
<li class="tab1 odd"><code>X1:=Random(320);</code></li>
<li class="tab1 even"><code>Y1:=Random(200);</code></li>
<li class="tab1 odd"><code>If Random(100)&gt;95 then</code></li>
<li class="tab2 even"><code>Begin</code></li>
<li class="tab3 odd"><code>SalColor[Num]:=$FFFF00;</code></li>
<li class="tab3 even"><code>For Y:=1 to 40 do</code></li>
<li class="tab4 odd"><code>Begin</code></li>
<li class="tab5 even"><code>Salut[Num,Y].X:=X1;</code></li>
<li class="tab5 odd"><code>Salut[Num,Y].Y:=Y1;</code></li>
<li class="tab5 even"><code>Salut[Num,Y].NX:=Random(255);</code></li>
<li class="tab5 odd"><code>Salut[Num,Y].NX:=Random(255);</code></li>
<li class="tab4 even"><code>End;</code></li>
<li class="tab2 odd"><code>End</code></li>
<li class="tab1 even"><code>else</code></li>
<li class="tab2 odd"><code>Begin</code></li>
<li class="tab3 even"><code>For Y:=1 to 40 do</code></li>
<li class="tab4 odd"><code>Begin</code></li>
<li class="tab5 even"><code>Salut[Num,Y].X:=X1;</code></li>
<li class="tab5 odd"><code>Salut[Num,Y].Y:=Y1;</code></li>
<li class="tab5 even"><code>Salut[Num,Y].NX:=Random(100);</code></li>
<li class="tab5 odd"><code>Salut[Num,Y].NY:=Random(100);</code></li>
<li class="tab4 even"><code>End;</code></li>
<li class="tab3 odd"><code>End;</code></li>
<li class="tab0 even"><code>End;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>Procedure InitSalut;</code></li>
<li class="tab1 odd"><code>var X:Word;</code></li>
<li class="tab0 even"><code>Begin</code></li>
<li class="tab1 odd"><code>RandomiZe;</code></li>
<li class="tab1 even"><code>For X:=1 to 10 do InitSalutNum(X);</code></li>
<li class="tab0 odd"><code>End;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>Procedure GetSalut;</code></li>
<li class="tab1 even"><code>var I,J,X,Y:Word;</code></li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab1 even"><code>For J:=1 to 10 do</code></li>
<li class="tab2 odd"><code>For I:=1 to 40 do</code></li>
<li class="tab3 even"><code>Begin</code></li>
<li class="tab4 odd"><code>SalDown[J]:=SalDown[J]+0.0002;</code></li>
<li class="tab4 even"><code>SalTimer[J]:=SalTimer[J]+1;</code></li>
<li class="tab4 odd"><code>If SalTimer[J]&gt;15000 then InitSalutNum(J);</code></li>
<li class="tab4 even"><code>Salut[J,I].X:=Salut[J,I].X+(Salut[J,I].NX/100)-0.5;</code></li>
<li class="tab4 odd"><code>Salut[J,I].Y:=Salut[J,I].Y+(Salut[J,I].NY/100)-1+Sqrt(SalDown[J]);</code></li>
<li class="tab4 even"><code>Plot(round(Salut[J,I].X),round(Salut[J,I].Y),SalColor[J]);</code></li>
<li class="tab4 odd"><code>Plot(round(Salut[J,I].X+1),round(Salut[J,I].Y),SalColor[J]);</code></li>
<li class="tab3 even"><code>End;</code></li>
<li class="tab0 odd"><code>End;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>{######################### Инициализация мыши ###############################}</code></li>
<li class="tab0 even"><code>Procedure InitMouse;</code></li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab1 even"><code>asm</code></li>
<li class="tab3 odd"><code>mov   ax,0</code></li>
<li class="tab3 even"><code>int   33h</code></li>
<li class="tab3 odd"><code>mov   ax,4</code></li>
<li class="tab3 even"><code>xor   cx,cx</code></li>
<li class="tab3 odd"><code>xor   dx,dx</code></li>
<li class="tab3 even"><code>int   33h</code></li>
<li class="tab1 odd"><code>end;</code></li>
<li class="tab0 even"><code>End;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>{######################## Датчик движения мыши ##############################}</code></li>
<li class="tab0 odd"><code>Function MouseMove:Boolean;</code></li>
<li class="tab0 even"><code>var Q:Word;</code></li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab1 even"><code>asm</code></li>
<li class="tab3 odd"><code>mov   ax,3</code></li>
<li class="tab3 even"><code>int   33h</code></li>
<li class="tab3 odd"><code>or    bx,cx</code></li>
<li class="tab3 even"><code>or    bx,dx</code></li>
<li class="tab3 odd"><code>mov   [Q],bx</code></li>
<li class="tab1 even"><code>end;</code></li>
<li class="tab1 odd"><code>If Q&lt;&gt;0 then MouseMove:=True else MouseMove:=False;</code></li>
<li class="tab0 even"><code>End;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>Begin</code></li>
<li class="tab1 odd"><code>{Инициалтзация 320x200x24}</code></li>
<li class="tab1 even"><code>mVESAInit;If VesaError&lt;&gt;0 then mVesaErrorMessage;</code></li>
<li class="tab1 odd"><code>Mode:=mPutVesaMode(320,200,32);If Mode=0 then mVesaErrorMessage;</code></li>
<li class="tab1 even"><code>mSetVESAMode(Mode);If VesaError&lt;&gt;0 then mVesaErrorMessage;</code></li>
<li class="tab1 odd"><code>mSetVMemory;If VesaError&lt;&gt;0 then mVesaErrorMessage;</code></li>
<li class="tab1 even"><code>For X:=1 to 256000 do Scr[X]:=0;</code></li>
<li class="tab1 odd"><code>InitSalut;</code></li>
<li class="tab1 even"><code>InitMouse;</code></li>
<li class="tab1 odd"><code>Repeat</code></li>
<li class="tab2 even"><code>PrintBuf;</code></li>
<li class="tab2 odd"><code>GetSalut;</code></li>
<li class="tab2 even"><code>Blur;</code></li>
<li class="tab1 odd"><code>Until KeyPressed or MouseMove;</code></li>
<li class="tab1 even"><code>mSetVGAMode;</code></li>
<li class="tab1 odd"><code>WriteLn('¦ Coded by Mikhail Krivyy  1997');</code></li>
<li class="tab1 even"><code>WriteLn('  http://mikhail.krivyy.com/feedback/');</code></li>
<li class="tab0 odd"><code>End.</code></li>
</ol>
<p> <P><strong>Download this code:</strong> <a href="/wp-content/uploads/2006/09/salutss.pas">salutss.pas</a></li>
<h2>mvbe.pas</h2>
<ol class="codelist">
<li class="tab0 odd"><code>unit mVBE;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>interface</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>uses DPMILib;</code></li>
<li class="even">&nbsp;</li>
<li class="tab1 odd"><code>(* VBE info block structure *)</code></li>
<li class="tab0 even"><code>type  TVbeInfo = record</code></li>
<li class="tab14 odd"><code>VbeSignature       : DWord;</code></li>
<li class="tab14 even"><code>VbeVersion         : Word;</code></li>
<li class="tab14 odd"><code>OemStringPtr       : DWord;</code></li>
<li class="tab14 even"><code>Capabilities       : DWord;</code></li>
<li class="tab14 odd"><code>VideoModePtr       : DWord;</code></li>
<li class="tab14 even"><code>TotalMemory        : Word;</code></li>
<li class="tab14 odd"><code>OEMSoftwareRev     : Word;</code></li>
<li class="tab14 even"><code>OEMVendorNamePtr   : DWord;</code></li>
<li class="tab14 odd"><code>OEMProductNamePtr  : DWord;</code></li>
<li class="tab14 even"><code>OEMProductRevPtr   : DWord;</code></li>
<li class="tab14 odd"><code>Reserved           : array [0..221] of Byte;</code></li>
<li class="tab14 even"><code>OEMData            : array [0..255] of Byte;</code></li>
<li class="tab6 odd"><code>end;</code></li>
<li class="even">&nbsp;</li>
<li class="tab6 odd"><code>TVbeModeInfo = record</code></li>
<li class="tab14 even"><code>ModeAttributes     : Word;</code></li>
<li class="tab14 odd"><code>WinAAttributes     : Byte;</code></li>
<li class="tab14 even"><code>WinBAttributes     : Byte;</code></li>
<li class="tab14 odd"><code>WinGranularity     : Word;</code></li>
<li class="tab14 even"><code>WinSize            : Word;</code></li>
<li class="tab14 odd"><code>WinASegment        : Word;</code></li>
<li class="tab14 even"><code>WinBSegment        : Word;</code></li>
<li class="tab14 odd"><code>WinFuncPtr         : Pointer;</code></li>
<li class="tab14 even"><code>BytesPerScanLine   : Word;</code></li>
<li class="tab14 odd"><code>XResolution        : Word;</code></li>
<li class="tab14 even"><code>YResolution        : Word;</code></li>
<li class="tab14 odd"><code>XCharSize          : Byte;</code></li>
<li class="tab14 even"><code>YCharSize          : Byte;</code></li>
<li class="tab14 odd"><code>NumberOfPlanes     : Byte;</code></li>
<li class="tab14 even"><code>BitsPerPixel       : Byte;</code></li>
<li class="tab14 odd"><code>NumberOfBanks      : Byte;</code></li>
<li class="tab14 even"><code>MemoryModel        : Byte;</code></li>
<li class="tab14 odd"><code>BankSize           : Byte;</code></li>
<li class="tab14 even"><code>NumberOfImagePages : Byte;</code></li>
<li class="tab14 odd"><code>Reserved           : Byte;</code></li>
<li class="tab14 even"><code>RedMaskSize        : Byte;</code></li>
<li class="tab14 odd"><code>RedFieldPosition   : Byte;</code></li>
<li class="tab14 even"><code>GreenMaskSize      : Byte;</code></li>
<li class="tab14 odd"><code>GreenFieldPosition : Byte;</code></li>
<li class="tab14 even"><code>BlueMaskSize       : Byte;</code></li>
<li class="tab14 odd"><code>BlueFieldPosition  : Byte;</code></li>
<li class="tab14 even"><code>RsvdMaskSize       : Byte;</code></li>
<li class="tab14 odd"><code>RsvdFieldPosition  : Byte;</code></li>
<li class="tab14 even"><code>DirectColorModeInfo: Byte;</code></li>
<li class="tab14 odd"><code>PhysBasePtr        : DWord;</code></li>
<li class="tab14 even"><code>OffScreenMemOffset : DWord;</code></li>
<li class="tab14 odd"><code>OffScreenMemSize   : Word;</code></li>
<li class="tab14 even"><code>Reserved2          : Array [0..205] of Byte;</code></li>
<li class="tab9 odd"><code>end;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>var VesaError             :Byte;</code></li>
<li class="tab4 even"><code>Regs                  :TRmRegs;</code></li>
<li class="tab4 odd"><code>VESAInfo              :TVBEInfo;</code></li>
<li class="tab4 even"><code>VESAModeInfo          :TVBEModeInfo;</code></li>
<li class="tab4 odd"><code>VideoMem,VBE_VideoMem :DWord;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>Procedure mVESAInit;</code></li>
<li class="tab0 even"><code>Procedure mInitVESAMode(Mode:Word);</code></li>
<li class="tab0 odd"><code>Procedure mSetVESAMode(Mode:Word);</code></li>
<li class="tab0 even"><code>Procedure mSetVGAMode;</code></li>
<li class="tab0 odd"><code>Function  mPutVESAMode(X,Y,BPP:Word):Word;</code></li>
<li class="tab0 even"><code>Procedure mVesaErrorMessage;</code></li>
<li class="tab0 odd"><code>Procedure mSetVMemory;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>implementation</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>{ Инициализация VESA }</code></li>
<li class="tab0 even"><code>Procedure mVESAInit;</code></li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab2 even"><code>VesaError:=0;</code></li>
<li class="tab2 odd"><code>ClearRmRegs(Regs);</code></li>
<li class="tab2 even"><code>Regs.AX:=$4F00;</code></li>
<li class="tab2 odd"><code>Regs.ES:=Buf_16;</code></li>
<li class="tab2 even"><code>RealModeInt($10,Regs);</code></li>
<li class="tab2 odd"><code>Move(Pointer(Buf_32)^,VESAInfo,256);</code></li>
<li class="tab2 even"><code>if (Regs.AX&lt;&gt;$004F) or (VESAInfo.VbeSignature&lt;&gt;$41534556) then VesaError=1;</code></li>
<li class="tab0 odd"><code>End;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>{ Инициализация графического режима VESA }</code></li>
<li class="tab0 even"><code>Procedure mInitVESAMode(Mode:Word);</code></li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab2 even"><code>VesaError:=0;</code></li>
<li class="tab2 odd"><code>ClearRmRegs(Regs);</code></li>
<li class="tab2 even"><code>Regs.ES:=Buf_16;</code></li>
<li class="tab2 odd"><code>Regs.ax:=$4F01;</code></li>
<li class="tab2 even"><code>Regs.di:=$0000;</code></li>
<li class="tab2 odd"><code>Regs.cx:=Mode;</code></li>
<li class="tab2 even"><code>RealModeInt($10,Regs);</code></li>
<li class="tab2 odd"><code>Move(Pointer(Buf_32)^,VESAModeInfo,256);</code></li>
<li class="tab2 even"><code>if (Regs.AX&lt;&gt;$004F) or (VESAModeInfo.PhysBasePtr=0) then VESAError:=2;</code></li>
<li class="tab0 odd"><code>End;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>{ Установка графического режима VESA }</code></li>
<li class="tab0 even"><code>Procedure mSetVESAMode(Mode:Word);</code></li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab2 even"><code>VesaError:=0;</code></li>
<li class="tab2 odd"><code>ClearRmRegs(Regs);</code></li>
<li class="tab2 even"><code>Regs.AX:=$4F02;</code></li>
<li class="tab2 odd"><code>Regs.BX:=Mode;</code></li>
<li class="tab2 even"><code>RealModeInt($10,Regs);</code></li>
<li class="tab2 odd"><code>if (Regs.AX&lt;&gt;$004F) then VESAError:=3;</code></li>
<li class="tab0 even"><code>End;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>{ Установка стандартного режима EGA }</code></li>
<li class="tab0 odd"><code>Procedure mSetVGAMode;</code></li>
<li class="tab0 even"><code>Begin</code></li>
<li class="tab2 odd"><code>ClearRmRegs(Regs);</code></li>
<li class="tab2 even"><code>Regs.AX:=$0003;</code></li>
<li class="tab2 odd"><code>RealModeInt($10,Regs);</code></li>
<li class="tab0 even"><code>End;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>Function  mPutVESAMode(X,Y,BPP:Word):Word;</code></li>
<li class="tab1 odd"><code>var M:Word;</code></li>
<li class="tab0 even"><code>Begin</code></li>
<li class="tab1 odd"><code>For M:=$4100 to $4200 do</code></li>
<li class="tab2 even"><code>Begin</code></li>
<li class="tab3 odd"><code>mInitVESAMode(M);</code></li>
<li class="tab4 even"><code>If (VesaModeInfo.XResolution=X) and</code></li>
<li class="tab7 odd"><code>(VesaModeInfo.YResolution=Y) and</code></li>
<li class="tab7 even"><code>(VesaModeInfo.BitsPerPixel=BPP) and</code></li>
<li class="tab7 odd"><code>(VesaError=0) then mPutVESAMode:=M;</code></li>
<li class="tab2 even"><code>End;</code></li>
<li class="tab0 odd"><code>End;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>{ Вывод сообщения об ошибке }</code></li>
<li class="tab0 even"><code>Procedure mVesaErrorMessage;</code></li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab2 even"><code>mSetVGAMode;</code></li>
<li class="tab2 odd"><code>WriteLn('VesaError:',VesaError);</code></li>
<li class="tab2 even"><code>Halt(1);</code></li>
<li class="tab0 odd"><code>End;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>{ Узнаем логический адресс }</code></li>
<li class="tab0 even"><code>Procedure mSetVMemory;</code></li>
<li class="tab0 odd"><code>var Tmp1,Tmp2   :Word;</code></li>
<li class="tab0 even"><code>Begin</code></li>
<li class="tab2 odd"><code>Vbe_VideoMem:=MapPhysicalToLinear(VESAModeInfo.PhysBasePtr,4096*1024);</code></li>
<li class="tab2 even"><code>If Vbe_VideoMem=0 then VESAError=4;</code></li>
<li class="tab2 odd"><code>VideoMem:=Vbe_VideoMem;</code></li>
<li class="tab0 even"><code>End;</code></li>
<li class="tab0 odd"><code>end.</code></li>
</ol>
<p> <P><strong>Download this code:</strong> <a href="/wp-content/uploads/2006/09/mvbe.pas">mvbe.pas</a></li>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/1999/07/05/salute-pascal/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Плавный переход одного изображения в другое</title>
		<link>http://mikhail.krivyy.com/1999/06/22/two-pictures/</link>
		<comments>http://mikhail.krivyy.com/1999/06/22/two-pictures/#comments</comments>
		<pubDate>Tue, 22 Jun 1999 13:36:40 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Графика]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/2006/09/20/88/</guid>
		<description><![CDATA[Скачать в архиве (ZIP;317Kb); - DEMO.DESIGN (2:5032/7.32) -------------- DEMO.DESIGN - Msg : 1 из 59 Scn From : Lubarsky Oleg V. 2:5020/400 Срд 16 Июн 99 12:46 To : All Чтв 17 Июн 99 00:46 Subj : Re: Плавный переход одного изображения в другое. -------------------------------------------------------- From: &#34;Lubarsky Oleg V.&#34; &#60;drlove@impuls.zhitomir.ua&#62; &#160; AlexMc пишет в сообщении [...]]]></description>
			<content:encoded><![CDATA[<p><a id=p86 href="http://mikhail.krivyy.com/wp-content/uploads/2006/09/twopic.zip">Скачать в архиве</a> (ZIP;317Kb); </p>
<ol class="codelist">
<li class="tab0 odd"><code>- DEMO.DESIGN (2:5032/7.32) -------------- DEMO.DESIGN -</code></li>
<li class="tab1 even"><code>Msg  : 1 из 59                             Scn</code></li>
<li class="tab1 odd"><code>From : Lubarsky Oleg V.                    2:5020/400      Срд 16 Июн 99 12:46</code></li>
<li class="tab1 even"><code>To   : All                                                 Чтв 17 Июн 99 00:46</code></li>
<li class="tab1 odd"><code>Subj : Re: Плавный переход одного изображения в другое.</code></li>
<li class="tab0 even"><code>--------------------------------------------------------</code></li>
<li class="tab0 odd"><code>From: &quot;Lubarsky Oleg V.&quot; &lt;drlove@impuls.zhitomir.ua&gt;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>AlexMc пишет в сообщении &lt;929442601@p122.f98.n5055.z2.ftn&gt; ...</code></li>
<li class="tab0 even"><code>А&gt; В демах, (особенно на AMIGA) часто используется сабж.</code></li>
<li class="tab0 odd"><code>А&gt; Пpичем эффект такой: одно изобpажение постепенно гаснет,</code></li>
<li class="tab0 even"><code>А&gt; а дpугое пpоявляется.   Как сделать?</code></li>
<li class="tab0 odd"><code>Вариант 1:</code></li>
<li class="tab0 even"><code>Линейно интерполировать каждую компоненту (R1,G1,B1) цвета пиксела,</code></li>
<li class="tab0 odd"><code>одного изображения, в соответстующие ему (R2,G2,B2) другого изображения,</code></li>
<li class="tab0 even"><code>результат и тыкать на экран:</code></li>
<li class="tab0 odd"><code>R = R1 + k*(R2 - R1);</code></li>
<li class="tab0 even"><code>G = G1 + k*(G2 - G1);</code></li>
<li class="tab0 odd"><code>B = B1 + k*(B2 - B1);</code></li>
<li class="tab0 even"><code>0 &lt;= k &lt;= 1</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>Вариант 2:</code></li>
<li class="tab0 odd"><code>Рисовать вторую картинку поверх второй с использованием альфа-канала,</code></li>
<li class="tab0 even"><code>постепенно уменьшая прозрачность второго изображения.</code></li>
<li class="tab0 odd"><code>Что в принципе одно и тоже :)</code></li>
<li class="tab0 even"><code>Bye!</code></li>
<li class="tab32 odd"><code>Best regards, respectfully yours &lt;Dr.L0V&gt;...</code></li>
<li class="tab0 even"><code>--- ifmail v.2.14dev3</code></li>
<li class="tab1 odd"><code>* Origin: Unknown (2:5020/400)</code></li>
<li class="even">&nbsp;</li>
</ol>
<p> <P><strong>Download this code:</strong> <a href="/wp-content/uploads/2006/09/twopic.txt">twopic.txt</a></li>
<p><span id="more-88"></span><br />
Угораздило меня прочитать это сообщение&#8230;.ну не мог же я его оставить без внимания. Родилось вот это (<a href="http://www.tmt.com/">TMTPAS</a>): </p>
<p><H3>twopic.pas</H3></p>
<ol class="codelist">
<li class="tab0 odd"><code>program BLUR;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>uses Crt,mVBE;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>var Scr,Scr2              :Array[0..192000] of Byte;  {Виртуальный видео-буффер}</code></li>
<li class="tab4 even"><code>F                     :File;</code></li>
<li class="tab4 odd"><code>RSize,X               :DWord;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>Procedure Print2Buf(K:Word);   {Копирование виртуального видео-буфера в реальный}</code></li>
<li class="tab0 even"><code>var I,S:DWord;</code></li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab0 even"><code>{ R=R1+k*(R2-R1); }</code></li>
<li class="tab0 odd"><code>{ G=G1+k*(G2-G1); }</code></li>
<li class="tab0 even"><code>{ B=B1+k*(B2-B1); }</code></li>
<li class="tab0 odd"><code>{ 0&lt;=k&lt;=1 }</code></li>
<li class="tab0 even"><code>For I:=1 to 192000 do</code></li>
<li class="tab2 odd"><code>mem[VBE_VideoMem+I]:=Scr[I]+round(((Scr2[I]-Scr[I])*K) shr 8);</code></li>
<li class="tab0 even"><code>End;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>Begin</code></li>
<li class="tab1 odd"><code>{Инициалтзация 320x200x24}</code></li>
<li class="tab1 even"><code>mVESAInit;If VesaError&lt;&gt;0 then mVesaErrorMessage;</code></li>
<li class="tab1 odd"><code>mInitVESAMode($410F);If VesaError&lt;&gt;0 then mVesaErrorMessage;</code></li>
<li class="tab1 even"><code>mSetVESAMode($410F);If VesaError&lt;&gt;0 then mVesaErrorMessage;</code></li>
<li class="tab1 odd"><code>mSetVMemory;If VesaError&lt;&gt;0 then mVesaErrorMessage;</code></li>
<li class="tab1 even"><code>{Чтение BMP'эхи}</code></li>
<li class="tab1 odd"><code>Assign(F,'april.bmp');</code></li>
<li class="tab1 even"><code>Reset(F);</code></li>
<li class="tab1 odd"><code>Seek(F,54);</code></li>
<li class="tab1 even"><code>BlockRead(F,Scr,192000,RSize);</code></li>
<li class="tab1 odd"><code>Close(F);</code></li>
<li class="tab1 even"><code>{Чтение BMP'эхи}</code></li>
<li class="tab1 odd"><code>Assign(F,'february.bmp');</code></li>
<li class="tab1 even"><code>Reset(F);</code></li>
<li class="tab1 odd"><code>Seek(F,54);</code></li>
<li class="tab1 even"><code>BlockRead(F,Scr2,192000,RSize);</code></li>
<li class="tab1 odd"><code>Close(F);</code></li>
<li class="tab1 even"><code>Print2Buf(1);</code></li>
<li class="tab1 odd"><code>ReadKey;</code></li>
<li class="tab1 even"><code>X:=1;</code></li>
<li class="tab1 odd"><code>Repeat</code></li>
<li class="tab2 even"><code>Print2Buf(X);</code></li>
<li class="tab2 odd"><code>X:=X+1;</code></li>
<li class="tab1 even"><code>Until (Keypressed) or (X&gt;255);</code></li>
<li class="tab1 odd"><code>ReadKey;</code></li>
<li class="tab1 even"><code>mSetVGAMode;</code></li>
<li class="tab1 odd"><code>WriteLn(' ¦ Coded by Misha Krivij  1999');</code></li>
<li class="tab0 even"><code>End.</code></li>
</ol>
<p> <P><strong>Download this code:</strong> <a href="/wp-content/uploads/2006/09/twopic.pas">twopic.pas</a></li>
<p><H3>mvbe.pas</H3></p>
<ol class="codelist">
<li class="tab0 odd"><code>unit mVBE;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>interface</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>uses DPMILib;</code></li>
<li class="even">&nbsp;</li>
<li class="tab1 odd"><code>(* VBE info block structure *)</code></li>
<li class="tab0 even"><code>type  TVbeInfo = record</code></li>
<li class="tab14 odd"><code>VbeSignature       : DWord;</code></li>
<li class="tab14 even"><code>VbeVersion         : Word;</code></li>
<li class="tab14 odd"><code>OemStringPtr       : DWord;</code></li>
<li class="tab14 even"><code>Capabilities       : DWord;</code></li>
<li class="tab14 odd"><code>VideoModePtr       : DWord;</code></li>
<li class="tab14 even"><code>TotalMemory        : Word;</code></li>
<li class="tab14 odd"><code>OEMSoftwareRev     : Word;</code></li>
<li class="tab14 even"><code>OEMVendorNamePtr   : DWord;</code></li>
<li class="tab14 odd"><code>OEMProductNamePtr  : DWord;</code></li>
<li class="tab14 even"><code>OEMProductRevPtr   : DWord;</code></li>
<li class="tab14 odd"><code>Reserved           : array [0..221] of Byte;</code></li>
<li class="tab14 even"><code>OEMData            : array [0..255] of Byte;</code></li>
<li class="tab6 odd"><code>end;</code></li>
<li class="even">&nbsp;</li>
<li class="tab6 odd"><code>TVbeModeInfo = record</code></li>
<li class="tab14 even"><code>ModeAttributes     : Word;</code></li>
<li class="tab14 odd"><code>WinAAttributes     : Byte;</code></li>
<li class="tab14 even"><code>WinBAttributes     : Byte;</code></li>
<li class="tab14 odd"><code>WinGranularity     : Word;</code></li>
<li class="tab14 even"><code>WinSize            : Word;</code></li>
<li class="tab14 odd"><code>WinASegment        : Word;</code></li>
<li class="tab14 even"><code>WinBSegment        : Word;</code></li>
<li class="tab14 odd"><code>WinFuncPtr         : Pointer;</code></li>
<li class="tab14 even"><code>BytesPerScanLine   : Word;</code></li>
<li class="tab14 odd"><code>XResolution        : Word;</code></li>
<li class="tab14 even"><code>YResolution        : Word;</code></li>
<li class="tab14 odd"><code>XCharSize          : Byte;</code></li>
<li class="tab14 even"><code>YCharSize          : Byte;</code></li>
<li class="tab14 odd"><code>NumberOfPlanes     : Byte;</code></li>
<li class="tab14 even"><code>BitsPerPixel       : Byte;</code></li>
<li class="tab14 odd"><code>NumberOfBanks      : Byte;</code></li>
<li class="tab14 even"><code>MemoryModel        : Byte;</code></li>
<li class="tab14 odd"><code>BankSize           : Byte;</code></li>
<li class="tab14 even"><code>NumberOfImagePages : Byte;</code></li>
<li class="tab14 odd"><code>Reserved           : Byte;</code></li>
<li class="tab14 even"><code>RedMaskSize        : Byte;</code></li>
<li class="tab14 odd"><code>RedFieldPosition   : Byte;</code></li>
<li class="tab14 even"><code>GreenMaskSize      : Byte;</code></li>
<li class="tab14 odd"><code>GreenFieldPosition : Byte;</code></li>
<li class="tab14 even"><code>BlueMaskSize       : Byte;</code></li>
<li class="tab14 odd"><code>BlueFieldPosition  : Byte;</code></li>
<li class="tab14 even"><code>RsvdMaskSize       : Byte;</code></li>
<li class="tab14 odd"><code>RsvdFieldPosition  : Byte;</code></li>
<li class="tab14 even"><code>DirectColorModeInfo: Byte;</code></li>
<li class="tab14 odd"><code>PhysBasePtr        : DWord;</code></li>
<li class="tab14 even"><code>OffScreenMemOffset : DWord;</code></li>
<li class="tab14 odd"><code>OffScreenMemSize   : Word;</code></li>
<li class="tab14 even"><code>Reserved2          : Array [0..205] of Byte;</code></li>
<li class="tab9 odd"><code>end;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>var VesaError             :Byte;</code></li>
<li class="tab4 even"><code>Regs                  :TRmRegs;</code></li>
<li class="tab4 odd"><code>VESAInfo              :TVBEInfo;</code></li>
<li class="tab4 even"><code>VESAModeInfo          :TVBEModeInfo;</code></li>
<li class="tab4 odd"><code>VideoMem,VBE_VideoMem :DWord;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>Procedure mVESAInit;</code></li>
<li class="tab0 even"><code>Procedure mInitVESAMode(Mode:Word);</code></li>
<li class="tab0 odd"><code>Procedure mSetVESAMode(Mode:Word);</code></li>
<li class="tab0 even"><code>Procedure mSetVGAMode;</code></li>
<li class="tab0 odd"><code>Function  mPutVESAMode(X,Y,BPP:Word):Word;</code></li>
<li class="tab0 even"><code>Procedure mVesaErrorMessage;</code></li>
<li class="tab0 odd"><code>Procedure mSetVMemory;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>implementation</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>{ Инициализация VESA }</code></li>
<li class="tab0 even"><code>Procedure mVESAInit;</code></li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab2 even"><code>VesaError:=0;</code></li>
<li class="tab2 odd"><code>ClearRmRegs(Regs);</code></li>
<li class="tab2 even"><code>Regs.AX:=$4F00;</code></li>
<li class="tab2 odd"><code>Regs.ES:=Buf_16;</code></li>
<li class="tab2 even"><code>RealModeInt($10,Regs);</code></li>
<li class="tab2 odd"><code>Move(Pointer(Buf_32)^,VESAInfo,256);</code></li>
<li class="tab2 even"><code>if (Regs.AX&lt;&gt;$004F) or (VESAInfo.VbeSignature&lt;&gt;$41534556) then VesaError=1;</code></li>
<li class="tab0 odd"><code>End;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>{ Инициализация графического режима VESA }</code></li>
<li class="tab0 even"><code>Procedure mInitVESAMode(Mode:Word);</code></li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab2 even"><code>VesaError:=0;</code></li>
<li class="tab2 odd"><code>ClearRmRegs(Regs);</code></li>
<li class="tab2 even"><code>Regs.ES:=Buf_16;</code></li>
<li class="tab2 odd"><code>Regs.ax:=$4F01;</code></li>
<li class="tab2 even"><code>Regs.di:=$0000;</code></li>
<li class="tab2 odd"><code>Regs.cx:=Mode;</code></li>
<li class="tab2 even"><code>RealModeInt($10,Regs);</code></li>
<li class="tab2 odd"><code>Move(Pointer(Buf_32)^,VESAModeInfo,256);</code></li>
<li class="tab2 even"><code>if (Regs.AX&lt;&gt;$004F) or (VESAModeInfo.PhysBasePtr=0) then VESAError:=2;</code></li>
<li class="tab0 odd"><code>End;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>{ Установка графического режима VESA }</code></li>
<li class="tab0 even"><code>Procedure mSetVESAMode(Mode:Word);</code></li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab2 even"><code>VesaError:=0;</code></li>
<li class="tab2 odd"><code>ClearRmRegs(Regs);</code></li>
<li class="tab2 even"><code>Regs.AX:=$4F02;</code></li>
<li class="tab2 odd"><code>Regs.BX:=Mode;</code></li>
<li class="tab2 even"><code>RealModeInt($10,Regs);</code></li>
<li class="tab2 odd"><code>if (Regs.AX&lt;&gt;$004F) then VESAError:=3;</code></li>
<li class="tab0 even"><code>End;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>{ Установка стандартного режима EGA }</code></li>
<li class="tab0 odd"><code>Procedure mSetVGAMode;</code></li>
<li class="tab0 even"><code>Begin</code></li>
<li class="tab2 odd"><code>ClearRmRegs(Regs);</code></li>
<li class="tab2 even"><code>Regs.AX:=$0003;</code></li>
<li class="tab2 odd"><code>RealModeInt($10,Regs);</code></li>
<li class="tab0 even"><code>End;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>Function  mPutVESAMode(X,Y,BPP:Word):Word;</code></li>
<li class="tab1 odd"><code>var M:Word;</code></li>
<li class="tab0 even"><code>Begin</code></li>
<li class="tab1 odd"><code>For M:=$4100 to $4200 do</code></li>
<li class="tab2 even"><code>Begin</code></li>
<li class="tab3 odd"><code>mInitVESAMode(M);</code></li>
<li class="tab4 even"><code>If (VesaModeInfo.XResolution=X) and</code></li>
<li class="tab7 odd"><code>(VesaModeInfo.YResolution=Y) and</code></li>
<li class="tab7 even"><code>(VesaModeInfo.BitsPerPixel=BPP) and</code></li>
<li class="tab7 odd"><code>(VesaError=0) then mPutVESAMode:=M;</code></li>
<li class="tab2 even"><code>End;</code></li>
<li class="tab0 odd"><code>End;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>{ Вывод сообщения об ошибке }</code></li>
<li class="tab0 even"><code>Procedure mVesaErrorMessage;</code></li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab2 even"><code>mSetVGAMode;</code></li>
<li class="tab2 odd"><code>WriteLn('VesaError:',VesaError);</code></li>
<li class="tab2 even"><code>Halt(1);</code></li>
<li class="tab0 odd"><code>End;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>{ Узнаем логический адресс }</code></li>
<li class="tab0 even"><code>Procedure mSetVMemory;</code></li>
<li class="tab0 odd"><code>var Tmp1,Tmp2   :Word;</code></li>
<li class="tab0 even"><code>Begin</code></li>
<li class="tab2 odd"><code>Vbe_VideoMem:=MapPhysicalToLinear(VESAModeInfo.PhysBasePtr,4096*1024);</code></li>
<li class="tab2 even"><code>If Vbe_VideoMem=0 then VESAError=4;</code></li>
<li class="tab2 odd"><code>VideoMem:=Vbe_VideoMem;</code></li>
<li class="tab0 even"><code>End;</code></li>
<li class="tab0 odd"><code>end.</code></li>
</ol>
<p> <P><strong>Download this code:</strong> <a href="/wp-content/uploads/2006/09/mvbe.pas">mvbe.pas</a></li>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/1999/06/22/two-pictures/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Крутилки-вращалки</title>
		<link>http://mikhail.krivyy.com/1999/03/25/bmp-vesa-view/</link>
		<comments>http://mikhail.krivyy.com/1999/03/25/bmp-vesa-view/#comments</comments>
		<pubDate>Thu, 25 Mar 1999 16:36:02 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Графика]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/1999/03/25/bmp-vesa-view/</guid>
		<description><![CDATA[Тут приведены исходники всяких крутилок-вращалок. Написано очень давно, с целью разобраться с языком СИ. Достаточно красивый эффект получается если экспериментировать с вращаемым изображением. В архиве находятся файлы rotate1.cpp-rotate6.cpp. Здесь приведены лишь два последних. Rotate5.cpp написан на СИ, а в rotate6.cpp внутренний цикл на ассемблере &#8212; разница в скорости очевидна. Скриншот rotate4.cpp #include &#60;stdio.h&#62; #include &#60;conio.h&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Тут приведены исходники всяких крутилок-вращалок. Написано очень давно, с целью разобраться с языком СИ. Достаточно красивый эффект получается если экспериментировать с вращаемым изображением.
</p>
<p>В <a id=p115 href="http://mikhail.krivyy.com/wp-content/uploads/2006/09/rotate.zip">архиве</a> находятся файлы rotate1.cpp-rotate6.cpp. Здесь приведены лишь два последних. Rotate5.cpp написан на СИ, а в rotate6.cpp внутренний цикл на ассемблере &#8212; разница в скорости очевидна. </p>
<p><center><img id="image116" alt=11.jpg src="http://mikhail.krivyy.com/wp-content/uploads/2006/09/11.jpg" /><br />Скриншот</center></p>
<p><span id="more-119"></span></p>
<h2>rotate4.cpp</h2>
<ol class="codelist">
<li class="tab0 odd"><code>#include &lt;stdio.h&gt;</code></li>
<li class="tab0 even"><code>#include &lt;conio.h&gt;</code></li>
<li class="tab0 odd"><code>#include &lt;alloc.h&gt;</code></li>
<li class="tab0 even"><code>#include &lt;process.h&gt;</code></li>
<li class="tab0 odd"><code>#include &lt;math.h&gt;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>//################### Изменить один цвет палитры ############################</code></li>
<li class="tab0 even"><code>void palette(unsigned char N,unsigned int R,unsigned int G,unsigned int B)</code></li>
<li class="tab1 odd"><code>{</code></li>
<li class="tab2 even"><code>asm {</code></li>
<li class="tab1 odd"><code>mov     al, [N]</code></li>
<li class="tab1 even"><code>mov     dx, 0x3C8</code></li>
<li class="tab1 odd"><code>out     dx, al</code></li>
<li class="tab1 even"><code>inc     dx         //DX = 3C9h (Pal DATA REG)</code></li>
<li class="tab1 odd"><code>mov     ax, [R]</code></li>
<li class="tab1 even"><code>out     dx, al     //красная составляющая</code></li>
<li class="tab1 odd"><code>mov     ax, [G]</code></li>
<li class="tab1 even"><code>out     dx, al     //зеленая составляющая</code></li>
<li class="tab1 odd"><code>mov     ax, [B]</code></li>
<li class="tab8 even"><code>out     dx, al     //синяя составляющая</code></li>
<li class="tab6 odd"><code>}</code></li>
<li class="tab1 even"><code>}</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>void PutPixel(unsigned int X,unsigned int Y,unsigned char Color)</code></li>
<li class="tab1 odd"><code>{</code></li>
<li class="tab2 even"><code>asm {</code></li>
<li class="tab8 odd"><code>mov     ax, [Y]</code></li>
<li class="tab1 even"><code>mov     dx, 320</code></li>
<li class="tab8 odd"><code>imul    dx</code></li>
<li class="tab8 even"><code>add     ax, [X]</code></li>
<li class="tab8 odd"><code>mov     di, ax</code></li>
<li class="tab8 even"><code>push    es</code></li>
<li class="tab8 odd"><code>mov     ax, 0xA000</code></li>
<li class="tab8 even"><code>mov     es, ax</code></li>
<li class="tab8 odd"><code>mov     al,[Color]</code></li>
<li class="tab8 even"><code>stosb</code></li>
<li class="tab8 odd"><code>pop     es</code></li>
<li class="tab6 even"><code>}</code></li>
<li class="tab1 odd"><code>}</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>void main(void)</code></li>
<li class="tab1 even"><code>{</code></li>
<li class="tab2 odd"><code>FILE     *file1;</code></li>
<li class="tab2 even"><code>char     *str;</code></li>
<li class="tab2 odd"><code>char     *filename;</code></li>
<li class="tab2 even"><code>int      I,J,I1,J1;</code></li>
<li class="tab2 odd"><code>int      X,Y,Z,size;</code></li>
<li class="tab2 even"><code>float    A,sina,cosa;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab2 even"><code>filename=&quot;A.BMP&quot;;</code></li>
<li class="tab2 odd"><code>if ((str = (char *) malloc(10000)) == NULL) printf(&quot;Память у вас скончалась :(((\n&quot;);</code></li>
<li class="tab2 even"><code>if ((file1 = fopen(filename,&quot;rb&quot;)) == NULL) fprintf(stderr,&quot;Файл не найден :((((&quot;);</code></li>
<li class="tab2 odd"><code>size=fread(str,54,1,file1);</code></li>
<li class="tab2 even"><code>size=fread(str,1024,1,file1);</code></li>
<li class="tab2 odd"><code>asm   mov     ax,0x0013</code></li>
<li class="tab2 even"><code>asm   int     0x10</code></li>
<li class="tab2 odd"><code>for (I=0;I&lt;256;I++) palette(I,str[I*4+2]&gt;&gt;2,str[I*4+1]&gt;&gt;2,str[I*4+0]&gt;&gt;2);</code></li>
<li class="tab2 even"><code>size=(fread(str,1,10000,file1));</code></li>
<li class="tab2 odd"><code>fclose(file1);</code></li>
<li class="tab2 even"><code>A=0;</code></li>
<li class="tab2 odd"><code>do</code></li>
<li class="tab2 even"><code>{</code></li>
<li class="tab2 odd"><code>for (I=0;I&lt;100;I++)</code></li>
<li class="tab3 even"><code>{</code></li>
<li class="tab4 odd"><code>for (J=0;J&lt;100;J++)</code></li>
<li class="tab5 even"><code>{</code></li>
<li class="tab6 odd"><code>I1=I-50;</code></li>
<li class="tab6 even"><code>J1=J-50;</code></li>
<li class="tab6 odd"><code>sina=sin(A);</code></li>
<li class="tab6 even"><code>cosa=1-tan(A)-sina;</code></li>
<li class="tab6 odd"><code>X=100+I1*sina-J1*cosa;</code></li>
<li class="tab6 even"><code>Y=100+I1*cosa+J1*sina;</code></li>
<li class="tab6 odd"><code>Z=0;</code></li>
<li class="tab6 even"><code>if ((X&lt;320) &amp;&amp; (Y&lt;200) &amp;&amp; (X&gt;1) &amp;&amp; (Y&gt;1)) PutPixel(X+Z,Y+Z,str[J*100+I]);</code></li>
<li class="tab5 odd"><code>}</code></li>
<li class="tab3 even"><code>}</code></li>
<li class="tab3 odd"><code>A=A+0.017;</code></li>
<li class="tab2 even"><code>}</code></li>
<li class="tab2 odd"><code>while (!kbhit());</code></li>
<li class="tab2 even"><code>asm mov     ax,0x0003</code></li>
<li class="tab2 odd"><code>asm int     0x10</code></li>
<li class="even">&nbsp;</li>
<li class="tab2 odd"><code>free(str);</code></li>
<li class="tab1 even"><code>}</code></li>
</ol>
<p> <P><strong>Download this code:</strong> <a href="/wp-content/uploads/2006/09/rotate4.cpp">rotate4.cpp</a></li>
<h2>rotate5.cpp</h2>
<ol class="codelist">
<li class="tab0 odd"><code>#include &lt;stdio.h&gt;</code></li>
<li class="tab0 even"><code>#include &lt;conio.h&gt;</code></li>
<li class="tab0 odd"><code>#include &lt;alloc.h&gt;</code></li>
<li class="tab0 even"><code>#include &lt;process.h&gt;</code></li>
<li class="tab0 odd"><code>#include &lt;math.h&gt;</code></li>
<li class="tab0 even"><code>#include &lt;dos.h&gt;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>//################### Изменить один цвет палитры ############################</code></li>
<li class="tab0 odd"><code>void palette(unsigned char N,unsigned int R,unsigned int G,unsigned int B)</code></li>
<li class="tab1 even"><code>{</code></li>
<li class="tab2 odd"><code>asm {</code></li>
<li class="tab1 even"><code>mov     al, [N]</code></li>
<li class="tab1 odd"><code>mov     dx, 0x3C8</code></li>
<li class="tab1 even"><code>out     dx, al</code></li>
<li class="tab1 odd"><code>inc     dx         //DX = 3C9h (Pal DATA REG)</code></li>
<li class="tab1 even"><code>mov     ax, [R]</code></li>
<li class="tab1 odd"><code>out     dx, al     //красная составляющая</code></li>
<li class="tab1 even"><code>mov     ax, [G]</code></li>
<li class="tab1 odd"><code>out     dx, al     //зеленая составляющая</code></li>
<li class="tab1 even"><code>mov     ax, [B]</code></li>
<li class="tab1 odd"><code>out     dx, al     //синяя составляющая</code></li>
<li class="tab6 even"><code>}</code></li>
<li class="tab1 odd"><code>}</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>void main(void)</code></li>
<li class="tab1 even"><code>{</code></li>
<li class="tab2 odd"><code>FILE     *file1;</code></li>
<li class="tab2 even"><code>char     Color;</code></li>
<li class="tab2 odd"><code>char     *str;</code></li>
<li class="tab2 even"><code>char     *filename;</code></li>
<li class="tab2 odd"><code>int      I,J,I1,J1,DDX,DDY;</code></li>
<li class="tab2 even"><code>int      X,Y,Z,size,deltaX,deltaY;</code></li>
<li class="tab2 odd"><code>float    A,sina,cosa;</code></li>
<li class="even">&nbsp;</li>
<li class="tab2 odd"><code>filename=&quot;A.BMP&quot;;</code></li>
<li class="tab2 even"><code>if ((str = (char *) malloc(10000)) == NULL) printf(&quot;Память у вас скончалась :(((\n&quot;);</code></li>
<li class="tab2 odd"><code>if ((file1 = fopen(filename,&quot;rb&quot;)) == NULL) fprintf(stderr,&quot;Файл не найден :((((&quot;);</code></li>
<li class="tab2 even"><code>fread(str,54,1,file1);</code></li>
<li class="tab2 odd"><code>fread(str,1024,1,file1);</code></li>
<li class="tab2 even"><code>asm   mov     ax,0x0013</code></li>
<li class="tab2 odd"><code>asm   int     0x10</code></li>
<li class="tab2 even"><code>for (I=0;I&lt;256;I++) palette(I,str[I*4+2]&gt;&gt;2,str[I*4+1]&gt;&gt;2,str[I*4+0]&gt;&gt;2);</code></li>
<li class="tab2 odd"><code>fread(str,1,10000,file1);</code></li>
<li class="tab2 even"><code>fclose(file1);</code></li>
<li class="tab2 odd"><code>deltaY=100;</code></li>
<li class="tab2 even"><code>deltaX=100;</code></li>
<li class="tab2 odd"><code>DDX=1;</code></li>
<li class="tab2 even"><code>DDY=1;</code></li>
<li class="tab2 odd"><code>A=0;</code></li>
<li class="tab2 even"><code>do</code></li>
<li class="tab2 odd"><code>{</code></li>
<li class="tab2 even"><code>sina=sin(A);</code></li>
<li class="tab2 odd"><code>cosa=1-tan(A)-sin(A);</code></li>
<li class="tab2 even"><code>for (I=0;I&lt;100;I++)</code></li>
<li class="tab3 odd"><code>{</code></li>
<li class="tab4 even"><code>for (J=0;J&lt;100;J++)</code></li>
<li class="tab5 odd"><code>{</code></li>
<li class="tab6 even"><code>I1=I-50;</code></li>
<li class="tab6 odd"><code>J1=J-50;</code></li>
<li class="tab6 even"><code>X=I1*sina-J1*cosa;</code></li>
<li class="tab6 odd"><code>Y=I1*cosa+J1*sina;</code></li>
<li class="tab6 even"><code>Color=str[J*100+I];</code></li>
<li class="tab6 odd"><code>asm {</code></li>
<li class="tab1 even"><code>mov     ax, [Y]</code></li>
<li class="tab1 odd"><code>add	ax, [deltaX]</code></li>
<li class="tab1 even"><code>or	ax, ax</code></li>
<li class="tab1 odd"><code>jl	NoPlot;</code></li>
<li class="tab1 even"><code>cmp	ax, 200</code></li>
<li class="tab1 odd"><code>jg      NoPlot;</code></li>
<li class="tab1 even"><code>mov     dx, 320</code></li>
<li class="tab1 odd"><code>imul    dx</code></li>
<li class="tab1 even"><code>mov     dx, [X]</code></li>
<li class="tab1 odd"><code>add	dx, [deltaY]</code></li>
<li class="tab1 even"><code>or	dx, dx</code></li>
<li class="tab1 odd"><code>jl	NoPlot;</code></li>
<li class="tab1 even"><code>cmp	dx, 319</code></li>
<li class="tab1 odd"><code>jg      NoPlot;</code></li>
<li class="tab1 even"><code>add     ax, dx</code></li>
<li class="tab1 odd"><code>mov     di, ax</code></li>
<li class="tab1 even"><code>push    es</code></li>
<li class="tab1 odd"><code>mov     ax, 0xA000</code></li>
<li class="tab1 even"><code>mov     es, ax</code></li>
<li class="tab1 odd"><code>mov     al,[Color]</code></li>
<li class="tab1 even"><code>mov	[es:di],al</code></li>
<li class="tab1 odd"><code>pop     es</code></li>
<li class="tab3 even"><code>}</code></li>
<li class="tab0 odd"><code>NoPlot:</code></li>
<li class="tab5 even"><code>}</code></li>
<li class="tab3 odd"><code>}</code></li>
<li class="tab3 even"><code>A=A+0.02;</code></li>
<li class="tab3 odd"><code>deltaX=deltaX+DDX;</code></li>
<li class="tab3 even"><code>deltaY=deltaY+DDY;</code></li>
<li class="tab3 odd"><code>if (deltaX&gt;150) DDX=-1;</code></li>
<li class="tab3 even"><code>if (deltaY&gt;270) DDY=-1;</code></li>
<li class="tab3 odd"><code>if (deltaX&lt;50) DDX=1;</code></li>
<li class="tab3 even"><code>if (deltaY&lt;50) DDY=1;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab2 even"><code>}</code></li>
<li class="tab2 odd"><code>while (!kbhit());</code></li>
<li class="even">&nbsp;</li>
<li class="tab2 odd"><code>asm mov     ax,0x0003</code></li>
<li class="tab2 even"><code>asm int     0x10</code></li>
<li class="odd">&nbsp;</li>
<li class="tab2 even"><code>free(str);</code></li>
<li class="tab1 odd"><code>}</code></li>
</ol>
<p> <P><strong>Download this code:</strong> <a href="/wp-content/uploads/2006/09/rotate5.cpp">rotate5.cpp</a></li>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/1999/03/25/bmp-vesa-view/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

