Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

DVD-lab PRO

.pdf
Скачиваний:
49
Добавлен:
24.05.2014
Размер:
6 Мб
Скачать
☆

 

 

Получить, какое меню связанно с объектом

ObjectGetMenuLink

nMenu = ObjectGetMenuLink(menu,object)

0 - если никакой связи нет

 

 

 

Получить, какое кино связанно с объектом

ObjectGetMovieLink

nMovie = ObjectGetMovieLink(menu,object)

0 - если никакой связи нет

 

 

 

Получить, какая глава кино связанна с объектом,

ObjectGetChapterLink

nChapter = ObjectGetChapterLink(menu,object)

1-Запуск Кино

 

Image

Функции изображения - специальный набор команд, который предоставляет доступ к растровым объектам меню. Текст, прямоугольники или рамки будут сначала преобразованы в точечный рисунок.

Функции изображения никогда не обращаются непосредственно к изображениям, сначала создается копия этого объекта при помощи ImgGrabObject, затем Вы можете свободно изменять данные. Вы имеете 3 буфера изображения, где Вы можете сохранить эти данные, или непосредственно создать пустой буфер ImgCreate. Эти буферы указаны imgNum параметром в каждой команде Img.

Итак типичный сценарий для скрипта, который может изменить(заменить) объект в меню, был бы:

menu = MenuGetCurSel()

object= ObjectGetCurSel(menu)

ImgGrabObject(1,menu,object)

imgW = ImgGetWidth(1) imgH = ImgGetHeight(1)

......

ImgSetToObject(1,menu,object)

Получить текущее открытое меню

Получить текущий объект в меню

Поместить растровые данные в буфер 1

получить размеры растровых данных (например для цикла)

сделать то, что Вы хотите в буфере с ImgSet и т.д.

Применить содержимое буфера 1 к объекту

Прямое манипулирование данными изображения в цикле - медленный процесс.

Обратите внимание - ImgSetToObject не будет изменять размеры объекта, если буфер изображения имеет размер отличный чем объект. Вы можете изменить размеры объекта позже к тому же самому размеру подобно буферу изображения при помощи объектной команды: ObjectSetSize (меню, объект, imgW, imgH)

Команда

Параметры и использование

ImgGrabObject

ImgGrabObject(imgNum,menu,object)

ImgSetToObject

ImgSetToObject(imgNum,menu,object)

ImgCreate

ImgCreate(imgNum,width,height)

ImgHasData

bHasData = ImgHasData(imgNum)

ImgGetWidth

imgW = ImgGetWidth(imgNum)

ImgGetHeight

imgH = ImgGetHeight(imgNum)

ImgGetR

r = ImgGetR(imgNum,x,y)

ImgGetG

g = ImgGetG(imgNum,x,y)

ImgGetB

b = ImgGetB(imgNum,x,y)

ImgGetA

a = ImgGetA(imgNum,x,y)

ImgSetR

r = ImgSetR(imgNum,x,y,nValue)

ImgSetG

g = ImgSetG(imgNum,x,y,nValue)

ImgSetB

b = ImgSetB(imgNum,x,y,nValue)

ImgSetA

a = ImgSetA(imgNum,x,y,nValue)

ImgFill

ImgFill(imgNum,color)

ImgFillAlpha

ImgFillAlpha(imgNum,alpha)

ImgFillCol

ImgFillCol(imgNum,x,color)

ImgFillRow

ImgFillRow(imgNum,y,color)

ImgCopyCol

ImgCopyCol(imgNumFrom,xFrom,imgNumTo,xTo)

ImgCopyRow

ImgCopyRow(imgNumFrom,yFrom,imgNumTo,yTo)

Пояснения

Данные изображения объекта

imgNum временно поместить изображение в буфер 1,2 или 3 Если объект - 0, фон тоже будет помещен

Применить данные изображения, к Объекту

Создать пустое изображение с определенным размером

Есть ли данные в Буфере изображения?

Получить ширину изображения в буфере

Получить высоту изображения в буфере

Получить красный цвет пиксела по координатам x, y

-зеленый-

-синий-

-alpha прозрачность-

Установить Красный цвет пиксела по координатам x, y

-зеленый-

-синий-

-alpha прозрачность-

Заполнить буфер цветом

Заполнить alpha канал буфера alpha значением 0-255

Заполнить Х столбец цветом

Заполнить У строку цветом

Копировать столбец из одного буфера в другого

Копировать строку из одного буфера в другой

 

 

Копировать изображение из одного буфера в другой. Вы можете указать смещение от

ImgCopy

ImgCopy(imgNumFrom,imgNumTo,xOffset,yOffset)

того места, где стартует копирование

 

ImgCopyAlpha

ImgCopyAlpha(imgNumFrom,imgNumTo,xOffset,yOffset)

Копировать только alpha данные из одного буфера в другой

 

ImgOverlay

ImgOverlay(imgNumFrom,imgNumTo,xOffset,yOffset)

Наложить одно изображение буфера поверх другого

 

 

 

Захватить видео кадр из главы в буфер imgNum.

ImgGrabChapterFrame

ImgGrabChapterFrame(imgNum,nMovie,nChapter)

nChapter = 0-> Movie start

 

ImgGrabMenuFrame

ImgGrabMenuFrame(imgNum,nMenu)

Захватить изображение меню

 

ImgResize

ImgResize(imgNum,nW,nH)

Изменить размеры буфера на произвольные

 

 

 

Размыть изображение в буфере

ImgBlur

ImgBlur(imgNum,nBlurValue)

nBlurValue 1-255

 

 

 

Размыть только alpha канал

ImgBlurAlpha

ImgBlurAlpha(imgNum,nBlurValue)

nBlurValue 1-255

 

 

 

Изменить резкость изображения в буфере

ImgSharpen

ImgSharpen(imgNum,nSharpen)

nSharpen 1-100

 

ImgInflate

ImgInflate(imgNum,nAddW,nAddH)

Добавить пустую границу вокруг изображения в буфере

 

Movie

Разработка Команд кино еще полностью не закончена. Пока нет никакого способа добавить например главы, переходы в демонстрации слайдов и т.д...

Команда

 

Параметры и использование

 

Пояснения

MovieGetCount

 

nC = MovieGetCount()

 

Сколько кинообъектов имеет текущая VTS

 

 

 

MovieGetCurSel

 

movie = MovieGetCurSel()

 

Текущее кино (окно Movie поверх других окон)

MovieAdd

 

movie = MovieAdd(IsSlideshow,"Name",openWindow)

 

 

MovieDelete

 

MovieDelete(movie)

 

 

MovieActivate

 

MovieActivate(movie)

 

 

MovieSetFiles

 

MovieSetFiles(movie,sVideo,sAudio)

 

Для мультиплексированных mpg использовать sVideo и sAudio тот же самый файл

 

 

 

Others

Перечень некоторых других команд...

Команда

 

Параметры и использование

 

Пояснения

ProgressBar

 

ProgressBar(nFrom,nTo,"Text")

 

Создать строку выполнения(градусник) с диапазоном nFrom to nTo

ProgressSetPos

 

ProgressSetPos(nPos)

 

Установить строку выполнения в nPos уровень (nFromNPOS&LT;NTO)< td>

SaveInteger

 

SaveInteger("uniquekey",variable)

 

Сохранить в регистре

 

 

 

LoadInteger

 

var = LoadInteger("uniquekey",default)

 

Читать из регистра

 

 

 

Variables

Некоторые переменные LabTALK.

Команда

 

Параметры и использование

 

Пояснения

bCancelInput

 

if (bCancelInput) then

 

Если пользователь отменит предыдущую команду, эта переменная станет TRUE

 

end

 

 

 

 

endif

 

 

menusInBlackBox

 

 

 

Важный массив для сценария в Компонентах, подробнее см. components

 

 

 

 

vmgsInBlackBox

 

 

-//-

moviesInBlackBox

 

 

-//-

Advanced Authoring - LabTALK - plug-in SDK

DVD Lab Pro позволяет создавать дополнения к программе в различных языках программирования. Откомпилированные дополнения к программе имеют расширение *.cplg и могут быть размещены в папке Extras - Script. Они появятся в закладке Plug-ins-Script окна "Assets". Дополнение SDK непосредственно вызывает те же самые команды, которые используются в lab-TALK, поэтому Вам необходимы некоторые знания, как работает lab-TALK . Главный выигрыш от компилирования cplg plug-in - скорость его работы.

Типичный пример - дополнение Fire:

Дополнение Fire создано как сценарий lab-TALK, но из-за большого количества пиксельных операций, было позже оттранслировано в C++ и откомпилировано как fire.cplg, для ускорения работы.

Обратите внимание: Plug-ins выполняются при перетаскивании их в окно Menu или Connection.

SDK

cplg - обычный dll (переименованный в cplg).

Обратите внимание: Мы будем использовать С++ для всех наших примеров. Но из-за простоты API, это может быть сделано и на других языках.

Есть только две функции API:

Команда

PLUGINDLL_API char* PL_GetAbout(void)

PLUGINDLL_API void PL_RunScript(PLCallBack pCallback,HWND hWnd)

DLL export definition

#define PLUGINDLL_API extern "C" __declspec(dllexport)

Параметры и Использование

Returns description about the plug-in. It will appear if user double-clicks on the plug-in in assets.

Entry point that is called when plug-in is dropped on object. It gives your plug-in access to DVD-lab callback function and sends the hWnd of the main DVD-lab window.

PLCallback definition

PLCallback основная функция вызова, которую Вы вызываете из plug-in.

код

 

Параметры и Использование

typedef void (*PLCallBack)

 

 

(char* sName,

 

 

_PLVariable *result,

 

sName - имя функции DVD-lab Pro(идентичная функции labTALK.)

_PLVariable *param1,

 

result - результат функции

_PLVariable *param2,

 

param1.. param4 - ввод параметров функции

_PLVariable *param3,

 

 

_PLVariable *param4);

 

 

PLVariable definition

Объектные команды дают доступ к определенному объекту в меню (поэтому номер меню - обязательный параметр).

Command

struct _PLVariable

{

int m_nVariableType; float m_fValue;

int m_nValue; char* m_sValue; };

Parameters and Usage

m_nVariableType - типом переменной, может быть один из:

●#define typeVariableInt 0

●#define typeVariableFloat 1

●#define typeVariableString 2

используются в зависимости от типа, m_fValue, m_nValue или m_sValue

Пример

Вот пример, как обратиться к labTALK функции ObjectGetCurSel (nMenu)

Listing 1

int nMenu = 1;

_PLVariable param1; param1. m_nVariableType = typeVariableInt; param1.m_nValue = nMenu; param1.m_sValue = NULL;

_PLVariable ParamResult;

pCallback ("ObjectGetCurSel", &ParamResult,¶m1, NULL,NULL,NULL);

int objectcount = ParamResult. m_nValue;

Таким образом можно обратиться ко всем функциям labTALK. Только тип и номер входных параметров изменяются от функции к функции.

Helper functions

Так как код нашего дополнения к программе стал бы грязным, если мы вызываем все функции как в Listing 1, мы можем создать вспомогательную функцию. Самая обычная функция - та, которая имеет все параметры целое числа и также возвращает целые числа.

Listing 2

int CALLSCRIPT(char* sName, int nParam1=0, int nParam2 = 0, int nParam3 =0, int nParam4 = 0 );

int CALLSCRIPT(char* sName, int nParam1, int nParam2, int nParam3, int nParam4 )

{

_PLVariable param1; param1.m_nVariableType = typeVariableInt; param1.m_nValue = nParam1; param1.m_sValue = NULL;

_PLVariable param2; param2.m_nVariableType = typeVariableInt; param2.m_nValue = nParam2; param2.m_sValue = NULL;

_PLVariable param3; param3.m_nVariableType = typeVariableInt; param3.m_nValue = nParam3; param3.m_sValue = NULL;

_PLVariable param4; param4.m_nVariableType = typeVariableInt; param4.m_nValue = nParam4; param4.m_sValue = NULL;

_PLVariable ParamResult;

m_pCallback(sName,&ParamResult,¶m1,¶m2,¶m3,¶m4);

return ParamResult.m_nValue;

}

