Форум: "KOL";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
ВнизВерсия 2.22 Найти похожие ветки
← →
Vladimir Kladov (2005-11-08 12:22) [0]Новости от 8 ноября 2005 г.
Новости KOL и MCK (v2.22):
[+]KOL: добавлена функция Color2Color15.
[-]KOL: функция TBitmap.SetHandle исправлена для Windows9x (форматы pf15bit и pf16bits, возможно, какие-то еще форматы).
[-]KOL: метод TBitmap.GetPixelFormat теперь в точности различает pf15bit, pf16bit и pfCustom (проверяются маски полей цветовых каналов).
[-]KOL: метод TBitmap.Convert2Mask полностью переписан и обеспечивает одинаковые результаты в NT/2K/XP и в 9x/Me. это влияет по крайней мере на результаты DrawTransparent.
[-]KOL: в функции WndProcMouseEnterLeave все вызовы Invalidate раскомментарены: они нужны для корректной работы BitBtn с опцией bboFlat. Спасибо за репорт: igi.
Convert2Mask сделать через ImageList не вышло, код закомментаренный остался, под 98 он то же самое гонит. Может, он и правда через Load... работает, но нам-то надо из памяти. Пришлось руками, свои циклы делать.
← →
MTsv DN (2005-11-08 12:57) [1]Привет, Всем...
Обновил сборку: KOLnMCK 2.22 + KOLadd (15.10.2005), по адресу: http://www.uus4u.com/download/modules/KOLnMCK.rar
Не забудьте сделать ReBuild KOLnMCK и ВСЕХ ПАКЕТОВ
С Уважением MTsv DN
← →
homm © (2005-11-12 18:10) [2]> [-]KOL: метод TBitmap.Convert2Mask полностью переписан и
> обеспечивает одинаковые результаты в NT/2K/XP и в 9x/Me.
> это влияет по крайней мере на результаты DrawTransparent.
> Пришлось руками, свои циклы делать.
Коректность она конечно должна быть (обязательно), но не такой же ценой. Convert2Mask по ощущениям раз в 5 медленее стал. Кроме того еще и PixelFormat во всю используется, а это 1024 байт дополнительного кода, и снова тормоза. У меня прозрачность с 32 бит картинками опять же не работает (за редким исключением, цвет фуксия одно из них) (win XP, SP -)
← →
Vladimir Kladov (2005-11-12 20:22) [3]без проблем ускоряется в 8 раз, и даже от FormatChanged при этом можно избавиться, но делать-то кто будет? Я сейчас занят.
← →
Vladimir Kladov (2005-11-13 09:22) [4]Вот код, пробуйте на скорость (бью пополам, сердится наш форум на размер):
{$IFDEF ASM_VERSION}
//[procedure TBitmap.Convert2Mask]
procedure TBitmap.Convert2Mask(TranspColor: TColor);
asm
PUSH EBX
PUSH ESI
PUSH EBP
PUSH EDI
XCHG EBP, EAX
XCHG EAX, EDX
CALL Color2RGB
XCHG EBX, EAX
MOV EAX, EBP
CALL GetPixelFormat
MOV DL, pf15bit
CMP AL, DL
JB @@setpixelformat
@@1: MOV DL, pf32bit
CMP AL, DL
JBE @@translate
@@setpixelformat:
MOV EAX, EBP
CALL SetPixelFormat
@@translate:
MOV EAX, [EBP].fWidth
MOV EDX, [EBP].fHeight
MOV CL, pf1bit
CALL NewDibBitmap
PUSH EAX
XOR EDX, EDX
INC EDX
MOV ECX, $FFFFFF
CALL SetDIBPalEntries
XOR EDX, EDX
@@Yloop:CMP EDX, [EBP].fHeight
JGE @@exit
PUSH EDX
MOV EAX, EBP
CALL GetScanLine
XCHG ESI, EAX
MOV EAX, [ESP+4]
POP EDX
PUSH EDX
CALL GetScanLine
XCHG EDI, EAX
MOV EAX, EBP
CALL GetPixelFormat
MOVZX ECX, AL
SUB ECX, pf4bit
MOV DL, 8
JNE @@chk_pf8bit
//-------- pf4bit:
CMP dword ptr [ESP], 0
JNZ @@4_0
XOR EDX, EDX
@@4_searchentry:
PUSH EDX
MOV EAX, [ESP+8]
CALL GetDIBPalEntries
CMP EAX, EBX
POP EDX
JZ @@4_foundentry
INC EDX
CMP EDX, 16
JB @@4_searchentry
@@4_foundentry:
XCHG EBX, EDX
MOV DL, 8
@@4_0: MOV ECX, [EBP].fWidth
INC ECX
SHR ECX, 1
@@Xloop_pf4bit:
MOV AH, [ESI]
SHR AH, 4
CMP AH, BL
SETZ AH
SHL AL, 1
OR AL, AH
MOV AH, [ESI]
AND AH, $0F
CMP AH, BL
SETZ AH
SHL AL, 1
OR AL, AH
DEC DL
DEC DL
JNZ @@4_1
STOSB
MOV DL, 8
@@4_1: INC ESI
LOOP @@Xloop_pf4bit
JMP @@nextline
@@chk_pf8bit:
LOOP @@chk_pf15bit
//-------- pf4bit:
CMP dword ptr [ESP], 0
JNZ @@8_0
XOR EDX, EDX
@@8_searchentry:
PUSH EDX
MOV EAX, [ESP+8]
CALL GetDIBPalEntries
CMP EAX, EBX
POP EDX
JZ @@8_foundentry
INC DL
JNZ @@8_searchentry
@@8_foundentry:
XCHG EBX, EDX
MOV DL, 8
@@8_0: MOV ECX, [EBP].fWidth
INC ECX
SHR ECX, 1
@@Xloop_pf8bit:
MOV BL, [ESI]
SETZ AH
SHL AL, 1
OR AL, AH
DEC DL
JNZ @@4_1
STOSB
MOV DL, 8
@@8_1: INC ESI
LOOP @@Xloop_pf8bit
JMP @@nextline
@@chk_pf15bit:
LOOP @@chk_pf16bit
//-------- pf15bit:
CMP dword ptr [ESP], 0
JNZ @@15_0
XCHG EAX, EBX
CALL Color2Color15
XCHG EBX, EAX
@@15_0: MOV ECX, [EBP].fWidth
@@Xloop_pf15bit:
CMP word ptr [ESI], BX
SETZ AH
SHL AL, 1
OR AL, AH
DEC DL
JNZ @@15_1
STOSB
MOV DL, 8
@@15_1: ADD ESI, 2
LOOP @@Xloop_pf15bit
JMP @@nextline
@@chk_pf16bit:
LOOP @@chk_pf24bit
//-------- pf16bit:
CMP dword ptr [ESP], 0
JNZ @@16_0
XCHG EAX, EBX
CALL Color2Color16
XCHG EBX, EAX
@@16_0: MOV ECX, [EBP].fWidth
@@Xloop_pf16bit:
CMP word ptr [ESI], BX
SETZ AH
SHL AL, 1
OR AL, AH
DEC DL
JNZ @@16_1
STOSB
MOV DL, 8
@@16_1: ADD ESI, 2
LOOP @@Xloop_pf16bit
JMP @@nextline
@@chk_pf24bit:
LOOP @@chk_pf32bit
//-------- pf24bit:
MOV ECX, [EBP].fWidth
PUSH EBP
//AND EBX, $FFFFFF
@@Xloop_pf24bit:
MOV EBP, dword ptr [ESI]
AND EBP, $FFFFFF
CMP EBP, EBX
SETZ AH
SHL AL, 1
OR AL, AH
DEC DL
JNZ @@24_1
STOSB
MOV DL, 8
@@24_1: ADD ESI, 3
LOOP @@Xloop_pf24bit
POP EBP
JMP @@nextline
@@chk_pf32bit:
//-------- pf32bit:
MOV ECX, [EBP].fWidth
@@Xloop_pf32bit:
CMP EBX, dword ptr [ESI]
SETZ AH
SHL AL, 1
OR AL, AH
DEC DL
JNZ @@32_1
STOSB
MOV DL, 8
@@32_1: ADD ESI, 4
LOOP @@Xloop_pf32bit
@@nextline:
TEST DL, DL
JZ @@nx1
@@finloop1:
SHL AL, 1
DEC DL
JNZ @@finloop1
STOSB
@@nx1:
POP EDX
INC EDX
JMP @@Yloop
@@exit:
POP EDX
PUSH EDX
XCHG EAX, EBP
CALL Assign
POP EAX
CALL TObj.Free
POP EDI
POP EBP
POP ESI
POP EBX
(*) PUSH EBX
PUSH ESI
MOV EBX, EAX
MOV ESI, EDX
CALL GetHandle
TEST EAX, EAX
JZ @@exit
PUSH 0
PUSH 1
PUSH 1
PUSH [EBX].fHeight
PUSH [EBX].fWidth
CALL CreateBitmap
PUSH EAX // MonoHandle
PUSH 0
CALL CreateCompatibleDC
POP EDX
PUSH EDX
PUSH EAX // MonoDC
PUSH EDX
PUSH EAX
CALL SelectObject
PUSH EAX // SaveMono
CALL StartDC // DCfrom, SaveFrom
XCHG EAX, ESI
CALL Color2RGB
PUSH EAX // Color2RGB(TranspColor)
PUSH dword ptr [ESP+8] //DCfrom
CALL Windows.SetBkColor
PUSH EAX // SaveBkColor
PUSH SRCCOPY
PUSH 0
PUSH 0
PUSH dword ptr [ESP+12+4+4] //DCfrom
PUSH [EBX].fHeight
PUSH [EBX].fWidth
PUSH 0
PUSH 0
PUSH dword ptr [ESP+32+16] //MonoDC
CALL BitBlt
PUSH dword ptr [ESP+8] //DCfrom
CALL Windows.SetBkColor // ESP-> SaveFrom
CALL FinishDC // ESP-> SaveMono
CALL FinishDC // ESP-> MonoHandle
MOV EAX, EBX
CALL ClearData
POP [EBX].fHandle
MOV [EBX].fHandleType, bmDDB
@@exit:
POP ESI
POP EBX (*)
end;
← →
Vladimir Kladov (2005-11-13 09:24) [5]продолжение...
{$ELSE ASM_VERSION} //Pascal
procedure TBitmap.Convert2Mask(TranspColor: TColor);
var Y, X, i: Integer;
Src, Dst: PByte;
W: Word;
TmpMsk: PBitmap;
B, C: Byte;
begin
HandleType := bmDIB;
//if PixelFormat < pf15bit then
// PixelFormat := pf15bit;
if PixelFormat < pf4bit then
PixelFormat := pf4bit;
if PixelFormat > pf32bit then
PixelFormat := pf32bit;
TranspColor := Color2RGB( TranspColor ) and $FFFFFF;
TmpMsk := NewDIBBitmap( fWidth, fHeight, pf1bit );
TmpMsk.DIBPalEntries[ 1 ] := $FFFFFF;
for Y := 0 to fHeight-1 do
begin
Src := ScanLine[ Y ];
Dst := TmpMsk.ScanLine[ Y ];
B := 0; C := 8;
CASE PixelFormat OF
pf4bit:
begin
W := 16;
for i := 0 to 15 do
if DIBPalEntries[ i ] = TranspColor then
begin
W := i; break;
end;
for X := 0 to (fWidth div 2)-1 do
begin
B := B shl 1;
if Src^ shr 4 = W then inc( B );
B := B shl 1;
if Src^ and $0F = W then inc( B );
Inc( Src );
Dec( C, 2 );
if C = 0 then
begin
Dst^ := B;
Inc( Dst );
C := 8;
end;
end;
end;
pf8bit:
begin
W := 256;
for i := 0 to 255 do
if DIBPalEntries[ i ] = TranspColor then
begin
W := i; break;
end;
for X := 0 to fWidth-1 do
begin
B := B shl 1;
if Src^ = W then inc( B );
Inc( Src );
Dec( C );
if C = 0 then
begin
Dst^ := B;
Inc( Dst );
C := 8;
end;
end;
end;
pf15bit:
begin
W := Color2Color15( TranspColor );
for X := 0 to fWidth-1 do
begin
B := B shl 1;
if PWord( Src )^ = W then inc( B );
Inc( Src, 2 );
Dec( C );
if C = 0 then
begin
Dst^ := B;
Inc( Dst );
C := 8;
end;
end;
end;
pf16bit:
begin
W := Color2Color16( TranspColor );
for X := 0 to fWidth-1 do
begin
B := B shl 1;
if PWord( Src )^ = W then inc( B );
Inc( Src, 2 );
Dec( C );
if C = 0 then
begin
Dst^ := B;
Inc( Dst );
C := 8;
end;
end;
end;
pf24bit:
begin
for X := 0 to fWidth-1 do
begin
B := B shl 1;
if PInteger( Src )^ and $FFFFFF = TranspColor then inc( B );
Inc( Src, 3 );
Dec( C );
if C = 0 then
begin
Dst^ := B;
Inc( Dst );
C := 8;
end;
end;
end;
pf32bit:
begin
for X := 0 to fWidth-1 do
begin
B := B shl 1;
if PInteger( Src )^ and $FFFFFF = TranspColor then inc( B );
Inc( Src, 4 );
Dec( C );
if C = 0 then
begin
Dst^ := B;
Inc( Dst );
C := 8;
end;
end;
end;
END;
if C > 0 then
begin
while C > 0 do
begin
B := B shl 1;
dec( C );
end;
Dst^ := B;
end;
end;
//PixelFormat := pf1bit;
Assign( TmpMsk );
TmpMsk.Free;
//SaveTofile( GetStartDir + "tstmsk.bmp" );
end;{$ENDIF}
От FormatChanged избавиться не получится т.к. требуется гарантия перехода к DIB. Или пробуйте вариант с imagelist, который есть в комментарии в пас-версии -он не работает в 98 правильно.
← →
MTsv DN (2005-11-13 10:36) [6]Привет...
Не знаю к кому обратиться, но началось это, именно, с версии 2.22 (поэтому пришлось функцию Convert2Mask вернуть из 2.21. Функция, приведенная выше, дает тот же эффект...).
Можете посмотреть: http://www.uus4u.com/download/modules/KOLnMCK/new_c2m.png или скачать ехе-шник: http://www.uus4u.com/download/modules/KOLnMCK/new_convert2mask.exe
В проекте только две GRushPanel. У верхней включен Transparent. Функция convert2mask в KOLnMCK 2.21, такого эффекта не давала...
С Уважением MTsv DN
← →
convert2mask (2005-11-13 13:53) [7]Запускал new_convert2mask.exe на Win 98, 2k, XP и 2003 (GeForce4 MX440 with AGP 8x) - эффекта, как на картинке, нет.
← →
MTsv DN (2005-11-13 14:36) [8]Да-а-а... Запустил на 98м... Отсутствует эффект, а в ХР присутствует...
Вывод: либо "тупят" драйвера ATI 5.10 (сейчас буду новые качать), либо заплатка под Windows XP SP2... Слишком уж много дыр было в Windows при обработке BMP, GiF, PNG, JPG и WMF/EMF файлов... Возможно Microsoft, где и перестарался...
С Уважением MTsv DN
← →
Vladimir Kladov (2005-11-13 16:26) [9]1. посмотрите под разными настройками цвета десктопа (кажется в в2.22 естьошибка для тру колора)
2. попробуйте мой код выше.
← →
MTsv DN (2005-11-13 16:43) [10]1. Смена настроек десктопа не помогло...
2. Функция, приведенная выше, дает тот же эффект...
С Уважением MTsv DN
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.038 c