Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
76
Добавлен:
02.04.2015
Размер:
8.79 Mб
Скачать
      1. Отсечение

Как уже обсуждалось выше, в функции рисования виджета возможно рисование за пределами пространства необработанного виджета, но так делать нехорошо:

  • Это может загадить остальную часть интерфейса Вашего приложения

  • Если необработанное рисование вне пространства необработанного виджета окажется повреждённым, но сам необработанный виджет – нет, функция прорисовки необработанного виджета не будет вызвана, и повреждения не будут исправлены.

Можно написать функцию прорисовки, так чтобы это отсечение не было нужным, но это может сделать Ваш программный код более запутанным. Например, если Вы пытаетесь писать текст, который выходит за пределы холста необработанного виджета, Вам может понадобиться прорисовать части букв. Вам также надо иметь в виду, что произойдёт, если пользователь изменит размер необработанного виджета. Намного легче использовать функцию PtClipAdd(), чтобы установить область обрезки по холсту необработанного виджета и позволить графическому драйверу ограничивать прорисовку:

PtClipArea(widget, &raw_canvas);

Перед тем как выйти из функции прорисовки, вызовите функцию PtClipRemove(), чтобы отключить область обрезки:

PtClipRemove();

      1. Использование повреждённых черепиц (tiles)

Если выполнение Вашей функции прорисовки необработанного виджета занимает много времени, Вы можете не захотеть перерисовать весь холст, когда повреждена только его малая часть. Вы можете ускорить восстановление, используя аргумент damage функции прорисовки [Прим. пер. – Да и зрительно это будет получше...]. Аргумент damage является указателем на связанный список структур PhTile_t (см. "Справочник библиотечных функций Photon'а"), каждая из которых включает такие члены:

rect Структура PhRect_t, определяющая повреждённую область

next Указатель на следующую черепицу в списке.

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

Если в связанном списке находится более одной черепицы, первая из них покрывает всю область, покрываемую остальными. Можно или использовать первую черепицу и игнорировать остальные, или игнорировать первую и использовать остальные:

void rawDrawFunction (PtWidget_t *widget, PhTile_t *damage) {

if (damage->next != NULL) {

/* Если имеется больше одной черепицы, пропустить первую. */

damage = damage->next;

}

while (damage != NULL) {

/* Проверка damage, чтобы посмотреть, надо ли делать какую-то прорисовку:

damage->rect.ul.x, damage->rect.ul.y,

damage->rect.lr.x, damage->rect.lr.y

*/

...

damage = damage->next; /* Переход к следующей черепице. */

}}

Следующие функции (описанные в "Справочнике библиотечных функций Photon'а") работают с черепицами:

PhAddMergeTiles()

Объединение двух списков черепиц, исключающее наложение

PhClipTilings()

Обрезка одного списка черепиц другим

PhCoalesceTiles()

Комбинирование списка черепиц

PhCopyTiles()

Копирование списка черепиц

PhDeTranslateTiles()

Вычитание смещений по x и y из вершин списка черепиц

PhFreeTiles()

Возвращение списка черепиц во внутренний пул черепиц

PhGetTile()

Получение черепицы из внутреннего пула черепиц

PhIntersectTilings()

Определение пересечения двух списков черепиц

PhMergeTiles()

Удаление всех наложений из списка черепиц

PhRectsToTiles()

Создание списка черепиц из массива прямоугольников

PhSortTiles() PhTilesToRects ()

Сортировка списка черепиц

Создание массива прямоугольников из списка черепиц

PhTranslateTiles()

Добавление смещений по x и y к вершинам списка черепиц

Соседние файлы в папке Литература_1