Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                 ;;
  3. ;; Copyright (C) KolibriOS team 2010-2015. All rights reserved.    ;;
  4. ;; Distributed under terms of the GNU General Public License       ;;
  5. ;;                                                                 ;;
  6. ;;  VNC client for KolibriOS                                       ;;
  7. ;;                                                                 ;;
  8. ;;  Written by hidnplayr@kolibrios.org                             ;;
  9. ;;                                                                 ;;
  10. ;;          GNU GENERAL PUBLIC LICENSE                             ;;
  11. ;;             Version 2, June 1991                                ;;
  12. ;;                                                                 ;;
  13. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  14.  
  15.  
  16. deflate_callback:
  17.         mov     eax, [deflate_length]
  18.         mov     ecx, [esp+8]
  19.         mov     [ecx], eax
  20.         mov     eax, [deflate_buffer]
  21.         ret     8
  22.  
  23.  
  24. encoding_ZRLE:
  25.  
  26.         DEBUGF  2, "ZRLE\n"
  27.   @@:
  28.         lea     eax, [esi+4]
  29.         cmp     [datapointer], eax
  30.         jae     @f
  31.         call    read_data.more
  32.         jmp     @b
  33.   @@:
  34.  
  35.         lodsd
  36.         bswap   eax                             ; number of packed bytes
  37.         DEBUGF  2, "packed length=%u bytes\n", eax
  38.  
  39.   @@:
  40.         push    eax
  41.         add     eax, esi
  42.         cmp     [datapointer], eax
  43.         jae     @f
  44.         call    read_data.more
  45.         pop     eax
  46.         jmp     @b
  47.   @@:
  48.         pop     ecx
  49.         lea     eax, [esi+ecx]
  50.         push    eax                             ; end of data ptr
  51.  
  52.         cmp     [deflate_buffer], 0             ; first chunk of the stream?
  53.         jne     @f
  54.         lodsw                                   ; load zlib header
  55.         cmp     ax, 0x9c78                      ; default compression?
  56.         jne     .deflate_fail
  57.         sub     ecx, 2                          ; subtract 2 byte header
  58.  
  59. ;        invoke  deflate_init
  60. ;        mov     [deflate_str], eax
  61.   @@:
  62.  
  63.         sub     ecx, 4                          ; subtract 4 byte check value trailer
  64.         mov     [deflate_buffer], esi
  65.         mov     [deflate_length], ecx
  66.  
  67. ;        mov     eax, [deflate_str]
  68.         push    eax                                             ; allocate place on stack
  69.         invoke  deflate_unpack2, deflate_callback, 0, esp       ; unpack the data
  70.         pop     ecx                                             ; get size in ecx
  71.         test    eax, eax
  72.         jz      .deflate_fail
  73.         push    eax
  74.         DEBUGF  2, "%u bytes unpacked succesfully\n", ecx
  75.         test    ecx, ecx
  76.         jz      .fail
  77.  
  78.         mov     esi, eax
  79.         mov     [subrectangle.x], 0
  80.         mov     [subrectangle.y], 0
  81.   .tile:
  82.         mov     eax, [rectangle.width]
  83.         sub     eax, [subrectangle.x]
  84.         cmp     eax, 64
  85.         jb      @f
  86.         mov     eax, 64
  87.   @@:
  88.         mov     [subrectangle.width], eax
  89.  
  90.         mov     edx, [rectangle.height]
  91.         sub     edx, [subrectangle.y]
  92.         cmp     edx, 64
  93.         jb      @f
  94.         mov     edx, 64
  95.   @@:
  96.         mov     [subrectangle.height], edx
  97.         DEBUGF  1, "Subrectangle: x=%u y=%u width=%u height=%u ", \
  98.         [subrectangle.x], [subrectangle.y], [subrectangle.width], [subrectangle.height]
  99.  
  100. ; Calculate first pixel pos
  101.         mov     eax, [rectangle.y]
  102.         add     eax, [subrectangle.y]
  103.         movzx   ebx, [screen.width]
  104.         mul     ebx
  105.         add     eax, [rectangle.x]
  106.         add     eax, [subrectangle.x]
  107.         lea     edi, [framebuffer+eax*3]
  108.  
  109. ; Calculate offset between two rows of pixels
  110.         movzx   eax, [screen.width]
  111.         sub     eax, [subrectangle.width]
  112.         lea     ebp, [eax*3]
  113.  
  114.         mov     edx, [subrectangle.height]
  115.  
  116. ;;;;
  117.         lodsb                   ; subencoding type
  118.         DEBUGF  1, "encoding=%u\n", al
  119.         test    al, al
  120.         jz      .raw
  121.         cmp     al, 1
  122.         je      .solid
  123.         cmp     al, 16
  124.         jbe     .palette_packed
  125.         cmp     al, 127
  126.         je      .reuse_palette
  127.         jb      .invalid
  128.         and     al, 0x7f
  129.         jz      .plain_rle
  130.         cmp     al, 1
  131.         je      .prle_reuse_palette
  132.  
  133. ; Palette Run Length Encoded tile
  134.         mov     [palettesize], al
  135.         call    create_palette
  136.   .prle_reuse_palette:
  137.         DEBUGF  1, "Pallete RLE tile\n"
  138.  
  139.         mov     eax, 1
  140.   .prle_line:
  141.         mov     ebx, [subrectangle.width]
  142.   .prle_pixel:
  143.         dec     eax
  144.         jz      .prle_reload
  145.  
  146.         mov     word[edi], cx
  147.         rol     ecx, 16
  148.         add     edi, 2
  149.         mov     byte[edi], cl
  150.         rol     ecx, 16
  151.         inc     edi
  152.         dec     ebx
  153.         jnz     .prle_pixel
  154.  
  155.         add     edi, ebp
  156.         dec     edx
  157.         jnz     .prle_line
  158.         jmp     .next_tile
  159.  
  160.   .prle_reload:
  161. ;;;
  162. ; load palette index and get color from palette
  163.         xor     eax, eax
  164.         lodsb
  165.         push    ebx
  166.         mov     bl, al
  167.         and     al, 0x7f
  168.         mov     ecx, [palette+eax*4]
  169.  
  170. ; run length follows?
  171.         xor     eax, eax
  172.         test    bl, 0x80
  173.         pop     ebx
  174.         jz      .plength_ok
  175.  
  176. ;;;
  177.  
  178. ; load runlength
  179.         push    ebx
  180.         xor     eax, eax
  181.         xor     ebx, ebx
  182.   @@:
  183.         lodsb
  184.         cmp     al, 255
  185.         jne     @f
  186.         add     ebx, eax
  187.         jmp     @b
  188.   @@:
  189.         add     eax, ebx
  190.         pop     ebx
  191.   .plength_ok:
  192.         add     eax, 2
  193.         jmp     .prle_pixel
  194.  
  195.  
  196.  
  197.  
  198. ; Run Length Encoded tile
  199.   .plain_rle:
  200.  
  201.         DEBUGF  1, "Plain RLE tile\n"
  202.  
  203.         mov     eax, 1
  204.   .rle_line:
  205.         mov     ebx, [subrectangle.width]
  206.   .rle_pixel:
  207.         dec     eax
  208.         jz      .rle_reload
  209.  
  210.         mov     word[edi], cx
  211.         rol     ecx, 16
  212.         add     edi, 2
  213.         mov     byte[edi], cl
  214.         rol     ecx, 16
  215.         inc     edi
  216.         dec     ebx
  217.         jnz     .rle_pixel
  218.         add     edi, ebp
  219.         dec     edx
  220.         jnz     .rle_line
  221.         jmp     .next_tile
  222.  
  223.   .rle_reload:
  224. ; TODO: check for buffer underrun
  225.  
  226.         ; load pixel value
  227.         call    load_cpixel
  228.         mov     ecx, eax
  229.  
  230.         ; load length
  231.         xor     eax, eax
  232.         push    ebx
  233.         xor     ebx, ebx
  234.   @@:
  235.         lodsb
  236.         cmp     al, 255
  237.         jne     @f
  238.         add     ebx, eax
  239.         jmp     @b
  240.   @@:
  241.         add     eax, ebx
  242.         add     eax, 2
  243.         pop     ebx
  244.         jmp     .rle_pixel
  245.  
  246.  
  247.  
  248.   .reuse_palette:
  249.         cmp     [palettesize], 1
  250.         jne     .reuse_palette_
  251.         mov     ecx, [palette]
  252.         mov     eax, ecx
  253.         shr     eax, 16
  254.         jmp     .solid_line
  255.  
  256. ; Palette packed tile
  257.   .palette_packed:
  258.         DEBUGF  1, "Palette packed tile\n"
  259.  
  260.         mov     [palettesize], al
  261.         call    create_palette
  262.  
  263.   .reuse_palette_:
  264.         cmp     [palettesize], 2
  265.         je      .palette_1bit
  266.         cmp     [palettesize], 4
  267.         jbe     .palette_2bit
  268.         jmp     .palette_4bit
  269.  
  270.   .palette_1bit:
  271.         DEBUGF  1, "1-bit palette\n"
  272.   .palette_1bit_line:
  273.         mov     ebx, [subrectangle.width]
  274.   .palette_1bit_byte:
  275.         lodsb
  276.         rol     al, 1
  277.         mov     ecx, eax
  278.         and     eax, 0x1
  279.         mov     eax, [palette+4*eax]
  280.         stosw
  281.         shr     eax, 16
  282.         stosb
  283.         dec     ebx
  284.         jz      .palette_1bit_next_line
  285.  
  286.         rol     cl, 1
  287.         mov     eax, ecx
  288.         and     eax, 0x1
  289.         mov     eax, [palette+4*eax]
  290.         stosw
  291.         shr     eax, 16
  292.         stosb
  293.         dec     ebx
  294.         jz      .palette_1bit_next_line
  295.  
  296.         rol     cl, 1
  297.         mov     eax, ecx
  298.         and     eax, 0x1
  299.         mov     eax, [palette+4*eax]
  300.         stosw
  301.         shr     eax, 16
  302.         stosb
  303.         dec     ebx
  304.         jz      .palette_1bit_next_line
  305.  
  306.         rol     cl, 1
  307.         mov     eax, ecx
  308.         and     eax, 0x1
  309.         mov     eax, [palette+4*eax]
  310.         stosw
  311.         shr     eax, 16
  312.         stosb
  313.         dec     ebx
  314.         jz      .palette_1bit_next_line
  315.  
  316.         rol     cl, 1
  317.         mov     eax, ecx
  318.         and     eax, 0x1
  319.         mov     eax, [palette+4*eax]
  320.         stosw
  321.         shr     eax, 16
  322.         stosb
  323.         dec     ebx
  324.         jz      .palette_1bit_next_line
  325.  
  326.         rol     cl, 1
  327.         mov     eax, ecx
  328.         and     eax, 0x1
  329.         mov     eax, [palette+4*eax]
  330.         stosw
  331.         shr     eax, 16
  332.         stosb
  333.         dec     ebx
  334.         jz      .palette_1bit_next_line
  335.  
  336.         rol     cl, 1
  337.         mov     eax, ecx
  338.         and     eax, 0x1
  339.         mov     eax, [palette+4*eax]
  340.         stosw
  341.         shr     eax, 16
  342.         stosb
  343.         dec     ebx
  344.         jz      .palette_1bit_next_line
  345.  
  346.         rol     cl, 1
  347.         and     ecx, 0x1
  348.         mov     eax, [palette+4*ecx]
  349.         stosw
  350.         shr     eax, 16
  351.         stosb
  352.         dec     ebx
  353.         jnz     .palette_1bit_byte
  354.  
  355.   .palette_1bit_next_line:
  356.         add     edi, ebp
  357.         dec     edx
  358.         jnz     .palette_1bit_line
  359.         jmp     .next_tile
  360.  
  361.  
  362.  
  363.   .palette_2bit:
  364.         DEBUGF  1, "2-bit palette\n"
  365.   .palette_2bit_line:
  366.         mov     ebx, [subrectangle.width]
  367.   .palette_2bit_byte:
  368.         lodsb
  369.         mov     ecx, eax
  370.         and     eax, 0xc0
  371.         shr     eax, 4
  372.         mov     eax, [palette+eax]
  373.         stosw
  374.         shr     eax, 16
  375.         stosb
  376.         dec     ebx
  377.         jz      .palette_2bit_next_line
  378.  
  379.         mov     eax, ecx
  380.         and     eax, 0x30
  381.         shr     eax, 2
  382.         mov     eax, [palette+eax]
  383.         stosw
  384.         shr     eax, 16
  385.         stosb
  386.         dec     ebx
  387.         jz      .palette_2bit_next_line
  388.  
  389.         mov     eax, ecx
  390.         and     eax, 0x0c
  391.         mov     eax, [palette+eax]
  392.         stosw
  393.         shr     eax, 16
  394.         stosb
  395.         dec     ebx
  396.         jz      .palette_2bit_next_line
  397.  
  398.         and     ecx, 0x03
  399.         mov     eax, [palette+4*ecx]
  400.         stosw
  401.         shr     eax, 16
  402.         stosb
  403.         dec     ebx
  404.         jnz     .palette_2bit_byte
  405.  
  406.   .palette_2bit_next_line:
  407.         add     edi, ebp
  408.         dec     edx
  409.         jnz     .palette_2bit_line
  410.         jmp     .next_tile
  411.  
  412.  
  413.  
  414.  
  415.   .palette_4bit:
  416.         DEBUGF  1, "4-bit palette\n"
  417.   .palette_4bit_line:
  418.         mov     ebx, [subrectangle.width]
  419.   .palette_4bit_byte:
  420.         lodsb
  421.         mov     cl, al
  422.         and     eax, 0xf0
  423.         shr     eax, 2
  424.         mov     eax, [palette+eax]
  425.         stosw
  426.         shr     eax, 16
  427.         stosb
  428.         dec     ebx
  429.         jz      .palette_4bit_next_line
  430.  
  431.         and     ecx, 0x0f
  432.         shl     ecx, 2
  433.         mov     eax, [palette+ecx]
  434.         stosw
  435.         shr     eax, 16
  436.         stosb
  437.         dec     ebx
  438.         jnz     .palette_4bit_byte
  439.   .palette_4bit_next_line:
  440.         add     edi, ebp
  441.         dec     edx
  442.         jnz     .palette_4bit_line
  443.         jmp     .next_tile
  444.  
  445.  
  446. ; RAW tile
  447.   .raw:
  448.         push    edx
  449.         mov     eax, [subrectangle.width]
  450.         mul     [subrectangle.height]
  451.         lea     eax, [eax*3]
  452.         pop     edx
  453.  
  454. ; TODO: check for buffer underrun
  455.  
  456.         DEBUGF  1, "RAW tile\n"
  457.   .raw_line:
  458.         mov     ebx, [subrectangle.width]
  459.   .raw_pixel:
  460.         call    load_cpixel
  461.         stosw
  462.         shr     eax, 16
  463.         stosb
  464.         dec     ebx
  465.         jnz     .raw_pixel
  466.         add     edi, ebp
  467.         dec     edx
  468.         jnz     .raw_line
  469.         jmp     .next_tile
  470.  
  471.  
  472.  
  473. ; Single color tile
  474.   .solid:
  475.         DEBUGF  1, "Solid tile\n"
  476.  
  477. ; TODO: check for buffer underrun
  478.  
  479.         call    load_cpixel
  480.         mov     ecx, eax
  481.         shr     ecx, 16
  482.  
  483.         mov     [palettesize], 1
  484.         mov     [palette], eax
  485.  
  486.   .solid_line:
  487.         mov     ebx, [subrectangle.width]
  488.   .solid_pixel:
  489.         stosw
  490.         mov     [edi], cl
  491.         inc     edi
  492.         dec     ebx
  493.         jnz     .solid_pixel
  494.         add     edi, ebp
  495.         dec     edx
  496.         jnz     .solid_line
  497. ;        jmp     .next_tile
  498.  
  499.  
  500. ; Go to the next tile
  501.   .next_tile:
  502.         mov     eax, [subrectangle.x]
  503.         add     eax, 64
  504.         cmp     eax, [rectangle.width]
  505.         jae     .next_row
  506.         mov     [subrectangle.x], eax
  507.         jmp     .tile
  508.   .next_row:
  509.         mov     [subrectangle.x], 0
  510.         mov     eax, [subrectangle.y]
  511.         add     eax, 64
  512.         cmp     eax, [rectangle.height]
  513.         jae     .done
  514.         mov     [subrectangle.y], eax
  515.         jmp     .tile
  516.  
  517.   .done:
  518.         DEBUGF  1, "ZRLE complete!\n"
  519.         pop     ecx
  520.         mcall   68, 13                          ; free the unpacked data
  521.         pop     esi
  522.         jmp     next_rectangle
  523.  
  524.   .invalid:
  525.         DEBUGF  2, "Invalid subencoding type!\n"
  526.   .fail:
  527.         DEBUGF  2, "ZRLE failed!\n"
  528.         pop     ecx
  529.         mcall   68, 13                          ; free unpacked data
  530.         pop     esi
  531.         jmp     next_rectangle
  532.  
  533.  
  534.   .deflate_fail:
  535.         DEBUGF  2,"Unpacking failed!\n"
  536.         pop     esi
  537.         jmp     next_rectangle