Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.29;
Скачать: CL | DM;

Вниз

TFastDIB   Найти похожие ветки 

 
Pent   (2006-07-30 21:32) [0]

FastDIB - это набор модулей Delphi для работы с растровой графикой под Windows. Библиотека представляет класс TFastDIB (альтернатива TBitmap) и обширный набор процедур для работы с ним: загрузка из файлов и памяти, отрисовка на экране, сохранение, изменение размеров (ресэмплинг) и глубины цвета, графические эффекты, рисование графических примитивов. Все функции тщательно оптимизированы, что позволяет добиться высочайшего быстродействия. При этом библиотека является чисто программной (расчеты производятся центральным процессором, без использования ресурсов видеоускорителя).

C 2001 года проект был неактивен. Сейчас проект возрожден. Отныне он располагается на http://sourceforge.net/projects/tfastdib.

Если у вас есть пожелания, предложения и прочие комментарии, пишите мне: cmr.Pent(a)gmail.com.


 
Pent   (2006-07-30 21:34) [1]

Парамонов А.В. aka cmr.Pent


 
DLag   (2006-07-31 01:12) [2]

Только вот нового ничего.
DIBUltra написана почти полностью на Асм-е, что даёт отличное быстродействие.
http://perso.magic.fr/sleon/


 
Sapersky   (2006-07-31 04:18) [3]

Ну и где признаки возрождения?
Даже существующие примеры от Gordy не выложены.


 
Pent   (2006-07-31 08:33) [4]


> Ну и где признаки возрождения?
> Даже существующие примеры от Gordy не выложены.

Все будет! Хотелось бы услышать, актуально ли создание документации и дальнейшее развитие модулей.


 
miek ©   (2006-07-31 09:05) [5]

В теории актуально, на практике уже никому не нужно. Все юзают глсцене или просто на канве рисуют:(


 
Pavia ©   (2006-07-31 16:59) [6]

По-моему более актуальным будет реализация этого дела на шейдерах.


 
antonn ©   (2006-07-31 18:12) [7]

miek ©   (31.07.06 9:05) [5]
или просто на канве рисуют:(

ну же, улыбнитесь, это ведь так прекрасно:)


 
Sapersky   (2006-08-01 00:22) [8]

актуально ли создание документации и дальнейшее развитие модулей.

Документация - не знаю, мне лично не нужна, хотя новички иногда жалуются что не хватает. Но тогда уж лучше не документация, а контекстная справка, вызываемая по F1.

Развитие - смотря в каком направлении. ИМХО, "не надо чинить то, что не сломалось", то есть кардинально переделывать существующие модули.

Добавлять новую функциональность - да. Например, мне бы пригодился оптимизированный под MMX Bilinear (сам пробовал, но получилось ещё медленнее чем в оригинале) и другие, более качественные методы resample (Spline, Lancros).

С другой стороны, когда выйдет Vista, которая всю графику рисует аппаратно, эти сверхоптимизированные функции окажутся не у дел - ну не догнать на процессоре ускоритель, хоть тресни. Можно, конечно, утешаться тем, что всех пользователей на новую ОС Мелкософт перетянет ещё нескоро...

У вас-то есть какие-то идеи по развитию?

или просто на канве рисуют:(
ну же, улыбнитесь, это ведь так прекрасно:)


Вообще-то и канвас, и TFastDIB ("чистый", без доп. модулей) - суть обёртки над GDI, только в первом случае вы получаете в довесок VCL. Так что мы улыбаемся :)


 
miek ©   (2006-08-01 08:52) [9]

>ну не догнать на процессоре ускоритель, хоть тресни
В играх не догнать. В простых задачах - все наоборот.


 
Pent   (2006-08-01 09:09) [10]

Sapersky, спасибо за развернутый ответ.

> "не надо чинить то, что не сломалось"

Согласен полностью.

> контекстная справка, вызываемая по F1

Не подскажите удобную бесплатную программу для решения этой задачи? Никогда раньше не занимался этим, но готов освоить.

> другие, более качественные методы resample (Spline, Lancros)

Будет в ближайшем релизе. Преимущество в скорости над SmoothResize из GraphicEx - в полтора раза :-p


 
Sapersky   (2006-08-03 04:53) [11]

>ну не догнать на процессоре ускоритель, хоть тресни
В играх не догнать. В простых задачах - все наоборот.