Определив эту функцию мы можем тогда заменить Listing 1:

int objectcount = CALLSCRIPT("ObjectGetCurSel",nMenu)

Мы можем также определить непосредственно ObjectGetCurSel, что еще больше упрощает ввод команд. Итак:

#define ObjectGetCurSel(nMenu) (CALLSCRIPT("ObjectGetCurSel",nMenu))

int objectcount = ObjectGetCurSel(nMenu);

Этим путем мы можем определить все функции labTALK, в которых мы нуждаемся. Конечно некоторые функции labTALK требуют строки как входной параметр, так что мы были бы должны определить другую вспомогательную функцию, которая учитывает это:

Listing 3

// another version of helper, second param is char

int CALLSCRIPT2(char* sName, int nParam1=0, char* chParam2 = NULL, int nParam3 =0, int nParam4 = 0 );

int CALLSCRIPT2(char* sName, int nParam1, char* chParam2, int nParam3, int nParam4 )

{

_PLVariable param1; param1.m_nVariableType = typeVariableInt; param1.m_nValue = nParam1; param1.m_sValue = NULL;

_PLVariable param2;

param2.m_nVariableType = typeVariableString; param2.m_nValue = 0; strcpy(param2.m_sValue,chParam2);

_PLVariable param3; param3.m_nVariableType = typeVariableInt; param3.m_nValue = nParam3; param3.m_sValue = NULL;

_PLVariable param4; param4.m_nVariableType = typeVariableInt; param4.m_nValue = nParam4; param4.m_sValue = NULL;

_PLVariable ParamResult;

m_pCallback(sName,&ParamResult,¶m1,¶m2,¶m3,¶m4);

return ParamResult.m_nValue;

}

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

#define MenuAdd(bIsVmg,sName,bOpen) (CALLSCRIPT2("MenuAdd",bIsVmg,sName,bOpen))

Этим путем Вы можете определить в вашем *.h файле все функции в labTALK, так что они могут использоваться в точно таком же синтаксисе как в сценарий labTALK.

Get Image buffer

Одна "секретная" команда, которая не описана в Lab-TALK(потому что там она не имеет никакого значения ) ImgGetRGBABuffer возвращает указатель на буфер RGBA

Будьте внимательны, потому что записав эту команду вне границ, Вы можете обрушить DVD-lab Pro.

Размер буфера - ImgGetWidth(imgNum)*ImgGetHeight(imgNum)*4

Обратите внимание: BYTE определен как символ без знака.

Listing 4

#define ImgGetRGBABuffer(imgNum) (CALLSCRIPT("ImgGetRGBABuffer",imgNum)) #define ImgGetWidth(imgNum) (CALLSCRIPT("ImgGetWidth",imgNum))

#define ImgGetHeight(imgNum) (CALLSCRIPT("ImgGetHeight",imgNum))

#define ImgGrabObject(imgNum,nMenu,nObject) (CALLSCRIPT("ImgGrabObject",imgNum,nMenu,nObject)) #define ImgSetToObject(imgNum,nMenu,nObject) (CALLSCRIPT("ImgSetToObject",imgNum,nMenu,nObject)) #define MenuGetCurSel() (CALLSCRIPT("MenuGetCurSel"))

#define ObjectGetCurSel(nMenu) (CALLSCRIPT("ObjectGetCurSel",nMenu))

// get current menu and current object

int menu = MenuGetCurSel();

int object= ObjectGetCurSel(menu);

ImgGrabObject(1,menu,object);

// imgNum = temporary image buffer 1,2 or 3

BYTE* pBuffer = (BYTE*)ImgGetRGBABuffer(1);

if (pBuffer==NULL) return;

int imgW = ImgGetWidth(1); int imgH = ImgGetHeight(1);

for (y=0; ybr> { for (x=0;xbr> {

BYTE r = pBuffer[y*imgW*4+x*4];

BYTE g = pBuffer[y*imgW*4+x*4+1];

BYTE b = pBuffer[y*imgW*4+x*4+2];

BYTE alpha = pBuffer[y*imgW*4+x*4+3];

// do something with it and then set it back to pBuffer

}

}

//put the buffer to object ImgSetToObject(1,menu,object);

Full Example

Короткий пример на С++ для реверсирования цветов графического объекта.

См. исходный файл для plugindll примера.

plugindll.cpp plugindll.h

После компиляции в VC ++, полученный dll-файл был переименован в *.cplg и помещен в папку \Extras\Script\ в DVD-lab Pro. После этого его можно использовать как любой другойсценарий.

Обратите внимание: Вы можете создать эскиз для плагина в bmp формате(256 цветов) , который должен иметь то же самое имя (в нашем примере: plugindll.bmp), находиться в той же самой папке и иметь размер 85x60 пикселей.

VM Debugger (отладчик VM Command)

VM Debugger - уникальный инструмент DVD-lab PRO, который позволяет Вам постепенно пройти через все VM commands проекта и видеть изменения, которые происходят в проигрывателе.

VM Debugger можно вызвать из различных мест.

VM Debugger всего проекта

Отладчик запустится от First Play и продолжит работу дальше

VM Debugger объектов

Отладчик запустится с определенного кода в любых командах PRE или POST

Debugger window (Окно отладчика)

Основные области окна:

1 - Текущий выполняющийся в настоящее время объект

2 - Последовательность VM command

3 - Управление отладчиком

4 - Окно вывода

5 - Регистры GPRM

6 - Регистры SPRM

7 - Предварительный просмотр меню/Кино

8 - Меню/Кино/Дистанционное управление.

Debugger Control

Миганием отладчик предложит которую кнопка нажать. Например, если Вы запускаете отладчик, кнопка GO мигнет,

если Вы ожидаете следующего шага мигнет Step Line и т.д...

Go - Запускает отладку VM кода с первой строки

Step Line - следующая (выделенная) строка будет выполнена

Stop - отладчик остановится

Auto Reset Registers - каждый раз, когда Вы нажимаете кнопку Go, регистры сбросятся, чтобы восстановить свое состояние.

Follow Links - если эта опция включена Вы будете следовать за всеми связями к другим объектам. Если выключена отладчик просто остановится на командах связи. Если Вы хотите отладить только специфический код, Вы не должны включать опцию Follow Links. Вы можете тогда исследовать тот же самый код, просто вводя различное начальное состояние регистров и выполнить код снова кнопкой Go.

Текущая строка

Строка, которая будет выполнена кнопкой Step Line - выделена. На изображении выше GPRM12 - все еще равен 0 и когда Вы нажимаете Step Line, курсор передвинется на строку 2, и GPRM12 будет установлен в значение 1024.

Это означает, что выделенная строка еще не выполнена!

Начальное состояние

Проигрыватель DVD имеет некоторое начальное состояние. Все регистры GPRM - 0, и регистры SPRM имеют различные значения по умолчанию. Например на английских проигрывателях SPRM0 установлен на 25966 и т.д.

Вы можете сбросить регистры, чтобы установить начальное состояние в любое время, используя кнопку Reset to

Initial State.

Редактирование регистров

В любое время вы можете ввести состояние любого регистра GPRM. Просто сделайте двойной щелчок на номере регистра и введите значение.

Вы можете ввести новые значения даже во время отладки.

Ожидание ввода команд управления (область предварительного просмотра мигает)

После того, как Вы запустите Меню, или команду PRE Movie и в отладчике Follow Links установлен в ON, отладчик ожидает ввода команд управления.

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

-Пользователь нажимает любую кнопку на меню

-Время ожидания Меню (продолжит команду POST)

-Пользователь нажимает кнопку Menu на ПДУ

-Пользователь нажимает кнопку Title на ПДУ

Это все моделируется в области предварительного просмотра. Вы можете выбрать любую кнопку в Меню или выбрать Timeout, или кнопки Menu или Title.

В случае выбора Movie, изображение отобразит стоп-кадр из фильма. Это просто говорит о том, что выбран показ фильма, и Вы можете выбрать Timeout, который переместит в конец кино и выполненение команды POST или кнопку

Menu или Title.

Отладчик - очень сильный инструмент в настройке вашего VM кода, и это - одна из многих уникальных особенностей DVD-lab PRO.