Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   *Теория*| храним форматируемый текст (http://forum.oszone.net/showthread.php?t=72648)

pva 09-10-2006 13:33 495392

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

BlackEric 09-10-2006 17:16 495479

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

ivank 09-10-2006 19:35 495511

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

hasherfrog 10-10-2006 10:14 495695

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

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

pva 10-10-2006 12:22 495741

Цель: разукрасить (как в 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 495744

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

pva 10-10-2006 12:51 495749

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

hasherfrog 10-10-2006 13:17 495756

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

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

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

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

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

pva 10-10-2006 14:07 495781

Спасибо, проверим :)


Время: 17:50.

Время: 17:50.
© OSzone.net 2001-