Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.044 c
14-1082007907
BaDeVlad
2004-04-15 09:45
2004.04.11
Кто хочет протестировать блокнотик


4-1079468997
vpv
2004-03-16 23:29
2004.04.11
Проблемы с SetEntriesInAcl


14-1079286422
Kamerad
2004-03-14 20:47
2004.04.11
HELP!


3-1081437543
jenbond
2004-04-08 19:19
2004.04.11
Присвоить полю значение NULL


1-1079879138
Prankster.
2004-03-21 17:25
2004.04.11
Маска в Edit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский