![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как задать цветовой ключ? [Delphi, Windows]
IP © (2003-10-05 14:41:00)Подскажите пожалуйста, как задать цветовой ключ для поверхности Direct Draw и как использовать его на блиттинге.
Sapersky (2003-10-07 10:16:00) [1]В общем вместо колормач, думаю, лучше прямо писать цвет.
Ну да, обычно цветовой ключ - это чёрный цвет, который во всех RGB-представлениях выглядит одинаково. Но иногда всё-таки требуется не чёрный - тогда нужно переводить в требуемый формат, что, наверное, и делает ColorMatch (я лично перевожу вручную, используя данные о формате поверхности).
Цвета обозначать CLR_RED, CLR_WHITE и т.д?
А это зависит от того, что такое CLR_RED, CLR_WHITE и т.д. :) А в ColorMatch используется TColorRef - это запись, там есть поля r,g,b.
cyborg (2003-10-07 10:07:00) [2]Цвета назначать: 10235; $FFAC$; $00AB110$; 128
IP (2003-10-07 06:10:00) [3]Цвета обозначать CLR_RED, CLR_WHITE и т.д?
cyborg (2003-10-06 13:34:00) [4]А насчёт моего "Это для 16 битового цвета смещения" я глюканул. ;)
cyborg (2003-10-06 13:31:00) [5]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;
В общем вместо колормач, думаю, лучше прямо писать цвет.
IP (2003-10-06 11:55:00) [6]а где взять этот DDUtil? Я пробовал без него - у поверхности тоже есть метод создания ключя, но я не знаю что писать в аргументах функции:(.
cyborg (2003-10-05 16:40:00) [7]DDUtil
Это для 16 битового цвета смещения:
DDSetColorKey(DDSurface,
(ColorKeyR or
(ColorKeyG shl 8) or
(ColorKeyB shl 16))
);
в блитере во флагах DDBLTFAST_SRCCOLORKEY