Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "Media";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.05 c
3-1170920919
iviom
2007-02-08 10:48
2007.04.29
ComboBox в DBGridEh


8-1155501773
Jimmy
2006-08-14 00:42
2007.04.29
Не работает большой Image


15-1175720351
Германн
2007-04-05 00:59
2007.04.29
Не долго музыка играла :(((


4-1164992757
BKV
2006-12-01 20:05
2007.04.29
Как определить настоящие пути смапированного диска?


2-1175792542
DelphiLexx
2007-04-05 21:02
2007.04.29
Как перехватить момент открытия PopupMenu





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский