Subversion Repositories Kolibri OS

Rev

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

  1. ;include 'zgl.inc'
  2.  
  3. align 16
  4. proc gl_resizeImage uses ecx edi esi, dest:dword, xsize_dest:dword, ysize_dest:dword,\
  5.         src:dword, xsize_src:dword, ysize_src:dword
  6.  
  7.         ;сжатие по ширине
  8.         mov edi,[xsize_src]
  9.         cmp edi,[xsize_dest]
  10.         jle @f
  11.                 stdcall img_rgb24_wresize, [src],edi,[ysize_src],[xsize_dest]
  12.                 mov edi,[xsize_dest]
  13.         @@:
  14.  
  15.         ;сжатие по высоте
  16.         mov ecx,[ysize_src]
  17.         cmp ecx,[ysize_dest]
  18.         jle @f
  19.                 stdcall img_rgb24_hresize, [src],edi,ecx,[ysize_dest]
  20.                 mov ecx,[ysize_dest]
  21.         @@:
  22.  
  23.         ;копирование сжатой текстуры
  24.         imul ecx,edi
  25.         mov edi,[dest]
  26.         mov esi,[src]
  27.         imul ecx,3
  28.         rep movsb
  29.         ret
  30. endp
  31.  
  32. ;description:
  33. ; сжатие изображения по ширине (размеры буфера не меняются)
  34. ;input:
  35. ; data_rgb - pointer to rgb data
  36. ; size_w - width img in pixels
  37. ; size_h - height img in pixels
  38. ; size_w_new - new width img in pixels
  39. align 16
  40. proc img_rgb24_wresize, data_rgb:dword, size_w:dword, size_h:dword, size_w_new:dword
  41. locals
  42.         pr dd 0
  43.         pg dd 0
  44.         pb dd 0
  45.         img_n dd ? ;указатель на данные нового изображения
  46.         lines dd ?
  47. endl
  48. pushad
  49. ;eax - delta for inp. img
  50. ;ebx - delta for outp. img
  51. ;esi - pointer to data_rgb
  52.         mov esi,[data_rgb]
  53.         mov [img_n],esi
  54.         mov eax,[size_h]
  55.         mov [lines],eax
  56. align 4
  57.         .cycyle_0:
  58.         mov eax,[size_w_new]
  59.         mov ecx,[size_w]
  60.         mov ebx,ecx
  61. align 4
  62.         .cycyle_1:
  63.                 cmp eax,ebx
  64.                 jg .else_0
  65.                         ;копируемый пиксель максимально влияет на результат
  66.                         ;накапливаем rgb для интерполяции пикселей
  67.                         mov edx,[size_w_new]
  68.                         movzx edi,byte[esi]
  69.                         imul edi,edx
  70.                         add [pb],edi
  71.                         movzx edi,byte[esi+1]
  72.                         imul edi,edx
  73.                         add [pg],edi
  74.                         movzx edi,byte[esi+2]
  75.                         imul edi,edx
  76.                         add [pr],edi
  77.                         cmp eax,ebx
  78.                         je .d2_add
  79.                         jmp .if_0_end
  80.                 .else_0:
  81.                         ;копируемый пиксель попадет на границу пикселей
  82.                         mov edx,ebx
  83.                         sub edx,eax
  84.                         add edx,[size_w_new]
  85.                         movzx edi,byte[esi]
  86.                         imul edi,edx
  87.                         add [pb],edi
  88.                         movzx edi,byte[esi+1]
  89.                         imul edi,edx
  90.                         add [pg],edi
  91.                         movzx edi,byte[esi+2]
  92.                         imul edi,edx
  93.                         add [pr],edi
  94.                         ;сохраняем готовое rgb
  95.                         .d2_add:
  96.                         push eax
  97.                                 mov edi,[img_n]
  98.                                 mov eax,[pb]
  99.                                 xor edx,edx
  100.                                 div dword[size_w] ;eax /= [size_w]
  101.                                 stosb
  102.                                 mov eax,[pg]
  103.                                 xor edx,edx
  104.                                 div dword[size_w] ;eax /= [size_w]
  105.                                 stosb
  106.                                 mov eax,[pr]
  107.                                 xor edx,edx
  108.                                 div dword[size_w] ;eax /= [size_w]
  109.                                 stosb
  110.                         pop eax
  111.                         add dword[img_n],3 ;next pixel
  112.                         ;обновляем rgb для нового пикселя
  113.                         mov edx,eax
  114.                         sub edx,ebx
  115.                         movzx edi,byte[esi]
  116.                         imul edi,edx
  117.                         mov [pb],edi
  118.                         movzx edi,byte[esi+1]
  119.                         imul edi,edx
  120.                         mov [pg],edi
  121.                         movzx edi,byte[esi+2]
  122.                         imul edi,edx
  123.                         mov [pr],edi
  124.                         add ebx,[size_w]
  125.                 .if_0_end:
  126.                 add eax,[size_w_new]
  127.                 add esi,3 ;next pixel
  128.                 dec ecx
  129.                 jnz .cycyle_1
  130.         dec dword[lines]
  131.         jnz .cycyle_0
  132. popad
  133.         ret
  134. endp
  135.  
  136. ;description:
  137. ; сжатие изображения по высоте (размеры буфера не меняются)
  138. ;input:
  139. ; data_rgb - pointer to rgb data
  140. ; size_w - width img in pixels
  141. ; size_h - height img in pixels
  142. ; size_h_new - new height img in pixels
  143. align 16
  144. proc img_rgb24_hresize, data_rgb:dword, size_w:dword, size_h:dword, size_h_new:dword
  145. locals
  146.         pr dd 0
  147.         pg dd 0
  148.         pb dd 0
  149.         img_n dd ? ;указатель на данные нового изображения
  150.         cols dd ?
  151.         lin_b dd ? ;размер линии изображения в байтах
  152.         data_n dd ? ;указатель на данные для нового столбца пикселей
  153. endl
  154. pushad
  155. ;eax - delta for inp. img
  156. ;ebx - delta for outp. img
  157. ;esi - pointer to data_rgb
  158.         mov esi,[data_rgb]
  159.         mov [data_n],esi
  160.         mov eax,[size_w]
  161.         mov [cols],eax
  162.         lea eax,[eax+eax*2]
  163.         mov [lin_b],eax
  164. align 4
  165.         .cycyle_0:
  166.         mov eax,[size_h_new]
  167.         mov ecx,[size_h]
  168.         mov ebx,ecx
  169.         mov esi,[data_n]
  170.         mov [img_n],esi
  171.         add dword[data_n],3 ;переход на следующий столбец пикселей
  172. align 4
  173.         .cycyle_1:
  174.                 cmp eax,ebx
  175.                 jg .else_0
  176.                         ;копируемый пиксель максимально влияет на результат
  177.                         ;накапливаем rgb для интерполяции пикселей
  178.                         mov edx,[size_h_new]
  179.                         movzx edi,byte[esi]
  180.                         imul edi,edx
  181.                         add [pb],edi
  182.                         movzx edi,byte[esi+1]
  183.                         imul edi,edx
  184.                         add [pg],edi
  185.                         movzx edi,byte[esi+2]
  186.                         imul edi,edx
  187.                         add [pr],edi
  188.                         cmp eax,ebx
  189.                         je .d2_add
  190.                         jmp .if_0_end
  191.                 .else_0:
  192.                         ;копируемый пиксель попадет на границу пикселей
  193.                         mov edx,ebx
  194.                         sub edx,eax
  195.                         add edx,[size_h_new]
  196.                         movzx edi,byte[esi]
  197.                         imul edi,edx
  198.                         add [pb],edi
  199.                         movzx edi,byte[esi+1]
  200.                         imul edi,edx
  201.                         add [pg],edi
  202.                         movzx edi,byte[esi+2]
  203.                         imul edi,edx
  204.                         add [pr],edi
  205.                         ;сохраняем готовое rgb
  206.                         .d2_add:
  207.                         push eax
  208.                                 mov edi,[img_n]
  209.                                 mov eax,[pb]
  210.                                 xor edx,edx
  211.                                 div dword[size_h] ;eax /= [size_h]
  212.                                 stosb
  213.                                 mov eax,[pg]
  214.                                 xor edx,edx
  215.                                 div dword[size_h] ;eax /= [size_h]
  216.                                 stosb
  217.                                 mov eax,[pr]
  218.                                 xor edx,edx
  219.                                 div dword[size_h] ;eax /= [size_h]
  220.                                 stosb
  221.                         pop eax
  222.                         mov edx,[lin_b]
  223.                         add dword[img_n],edx ;next pixel
  224.                         ;обновляем rgb для нового пикселя
  225.                         mov edx,eax
  226.                         sub edx,ebx
  227.                         movzx edi,byte[esi]
  228.                         imul edi,edx
  229.                         mov [pb],edi
  230.                         movzx edi,byte[esi+1]
  231.                         imul edi,edx
  232.                         mov [pg],edi
  233.                         movzx edi,byte[esi+2]
  234.                         imul edi,edx
  235.                         mov [pr],edi
  236.                         add ebx,[size_h]
  237.                 .if_0_end:
  238.                 add eax,[size_h_new]
  239.                 add esi,[lin_b] ;next pixel
  240.                 dec ecx
  241.                 jnz .cycyle_1
  242.         dec dword[cols]
  243.         jnz .cycyle_0
  244. popad
  245.         ret
  246. endp
  247.  
  248. align 4
  249. proc gl_getPervPowerOfTwo uses ebx, n:dword
  250.         mov ebx,[n]
  251.         mov eax,(1 shl ZB_POINT_TEXEL_SIZE) ;max size
  252.         cmp ebx,eax
  253.         jge .set
  254.         @@:
  255.                 shr eax,1
  256.                 cmp ebx,eax
  257.                 jl @b
  258.         cmp eax,8 ;min size
  259.         jge .set
  260.                 mov eax,8
  261.         .set:
  262.         ret
  263. endp