Форум: "Игры";
Текущий архив: 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