загрузка картинок напрямую в DIRECTDRAWSURFACE
От: netch  
Дата: 01.11.01 13:06
Оценка:
Hi All,

Возникла одна проблемка.
Загружаю картинку прямиком из бмпешки. То есть:

LPDIRECTDRAWSURFACE lpDDSlocal;
DDSURFACEDESC ddsd;
// тута создаю lpDDSlocal, инициализирую ddsd, ну и подобное
..........
//потом идет так:
lpDDSlocal->Lock(NULL, &ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, NULL);
short *buffer = (short *)ddsd.lpSurface;
buffer[i] = типа читаю из бмпешки;
lpDDSlocal->Unlock(NULL);

но вот какая трабла — если картинка имеет ширину, не кратную 4, то при выведении картинки на экран получаем что то, где строчки картинки сдвинуты относительно друг-друга.
Подскажите, с чем это связано, как можно избежать ?

Заранее благодарен.
Re: загрузка картинок напрямую в DIRECTDRAWSURFACE
От: adontz Грузия http://adontz.wordpress.com/
Дата: 01.11.01 14:05
Оценка:
Здравствуйте netch, Вы писали:

N>Hi All,

N>Заранее благодарен.

Судя по коду ты юзаешь DX7 (если не прав поправь)

Его SDK у меня под рукой нет (перешёл на DX8, а место на винте экономлю), но вот что я помню так:
Если загружаешь из BMP файла то лучше взять для обоих hDC и скопировать через BitBlt (геморроя меньше)

HBITMAP hBitmap = LoadImage(hInstance,);
BITMAP  bmp;
HDC     hDCsurface;
HDC     hDCbitmap = CreateCompatibleDC(NULL);

GetObject((HGDIOBJ)hBitmap,sizeof(bmp),(LPVOID)&bmp);

lpDirectDraw->CreateSurface(......);

SelectObject(hDCbitmap,hBmp);
lpDirectDrawSurface->GetDC(&hDCsurface); 

BitBlt(hDCsurface,0,0,bmp.bmWidth,bmp.bmHeight,hDCbitmap,0,0,SRCCOPY);

lpDirectDrawSurface->ReleaseDC(hDCsurface);
DeleteDC(hDCbitmap);


если хочешь пришлю исходники загрузки из TGA и PCX.

кстати почему
short *buffer = (short *)ddsd.lpSurface;

а не
LPSTR buffer = (LPSTR)ddsd.lpSurface;

????????????
ну на худой конец если уж точно RGB то
LPDWORD buffer = (LPDWORD)ddsd.lpSurface;


A journey of a thousand miles must begin with a single step © Lau Tsu
Re: загрузка картинок напрямую в DIRECTDRAWSURFACE
От: adontz Грузия http://adontz.wordpress.com/
Дата: 01.11.01 14:14
Оценка:
Здравствуйте netch, Вы писали:

кстати вспомнил посмотри что там делает lPitch член структуры. У всяких там Direct иксов между двумя строками могут быть байты выравнивания типа

|<-----width*4------>|<--align bytes-->|
line 000{ RGB RGB RGB RGB RGB --unused memory--}
line 001{ RGB RGB RGB RGB RGB --unused memory--}
line 002{ RGB RGB RGB RGB RGB --unused memory--}
line 003{ RGB RGB RGB RGB RGB --unused memory--}
line 004{ RGB RGB RGB RGB RGB --unused memory--}
line 005{ RGB RGB RGB RGB RGB --unused memory--}
line 006{ RGB RGB RGB RGB RGB --unused memory--}
line 007{ RGB RGB RGB RGB RGB --unused memory--}
line 008{ RGB RGB RGB RGB RGB --unused memory--}
line 009{ RGB RGB RGB RGB RGB --unused memory--}
|<---------------lPitch--------------->|
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: загрузка картинок напрямую в DIRECTDRAWSURFACE
От: netch  
Дата: 02.11.01 08:32
Оценка:
Здравствуйте adontz, Вы писали:

A>Здравствуйте netch, Вы писали:


A>кстати вспомнил посмотри что там делает lPitch член структуры. У всяких там Direct иксов между двумя строками могут быть байты выравнивания типа


A> |<-----width*4------>|<--align bytes-->|

A>line 000{ RGB RGB RGB RGB RGB --unused memory--}
A>line 001{ RGB RGB RGB RGB RGB --unused memory--}
A>line 002{ RGB RGB RGB RGB RGB --unused memory--}
A>line 003{ RGB RGB RGB RGB RGB --unused memory--}
A>line 004{ RGB RGB RGB RGB RGB --unused memory--}
A>line 005{ RGB RGB RGB RGB RGB --unused memory--}
A>line 006{ RGB RGB RGB RGB RGB --unused memory--}
A>line 007{ RGB RGB RGB RGB RGB --unused memory--}
A>line 008{ RGB RGB RGB RGB RGB --unused memory--}
A>line 009{ RGB RGB RGB RGB RGB --unused memory--}
A> |<---------------lPitch--------------->|


Использую DX7.
Напрямую из файла загужать не получается т.к. файл сжат и он разворачивается прямо в буфер.
Short используется так как цвет только 16 бит.
Спасибо за идею с lPitch, проблема скорее всего в этом. Можно ли так создать Surface, что бы там не возникло пустого места в конце. Построчное копирование нас не устраивает ;-(.

ЗЫ Насколько мне известно DX7 и DX8 не отличаются а 2D.
Спасибо.
Re[3]: загрузка картинок напрямую в DIRECTDRAWSURFACE
От: adontz Грузия http://adontz.wordpress.com/
Дата: 02.11.01 13:56
Оценка:
Здравствуйте netch, Вы писали:

N>Здравствуйте adontz, Вы писали:


A>>Здравствуйте netch, Вы писали:


Можно ли так создать Surface, что бы там не возникло пустого места в конце. Построчное копирование нас не устраивает ;-(.

N>ЗЫ Насколько мне известно DX7 и DX8 не отличаются а 2D.

N> Спасибо.
Разворачивать прямо в буффер побайтово очень не эффективно (по себе знаю), так как он в видео памяти. Туда быстрее писать скопом. Лучше загружать куда нибудь в промежуточный буффер а потом копировать...
От lPitch избавится вряд ли удасться, это насколько мне известно аппаратное требование видеокарты (у меня на Riva TNT2 нет проблем, зато до фига на S3 и Matrox-ах)
Что касается 2D то в DX8 его почти нет (и это правильно!!! слушай если ещё не много написано переходи на восьмой его и инициализировать проще гораздо и понять чего там поиходит и с форматом пикселя меньше геморроя и вообще лучше !!!) так скажем hdc для surface фиг получишь... (и это правильно так как использовать GDI не стоит ;-)
за short прости, я уже и забыл что цвет бывает 16 битным :-)
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[4]: загрузка картинок напрямую в DIRECTDRAWSURFACE
От: netch  
Дата: 05.11.01 09:49
Оценка:
Здравствуйте adontz,
Огромное спасибо за помощь.
Удачи !
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.