forked from KolibriOS/kolibrios
1930ba2b36
git-svn-id: svn://kolibrios.org@2704 a494cfbc-eb01-0410-851d-a64ba20cac60
493 lines
15 KiB
NASM
493 lines
15 KiB
NASM
; COLORREF.ASM - COLOR REFERENCE
|
|
;
|
|
; Compile with FASM for Menuet
|
|
;
|
|
|
|
use32
|
|
org 0x0
|
|
|
|
db 'MENUET01' ; 8 byte id
|
|
dd 0x01 ; header version
|
|
dd start ; start of code
|
|
dd finis ; size of image
|
|
dd 0x1000 ; memory for app
|
|
dd 0x1000 ; esp
|
|
dd 0x0,0x0 ; I_Param , I_Icon
|
|
|
|
include 'lang.inc'
|
|
include '..\..\..\macros.inc'
|
|
wide: dd 0 ; screen pixels width
|
|
mouse: dd 0 ; 1=right,2=left [mouse click]
|
|
|
|
|
|
start:
|
|
|
|
mov eax,14 ; get screen size
|
|
mcall
|
|
shr eax,16 ; get width into AX
|
|
inc eax ; not 0 based
|
|
mov [wide],eax
|
|
|
|
call draw_window
|
|
|
|
still:
|
|
mov eax,23 ; wait for event w/timeout
|
|
mov ebx,5 ; delay in hundredths
|
|
mcall
|
|
|
|
cmp eax,1 ; redraw request ?
|
|
jne s1
|
|
jmp red
|
|
s1: cmp eax,2 ; key in buffer ?
|
|
jne s2
|
|
jmp key
|
|
s2: cmp eax,3 ; button in buffer ?
|
|
jne s3
|
|
jmp button
|
|
s3: mov eax,9 ; process info function
|
|
mov ebx,stat_table ; return data table
|
|
mov ecx,-1 ; who am i
|
|
mcall
|
|
cmp ax,[stat_table+4] ; are we active?
|
|
je active ; yep
|
|
jmp still
|
|
|
|
active:
|
|
mov eax,37 ; mouse info function
|
|
mov ebx,2 ; get buttons
|
|
mcall
|
|
cmp eax,0 ; mouse click?
|
|
jne click
|
|
jmp still
|
|
click:
|
|
mov [mouse],eax ; save mouse click
|
|
mov eax,37 ; mouse info
|
|
xor ebx,ebx ; get screen pos for mouse
|
|
mcall ; into EAX
|
|
xor ebx,ebx
|
|
mov bx,ax ; BX=y screen position
|
|
shr eax,16 ; AX=x screen position
|
|
xchg eax,ebx ; EAX=y, EBX=x
|
|
dec eax ; don't calc mouse scanline
|
|
mov ecx,[wide] ; get pixels wide
|
|
mul ecx
|
|
add ebx,eax ; add x
|
|
mov eax,35 ; get mouse pos pixel
|
|
mcall ; EAX=mouse pixel color
|
|
mov ebx,eax ; EBX has color
|
|
mov esi,colors ; color table
|
|
mov ecx,72 ; total colors
|
|
xor edx,edx ; init a counter
|
|
check:
|
|
lodsd
|
|
inc edx ; update counter
|
|
cmp ebx,eax ; color match?
|
|
je _match ; yep
|
|
loop check ; check all colors
|
|
jmp still ; no match
|
|
_match:
|
|
cmp [mouse],dword 1 ; right click?
|
|
je right ; yep
|
|
left:
|
|
cmp [picks],edx ; changed left color yet?
|
|
jne l1 ; no, do it
|
|
jmp still
|
|
l1: mov [picks],edx ; update left pick color
|
|
call clear ; erase old text
|
|
call draw_picks ; redraw colors and text
|
|
jmp still
|
|
right:
|
|
cmp [picks+4],edx ; changed right color yet?
|
|
jne r1 ; no, do it
|
|
jmp still
|
|
r1: mov [picks+4],edx ; update right pick color
|
|
call clear ; erase old text
|
|
call draw_picks ; redraw colors and text
|
|
jmp still
|
|
|
|
red: ; redraw
|
|
call draw_window
|
|
jmp still
|
|
|
|
key: ; key
|
|
mov eax,2 ; just read it and ignore
|
|
mcall
|
|
cmp al,0 ; key in buffer?
|
|
je k1 ; yep
|
|
jmp still
|
|
k1: cmp ah,'H' ; cap H ?
|
|
je k2 ; yep
|
|
cmp ah,'h' ; locase h ?
|
|
je k2 ; yep
|
|
jmp still
|
|
k2: call help ; show help screen
|
|
jmp still
|
|
|
|
button: ; button
|
|
mov eax,17 ; get id
|
|
mcall
|
|
cmp ah,1 ; button id=1 ?
|
|
je close
|
|
jmp still
|
|
|
|
close:
|
|
mov eax,-1 ; close this program
|
|
mcall
|
|
|
|
|
|
; *********************************************
|
|
; ******* WINDOW DEFINITIONS AND DRAW ********
|
|
; *********************************************
|
|
|
|
|
|
draw_window:
|
|
|
|
mcall 12,1
|
|
|
|
mov eax,0 ; DRAW WINDOW
|
|
mov ebx,1*65536+200 ; [x start] *65536 + [x size]
|
|
mov ecx,200*65536+240 ; [y start] *65536 + [y size]
|
|
mov edx,0x14000000 ; work area color (type II)
|
|
mov edi,title ; frame color
|
|
mcall
|
|
|
|
call palette ; display color palette
|
|
|
|
mcall 12, 2
|
|
|
|
ret
|
|
|
|
|
|
; *********************************************
|
|
; ******* COLOR PALETTE LAYOUT ROUTINES ******
|
|
; *********************************************
|
|
|
|
|
|
palette:
|
|
mov ebx,15*65536+18 ; LAYOUT: start x and width
|
|
mov edx,32*65536+18 ; LAYOUT: start y and depth
|
|
mov ecx,8 ; 8 rows
|
|
mov ebp,colors ; color table
|
|
p1: push ecx
|
|
mov ecx,9 ; 9 columns
|
|
p2: push ecx
|
|
push edx
|
|
mov ecx,edx ; y coord
|
|
mov edx,[ebp] ; color
|
|
mov eax,13 ; draw bar function
|
|
mcall
|
|
pop edx
|
|
pop ecx
|
|
add ebx,19*65536 ; next column
|
|
add ebp,4 ; next color
|
|
p3: loop p2
|
|
pop ecx
|
|
mov ebx,15*65536+18 ; restart x
|
|
add edx,19*65536 ; next row
|
|
loop p1
|
|
call draw_picks
|
|
|
|
ret
|
|
|
|
draw_picks:
|
|
mov ebx,64*65536+24 ; draw x and width
|
|
mov ecx,188*65536+42 ; draw y and depth
|
|
mov edx,0xc0c0c0 ; color grey
|
|
mov eax,13 ; draw bar function
|
|
mcall
|
|
mov eax,[picks] ; first picked color
|
|
mov esi,22*65536+196 ; print at x and y
|
|
call do_hex ; print color number
|
|
mov eax,[picks+4] ; second picked color
|
|
mov esi,22*65536+215 ; print at x and y
|
|
call do_hex ; print color number
|
|
mov eax,[picks] ; first picked color
|
|
mov ebx,67*65536+18 ; x and width
|
|
mov esi,191*65536+18 ; y and depth
|
|
call do_color ; paint color 1 square
|
|
mov eax,[picks+4] ; second picked color
|
|
mov ebx,67*65536+18 ; x and width
|
|
mov esi,209*65536+18 ; y and depth
|
|
call do_color ; paint color 2 square
|
|
mov eax,[picks] ; first picked color
|
|
mov ebx,96*65536+196 ; x and y
|
|
call do_name ; print color's name
|
|
mov eax,[picks+4] ; second picked color
|
|
mov ebx,96*65536+215 ; x and y
|
|
call do_name ; print color's name
|
|
|
|
ret
|
|
|
|
do_hex:
|
|
dec eax ; use 0 base
|
|
mov ecx,4 ; dword length
|
|
mul ecx ; calc pointer
|
|
mov edi,colors ; color table
|
|
add edi,eax ; add offset
|
|
mov ecx,[edi] ; save color 1
|
|
mov ebx,0x60100 ; print 6 hex digits
|
|
mov edx,esi ; copy color
|
|
mov esi,0xe1e1e1 ; use white
|
|
mov eax,47 ; print number function
|
|
mcall
|
|
|
|
ret
|
|
|
|
do_color:
|
|
dec eax ; use 0 base
|
|
mov ecx,4 ; dword length
|
|
mul ecx ; calc pointer
|
|
mov edi,colors ; color table
|
|
add edi,eax ; add offset
|
|
mov edx,[edi] ; color
|
|
mov ecx,esi ; recover y an depth
|
|
mov eax,13 ; draw bar function
|
|
mcall
|
|
|
|
ret
|
|
|
|
do_name:
|
|
dec eax ; use 0 base
|
|
mov ecx,15 ; string length
|
|
mul ecx ; calc pointer
|
|
mov edx,names ; color table
|
|
add edx,eax ; add offset
|
|
mov ecx,0xe1e1e1 ; color
|
|
mov esi,15
|
|
mov eax,4 ; print text function
|
|
mcall
|
|
|
|
ret
|
|
|
|
clear:
|
|
mov ebx,22*65536+36 ; x and width
|
|
mov ecx,196*65536+26 ; y and depth
|
|
mov edx,0x000000 ; color
|
|
mov eax,13 ; draw bar funx
|
|
mcall
|
|
mov ebx,96*65536+90 ; x and width
|
|
mov ecx,196*65536+26 ; y and depth
|
|
mov edx,0x000000 ; color
|
|
mov eax,13 ; draw bar funx
|
|
mcall
|
|
|
|
ret
|
|
|
|
help:
|
|
mcall 48,4
|
|
mov ecx, eax
|
|
shl ecx, 16
|
|
add ecx, 236
|
|
sub ecx, eax
|
|
|
|
|
|
mov ebx,5*65536+191 ; x and width
|
|
mov edx,0x465e8f ; dark denim color
|
|
mov eax,13 ; write text funx
|
|
mcall
|
|
mov ebx,20*65536+40 ; starting x and y
|
|
mov edx,text ; start of text
|
|
mov esi,27 ; width of text
|
|
mov ecx,14 ; 14 text lines to do
|
|
mov eax,4 ; write text funx
|
|
h1: push ecx
|
|
sub ebx,65537 ; drop shadow x and y
|
|
mov ecx,0x000000 ; black shadow
|
|
mcall
|
|
add ebx,65537 ; original x and y
|
|
mov ecx,0xefefef ; white text
|
|
mcall
|
|
add edx,27 ; next line of text
|
|
add bx,12 ; next row
|
|
pop ecx
|
|
loop h1
|
|
mov eax,10 ; wait on event
|
|
mcall
|
|
cmp eax,2 ; got a key?
|
|
jne h2 ; nope
|
|
mov eax,2 ; yep, burn it
|
|
mcall
|
|
h2:
|
|
call draw_window
|
|
|
|
ret
|
|
|
|
|
|
; *********************************************
|
|
; ********** DATA DEFINITIONS AREA ***********
|
|
; *********************************************
|
|
|
|
title db 'COLOR REFERENCE H>HELP',0
|
|
|
|
picks:
|
|
dd 31,2 ; selected top/bot colors
|
|
|
|
colors:
|
|
dd 0xe0e0e0 ; white
|
|
dd 0xe7e6a0 ; pale yellow
|
|
dd 0xe7e05a ; lemon yellow
|
|
dd 0xe7c750 ; mustard
|
|
dd 0xe7b850 ; cadium yellow
|
|
dd 0xbfa461 ; yellow ocre
|
|
dd 0xe0c090 ; cream
|
|
dd 0xe0b27b ; peach
|
|
dd 0xe2986d ; dark peach
|
|
dd 0xebb2c0 ; pink
|
|
dd 0xe0b0a0 ; flesh
|
|
dd 0xc79790 ; artificial arm
|
|
dd 0xb88688 ; deep blush
|
|
dd 0xc4a077 ; washed khaki
|
|
dd 0xb69269 ; khaki
|
|
dd 0xa8845b ; dark khaki
|
|
dd 0xab937a ; beige
|
|
dd 0xa39370 ; poupon
|
|
dd 0x988c00 ; camouflage
|
|
dd 0x98a024 ; pale olive
|
|
dd 0x838b00 ; olive
|
|
dd 0x6d7600 ; dark olive
|
|
dd 0x5b6200 ; black olive
|
|
dd 0x94946a ; washed army
|
|
dd 0x74744a ; army
|
|
dd 0x66a696 ; pale teal
|
|
dd 0x409b90 ; faded teal
|
|
dd 0x008d8d ; pastel teal
|
|
dd 0x007c7c ; teal
|
|
dd 0x006464 ; dark teal
|
|
dd 0x00b8ca ; light turquoise
|
|
dd 0x00a0b2 ; turquoise
|
|
dd 0x00889a ; dark turquoise
|
|
dd 0x575f8c ; medium cobalt
|
|
dd 0x4e4e7c ; cobalt
|
|
dd 0x00459a ; ultramarine
|
|
dd 0x400088 ; navy blue
|
|
dd 0x4e00e7 ; true blue
|
|
dd 0x508cec ; sky blue
|
|
dd 0x6a73d0 ; mountain blue
|
|
dd 0x677ab0 ; faded jeans
|
|
dd 0x576fa0 ; denim
|
|
dd 0xd048c8 ; fuschia
|
|
dd 0xb800e7 ; lavendar
|
|
dd 0xa800a8 ; light violet
|
|
dd 0x780078 ; violet
|
|
dd 0x520064 ; purple
|
|
dd 0xb800b8 ; magenta
|
|
dd 0xa4307a ; rose
|
|
dd 0x90207f ; mauve
|
|
dd 0xe76e83 ; salmon
|
|
dd 0xea7a7d ; pastel orange
|
|
dd 0xe26830 ; orange
|
|
dd 0xac5800 ; burnt sienna
|
|
dd 0xcc0000 ; red orange
|
|
dd 0xac0000 ; cadium red
|
|
dd 0x880040 ; brick red
|
|
dd 0x780000 ; rust
|
|
dd 0x683020 ; terra cotta
|
|
dd 0x7f4658 ; light maroon
|
|
dd 0x702050 ; maroon
|
|
dd 0x7a5b5f ; umber blush
|
|
dd 0x584838 ; burnt umber
|
|
dd 0x8a5d1a ; cigar brown
|
|
dd 0x64504a ; ice brown
|
|
dd 0x564242 ; dark chocolate
|
|
dd 0x00aa66 ; celery stalk
|
|
dd 0x107a30 ; forest green
|
|
dd 0x365800 ; hooker's green
|
|
dd 0x8beb88 ; pastel lime
|
|
dd 0x7bbb64 ; lime
|
|
dd 0x4ba010 ; dark lime
|
|
|
|
names:
|
|
db 'WHITE '
|
|
db 'PALE YELLOW '
|
|
db 'LEMON YELLOW '
|
|
db 'MUSTARD '
|
|
db 'CADIUM YELLOW '
|
|
db 'YELLOW OCRE '
|
|
db 'CREAM '
|
|
db 'PEACH '
|
|
db 'DARK PEACH '
|
|
db 'PINK '
|
|
db 'FLESH '
|
|
db 'ARTIFICIAL ARM '
|
|
db 'DEEP BLUSH '
|
|
db 'WASHED KHAKI '
|
|
db 'KHAKI '
|
|
db 'DARK KHAKI '
|
|
db 'BEIGE '
|
|
db 'POUPON '
|
|
db 'CAMOUFLAGE '
|
|
db 'PALE OLIVE '
|
|
db 'OLIVE '
|
|
db 'DARK OLIVE '
|
|
db 'BLACK OLIVE '
|
|
db 'WASHED ARMY '
|
|
db 'ARMY '
|
|
db 'PALE TEAL '
|
|
db 'FADED TEAL '
|
|
db 'PASTEL TEAL '
|
|
db 'TEAL '
|
|
db 'DARK TEAL '
|
|
db 'LIGHT TURQUOISE'
|
|
db 'TURQUOISE '
|
|
db 'DARK TURQUOISE '
|
|
db 'MEDIUM COBALT '
|
|
db 'COBALT '
|
|
db 'ULTRAMARINE '
|
|
db 'NAVY BLUE '
|
|
db 'TRUE BLUE '
|
|
db 'SKY BLUE '
|
|
db 'MOUNTAIN BLUE '
|
|
db 'FADED JEANS '
|
|
db 'DENIM '
|
|
db 'FUSHIA '
|
|
db 'LAVENDAR '
|
|
db 'LIGHT VIOLET '
|
|
db 'VIOLET '
|
|
db 'PURPLE '
|
|
db 'MAGENTA '
|
|
db 'ROSE '
|
|
db 'MAUVE '
|
|
db 'SALMON '
|
|
db 'PASTEL ORANGE '
|
|
db 'ORANGE '
|
|
db 'BURNT SIENNA '
|
|
db 'RED ORANGE '
|
|
db 'CADIUM RED '
|
|
db 'BRICK RED '
|
|
db 'RUST '
|
|
db 'TERRA COTTA '
|
|
db 'LIGHT MAROON '
|
|
db 'MAROON '
|
|
db 'UMBER BLUSH '
|
|
db 'BURNT UMBER '
|
|
db 'CIGAR BROWN '
|
|
db 'ICE BROWN '
|
|
db 'DARK CHOCOLATE '
|
|
db 'CELERY STALK '
|
|
db 'FOREST GREEN '
|
|
db "HOOKER'S GREEN "
|
|
db 'PASTEL LIME '
|
|
db 'LIME '
|
|
db 'DARK LIME '
|
|
|
|
|
|
text:
|
|
db 'TO SEE HOW COLORS COMPARE '
|
|
db 'TO ONE ANOTHER, LEFT CLICK '
|
|
db 'THE FIRST COLOR AND RIGHT '
|
|
db 'CLICK THE SECOND. TO GET '
|
|
db "A SENSE OF A COLOR'S TRUE "
|
|
db 'HUE, RIGHT AND LEFT CLICK '
|
|
db 'THE SAME COLOR TO SEE IT '
|
|
db 'ON THE NEUTRAL BACKGROUND. '
|
|
db 'TO USE A LIGHTER OR DARKER '
|
|
db 'VALUE OF A COLOR, ADD OR '
|
|
db 'SUBTRACT 0x10 OR 0x20 FROM '
|
|
db 'EACH BYTE OF ITS HEX VALUE.'
|
|
db ' '
|
|
db ' ANY KEY ... '
|
|
|
|
stat_table:
|
|
|
|
|
|
finis: |