Создание DirectDraw Surface с нуля в Stack Overflow

Я пытаюсь преобразовать 2D-массив в DDS и сохранить его в файл. Массив полон цветных структур (каждая из которых имеет красный, зеленый, синий и альфа-компонент). Как только я получу массив в правильном формате, я уверен, что сохранение его в файл не будет проблемой.

Я в порядке либо с использованием библиотеки lib (если ее лицензия позволяет мне использовать ее в проекте с закрытым исходным кодом и работает как в Linux, так и в Windows), либо в ручном режиме, если я могу найти хороший ресурс, объясняющий, как сделай это.

Если кто-нибудь может указать мне правильное направление, я был бы очень благодарен.

1

Решение

В DirectDraw вы можете создать поверхность из данных в памяти, настроив определенные поля в DDSURFACEDESC структура и передача его CreateSurface метод IDirectDraw интерфейс.

Сначала вам нужно указать DirectDraw, какие поля DDSURFACEDESC структура содержит правильную информацию, установив dwFlags поле для следующего набора флагов: DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_LPSURFACE | DDSD_PITCH,

О, и это работает только для поверхностей системной памяти, так что, вероятно, необходимо добавить DDSCAPS_SYSTEMMEMORY флаг в ddsCaps.dwCaps поле (если DirectDraw не будет делать это по умолчанию).

Затем вы указываете адрес начала вашего массива данных пикселей в lpSurface поле. Если ваш буфер непрерывен, просто установите lPitch равным 0. В противном случае вы устанавливаете там правильный шаг (расстояние в байтах между началами двух последующих строк развертки).

Установите правильный формат пикселя в ddpfPixelFormat поле с правильной глубиной в битах dwRGBBitCount и маски RGB в dwRBitMask, dwGBitMask а также dwBBitMask,

Затем установите lXPitch на количество байтов вашего пикселя (3 для RGB). Это зависит от формата пикселя, который вы используете.

Затем передайте заполненную структуру в CreateSurface и посмотреть, если это работает.

Когда вы создаете поверхность таким образом, имейте в виду, что DirectDraw сам не будет управлять своим буфером данных и не освободит эту память после вызова Release на вашей поверхности. Вы должны освободить эту память самостоятельно, когда она больше не используется поверхностью.

Если вы хотите, чтобы эти данные пикселей были помещены в видеопамять, с другой стороны, вам нужно создать внеэкранную поверхность обычным способом, а затем заблокировать ее, скопировать пиксели в свой собственный буфер в видеопамяти (вы найдете ее адрес в lpSurface поле, и не забудьте взять lPitch в счет!), а затем разблокировать его.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]