Возникла одна проблемка.
Загружаю картинку прямиком из бмпешки. То есть:
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
Здравствуйте netch, Вы писали:
N>Hi All, N>Заранее благодарен.
Судя по коду ты юзаешь DX7 (если не прав поправь)
Его SDK у меня под рукой нет (перешёл на DX8, а место на винте экономлю), но вот что я помню так:
Если загружаешь из BMP файла то лучше взять для обоих hDC и скопировать через BitBlt (геморроя меньше)
Здравствуйте 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
Здравствуйте netch, Вы писали:
N>Здравствуйте adontz, Вы писали:
A>>Здравствуйте netch, Вы писали:
Можно ли так создать Surface, что бы там не возникло пустого места в конце. Построчное копирование нас не устраивает ;-(.
N>ЗЫ Насколько мне известно DX7 и DX8 не отличаются а 2D. N> Спасибо.
Разворачивать прямо в буффер побайтово очень не эффективно (по себе знаю), так как он в видео памяти. Туда быстрее писать скопом. Лучше загружать куда нибудь в промежуточный буффер а потом копировать...
От lPitch избавится вряд ли удасться, это насколько мне известно аппаратное требование видеокарты (у меня на Riva TNT2 нет проблем, зато до фига на S3 и Matrox-ах)
Что касается 2D то в DX8 его почти нет (и это правильно!!! слушай если ещё не много написано переходи на восьмой его и инициализировать проще гораздо и понять чего там поиходит и с форматом пикселя меньше геморроя и вообще лучше !!!) так скажем hdc для surface фиг получишь... (и это правильно так как использовать GDI не стоит ;-)
за short прости, я уже и забыл что цвет бывает 16 битным :-)