Subversion Repositories Kolibri OS

Rev

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