PDA

Показать полную графическую версию : *Теория*| храним форматируемый текст


pva
09-10-2006, 13:33
вопрос такой: как можно быстро и удобно держать в памяти строчку форматированного текста (для последующей многократной отрисовки на DC), Строчек много, желательно экономить память. Подскажите варианты, плз.. Примеры:
1. включать в строчку управляющие символы, напр.: void <u>foo</u>(int);
2. хранить отдельно текст и его форматирование с указателями на диапазон символов.
3. хранить текст как что-то вроде метафайла (примитивами)

BlackEric
09-10-2006, 17:16
Я бы выбрал первый вариант хранения. Список возможных тегов конечен и весьма не велик. Один раз написать библиотеку для отображения и дальше можно спокойно пользоваться.
Для более полного ответа нужно знать для чего это будет использоваться и с какой частотой будет изменяться текст.

ivank
09-10-2006, 19:35
pva
Pango (отрисовщик gtk) применяет 1 и 2. То есть на вход ему можно подать текст с разметкой а-ля html, а он уже создаст внутри список атрибутов вида "символ с индексом x - символ с индексом y - атрибут такой-то". Либо можно дать неформатированный текст и самому задать список атрибутов. Отрисовывает соответственно по этому списку. Форматирование внутри строки неудобно по той причине, что при каждой отрисовке всё равно придётся парсить текст в аналог списка атрибутов. Так зачем делать одну и ту же работу дважды?

hasherfrog
10-10-2006, 10:14
pva
Хранить "на каком" уровне?
Если Вы пишете, к примеру, "разукрашивальщик синтаксиса", то форматирование и текст хранятся отдельно.
Но если Вы уже имеете такой компонент, а важно лишь хранить сам текст "вообще", то... XML-лизация рулит в последнее время.

Кстати. Посмотрите, если будет время и желание, QSyntaxHightlighter (кажется так) в QT >3.1

pva
10-10-2006, 12:22
Цель: разукрасить (как в QT, Swing) текст на контролах. Например, в статус баре написать: Итого: <b>1 024,768</b> (цифра - жирным) или построить дерево классов/методов с подсветкой названий методов: void <b>function</b>(arg_type) - чтобы было лучше видно, причём использовать один и тот же подход в обоих случаях. По поводу частоты изменения текста, всё-таки думаю, что текст будет меняться не часто (т.е. это не редактор с подсветкой), но часто отрисовываться. Количество таких "строчек" может достигать 10^6. Больше - вряд ли.

// для пояснения - пример варианта №1
class Graphics
{
HDC fhandle;
std::vector<struct format_t> fformats;
public:
void renderText(int x, int y, const std::wstring& s)
{
SetTextAlign(fhandle, TA_UPDATECP|TA_BASELINE);
MoveToEx(fhandle, x, y, 0);
const char* pc = s.c_str();

while(*pc)
{
if (pc[0]!=0x1b || pc[1]==0)
{
TextOut(fhandle, 0, 0, pc, 1);
++pc;
}
else
{
struct format_t& fmt(fformats.at(pc[1]-1));
SetTextColor(fhandle, fmt.color);
SelectObject(fhandle, fmt.hfont);
pc+=2;
}
}
}
}

...

void ListBox::paint(Graphics& g)
{
// fitems[0] = "void \x1b\2foo\x1b\1(arg_type)"
unsigned begin = firstVisibleItem();
unsigned end = lastVisibleItem();

end -= begin;
for(unsigned a=0; a<end; ++a)
{
g.renderText(0, (1+a)*itemHeight(), fitems[begin + a]);
}
}

... и по поводу QSyntaxHilighter: я думал сделать что-то типа ostream, с соответствующими манипуляторами, который форматирует текст в буфер. Затем этот буфер отдавать контролу на хранение в качетстве содержимого. Вопрос в оптимальном хранении данных в буфере (быстрая отрисовка и экономия памяти)

hasherfrog
10-10-2006, 12:26
pva
Я имел в виду "посмотрите, как огранизован" :-) Коды открыты

pva
10-10-2006, 12:51
Извиняюсь, стормозил. Где можно коды посмотреть? А ещё я не понял, как контрол в Qt 4.0 узнаёт, что на экране рисовать? Например QTreeView: ссылается на QAbstractItemModel, а дальше - не понятно..

hasherfrog
10-10-2006, 13:17
>> Где можно коды посмотреть?

Можно скачать опен-сурс
У них сейчас как раз 4.2 вышла.
http://www.trolltech.com/developer/downloads/qt/windows
Для линукса - рядом

Там \src\qt3support\text\q3syntaxhighlighter*.* AFAIK

>> А ещё я не понял, как контрол в Qt 4.0 узнаёт, что на экране рисовать?

Ух, это в двух словах не скажешь.

pva
10-10-2006, 14:07
Спасибо, проверим :)




© OSzone.net 2001-2012