format MS COFF public EXPORTS section '.flat' code readable align 16 include '../../../../macros.inc' include '../../../../proc32.inc' ;----------------------------------------------------------------------------- mem.alloc dd ? ;функция для выделения памяти mem.free dd ? ;функция для освобождения памяти mem.realloc dd ? ;функция для перераспределения памяти dll.load dd ? BUF_STRUCT_SIZE equ 21 buf2d_data equ dword[edi] ;данные буфера изображения buf2d_w equ dword[edi+8] ;ширина буфера buf2d_h equ dword[edi+12] ;высота буфера buf2d_l equ word[edi+4] buf2d_t equ word[edi+6] ;отступ сверху buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера buf2d_color equ dword[edi+16] ;цвет фона буфера buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения struct buf_2d_header img_data dd ? left dw ? ;+4 left top dw ? ;+6 top size_x dd ? ;+8 w size_y dd ? ;+12 h color dd ? ;+16 color bit_pp db ? ;+21 bit in pixel ends macro swap v1, v2 { push v1 push v2 pop v1 pop v2 } ;флаги, для функции обрезания буфера BUF2D_OPT_CROP_TOP equ 1 ;обрезка сверху BUF2D_OPT_CROP_LEFT equ 2 ;обрезка слева BUF2D_OPT_CROP_BOTTOM equ 4 ;обрезка снизу BUF2D_OPT_CROP_RIGHT equ 8 ;обрезка справа BUF2D_BIT_OPT_CROP_TOP equ 0 BUF2D_BIT_OPT_CROP_LEFT equ 1 BUF2D_BIT_OPT_CROP_BOTTOM equ 2 BUF2D_BIT_OPT_CROP_RIGHT equ 3 ;input: ; eax = указатель на функцию выделения памяти ; ebx = ... освобождения памяти ; ecx = ... перераспределения памяти ; edx = ... загрузки библиотеки (пока не используется) align 16 lib_init: mov dword[mem.alloc], eax mov dword[mem.free], ebx mov dword[mem.realloc], ecx mov dword[dll.load], edx ret ;input: ; ebx = coord x ; ecx = coord y ; edx = pixel color ; edi = pointer to buffer struct align 4 draw_pixel: ;cmp buf2d_bits,24 ;jne @f bt ebx,31 jc @f bt ecx,31 jc @f cmp ebx,buf2d_w jge @f cmp ecx,buf2d_h jge @f push esi mov esi,buf2d_w ;size x imul esi,ecx ;size_x*y add esi,ebx ;size_x*y+x lea esi,[esi+esi*2] ;(size_x*y+x)*3 add esi,buf2d_data ;ptr+(size_x*y+x)*3 mov word[esi],dx ;copy pixel color ror edx,16 mov byte[esi+2],dl ror edx,16 pop esi @@: ret ;endp ;создание буфера align 4 proc buf_create, buf_struc:dword pushad mov edi,dword[buf_struc] mov ecx,buf2d_w mov ebx,buf2d_h imul ecx,ebx cmp buf2d_bits,24 jne @f lea ecx,[ecx+ecx*2] ; 24 bit = 3 ;;;inc ecx ;запасной байт в конце буфера, что-бы не глючили некоторые функции на изображениях кратных 4К @@: cmp buf2d_bits,32 jne @f shl ecx,2 ; 32 bit = 4 @@: invoke mem.alloc,ecx mov buf2d_data,eax stdcall buf_clear,edi,buf2d_color ;очистка буфера фоновым цветом popad ret endp ;создание буфера на основе изображения rgb align 4 proc buf_create_f_img, buf_struc:dword, rgb_data:dword pushad mov edi,dword[buf_struc] mov ecx,buf2d_w mov ebx,buf2d_h imul ecx,ebx cmp buf2d_bits,24 jne @f lea ecx,[ecx+ecx*2] ; 24 bit = 3 ;;;inc ecx ;запасной байт в конце буфера, что-бы не глючили некоторые функции на изображениях кратных 4К @@: cmp buf2d_bits,32 jne @f shl ecx,2 ; 32 bit = 4 @@: invoke mem.alloc,ecx mov buf2d_data,eax cmp buf2d_bits,24 jne @f cld mov esi,[rgb_data] mov edi,eax ;eax=buf2d_data rep movsb ;копируем биты изображения в буфер jmp .end_create @@: stdcall buf_clear,edi,buf2d_color ;очистка буфера фоновым цветом .end_create: popad ret endp align 4 proc buf_clear, buf_struc:dword, color:dword ;очистка буфера заданым цветом pushad mov edi,dword[buf_struc] mov ecx,buf2d_w mov ebx,buf2d_h imul ecx,ebx cld cmp buf2d_bits,8 jne .end_clear_8 mov edi,buf2d_data mov al,byte[color] rep stosb jmp .end_clear_32 .end_clear_8: cmp buf2d_bits,24 jne .end_clear_24 mov edi,buf2d_data mov eax,dword[color] mov ebx,eax shr ebx,16 @@: stosw mov byte[edi],bl inc edi loop @b jmp .end_clear_32 .end_clear_24: cmp buf2d_bits,32 jne .end_clear_32 mov edi,buf2d_data mov eax,dword[color] rep stosd ;jmp .end_clear_32 .end_clear_32: popad ret endp ;функция для обрезания буферов 8 и 24 битных, по заданому цвету. ;параметр opt задается комбинацией констант: ; BUF2D_OPT_CROP_TOP - обрезка сверху ; BUF2D_OPT_CROP_LEFT - обрезка слева ; BUF2D_OPT_CROP_BOTTOM - обрезка снизу ; BUF2D_OPT_CROP_RIGHT - обрезка справа align 4 proc buf_crop_color, buf_struc:dword, color:dword, opt:dword locals crop_r dd ? endl pushad mov edi,dword[buf_struc] cmp buf2d_bits,24 jne .24end_f bt dword[opt],BUF2D_BIT_OPT_CROP_BOTTOM jae .24no_crop_bottom mov eax,dword[color] mov edx,eax ;ax = colors - r,g shr edx,16 ;dl = color - b mov ecx,buf2d_h cmp ecx,1 jle .24no_crop_bottom ;проверяем на случай если высота буфера 1 пиксель mov ebx,buf2d_w imul ecx,ebx lea esi,[ecx+ecx*2] ;esi=3*ecx add esi,buf2d_data cld @@: sub esi,3 cmp word[esi],ax jne @f cmp byte[esi+2],dl jne @f loop @b @@: lea ebx,[ebx+ebx*2] xor edx,edx mov eax,buf2d_h imul eax,ebx add eax,buf2d_data ;eax - указатель на конец буфера изображения @@: add esi,ebx cmp esi,eax jge @f inc edx ;вычисляем число полных строк для обрезания loop @b @@: cmp edx,0 je .24no_crop_bottom cmp edx,buf2d_h jge .24no_crop_bottom ;что-бы не получить пустой буфер sub buf2d_h,edx ;уменьшаем высоту буфера mov ecx,buf2d_h imul ecx,ebx ;ecx = новый размер изображения invoke mem.realloc,buf2d_data,ecx mov buf2d_data,eax ;на случай если изменился указатель на данные .24no_crop_bottom: bt dword[opt],BUF2D_BIT_OPT_CROP_TOP jae .24no_crop_top mov eax,dword[color] mov edx,eax ;ax = colors - r,g shr edx,16 ;dl = color - b mov esi,buf2d_data mov ecx,buf2d_h cmp ecx,1 jle .24no_crop_top ;проверяем на случай если высота буфера 1 пиксель dec ecx ;при обрезании должна остаться минимум 1-на строка пикселей mov ebx,buf2d_w imul ecx,ebx cld @@: cmp word[esi],ax jne @f cmp byte[esi+2],dl jne @f add esi,3 loop @b @@: lea ebx,[ebx+ebx*2] xor edx,edx @@: sub esi,ebx cmp esi,buf2d_data jl @f inc edx ;вычисляем число полных строк для обрезания loop @b @@: cmp edx,0 je .24no_crop_top xor eax,eax sub eax,edx mov ebx,buf2d_h sub ebx,edx stdcall buf_offset_h, edi, eax, edx, ebx ;сдвигаем изображение в буфере вверх (eax<0) sub buf2d_h,edx ;уменьшаем высоту буфера mov ecx,buf2d_h add buf2d_t,dx ;сдвигаем отступ вниз, на число обрезанных строк mov ebx,buf2d_w imul ecx,ebx lea ecx,[ecx+ecx*2] invoke mem.realloc,buf2d_data,ecx mov buf2d_data,eax ;на случай если изменился указатель на данные .24no_crop_top: bt dword[opt],BUF2D_BIT_OPT_CROP_RIGHT jae .24no_crop_right mov eax,dword[color] mov edx,eax ;ax = colors - r,g shr edx,16 ;dl = color - b mov ebx,buf2d_w cmp ebx,1 jle .24no_crop_right ;на случай если ширина буфера 1 пиксель lea ebx,[ebx+ebx*2] mov esi,ebx imul esi,buf2d_h add esi,buf2d_data ;esi - указатель на конец буфера изображения mov dword[crop_r],0 cld .24found_beg_right: sub esi,3 ;двигаемся на 1-ну колонку влево mov ecx,buf2d_h ;восстановление ecx для нового цикла @@: cmp word[esi],ax jne .24found_right cmp byte[esi+2],dl jne .24found_right sub esi,ebx ;прыгаем на верхнюю строку loop @b inc dword[crop_r] mov ecx,buf2d_w dec ecx ;1 колонка на запас cmp dword[crop_r],ecx jge .24found_right sub esi,3 ;двигаемся на 1-ну колонку влево mov ecx,buf2d_h ;восстановление ecx для нового цикла @@: add esi,ebx ;прыгаем на нижнюю строку cmp word[esi],ax jne .24found_right cmp byte[esi+2],dl jne .24found_right loop @b inc dword[crop_r] mov ecx,buf2d_w dec ecx ;1 колонка на запас cmp dword[crop_r],ecx jl .24found_beg_right .24found_right: cmp dword[crop_r],0 je .24no_crop_right mov ecx,buf2d_w sub ecx,dword[crop_r] stdcall img_rgb_crop_r, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру mov buf2d_w,ecx ;ставим новую ширину для буфера mov ebx,buf2d_h imul ecx,ebx lea ecx,[ecx+ecx*2] invoke mem.realloc,buf2d_data,ecx mov buf2d_data,eax ;на случай если изменился указатель на данные .24no_crop_right: bt dword[opt],BUF2D_BIT_OPT_CROP_LEFT jae .24no_crop_left mov eax,dword[color] mov edx,eax ;ax = colors - r,g shr edx,16 ;dl = color - b mov ebx,buf2d_w cmp ebx,1 jle .24no_crop_left ;на случай если ширина буфера 1 пиксель lea ebx,[ebx+ebx*2] mov esi,buf2d_data ;esi - указатель на начоло буфера изображения mov dword[crop_r],0 cld .24found_beg_left: mov ecx,buf2d_h ;восстановление ecx для нового цикла @@: cmp word[esi],ax jne .24found_left cmp byte[esi+2],dl jne .24found_left add esi,ebx ;прыгаем на нижнюю строку loop @b inc dword[crop_r] add esi,3 ;двигаемся на 1-ну колонку вправо mov ecx,buf2d_w dec ecx ;1 колонка на запас cmp dword[crop_r],ecx jge .24found_left mov ecx,buf2d_h ;восстановление ecx для нового цикла @@: sub esi,ebx ;прыгаем на верхнюю строку cmp word[esi],ax jne .24found_left cmp byte[esi+2],dl jne .24found_left loop @b inc dword[crop_r] add esi,3 ;двигаемся на 1-ну колонку вправо mov ecx,buf2d_w dec ecx ;1 колонка на запас cmp dword[crop_r],ecx jl .24found_beg_left .24found_left: cmp dword[crop_r],0 je .24no_crop_left mov ecx,buf2d_w sub ecx,dword[crop_r] stdcall img_rgb_crop_l, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру mov buf2d_w,ecx ;ставим новую ширину для буфера mov ebx,buf2d_h imul ecx,ebx lea ecx,[ecx+ecx*2] invoke mem.realloc,buf2d_data,ecx mov buf2d_data,eax ;на случай если изменился указатель на данные mov eax,dword[crop_r] add buf2d_l,ax .24no_crop_left: .24end_f: cmp buf2d_bits,8 jne .8end_f bt dword[opt],BUF2D_BIT_OPT_CROP_BOTTOM jae .8no_crop_bottom mov eax,dword[color] mov esi,buf2d_data mov ecx,buf2d_h cmp ecx,1 jle .8no_crop_bottom ;проверяем на случай если высота буфера 1 пиксель mov ebx,buf2d_w imul ecx,ebx mov esi,ecx add esi,buf2d_data cld @@: dec esi cmp byte[esi],al jne @f loop @b @@: xor edx,edx mov eax,buf2d_h imul eax,ebx add eax,buf2d_data ;eax - указатель на конец буфера изображения @@: add esi,ebx cmp esi,eax jge @f inc edx loop @b @@: cmp edx,0 je .8no_crop_bottom cmp edx,buf2d_h jge .8no_crop_bottom ;что-бы не получить пустой буфер sub buf2d_h,edx ;уменьшаем высоту буфера mov ecx,buf2d_h imul ecx,ebx ;ecx = новый размер изображения invoke mem.realloc,buf2d_data,ecx mov buf2d_data,eax ;на случай если изменился указатель на данные .8no_crop_bottom: bt dword[opt],BUF2D_BIT_OPT_CROP_TOP jae .8no_crop_top mov eax,dword[color] mov esi,buf2d_data mov ecx,buf2d_h cmp ecx,1 jle .8no_crop_top ;проверяем на случай если высота буфера 1 пиксель dec ecx ;при обрезании должна остаться минимум 1-на строка пикселей mov ebx,buf2d_w imul ecx,ebx cld @@: cmp byte[esi],al jne @f inc esi loop @b @@: xor edx,edx @@: sub esi,ebx cmp esi,buf2d_data jl @f inc edx loop @b @@: cmp edx,0 je .8no_crop_top xor eax,eax sub eax,edx mov ebx,buf2d_h sub ebx,edx stdcall buf_offset_h, edi, eax, edx, ebx mov ecx,buf2d_h sub ecx,edx mov buf2d_h,ecx ;уменьшаем высоту буфера add buf2d_t,dx ;сдвигаем отступ вниз, на число обрезанных строк mov ebx,buf2d_w imul ecx,ebx invoke mem.realloc,buf2d_data,ecx mov buf2d_data,eax ;на случай если изменился указатель на данные .8no_crop_top: bt dword[opt],BUF2D_BIT_OPT_CROP_RIGHT jae .8no_crop_right mov eax,dword[color] mov ebx,buf2d_w cmp ebx,1 jle .8no_crop_right ;на случай если ширина буфера 1 пиксель mov esi,ebx imul esi,buf2d_h add esi,buf2d_data ;esi - указатель на конец буфера изображения xor edx,edx cld .8found_beg: dec esi ;двигаемся на 1-ну колонку влево mov ecx,buf2d_h ;восстановление ecx для нового цикла @@: cmp byte[esi],al jne .8found sub esi,ebx ;прыгаем на верхнюю строку loop @b inc edx mov ecx,buf2d_w dec ecx ;1 колонка на запас cmp edx,ecx jge .8found dec esi ;двигаемся на 1-ну колонку влево mov ecx,buf2d_h ;восстановление ecx для нового цикла @@: add esi,ebx ;прыгаем на нижнюю строку cmp byte[esi],al jne .8found loop @b inc edx mov ecx,buf2d_w dec ecx ;1 колонка на запас cmp edx,ecx jl .8found_beg .8found: cmp edx,0 je .8no_crop_right mov ecx,buf2d_w sub ecx,edx stdcall img_gray_crop_r, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру mov buf2d_w,ecx ;ставим новую ширину для буфера mov ebx,buf2d_h imul ecx,ebx invoke mem.realloc,buf2d_data,ecx mov buf2d_data,eax ;на случай если изменился указатель на данные .8no_crop_right: bt dword[opt],BUF2D_BIT_OPT_CROP_LEFT jae .8no_crop_left mov eax,dword[color] mov ebx,buf2d_w cmp ebx,1 jle .8no_crop_left ;на случай если ширина буфера 1 пиксель mov esi,buf2d_data ;esi - указатель на начоло буфера изображения mov edx,0 cld .8found_beg_left: mov ecx,buf2d_h ;восстановление ecx для нового цикла @@: cmp word[esi],ax jne .8found_left add esi,ebx ;прыгаем на нижнюю строку loop @b inc edx inc esi ;двигаемся на 1-ну колонку вправо mov ecx,buf2d_w dec ecx ;1 колонка на запас cmp edx,ecx jge .8found_left mov ecx,buf2d_h ;восстановление ecx для нового цикла @@: sub esi,ebx ;прыгаем на верхнюю строку cmp word[esi],ax jne .8found_left loop @b inc edx inc esi ;двигаемся на 1-ну колонку вправо mov ecx,buf2d_w dec ecx ;1 колонка на запас cmp edx,ecx jl .8found_beg_left .8found_left: cmp edx,0 je .8no_crop_left mov ecx,buf2d_w sub ecx,edx stdcall img_gray_crop_l, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру mov buf2d_w,ecx ;ставим новую ширину для буфера mov ebx,buf2d_h imul ecx,ebx invoke mem.realloc,buf2d_data,ecx mov buf2d_data,eax ;на случай если изменился указатель на данные mov eax,edx add buf2d_l,ax .8no_crop_left: .8end_f: popad ret endp ;обрезаем цветное изображение с правой стороны ;input: ;data_rgb - pointer to rgb data ;size_w_old - width img in pixels ;size_w_new - new width img in pixels ;size_h - height img in pixels align 4 proc img_rgb_crop_r, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:dword pushad mov eax, dword[size_w_old] lea eax, dword[eax+eax*2] ;eax = width(old) * 3(rgb) mov ebx, dword[size_w_new] lea ebx, dword[ebx+ebx*2] ;ebx = width(new) * 3(rgb) mov edx, dword[size_h] mov edi, dword[data_rgb] ;edi - получает данные mov esi, edi add edi, ebx add esi, eax cld @@: dec edx ;уменьшаем счетчик оставшихся строк на 1 cmp edx,0 jle @f mov ecx, ebx rep movsb ;перенос (копирование) строки пикселей add esi,eax ;переход на новую строчку изображения sub esi,ebx jmp @b @@: popad ret endp ;обрезаем серое изображение с правой стороны ;input: ;data_gray - pointer to gray data ;size_w_old - width img in pixels ;size_w_new - new width img in pixels ;size_h - height img in pixels align 4 proc img_gray_crop_r, data_gray:dword, size_w_old:dword, size_w_new:dword, size_h:dword pushad mov eax, dword[size_w_old] mov ebx, dword[size_w_new] mov edx, dword[size_h] mov edi, dword[data_gray] ;edi - получает данные mov esi, edi add edi, ebx add esi, eax cld @@: dec edx ;уменьшаем счетчик оставшихся строк на 1 cmp edx,0 jle @f mov ecx, ebx rep movsb ;перенос (копирование) строки пикселей add esi,eax ;переход на новую строчку изображения sub esi,ebx jmp @b @@: popad ret endp ;обрезаем цветное изображение с левой стороны ;input: ;data_rgb - pointer to rgb data ;size_w_old - width img in pixels ;size_w_new - new width img in pixels ;size_h - height img in pixels align 4 proc img_rgb_crop_l, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:dword pushad mov edi,dword[data_rgb] mov esi,edi mov eax,dword[size_w_old] mov ebx,dword[size_w_new] cmp eax,ebx jle .end_f ;старый размер изображения не может быть меньше нового (при условии обрезания картинки) lea eax,[eax+eax*2] lea ebx,[ebx+ebx*2] sub eax,ebx mov edx,dword[size_h] ;высота изображения cld @@: add esi,eax mov ecx,ebx rep movsb dec edx cmp edx,0 jg @b .end_f: popad ret endp ;обрезаем серое изображение с левой стороны ;input: ;data_gray - pointer to gray data ;size_w_old - width img in pixels ;size_w_new - new width img in pixels ;size_h - height img in pixels align 4 proc img_gray_crop_l, data_gray:dword, size_w_old:dword, size_w_new:dword, size_h:dword pushad mov edi,dword[data_gray] mov esi,edi mov eax,dword[size_w_old] mov ebx,dword[size_w_new] cmp eax,ebx jle .end_f ;старый размер изображения не может быть меньше нового (при условии обрезания картинки) sub eax,ebx mov edx,dword[size_h] ;высота изображения cld @@: add esi,eax mov ecx,ebx rep movsb dec edx cmp edx,0 jg @b .end_f: popad ret endp ;hoffs - колличество пикселей на котрые поднимается/опускается изображение ;img_t - высота, с которой начинается двигающаяся часть изображения align 4 proc buf_offset_h, buf_struc:dword, hoffs:dword, img_t:dword, img_h:dword ;сдвигает изображение по высоте pushad mov edi,dword[buf_struc] cmp buf2d_bits,24 jne .end_move_24 mov eax,[hoffs] cmp eax,0 je .end_move_24 mov ebx,buf2d_w mov edx,dword[img_t] mov ecx,dword[img_h] ;ecx - высота сдвигаемых данных cmp ecx,buf2d_h jge .end_f ;ошибочное условие, высота изображения меньше чем высота сдвигаемого изображения imul ecx,ebx ;ecx - колличество пикселей в сдвигаемых данных lea ecx,[ecx+ecx*2] imul ebx,edx lea ebx,[ebx+ebx*2] mov esi,buf2d_data add esi,ebx add edx,eax ;edx = img_t+hoffs (hoffs<0) mov ebx,buf2d_w imul ebx,edx lea ebx,[ebx+ebx*2] mov edi,buf2d_data ;позиция, куда будет двигаться изображение add edi,ebx cmp eax,0 jg .move_down_24 ;двигаем изображение вверх cld rep movsb jmp .end_f .move_down_24: ;двигаем изображение вниз add esi,ecx dec esi add edi,ecx dec edi std rep movsb jmp .end_f .end_move_24: ;stdcall print_err,sz_buf2d_offset_h,txt_err_n24b cmp buf2d_bits,8 jne .end_move_8 mov eax,[hoffs] cmp eax,0 je .end_move_8 ;двигаем изображение вверх mov ebx,buf2d_w mov edx,dword[img_t] mov ecx,dword[img_h] ;ecx - высота сдвигаемых данных cmp ecx,buf2d_h jge .end_f ;ошибочное условие, высота изображения меньше чем высота сдвигаемого изображения imul ecx,ebx ;ecx - колличество пикселей в сдвигаемых данных imul ebx,edx mov esi,buf2d_data add esi,ebx add edx,eax ;edx = img_t+hoffs (hoffs<0) mov ebx,buf2d_w imul ebx,edx mov edi,buf2d_data ;позиция, куда будет двигаться изображение add edi,ebx cmp eax,0 jg .move_down_8 cld rep movsb jmp .end_f .move_down_8: ;двигаем изображение вниз add esi,ecx dec esi add edi,ecx dec edi std rep movsb jmp .end_f .end_move_8: .end_f: popad ret endp align 4 proc buf_draw_buf, buf_struc:dword pushad mov edi,dword[buf_struc] cmp buf2d_bits,24 jne .error mov eax,7 mov ebx,buf2d_data mov ecx,buf2d_w ror ecx,16 mov edx,buf2d_h mov cx,dx mov edx,buf2d_size_lt ror edx,16 int 0x40 jmp .end_draw_24 .error: stdcall print_err,sz_buf2d_draw,txt_err_n24b .end_draw_24: popad ret endp align 4 proc buf_delete, buf_struc:dword push edi mov edi,dword[buf_struc] invoke mem.free,buf2d_data pop edi ret endp align 4 proc buf_line_brs, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, coord_y1:dword, color:dword locals loc_1 dd ? loc_2 dd ? napravl db ? endl pushad mov edx,dword[color] mov eax,dword[coord_x1] sub eax,dword[coord_x0] bt eax,31 jae @f neg eax inc eax @@: mov ebx,dword[coord_y1] sub ebx,dword[coord_y0] bt ebx,31 jae @f neg ebx inc ebx @@: mov [napravl],byte 0 ;bool steep=false cmp eax,ebx jle @f mov [napravl],byte 1 ;bool steep=true swap dword[coord_x0],dword[coord_y0] ;swap(x0, y0); swap dword[coord_x1],dword[coord_y1] ;swap(x1, y1); @@: mov eax,dword[coord_y0] ;x0 cmp eax,dword[coord_y1] ;if(x0>x1) jle @f swap dword[coord_y0],dword[coord_y1] ;swap(x0, x1); swap dword[coord_x0],dword[coord_x1] ;swap(y0, y1); @@: ; int deltax esi ; int deltay edi ; int error ebp-6 ; int ystep ebp-8 mov eax,dword[coord_y0] mov esi,dword[coord_y1] sub esi,eax ;deltax = y1-y0 mov ebx,esi shr ebx,1 mov [loc_1],ebx ;error = deltax/2 mov eax,dword[coord_x0] mov edi,dword[coord_x1] mov [loc_2],dword -1 ;ystep = -1 cmp eax,edi ;if (x0