Board.KolibriOS.org

Official KolibriOS board
It is currently Mon Dec 09, 2019 9:48 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 99 posts ]  Go to page Previous 13 4 5 6 7 Next
Author Message
PostPosted: Thu Jun 21, 2012 2:51 pm 
Offline
User avatar

Joined: Mon Oct 27, 2008 10:10 pm
Posts: 813
ревизия 2759 добавлены функции для рисования воксельных объектов (создаваемых в воксельном редакторе)
ревизия 2815 добавлена еще одна воксельная функция и 2 примера. Внешний вид примеров под спойлером.
Spoiler: Show
Attachment:
vox_120621.png
vox_120621.png [ 20.47 KiB | Viewed 3213 times ]


Top
   
PostPosted: Mon Nov 05, 2012 3:33 am 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 5067
Исходники vectors.obj есть на SVN? Актуальны они или нет, может уже перекочевали в buf2d?

_________________
Через тернии к звездам


Top
   
PostPosted: Mon Nov 05, 2012 12:55 pm 
Offline
User avatar

Joined: Mon Oct 27, 2008 10:10 pm
Posts: 813
Leency wrote:
Исходники vectors.obj есть на SVN? Актуальны они или нет, может уже перекочевали в buf2d?

Исходников vectors.obj на SVN нет. Часть кода из vectors.obj перешла в buf2d.obj.
Актуальны они или нет вопрос сложный, потому что в них есть возможность вывода масштабируемых полигонов, чего нет в buf2d. Перекидывать эти функции в buf2d я не стал по той причине что хотел упростить формат для хранения полигонов.
Думаю что название этой темы можно поменять на Функции для рисования 2d графики (библиотеки vectors и buf2d) , только я как простой пользователь не могу менять название тем.


Top
   
PostPosted: Mon Nov 05, 2012 2:02 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 5067
На самом деле можешь, хоть это и не совсем очевидная функция, - для этого нужно отредактировать заголовок первого сообщения в теме.

_________________
Через тернии к звездам


Top
   
PostPosted: Mon Jul 22, 2013 6:45 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Теперь функции дизеринга добавлены в buf2d, поэтому напишу здесь.
Я здесь http://board.kolibrios.org/viewtopic.php?f=32&t=2187&p=44785#p44810 писал, что иногда "тот фильтр вылетает".
Spoiler: Show
Возьмём, например, dither_4.
Вызов происходит из buf_filter_dither:
Code:
proc buf_filter_dither, buffer:dword, algor:dword
; ...............................................
;edi - pointer to 24bit bitmap
;edx - x size
;esi - y size
lea   edx,[edx+edx*2]
imul  esi,edx
; ...............................................
call dither_4

Цикл ниже будет выполняться столько раз, сколько байтов содержится в bitmap.
Code:
dither_4:                       ; Atkinson algorithm
newp_4:                         ; Dithering cycle
; ...............................................
 .next:
    inc   edi
    dec   esi
    jnz   newp_4

В некоторый момент произойдёт обращение к памяти за пределами буфера bitmap:
Code:
  .ok:
    mov   [edi+3],al             ; putpixel
 
    movzx eax,byte[edi+edx]      ; pixel (x;y+1)
; ..........................................
  .ok1:
    mov   [edi+edx],al           ; putpixel
 
    movzx eax,byte[edi+6]        ; pixel (x+2;y)
; ..........................................
  .ok2:
    mov   [edi+6],al             ; putpixel
 
    movzx eax,byte[edi+edx-3]    ; pixel (x-1;y+1)
; ..........................................
  .ok3:
    mov   [edi+edx-3],al         ; putpixel
 
    movzx eax,byte[edi+edx+3]    ; pixel (x+1;y+1)
; ..........................................
  .ok4:
    mov   [edi+edx+3],al         ; putpixel
 
 
    movzx eax,byte[edi+edx+edx]    ; pixel (x;y+2)
; ..........................................
  .ok5:
    mov   [edi+edx+edx],al         ; putpixel


Top
   
PostPosted: Mon Jul 22, 2013 7:01 pm 
Offline
User avatar

Joined: Fri Jan 27, 2006 3:06 pm
Posts: 1071
Хм, похоже на правду - как-то не сталкивался с падениями, потому не задумывался, как доберусь - поковыряюсь.


Top
   
PostPosted: Sat Oct 05, 2013 7:07 pm 
Offline
User avatar

Joined: Fri Jan 27, 2006 3:06 pm
Posts: 1071
Как-то не могу придумать годного решения проблемы обращения к памяти за пределами буфера, кроме как вручную резервировать после буфера область, равную 2 строкам изображения. Может у кого лучше идеи есть?


Top
   
PostPosted: Sat Oct 05, 2013 7:44 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Heavyiron
А из-за чего возникает обращение за пределы буфера ?


Top
   
PostPosted: Sat Oct 05, 2013 9:40 pm 
Offline
User avatar

Joined: Fri Jan 27, 2006 3:06 pm
Posts: 1071
Serge, обработка изображения идет попиксельно, а погрешность распределяется на соседние пиксели, расположенные в том числе и в нижних строках. В начале изображения и до предпредпоследней строки - все ок, но дальше алгоритм начинает писать в область за пределами последних пикселей. 0CodErr 2 постами выше привел пример в коде. Мутить проверку не находится ли пиксель в последних строках не хочется - думаю, это заметно замедлит код.


Top
   
PostPosted: Sat Oct 05, 2013 9:49 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Лучше всего выделить дополнительные строки.


Top
   
PostPosted: Sun Oct 06, 2013 8:28 am 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Serge wrote:
Лучше всего выделить дополнительные строки.
Для заранее неизвестного размера изображения придётся делать это динамически, что также может замедлить код.
Есть ещё такой вариант: применять фильтр не ко всему изображению, то есть начинать не с точки (0; 0), а с точки (1; 1) и заканчивать точкой (Width-2; Height-2), а не точкой (Width-1; Height-1). Мы не так много потеряем в качестве из-за каких-то двух строк.


Top
   
PostPosted: Sun Oct 06, 2013 12:41 pm 
Offline
User avatar

Joined: Fri Jan 27, 2006 3:06 pm
Posts: 1071
0CodErr, в качестве будет незаметно, но изображение уже не будет 8-ми цветным, если какие-то пиксели не обработаны. Разве что цвета округлять, а ошибку не распределять для последних строк. Но тут опять впадаю в ступор по реализации этого дела


Top
   
PostPosted: Sun Oct 06, 2013 2:06 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Quote:
Для заранее неизвестного размера изображения придётся делать это динамически, что также может замедлить код.
В смысле заранее неизвестного ? Там буфер фиксированного размера и если картинка больше, то всё, облом ?


Top
   
PostPosted: Mon Oct 07, 2013 2:22 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Serge, там передаются в качестве параметров размеры и указатель на изображение(источник и он же приёмник). Не получится просто так «прилепить» туда дополнительный кусок памяти.


Top
   
PostPosted: Mon Oct 07, 2013 4:01 pm 
Offline
User avatar

Joined: Mon Oct 27, 2008 10:10 pm
Posts: 813
0CodErr wrote:
Есть ещё такой вариант: применять фильтр не ко всему изображению, то есть начинать не с точки (0; 0), а с точки (1; 1) и заканчивать точкой (Width-2; Height-2), а не точкой (Width-1; Height-1). Мы не так много потеряем в качестве из-за каких-то двух строк.

Думаю можно на время работы функции поменять размер изображения (саму память для изображения не менять), а после окончания работы вернуть прежние размеры изображению.
0CodErr wrote:
Не получится просто так «прилепить» туда дополнительный кусок памяти.

Функция buf2d_resize меняет размер изображения, также добавляя или убирая память выделенную под изображение.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 99 posts ]  Go to page Previous 13 4 5 6 7 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited