Форум программистов, компьютерный форум CyberForum.ru

Алгоритмы отображения большого текста на экране - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
[progeR]
6 / 7 / 0
Регистрация: 20.08.2011
Сообщений: 590
20.08.2011, 15:17     Алгоритмы отображения большого текста на экране #1
Привет всем!
Может быть кто знает, есть какие-нибудь алгоритмы, позволяющие быстро отображать тексты больших размеров?
Дело в том, что пишу читалку fb2, и там нужно выводить отпарсиный текст на экран (текст парсится в html формат). Тексты разные - например Л.Н. Толстой - Война и мир. Книга большая и если в лоб делать, то процесс отображения может занимать много времени. Уже намучился с этим, не знаю, что делать. Т.к. это книга - значит текст форматированный (кстати может содержать картинки), и алгоритм, вроде подсчета строк, которые могут уместиться на экран, вроде и не применишь.
Подобные ридеры есть - например CoolReader. Отображает текст быстро. Но где там найти сей алгоритм - не знаю. Исходники смотрел - черт ногу сломит с их этим кодом... В общем, рассчитываю на вашу помощь.

Ps если что, читалку делаю на Qt.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2011, 15:17     Алгоритмы отображения большого текста на экране
Посмотрите здесь:

Листание текста на экране C++
Объявление большого массива в C++ C++
1% от большого числа C++
SDL Отображение текста на экране C++
C++ Деление большого числа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
агерон
 Аватар для агерон
265 / 264 / 33
Регистрация: 12.10.2009
Сообщений: 1,031
20.08.2011, 16:15     Алгоритмы отображения большого текста на экране #2
для обработки больших файлов существует технология маппинг файлов. но как я понимаю проблема не в объеме файла а в скорости его обработки т. к. формат fb2 является XML подобным форматом, поэтому попробуй подключить парсер XML типа SAX
[progeR]
6 / 7 / 0
Регистрация: 20.08.2011
Сообщений: 590
20.08.2011, 16:22  [ТС]     Алгоритмы отображения большого текста на экране #3
Нет, не в объеме. Обычное художественное произведение весит от силы 1 МБ. Так сам парсер я написал, и работает он очень быстро, обработка файла - ежесекундно. А вот как все это вывести на экран? Вот проблема. Вот взять Антуан Де Сент-Экзюпери: Цитадель (~1,66МБ). Парсит, наверное, десяток миллисекунд, а выводит на экран ~3-4 секунды.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
20.08.2011, 16:29     Алгоритмы отображения большого текста на экране #4
Цитата Сообщение от [progeR
;1927200]а выводит на экран ~3-4 секунды.
А ты выводи не весь текст, а постранично (поэкранно).
[progeR]
6 / 7 / 0
Регистрация: 20.08.2011
Сообщений: 590
20.08.2011, 16:43  [ТС]     Алгоритмы отображения большого текста на экране #5
Ну это понятно. А если хочу со скроллингом сделать? Чтобы прокрутить можно было любой кусок.
Например FireFox тоже умеет читать эти книги. И там сделано с прокруткой. И выводится все тоже очень быстро.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
20.08.2011, 16:49     Алгоритмы отображения большого текста на экране #6
Потому что выводится постранично. Не стоит думать, что в ридерах рисуется сразу весь текст, а потом прокручивается. Это не так. Скролер лишь указывает, какую часть текста показать.
[progeR]
6 / 7 / 0
Регистрация: 20.08.2011
Сообщений: 590
20.08.2011, 17:02  [ТС]     Алгоритмы отображения большого текста на экране #7
Тогда для скролбара нужно как рассчитать максимальное значение. В случае обычного текста сделать не сложно. А как для текста в html?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
20.08.2011, 17:16     Алгоритмы отображения большого текста на экране #8
Выполнить такой же обход дерева, как и при отрисовке, но не выполняя её, а только вычисляя размер. Хотя, в том же вконтакте, например, высота не вычисляется и скроллбар масштабируется в процессе прокрутки, т.е. если конец текста не достигнут и нужно отмотать, то к известной величине добавляется ещё чуток высоты следующего блока текста.
Но ведь в формате fb2 количество страниц известно? Тогда проблемы не должно быть.
[progeR]
6 / 7 / 0
Регистрация: 20.08.2011
Сообщений: 590
20.08.2011, 17:31  [ТС]     Алгоритмы отображения большого текста на экране #9
Нет, не известно кол-во страниц. И это количество зависит от используемого шрифта, его размера, наличия картинок. А масштабируемый скролбар - не вариант, так никто не делает.

А про обход дерева - это хорошо, вот только в Qt ничего подобного не видел. Это все скрыто в том самом методе, который выводит html текст на экран...
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
20.08.2011, 18:55     Алгоритмы отображения большого текста на экране #10
Цитата Сообщение от [progeR
;1927339]А масштабируемый скролбар - не вариант, так никто не делает.
ВинДежавю так делает. Высота скроллбара уточняется в процессе...
В общем, у тебя и выбора-то особо нет. Либо рисовать всё (медленно), либо вычислять высоту всего (ты не знаешь как) либо делать примерно.
[progeR]
6 / 7 / 0
Регистрация: 20.08.2011
Сообщений: 590
20.08.2011, 19:07  [ТС]     Алгоритмы отображения большого текста на экране #11
И тем не менее все читалки вычисляют точно. Даже если текст html. Вот как CoolReader делает? Как веб-браузеры делают? Как Word делает?
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
20.08.2011, 20:54     Алгоритмы отображения большого текста на экране #12
FBReader точно делает странично. Как и отписали выше.
за основу берется начало отображаемого текста (смещение от начала), вычисляется размер страницы (шрифт, междустрочный интервал), из имеющейся инфы вычисляется количество страниц, и размер/положение скроллера. Ничего мудреного.
[progeR]
6 / 7 / 0
Регистрация: 20.08.2011
Сообщений: 590
21.08.2011, 00:11  [ТС]     Алгоритмы отображения большого текста на экране #13
А как узнать, сколько слов уместится на одной линии?
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
21.08.2011, 00:13     Алгоритмы отображения большого текста на экране #14
а что используется в качестве "рисовалки" текста?
[progeR]
6 / 7 / 0
Регистрация: 20.08.2011
Сообщений: 590
21.08.2011, 00:24  [ТС]     Алгоритмы отображения большого текста на экране #15
Текст у меня в конце концов получается html, поэтому в Qt использую QWebView.
Быть может, все вот это можно сделать непосредственно через html/css.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2011, 00:29     Алгоритмы отображения большого текста на экране
Еще ссылки по теме:

Факториал большого числа C++
Модуль большого числа C++
C++ Отображения на экране чисел от 10 до 0

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
21.08.2011, 00:29     Алгоритмы отображения большого текста на экране #16
ну значит надо копать в сторону определения метрик шрифта в Qt. Думаю можно копать в QFont

Либо посмотреть свойства QWebView, возможно у нее есть виртуальный режим при котором контент не полностью сразу загружается, а по мере прокрутки.
Yandex
Объявления
21.08.2011, 00:29     Алгоритмы отображения большого текста на экране
Ответ Создать тему
Опции темы

Текущее время: 19:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru