Часть 2, похитрее. Кнопки добавляются, подсветка появляется, команды идут. Работаем с меню 16х9!
Используемый инструментарий: DVD Remake Pro, SubRip, MuxMan, Photoshop
Нашли менюшку, делаем для нее новый проект

Копируем в старом

Добавляем в новый

Экспортируем

Берем на заметку потоки с подсветкой

Меню - на экспорт

Кнопки - на экспорт

Color Scheme - на экспорт

CLUT - на экспорт

Открываем в SubRip

Открываем...

Открываем...

Выбираем поток с нужной подсветкой, Wide

Сохраняем

Нужно имя

Установки - цвет

Установки - обрезки нет

Вот она она!

Сохранили - приросла цифирька

Повторяем для Pan & Scan

Фотошоп - Color Table

Сохраняем Color Table

В RGB

Собираем слои,

Ага, WS highlight слой - в проект с меню

Задний план - тоже в слой

Прозрачность - вот оно каково!

Анаморф: растягиваем (720x480 -> 854x480 NTSC), (720x576 -> 1024x576 PAL)
4:3 - растягиваем (720x480 -> 720x540 NTSC), (720x576 -> 768x576 PAL)
До и после удаления текста

Меню до и после

Новое меню

Новое меню с подсветкой

Новое меню с подсветкой - крупно

Сжимаем меню обратно до (720x480 NTSC), (720x576 PAL)
WS highlight - одну копию сжимаем как меню,
из другой (других) делаем
PS (Pan & Scan):
1. Меняем размер картинки на (960x480 NTSC), (960x576 PAL)
2. Меняем размер канваса на (720x576 PAL) (720x480 NTSC). Не трогаем контроли расположения картинки - она должна оставаться в центре. Картинка обрежется по бокам.
LB (Letterbox):
1. Меняем размер картинки на (720x432 PAL) (720x360 NTSC)
2. Меняем размер канваса на (720x576 PAL) (720x480 NTSC). Не трогаем контроли расположения картинки - она должна оставаться в центре.
3. Заполняем пустой канвас сверху и снизу красным цветом.
Меняем на индекс - палитра, загружаем сохраненную Color Table

Не размазывать!

Сохраняем подсветку для моды Wide, как 4-бит OS/2 bmp - WS_ED.bmp
То же делаем для остальных необходимых мод.
Сохраняем следующий текст как WS.sst:
CODE
st_format 2
Display_Start forced
TV_Type NTSC
Tape_Type NON_DROP
# 2 pixels out of 480 are unavailable for subtitles
Pixel_Area (2 479)
Display_Area (0 2 719 479)
# Draw your highlight with red (background, BG),
# black (pattern, PT),
# blue (emphasis 1, E1),
# and white (emphasis 2, E2)
E2 (255 255 255 = = =)
E1 (0 0 255 = = =)
PA (0 0 0 = = =)
BG (255 0 0 = = =)
# Mapping to CLUT
# (E2 E1 PA BG)
Color (1 1 1 1)
# Transparency (0-15): 0 - fully transparent, 15 - fully opaque
# (E2 E1 PA BG)
Contrast (0 0 0 0)
# Next line means the highlight bmp is in same directory as this sst file
Directory .
# Zero start and finish mean default time for muxing app
# PS.bmp - name of highlight file
1 00:00:00:00 00:00:00:00 PS.bmp
# Comment added to ensure carriage return in the previous line -
# when copied from a web page
SST (формат Сценариста) указывает на созданный ранее bmp. Файл с подсветкой, WS_ED.bmp, должен быть в той же папке, что и WS.sst
Делаем такой же файл PS.sst - для подсветки PS (только меняем имя bmp, на который он указывает).
SST файл для PAL
CODE
st_format 2
Display_Start forced
TV_Type PAL
Tape_Type NON_DROP
# 3 pixels out of 576 are unavailable for subtitles
Pixel_Area (2 574)
Display_Area (0 2 719 574)
# Draw your highlight with red (background, BG),
# black (pattern, PT),
# blue (emphasis 1, E1),
# and white (emphasis 2, E2)
E2 (255 255 255 = = =)
E1 (0 0 255 = = =)
PA (0 0 0 = = =)
BG (255 0 0 = = =)
# Mapping to CLUT
# (E2 E1 PA BG)
Color (1 1 1 1)
# Transparency (0-15): 0 - fully transparent, 15 - fully opaque
# (E2 E1 PA BG)
Contrast (0 0 0 0)
# Next line means the highlight bmp is in same directory as this sst file
Directory .
# Zero start and finish mean default time for muxing app
# PS.bmp - name of highlight file
1 00:00:00:00 00:00:00:00 PS.bmp
# Comment added to ensure carriage return in the previous line -
# when copied from a web page
MuxMan - выбираем видео (меню)

