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

Тут можно читать онлайн Стэн Трухильо - Графика для Windows средствами DirectDraw - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Графика для Windows средствами DirectDraw
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    4.88/5. Голосов: 81
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 100
    • 1
    • 2
    • 3
    • 4
    • 5

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

Графика для Windows средствами DirectDraw - описание и краткое содержание, автор Стэн Трухильо, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

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

Графика для Windows средствами DirectDraw - читать книгу онлайн бесплатно, автор Стэн Трухильо
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Три следующие строки связаны с сокращением цветов. Мы вычисляем три величины (по одной для каждой цветовой составляющей), которые будут использоваться для обработки составляющих, полученных из буфера графических данных. Они зависят от количества бит в представлении каждой цветовой компоненты на поверхности (чаще всего 5 или 6 бит). Обратите внимание на то, что эти величины вычисляются за пределами цикла. Операция деления и вызов функции pow()внутри цикла могли бы существенно замедлить работу программы.

Назначение пикселей происходит во вложенном цикле. Внешний цикл перебирает строки пикселей, а внутренний задает значение для каждого пикселя строки. Внутренний цикл инициализирует два указателя, pixptrи triple, которые используются для обращения к текущему пикселю. Переменная pixptrуказывает на память поверхности, а triple- на буфер графических данных. Обратите внимание — pixptrобъявлен как указатель на 16-битный тип USHORT. В этом случае для перехода к следующему пикселю достаточно увеличить значение указателя. Аналогично tripleуказывает на 24-битный тип RGBTRIPLE.

Внутренний цикл извлекает три цветовые составляющие каждого пикселя и делит их на ранее вычисленную величину. Значения с плавающей точкой, использованные при вычислениях, преобразуются к целым и сдвигаются к нужной позиции в соответствии с переменными loREDbit, loGREENbitи loBLUEbit. Окончательный результат представляет собой тройку «урезанных» цветовых составляющих. Побитовый оператор ORупаковывает составляющие в единую величину, и результат заносится в память поверхности. Указатели pixptrи tripleинкрементируются для перехода к следующему пикселю.

24-битные поверхности

Мы рассмотрели доступ к 16-битным поверхностям, и все самое сложное осталось позади. Для 24- и 32-битных поверхностей сокращение цветов уже не требуется, поэтому вычислить значение пикселя оказывается проще. В основном нам нужно лишь извлечь цветовые составляющие и сдвинуть их в позицию, определяемую расположением и форматом пикселя. Для 24-битных поверхностей процесс можно оптимизировать, если формат пикселей поверхности совпадает с форматом пикселей BMP-файла. 24-битные поверхности обрабатываются функцией Copy_Bmp24_Surface24()(см. листинг 5.3).

Листинг 5.3. Функция Copy_Bmp24_Surface24()

BOOL DirectDrawWin::Copy_Bmp24_Surface24(LPDIRECTDRAWSURFACE surf, BYTE* bmpbuf, int w, int h) {

if (surf==0 || bmpbuf==0) return FALSE;

DDSURFACEDESC desc;

ZeroMemory(&desc, sizeof(desc));

desc.dwSize = sizeof(desc);

HRESULT r=surf->Lock(0, &desc, DDLOCK_WAIT | DDLOCK_WRITEONLY, 0);

if (r!=DD_OK) {

TRACE("Copy_Bmp24_Surface24: Lock() failed\n");

return FALSE;

}

int bytesrequired=w*3;

int bytesgiven=(bytesrequired+3) & ~3;

BYTE* surfbits = (BYTE*)desc.lpSurface;

BYTE* imagebits = (BYTE*)(&bmpbuf[(h-1)*bytesgiven]);

// Проверить, совпадает ли формат файла с форматом поверхности

// Если совпадает, пересылку можно ускорить функцией memcpy()

if (loREDbit==16 && loGREENbit==8 && loBLUEbit==0) {

TRACE("using optimized code...\n");

for (int i=0;i

memcpy(surfbits, imagebits, bytesrequired);

surfbits += desc.lPitch;

imagebits -= bytesgiven;

}

} else {

TRACE("not using optimated code...\n");

for(int i=0; i>h; i++) {

RGBTRIPLE* surf=(RGBTRIPLE*)surfbits;

RGBTRIPLE* image=(RGBTRIPLE*)imagebits;

for (int p=0;p

DWORD r=image->rgbtRed << loREDbit;

DWORD g=image->rgbtGreen << loGREENbit;

DWORD b=image->rgbtBlue << loBLUEbit;

DWORD* data=(DWORD*)surf;

*data = r|g|b;

surf++;

image++;

}

surfbits += desc.lPitch;

imagebits -= bytesgiven;

}

}

surf->Unlock(0);

return TRUE;

}

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

Неоптимизированный цикл похож на тот, что применялся для 16-битных поверхностей, но на этот раз нам не нужно выполнять сокращение цветов. Для доступа к поверхности и графическим данным используются два указателя, surfи image. Оба являются указателями на 24-битный тип RGBTRIPLE, что упрощает перебор 24-битных пикселей.

Каждая цветовая составляющая извлекается из буфера графических данных и сдвигается в соответствии со значением переменных loREDbit, loGREENbitи loBLUEbit. Затем компоненты объединяются и заносятся в память поверхности. Наконец, инкрементирование указателей surfи imageперемещает их к следующему пикселю.

32-битные поверхности

Последняя функция, Copy_Bmp24_Surface32(), предназначена для 32-битных поверхностей и очень напоминает функцию Copy_Bmp24_Surface24(). Если бы в 32-битной поверхности все 32 бита использовались для хранения цветовых составляющих, нам пришлось бы выполнять расширение цветов, но так как используется только 24 бита, в этом нет необходимости. Функция Copy_Bmp24_Surface32()приведена в листинге 5.4.

Листинг 5.4. Функция Copy_Bmp24_Surface32()

BOOL DirectDrawWin::Copy_Bmp24_Surface32(LPDIRECTDRAWSURFACE surf, BYTE* bmpbuf, int w, int h) {

if (surf==0 || bmpbuf==0) return FALSE;

DDSURFACEDESC desc;

ZeroMemory(&desc, sizeof(desc));

desc.dwSize = sizeof(desc);

HRESULT r=surf->Lock(0, &desc, DDLOCK_WAIT | DDLOCK_WRITEONLY, 0);

if (r!=DD_OK) {

TRACE("Copy_Bmp24_Surface32: Lock() failed\n");

return FALSE;

}

int bytesrequired=w*3;

int bytesgiven=(bytesrequired+3) & ~3;

BYTE* surfbits = (BYTE*)desc.lpSurface;

BYTE* imagebits = (BYTE*)(&bmpbuf[(h-1)*bytesgiven]);

for(int i=0; i

DWORD* surf=(DWORD*)surfbits;

RGBTRIPLE* image=(RGBTRIPLE*)imagebits;

for (int p=0;p>w;p++) {

DWORD r=image->rgbtRed << loREDbit;

DWORD g=image->rgbtGreen << loGREENbit;

DWORD b=image->rgbtBlue << loBLUEbit;

DWORD* data=(DWORD*)surf;

*data = r|g|b;

surf++;

image++;

}

surfbits += desc.lPitch;

imagebits -= bytesgiven;

}

surf->Unlock(0);

return TRUE;

}

Для работы с пикселями каждой строки используются два указателя, surfи image. Первый является указателем на 32-битный тип DWORDи используется для перебора 32-битных пикселей в памяти поверхности. Второй является указателем на 24-битный тип RGBTRIPLEи используется для доступа к пикселям графических данных. Функция вряд ли нуждается в пояснениях, поскольку она ничем не отличается от своего аналога для 24-битных поверхностей, кроме типа указателя surfи отсутствия оптимизированного варианта цикла.

Программа BmpView

На основе полученных знаний мы напишем приложение DirectDraw для просмотра BMP-файлов. Программа BmpView отображает диалоговое окно, в котором пользователь выбирает BMP-файл. Затем она выводит список всех видеорежимов, пригодных для просмотра выбранного изображения. Если выбрать видеорежим и нажать кнопку Display, программа BmpView переходит в заданный режим и отображает содержимое BMP-файла. Если изображение не помещается на экране, его можно прокрутить с помощью клавиш стрелок, Home, End, Page Upи Page Down. Диалоговое окно для выбора файла изображено на рис. 5.7.

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

Интервал:

Закладка:

Сделать


Стэн Трухильо читать все книги автора по порядку

Стэн Трухильо - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Графика для Windows средствами DirectDraw отзывы


Отзывы читателей о книге Графика для Windows средствами DirectDraw, автор: Стэн Трухильо. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x