Стэн Трухильо - Графика для Windows средствами DirectDraw

Здесь есть возможность читать онлайн «Стэн Трухильо - Графика для Windows средствами DirectDraw» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Графика для Windows средствами DirectDraw: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Графика для Windows средствами DirectDraw»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Графика для Windows средствами DirectDraw — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Графика для Windows средствами DirectDraw», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Но перед тем, как переходить к функции BltSurface(), мы закончим рассмотрение функции DrawScene(). Она завершается вызовом функции Flip(). При этом происходит переключение страниц, и подготовленный нами кадр отображается на экране. Функция Flip()получает два аргумента: указатель на поверхность и переменную типа DWORD, предназначенную для установки флагов. Указатель на поверхность необходим лишь в нестандартных ситуациях, когда в переключении поверхностей участвует несколько вторичных буферов. Второй аргумент обычно содержит флаг DDFLIP_WAIT, показывающий, что возврат из функции должен происходить только после того, как переключение страниц завершится.

Функция BltSurface()

Функция BltSurface()класса DirectDrawWinоказывается более гибкой и удобной по сравнению с функциями DirectDrawSurface::Blt()и BltFast(). Мы уже видели, как BltSurface()используется внутри функции BounceWin::DrawScene(), а сейчас рассмотрим саму функцию.

Функция BltSurface()требует передачи четырех аргументов, а пятый аргумент необязателен. Первые два аргумента представляют собой указатели на поверхности — источник и приемник. Следующие два аргумента — координаты x и y, определяющие положение копируемой области на приемнике. По умолчанию блиттинг выполняется без цветовых ключей, однако их можно активизировать с помощью необязательного пятого параметра. Код функции BltSurface()приведен в листинге 3.3.

Листинг 3.3. Функция BltSurface()

BOOL DirectDrawWin::BltSurface(LPDIRECTDRAWSURFACE destsurf, LPDIRECTDRAWSURFACE srcsurf, int x, int y, BOOL srccolorkey) {

if (destsurf==0 || srcsurf==0) return FALSE;

BOOL use_fastblt=TRUE;

DDSURFACEDESC destsurfdesc;

ZeroMemory(&destsurfdesc, sizeof(destsurfdesc));

destsurfdesc.dwSize = sizeof(destsurfdesc);

destsurf->GetSurfaceDesc(&destsurfdesc);

CRect destrect;

destrect.left=0;

destrect.top=0;

destrect.right=destsurfdesc.dwWidth;

destrect.bottom=destsurfdesc.dwHeight;

DDSURFACEDESC srcsurfdesc;

ZeroMemory(&srcsurfdesc, sizeof(srcsurfdesc));

srcsurfdesc.dwSize = sizeof(srcsurfdesc);

srcsurf->GetSurfaceDesc(&srcsurfdesc);

CRect srcrect;

srcrect.left=0;

srcrect.top=0;

srcrect.right=srcsurfdesc.dwWidth;

srcrect.bottom=srcsurfdesc.dwHeight;

// Проверить, нужно ли что-нибудь делать...

if (x+srcrect.left>=destrect.right) return FALSE;

if (y+srcrect.top>=destrect.bottom) return FALSE;

if (x+srcrect.right<=destrect.left) return FALSE;

if (y+srcrect.bottom<=destrect.top) return FALSE;

// При необходимости выполнить отсечение

// для прямоугольной области источника

if (x+srcrect.right>destrect.right) srcrect.right-=x+srcrect.right-destrect.right;

if (y+srcrect.bottom>destrect.bottom) srcrect.bottom-=y+srcrect.bottom-destrect.bottom;

CRect dr;

if (x<0) {

srcrect.left=-x;

x=0;

dr.left=x;

dr.top=y;

dr.right=x+srcrect.Width();

dr.bottom=y+srcrect.Height();

use_fastblt=FALSE;

}

if (y<0) {

srcrect.top=-y;

y=0;

dr.left=x;

dr.top=y;

dr.right=x+srcrect.Width();

dr.bottom=y+srcrect.Height();

use_fastblt=FALSE;

}

DWORD flags;

if (use_fastblt) {

flags=DDBLTFAST_WAIT;

if (srccolorkey) flags |= DDBLTFAST_SRCCOLORKEY;

destsurf->BltFast(x, y, srcsurf, &srcrect, flags);

} else {

flags=DDBLT_WAIT;

if (srccolorkey) flags |= DDBLT_KEYSRC;

destsurf->Blt(&dr, srcsurf, &srcrect, flags, 0);

}

return TRUE;

}

Сначала функция BltSurface()проверяет указатели на поверхности. Если хотя бы один из них равен нулю, функция возвращает FALSE, тем самым сообщая о неудаче. Если проверка прошла успешно, два объекта CRectинициализируются в соответствии с размерами поверхностей, полученными с помощью функции DirectDrawSurface::GetSurfaceDesc().

Затем BltSurface()проверяет, что попадает ли точка назначения в границы приемника. Если координаты xи yтаковы, что копия не пересекается с поверхностью приемника, блиттинг не нужен, поэтому мы просто выходим из функции.

Если же с точкой назначения все в порядке, функция проверяет, нужно ли выполнять отсечение. Если отсечение не требуется, блит-операция для достижения максимального быстродействия выполняется функцией BltFast(). Если отсечение все же необходимо, возможно, придется пользоваться функцией Blt().

Если отсечение выполняется по правому или нижнему краю источника, функция BltFast()справится с задачей и обрежет выступающую часть копируемой области. Если же отсечение происходит по верхнему или левому краю, приходится работать с функцией Blt(), потому что BltFast()не позволяет задать прямоугольную область приемника. После выполнения блиттинга BltSurface()возвращает TRUEкак признак успешного завершения.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Графика для Windows средствами DirectDraw»

Представляем Вашему вниманию похожие книги на «Графика для Windows средствами DirectDraw» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Графика для Windows средствами DirectDraw»

Обсуждение, отзывы о книге «Графика для Windows средствами DirectDraw» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x