Аттрибуты меню

Подсветка для моды Wide. Добавляем файл WS.sst (не bmp!!!), как первый поток субтитров. Открывается окно менеджера

PS.sst добавляется как второй поток первого трека субтитров
Муксим!

Добавляем CLUT, Color Scheme, старые кнопки.
Добавляем новые кнопки

Кнопки добавлены

Чиним навигацию

Навигация починена

Скопировали

Приклеили поверх старого

Крупный план до

Крупный план после

Изменение команд - в каждом конкретном случае разное.
Просто как пример изменения довольно продвинутой навигации:
Команды на кнопках до

Сразу видно, что при выборе аудио мы уходим в PGC 8, а субтитров - PGC 9; R[2] служит для передачи номера нажатой кнопки. Делаем по тому же образцу:
Команды на кнопках после

Проходим в дебаггере, обнаруживаем в "Root" и "Angle" меню в VTS с фильмом схожие команды, задающие аудио и субтитры:
CODE
audio = R[12]; sub-picture = R[13]
Видно, что R[12] служит для хранения номера аудио трека, R[13] - субтитров
Если мы в меню с установками (то, над которым мы так потрудились) не заглянем, то R[12] и R[13] присваиваются нулевые значения в PGC 4 Видео Менеджера:
CODE
1 R[15] = 99
2 R[12] = 0
3 R[13] = 0
4 R[1] = preferred_sub-picture_language
5 R[0] = preferred_audio_language
6 NOP
7 NOP
8 Jump VTS 2 "angle" menu (title 1)
Нули означают 1-й трек аудио и 1-й (в оригинале - единственный) трек субтитров, причем отключенный (объяснить здесь).
Что характерно, предпочтительные языки аудио и субтитров (то, что Вы можете установить в хорошем плеере) присваиваются в регистры R[0] и R[1], но потом нигде не используются. При авторинге используются программы "высокого уровня", типа Сценариста, которые используют шаблоны и abstraction layer. Никто настоящие команды не видит (отсюда и огромное число совершенно ненужных, бессмысленных команд). При авторинге явно использовался шаблон, рассчитанный на разные языки. Тем лучше для нас! Меняем на
CODE
1 R[15] = 99
2 R[12] = 0
3 R[13]=0
4 R[1] = preferred_sub-picture_language
5 R[0] = preferred_audio_language
6 if (R[0] == 29301 ("ru")) R[12] = 2
7 if (R[1] == 29301 ("ru")) R[13] = 1
8 Jump VTS 2 "angle" menu (title 1)
Если предпочтительный язык - русский, будет выбран русский аудио трек и русские субтитры (как будет ясно позже - в отключенном состоянии). При любом другом языке предпочтения - будут выбраны английские треки.
Далее изучаем работу меню с установками. Перед тем, как мы в него попадаем, исполнялись команды (pre commands):
CODE
1 R[0] = 99
2 if (R[0]==R[5]) goto line 12
3 R[0] = 100
4 if(R[0]==R[5]) goto line 23
5 R[0] = 0
6 if (R[0] == audio) highlighted_button = 1024 (button 1)
7 R[0] = 1
8 if (R[0] == audio) highlighted_button = 2048 (button 2)
9 NOP
10 NOP
11 goto line 24
12 R[0] = sub-picture
13 R[0] &= 63
14 R[1] = 0
15 if (R[1] == R[0]) highlighted_button = 3072 (button 3)
16 R[1] = 1
17 if (R[1] == R[0]) highlighted_button = 5120 (button 5)
18 R[0] = sub-picture
19 R[0] &= 64
20 R[1] = 0
21 if (R[1] == R[0]) highlighted_button = 4096 (button 4)
22 goto line 24
23 highlighted_button = 5120 (button 5)
24 NOP
Меняем на
CODE
1 R[0] = 99
2 if (R[0] == R[5]) goto line 14
3 R[0] = 100
4 if (R[0] == R[5]) goto line 27
5 R[0] = 0
6 if (R[0] == audio) highlighted_button = 1024 (button 1)
7 R[0] = 1
8 if (R[0] == audio) highlighted_button = 2048 (button 2)
9 R[0] = 2
10 if (R[0] == audio) highlighted_button = 3072 (button 3)
11 NOP
12 NOP
13 goto line 28
14 R[0] = sub-picture
15 R[0] &=64
16 R[1] = 0
17 if (R[1] != R[0]) goto line 20
18 highlighted_button = 6144 (button 6)
19 goto line 28
20 R[0] = sub-picture
21 R[0] &= 63
22 R[1] = 0
23 if (R[1] == R[0]) highlighted_button = 4096 (button 4)
24 R[1] = 1
25 if (R[1] == R[0]) highlighted_button = 5120 (button 5)
26 goto line 28
27 highlighted_button = 7168 (button 7)
28 NOP
(как сделать жирный шрифт внутри CODE?)
Объяснить про 63, 64 и логику
При выборе аудио, нас выбрасывало в PGC 8:
CODE
1 R[5] = 99
2 R[1] = sub-picture
3 R[1] &= 63
4 R[0] = 1
5 if (R[1] == R[0]) sub-picture = 0 (track 0:OFF)
6 NOP
7 NOP
8 R[0] = 1
9 if (R[2] == R[0]) audio = 0 (track 0)
10 R[0] = 2
11 if (R[2] == R[0]) audio = 1 (track 1)
12 NOP
13 NOP
14 R[2] = 0
15 R[12] = audio
16 R[13] = sub-picture
17 Link PGC 7
после чего мы возвращались в меню установок, с одной из кнопок субтитров, услужливо выбранных для нас (в зависмости от текущего выбора).
Меняем на
CODE
1 R[5] = 99
2 NOP
3 NOP
4 NOP
5 NOP
6 NOP
7 NOP
8 R[0] = 1
9 if (R[2] == R[0]) audio = 0 (track 0)
10 R[0] = 2
11 if (R[2] == R[0]) audio = 1 (track 1)
12 R[0] = 3
13 if (R[2] == R[0]) audio = 2 (track 2)
14 NOP
15 NOP
16 R[2] = 0
17 R[12] = audio
18 R[13] = sub-picture
19 Link PGC 7
При выборе субтитров, нас выбрасывало в PGC 9:
CODE
1 R[5] = 100
2 R[0] = 5
3 if (R[2] != R[0]) goto line 13
4 goto line 9
5 NOP
6 NOP
7 NOP
8 NOP
9 R[0] = sub-picture
10 R[0] &= 63
11 if (R[0] == 1) R[0] = 0
12 sub-picture = R[0]
13 R[0] = 1
14 if (R[2] == R[0]) sub-picture = 64 (track 0:ON)
15 R[2] = 0
16 R[12] = audio
17 R[13] = sub-picture
18 R[11] = 0
19 Link PGC 1
Меняем на
CODE
1 R[5] = 100
2 R[0] = 5
3 if (R[2] != R[0]) goto line 13
4 goto line 9
5 NOP
6 NOP
7 NOP
8 NOP
9 R[0] = sub-picture
10 R[0] &= 63
11 if (R[0] == 1) R[0] = 0
12 sub-picture = R[0]
13 R[0] = 1
14 if (R[2] == R[0]) sub-picture = 64 (track 0:ON)
15 R[0] = 2
16 if (R[2] == R[0]) sub-picture = 65 (track 1:ON)
17 R[2] = 0
18 R[12]= audio
19 R[13]= sub-picture
20 R[11] = 0
21 Link PGC 1