|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
DirectX формат пиксела
У меня проблема с выводом изображения при глубине цвета 32 бита. Есть процедура для вывода линии используя DirectDraw, при глубине цвета 16 бит. Вот фрагмент:
Код:
procedure DrawLine(surf: IDirectDrawSurface7; X1, Y1, X2, Y2:Integer; r, g, b:BYTE); var c:WORD; NS:Integer; desc:DDSURFACEDESC2; dst:PByteArray; DX, DY, iOffset, i:Integer; begin c := (trunc(b/8) + (trunc(g/4) SHL 5) + (trunc(r/8) shl 11)); // Если первая точка выше, то меняем их местами, // чтобы всегда рисовать сверху вниз if (Y2<Y1) then begin NS:=Y1; Y1:=Y2; Y2:=NS; NS:=X1; X1:=X2; X2:=NS; end; // Блокировка поверхности ZeroMemory(@desc, sizeof(desc)); desc.dwSize := sizeof(desc); if (surf.Lock(nil, desc, DDLOCK_WAIT, 0)=DD_OK) then begin dst := desc.lpSurface; DX := abs(X2-X1); DY := abs(Y2-Y1); iOffset := Y1*desc.lPitch+X1*2; // Рисуем слева направо if (X1<=X2) then begin //Рисуем слева направо и Х изменяется чаще if (DX>DY) then begin NS:=DX div 2; for i:=0 to DX do begin PWordArray(dst)^[iOffset div 2]:=c; iOffset:=iOffset+2; NS:=NS-DY; if (NS<0) then begin iOffset:=iOffset+desc.lPitch; NS:=NS+DX; end; end; end else ............. Я не как не могу понять как переделать эту процедуру под режим 32 бита. Подскажите пожалуйста решение этой не хитрой проблемы. |
#2
|
||||
|
||||
Попробуй так
Код:
procedure DrawLine(surf: IDirectDrawSurface7; X1, Y1, X2, Y2:Integer; r, g, b:BYTE); var c : Longword; NS : Integer; desc : DDSURFACEDESC2; DX, DY, iOffset, i : Integer; begin c := b + (g SHL 8) + (r shl 16); // Если первая точка выше, то меняем их местами, // чтобы всегда рисовать сверху вниз if (Y2<Y1) then begin NS:=Y1; Y1:=Y2; Y2:=NS; NS:=X1; X1:=X2; X2:=NS; end; // Блокировка поверхности ZeroMemory(@desc, sizeof(desc)); desc.dwSize := sizeof(desc); if (surf.Lock(nil, desc, DDLOCK_WAIT, 0)=DD_OK) then begin DX := abs(X2-X1); DY := abs(Y2-Y1); iOffset := Y1*desc.lPitch+X1*4; // Рисуем слева направо if (X1<=X2) then begin //Рисуем слева направо и Х изменяется чаще if (DX>DY) then begin NS:=DX div 2; for i:=0 to DX do begin PLongWord(LongWord(desc.lpSurface)+iOffset)^:=c; iOffset:=iOffset+4; NS:=NS-DY; if (NS<0) then begin iOffset:=iOffset+desc.lPitch; NS:=NS+DX; end; end; end else ........... Не профи, но и не чайник . D6 - лучше не придумали. Пока. Последний раз редактировалось zip000, 10.09.2007 в 17:21. |
#3
|
|||
|
|||
Спасибо большое, всё работает.
|