Главная » Просмотр файлов » Руководство программиста в Photon

Руководство программиста в Photon (1037671), страница 50

Файл №1037671 Руководство программиста в Photon (Раздаточные материалы) 50 страницаРуководство программиста в Photon (1037671) страница 502017-12-25СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 50)

/* Стандартные хеадеры */

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

/* Инструментальные хеадеры */

#include <Ph.h>

#include <Pt.h>

#include <Ap.h>

/* Локальные хеадеры */

#include "globals.h"

#include "abimport.h"

#include "proto.h"

int display_image( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ) {

/* предотвращает предупреждения (варнинги) об отсутствии ссылок */

widget = widget, apinfo = apinfo, cbinfo = cbinfo;

cur_image++;

if (cur_image >= num_images) cur_image=0;

PtSetResource (ABW_base_image, Pt_ARG_LABEL_IMAGE, images[cur_image], 0 );

PtFlush ();

return( Pt_CONTINUE );

}

ABW_base_image – это имя виджета PtLabel, в котором появляется мультипликация.

Исключение мерцания в мультипликации

Имеется два способа избежать мерцания в мультипликации:

  • Создать PtOSContainer (некий контейнер внеэкранного контекста) и сделать его родителем всех виджетов в области, где будет выполняться мультипликация

или

  • Использовать функции контекстной памяти PmMem...(), чтобы собирать образ в памяти и отображать его по завершении сборки.

PtOSContainer

Когда Вы выполняете мультипликацию в виджете, родителем которого является контейнер внеэкранного контекста, PtOSContainer формирует изображение потока прорисовки во внеэкранной видеопамяти, пользуясь преимуществами всех поддерживаемых графическим драйвером возможностей аппаратного ускорения. Графическое аппаратное обеспечение затем может блитировать (т.е. копировать большой массив памяти) образ непосредственно на экран, в результате чего получаются немерцающие виджеты и/или мультипликация с отсутствием эффекта мерцания.

 Виджет типа PtRaw (так же, как любой другой виджет) может быть порождённым от PtOSContainer. Это означает, что Вы можете получить немерцающую мультипликацию даже тогда, когда используются примитивы рисования Photon'а.

Функции контекста памяти

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

PmMemCreateMC()

Создать контекст памяти

PmMemFlush()

Сбросить контекст памяти в его побитовый образ

PmMemReleaseMC()

Освободить контекст памяти

PmMemSetChunkSize()

Установить величину приращения при увеличении буфера прорисовки, принадлежащего контексту памяти

PmMemSetMaxBufSize()

Установить максимальный размер буфера прорисовки, принадлежащего контексту памяти

PmMemSetType()

Установить тип контекста памяти

PmMemStart()

Сделать активным контекст памяти

PmMemStop()

Деактивировать контекст памяти

Начните с создания контекста памяти:

PmMemoryContext_t * PmMemCreateMC(

PhImage_t *image,

PhDim_t *dim,

PhPoint_t *translation );

В структуре image должны быть заданы по меньшей мере члены type и size. Буфер данных образа является необязательным, но если Вы хотите иметь его в памяти совместного доступа, Вы должны его обеспечить. Член type должен иметь значение Pg_IMAGE_DIRECT_888 или Pg_IMAGE_PALETTE_BYTE.

Сразу после того, как Вы создали контекст памяти:

  • Вызовите функцию PmMemStart(), чтобы установить контекст текущей прорисовки в контекст памяти

  • Вызовите функцию PmMemStop(), когда закончите Вашу прорисовку, чтобы вернуться в принимаемый по умолчанию контекст прорисовки

  • Вызовите функцию PmMemFlush(), чтобы получить результирующий образ.

Козда Вам больше не нужен контекст памяти, вызовите функцию PmMemReleaseMC().

Режим рисования с прямым доступом

В обычном (не "напрямую") режиме, приложение отсылает запросы на прорисовку в менеджер Photon'а. Графический драйвер блокируется менеджером Photon'а.

Связь в обычном (не прямого доступа) режиме

Когда приложение входит в режим прямого доступа, оно требует, чтобы графический драйвер получал поток данных прорисовки и служебные сообщения напрямую от приложения, а не от менеджера Photon'а. Драйвер блокируется на получении данных от приложения, которое теперь ответственно за то, чтобы указывать драйверу, что делать.

Связь в режиме прямого доступа

Когда приложение входит в режим рисования с прямым доступом, приложение получает полный контроль над дисплеем, так что никакие другие приложения графическим драйвером не обслуживаются. Зона графического драйвера также больше не чувствительна к событиям рисования (так что менеджер Photon'а аннулирует все запросы других приложений к службам построения изображения этого драйвера). Другим достоинством этого режима является то, что графические услуги больше не пересылаются через пространтство событий Photon'а, что улучшает производительность. Недостатком этого режима является то, что приложения, ожидающее захвата событий рисования, не могут записать визуальное представление приложения.

В целях удобства работы создан новый тип контекста PdDirectContext_t. Этот контекст, будучи активирован, становится контекстом по умолчанию для приложения, так что в этом режиме корректно работают вызовы всех остальных функций Photon'а Pg*.

 В этом режиме начальной точкой отсчёта для всех операций рисования является верхний левый угол экрана, поскольку запросы больше не обрезаются и не преобразуются пространством событий Photon'а. Ваше приложение, если необходимо, по-прежнему может преобразовывать и обрезать события, вызывая функции PgSetTranslation() и PgSetClipping().

Следующие функции имеют дело с режимом рисования с прямым доступом:

PdCreateDirectContext()

Создать контекст режима рисования с прямым доступом

PdDirectStart()

Войти в режим рисования с прямым доступом

PdDirectStop()

Выйти из режима рисования с прямым доступом

PdGetDevices()

Получить идентификаторы областей (region IDs) для доступных в текущий момент устройств вывода изображения

PdReleaseDirectContext()

Выйти из режима рисования с прямым доступом и освободить контекст режима рисования с прямым доступом

PdSetTargetDevice()

Установить целевое устройство

PdWaitVSync()

Ожидать вертикальную синхронизацию

Вот несколько соображений, которые надо иметь в виду:

  • Когда Вы входите или выходите из режима рисования с прямым доступом, все контексты видеопамяти (за исключением дисплея) на стороне драйвера уничтожаются (драйвер генерирует событие OSINFO, так что приложение уведомляется об этом и может реинициализировать какие-либо контексты видеопамяти). Это включает видеопамять, использовавшуюся структурами PdOffscreenContext_t и всё то, что использовалось видеоверлеем программного интерфейса приложения.

  • Когда Вы выходите из режима рисования с прямым доступом, на драйвер отсылается некое уведомительное сообщение, так что все другие приложения перерисовывают себя.

  • Когда Вы находитесь в режиме рисования с прямым доступом, область графического драйвера больше не чувствительна к событиям рисования (так что менеджер Photon'а не накапливает огромный список событий рисования, обрабатываемых из других приложений).

  • Если у Вас включено автоматическое двойное буферирование (например,
    devg-banshee -B...), оно отключается, пока Вы пребываете в режиме рисования с прямым доступом (чтобы позволить приложению самому управлять двойным буферированием). [ Хотя здесь и множественное число: "applicationS", очевидно, что только одному приложению. Прим. пер]

Пример

Вот как получить адрес какого-либо контекста видео-памяти (включая дисплей, который можно также рассматривать как видеопамять). Если Вы создали контекст прямого доступа, вызвав функцию PdCreateDirectContext(), и затем вошли в режим прямого доступа, вызвав функцию PdDirectStart(), Ваше приложение "присваивает" графический драйвер (PgFlush() проходит непосредственно на видеодрайвер, минуя сервер Photon'а).

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

/* Создание контекста прямого доступа */

direct_context = PdCreateDirectContext();

/* Запуск режима прямого доступа */

PdDirectStart(direct_context);

/* Получение основного дисплея */

primary_display = PdCreateOffscreenContext( 0, 0, 0, Pg_OSC_MAIN_DISPLAY);

/* Получение указателя на дисплей */

vidptr = PdGetOffscreenContextPtr(primary_display);

/* Убеждаемся, что драйвер Photon'а ничего не делает

(этого не может быть в данной точке, но мы просто убеждаемся, что

у нас нет продвинутости движка прорисовки видеокарты)

(??? it shouldn't be at this point but this is just to

be sure that we haven't gotten ahead of the video card's draw engine). */

PgWaitHWIdle();

/* Делаем то, что мы делаем в памяти */

Do_something(vidptr);

/* Выход из режима прямого доступа, и удаление контекста прямого доступа

(альтернативой может быть функция PdDirectStop(),

если мы не хотим уничтожать контекст*/

PdReleaseDirectContext(direct_mode);

Внеэкранная видеопамять

Эти вызовы программного интерфейса приложения позволяют Вам использовать остаточную (leftover) память видеокарты. Когда видеокарта находится в видеорежиме, это обычно остаток видеопамяти, который не используется областью дисплея. Эти области памяти могут использоваться для выполнения различных графических операций, хотя используются ещё акселератором видеокарты. В микроGUI Photon'а они в основном рассматриваются в качестве возможности, аналогичной использованию контекста памяти, но их использование будет более быстрым, поскольку для этих областей имеется аппаратное ускорение. Функции и структуры данных включают:

PdCreateOffscreenContext()

Создание внеэкранного контекста в видеопамяти

PdDupOffscreenContext()

Дублирование внеэкранного контекста

PdGetOffscreenContextPtr()

Создание ссылки на объект совместно используемой памяти внеэкранного контекста

PdOffscreenContext_t

Структура данных, описывающая внеэкранный контекст

PdSetOffscreenTranslation()

Установка преобразования для внеэкранного контекста

PdSetTargetDevice()

Установка целевого устройства

PgContextBlit()

Копирование данных из прямоугольника в одном контексте в другой контекст

PgContextBlitArea()

Копирование данных из области в одном контексте в другой контекст

PgSwapDisplay()

Указать ЭЛТ видеодисплея на заданный контекст

PgWaitHWIdle()

Ожидать, пока видеодрайвер не окажется в простое

PhDCRelease()

Освобождение контекста прорисовки

Вот некий простой код, который создаёт и формирует изображение во внеэкранном буфере, а затем копирует данные на экран. Он создаёт два внеэкранных контекста объёмом 100х100, выполняет какую-то прорисовку, блитинг, и затем блитирует результат в текущую область (т.е. в область, принадлежащую PtWindow). В этом примере предполагается, что Вы уже создали окно и вызвали функцию PgSetRegion(), чтобы указать, что область окна вызывает появление событий прорисовки:

#include <Pt.h>

PtInit( NULL );

/* ... */

Характеристики

Тип файла
Документ
Размер
7,62 Mb
Тип материала
Высшее учебное заведение

Список файлов учебной работы

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6376
Авторов
на СтудИзбе
309
Средний доход
с одного платного файла
Обучение Подробнее