![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
рендеринг кучи текста [D5, D7, WinXP]
tButton © (2006-08-24 10:08:00)есть много-много текста с форматированием а-ля ХТМЛ
разобрать его для меня не проблема. проблема быстро его отрендерить
сейчас набросал вариант с использованием банального TextOut
и в принципе он подходит когда строк <100
(каждая рендерится сама по себе)
можно, конечно реализовать иначе (через попиксельный вывод. есть чем вывести со скоростью >2Mpx/s), но
помнится мне что я и прежде (года два-три) назад сталкивался с подобной проблемой
и мне здесь наглядно объяснили, что вся беда в том что каждый раз DC блокируется/разблокируется, на что и тратится уйма времени.
в итоге показали мне решение проблемы через АПИшные хитрости
к сожалению, за давностью лет решение протерялось
хотелось бы найти его снова =)
PS
как-то же memo выводит уйму текста без тормозов?
Ketmar (2006-08-25 09:50:00) [1]> [35] tButton © (25.08.06 07:18)
нет. всё-таки не выспался. %-)
tButton (2006-08-25 07:18:00) [2]а я вот пока надумал
делать параллельный лог уже с переносами
т.е. поскольку кегль и гарнитура шрифта не меняются
то можно сделать массивчик с шириной каждого символа и при таких событиях как изменение ширины (шрифта) или добавление строчки соответственно пересчитывать или обновлять лог с перенесёнными словами.
высота строки постоянная и зависит от размера шрифта
её можно запомнить однажды и затем в любой момент можно посчитать общую высоту перемножив высоту строки на количество строке в логе с переносами
таким же образом можно легко выявить строки для отрисовки.
Ketmar (2006-08-24 23:56:00) [3]сорри, с "y=-8".
Ketmar (2006-08-24 23:55:00) [4]> [32] tButton © (24.08.06 23:50)
я имел в виду -- умеет ли можифицировать строку до вывода. %-)
скролишь ты не только по строкам, но и по координатам. %-)
смотри: высота символа -- 8 пикселей.
начинаем со строки 0, y=0. высота строки 0 -- 24 пиксела (потому что её побило %-).
при скролле ставим: y=-8. проверяем, не ушла ли строка 0 полностью за экран. не ушла, очевидно. выводи всё опять, но уже с y=8.
повторяем, пока y не станет -24. после чего ясно, что строка 0 полностью уехала. делаем y := 0; и Inc(topLine).
повторяем всё с самого начала.
натурально, y можно менять и на 1 -- получишь попиксельный скроллинг. на алгоритм это не влияет.
tButton (2006-08-24 23:50:00) [5]я счас заплачу =)
и усну =)
а теперь серьёзно.
DrawTextEx() умеет вставлять переносы для этого есть DT_WORDBREAK
но вставляет он их при выводе
допустим первая строка у меня разбивается на три (при выводе) остальные идут по одной
я скроллю вниз на строку и вывожу со второй
но по факту я скроллю вниз на три
вот в чём заморочка
вот... пойду-ка я пожалуй действительно кимарну пару часиков =)
Ketmar (2006-08-24 23:31:00) [6]> [30] Fay © (24.08.06 23:29)
так я же не с издёвкой это советую. я вполне серьёзно.
Fay (2006-08-24 23:29:00) [7]2 Ketmar © (24.08.06 23:27) [27]
> слушай, выспись, а
Повежливей. Мы все очень любим и уважаем товарища TButton. 8)
Ketmar (2006-08-24 23:28:00) [8]ещё полезно делать "кэш размеров", чтобы не перевычислять каждый раз размеры для строк, которые не изменились. но до этого, думаю, и сам догадаешься. %-)
Ketmar (2006-08-24 23:27:00) [9]"построчно" -- это значит "сдвигать строго на высоту символа".
Ketmar (2006-08-24 23:27:00) [10]совершенно не помню, умеет ли DrawTextEx() вставлять в нужные места переносы при вычислении размера. и проверять лень. как вариант -- делать скроллинг таки построчно. строки с переносом будут просто выше остальных, их можно начинать рисовать с отрицательным y.
опять же, DrawTextEx() никак не мешает делать попиксельный скроллинг.
слушай, выспись, а? гарантирую, после хорошего сна многое прояснится. проверено на личном опыте. %-)
Fay (2006-08-24 23:24:00) [11]2 tButton © (24.08.06 23:20) [25]
Идеальнай случай : фонт один, непропорциональный и одним кеглем! (как в IDE Delphi)
У тебя не так?...
tButton (2006-08-24 23:20:00) [12]ну хз. просто сейчас скроллинг попиксельный
как мнимум - придёт переделать в построчный
причём если строка разбивается на две и более
то скроллить нужно будет всё равно только на одну
разбираться надо в определении с какой строки по какую рендерить
Ketmar (2006-08-24 23:09:00) [13]> [22] tButton © (24.08.06 22:59)
а что там разбираться? возвратят тебе в rect'е размеры, и всё.
Fay (2006-08-24 23:03:00) [14]tButton © (24.08.06 22:59) [22]
Блин... Всё то же самое, только без увеличения битмапа!
8)
tButton (2006-08-24 22:59:00) [15]In either case, DrawTextEx returns the heightof the formatted text, but does not drawthe text.
т.е. пройтись по тексту с DT_CALCREC
просуммировать.
и тут меня заступорило
но в принципе разобраться можно
надо только кое-что поменять
Fay (2006-08-24 22:55:00) [16]Битмапы не резиновые
Fay (2006-08-24 22:55:00) [17]> или всё-таки стоит углубиться и выводить только видимый текст?
Совершенно верно.
Fay (2006-08-24 22:54:00) [18]DT_CALCRECT не ку?
tButton (2006-08-24 22:50:00) [19]
> Ketmar © (24.08.06 22:39) [16]
шесть утра =) идти куда-то ломает =)
завтра на ра... сегодня на работу а я ещё глаз не сомкнул =)
tButton (2006-08-24 22:48:00) [20]
> в "Интересное о себе" раньше было другое...
раньше там был сорц =)
потом его удалили =)
> Ketmar © (24.08.06 10:26) [1]
> DrawTextEx()?
читаю. проникаюсь.
> Fay © (24.08.06 22:37) [15]
> tButton © (24.08.06 22:36) [14]
> Вопросы есть. Один вопрос.
я предвкушал этот вопрос =)
знаю. технология бредовая в корне. но почему-то тогда я сделал это именно так.
суть в том чтоб отрендерить текст на битмап и вывести нужный кусок битмапа
ширина битмапа может варьироваться.
строки переносятся
из-за этого может варьироваться и высота.
можно. конечно определять её заранее
(чё-т я раньше об этом не подумал)
но реализовал я это именно вот так
через задницу
ну, положим, я предварительно рассчитаю высоту и буду выводить текст посимвольно. сколько я смогу вывести за незамтеное глазу время?
или всё-таки стоит углубиться и выводить только видимый текст?