Subversion Repositories Kolibri OS

Rev

Rev 485 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;
  2. ;    UNIFORM WINDOW COLOURS & SKIN
  3. ;
  4. ;    Compile with FASM for Menuet
  5. ;
  6. ;    < russian edition by Ivan Poddubny >
  7. ;    < skin selection by Mike Semenyako >
  8. ;
  9.  
  10. ;******************************************************************************
  11.    use32
  12.    org     0
  13.    db      'MENUET01'  ; identifier
  14.    dd      1           ; header version
  15.    dd      START       ; start address
  16.    dd      I_END       ; file size
  17.    dd      28000h      ; memory
  18.    dd      10000h      ; stack pointer
  19.    dd      0,0         ; parameters, reserved
  20.  
  21.    include 'lang.inc'
  22.    include '..\..\macros.inc'
  23.    include 'kglobals.inc'
  24.    include 'unpacker.inc'
  25. ;******************************************************************************
  26.  
  27.  
  28. struct SKIN_HEADER
  29.   ident   dd ?
  30.   version dd ?
  31.   params  dd ?
  32.   buttons dd ?
  33.   bitmaps dd ?
  34. ends
  35.  
  36. struct SKIN_PARAMS
  37.   skin_height    dd ?
  38.   margin.right   dw ?
  39.   margin.left    dw ?
  40.   margin.bottom  dw ?
  41.   margin.top     dw ?
  42.   colors.inner   dd ?
  43.   colors.outer   dd ?
  44.   colors.frame   dd ?
  45.   colors_1.inner dd ?
  46.   colors_1.outer dd ?
  47.   colors_1.frame dd ?
  48.   dtp.size       dd ?
  49.   dtp.data       db 40 dup (?)
  50. ends
  51.  
  52. struct SKIN_BUTTONS
  53.   type     dd ?
  54.   pos:
  55.     left   dw ?
  56.     top    dw ?
  57.   size:
  58.     width  dw ?
  59.     height dw ?
  60. ends
  61.  
  62. struct SKIN_BITMAPS
  63.   kind  dw ?
  64.   type  dw ?
  65.   _data  dd ?
  66. ends
  67.  
  68.  
  69. START:                          ; start of execution
  70.  
  71.     mov  eax,48                 ; get current colors
  72.     mov  ebx,3
  73.     mov  ecx,color_table
  74.     mov  edx,4*10
  75.     mcall
  76.  
  77.     cld
  78.     mov  esi,default_skn
  79.     mov  edi,fname
  80.     mov  ecx,default_skn.size
  81.     rep  movsb
  82.     call load_skin_file
  83.  
  84. ;    mov  esi, default_dtp
  85. ;    mov  edi, fname
  86. ;    mov  ecx, default_dtp.size
  87. ;    rep  movsb
  88.  
  89. red:
  90.     call draw_window            ; at first, draw the window
  91.  
  92. still:
  93.  
  94.     mov  eax,23                 ; wait here for event
  95.     mov  ebx,5
  96.     mcall
  97.  
  98.     dec  eax                    ; redraw request ?
  99.     jz   red
  100.     dec  eax                    ; key in buffer ?
  101.     jz   key
  102.     dec  eax                    ; button in buffer ?
  103.     jz   button
  104.  
  105.     call draw_cursor
  106.  
  107.     jmp  still
  108.  
  109.  
  110.   key:                          ; key
  111.     mov  al,2                   ; just read it and ignore
  112.     mcall
  113.     jmp  still
  114.  
  115.   button:                       ; button
  116.     mov  al,17                  ; get id
  117.     mcall
  118.  
  119.     cmp  ah,11                  ; read string
  120.     jne  no_string
  121.     call read_string
  122.     jmp  still
  123.   no_string:
  124.  
  125.     cmp  ah,12                  ; load file
  126.     jne  no_load
  127.     call load_file
  128.     call draw_window
  129.     jmp  still
  130.   no_load:
  131.  
  132.     cmp  ah,13                  ; save file
  133.     jne  no_save
  134.     call save_file
  135.     jmp  still
  136.   no_save:
  137.  
  138.     cmp  ah,14                  ; set 3d buttons
  139.     jne  no_3d
  140.     mov  eax,48
  141.     mov  ebx,1
  142.     mov  ecx,1
  143.     mcall
  144.     jmp  doapply
  145.    no_3d:
  146.  
  147.     cmp  ah,15                  ; set flat buttons
  148.     jne  no_flat
  149.     mcall 48, 1, 0
  150. doapply:
  151.     mcall 48, 0, 0
  152.     jmp  still
  153.   no_flat:
  154.  
  155.     cmp  ah,16                  ; apply
  156.     jne  no_apply
  157.   apply_direct:
  158.     mov  eax,48
  159.     mov  ebx,2
  160.     mov  ecx,color_table
  161.     mov  edx,10*4
  162.     mcall
  163.     jmp  doapply
  164.   no_apply:
  165.  
  166.     cmp  ah,17                  ; load skin file
  167.     jne  no_load_skin
  168.     call load_skin_file
  169.     call draw_window
  170.     jmp  still
  171.   no_load_skin:
  172.  
  173.     cmp   ah,18                 ; apply skin
  174.     jne   no_apply_skin
  175.     cmp   [skin_info.fname],0
  176.     je    no_apply_skin
  177.     mcall 48,8,skin_info.fname
  178.     call  draw_window
  179.     jmp   still
  180.   no_apply_skin:
  181.  
  182.     cmp  ah,31
  183.     jb   no_new_colour
  184.     cmp  ah,41
  185.     jg   no_new_colour
  186.     shr  eax,8
  187.     sub  eax,31
  188.     shl  eax,2
  189.     mov  ebx,[color]
  190.     mov  [eax+color_table],ebx
  191.     cmp  dword[0x18000+SKIN_HEADER.ident],'SKIN'
  192.     jne  @f
  193.     mov  edi,[0x18000+SKIN_HEADER.params]
  194.     mov  dword[edi+0x18000+SKIN_PARAMS.dtp.data+eax],ebx
  195.     call draw_skin
  196. @@: call draw_colours
  197.     jmp  still
  198.   no_new_colour:
  199.  
  200.     cmp  ah,1                   ; terminate
  201.     jnz  noid1
  202.     or   eax,-1
  203.     mcall
  204.   noid1:
  205.  
  206.     jmp  still
  207.  
  208.  
  209. draw_cursor:
  210.  
  211.     pusha
  212.     mov  eax,37
  213.     mov  ebx,2
  214.     mcall
  215.  
  216.     cmp  eax,0
  217.     jne  dc1
  218.     popa
  219.     ret
  220.  
  221.  dc1:
  222.  
  223.     mov  eax,37
  224.     mov  ebx,1
  225.     mcall
  226.  
  227.     mov  ebx,eax
  228.     shr  ebx,16
  229.     mov  ecx,eax
  230.     and  ecx,0xffff
  231.  
  232.     cmp  ecx,32
  233.     jbe  no_color
  234.     cmp  ebx,32
  235.     jbe  no_color
  236.  
  237.     cmp  ebx,266           ; CHANGE COLOR
  238.     jb   no_color
  239.     cmp  ebx,266+20*3
  240.     jg   no_color
  241.  
  242.     cmp  ecx,30+128
  243.     jge  no_color
  244.     cmp  ecx,30
  245.     jb   no_color
  246.  
  247.     sub  ebx,266
  248.     mov  eax,ebx
  249.     cdq
  250.     mov  ebx,20
  251.     div  ebx
  252.     mov  ebx,2
  253.     sub  ebx,eax
  254.  
  255.     add  ecx,-30
  256.     not  ecx
  257.     shl  ecx,1
  258.  
  259.     mov  byte [ebx+color],cl
  260.     call draw_color
  261.  
  262.     popa
  263.     ret
  264.  
  265.   no_color:
  266.  
  267.     popa
  268.     ret
  269.  
  270.  
  271. load_file:
  272.         xor     eax, eax
  273.         mov     ebx, read_info
  274.         mov     dword [ebx], eax       ; subfunction: read
  275.         mov     dword [ebx+4], eax     ; offset (low dword)
  276.         mov     dword [ebx+8], eax     ; offset (high dword)
  277.         mov     dword [ebx+12], 40     ; read colors file: 4*10 bytes
  278.         mov     dword [ebx+16], color_table ; address
  279.         mcall   70
  280.         ret
  281.  
  282. load_skin_file:
  283.         xor     eax, eax
  284.         mov     ebx, read_info
  285.         mov     dword [ebx], eax       ; subfunction: read
  286.         mov     dword [ebx+4], eax     ; offset (low dword)
  287.         mov     dword [ebx+8], eax     ; offset (high dword)
  288.         mov     dword [ebx+12], 32*1024 ; read: max 32 KBytes
  289.         mov     dword [ebx+16], 0x10000 ; address
  290.         mcall   70
  291.  
  292.         mov     esi, 0x10000
  293.  
  294.         cmp     dword [esi], 'KPCK'
  295.         jnz     notpacked
  296.         cmp     dword [esi+4], 32*1024 ; max 32 KBytes
  297.         ja      doret
  298.         push    0x20000
  299.         push    esi
  300.         call    unpack
  301.         mov     esi, 0x20000
  302. notpacked:
  303.  
  304.     cmp   dword[esi+SKIN_HEADER.ident],'SKIN'
  305.     jne   doret
  306.  
  307.     mov   edi,0x18000
  308.     mov   ecx,0x8000/4
  309.     rep   movsd
  310.  
  311.     mov   esi,fname
  312.     mov   edi,skin_info.fname
  313.     mov   ecx,257
  314.     rep   movsb
  315.  
  316.     mov   ebp,0x18000
  317.     mov   esi,[ebp+SKIN_HEADER.params]
  318.     add   esi,ebp
  319.     lea   esi,[esi+SKIN_PARAMS.dtp.data]
  320.     mov   edi,color_table
  321.     mov   ecx,10
  322.     rep   movsd
  323.   doret:
  324.  
  325. ret
  326.  
  327.  
  328. save_file:
  329.         mov     ebx, write_info
  330.         mov     dword [ebx], 2         ; subfunction: write
  331.         and     dword [ebx+4], 0       ; (reserved)
  332.         and     dword [ebx+8], 0       ; (reserved)
  333.         mov     dword [ebx+12], 10*4   ; bytes to write
  334.         mov     dword [ebx+16], color_table ; address
  335.         mcall   70
  336.         ret
  337.  
  338. read_string:
  339.  
  340.     pusha
  341.  
  342.     mov  edi,fname
  343.     mov  al,'_'
  344.     mov  ecx,87
  345.     cld
  346.     rep  stosb
  347.  
  348.     call print_text
  349.  
  350.     mov  edi,fname
  351.  
  352.   f11:
  353.     mov  eax,10
  354.     mcall
  355.     cmp  eax,2
  356.     jne  read_done
  357. ;    mov  eax,2
  358.     mcall
  359.     shr  eax,8
  360.     cmp  eax,13
  361.     je   read_done
  362.     cmp  eax,8
  363.     jne  nobsl
  364.     cmp  edi,fname
  365.     je   f11
  366.     dec  edi
  367.     mov  [edi],byte '_'
  368.     call print_text
  369.     jmp  f11
  370.    nobsl:
  371.     mov  [edi],al
  372.  
  373.     call print_text
  374.  
  375.     inc  edi
  376.     cmp  edi, fname+87
  377.     jne  f11
  378.  
  379.   read_done:
  380.  
  381.     mov  ecx, fname+88
  382.     sub  ecx, edi
  383.     mov  eax, 0
  384.     cld
  385.     rep  stosb
  386.  
  387.     call print_text
  388.  
  389.     popa
  390.  
  391.     ret
  392.  
  393.  
  394. print_text:
  395.     pushad
  396.  
  397.     mpack ebx,15,6*87+4
  398.     mpack ecx,(30+18*10+2),11
  399.     mcall 13,,,[w_work]
  400.  
  401.     mpack ebx,17,(30+18*10+4)
  402.     mcall 4,,[w_work_text],fname,87
  403.  
  404.     popad
  405. ret
  406.  
  407.  
  408. draw_color:
  409.  
  410.     pusha
  411.  
  412.     mov  eax,13
  413.     mov  ebx,266*65536+60
  414.     mov  ecx,170*65536+30
  415.     mov  edx,[color]
  416.     mcall
  417.  
  418. ;   mov  eax,13
  419.     mov  ebx,266*65536+60
  420.     mov  ecx,200*65536+10
  421.     mov  edx,[w_work]
  422.     mcall
  423.  
  424.     mov  eax,47
  425.     mov  ebx,0+1*256+8*65536
  426.     mov  ecx,[color]
  427.     mov  edx,272*65536+201
  428.     mov  esi,[w_work_text]
  429.     mcall
  430.  
  431.     popa
  432.  
  433.     ret
  434.  
  435.  
  436. draw_colours:
  437.  
  438.     pusha
  439.  
  440.     mov  esi,color_table
  441.  
  442.     mov  ebx,225*65536+32
  443.     mov  ecx,32*65536+12
  444.   newcol:
  445.     mov  eax,13
  446.     mov  edx,[esi]
  447.     mcall
  448.     add  ecx,18*65536
  449.     add  esi,4
  450.     cmp  esi,color_table+4*9
  451.     jbe  newcol
  452.  
  453.     popa
  454.  
  455.     ret
  456.  
  457.  
  458. draw_framerect: ; ebx,ecx
  459.         push    ebx ecx
  460.         add     bx,[esp+6]
  461.         mov     cx,[esp+2]
  462.         dec     ebx
  463.         mcall   38
  464.         add     cx,[esp]
  465.         rol     ecx,16
  466.         add     cx,[esp]
  467.         sub     ecx,0x00010001
  468.         mcall
  469.         mov     ebx,[esp+4]
  470.         mov     ecx,[esp]
  471.         mov     bx,[esp+6]
  472.         add     cx,[esp+2]
  473.         dec     ecx
  474.         mcall
  475.         add     bx,[esp+4]
  476.         rol     ebx,16
  477.         add     bx,[esp+4]
  478.         sub     ebx,0x00010001
  479.         mcall
  480.         add     esp,8
  481.         ret
  482.  
  483. find_bitmap:
  484.         mov     edi,[ebp+SKIN_HEADER.bitmaps]
  485.         add     edi,ebp
  486.         xor     ebx,ebx
  487.   .lp1: cmp     dword[edi],0
  488.         je      .lp2
  489.         cmp     dword[edi+0],eax
  490.         jne     @f
  491.         mov     ebx,[edi+SKIN_BITMAPS._data]
  492.         add     ebx,ebp
  493.         mov     ecx,[ebx-2]
  494.         mov     cx,[ebx+4]
  495.         add     ebx,8
  496.   .lp2: ret
  497.     @@: add     edi,8
  498.         jmp     .lp1
  499.  
  500. dec_edx:
  501.         sub     dl,4
  502.         jnc     @f
  503.         xor     dl,dl
  504.     @@: sub     dh,4
  505.         jnc     @f
  506.         xor     dh,dh
  507.     @@: rol     edx,16
  508.         sub     dl,4
  509.         jnc     @f
  510.         xor     dl,dl
  511.     @@: rol     edx,16
  512.         ret
  513.  
  514. area:
  515.   .x      = 345
  516.   .y      = 20
  517.   .width  = 206
  518.   .height = 191
  519.  
  520. wnd1:
  521.   .x      = area.x+49
  522.   .y      = area.y+5
  523.   .width  = 150
  524.   .height = 90
  525. wnd2:
  526.   .x      = area.x+35
  527.   .y      = area.y+35
  528.   .width  = 150
  529.   .height = 90
  530. wnd3:
  531.   .x      = area.x+21
  532.   .y      = area.y+65
  533.   .width  = 150
  534.   .height = 90
  535. wnd4:
  536.   .x      = area.x+7
  537.   .y      = area.y+95
  538.   .width  = 150
  539.   .height = 90
  540.  
  541. virtual at edi+SKIN_PARAMS.dtp.data
  542.   dtp system_colors
  543. end virtual
  544.  
  545. draw_skin:
  546.         mcall   13,<area.x,area.width>,<area.y+2,area.height-2>,0x00FFFFFF
  547.  
  548.         mov     ebp,0x18000
  549.         mov     edi,[ebp+SKIN_HEADER.params]
  550.         add     edi,ebp
  551.         mpack   ebx,wnd1.x,wnd1.width
  552.         mpack   ecx,wnd1.y,wnd1.height
  553.         mov     edx,[dtp.frame]
  554.         call    draw_framerect
  555.         mcall   13,<wnd1.x+1,wnd1.width-2>,<wnd1.y+1,wnd1.height-2>,dword[dtp.work]
  556.  
  557.         mov     eax,38
  558.         mpack   ebx,wnd1.x+1,wnd1.x+wnd1.width-2
  559.         mpack   ecx,wnd1.y+1,wnd1.y+1
  560.         mov     edx,[dtp.grab]
  561.         mov     esi,20
  562.     @@: mcall
  563.         call    dec_edx
  564.         add     ecx,0x00010001
  565.         dec     esi
  566.         jnz     @b
  567.  
  568.         mov     edi,[ebp+SKIN_HEADER.params]
  569.         add     edi,ebp
  570.         mcall   4,<wnd1.x+6,wnd1.y+7>,dword[dtp.grab_text],caption_text,caption_text.size
  571.  
  572.         mcall   8,<wnd1.x+wnd1.width-18,12>,<wnd1.y+4,12>,0,[dtp.grab_button]
  573.         mcall   4,<wnd1.x+wnd1.width-18+4,wnd1.y+4+2>,dword[dtp.grab_button_text],close_text,close_text.size
  574.  
  575. ;----------------------------------------------------------------------
  576.  
  577.         mov     edi,[ebp+SKIN_HEADER.params]
  578.         add     edi,ebp
  579.         mpack   ebx,wnd2.x,wnd2.width
  580.         mpack   ecx,wnd2.y,wnd2.height
  581.         mov     edx,[dtp.frame]
  582.         shr     edx,1
  583.         and     edx,0x007F7F7F
  584.         call    draw_framerect
  585.         mpack   ebx,wnd2.x+4,wnd2.width-8
  586.         mpack   ecx,wnd2.y+4,wnd2.height-8
  587.         call    draw_framerect
  588.         mcall   13,<wnd2.x+1,wnd2.width-2>,<wnd2.y+1,3>,[dtp.frame]
  589.         add     ecx,(wnd2.height-5)*65536
  590.         mcall
  591.         mcall   ,<wnd2.x+1,3>,<wnd2.y+1,wnd2.height-2>
  592.         add     ebx,(wnd2.width-5)*65536
  593.         mcall
  594.         mcall   ,<wnd2.x+5,wnd2.width-10>,<wnd2.y+5,wnd2.height-10>,dword[dtp.work]
  595.  
  596.         mov     eax,38
  597.         mpack   ebx,wnd2.x+4,wnd2.x+wnd2.width-5
  598.         mpack   ecx,wnd2.y+4,wnd2.y+4
  599.         mov     edx,[dtp.grab]
  600.         mov     esi,16
  601.     @@: mcall
  602.         call    dec_edx
  603.         add     ecx,0x00010001
  604.         dec     esi
  605.         jnz     @b
  606.  
  607.         mov     edi,[ebp+SKIN_HEADER.params]
  608.         add     edi,ebp
  609.         mcall   4,<wnd2.x+8,wnd2.y+7>,dword[dtp.grab_text],caption_text,caption_text.size
  610.  
  611.         mcall   8,<wnd2.x+wnd2.width-20,12>,<wnd2.y+4,12>,0,[dtp.grab_button]
  612.         mcall   4,<wnd2.x+wnd2.width-20+4,wnd2.y+4+2>,dword[dtp.grab_button_text],close_text,close_text.size
  613.  
  614. ;----------------------------------------------------------------------
  615.  
  616.         mov     edi,[ebp+SKIN_HEADER.params]
  617.         add     edi,ebp
  618.         mpack   ebx,wnd3.x,wnd3.width
  619.         mpack   ecx,wnd3.y,wnd3.height
  620.         mov     edx,[edi+SKIN_PARAMS.colors_1.outer]
  621.         call    draw_framerect
  622.         mpack   ebx,wnd3.x+4,wnd3.width-8
  623.         mpack   ecx,wnd3.y+4,wnd3.height-8
  624.         mov     edx,[edi+SKIN_PARAMS.colors_1.inner]
  625.         call    draw_framerect
  626.         mcall   13,<wnd3.x+1,wnd3.width-2>,<wnd3.y+1,3>,[edi+SKIN_PARAMS.colors_1.frame]
  627.         add     ecx,(wnd3.height-5)*65536
  628.         mcall
  629.         mcall   ,<wnd3.x+1,3>,<wnd3.y+1,wnd3.height-2>
  630.         add     ebx,(wnd3.width-5)*65536
  631.         mcall
  632.         mcall   ,<wnd3.x+5,wnd3.width-10>,<wnd3.y+5,wnd3.height-10>,dword[dtp.work]
  633.  
  634.         mov     eax,0x00000001 ; left, inactive
  635.         call    find_bitmap
  636.         mcall   7,,,<wnd3.x,wnd3.y>
  637.  
  638.         pushd   [ebx-8]
  639.         mov     eax,0x00000003 ; base, inactive
  640.         call    find_bitmap
  641.         pop     edx
  642.         mov     esi,wnd3.x+wnd3.width-1
  643.         sub     esi,edx
  644.         shl     edx,16
  645.         add     edx,wnd3.x*65536+wnd3.y
  646.         mcall   7
  647.     @@: rol     edx,16
  648.         add     dx,[ebx-8]
  649.         cmp     dx,si
  650.         ja      @f
  651.         rol     edx,16
  652.         mcall   7
  653.         jmp     @b
  654.     @@:
  655.  
  656.         mov     eax,0x00000002 ; oper, inactive
  657.         call    find_bitmap
  658.         mov     edx,ecx
  659.         shr     edx,16
  660.         neg     edx
  661.         shl     edx,16
  662.         add     edx,(wnd3.x+wnd3.width)*65536+wnd3.y
  663.         mcall   7
  664.  
  665.         mov     ebp,0x18000
  666.         mov     edi,[ebp+SKIN_HEADER.params]
  667.         add     edi,ebp
  668.         mov     eax,dword[edi+SKIN_PARAMS.margin.left-2]
  669.         mov     ax,word[edi+SKIN_PARAMS.skin_height]
  670.         sub     ax,[edi+SKIN_PARAMS.margin.bottom]
  671.         shr     ax,1
  672.         add     ax,[edi+SKIN_PARAMS.margin.top]
  673.         add     ax,-4
  674.         push    eax
  675.         lea     ebx,[eax+wnd3.x*65536+wnd3.y]
  676.         mcall   4,,dword[dtp.grab_text],caption_text,caption_text.size
  677.  
  678. ;---------------------------------------------------------
  679.  
  680.         mov     edi,[ebp+SKIN_HEADER.params]
  681.         add     edi,ebp
  682.         mpack   ebx,wnd4.x,wnd4.width
  683.         mpack   ecx,wnd4.y,wnd4.height
  684.         mov     edx,[edi+SKIN_PARAMS.colors.outer]
  685.         call    draw_framerect
  686.         mpack   ebx,wnd4.x+4,wnd4.width-8
  687.         mpack   ecx,wnd4.y+4,wnd4.height-8
  688.         mov     edx,[edi+SKIN_PARAMS.colors.inner]
  689.         call    draw_framerect
  690.         mcall   13,<wnd4.x+1,wnd4.width-2>,<wnd4.y+1,3>,[edi+SKIN_PARAMS.colors.frame]
  691.         add     ecx,(wnd4.height-5)*65536
  692.         mcall
  693.         mcall   ,<wnd4.x+1,3>,<wnd4.y+1,wnd4.height-2>
  694.         add     ebx,(wnd4.width-5)*65536
  695.         mcall
  696.         mcall   ,<wnd4.x+5,wnd4.width-10>,<wnd4.y+5,wnd4.height-10>,dword[dtp.work]
  697.  
  698.         mov     eax,0x00010001 ; left, inactive
  699.         call    find_bitmap
  700.         mcall   7,,,<wnd4.x,wnd4.y>
  701.  
  702.         pushd   [ebx-8]
  703.         mov     eax,0x00010003 ; base, inactive
  704.         call    find_bitmap
  705.         pop     edx
  706.         mov     esi,wnd4.x+wnd4.width-1
  707.         sub     esi,edx
  708.         shl     edx,16
  709.         add     edx,wnd4.x*65536+wnd4.y
  710.         mcall   7
  711.     @@: rol     edx,16
  712.         add     dx,[ebx-8]
  713.         cmp     dx,si
  714.         ja      @f
  715.         rol     edx,16
  716.         mcall   7
  717.         jmp     @b
  718.     @@:
  719.  
  720.         mov     eax,0x00010002 ; oper, inactive
  721.         call    find_bitmap
  722.         mov     edx,ecx
  723.         shr     edx,16
  724.         neg     edx
  725.         shl     edx,16
  726.         add     edx,(wnd4.x+wnd4.width)*65536+wnd4.y
  727.         mcall   7
  728.  
  729.         mov     ebp,0x18000
  730.         mov     edi,[ebp+SKIN_HEADER.params]
  731.         add     edi,ebp
  732.         pop     eax
  733.         lea     ebx,[eax+wnd4.x*65536+wnd4.y]
  734.         mcall   4,,dword[dtp.grab_text],caption_text,caption_text.size
  735.  
  736. ;----------------------------------------------------------------------
  737.  
  738.         mov     edi,[ebp+SKIN_HEADER.buttons]
  739.         add     edi,ebp
  740.   .lp1: cmp     dword[edi],0
  741.         je      .lp2
  742.         mov     ebx,dword[edi+SKIN_BUTTONS.left-2]
  743.         mov     bx,[edi+SKIN_BUTTONS.width]
  744.         mov     ecx,dword[edi+SKIN_BUTTONS.top-2]
  745.         mov     cx,[edi+SKIN_BUTTONS.height]
  746.         add     ebx,(wnd4.x+wnd4.width)*65536
  747.         add     ecx,wnd4.y*65536
  748.         dec     ebx
  749.         dec     ecx
  750.         mcall   8,,,0x40000000
  751.         add     edi,12
  752.         jmp     .lp1
  753.   .lp2:
  754.  
  755.         mov     edi,[ebp+SKIN_HEADER.params]
  756.         add     edi,ebp
  757.         mpack   ebx,wnd4.x+10,wnd4.y+10
  758.         add     bx,word[edi+SKIN_PARAMS.skin_height]
  759.         mcall   4,,[dtp.work_text],window_text,window_text.size
  760.  
  761.         mov     ecx,[edi+SKIN_PARAMS.skin_height]
  762.         shl     ecx,16
  763.         add     ecx,(wnd4.y+8)*65536+10
  764.         mcall   13,<wnd4.x+window_text.size*6+20,wnd4.x+wnd4.width-10-\
  765.                    (wnd4.x+window_text.size*6+20)>,,[dtp.work_graph]
  766.  
  767.         add     ecx,25*65536+8
  768.         mcall   8,<wnd4.x+wnd4.width/2-button_text.size*3-6,\
  769.                   button_text.size*6+11>,,0,[dtp.work_button]
  770.  
  771.         shr     ecx,16
  772.         mov     bx,cx
  773.         add     ebx,0x00060006
  774.         mcall   4,,[dtp.work_button_text],button_text,button_text.size
  775.  
  776.         ret
  777.  
  778. ;   *********************************************
  779. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  780. ;   *********************************************
  781.  
  782.  
  783. draw_window:
  784.  
  785.     mov  eax,12                    ; function 12:tell os about windowdraw
  786.     mov  ebx,1                     ; 1, start of draw
  787.     mcall
  788.  
  789.     mov  eax,48
  790.     mov  ebx,3
  791.     mov  ecx,app_colours
  792.     mov  edx,10*4
  793.     mcall
  794.  
  795.     mov  eax,14
  796.     mcall
  797.  
  798.                                       ; DRAW WINDOW
  799.     mov  eax,0                     ; function 0 : define and draw window
  800.     mov  ebx,110*65536+555         ; [x start] *65536 + [x size]
  801.     mov  ecx,50*65536+255          ; [y start] *65536 + [y size]
  802.     mov  edx,[w_work]              ; color of work area RRGGBB,8->color
  803.     or   edx,0x13000000
  804.     mov  edi,title                ; WINDOW LABEL
  805.     mcall
  806.  
  807. if lang eq ru
  808.   load_w  = (5*2+6*9)
  809.   save_w  = (5*2+6*9)
  810.   flat_w  = (5*2+6*7)
  811.   apply_w = (5*2+6*9)
  812. else
  813.   load_w  = (5*2+6*6)
  814.   save_w  = (5*2+6*6)
  815.   flat_w  = (5*2+6*4)
  816.   apply_w = (5*2+6*7)
  817. end if
  818.  
  819.     mov  eax,8                    ; FILENAME BUTTON
  820.     mov  ebx,5*65536+545
  821.     mov  ecx,212*65536+10
  822.     mov  edx,0x4000000B
  823.     mov  esi,[w_grab_button]       ; button color RRGGBB
  824.     mcall
  825.  
  826. ;   mov  eax,8                    ; LOAD BUTTON
  827.     mov  ebx,15*65536+load_w
  828.     mov  ecx,(30+18*11)*65536+14
  829.     mov  edx,12
  830.     mov  esi,[w_work_button]
  831.     mcall
  832.  
  833. ;   mov  eax,8                    ; SAVE BUTTON
  834.     add  ebx,(load_w+2)*65536-load_w+save_w
  835.     inc  edx
  836.     mcall
  837.  
  838. ;   mov  eax,8                    ; 3D
  839. ;   mov  ebx,15*65536+35
  840. ;   mov  ecx,(30+18*12)*65536+14
  841.     mov  ebx,(340-t1.size*6-13)*65536+(5*2+6*4)
  842.     inc  edx
  843.     mcall
  844.  
  845. ;   mov  eax,8                    ; FLAT
  846.     add  ebx,(5*2+6*4+2)*65536-(5*2+6*4)+flat_w
  847.     inc  edx
  848.     mcall
  849.  
  850. ;   mov  eax,8                    ; APPLY BUTTON
  851.     add  ebx,(flat_w+6+2)*65536-flat_w+apply_w
  852.     inc  edx
  853.     mcall
  854.  
  855. ;   mov  eax,8                    ; LOAD SKIN BUTTON
  856.     mov  ebx,(336+(555-335)/2-t2.size*6/2)*65536+load_w
  857.     inc  edx
  858.     mcall
  859.  
  860. ;   mov  eax,8                    ; APPLY SKIN BUTTON
  861.     add  ebx,(load_w+6+2)*65536-load_w+apply_w
  862.     inc  edx
  863.     mcall
  864.  
  865.     mov  eax, 4
  866.     mov  ebx, (339-t1.size*6-12)*65536+(30+18*11+4)
  867.     mov  ecx, [w_work_button_text]
  868.     mov  edx, t1
  869.     mov  esi, t1.size
  870.     mcall
  871.  
  872.     mov  ebx,(336+(555-335)/2-t2.size*6/2)*65536+(30+18*11+4)
  873.     mov  edx,t2
  874.     mov  esi,t2.size
  875.     mcall
  876.  
  877. ;   mov  eax, 4
  878. ;    mov  ebx, 277*65536+(30+18*12+4)
  879. ;    mov  edx, t2
  880. ;    mov  esi, t2.size
  881. ;    mcall
  882.  
  883.     mov  eax,38                    ; R G B COLOR GLIDES
  884.     mov  ebx,266*65536+285
  885.     mov  ecx,30*65536+30
  886.     mov  edx,0xff0000
  887.   .newl:
  888.     mcall
  889.     pusha
  890.     add  ebx,20*65536+20
  891.     shr  edx,8
  892.     mcall
  893.     add  ebx,20*65536+20
  894.     shr  edx,8
  895.     mcall
  896.     popa
  897.     sub  edx,0x020000
  898.     add  ecx,0x00010001
  899.     cmp  ecx,158*65536+158
  900.     jnz  .newl
  901.  
  902.     call draw_color
  903.  
  904.     mov  edx,31                    ; BUTTON ROW
  905.     mov  ebx,15*65536+200
  906.     mov  ecx,30*65536+14
  907.     mov  esi,[w_work_button]
  908.   newb:
  909.     mov  eax,8
  910.     mcall
  911.     add  ecx,18*65536
  912.     inc  edx
  913.     cmp  edx,40
  914.     jbe  newb
  915.  
  916.     mov  ebx,15*65536+34           ; ROW OF TEXTS
  917.     mov  ecx,[w_work_button_text]
  918.     mov  edx,text
  919.     mov  esi,32
  920.   newline:
  921.     mov  eax,4
  922.     mcall
  923.     add  ebx,18
  924.     add  edx,32
  925.     cmp  [edx],byte 'x'
  926.     jne  newline
  927.  
  928.     call draw_colours
  929.  
  930.     mcall 13,<5,546>,<212,11>,[w_work]
  931.     mcall 13,<337,7>,<2,250>,[w_frame]
  932.     shr   edx,1
  933.     and   edx,0x007F7F7F
  934.     mcall 38,<336,336>,<20,250>
  935.     add   ebx,0x00080008
  936.     mcall
  937.     sub   ebx,0x00040004
  938.     mcall ,,<0,255>
  939.     mcall ,<5,550>,<211,211>
  940.     add   ecx,0x000C000C
  941.     mcall
  942.  
  943.     call print_text
  944.  
  945.     cmp  dword[0x18000+SKIN_HEADER.ident],'SKIN'
  946.     jne  @f
  947.     call draw_skin
  948.   @@:
  949.  
  950.     mov  eax,12                    ; function 12:tell os about windowdraw
  951.     mov  ebx,2                     ; 2, end of draw
  952.     mcall
  953.  
  954.     ret
  955.  
  956.  
  957. ; DATA AREA
  958.  
  959. lsz text,\
  960.     ru,  ' РАМКА ОКНА                     ',\
  961.     ru,  ' ПОЛОСА ЗАГОЛОВКА               ',\
  962.     ru,  ' КНОПКА НА ПОЛОСЕ ЗАГОЛОВКА     ',\
  963.     ru,  ' ТЕКСТ НА КНОПКЕ НА ЗАГОЛОВКЕ   ',\
  964.     ru,  ' ТЕКСТ ЗАГОЛОВОКА               ',\
  965.     ru,  ' РАБОЧАЯ ОБЛАСТЬ                ',\
  966.     ru,  ' КНОПКА В РАБОЧЕЙ ОБЛАСТИ       ',\
  967.     ru,  ' ТЕКСТ НА КНОПКЕ                ',\
  968.     ru,  ' ТЕКСТ В РАБОЧЕЙ ОБЛАСТИ        ',\
  969.     ru,  ' ГРАФИКА В РАБОЧЕЙ ОБЛАСТИ      ',\
  970.     ru,  '                                ',\
  971.     ru,  ' ЗАГРУЗИТЬ  СОХРАНИТЬ           ',\
  972.     ru,  'x',\
  973.     en,  ' WINDOW FRAME                   ',\
  974.     en,  ' WINDOW GRAB BAR                ',\
  975.     en,  ' WINDOW GRAB BUTTON             ',\
  976.     en,  ' WINDOW GRAB BUTTON TEXT        ',\
  977.     en,  ' WINDOW GRAB TITLE              ',\
  978.     en,  ' WINDOW WORK AREA               ',\
  979.     en,  ' WINDOW WORK AREA BUTTON        ',\
  980.     en,  ' WINDOW WORK AREA BUTTON TEXT   ',\
  981.     en,  ' WINDOW WORK AREA TEXT          ',\
  982.     en,  ' WINDOW WORK AREA GRAPH         ',\
  983.     en,  '                                ',\
  984.     en,  '  LOAD    SAVE                  ',\
  985.     en,  'x',\
  986.     et,  ' AKNA RAAM                      ',\
  987.     et,  ' AKNA HAARAMISE RIBA            ',\
  988.     et,  ' AKNA HAARAMISE NUPP            ',\
  989.     et,  ' AKNA HAARAMISE NUPU TEKST      ',\
  990.     et,  ' AKNA HAARAMISE PEALKIRI        ',\
  991.     et,  ' AKNA T╓╓PIIRKOND               ',\
  992.     et,  ' AKNA T╓╓PIIRKONNA NUPP         ',\
  993.     et,  ' AKNA T╓╓PIIRKONNA NUPPU TEKST  ',\
  994.     et,  ' AKNA T╓╓PIIRKONNA TEKST        ',\
  995.     et,  ' AKNA T╓╓PIIRKONNA GRAAFIKA     ',\
  996.     et,  '                                ',\
  997.     et,  '  LAADI SALVESTA                ',\
  998.     et,  'x'
  999.  
  1000. lsz t1,\
  1001.     ru, '  3D   ПЛОСКИЕ   ПРИМЕНИТЬ ',\
  1002.     en, '  3D   FLAT    APPLY  ',\
  1003.     et, '  3D   LAME   KINNITA '
  1004.  
  1005. lsz t2,\
  1006.     ru,  ' ЗАГРУЗИТЬ   ПРИМЕНИТЬ ',\
  1007.     en,  '  LOAD     APPLY  ',\
  1008.     et,  '  LAADI   KINNITA '
  1009.  
  1010. lsz caption_text,\
  1011.     ru, 'Заголовок',\
  1012.     en, 'Caption',\
  1013.     et, 'Pealkiri'
  1014.  
  1015. sz  close_text,'x'
  1016.  
  1017. lsz window_text,\
  1018.     ru, 'Текст в окне',\
  1019.     en, 'Window text',\
  1020.     et, 'Akna tekst'
  1021.  
  1022. lsz button_text,\
  1023.     ru, 'Текст на кнопке',\
  1024.     en, 'Button text',\
  1025.     et, 'Nupu tekst'
  1026.  
  1027. sz  default_skn, '/RD/1/DEFAULT.SKN',0
  1028.  
  1029. if lang eq ru
  1030.   title db 'НАСТРОЙКА ОКОН',0
  1031. else if lang eq et
  1032.   title db 'AKNA SEADED - VALI V─RV JA VAJUTA OBJEKTILE',0
  1033. else
  1034.   title db 'WINDOWS SETTINGS - DEFINE COLOR AND CLICK ON TARGET',0
  1035. end if
  1036.  
  1037.  
  1038. color dd  0
  1039.  
  1040. IncludeIGlobals
  1041.  
  1042. I_END:
  1043.  
  1044. IncludeUGlobals
  1045.  
  1046. read_info:
  1047.   .mode         dd ?            ; read
  1048.   .start_block  dd ?            ; first block
  1049.   .blocks       dd ?            ; 512 bytes
  1050.   .address      dd ?
  1051.   .workarea     dd ?
  1052. fname rb 256+1            ; filename (+1 - for zero at the end)
  1053.  
  1054. virtual at read_info
  1055.  write_info:
  1056.   .mode         dd ?
  1057.   rd 1
  1058.   .bytes2write  dd ?
  1059.   .address      dd ?
  1060.   .workarea     dd ?
  1061. end virtual
  1062.  
  1063. skin_info:
  1064.   .fname rb 256+1
  1065.  
  1066. app_colours:
  1067.  
  1068. w_frame              dd ?
  1069. w_grab               dd ?
  1070. w_grab_button        dd ?
  1071. w_grab_button_text   dd ?
  1072. w_grab_text          dd ?
  1073. w_work               dd ?
  1074. w_work_button        dd ?
  1075. w_work_button_text   dd ?
  1076. w_work_text          dd ?
  1077. w_work_graph         dd ?
  1078.  
  1079. color_table:
  1080.   times 10 dd ?
  1081.