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

Вы также можете загрузить кадры из файла – из структуры PhImage_t – функцией PxLoadImage(). Эта функция поддерживает множество форматов, включая gif, pcx, jpg, bmp, и png. Полный список см. в /usr/photon/dll/pi_io_*.

      1. Циклическая прокрутка кадров

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

  1. Создайте в Вашем приложении виджет PtTimer. PhAB отображает его как чёрный прямоугольник, он не появится, когда Вы запустите своё приложение.

  2. Задайте для таймера начальный (Pt_ARG_TIMER_INITIAL) интервал и интервалы повтора (Pt_ARG_TIMER_REPEAT).

  3. Создайте для таймера ответную реакцию активизации (Pt_CB_TIMER_ACTIVATE). В ответной реакции определите следующий образ, который будет отображён, и скопируйте его в предназначенный виджет.

Например, ответная реакция таймера может быть такой:

/* Отображение следующего образа для нашего примера мультипликации. */

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

#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, в котором появляется мультипликация.

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

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

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

или

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

          1. PtOSContainer

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

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

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

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

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().

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