Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1155121098
ArtemESC
2006-08-09 14:58
2006.08.27
динамические массивы...


1-1152619279
Rater1
2006-07-11 16:01
2006.08.27
передать данные из excel в приложение


15-1154088626
test'er
2006-07-28 16:10
2006.08.27
Помогите с кодом


15-1154329986
Nic
2006-07-31 11:13
2006.08.27
Архитектура приложений


2-1154931678
alles
2006-08-07 10:21
2006.08.27
Можно убрать иконку форме MDIChild?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский