Subversion Repositories Kolibri OS

Rev

Rev 424 | Rev 431 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. $Revision: 425 $
  2. include "skindata.inc"
  3.  
  4. ;skin_data = 0x00778000
  5.  
  6. load_skin_file:
  7. ; eax = filename
  8. ; edx = destination
  9.     mov   ebx,1
  10.     or    ecx,-1
  11.     mov   esi,12
  12. ;    call  fileread
  13.  
  14.     pushad
  15.     push eax
  16.     sub edx,std_application_base_address
  17.     mov [skin_to_load.adr],edx
  18.    
  19.     ;sub eax,std_application_base_address
  20.     ;mov [skin_to_load.stradr],eax
  21.     mov [skin_to_load.stradr],_skin_file_default - std_application_base_address
  22.     mov eax,skin_to_load - std_application_base_address
  23.     call    file_system_lfn
  24.     ;call  fileread
  25.     pop eax
  26.     popad
  27.     ret
  28.  
  29.  
  30.     ret
  31.    
  32.    
  33. skin_to_load:
  34.                         dd 0,0,0
  35.                         dd 64*1024
  36.  .adr           dd 0
  37.                         db 0
  38.  .stradr        dd 0
  39.  
  40.  
  41. struct SKIN_HEADER
  42.   .ident   dd ?
  43.   .version dd ?
  44.   .params  dd ?
  45.   .buttons dd ?
  46.   .bitmaps dd ?
  47. ends
  48.  
  49. struct SKIN_PARAMS
  50.   .skin_height    dd ?
  51.   .margin.right   dw ?
  52.   .margin.left    dw ?
  53.   .margin.bottom  dw ?
  54.   .margin.top     dw ?
  55.   .colors.inner   dd ?
  56.   .colors.outer   dd ?
  57.   .colors.frame   dd ?
  58.   .colors_1.inner dd ?
  59.   .colors_1.outer dd ?
  60.   .colors_1.frame dd ?
  61.   .dtp.size       dd ?
  62.   .dtp.data       db 40 dup (?)
  63. ends
  64.  
  65. struct SKIN_BUTTONS
  66.   .type     dd ?
  67.   .pos:
  68.     .left   dw ?
  69.     .top    dw ?
  70.   .size:
  71.     .width  dw ?
  72.     .height dw ?
  73. ends
  74.  
  75. struct SKIN_BITMAPS
  76.   .kind  dw ?
  77.   .type  dw ?
  78.   .data  dd ?
  79. ends
  80.  
  81. load_skin:
  82.         pushad
  83.         mov     [_skinh],22
  84.         mov     eax,_skin_file
  85.         mov     edx,skin_data
  86.         mov     [edx+SKIN_HEADER.ident],'????'
  87.         call    load_skin_file
  88.         cmp     eax,ERROR_SUCCESS
  89.         je      @f
  90.         cmp     eax,ERROR_END_OF_FILE
  91.         jne     .exit
  92.     @@: call    parse_skin_data
  93.   .exit:
  94.         popad
  95.         ret
  96.  
  97. parse_skin_data:
  98.         mov     ebp,skin_data
  99.         cmp     [ebp+SKIN_HEADER.ident],'SKIN'
  100.         jne     .exit
  101.  
  102.         mov     edi,skin_udata
  103.         mov     ecx,(skin_udata.end-skin_udata)/4
  104.         xor     eax,eax
  105.         cld
  106.         rep     stosd
  107.  
  108.         mov     ebx,[ebp+SKIN_HEADER.params]
  109.         add     ebx,skin_data
  110.         mov     eax,[ebx+SKIN_PARAMS.skin_height]
  111.         mov     [_skinh],eax
  112.         mov     eax,[ebx+SKIN_PARAMS.colors.inner]
  113.         mov     [skin_active.colors.inner],eax
  114.         mov     eax,[ebx+SKIN_PARAMS.colors.outer]
  115.         mov     [skin_active.colors.outer],eax
  116.         mov     eax,[ebx+SKIN_PARAMS.colors.frame]
  117.         mov     [skin_active.colors.frame],eax
  118.         mov     eax,[ebx+SKIN_PARAMS.colors_1.inner]
  119.         mov     [skin_inactive.colors.inner],eax
  120.         mov     eax,[ebx+SKIN_PARAMS.colors_1.outer]
  121.         mov     [skin_inactive.colors.outer],eax
  122.         mov     eax,[ebx+SKIN_PARAMS.colors_1.frame]
  123.         mov     [skin_inactive.colors.frame],eax
  124.         lea     esi,[ebx+SKIN_PARAMS.dtp.data]
  125.         mov     edi,common_colours
  126.         mov     ecx,[ebx+SKIN_PARAMS.dtp.size]
  127.         and     ecx,127
  128.         rep     movsb
  129.         mov     eax,dword[ebx+SKIN_PARAMS.margin.right]
  130.         mov     dword[_skinmargins+0],eax
  131.         mov     eax,dword[ebx+SKIN_PARAMS.margin.bottom]
  132.         mov     dword[_skinmargins+4],eax
  133.  
  134.         mov     ebx,[ebp+SKIN_HEADER.bitmaps]
  135.         add     ebx,skin_data
  136.   .lp1: cmp     dword[ebx],0
  137.         je      .end_bitmaps
  138.         movzx   eax,[ebx+SKIN_BITMAPS.kind]
  139.         movzx   ecx,[ebx+SKIN_BITMAPS.type]
  140.         dec     eax
  141.         jnz     .not_left
  142.         xor     eax,eax
  143.         mov     edx,skin_active.left.data
  144.         or      ecx,ecx
  145.         jnz     @f
  146.         mov     edx,skin_inactive.left.data
  147.     @@: jmp     .next_bitmap
  148.   .not_left:
  149.         dec     eax
  150.         jnz     .not_oper
  151.         mov     esi,[ebx+SKIN_BITMAPS.data]
  152.         add     esi,skin_data
  153.         mov     eax,[esi+0]
  154.         neg     eax
  155.         mov     edx,skin_active.oper.data
  156.         or      ecx,ecx
  157.         jnz     @f
  158.         mov     edx,skin_inactive.oper.data
  159.     @@: jmp     .next_bitmap
  160.   .not_oper:
  161.         dec     eax
  162.         jnz     .not_base
  163.         mov     eax,[skin_active.left.width]
  164.         mov     edx,skin_active.base.data
  165.         or      ecx,ecx
  166.         jnz     @f
  167.         mov     eax,[skin_inactive.left.width]
  168.         mov     edx,skin_inactive.base.data
  169.     @@: jmp     .next_bitmap
  170.   .not_base:
  171.         add     ebx,8
  172.         jmp     .lp1
  173.   .next_bitmap:
  174.         mov     ecx,[ebx+SKIN_BITMAPS.data]
  175.         add     ecx,skin_data
  176.         mov     [edx+4],eax
  177.         mov     eax,[ecx+0]
  178.         mov     [edx+8],eax
  179.         add     ecx,8
  180.         mov     [edx+0],ecx
  181.         add     ebx,8
  182.         jmp     .lp1
  183.   .end_bitmaps:
  184.  
  185.         mov     ebx,[ebp+SKIN_HEADER.buttons]
  186.         add     ebx,skin_data
  187.   .lp2: cmp     dword[ebx],0
  188.         je      .end_buttons
  189.         mov     eax,[ebx+SKIN_BUTTONS.type]
  190.         dec     eax
  191.         jnz     .not_close
  192.         mov     edx,skin_btn_close
  193.         jmp     .next_button
  194.   .not_close:
  195.         dec     eax
  196.         jnz     .not_minimize
  197.         mov     edx,skin_btn_minimize
  198.         jmp     .next_button
  199.   .not_minimize:
  200.         add     ebx,12
  201.         jmp     .lp2
  202.   .next_button:
  203.         movsx   eax,[ebx+SKIN_BUTTONS.left]
  204.         mov     [edx+SKIN_BUTTON.left],eax
  205.         movsx   eax,[ebx+SKIN_BUTTONS.top]
  206.         mov     [edx+SKIN_BUTTON.top],eax
  207.         movsx   eax,[ebx+SKIN_BUTTONS.width]
  208.         mov     [edx+SKIN_BUTTON.width],eax
  209.         movsx   eax,[ebx+SKIN_BUTTONS.height]
  210.         mov     [edx+SKIN_BUTTON.height],eax
  211.         add     ebx,12
  212.         jmp     .lp2
  213.   .end_buttons:
  214.  
  215.   .exit:
  216.         ret
  217.  
  218. sys_putimage_with_check:
  219.         or      ebx,ebx
  220.         jz      @f
  221.         call    sys_putimage.forced
  222.     @@: ret
  223.  
  224. drawwindow_IV_caption:
  225.  
  226.         mov     ebp,skin_active
  227.         or      al,al
  228.         jnz     @f
  229.         mov     ebp,skin_inactive
  230.     @@:
  231.  
  232.         mov     esi,[esp+4]
  233.         mov     eax,[esi+WDATA.box.width]    ; window width
  234.         mov     edx,[ebp+SKIN_DATA.left.left]
  235.         shl     edx,16
  236.         mov     ecx,[ebp+SKIN_DATA.left.width]
  237.         shl     ecx,16
  238.         add     ecx,[_skinh]
  239.  
  240.         mov     ebx, [ebp+SKIN_DATA.left.data]
  241.         call    sys_putimage_with_check
  242.  
  243.         mov     esi,[esp+4]
  244.         mov     eax,[esi+WDATA.box.width]
  245.         sub     eax,[ebp+SKIN_DATA.left.width]
  246.         sub     eax,[ebp+SKIN_DATA.oper.width]
  247.         cmp     eax,[ebp+SKIN_DATA.base.left]
  248.         jng     .non_base
  249.         xor     edx,edx
  250.         mov     ecx,[ebp+SKIN_DATA.base.width]
  251.         jecxz   .non_base
  252.         div     ecx
  253.  
  254.         inc     eax
  255.  
  256.         mov     ebx,[ebp+SKIN_DATA.base.data]
  257.         mov     ecx,[ebp+SKIN_DATA.base.width]
  258.         shl     ecx,16
  259.         add     ecx,[_skinh]
  260.         mov     edx,[ebp+SKIN_DATA.base.left]
  261.         sub     edx,[ebp+SKIN_DATA.base.width]
  262.         shl     edx,16
  263.   .baseskinloop:
  264.         shr     edx,16
  265.         add     edx,[ebp+SKIN_DATA.base.width]
  266.         shl     edx,16
  267.  
  268.         push    eax ebx ecx edx
  269.         call    sys_putimage_with_check
  270.         pop     edx ecx ebx eax
  271.  
  272.         dec     eax
  273.         jnz     .baseskinloop
  274.   .non_base:
  275.  
  276.         mov     esi,[esp+4]
  277.         mov     edx,[esi+WDATA.box.width]
  278.         sub     edx,[ebp+SKIN_DATA.oper.width]
  279.         inc     edx
  280.         shl     edx,16
  281.         mov     ebx,[ebp+SKIN_DATA.oper.data]
  282.  
  283.         mov     ecx,[ebp+SKIN_DATA.oper.width]
  284.         shl     ecx,16
  285.         add     ecx,[_skinh]
  286.         call    sys_putimage_with_check
  287.  
  288.         ret
  289.  
  290. ;//mike.dld, 2006-08-02 ]
  291.  
  292.  
  293. drawwindow_IV:
  294. ;param1 - aw_yes
  295.  
  296.         pusha
  297.  
  298.         push  edx
  299.  
  300.         mov   edi,edx
  301.  
  302.         mov     ebp,skin_active
  303.         cmp     byte [esp+32+4+4],0
  304.         jne     @f
  305.         mov     ebp,skin_inactive
  306.      @@:
  307.  
  308.         mov   eax,[edi+WDATA.box.left]
  309.         shl   eax,16
  310.                 mov   ax,word [edi+WDATA.box.left]
  311.                 add   ax,word [edi+WDATA.box.width]
  312.         mov   ebx,[edi+WDATA.box.top]
  313.         shl   ebx,16
  314.                 mov   bx,word [edi+WDATA.box.top]
  315.                 add   bx,word [edi+WDATA.box.height]
  316. ;        mov   esi,[edi+24]
  317. ;        shr   esi,1
  318. ;        and   esi,0x007f7f7f
  319.         mov   esi,[ebp+SKIN_DATA.colors.outer]
  320.         or      [edi+WDATA.fl_wdrawn], 4
  321.         call  draw_rectangle
  322.         mov   ecx,3
  323.       _dw3l:
  324.         add   eax,1*65536-1
  325.         add   ebx,1*65536-1
  326.         test  ax,ax
  327.         js    no_skin_add_button
  328.         test  bx,bx
  329.         js    no_skin_add_button
  330.         mov   esi,[ebp+SKIN_DATA.colors.frame] ;[edi+24]
  331.         call  draw_rectangle
  332.         dec   ecx
  333.         jnz   _dw3l
  334.         mov   esi,[ebp+SKIN_DATA.colors.inner]
  335.         add   eax,1*65536-1
  336.         add   ebx,1*65536-1
  337.         test  ax,ax
  338.         js    no_skin_add_button
  339.         test  bx,bx
  340.         js    no_skin_add_button
  341.         call  draw_rectangle
  342.  
  343.         cmp   dword[skin_data],'SKIN'
  344.         je    @f
  345.         xor   eax,eax
  346.         xor   ebx,ebx
  347.         mov   esi,[esp]
  348.         mov   ecx,[esi+WDATA.box.width]
  349.         inc   ecx
  350.         mov   edx,[_skinh]
  351.         mov   edi,[common_colours+4] ; standard grab color
  352.         call  [drawbar]
  353.         jmp   draw_clientbar
  354.     @@:
  355.  
  356.         mov     al,[esp+32+4+4]
  357.         call    drawwindow_IV_caption
  358.  
  359.     draw_clientbar:
  360.  
  361.         mov   esi,[esp]
  362.  
  363.         mov   edx,[esi+WDATA.box.top]                       ; WORK AREA
  364.         add   edx,21+5
  365.         mov   ebx,[esi+WDATA.box.top]
  366.         add   ebx,[esi+WDATA.box.height]
  367.         cmp   edx,ebx
  368.         jg    _noinside2
  369.         mov   eax,5
  370.         mov   ebx,[_skinh]
  371.         mov   ecx,[esi+WDATA.box.width]
  372.         mov   edx,[esi+WDATA.box.height]
  373.         sub   ecx,4
  374.         sub   edx,4
  375.         mov   edi,[esi+WDATA.cl_workarea]
  376.         test  edi,0x40000000
  377.         jnz   _noinside2
  378.         call  [drawbar]
  379.       _noinside2:
  380.  
  381.         cmp   dword[skin_data],'SKIN'
  382.         jne   no_skin_add_button
  383.  
  384. ;* close button
  385.         mov   edi,[BTN_ADDR]
  386.         movzx eax,word [edi]
  387.         cmp   eax,1000
  388.         jge   no_skin_add_button
  389.         inc   eax
  390.         mov   [edi],ax
  391.  
  392.         shl   eax,4
  393.         add   eax,edi
  394.  
  395.         mov   bx,[CURRENT_TASK]
  396.         mov   [eax],bx
  397.  
  398.         add   eax,2         ; save button id number
  399.         mov   bx,1
  400.         mov   [eax],bx
  401.         add   eax,2         ; x start
  402.         xor   ebx,ebx
  403.         cmp   [skin_btn_close.left],0
  404.         jge   _bCx_at_right
  405.         mov   ebx,[esp]
  406.         mov   ebx,[ebx+WDATA.box.width]
  407.         inc   ebx
  408.       _bCx_at_right:
  409.         add   ebx,[skin_btn_close.left]
  410.         mov   [eax],bx
  411.         add   eax,2         ; x size
  412.         mov   ebx,[skin_btn_close.width]
  413.         dec   ebx
  414.         mov   [eax],bx
  415.         add   eax,2         ; y start
  416.         mov   ebx,[skin_btn_close.top]
  417.         mov   [eax],bx
  418.         add   eax,2         ; y size
  419.         mov   ebx,[skin_btn_close.height]
  420.         dec   ebx
  421.         mov   [eax],bx
  422.  
  423. ;* minimize button
  424.         mov   edi,[BTN_ADDR]
  425.         movzx eax,word [edi]
  426.         cmp   eax,1000
  427.         jge   no_skin_add_button
  428.         inc   eax
  429.         mov   [edi],ax
  430.  
  431.         shl   eax,4
  432.         add   eax,edi
  433.  
  434.         mov   bx,[CURRENT_TASK]
  435.         mov   [eax],bx
  436.  
  437.         add   eax,2         ; save button id number
  438.         mov   bx,65535 ;999
  439.         mov   [eax],bx
  440.         add   eax,2         ; x start
  441.         xor   ebx,ebx
  442.         cmp   [skin_btn_minimize.left],0
  443.         jge   _bMx_at_right
  444.         mov   ebx,[esp]
  445.         mov   ebx,[ebx+WDATA.box.width]
  446.         inc   ebx
  447.       _bMx_at_right:
  448.         add   ebx,[skin_btn_minimize.left]
  449.         mov   [eax],bx
  450.         add   eax,2         ; x size
  451.         mov   ebx,[skin_btn_minimize.width]
  452.         dec   ebx
  453.         mov   [eax],bx
  454.         add   eax,2         ; y start
  455.         mov   ebx,[skin_btn_minimize.top]
  456.         mov   [eax],bx
  457.         add   eax,2         ; y size
  458.         mov   ebx,[skin_btn_minimize.height]
  459.         dec   ebx
  460.         mov   [eax],bx
  461.  
  462.       no_skin_add_button:
  463.         pop     edi
  464.         and     [edi+WDATA.fl_wdrawn], not 4
  465.         test    [edi+WDATA.fl_wdrawn], 2
  466.         jz      @f
  467.         call    drawwindowframes2
  468. @@:
  469.  
  470.         popa
  471.  
  472.         ret  4
  473.  
  474.