Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

Как задать цветовой ключ?   Найти похожие ветки 

 
IP   (2003-10-05 14:41) [0]

Подскажите пожалуйста, как задать цветовой ключ для поверхности Direct Draw и как использовать его на блиттинге.


 
cyborg ©   (2003-10-05 16:40) [1]

DDUtil

Это для 16 битового цвета смещения:

DDSetColorKey(DDSurface,
   (ColorKeyR or
   (ColorKeyG shl 8) or
   (ColorKeyB shl 16))
   );

в блитере во флагах DDBLTFAST_SRCCOLORKEY


 
IP   (2003-10-06 11:55) [2]

а где взять этот DDUtil? Я пробовал без него - у поверхности тоже есть метод создания ключя, но я не знаю что писать в аргументах функции:(.


 
cyborg ©   (2003-10-06 13:31) [3]

DDUtil есть в некоторых заголовках.

//-----------------------------------------------------------------------------
// Name: DDSetColorKey()
// Desc: Set a color key for a surface, given a RGB.
//       If you pass CLR_INVALID as the color key, the pixel
//       in the upper-left corner will be used.
//-----------------------------------------------------------------------------
function DDSetColorKey(pdds : IDirectDrawSurface7; rgb : COLORREF) : HRESULT;
var
 ddck : TDDColorKey;
begin
 ddck.dwColorSpaceLowValue := DDColorMatch(pdds, rgb);
 ddck.dwColorSpaceHighValue := ddck.dwColorSpaceLowValue;
 Result := pdds.SetColorKey(DDCKEY_SRCBLT, @ddck);
end;

//-----------------------------------------------------------------------------
// Name: DDColorMatch()
// Desc: Convert a RGB color to a pysical color.
//       We do this by leting GDI SetPixel() do the color matching
//       then we lock the memory and see what it got mapped to.
//-----------------------------------------------------------------------------
function DDColorMatch(pdds : IDirectDrawSurface7; rgb : COLORREF) : DWORD;
var
 rgbT : COLORREF;
 h_dc : HDC;
 dw : DWORD;
 ddsd : TDDSurfaceDesc2;
 hres : HRESULT;
begin
 dw := CLR_INVALID;
 rgbT := 0;
 //
 //  Use GDI SetPixel to color match for us
 //
 if (rgb <> CLR_INVALID) and (pdds.GetDC(h_dc) = DD_OK) then
   begin
     rgbT := GetPixel(h_dc, 0, 0);     // Save current pixel value
     SetPixel(h_dc, 0, 0, rgb);       // Set our value
     pdds.ReleaseDC(h_dc);
   end;
 //
 // Now lock the surface so we can read back the converted color
 //
 ddsd.dwSize := SizeOf(ddsd);
 hres := pdds.Lock(nil, ddsd, 0, 0);
 while hres = DDERR_WASSTILLDRAWING do
   begin
     hres := pdds.Lock(nil, ddsd, 0, 0);
   end;
 if hres = DD_OK then
   begin
     dw := PDWORD(ddsd.lpSurface)^;                 // Get DWORD
     if ddsd.ddpfPixelFormat.dwRGBBitCount < 32 then
       dw := dw and ((1 shl ddsd.ddpfPixelFormat.dwRGBBitCount) - 1);  // Mask it to bpp
     pdds.Unlock(nil);
   end;
 //
 //  Now put the color that was there back.
 //
 if (rgb <> CLR_INVALID) and (pdds.GetDC(h_dc) = DD_OK) then
   begin
     SetPixel(h_dc, 0, 0, rgbT);
     pdds.ReleaseDC(h_dc);
   end;
 Result := dw;
end;


В общем вместо колормач, думаю, лучше прямо писать цвет.


 
cyborg ©   (2003-10-06 13:34) [4]

А насчёт моего "Это для 16 битового цвета смещения" я глюканул. ;)


 
IP   (2003-10-07 06:10) [5]

Цвета обозначать CLR_RED, CLR_WHITE и т.д?


 
cyborg ©   (2003-10-07 10:07) [6]

Цвета назначать: 10235; $FFAC$; $00AB110$; 128


 
Sapersky ©   (2003-10-07 10:16) [7]

В общем вместо колормач, думаю, лучше прямо писать цвет.

Ну да, обычно цветовой ключ - это чёрный цвет, который во всех RGB-представлениях выглядит одинаково. Но иногда всё-таки требуется не чёрный - тогда нужно переводить в требуемый формат, что, наверное, и делает ColorMatch (я лично перевожу вручную, используя данные о формате поверхности).

Цвета обозначать CLR_RED, CLR_WHITE и т.д?

А это зависит от того, что такое CLR_RED, CLR_WHITE и т.д. :) А в ColorMatch используется TColorRef - это запись, там есть поля r,g,b.



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.093 c
9-1065430545
Ssv
2003-10-06 12:55
2004.04.11
прорисовка файла


14-1082344951
BlackComb
2004-04-19 07:22
2004.04.11
Входящий и Исходящий трафик


1-1079959419
vin
2004-03-22 15:43
2004.04.11
Быстрая отрисовка канвы


9-1071947099
HolyMan
2003-12-20 22:04
2004.04.11
Прогрессбар при накладывании 3ds файла


1-1080068374
Vovans
2004-03-23 21:59
2004.04.11
Фокус в MDI приложении.