Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2. ; файл для работы с выделенными точками,
  3. ; по которым делается преобразование изображения
  4. ;[0-3] - рамка (исх. и.)
  5. ;[4] - средняя точка (исх. и.)
  6. ;[5-6] - рамка (вых. и.)
  7. ;[7] - средняя точка (вых. и.)
  8. ;
  9.  
  10. struct point2d
  11.         x dd ? ;координата относит изображения
  12.         y dd ?
  13.         tx dd ? ;координата для текстуры
  14.         ty dd ?
  15.         captx rb 6
  16.         capty rb 6
  17. ends
  18.  
  19. ;настройка точек при загрузке программы
  20. ;(точки не активны)
  21. align 4
  22. points_init:
  23.         xor eax,eax
  24.         dec eax
  25.         mov ecx,8
  26.         mov edi,sel_pt
  27.         @@:
  28.                 mov [edi+point2d.x],eax
  29.                 mov [edi+point2d.y],eax
  30.                 add edi,sizeof.point2d
  31.                 loop @b
  32.         ret
  33.  
  34. ;настройка точек при открытии изображения
  35. ;(точки ставятся по углам изображения)
  36. align 4
  37. proc points_init_2 uses eax ecx edx edi, ot_x:dword
  38.         xor eax,eax
  39.         mov edi,sel_pt
  40.         mov edx,[ot_x]
  41.         mov [edi+point2d.x],edx ;1
  42.         mov [edi+point2d.y],eax ;1
  43.         add edi,sizeof.point2d
  44.         mov ecx,[buf_i0.w]
  45.         sub ecx,edx
  46.         mov [edi+point2d.x],ecx ;2
  47.         mov [edi+point2d.y],eax ;2
  48.         add edi,sizeof.point2d
  49.         mov [edi+point2d.x],ecx ;3
  50.         mov ecx,[buf_i0.h]
  51.         mov [edi+point2d.y],ecx ;3
  52.         add edi,sizeof.point2d
  53.         mov [edi+point2d.x],edx ;4
  54.         mov [edi+point2d.y],ecx ;4
  55.         call points_update_prop
  56.         ret
  57. endp
  58.  
  59. align 4
  60. proc points_update_prop uses eax ebx ecx edi esi
  61.         ;вычисление координат средней точки
  62.         mov edi,sel_pt
  63.         xor eax,eax
  64.         xor ebx,ebx
  65.         mov ecx,4
  66.         @@:
  67.                 add eax,[edi+point2d.x]
  68.                 add ebx,[edi+point2d.y]
  69.                 add edi,sizeof.point2d
  70.                 loop @b
  71.         shr eax,2
  72.         mov [edi+point2d.x],eax
  73.         shr ebx,2
  74.         mov [edi+point2d.y],ebx
  75.         add edi,sizeof.point2d
  76.        
  77.         cmp byte[trans_a],0 ;проверяем алгоритм растягивания текстуры
  78.         je @f
  79.                 ;на весь буфер
  80.                 xor eax,eax
  81.                 mov ebx,edi
  82.                 mov edi,buf_i0
  83.                 mov [ebx+point2d.x],eax
  84.                 mov [ebx+point2d.y],eax
  85.                 add ebx,sizeof.point2d
  86.                 mov eax,buf2d_w
  87.                 mov [ebx+point2d.x],eax
  88.                 mov ecx,buf2d_h
  89.                 mov [ebx+point2d.y],ecx
  90.                 add ebx,sizeof.point2d
  91.                 shr eax,1
  92.                 mov [ebx+point2d.x],eax
  93.                 shr ecx,1
  94.                 mov [ebx+point2d.y],ecx
  95.                 jmp .end0
  96.         @@:
  97.                 ;на часть буфера
  98.                 mov eax,[edi+point2d.x-5*sizeof.point2d]
  99.                 add eax,[edi+point2d.x-2*sizeof.point2d]
  100.                 shr eax,1
  101.                 mov [edi+point2d.x],eax
  102.                 mov eax,[edi+point2d.x-4*sizeof.point2d]
  103.                 add eax,[edi+point2d.x-3*sizeof.point2d]
  104.                 shr eax,1
  105.                 mov [edi+point2d.x+sizeof.point2d],eax
  106.  
  107.                 mov eax,[edi+point2d.y-5*sizeof.point2d]
  108.                 add eax,[edi+point2d.y-4*sizeof.point2d]
  109.                 shr eax,1
  110.                 mov [edi+point2d.y],eax
  111.                 mov eax,[edi+point2d.y-3*sizeof.point2d]
  112.                 add eax,[edi+point2d.y-2*sizeof.point2d]
  113.                 shr eax,1
  114.                 mov [edi+point2d.y+sizeof.point2d],eax
  115.                
  116.                 lea esi,[edi-sizeof.point2d]
  117.                 add edi,2*sizeof.point2d
  118.                 movsd ;copy coord x
  119.                 movsd ;copy coord y
  120.         .end0:
  121.        
  122.         mov edi,buf_i0
  123.         mov ebx,sel_pt
  124.         mov ecx,8
  125.         finit
  126.         .cycle0:
  127.                 fild dword[ebx+point2d.x]
  128.                 fidiv buf2d_w
  129.                 fst dword[ebx+point2d.tx]
  130.                
  131.                 fstp qword[Data_Double]
  132.                 call DoubleFloat_to_String
  133.                 call String_crop_0
  134.                 m2m dword[ebx+point2d.captx],dword[Data_String]
  135.                 mov al,byte[Data_String+4]
  136.                 mov byte[ebx+point2d.captx+4],al
  137.                
  138.                 fild dword[ebx+point2d.y]
  139.                 fidiv buf2d_h
  140.                 fst dword[ebx+point2d.ty]
  141.                
  142.                 fstp qword[Data_Double]
  143.                 call DoubleFloat_to_String
  144.                 call String_crop_0
  145.                 m2m dword[ebx+point2d.capty],dword[Data_String]
  146.                 mov al,byte[Data_String+4]
  147.                 mov byte[ebx+point2d.capty+4],al
  148.  
  149.                 add ebx,sizeof.point2d
  150.                 loop .cycle0
  151.  
  152.         call draw_transf_texture
  153.         ret
  154. endp
  155.  
  156. ;рисование выбранных точек
  157. align 4
  158. proc points_draw
  159. locals
  160.         PervX dd 0 ;pervios point coord X
  161.         PervY dd 0 ;pervios point coord Y
  162.         GrafX dd ? ;active point coord X
  163.         GrafY dd ? ;active point coord Y
  164. endl
  165.         mov edi,buf_ogl
  166.         cmp buf2d_data,0
  167.         je .endf
  168.  
  169.         xor ecx,ecx
  170.         mov edi,sel_pt
  171.         mov dword[txt_buf],'0'
  172.  
  173.         cmp byte[view_b],1
  174.         je .cycle0end
  175.         ;берем координаты последней точки
  176.         mov eax,[edi+3*sizeof.point2d+point2d.x]
  177.         add eax,[nav_x]
  178.         mov [PervX],eax
  179.         mov ebx,[edi+3*sizeof.point2d+point2d.y]
  180.         add ebx,[nav_y]
  181.         mov [PervY],ebx
  182. align 4
  183.         .cycle0:
  184.                 cmp dword[edi+point2d.x],-1
  185.                 je .end0
  186.                         mov eax,[edi+point2d.x]
  187.                         add eax,[nav_x]
  188.                         mov [GrafX],eax
  189.                         sub eax,3
  190.                         mov ebx,[edi+point2d.y]
  191.                         add ebx,[nav_y]
  192.                         mov [GrafY],ebx
  193.                         sub ebx,3
  194.                         cmp ecx,[sel_act]
  195.                         je @f
  196.                                 stdcall [buf2d_filled_rect_by_size], buf_0, eax,ebx, 5,5, 0xffff00
  197.                         @@:
  198.                         dec eax
  199.                         dec ebx
  200.                         stdcall [buf2d_rect_by_size], buf_0, eax,ebx, 7,7, 0x808000
  201.                         call point_draw_info
  202.                         ;рисование линии
  203.                         stdcall [buf2d_line], buf_0, [PervX],[PervY], [GrafX],[GrafY], 0x808000
  204.                         mov eax,[GrafX]
  205.                         mov [PervX],eax
  206.                         mov eax,[GrafY]
  207.                         mov [PervY],eax
  208.                 .end0:
  209.                 add edi,sizeof.point2d
  210.                 inc ecx
  211.                 cmp ecx,4
  212.                 jl .cycle0
  213.                 jmp .cycle1end
  214.         .cycle0end:
  215.         add edi,5*sizeof.point2d
  216. align 4
  217.         .cycle1:
  218.                 cmp dword[edi+point2d.x],-1
  219.                 je .end1
  220.                         mov eax,[GrafX]
  221.                         mov [PervX],eax
  222.                         mov eax,[GrafY]
  223.                         mov [PervY],eax
  224.                         mov eax,[edi+point2d.x]
  225.                         add eax,[nav_x]
  226.                         mov [GrafX],eax
  227.                         sub eax,3
  228.                         mov ebx,[edi+point2d.y]
  229.                         add ebx,[nav_y]
  230.                         mov [GrafY],ebx
  231.                         sub ebx,3
  232.                         stdcall [buf2d_filled_rect_by_size], buf_0, eax,ebx, 5,5, 0xffff00
  233.                         dec eax
  234.                         dec ebx
  235.                         stdcall [buf2d_rect_by_size], buf_0, eax,ebx, 7,7, 0x808000
  236.                         call point_draw_info
  237.                 .end1:
  238.                 add edi,sizeof.point2d
  239.                 inc ecx
  240.                 cmp ecx,2
  241.                 jl .cycle1
  242.                         mov eax,[GrafX]
  243.                         sub eax,[PervX]
  244.                         mov [GrafX],eax
  245.                         mov eax,[GrafY]
  246.                         sub eax,[PervY]
  247.                         mov [GrafY],eax
  248.                 stdcall [buf2d_rect_by_size], buf_0, [PervX],[PervY], [GrafX],[GrafY], 0x808000
  249.         .cycle1end:
  250.         ;средняя точка
  251.         mov eax,[edi+point2d.x]
  252.         add eax,[nav_x]
  253.         sub eax,3
  254.         mov ebx,[edi+point2d.y]
  255.         add ebx,[nav_y]
  256.         sub ebx,3
  257.         stdcall [buf2d_filled_rect_by_size], buf_0, eax,ebx, 5,5, 0xff0000
  258.         dec eax
  259.         dec ebx
  260.         stdcall [buf2d_rect_by_size], buf_0, eax,ebx, 7,7, 0x808000
  261.         add ebx,9
  262.         inc byte[txt_buf]
  263.         stdcall [buf2d_draw_text], buf_0, buf_font,txt_buf,eax,ebx,0
  264.         .endf:
  265.         ret
  266. endp
  267.  
  268. ;input:
  269. ; eax - coord x
  270. ; ebx - coord y
  271. ; edi - указатель на структуру point2d
  272. align 4
  273. point_draw_info:
  274.         ;вывод текста
  275.         add ebx,9
  276.         inc byte[txt_buf]
  277.         inc eax
  278.         stdcall [buf2d_draw_text], buf_0, buf_font,txt_buf,eax,ebx,0xffffff
  279.         sub eax,2
  280.         stdcall [buf2d_draw_text], buf_0, buf_font,txt_buf,eax,ebx,0xffffff
  281.         inc eax
  282.         inc ebx
  283.         stdcall [buf2d_draw_text], buf_0, buf_font,txt_buf,eax,ebx,0xffffff
  284.         ;dec ebx
  285.         sub ebx,2
  286.         stdcall [buf2d_draw_text], buf_0, buf_font,txt_buf,eax,ebx,0xffffff
  287.         inc ebx
  288.         stdcall [buf2d_draw_text], buf_0, buf_font,txt_buf,eax,ebx,0
  289.         add ebx,9
  290.         lea edx,[edi+point2d.captx]
  291.         inc eax
  292.         stdcall [buf2d_draw_text], buf_0, buf_font,edx,eax,ebx,0xffffff
  293.         sub eax,2
  294.         stdcall [buf2d_draw_text], buf_0, buf_font,edx,eax,ebx,0xffffff
  295.         inc eax
  296.         inc ebx
  297.         stdcall [buf2d_draw_text], buf_0, buf_font,edx,eax,ebx,0xffffff
  298.         ;dec ebx
  299.         sub ebx,2
  300.         stdcall [buf2d_draw_text], buf_0, buf_font,edx,eax,ebx,0xffffff
  301.         inc ebx
  302.         stdcall [buf2d_draw_text], buf_0, buf_font,edx,eax,ebx,0
  303.         add ebx,9
  304.         lea edx,[edi+point2d.capty]
  305.         inc eax
  306.         stdcall [buf2d_draw_text], buf_0, buf_font,edx,eax,ebx,0xffffff
  307.         sub eax,2
  308.         stdcall [buf2d_draw_text], buf_0, buf_font,edx,eax,ebx,0xffffff
  309.         inc eax
  310.         inc ebx
  311.         stdcall [buf2d_draw_text], buf_0, buf_font,edx,eax,ebx,0xffffff
  312.         ;dec ebx
  313.         sub ebx,2
  314.         stdcall [buf2d_draw_text], buf_0, buf_font,edx,eax,ebx,0xffffff
  315.         inc ebx
  316.         stdcall [buf2d_draw_text], buf_0, buf_font,edx,eax,ebx,0
  317.         ret
  318.  
  319. ;рисование преобразованной текстуры
  320. align 4
  321. draw_transf_texture:
  322.         cmp dword[buf_ogl],0
  323.         je .endf
  324.         stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
  325.         stdcall [glBegin],GL_TRIANGLES
  326.  
  327.         stdcall [glTexCoord2f], dword[sel_pt+4*sizeof.point2d+point2d.tx], dword[sel_pt+4*sizeof.point2d+point2d.ty] ;5
  328.         stdcall [glVertex3f], dword[sel_pt+7*sizeof.point2d+point2d.tx], dword[sel_pt+7*sizeof.point2d+point2d.ty], 0.1 ;8
  329.         stdcall [glTexCoord2f], dword[sel_pt+point2d.tx], dword[sel_pt+point2d.ty] ;1
  330.         stdcall [glVertex3f], dword[sel_pt+5*sizeof.point2d+point2d.tx], dword[sel_pt+5*sizeof.point2d+point2d.ty], 0.1 ;6
  331.         stdcall [glTexCoord2f], dword[sel_pt+sizeof.point2d+point2d.tx], dword[sel_pt+sizeof.point2d+point2d.ty] ;2
  332.         stdcall [glVertex3f], dword[sel_pt+6*sizeof.point2d+point2d.tx], dword[sel_pt+5*sizeof.point2d+point2d.ty], 0.1 ;7|6
  333.  
  334.         stdcall [glTexCoord2f], dword[sel_pt+4*sizeof.point2d+point2d.tx], dword[sel_pt+4*sizeof.point2d+point2d.ty] ;5
  335.         stdcall [glVertex3f], dword[sel_pt+7*sizeof.point2d+point2d.tx], dword[sel_pt+7*sizeof.point2d+point2d.ty], 0.1 ;8
  336.         stdcall [glTexCoord2f], dword[sel_pt+sizeof.point2d+point2d.tx], dword[sel_pt+sizeof.point2d+point2d.ty] ;2
  337.         stdcall [glVertex3f], dword[sel_pt+6*sizeof.point2d+point2d.tx], dword[sel_pt+5*sizeof.point2d+point2d.ty], 0.1 ;7|6
  338.         stdcall [glTexCoord2f], dword[sel_pt+2*sizeof.point2d+point2d.tx], dword[sel_pt+2*sizeof.point2d+point2d.ty] ;3
  339.         stdcall [glVertex3f], dword[sel_pt+6*sizeof.point2d+point2d.tx], dword[sel_pt+6*sizeof.point2d+point2d.ty], 0.1 ;7
  340.        
  341.         stdcall [glTexCoord2f], dword[sel_pt+4*sizeof.point2d+point2d.tx], dword[sel_pt+4*sizeof.point2d+point2d.ty] ;5
  342.         stdcall [glVertex3f], dword[sel_pt+7*sizeof.point2d+point2d.tx], dword[sel_pt+7*sizeof.point2d+point2d.ty], 0.1 ;8
  343.         stdcall [glTexCoord2f], dword[sel_pt+2*sizeof.point2d+point2d.tx], dword[sel_pt+2*sizeof.point2d+point2d.ty] ;3
  344.         stdcall [glVertex3f], dword[sel_pt+6*sizeof.point2d+point2d.tx], dword[sel_pt+6*sizeof.point2d+point2d.ty], 0.1 ;7
  345.         stdcall [glTexCoord2f], dword[sel_pt+3*sizeof.point2d+point2d.tx], dword[sel_pt+3*sizeof.point2d+point2d.ty] ;4
  346.         stdcall [glVertex3f], dword[sel_pt+5*sizeof.point2d+point2d.tx], dword[sel_pt+6*sizeof.point2d+point2d.ty], 0.1 ;6|7
  347.        
  348.         stdcall [glTexCoord2f], dword[sel_pt+4*sizeof.point2d+point2d.tx], dword[sel_pt+4*sizeof.point2d+point2d.ty] ;5
  349.         stdcall [glVertex3f], dword[sel_pt+7*sizeof.point2d+point2d.tx], dword[sel_pt+7*sizeof.point2d+point2d.ty], 0.1 ;8
  350.         stdcall [glTexCoord2f], dword[sel_pt+3*sizeof.point2d+point2d.tx], dword[sel_pt+3*sizeof.point2d+point2d.ty] ;4
  351.         stdcall [glVertex3f], dword[sel_pt+5*sizeof.point2d+point2d.tx], dword[sel_pt+6*sizeof.point2d+point2d.ty], 0.1 ;6|7
  352.         stdcall [glTexCoord2f], dword[sel_pt+point2d.tx], dword[sel_pt+point2d.ty] ;1
  353.         stdcall [glVertex3f], dword[sel_pt+5*sizeof.point2d+point2d.tx], dword[sel_pt+5*sizeof.point2d+point2d.ty], 0.1 ;6
  354.  
  355.         stdcall [glEnd]
  356.         .endf:
  357.         ret
  358.