DVD-lab PRO
.pdf
|
|
Получить, какое меню связанно с объектом |
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<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.
