Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

рендеринг кучи текста [D5, D7, WinXP]


Страницы:   1 2

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]
> Вопросы есть. Один вопрос.

я предвкушал этот вопрос =)
знаю. технология бредовая в корне. но почему-то тогда я сделал это именно так.
суть в том чтоб отрендерить текст на битмап и вывести нужный кусок битмапа
ширина битмапа может варьироваться.
строки переносятся
из-за этого может варьироваться и высота.
можно. конечно определять её заранее
(чё-т я раньше об этом не подумал)
но реализовал я это именно вот так
через задницу

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

или всё-таки стоит углубиться и выводить только видимый текст?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо