161
правкаИзменения
AHI
,Добавил.. много..
С учётом сказанного, для наиболее эффективного использования средств, предоставляемых драйвером, их следует использовать в приложении, основанном на [[Task|таске]].
API драйвера напоминает интерфейсом обычные графические библиотеки, как например GDI. Рассмотрим основные понятия и приёмы работы с AHI в применении к эльфописанию.
Для обеспечения такой возможности используется специальный объект, с которым разработчику [[ELF|эльфа]] под драйвер придётся сталкиваться постоянно - это ''контекст устройства''.
'''Контекст устройства''' ({{lang-en|Device Context}}) — структура данных, обеспечивающая эксклюзивный доступ к устройству вывода для приложения, использующего эту структуру и предотвращающая влияние других приложений на процесс работы с устройством. В ней хранятся все данные о текущем состоянии устройства, устанавливаемом приложением - владельцем контекста.
Если бы небыло системы контекстов, и данные сразу попадали в устройство, то после установки '''Приложением B''' цвета в <font color="blue">синий</font>, '''Приложение A''' тоже бы получало <font color="blue">синие</font> линии вместо желаемых <font color="red">красных</font>.
В коде контекст описывается как тип <tt>'''AHIDEVCONTEXT_T'''</tt> и является первым параметром почти у всех функций AHI.
</li>
</ol>
=== Поверхности ===
Прежде чем переходить к рассмотрению непосредственно программирования под AHI, необходимо ознакомиться с ещё одним важнейшим понятием - "поверхностями".
Поверхность ({{lang-en|Surface}}, "Сурфейс") — логически выделенный участок [[Видеопамять|видеопамяти]] чипа ATI.
Как многим из вас известно, у видеочипов часто есть собственная видеопамять, причём эта видеопамять не обязательно доступна [[MCU|процессору]] напрмяую. В телефонах [[Motorola]] с чипами ATI именно такой случай.
Размер внутренней видеопамяти (располагается прямо на чипе) на [[W2250]] и [[W2260]] одинаков и составляет ''192Kb'', однако к [[W2260]] подключен внешний модуль для расширения внутренней видеопамяти. Последняя работает медленнее внутренней, что отчасти компенсируется её значительно большим объёмом.
[[MCU]] может обращаться к видеопамяти двумя способами - через [[DMAC]] (только запись), либо через [[QSPI]] (чтение и запись).
Все растровые операции AHI производятся с участием поверхностей. Есть четыре наиболее важные поверхности, используемые в работе драйвера. Однако, последняя фраза не означает, что поверхностей именно четыре, скорее следует понимать это как статусы, присваиваемые определённым поверхностям, и при этом одна и та же поверхность(участок памяти) может принимать одновременно несколько таких статусов:
*'''Отображаемая поверхность ("Display Surface", "Экранная поверхность", она же "Экранный буфер")
*:Это та поверхность, из которой в данный момент чип берёт информацию для непосредственного вывода на экран.
*:Устанавливается с помощью функции [[AhiDispSurfSet]], а получить можно с помощью [[AhiDispSurfGet]]
*'''Поверхность назначения ("Destination Surface", "Поверхность-приёмник")
*:Эта поверхность является целевой для функций рисования, тоесть в неё будет попадать результат операции.
*:Устанавливается функцией [[AhiDrawSurfDstSet]]
*'''Поверхность-источник ("Source Surface")
*:Эта поверхность является источником данных для функций рисования, например картинка спрайта, который мы хотим нарисовать.
*:Устанавливается функцией [[AhiDrawSurfSrcSet]]
*'''Поверхность кисти ("Brush Surface")
*:С этой поверхностью приложения никогда не работают напрямую, но о её существовании лучше знать, чтобы проще было понимать принцип работы некоторых функций рисования - она является важным вспомогательным инструментом. Всегда монохромная (однобитная).
*:Устанавливается и инициализируется самим драйвером.
=== Инициализация ===
Итак, у нас теперь есть контекст, полученный одним из двух способов, указанных выше. Что дальше?
Вне зависимости от того, собственный у нас контекст или нет, нужно провести его инициализацию. Различие лишь в том, что в случае собственного контекста её достаточно провести один раз, а в случае использования системного - почти каждый раз перед вызовом какой-либо функции рисования AHI.
Перед тем, как вызвать какую-либо функцию рисования, мы должны установить необходимые для её работы параметры:
<ol>
<li>'''Установить поверхность-приёмник<br>
Часто для этого используется отображаемая поверхность, если не планируется вывод с использованием [[Двойная буферизация|двойной буферизации]].
<pre>
// Наш контекст, полученный ранее
AHIDEVCONTEXT_T dCtx;
// Наша отображаемая поверхность
AHISURFACE_T sDisp;
// Получим отображаемую поверхность. Достаточно сделать это один раз, ведь врядли она поменяется.
AhiDispSurfGet( dCtx, &sDisp );
// Устанавливаем поверхность-приёмник
AhiDrawSurfDstSet( dCtx, sDisp, 0 );
</pre>
</li>
<li>'''Установить поверхность-источник<br>
Обычно для этой роли используют либо пользовательскую поверхность с нужной к выводу картинкой, либо системную внеэкранную поверхность (см. [[Двойная буферизация]]).
<pre>
// Сохраним сюда системную внеэкранную поверхность
AHISURFACE_T sDraw;
// Получим системную внеэкранную поверхность
sDraw = DAL_GetDrawingSurface( DISPLAY_MAIN );
// Устанавливаем поверхность-источник
AhiDrawSurfSrcSet( dCtx, sDraw, 0 );
</pre>
</li>
<li>'''Установить [[Clipping|области вырезания]] для приёмника и источника<br>
Пока что выключим их, и для этого передадим в функции [[AhiDrawClipDstSet]] и [[AhiDrawClipSrcSet]] - <tt>NULL</tt>:
<pre>
// Выключаем области вырезания для приёмника и источника
AhiDrawClipDstSet( dCtx, NULL );
AhiDrawClipSrcSet( dCtx, NULL );
</pre>
</li>
<li>'''Установить [[Raster Operations|растровую операцию]]<br>
Для вывода растровых изображений, установим <tt>SRCCOPY</tt>
<pre>
// Устанавливаем растровую операцию на прямое копирование из источника
AhiDrawRopSet( dCtx, AHIROP3(AHIROP_SRCCOPY) );
</pre>
</li>
</ol>
----
Пока что это всё, ждите продолжения :)
--[[Участник:Andy51|Andy51]] 1823:2942, 20 августа 2009 (MSD)
[[Категория:Эльфостроение]]