*Теория*| храним форматируемый текст

Ответить
Аватара пользователя
pva

*Теория*| храним форматируемый текст

Сообщение pva »

вопрос такой: как можно быстро и удобно держать в памяти строчку форматированного текста (для последующей многократной отрисовки на DC), Строчек много, желательно экономить память. Подскажите варианты, плз.. Примеры:

1. включать в строчку управляющие символы, напр.: void foo(int);

2. хранить отдельно текст и его форматирование с указателями на диапазон символов.

3. хранить текст как что-то вроде метафайла (примитивами)
Аватара пользователя
BlackEric

Re: *Теория*| храним форматируемый текст

Сообщение BlackEric »

Я бы выбрал первый вариант хранения. Список возможных тегов конечен и весьма не велик. Один раз написать библиотеку для отображения и дальше можно спокойно пользоваться.

Для более полного ответа нужно знать для чего это будет использоваться и с какой частотой будет изменяться текст.
Аватара пользователя
BlackEric

Re: *Теория*| храним форматируемый текст

Сообщение BlackEric »

pva

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

Re: *Теория*| храним форматируемый текст

Сообщение hasherfrog »

pva

Хранить "на каком" уровне?

Если Вы пишете, к примеру, "разукрашивальщик синтаксиса", то форматирование и текст хранятся отдельно.

Но если Вы уже имеете такой компонент, а важно лишь хранить сам текст "вообще", то... XML-лизация рулит в последнее время.



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

Re: *Теория*| храним форматируемый текст

Сообщение pva »

Цель: разукрасить (как в QT, Swing) текст на контролах. Например, в статус баре написать: Итого: 1 024,768 (цифра - жирным) или построить дерево классов/методов с подсветкой названий методов: void function(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

Re: *Теория*| храним форматируемый текст

Сообщение hasherfrog »

pva

Я имел в виду "посмотрите, как огранизован" :-) Коды открыты
Аватара пользователя
pva

Re: *Теория*| храним форматируемый текст

Сообщение pva »

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

Re: *Теория*| храним форматируемый текст

Сообщение hasherfrog »

>> Где можно коды посмотреть?



Можно скачать опен-сурс

У них сейчас как раз 4.2 вышла.

http://www.trolltech.com/developer/downloads/qt/windows


Для линукса - рядом



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



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



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

Вернуться в «Программирование и базы данных»