comment $
//-----------------------------------------------------------------------------------//
//  Source code                                                                      //
//                                                                                   //
//  Written      by  Chib, amdtm                     http://www.xxcontrols.com       //
//                                                                                   //
//  FileName   : Color.inc                                                           //
//  Description: libraries of functions for work with menu                           //
//  Version    : 1.00.000, January 1, 2004                                           //
//-----------------------------------------------------------------------------------//
$ 

; #########################################################################
;                                                                         ;
; Процедура изменяет значение состовляющих цвета RGB на более светлые     ;                           ;
; чем больше параметр lScale тем светлее получиться цвет.                 ;
;                                                                         ;
; #########################################################################

LightenColor proc uses ebx lScale :DWORD, lColor :COLORREF

    LOCAL R :DWORD
    LOCAL G :DWORD
    LOCAL B :DWORD

    GetRValue lColor
    mov ebx, 255
    sub ebx, eax
    mov R, eax
    invoke MulDiv, ebx, lScale, 255
    add R, eax
    
    GetGValue lColor
    mov ebx, 255
    sub ebx, eax
    mov G, eax
    invoke MulDiv, ebx, lScale, 255
    add G, eax
    
    GetBValue lColor
    mov ebx, 255
    sub ebx, eax
    mov B, eax
    invoke MulDiv, ebx, lScale, 255
    add B, eax
    
    RGB byte ptr R, byte ptr G, byte ptr B

    ret
LightenColor endp

; #########################################################################
;                                                                         ;
; Процедура изменяет значение состовляющих цвета RGB на более тёмные      ;                           ;
; чем больше параметр lScale тем темнее получиться цвет.                  ;
;                                                                         ;
; #########################################################################

DarkenColor proc uses ebx lScale :DWORD, lColor :COLORREF

    LOCAL R :DWORD
    LOCAL G :DWORD
    LOCAL B :DWORD

    GetRValue lColor
    mov ebx, 255
    sub ebx, lScale
    invoke MulDiv, eax, ebx, 255
    mov R, eax
    
    GetGValue lColor
    mov ebx, 255
    sub ebx, lScale
    invoke MulDiv, eax, ebx, 255
    mov G, eax
    
    GetBValue lColor
    mov ebx, 255
    sub ebx, lScale
    invoke MulDiv, eax, ebx, 255
    mov B, eax
    
    RGB byte ptr R, byte ptr G, byte ptr B

    ret
DarkenColor endp

; (86a + 14b) / 100

MixedColor proc colorA :COLORREF, colorB :COLORREF

    LOCAL R :DWORD
    LOCAL G :DWORD
    LOCAL B :DWORD

    GetRValue colorA
    invoke MulDiv, 86, eax, 100
    mov R, eax  
    GetRValue colorB
    invoke MulDiv, 14, eax, 100
    add R, eax      

    GetGValue colorA
    invoke MulDiv, 86, eax, 100
    mov G, eax  
    GetGValue colorB
    invoke MulDiv, 14, eax, 100
    add G, eax      

    GetBValue colorA
    invoke MulDiv, 86, eax, 100
    mov B, eax  
    GetBValue colorB
    invoke MulDiv, 14, eax, 100
    add B, eax      

    RGB byte ptr R, byte ptr G, byte ptr B

    ret
MixedColor endp

; (7a + 3b) / 10

MidColor proc colorA :COLORREF, colorB :COLORREF

    LOCAL R :DWORD
    LOCAL G :DWORD
    LOCAL B :DWORD

    GetRValue colorA
    invoke MulDiv, 7, eax, 10
    mov R, eax  
    GetRValue colorB
    invoke MulDiv, 3, eax, 10
    add R, eax      

    GetGValue colorA
    invoke MulDiv, 7, eax, 10
    mov G, eax  
    GetGValue colorB
    invoke MulDiv, 3, eax, 10
    add G, eax      

    GetBValue colorA
    invoke MulDiv, 7, eax, 10
    mov B, eax  
    GetBValue colorB
    invoke MulDiv, 3, eax, 10
    add B, eax      

    RGB byte ptr R, byte ptr G, byte ptr B

    ret
MidColor endp

; #########################################################################
;                                                                         ;
; Процедура возвращает цвет подходящий для темы XP                        ;                           ;
;                                                                         ;
; #########################################################################

GetXpHighlightColor proc uses edx

    call NumColorBits
    .if eax > 8
        invoke GetSysColor, COLOR_WINDOW
        mov edx, eax
        invoke GetSysColor, COLOR_HIGHLIGHT
        invoke MidColor,  edx, eax
    .else
        invoke GetSysColor, COLOR_WINDOW
    .endif

    ret
GetXpHighlightColor endp

; Grayscale = ( Red*30 + Green*59 + Blue*11 + 50 ) / 100
; Grayscale = ( Red*77 + Green*151 + Blue*28 + 50 ) / 256

GrayColor proc lColor :COLORREF

    LOCAL R :DWORD
    LOCAL G :DWORD

    GetRValue lColor
    invoke IntMul, eax, 77
    mov R, eax
    
    GetGValue lColor
    invoke IntMul, eax, 151
    mov G, eax
    
    GetBValue lColor
    invoke IntMul, eax, 28
    
    add eax, G
    add eax, R
    add eax, 50
    
    invoke IntDiv, eax, 256         

    ret
GrayColor endp

; #########################################################################
;                                                                         ;
; Процедура возвращает число цветов, которое способен отображать контекст.;                           ;
;                                                                         ;
; #########################################################################

NumColorBits proc

    LOCAL hDCDsk    :HDC
    LOCAL nBits     :DWORD

    mov hDCDsk, $invoke( GetDC, NULL )  ; DC of the desktop
    invoke GetDeviceCaps, hDCDsk, BITSPIXEL	
    .if eax == -1
        mov nBits, 8
    .else
        mov nBits, eax
    .endif
    invoke ReleaseDC, NULL, hDCDsk 
    
    return nBits
    
NumColorBits endp