Ну вот простая задача - тот же ресэмплинг с фильтрацией. Билинейную фильтрацию через DDraw"шный Blt может делать почти любой ускоритель - в десятки раз быстрее программных методов.
Сейчас это мало кто использует, из-за сопутствующих проблем (битмап нужно перегонять в видеопамять, что может быть медленно) и ограничений (вывод только на экран) - но в Висте их грозятся устранить. А вписанная в требования ОС шейдерная видеокарта позволит реализовать более продвинутые методы фильтрации.

> контекстная справка, вызываемая по F1
Не подскажете удобную бесплатную программу для решения этой задачи?


Не знаю, тоже никогда не занимался.
Может быть, будет достаточно и комментариев в заголовках особо заковыристых функций.

> другие, более качественные методы resample (Spline, Lancros)
Будет в ближайшем релизе.


Что ещё планируется в ближайшем релизе?

У меня есть кое-какие наработки - генерация текстур, морфологические фильтры, более продвинутый FastFiles. Если соберусь привести их в порядок - поделюсь.


 
miek ©   (2006-08-03 08:07) [12]

>Ну вот простая задача - тот же ресэмплинг с фильтрацией
Я имел в виду более простые: "создать спрайт в памяти, нарисовать на нем hellp world, вывести на форму поверх кнопки".


 
Pent   (2006-08-03 08:32) [13]


> У меня есть кое-какие наработки - генерация текстур, морфологические
> фильтры, более продвинутый FastFiles. Если соберусь привести
> их в порядок - поделюсь.
>

Буду рад посмотреть.. cmr.Pent(a)gmail.com.. А так из первоочередных задач - красивый и быстрый (без копирования памяти) метод преобразования из TBitmap и обратно.


 
Pent   (2006-08-03 10:27) [14]

FastLIB v3.9 - добавлена процедура "качественного" ресэмплинга - SmoothResize (пока только для 24 бит).
http://sourceforge.net/projects/tfastdib


 
Sapersky   (2006-08-03 13:06) [15]

>Ну вот простая задача - тот же ресэмплинг с фильтрацией
Я имел в виду более простые: "создать спрайт в памяти, нарисовать на нем hellp world, вывести на форму поверх кнопки".


ИМХО, в ТАКИХ задачах о производительности вообще смешно говорить...
Кстати. Вы (хотя, вроде, мы на "ты"? не помню уже :)) будешь не против, если в FastLIB будут включены конвертированные функции попиксельного альфа-блендинга и гаммы из SpriteUtils (с указанием копирайтов)?

А так из первоочередных задач - красивый и быстрый (без копирования памяти) метод преобразования из TBitmap и обратно.

А вы, батенька, про SetInterface и не в курсе?

function Bitmap2FDIB(Src : TBitmap): TFastDIB;
Var n, c : Integer;
   b : Byte;
Const
 BitCounts: array [pf1Bit..pf32Bit] of Byte = (1,4,8,15,16,24,32);
begin
Result := nil;
If (Src.Width = 0) or (Src.Height = 0) then Exit;
If not (Src.PixelFormat in [pf1Bit..pf32Bit]) then
 Src.PixelFormat := pf24bit;

Result := TFastDIB.Create;
Result.SetInterface(Src.ScanLine[Src.Height - 1], Src.Width, Src.Height,
                   BitCounts[Src.PixelFormat], 0, 0, 0);
If Result.Bpp <= 8 then begin
 c := GetPaletteEntries(Src.Palette, 0, 256, Result.Colors[0]);
 For n:=0 to c-1 do With Result do begin
   b := Colors[n].r; Colors[n].r := Colors[n].b; Colors[n].b := b;
 end;
 Result.UpdateColors;
end;
end;

Никакие GDI-операции к получившемуся FastDIB применять нельзя; можно только те, которые работают непосредственно с памятью. Нельзя изменять (а тем более уничтожать) TBitmap, пока идёт работа с FastDIB.
Можно копировать Handle (HBITMAP) - тогда наоборот, использовать только GDI.
Перевод из FastDIB в TBitmap - только копированием Handle, см. демку BumpMap.
Только просьба вынести подобные функции в отдельный модуль, дабы соблюсти невинность FastDIB"овского Uses.

Ещё пожелание: функция качественного преобразования глубины цвета в 8 бит (существующие функции To8_XX генерировать палитру толком не умеют). Если я правильно понял, FastQuant.pas из папки AlphaImg - это оно и есть, нужно только конвертировать под последнюю версию FastDIB.


 
Sapersky   (2006-08-03 13:54) [16]

Вах, дарагой! Кто вас научил проверять свойство Size?
А если я использую SetSubset? Size = 0, но FDIB вполне себе "живой". Проверяйте Width/Height.
При обращении к полям записи-указателя ставить "^" не обязательно.

"Красоту" в FastDIB.pas наводить не стоит, у всех о ней свои понятия, и если каждый разработчик будет переделывать под свои вкусы...

А так из первоочередных задач - красивый и быстрый (без копирования памяти) метод преобразования из TBitmap и обратно.

Э, кстати. А зачем вообще использовать TBitmap?
Я о нём уже почти забыл, как о страшном сне :)


 
Pent   (2006-08-03 15:00) [17]


> Вах, дарагой! Кто вас научил проверять свойство Size?
> А если я использую SetSubset? Size = 0, но FDIB вполне себе
> "живой". Проверяйте Width/Height.

Век живи - век учись, однако.

> Э, кстати. А зачем вообще использовать TBitmap?

Многие библиотеки ориентированы на TBitmap. Например, GraphicEx. Полностью ее переводить на FastDIB как-то не хочется. К тому же, что важнее, TBitmap есть стандарт, и новые библиотеки скорее всего будут также рассчитаны на него. Ну и хочется уметь кидать FastDIB на TImage.

Короче, хочется использовать наработанный код для TBitmap и FastDIB в одном приложении.


 
Jeer ©   (2006-08-04 10:56) [18]


> Перевод из FastDIB в TBitmap - только копированием Handle,
>  см. демку BumpMap.


Что сразу порождает, например, проблему "паразитного" преобразования, занимающего по времени до 10 ms при размерах 1024x768.

Если же хочется получить FPS = 50, то на все про все остается тоже 10 ms.


 
Sapersky   (2006-08-05 10:54) [19]

Не знаю, у меня, видимо, ничего не преобразовывается - получается 0.04 мс.

function FDIB2Bitmap(Src : TFastDIB): TBitmap;
begin
 Result := TBitmap.Create;
 Src.FreeHandle := False;
 Result.Handle := Src.Handle;
end;

Даже последующие обращения к TBitmap.Scanline оказываются вполне допустимы, т.к. TBitmap.SetHandle получает через GetObject адрес битмапа в памяти.

Но вообще TBitmap - весьма труднопредсказуемая зараза. Если у вас что-то делается в реальном времени, лучше его выкинуть сразу.
TImage - тем более.


 
miek ©   (2006-08-07 15:18) [20]

>Кстати. Вы (хотя, вроде, мы на "ты"? не помню уже :)) будешь не против, если в FastLIB будут включены конвертированные функции попиксельного альфа-блендинга и гаммы из SpriteUtils (с указанием копирайтов)?

Совершенно не против. Только они у меня под P-III оптимизированы, на P-IV+ нужно бы другие брать (или мои MMX-варанты).

А кстати - зачем их конвертировать, если поддержка FastDIB у меня уже есть? Создаешь псевдо-спрайт поверх своего TFastDIB(так, кажется, он назывался) и делаешь с ним все, что угодно.


 
Pent   (2006-08-15 00:09) [21]

Вышел FastDIB v3.9.1: добавлена поддержка конвертации из TBitmap/TGraphic и обратно (http://sourceforge.net/projects/tfastdib).


 
Pavia ©   (2006-08-15 03:39) [22]

Тут посмотрел библеотеку есть желание помочь. Есть предложение добавить рисование элипса и окружности.
А вобще есть предложение переделать движок так, что бы при запуски(или первом обращении) программы он сам гинерировал различные процедуры.
Может стоит добавить возможность рисование фигур не только MOV
но и XOR, OR, AND, NOT, ADD, ADDM (добавление с насыщением).


 
Sapersky   (2006-08-15 04:20) [23]

Вышел FastDIB v3.9.1
Что за махинации с Assign? Уничтожение битмапа, с которого всё копируется - трюк, может быть, довольно сомнительный, но оно работало, например, в FConvert.ConvertTo. А сейчас как будет работать?
Я же говорил - не надо чинить что не сломалось.


 
Pent   (2006-08-15 10:14) [24]

Oops, видимо не тот файл залил, сорри.


 
Pent   (2006-08-15 11:18) [25]

Перезалил файл.. Все-таки решил не очищать источник в Assign, а исправить FConvert.ConvertTo/ConvertToEx - так пожалуй будет более правильно.

> Есть предложение добавить рисование эллипса и окружности.
В смысле вручную? Через GDI можно и сейчас. А так, если готов написать грамотные процедуры рисования сглаженной линии/окружности, я буду очень рад!

> А вобще есть предложение переделать движок так, что бы при
> запуски(или первом обращении) программы он сам гинерировал
> различные процедуры.
Не понял, объясни.

> Может стоит добавить возможность рисование фигур не только
> MOV, но и XOR, OR, AND, NOT, ADD, ADDM (добавление с насыщением).
Опять же, если поможешь, будет очень классно.
Но скажу сразу: если тебе в одной-единственной программе нужно реализовать такую функциональность, возможно более привлекательным и оправданным вариантом будет использование не FastDIB, а, например g32. Все-таки время не стоит на месте, и с 2001 года появились другие, по многим параметрам превосходящие FastDIB графические библиотеки.
Однако если есть именно желание разобраться с основами 2D-графики, то FastDIB - это самое оно.


 
Sapersky   (2006-08-16 15:46) [26]

Все-таки решил не очищать источник в Assign, а исправить FConvert.ConvertTo/ConvertToEx - так пожалуй будет более правильно.

Во-первых, это большие проблемы для тех, кто использует Assign в своих программах, но не читает Notes на sourceforge. Даже если писать все изменения в заголовках модулей, как это делают, например, в GLScene - не ожидающий подлянки человек может и не обратить внимание.

Во-вторых, неудобно. Теперь перед уничтожением битмапа - источника Assign нужно проделать кучу телодвижений, которые раньше делались автоматически.

В-третьих, к тому же и "неправильно". Изменение полей объекта извне (и необходимость этого изменения) - ИМХО, куда больший грех, чем отличие в функциональности от VCL. Причём и отличие фактически никуда не делось, а только приняло гораздо более неприятную форму (необходимость помнить о телодвижениях и воспроизводить их).


 
Pent   (2006-08-16 22:54) [27]

Хм.. С первым пунктом частично согласен, но на сайте доступна и старая версия, так что выбор за программистом. Я все-таки уверен, что Assign должен работать как TBitmap.Assign - то есть создавать ссылку, при этом сохраняя "живым" и источник. Конфликт между совместимостью и прогрессом неизбежен.

Пункты 2-3. Сейчас все работает следующим образом: при вызове Dst.Free очищается и источник, и ссылка (логично). Вот при Src.Free действительно происходит ерунда. Может, добавить функцию Release, при этом убрав из Assign
Bmp.FreeDC:=False;
Bmp.FreeBits:=False;
Bmp.FreeHandle:=False;
?
Случай, когда надо именно перебросить все поля в другой объект, является весьма специальным. Я бы в обычной ситуации просто копировал указатель:
Dst.Free;
Dst:=Src;


Я думаю, надо еще посоветоваться с "боссом" (gordy). В любом случае, спасибо за комментарий. Приятно обсудить что-либо с понимающим человеком.


 
Sapersky   (2006-08-17 03:37) [28]

Я все-таки уверен, что Assign должен работать как TBitmap.Assign - то есть создавать ссылку, при этом сохраняя "живым" и источник. Конфликт между совместимостью и прогрессом неизбежен.

Не вижу в данном случае никакого прогресса. Зачем делать из TFastDIB точную копию TBitmap?

Вот есть библиотека KOL, предоставляющая ту же функциональность, что и VCL, но при этом имеющая значительные отличия от VCL. И ничего, люди пользуются, многим даже нравится :)


 
miek ©   (2006-08-18 08:32) [29]

>Может стоит добавить возможность рисование фигур не только MOV
но и XOR, OR, AND, NOT, ADD, ADDM (добавление с насыщением).

Стремление людей переизобретать колесо, велосипед и зубную щетку неистребимо.



Страницы: 1 вся ветка

Текущий архив: 2007.04.29;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.03 c
2-1176104753
Alex_C
2007-04-09 11:45
2007.04.29
Почему HWND_BROADCAST сообщение приходит 2 раза?


15-1175513137
IGray
2007-04-02 15:25
2007.04.29
Как послать файл с компа на сотик через USB-IrDA?


2-1176187913
=Teddy=
2007-04-10 10:51
2007.04.29
Как в TreeView узнать индекс выбранного узла ?


1-1172823834
Mikhail83
2007-03-02 11:23
2007.04.29
Пролистывание в TChart


3-1170572327
uka
2007-02-04 09:58
2007.04.29
Отображение базы данных в TreeView. Приведенный пример ...