diff options
author | Karl Berry <karl@freefriends.org> | 2006-01-12 23:59:41 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2006-01-12 23:59:41 +0000 |
commit | b0c5106727df8ef4ff38eb5a8bfb014f4acf142c (patch) | |
tree | 4b65f25da0ba2b7ed82fea2e8a41e977ee941b8f /Master | |
parent | 8e93972ce693a39172abf42a1e3fc2492adfaf28 (diff) |
movie15
git-svn-id: svn://tug.org/texlive/trunk@1108 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
-rw-r--r-- | Master/texmf-dist/tex/latex/movie15/movie15.sty | 2097 |
1 files changed, 2097 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/movie15/movie15.sty b/Master/texmf-dist/tex/latex/movie15/movie15.sty new file mode 100644 index 00000000000..e952abb967d --- /dev/null +++ b/Master/texmf-dist/tex/latex/movie15/movie15.sty @@ -0,0 +1,2097 @@ +% Copyright 2004 Alexander Grahn +% +% This material is subject to the LaTeX Project Public License. See +% http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html +% for the details of that license. +% +% This package allows inclusion of multimedia content into PDF files +% following Adobe's PDF-1.5 and 1.6 specifications. +% + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{movie15}[2005/10/13] +\RequirePackage{keyval} +\RequirePackage{ifthen} + +\newboolean{@MXV@iiiDfeat}% enable 3D features from PDF-1.6 spec? +\newboolean{@MXV@iiid}%set to true if a 3D file is beeing embedded + +\DeclareOption{3D}{% + \setboolean{@MXV@iiiDfeat}{true}% +} + +\DeclareOption*{\PackageWarning{movie15}{Unknown Option \CurrentOption}} +\ProcessOptions\relax + +%find out which LaTeX is being used +\newboolean{@MXV@pdf}% +\ifthenelse{\isundefined{\pdfoutput}}{% + %latex with dvips + \setboolean{@MXV@pdf}{false}% +}{% + \ifthenelse{\number\pdfoutput<1}{% + %pdflatex in DVI mode + \setboolean{@MXV@pdf}{false}% + }{% + %pdflatex in PDF mode + \ifthenelse{\pdftexversion<120}{% + \PackageError{movie15}{% + pdfTeX/pdfLaTeX version >= 1.20 required for direct PDF output + }{% + Try to install a more recent version! + }% + }{% + \setboolean{@MXV@pdf}{true}% + }% + }% +} + +%for conditionals where \ifthenelse doesn't work +\gdef\@MXV@if#1{\csname if#1\endcsname}% + +%maintaining a counter for absolute page number +\RequirePackage{everyshi}% +\newcount\@MXV@page% +\EveryShipout{% + \global\advance\@MXV@page by 1% +} + +%define our own label making commands +\def\@MXV@newlabel#1#2{{% + \global\expandafter\def\csname#1\endcsname{#2}}}% + +\def\@MXV@getlabelvalue#1{% + \expandafter\ifx\csname#1\endcsname\relax% + undefined% + \else% + \csname#1\endcsname% + \fi% +}% + +%macro for writing labels to external *.aux file +\def\@MXV@labeltoaux#1#2{% + \@bsphack\protected@write\@auxout{}{% + \string\@MXV@newlabel{#1}{#2}% + }\@esphack% + \ifthenelse{\equal{\@MXV@getlabelvalue{#1}}{undefined}}{% + \ifthenelse{\isundefined{\@MXV@warning}}{%issue warning only once, at end + \gdef\@MXV@warning{}% of document + \AtEndDocument{% + \PackageWarningNoLine{movie15}{% + @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\MessageBreak + @@ Rerun to get cross-references right! @@\MessageBreak + @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}% + }% + }{}% + }{}% +}% +% +\ifthenelse{\boolean{@MXV@pdf}}{% + %for storing pdf object numbers (must be counters) + \newcount\@MXV@adict% + \newcount\@MXV@aadict% + % + %returns pdf page object number + \def\@MXV@pdfpageref#1{% + \expandafter\ifx\csname#1\endcsname\relax% + 0% + \else% + \expandafter\pdfpageref\csname#1\endcsname\space% + \fi% + }% +}{% + \PassOptionsToPackage{pdfmark}{hyperref}% + %counter for absolute number of movierefs + \newcount\@MXV@links +} + +%counter for absolute number of inclusions, +%used for labelling each annotation +\newcount\@MXV@includes + +%measuring things +%textbox +\newdimen\@MXV@width +\newdimen\@MXV@height +\newdimen\@MXV@depth +\newdimen\@MXV@totalheight +\newdimen\@MXV@@boxdepth +%for centring the textbox within display box +\newdimen\@MXV@traiselen +\newdimen\@MXV@braiselen +%for compatibility options +\newdimen\@MXV@start +\newdimen\@MXV@end + +%stores textbox given as argument to text option +\newsavebox{\@MXV@textbox} + +%some booleans we need +\newboolean{@MXV@autoplay} +\newboolean{@MXV@autostop} +\newboolean{@MXV@autoresume} +\newboolean{@MXV@autopause} +\newboolean{@MXV@mouse}%mouse interaction +\newboolean{@MXV@inline}%inline movie data +\newboolean{@MXV@attachment}%make embedded file extractable? +\newboolean{@MXV@externalviewer}%if true, screen annot will be removed +\newboolean{@MXV@url} +\newboolean{@MXV@boxopt}%true if text option is set +\newboolean{@MXV@textoverposter} +\newboolean{@MXV@runposter}% render poster from movie at runtime +\newboolean{@MXV@linkplay}% for \movieref command +\newboolean{@MXV@linkpause} +\newboolean{@MXV@linkresume} +\newboolean{@MXV@linkstop} +\newboolean{@MXV@linkclose} +\newboolean{@MXV@linkreset} + +%macro to reset all macros and booleans +\def\@MXV@reset{% + \setboolean{@MXV@autoplay}{false}% + \setboolean{@MXV@autostop}{true}% + \setboolean{@MXV@autoresume}{false}% + \setboolean{@MXV@autopause}{false}% + \setboolean{@MXV@mouse}{false}% + \setboolean{@MXV@inline}{true}% + \setboolean{@MXV@attachment}{true}% + \setboolean{@MXV@externalviewer}{false}% + \setboolean{@MXV@url}{false}% + \setboolean{@MXV@boxopt}{false}% + \setboolean{@MXV@textoverposter}{true}% + \setboolean{@MXV@runposter}{false}% + \setboolean{@MXV@linkplay}{true}% + \setboolean{@MXV@linkpause}{false}% + \setboolean{@MXV@linkresume}{false}% + \setboolean{@MXV@linkstop}{false}% + \setboolean{@MXV@linkclose}{false}% + \setboolean{@MXV@linkreset}{false}% + \gdef\@MXV@label{}% for movieref + \gdef\@MXV@mime{@MXV@auto}% + \gdef\@MXV@fsentry{}% + \gdef\@MXV@repeat{}% + \gdef\@MXV@@repeat{}% + \gdef\@MXV@volume{100}% + \gdef\@MXV@@volume{}% + \gdef\@MXV@ctrls{}% + \gdef\@MXV@@ctrls{}% + \gdef\@MXV@palindrome{}% + \gdef\@MXV@rate{}% + \gdef\@MXV@startat{}% + \gdef\@MXV@endat{}% + \gdef\@MXV@poevent{}% + \gdef\@MXV@pcevent{}% + \gdef\@MXV@box##1##2##3{\raisebox{0pt}[##2][##3]{\makebox[##1]{}}}% + \setlength{\@MXV@depth}{0pt}% + \setlength{\@MXV@height}{0pt}% + \setlength{\@MXV@width}{0pt}% + \setlength{\@MXV@braiselen}{0pt}% + \setlength{\@MXV@traiselen}{0pt}% + \gdef\@MXV@boxdepth{}% + \gdef\@MXV@boxheight{}% + \gdef\@MXV@boxwidth{}% + % + \ifthenelse{\boolean{@MXV@iiiDfeat}}{% + \gdef\@MXV@aac{30}% aperture angle of camera + \gdef\@MXV@background{}% + \gdef\@MXV@jscriptiiidfile{}% + \gdef\@MXV@coo{0 0 0}% centre of orbit + \gdef\@MXV@ctoc{0 -1 0}% centre of orbit to camera vector + \gdef\@MXV@roo{0}% radius of orbit + \gdef\@MXV@viewsfile{}% file containing views of the 3D object + \setboolean{@MXV@viewsprovided}{false}% + \setboolean{@MXV@defaultviewprovided}{false}% + %show controls for 3D content by default, otherwise the 3D model + %would be noninteractive, i. e. would not respond to mouse events + \setboolean{@MXV@iiidctrls}{true}% + }{}% +}% + +%missing package error message +\def\@MXV@missing#1{% + \PackageError{movie15}{% + Package `#1' has not been loaded yet + }{% + Put the line `\protect\usepackage{#1}' somewhere after + `\protect\usepackage{movie15}' to the preamble of your + document! + }% +} + +%3D-need-be-enabled error message +\def\@MXV@neediiiD{% + \PackageError{movie15}{% + If you wish to embed 3D objects, enable the\MessageBreak + 3D feature first by passing option `3D' to movie15!\MessageBreak + Make sure the `fp' package for fixed point calculus\MessageBreak + is installed in your TeX system + }{Package `fp' is available from CTAN.}% +} + +%macro to guess the mime type of the media file +\def\@MXV@guessmime#1{% + \filename@parse{#1}% + \ifthenelse{\equal{\filename@ext}{aiff}\OR\equal{\filename@ext}{AIFF}\OR% + \equal{\filename@ext}{aif}\OR\equal{\filename@ext}{AIF}\OR% + \equal{\filename@ext}{aifc}\OR\equal{\filename@ext}{AIFC}}{% + \gdef\@MXV@mime{audio/aiff}% + }{% + \ifthenelse{\equal{\filename@ext}{wav}\OR\equal{\filename@ext}{WAV}}{% + \gdef\@MXV@mime{audio/wav}% + }{% + \ifthenelse{\equal{\filename@ext}{wma}\OR\equal{\filename@ext}{WMA}}{% + \gdef\@MXV@mime{audio/x-ms-wma}% + }{% + \ifthenelse{\equal{\filename@ext}{wmv}\OR\equal{\filename@ext}{WMV}}{% + \gdef\@MXV@mime{video/x-ms-wmv}% + }{% + \ifthenelse{\equal{\filename@ext}{au}\OR\equal{\filename@ext}{AU}\OR% + \equal{\filename@ext}{snd}\OR\equal{\filename@ext}{SND}}{% + \gdef\@MXV@mime{audio/basic}% + }{% + \ifthenelse{\equal{\filename@ext}{mid}\OR\equal{\filename@ext}{MID}\OR% + \equal{\filename@ext}{rmi}\OR\equal{\filename@ext}{RMI}}{% + \gdef\@MXV@mime{audio/midi}% + }{% + \ifthenelse{\equal{\filename@ext}{mov}\OR\equal{\filename@ext}{MOV}\OR% + \equal{\filename@ext}{qt}\OR\equal{\filename@ext}{QT}}{% + \gdef\@MXV@mime{video/quicktime}% + }{% + \ifthenelse{\equal{\filename@ext}{mp3}\OR\equal{\filename@ext}{MP3}\OR% + \equal{\filename@ext}{m3u}\OR\equal{\filename@ext}{M3U}}{% + \gdef\@MXV@mime{audio/x-mp3}% + }{% + \ifthenelse{\equal{\filename@ext}{mp4}\OR\equal{\filename@ext}{MP4}}{% + \gdef\@MXV@mime{video/mp4}% + }{% + \ifthenelse{\equal{\filename@ext}{avi}\OR\equal{\filename@ext}{AVI}}{% + \gdef\@MXV@mime{video/avi}% + }{% + \ifthenelse{\equal{\filename@ext}{mpeg}\OR\equal{\filename@ext}{MPEG}\OR% + \equal{\filename@ext}{mpg}\OR\equal{\filename@ext}{MPG}}{% + \gdef\@MXV@mime{video/mpeg}% + }{% + \ifthenelse{\equal{\filename@ext}{smil}\OR\equal{\filename@ext}{SMIL}}{% + \gdef\@MXV@mime{application/smil}% + }{% + \ifthenelse{\equal{\filename@ext}{swf}\OR\equal{\filename@ext}{SWF}}{% + \gdef\@MXV@mime{application/x-shockwave-flash}% + }{% + \ifthenelse{\equal{\filename@ext}{u3d}\OR\equal{\filename@ext}{U3D}}{% + \ifthenelse{\boolean{@MXV@iiiDfeat}}{% + \setboolean{@MXV@iiid}{true}% + \gdef\@MXV@mime{model/u3d}% (unofficial) + \gdef\@MXV@iiidsubtype{U3D}% + }{% + \@MXV@neediiiD% + }% + }{% + \ifthenelse{\equal{\filename@ext}{ra}\OR\equal{\filename@ext}{RA}\OR% + \equal{\filename@ext}{ram}\OR\equal{\filename@ext}{RAM}\OR% + \equal{\filename@ext}{rm}\OR\equal{\filename@ext}{RM}}{% + \gdef\@MXV@mime{audio/x-pn-realaudio}% + }{% + \PackageError{movie15}{% + I couldn't determine MIME type of file:\MessageBreak`#1':\MessageBreak + Unknown file name extension: `\filename@ext' + }{% + When using media files of unknown type or with a\MessageBreak + non-standard file name extension, the MIME type must\MessageBreak + explicitly be specified. Try option `mimetype=<mime type>'! + }% + }}}}}}}}}}}}}}}% +} + +\ifthenelse{\boolean{@MXV@iiiDfeat}}{% 3D related definitions and macros + \RequirePackage{fp}% needed for fixed point calculus + \newcount\@MXV@viewscount%counter for number of 3D views per inclusion + \newboolean{@MXV@viewsprovided}%3d views file provided? + \newboolean{@MXV@iiidctrls}% show controls? + \newboolean{@MXV@defaultviewprovided}%default 3D view provided? + + %macro to compute the transformation matrix + \def\@MXV@ciiwmatrix#1 #2 #3 #4 #5 #6 #7 {% + % #1,#2,#3 centre of orbit coordinates (coo) + % #4,#5,#6 centre of orbit to camera direction vector (c2c) + % #7 orbital radius (roo) + % + %view vector (opposite to c2c) + \def\@MXV@viewx{-#4}\def\@MXV@viewy{-#5}\def\@MXV@viewz{-#6}% + % + %normalize view vector + \FPupn\@MXV@modulo{\@MXV@viewx{} \@MXV@viewx{} mul + \@MXV@viewy{} \@MXV@viewy{} mul + + \@MXV@viewz{} \@MXV@viewz{} mul + 2 swap root + }% + \FPupn\@MXV@viewx{\@MXV@viewx{} \@MXV@modulo{} div}% + \FPtrunc\@MXV@viewx\@MXV@viewx{12}% + \FPupn\@MXV@viewy{\@MXV@viewy{} \@MXV@modulo{} div}% + \FPtrunc\@MXV@viewy\@MXV@viewy{12}% + \FPupn\@MXV@viewz{\@MXV@viewz{} \@MXV@modulo{} div}% + % + %top and bottom views (@MXV@viewx == @MXV@viewy == 0) need special treatment + \FPupn\@MXV@sumxy{\@MXV@viewx{} abs \@MXV@viewy{} abs add}% + \FPifeq\@MXV@sumxy{0}% + %slightly incline the view vector, + %otherwise top and bottom views snap at 180 degrees around z-axis + \def\@MXV@viewy{0.000000001}% + \else% + \fi% + % + %rotational axis vector (cross product of [0 0 1] & view vector) + \def\@MXV@rotx{-\@MXV@viewy}\def\@MXV@roty{\@MXV@viewx}% + % + %sin of enclosed angle between [0 0 1] & view vector (from cross product) + \FPupn\@MXV@rotsin{\@MXV@rotx{} \@MXV@rotx{} mul \@MXV@roty{} \@MXV@roty{} % + mul + 2 swap root}% + % + %cos of enclosed angle between [0 0 1] & view vector (from dot product) + \def\@MXV@rotcos{\@MXV@viewz}% + \FPupn\@MXV@onerotcos{1 \@MXV@rotcos{} sub}% 1 - rotcos + % + %now we have to normalize the rot vector + \FPupn\@MXV@rotx{\@MXV@rotx{} \@MXV@rotsin{} div}% + \FPupn\@MXV@roty{\@MXV@roty{} \@MXV@rotsin{} div}% + % + %build the transformation matrix (right handed system) + \FPupn\@MXV@element{\@MXV@rotx{} \@MXV@rotx{} mul \@MXV@onerotcos{} mul % + \@MXV@rotcos{} add -1 mul}% + \xdef\@MXV@matrix{\@MXV@element}% + \FPupn\@MXV@element{% + \@MXV@rotx{} \@MXV@roty{} mul \@MXV@onerotcos{} mul -1 mul}% + \xdef\@MXV@matrix{\@MXV@matrix\space\@MXV@element}% + \FPupn\@MXV@element{\@MXV@roty{} \@MXV@rotsin{} mul}% + \xdef\@MXV@matrix{\@MXV@matrix\space\@MXV@element}% + \FPupn\@MXV@element{\@MXV@rotx{} \@MXV@roty{} mul \@MXV@onerotcos{} mul}% + \xdef\@MXV@matrix{\@MXV@matrix\space\@MXV@element}% + \FPupn\@MXV@element{\@MXV@roty{} \@MXV@roty{} mul \@MXV@onerotcos{} mul % + \@MXV@rotcos{} add}% + \xdef\@MXV@matrix{\@MXV@matrix\space\@MXV@element}% + \FPupn\@MXV@element{\@MXV@rotx{} \@MXV@rotsin{} mul}% + \xdef\@MXV@matrix{\@MXV@matrix\space\@MXV@element}% + \FPupn\@MXV@element{\@MXV@roty{} \@MXV@rotsin{} mul}% + \xdef\@MXV@matrix{\@MXV@matrix\space\@MXV@element}% + \FPupn\@MXV@element{\@MXV@rotx{} \@MXV@rotsin{} mul -1 mul}% + \xdef\@MXV@matrix{\@MXV@matrix\space\@MXV@element}% + \xdef\@MXV@matrix{\@MXV@matrix\space\@MXV@rotcos}% + \FPupn\@MXV@element{\@MXV@viewx{} #7 abs mul -1 mul #1 add}% + \xdef\@MXV@matrix{\@MXV@matrix\space\@MXV@element}% + \FPupn\@MXV@element{\@MXV@viewy{} #7 abs mul -1 mul #2 add}% + \xdef\@MXV@matrix{\@MXV@matrix\space\@MXV@element}% + \FPupn\@MXV@element{\@MXV@viewz{} #7 abs mul -1 mul #3 add}% + \xdef\@MXV@matrix{\@MXV@matrix\space\@MXV@element}% + } + + %macro for parsing one line of 3D views file + \newcommand{\@MXV@parseline}[5][]{% + \xdef\@MXV@xname{#1}% name of the view (optional) + \xdef\@MXV@coo{#2}% + \xdef\@MXV@ctoc{#3}% + \xdef\@MXV@roo{#4}% + \xdef\@MXV@aac{#5}% + } + + %macro for generating an array of 3D views (varray) + \def\@MXV@buildva{% + \ifthenelse{\boolean{@MXV@defaultviewprovided}}{% + \global\@MXV@viewscount=1% + }{% + \global\@MXV@viewscount=0% + }% + \xdef\@MXV@varray{}% empty varray + % + %default view + \edef\@MXV@args{\@MXV@coo\space\@MXV@ctoc\space\@MXV@roo\space}% + \expandafter\@MXV@ciiwmatrix\@MXV@args% build C2W matrix + \xdef\@MXV@xname{Default}% + \@MXV@viewobj% create pdf object of 3D view + \edef\@MXV@defaultview{\@MXV@@viewobj}% + % + %read out 3D views file + \IfFileExists{\@MXV@viewsfile}{% + \edef\@MXV@endlinechar{\the\endlinechar}% + \endlinechar=-1% suppress trailing space at input line end + \edef\@MXV@coo{}\edef\@MXV@ctoc{}\edef\@MXV@roo{}% + \newread\@MXV@@viewsfile% + \openin\@MXV@@viewsfile=\@MXV@viewsfile% + \loop% + \read\@MXV@@viewsfile to \@MXV@inputline% + \if\@MXV@inputline\relax\else% + \expandafter\@MXV@parseline\@MXV@inputline% + \edef\@MXV@args{\@MXV@coo\space\@MXV@ctoc\space\@MXV@roo\space}% + \expandafter\@MXV@ciiwmatrix\@MXV@args% build C2W matrix + \global\advance\@MXV@viewscount by 1% + \ifthenelse{\equal{\@MXV@xname}{}}{% + \xdef\@MXV@xname{View \the\@MXV@viewscount}% + }{}% + \@MXV@viewobj% create pdf object of 3D view + %append current view obj ref to VA array + \xdef\@MXV@varray{\@MXV@varray\space\@MXV@@viewobj}% + \setboolean{@MXV@viewsprovided}{true}% + \repeat% + \closein\@MXV@@viewsfile% + \endlinechar=\@MXV@endlinechar% reset endlinechar + }{}% + % + %prepend default view obj ref to VA array, if + %explicitly given or no additional views from views file available + \ifthenelse{\boolean{@MXV@defaultviewprovided}\OR% + \NOT\boolean{@MXV@viewsprovided}}{% + \xdef\@MXV@varray{\@MXV@defaultview\@MXV@varray}% + }{}% + } + + %following macros, including the 3D inclusion macro have driver specific + %implementations + \ifthenelse{\boolean{@MXV@pdf}}{% + %pdflatex versions + %macro for creating 3D view object + \ifthenelse{\NOT\boolean{@MXV@externalviewer}}{% + \def\@MXV@viewobj{% + %projection dict + \pdfobj {<</Subtype/P/FOV \@MXV@aac/PS/Min>>}% + \pdfrefobj\pdflastobj% + % + \pdfobj {<<% + /MS/M% define the view as C2W matrix + /CO \@MXV@roo% orbital radius + /P \the\pdflastobj\space 0 R% + /C2W [\@MXV@matrix]% + /XN(\@MXV@xname)% name of the view appearing in the drop down list + \@MXV@background% + >>}\pdfrefobj\pdflastobj% + \xdef\@MXV@@viewobj{\the\pdflastobj\space 0 R}% + }% + }{} + + %3D inclusion macro + \def\@MXV@includeiiid#1#2#3#4{% + %insert box or poster + \@MXV@box{#1}{#2}{#3}% + % + \ifthenelse{\NOT\boolean{@MXV@externalviewer}}{% + %java script file, stream object + \IfFileExists{\@MXV@jscriptiiidfile}{% + \pdfobj stream file {\@MXV@jscriptiiidfile}% + \pdfrefobj\pdflastobj% + \xdef\@MXV@jscriptiiid{/OnInstantiate \the\pdflastobj\space 0 R}% + }{\xdef\@MXV@jscriptiiid{}}% + % + %build the array of 3D views + \@MXV@buildva% + }{}% + % + %3D stream object, 3D files are always embedded inline + \IfFileExists{#4}{% + \pdfobj stream% + attr {% + /Subtype/\@MXV@iiidsubtype% + /VA [\@MXV@varray]% + /DV/F% use first entry in VA as default view + \@MXV@jscriptiiid% + }% + file {#4}% + \pdfrefobj\pdflastobj% + % + %insert FileAttachment annotation + \ifthenelse{\boolean{@MXV@attachment}}{% + \pdfannot width -#1 height #2 depth #3 {% + /Subtype /FileAttachment% + /F 0% + /T (#4) + /Contents (3D Object (\@MXV@mime))% + /AP <</N<<>>/R<<>>/D<<>>>>% + /FS <<% + /F(#4)% + /Type/Filespec% + /EF << /F \the\pdflastobj\space 0 R >>% + >>% + }% + }{}% + % + }{% + \PackageError{movie15}{% + File `#4' cannot be opened for embedding.\MessageBreak + 3D files are always embedded inline and must be readable + }{% + Make sure file `#4' exists and is readable! + }% + }% + % + %new annotation object of subtype `3D'% + \ifthenelse{\NOT\boolean{@MXV@externalviewer}}{% + \pdfannot width -#1 height #2 depth #3 {% + /Subtype/3D% + /F 4% we cannot put F 5 here; bug in Reader; 3D annot would be + /T (#4)% disabled even if plugin were available + /Contents (3D Object (\@MXV@mime))% + /P \@MXV@pdfpageref{@MXV@player\the\@MXV@includes.page} 0 R% + \@MXV@apdict% + /3DI \if@MXV@iiidctrls true\else false\fi% + /3DD \the\pdflastobj\space 0 R% 3D stream object + /3DA << \@MXV@activation\@MXV@deactivation >>% + }% + }{}% + }% + }{% + %dvips versions + %macro for creating 3D view object and associated projection dict + \ifthenelse{\NOT\boolean{@MXV@externalviewer}}{% + \def\@MXV@viewobj{% + %projection dict + \pdfmark{% + pdfmark=/OBJ,% + Raw={% + /_objdef {pdict\the\@MXV@includes_\the\@MXV@viewscount}% + /type/dict% + }% + }% + \pdfmark{% + pdfmark=/PUT,% + Raw={% + {pdict\the\@MXV@includes_\the\@MXV@viewscount} <<% + /Subtype/P/FOV \@MXV@aac/PS/Min% + >>% + }% + }% + % + \pdfmark{% + pdfmark=/OBJ,% + Raw={% + /type/dict% + /_objdef {viewobj\the\@MXV@includes_\the\@MXV@viewscount}% + }% + }% + \pdfmark{% + pdfmark=/PUT,% + Raw={% + {viewobj\the\@MXV@includes_\the\@MXV@viewscount} <<% + /MS/M% + /CO \@MXV@roo% + /P {pdict\the\@MXV@includes_\the\@MXV@viewscount}% + /C2W[\@MXV@matrix]% + /XN(\@MXV@xname)% + \@MXV@background% + >>% + }% + }% + \xdef\@MXV@@viewobj{{viewobj\the\@MXV@includes_\the\@MXV@viewscount}}% + }% + }{}% + % + %3D inclusion macro + \def\@MXV@includeiiid#1#2#3#4{% + \ifthenelse{\NOT\boolean{@MXV@externalviewer}}{% + %java script file, stream object + \IfFileExists{\@MXV@jscriptiiidfile}{% + \pdfmark{% + pdfmark=/OBJ,% + Raw={% + /_objdef {jscriptiiid\the\@MXV@includes}% + /type/stream% + }% + }% + \pdfmark{% + pdfmark=/PUT,% + Raw={% + {jscriptiiid\the\@MXV@includes}% + (\@MXV@jscriptiiidfile) (r) file% + }% + }% + \def\@MXV@jscriptiiid{/OnInstantiate {jscriptiiid\the\@MXV@includes}}% + }{\def\@MXV@jscriptiiid{}}% + % + %build the array of 3D views + \@MXV@buildva% + }{}% + % + %3D stream object, 3D files are always embedded inline + \IfFileExists{#4}{% + \pdfmark{% + pdfmark=/OBJ,% + Raw={% + /_objdef {iiiDfile\the\@MXV@includes}% + /type/stream% + }% + }% + \pdfmark{% + pdfmark=/PUT,% + Raw={% + {iiiDfile\the\@MXV@includes} <<% + /Subtype/\@MXV@iiidsubtype% + /VA [\@MXV@varray]% + /DV/F% + \@MXV@jscriptiiid% + >>% + }% + }% + \pdfmark{% + pdfmark=/PUT,% + Raw={% + {iiiDfile\the\@MXV@includes}% + (#4) (r) file% + }% + }% + }{% + \PackageError{movie15}{% + File `#4' cannot be opened for embedding.\MessageBreak + 3D files are always embedded inline and must be readable + }{% + Make sure file `#4' exists and is readable! + }% + }% + % + %insert FileAttachment annotation + \ifthenelse{\boolean{@MXV@attachment}}{% + \makebox[0pt][l]{% + \pdfmark[\@MXV@box{#1}{#2}{#3}]{% + pdfmark=/ANN,% + Subtype=/FileAttachment,% + Raw={% + /F 0% + /T (#4) + /Contents (3D Object (\@MXV@mime))% + /AP <</N<<>>/R<<>>/D<<>>>>% + /FS <<% + /F(#4)% + /Type/Filespec% + /EF <</F {iiiDfile\the\@MXV@includes}>>% + >>% + }% + }% + }% + }{}% + %annotation object of subtype `3D' + \ifthenelse{\NOT\boolean{@MXV@externalviewer}}{% + \pdfmark[\@MXV@box{#1}{#2}{#3}]{% + pdfmark=/ANN,% + Subtype=/3D,% + Raw={% + /F 4% + /T (#4) + /Contents (3D Object (\@MXV@mime))% + /P {ThisPage}% + \@MXV@apdict% + /3DI \if@MXV@iiidctrls true\else false\fi% + /3DD {iiiDfile\the\@MXV@includes}% + /3DA << \@MXV@activation\@MXV@deactivation >>% + }% + }% + }{}% + }% + }% +}{} + +%settings for newly opened media players +\def\@MXV@settings#1#2#3#4#5#6#7{% + var settings = {% + privateData: {% + paused: false + }, + autoPlay: false, + visible: false, + volume: #7 + #1% showUI (controls) + #2% palindrome + #3% repeat + #4% rate + #5% startAt + #6% endAt + }; +} + +%JavaScript event handler routines for 2D media activation +\def\@MXV@events#1#2#3{% #1: playerid, #2: mouse?, #3: autoplay? + var events = new app.media.Events({% + %on focus change from one movie to another, events are fired in the + %following order: (1) onBlur, (2) onFocus, (3) afterBlur, (4) afterFocus + onBlur: function (e) {% + if(focusonplayer > 0){% + focusonplayer = 0; + } + }, + afterBlur: function (e) {% + %only resume if we click outside of any media + if(focusonplayer == 0){% + try{e.target.play();}catch(e){} + } + }, + onFocus: function (e) {% + focusonplayer = #1; + }, + afterFocus: function (e) {% + if(!e.target.isPlaying){%play on click if paused + try{ + e.target.play(); + if(!e.target.isPlaying){%still not playing?! + %sometimes play() fails, in particular if the movie has reached + %its end while having the focus; but this works: + e.target.seek(e.target.settings.startAt); + e.target.play(); + } + } + catch (e){} + } + \@MXV@if{#2}% + else{% + %media can only be paused if mouse option is set + try{e.target.pause();}catch (e){} + } + \fi% + e.target.visible = true; + }, + onPlay: function (e) {% + e.target.settings.privateData.paused = false; + }, + onPause: function (e) {% + e.target.settings.privateData.paused = true; + }, + afterReady: function (e) {% + try{ + e.target.play(); + e.target.pause(); + e.target.stop(); + e.target.settings.privateData.paused = false; + e.target.seek(e.target.settings.startAt); + e.target.visible = true; + \@MXV@if{#3} e.target.play();\fi + } + catch (e){} + } + }); +}% + +%output driver specific implementations of the 2D inclusion macro +\ifthenelse{\boolean{@MXV@pdf}}{% + %pdfLaTeX version + \def\@MXV@includemovie#1#2#3#4{% + %insert box or poster + \@MXV@box{#1}{#2}{#3}% + % + \ifthenelse{\NOT\boolean{@MXV@externalviewer}}{% + %new action dict + \pdfobj reserveobjnum% + \@MXV@adict=\pdflastobj% + % + %new additional actions dict + \pdfobj reserveobjnum% + \@MXV@aadict=\pdflastobj% + % + }{}% + %embedded file entry `/EF' + \ifthenelse{\boolean{@MXV@inline}}{% + \IfFileExists{#4}{% + \pdfobj stream file {#4}% + \pdfrefobj\pdflastobj% + \edef\@MXV@efentry{% + /EF << /F \the\pdflastobj\space 0 R >>% + }% + }{% + \PackageError{movie15}{% + File `#4' cannot be opened for embedding.\MessageBreak + Did you forget to set option `url' or `inline=false'? + }{% + Try any of the options `url' or `inline=false'! + }% + }% + }{\def\@MXV@efentry{}}% + % + %new file specification object + \pdfobj {<<% + /F(#4)% + \@MXV@fsentry% + \@MXV@efentry% + /Type/Filespec% + >>}\pdfrefobj\pdflastobj% + \edef\@MXV@filespec{\the\pdflastobj}% + % + %insert FileAttachment annotation + \ifthenelse{\boolean{@MXV@inline}\AND\boolean{@MXV@attachment}}{% + \pdfannot width -#1 height #2 depth #3 {% + /Subtype /FileAttachment% + /F 0% + /T (#4) + /Contents (Media File (\@MXV@mime))% + /AP <</N<<>>/R<<>>/D<<>>>>% + /FS \@MXV@filespec\space 0 R% + }% + }{}% + % + \ifthenelse{\NOT\boolean{@MXV@externalviewer}}{% + %new annotation object of subtype `Screen'% + \pdfannot width -#1 height #2 depth #3 {% + /Subtype /Screen% + /Border [0 0 0]% no border (PDF-1.1) + /BS <</Type/Border/S/S/W 0>>% no border (PDF-1.5) + /F 5% disable annot if multimedia is not available + /T (#4) + /Contents (Media File (\@MXV@mime))% + /P \@MXV@pdfpageref{@MXV@player\the\@MXV@includes.page} 0 R% + /A \the\@MXV@adict\space 0 R% + /AA \the\@MXV@aadict\space 0 R% + \@MXV@apdict% + }\edef\@MXV@screenannot{\the\pdflastannot}% + %label for later annot obj number determination + \ifx\@MXV@label\@empty\else% + \@MXV@labeltoaux{@MXV@\@MXV@label.annot}{\@MXV@screenannot}% + \fi% + % + %new media clip object of subtype `Media Clip Data' (/S/MCD) + \pdfobj {<<% + /D \@MXV@filespec\space 0 R% + /P <</TF(TEMPACCESS)>>% + /S/MCD% + /CT (\@MXV@mime)% + >>}\pdfrefobj\pdflastobj% + % + %new rendition object of subtype `Media Rendition' (/S/MR) + \pdfobj {<<% + /C \the\pdflastobj\space 0 R% + /S/MR% + /P <<% + /BE <<% + /F 2% + \@MXV@@repeat\@MXV@@volume\@MXV@@ctrls% + /D <</S /F>>%movie remains opened + >>% + >>% + >>}\edef\@MXV@mediarendition{\the\pdflastobj}\pdfrefobj\pdflastobj% + %label for later rendition obj number determination + \ifx\@MXV@label\@empty\else% + \@MXV@labeltoaux{@MXV@\@MXV@label.rendition}{\@MXV@mediarendition}% + \fi% + % + %action dictionary + \pdfobj useobjnum \@MXV@adict {<<% + /R \@MXV@mediarendition\space 0 R% + /S/Rendition% + /OP 0% fallback if /JS doesn't work or is empty + \@MXV@activationjsentry% + /AN \@MXV@screenannot\space 0 R% + >>}\pdfrefobj\pdflastobj% + % + %create play/stop/resume/pause actions + \pdfobj {<<% + /R \@MXV@mediarendition\space 0 R% + /S/Rendition% + \@MXV@pageopenopentry% /OP fallback if /JS doesn't work + \@MXV@pageopenjsentry% + /AN \@MXV@screenannot\space 0 R% + >>}\edef\@MXV@pageopenaction{\the\pdflastobj}\pdfrefobj\pdflastobj% + % + \pdfobj {<<% + /R \@MXV@mediarendition\space 0 R% + /S/Rendition% + \@MXV@pagecloseopentry% + \@MXV@pageclosejsentry% + /AN \@MXV@screenannot\space 0 R% + >>}\edef\@MXV@pagecloseaction{\the\pdflastobj}\pdfrefobj\pdflastobj% + % + %populate additional actions dictionary + \pdfobj useobjnum \@MXV@aadict {<<% + /PO \@MXV@pageopenaction\space 0 R% + /PC \@MXV@pagecloseaction\space 0 R% + >>}\pdfrefobj\pdflastobj% + }{}% + }% +}{% + %dvips version + \def\@MXV@includemovie#1#2#3#4{% + %insert FileAttachment annotation + \ifthenelse{\boolean{@MXV@inline}\AND\boolean{@MXV@attachment}}{% + \makebox[0pt][l]{% + \pdfmark[\@MXV@box{#1}{#2}{#3}]{% + pdfmark=/ANN,% + Subtype=/FileAttachment,% + Raw={% + /F 0% + /T (#4) + /Contents (Media File (\@MXV@mime))% + /AP <</N<<>>/R<<>>/D<<>>>>% + /FS {filespec\the\@MXV@includes}% + }% + }% + }% + }{}% + % + \ifthenelse{\NOT\boolean{@MXV@externalviewer}}{% + %new annotation object of subtype `Screen'% + \pdfmark[\@MXV@box{#1}{#2}{#3}]{% + pdfmark=/ANN,% + Subtype=/Screen,% + Border={0 0 0},% + Raw={% + /_objdef {screenannot\the\@MXV@includes}% + /F 5% + /T (#4) + /Contents (Media File (\@MXV@mime))% + /BS <</W 0/Type/Border/S/S>>% + /P {ThisPage}% + /AA {aadict\the\@MXV@includes}% + \@MXV@apdict% + }% + }% + % + %entire action entry moved outside screen annotation + %to workaround a ghostscript bug + \pdfmark{% + pdfmark=/PUT,% + Raw={% + {screenannot\the\@MXV@includes} <<% + /A <<% + /R {mediarendition\the\@MXV@includes}% + /S/Rendition% + /OP 0% fallback, if /JS doesn't work or is empty + \@MXV@activationjsentry% + /AN {screenannot\the\@MXV@includes}% + >>% + >>% + }% + }% + % + %new rendition object of subtype `Media Rendition' (/S/MR) + \pdfmark{% + pdfmark=/OBJ,% + Raw={% + /type/dict% + /_objdef {mediarendition\the\@MXV@includes}% + }% + }% + \pdfmark{% + pdfmark=/PUT,% + Raw={% + {mediarendition\the\@MXV@includes} <<% + /C {mediaclipdata\the\@MXV@includes}% + /S/MR% + /P <<%Media Play Parameters + /BE <<%Parameters need only be honored by the player in + %the best effort sense + /F 2%scale media's width and height to fit the + %annotation rectangle + \@MXV@@repeat\@MXV@@volume\@MXV@@ctrls% + /D <</S /F>>%movie remains opened + >>% + >>% + >>% + }% + }% + % + %new media clip object of subtype `Media Clip Data' (/S/MCD) + \pdfmark{% + pdfmark=/OBJ,% + Raw={% + /_objdef {mediaclipdata\the\@MXV@includes}% + /type/dict% + }% + }% + \pdfmark{% + pdfmark=/PUT,% + Raw={% + {mediaclipdata\the\@MXV@includes} <<% + /D {filespec\the\@MXV@includes}% + /P <</TF(TEMPACCESS)>>% + /S/MCD% + /CT (\@MXV@mime)% mime type + >>% + }% + }% + }{}% + % + %new file specification object + \pdfmark{% + pdfmark=/OBJ,% + Raw={% + /_objdef {filespec\the\@MXV@includes}% + /type/dict% + }% + }% + \pdfmark{% + pdfmark=/PUT,% + Raw={% + {filespec\the\@MXV@includes} <<% + \@MXV@fsentry + /F(#4)% file name + /Type/Filespec% + >>% + }% + }% + % + %embedded file entry `/EF' + \ifthenelse{\boolean{@MXV@inline}}{% + \IfFileExists{#4}{% + %new stream object + \pdfmark{% + pdfmark=/OBJ,% + Raw={% + /_objdef {fstream\the\@MXV@includes}% + /type/stream% + }% + }% + \pdfmark{% + pdfmark=/PUT,% + Raw={% + {fstream\the\@MXV@includes}% + (#4) (r) file% read in file contents + }% + }% + \pdfmark{% + pdfmark=/PUT,% + Raw={% + {fstream\the\@MXV@includes} <<% + /Type/EmbeddedFile% + >>% + }% + }% + % put the embedded file entry into file spec object + \pdfmark{% + pdfmark=/PUT,% + Raw={% + {filespec\the\@MXV@includes} <<% + /EF << /F {fstream\the\@MXV@includes} >>% + >>% + }% + }% + }{% + \PackageError{movie15}{% + File `#4' cannot be opened for embedding.\MessageBreak + Did you forget to set option `url' or `inline=false'? + }{% + Try any of the options `url' or `inline=false'! + }% + }% + }{}% + % + \ifthenelse{\NOT\boolean{@MXV@externalviewer}}{% + %create actions for page open/close events + \pdfmark{% + pdfmark=/OBJ,% + Raw={% + /_objdef {pageopenaction\the\@MXV@includes}% + /type/dict% + }% + }% + \pdfmark{% + pdfmark=/PUT,% + Raw={% + {pageopenaction\the\@MXV@includes} <<% + /R {mediarendition\the\@MXV@includes}% + /S/Rendition% + \@MXV@pageopenopentry% /OP fallback, if /JS doesn't work + \@MXV@pageopenjsentry% + /AN {screenannot\the\@MXV@includes}% + >>% + }% + }% + \pdfmark{% + pdfmark=/OBJ,% + Raw={% + /_objdef {pagecloseaction\the\@MXV@includes}% + /type/dict% + }% + }% + \pdfmark{% + pdfmark=/PUT,% + Raw={% + {pagecloseaction\the\@MXV@includes} <<% + /R {mediarendition\the\@MXV@includes}% + /S/Rendition% + \@MXV@pagecloseopentry% + \@MXV@pageclosejsentry% + /AN {screenannot\the\@MXV@includes}% + >>% + }% + }% + % + %create and populate additional actions dictionary, always add entries + %for page open/close events + \pdfmark{% + pdfmark=/OBJ,% + Raw={% + /type/dict% + /_objdef {aadict\the\@MXV@includes}% + }% + }% + % + \pdfmark{% + pdfmark=/PUT,% + Raw={% + {aadict\the\@MXV@includes} <<% + /PO {pageopenaction\the\@MXV@includes}% + /PC {pagecloseaction\the\@MXV@includes}% + >>% + }% + }% + }{}% + }% +} + +%definition of user command `\includemovie' +\newcommand{\includemovie}[4][]{% + \leavevmode% + \global\advance\@MXV@includes by 1%increment counter + \@MXV@reset% all macros and options + \setkeys{movie15}{#1}% parse options + %guess the mime type based on the filename extension + \ifthenelse{\equal{\@MXV@mime}{@MXV@auto}}{\@MXV@guessmime{#4}}{}% + % + \ifthenelse{\NOT\boolean{@MXV@externalviewer}}{% + %label this annotation for later page number determination (if pdfLaTeX or + % if `label' option is set) + \ifthenelse{\boolean{@MXV@pdf}\OR\NOT\equal{\@MXV@label}{}}{% + \@MXV@labeltoaux{@MXV@player\the\@MXV@includes.page}{% + \noexpand\the\@MXV@page}% + }{}% + % + %test for hyperref package + \ifthenelse{\NOT\boolean{@MXV@pdf}\AND\isundefined{\pdfmark}}{% + \@MXV@missing{hyperref}% + }{}% + % + %depending on options do content specific settings + \ifthenelse{\boolean{@MXV@iiiDfeat}\AND\boolean{@MXV@iiid}}{% + % #### 3D #### + \ifthenelse{\boolean{@MXV@autoplay}\OR\boolean{@MXV@autoresume}}{% + \def\@MXV@activation{/A/PV/AIS/L}% open 3D object, run animation + }{% + \ifthenelse{\boolean{@MXV@runposter}}{% + \def\@MXV@activation{/A/PV/AIS/I}%open 3D obj but don't run animation + }{% + \def\@MXV@activation{/A/XA}% explicit activation by user + }% + }% + \ifthenelse{\boolean{@MXV@autostop}}{% + \def\@MXV@deactivation{/D/PI/DIS/U}% + }{% + \ifthenelse{\boolean{@MXV@autopause}}{% + \def\@MXV@deactivation{/D/PI/DIS/I}% + }{%@MXV@continue + \def\@MXV@deactivation{/D/PI/DIS/L}% + }% + }% + }{%#### 2D #### + \ifx\@MXV@startat\@empty% default start position + \gdef\@MXV@startat{, startAt: 0}% + \fi% + %label this annotation for later player id number determination (pdftex & + %dvips) + write player settings to aux file + \ifx\@MXV@label\@empty\else% + %check for multiply-defined labels first + \ifthenelse{% + \NOT\equal{\@MXV@getlabelvalue{@MXV@\@MXV@label.playerid}}{undefined}% + \AND% + \NOT\equal{\@MXV@getlabelvalue{@MXV@\@MXV@label.playerid}}{% + \the\@MXV@includes}% + }{% + \PackageWarning{movie15}{% + Label `\@MXV@label' multiply defined% + }% + \ifthenelse{\isundefined{\@MXV@multiwarning}}{% + \gdef\@MXV@multiwarning{}% + \AtEndDocument{% + \PackageWarningNoLine{movie15}{% + @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\MessageBreak + @@ There were multiply-defined labels! @@\MessageBreak + @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}% + }% + }{}% + }{}% + \@MXV@labeltoaux{@MXV@\@MXV@label.playerid}{\the\@MXV@includes}% + \@MXV@labeltoaux{@MXV@\@MXV@label.mouse}{% + \if@MXV@mouse true\else false\fi}% + \@MXV@labeltoaux{@MXV@\@MXV@label.showUI}{\@MXV@ctrls}% + \@MXV@labeltoaux{@MXV@\@MXV@label.palindrome}{\@MXV@palindrome}% + \@MXV@labeltoaux{@MXV@\@MXV@label.repeat}{\@MXV@repeat}% + \@MXV@labeltoaux{@MXV@\@MXV@label.rate}{\@MXV@rate}% + \@MXV@labeltoaux{@MXV@\@MXV@label.startAt}{\@MXV@startat}% + \@MXV@labeltoaux{@MXV@\@MXV@label.endAt}{\@MXV@endat}% + \@MXV@labeltoaux{@MXV@\@MXV@label.volume}{\@MXV@volume}% + \@MXV@labeltoaux{@MXV@\@MXV@label.autoplay}{% + \if@MXV@autoplay true\else false\fi}% + \fi% + % + \ifthenelse{\boolean{@MXV@autoplay}\OR\boolean{@MXV@runposter}}{% + \xdef\@MXV@pageopenopentry{/OP 4}% + }{% + \ifthenelse{\boolean{@MXV@autoresume}}{% + \xdef\@MXV@pageopenopentry{/OP 3}% + }{% + \xdef\@MXV@pageopenopentry{/OP 2}% + }% + }% + % + \ifthenelse{\boolean{@MXV@autostop}}{% + \xdef\@MXV@pagecloseopentry{/OP 1}% + }{% + \ifthenelse{\boolean{@MXV@autopause}}{% + \xdef\@MXV@pagecloseopentry{/OP 2}% + }{% @MXV@continue + \xdef\@MXV@pagecloseopentry{/OP 3}% + }% + }% + % + %JavaScripts for playback control + %script for page invisible event + \ifthenelse{\boolean{@MXV@autopause}}{% + \xdef\@MXV@pageclosejsentry{% + /JS ( + try{% + if(player\the\@MXV@includes.isPlaying){% + player\the\@MXV@includes.pause(); + } + focusonplayer = -1; %page change + player\the\@MXV@includes.visible = false; + } + catch(e){} + )% + }% + }{% + \ifthenelse{\boolean{@MXV@autostop}}{% + \xdef\@MXV@pageclosejsentry{% + /JS ( + try{% + %players tend to be buggy, always stop from playing state + if(!player\the\@MXV@includes.isPlaying){ + player\the\@MXV@includes.play(); + } + player\the\@MXV@includes.stop(); + player\the\@MXV@includes.seek(% + player\the\@MXV@includes.settings.startAt); + focusonplayer = -1; + player\the\@MXV@includes.visible = false; + } + catch(e){} + )% + }% + }{% + \xdef\@MXV@pageclosejsentry{%@MXV@continue + /JS ( + try{% + focusonplayer = -1; %page change + player\the\@MXV@includes.visible = false; + } + catch(e){} + )% + }% + }% + }% + % + %script for activation/resume on page open event + \xdef\@MXV@pageopenjsentry{% + /JS ( + try{% + if(player\the\@MXV@includes.isOpen){% + player\the\@MXV@includes.visible = true; + % + %start or resume media which have autoplay option set; + %also resume paused media which have autoresume option set + \if@MXV@autoplay% + player\the\@MXV@includes.play(); + if(!player\the\@MXV@includes.isPlaying){% still not playing?! + player\the\@MXV@includes.seek(% + player\the\@MXV@includes.settings.startAt); + player\the\@MXV@includes.play(); + } + \else% + \if@MXV@autoresume% + if(player\the\@MXV@includes.settings.privateData.paused){% + player\the\@MXV@includes.play(); + if(!player\the\@MXV@includes.isPlaying){% + player\the\@MXV@includes.seek(% + player\the\@MXV@includes.settings.startAt); + player\the\@MXV@includes.play(); + } + } + \fi% + \fi% + } + else{% + throw "isClosed";% + } + } + catch(e){% + \@MXV@if{\if@MXV@autoplay true\else\if@MXV@runposter true\else % + false\fi\fi}% + if(focusonplayer == undefined){% + var focusonplayer = 0; %shared by all annots + } + \@MXV@settings{\@MXV@ctrls}{\@MXV@palindrome}{\@MXV@repeat}% + {\@MXV@rate}{\@MXV@startat}{\@MXV@endat}{\@MXV@volume}% + \@MXV@events{\the\@MXV@includes}% + {\if@MXV@mouse true\else false\fi}% + {\if@MXV@autoplay true\else false\fi}% + var player\the\@MXV@includes\space = app.media.openPlayer({% + settings: settings, + events: events + }); + \fi% + } + ) + }% + % + %script for normal activation by mouse click + \xdef\@MXV@activationjsentry{% + /JS ( + if(focusonplayer == undefined){% + var focusonplayer = 0; %shared by all annots + } + \@MXV@settings{\@MXV@ctrls}{\@MXV@palindrome}{\@MXV@repeat}% + {\@MXV@rate}{\@MXV@startat}{\@MXV@endat}{\@MXV@volume}% + \@MXV@events{\the\@MXV@includes}{\if@MXV@mouse true\else false\fi}% + {true}% + var player\the\@MXV@includes\space = app.media.openPlayer({% + settings: settings, + events: events + }); + ) + }% + }% + }{}% + % + %total height of text + \@MXV@totalheight=\@MXV@height% + \advance\@MXV@totalheight by \@MXV@depth% + %traiselen = distance at which text is to be raised to centre it vertically + %braiselen = vertical centre of media box (auxiliary measure) + \@MXV@traiselen=0.5\@MXV@height% + \advance\@MXV@traiselen by -0.5\@MXV@depth% + % + \ifthenelse{\equal{#3}{}}{% no height argument + \@MXV@braiselen=0.5\@MXV@height% + }{%override height of text, height argument given + \@MXV@braiselen=#3% + \@MXV@braiselen=0.5\@MXV@braiselen% + \setlength{\@MXV@height}{#3}% + }% + % + \ifthenelse{\equal{\@MXV@boxdepth}{}}{% no depth option given + \ifthenelse{\lengthtest{\@MXV@totalheight>\@MXV@height}}{% + %depth of text only taken into account, if its total height + %is smaller than the height of the display box + \advance\@MXV@braiselen by -0.5\@MXV@depth% + }{% + \@MXV@depth=0pt% + }% + }{%override depth of text, depth option given + \setlength{\@MXV@@boxdepth}{\@MXV@boxdepth}% + \advance\@MXV@braiselen by -0.5\@MXV@@boxdepth% + \setlength{\@MXV@depth}{\@MXV@boxdepth}% + }% + %finally centre text vertically + \ifthenelse{\NOT\equal{#3}{}\OR\NOT\equal{\@MXV@boxdepth}{}}{% + \advance\@MXV@traiselen by -\@MXV@braiselen% + \@MXV@traiselen=-\@MXV@traiselen% + \savebox{\@MXV@textbox}{\raisebox{\@MXV@traiselen}[0pt][0pt]{% + \usebox{\@MXV@textbox}}}% + }{}% + \ifthenelse{\equal{#2}{}}{}{%override horiz. dimension of text + \setlength{\@MXV@width}{#2}% + %centre text horizontally + \savebox{\@MXV@textbox}{\makebox[\@MXV@width][c]{\usebox{\@MXV@textbox}}}% + }% + % + %insert textbox, obscured by poster + \ifthenelse{\boolean{@MXV@boxopt}}{% + \ifthenelse{\boolean{@MXV@textoverposter}}{}{% + \makebox[0pt][l]{\usebox{\@MXV@textbox}}% + }% + }{}% + % + %appearance dict dummy, to be shared by all 2D and 3D annots + \ifthenelse{\NOT\boolean{@MXV@externalviewer}}{% + \ifthenelse{\isundefined{\@MXV@apdict}}{% + \ifthenelse{\boolean{@MXV@pdf}}{% + \pdfobj stream {}\pdfrefobj\pdflastobj% + \xdef\@MXV@apdict{/AP << /N \the\pdflastobj\space 0 R >>}% + }{% + \pdfmark{% + pdfmark=/OBJ,% + Raw={% + /_objdef {apdict}% + /type/stream% + }% + }% + \pdfmark{% + pdfmark=/PUT,% + Raw={% + {apdict}% + ()% + }% + }% + \xdef\@MXV@apdict{/AP << /N {apdict}>>}% + }% + }{}% + }{}% + % + %insert annotation + \ifthenelse{\boolean{@MXV@externalviewer}\AND\NOT\boolean{@MXV@inline}}{% + \ifthenelse{\isundefined{\href}}{% + \@MXV@missing{hyperref}% + }{}% + \ifthenelse{\boolean{@MXV@url}}{% + \href{#4}{\@MXV@box{\@MXV@width}{\@MXV@height}{\@MXV@depth}}% + }{% + \IfFileExists{#4}{% + \href{run:#4}{\@MXV@box{\@MXV@width}{\@MXV@height}{\@MXV@depth}}% + }{% + \AtEndDocument{% + \PackageWarning{movie15}{% + File: `#4'\MessageBreak + could not be found in the current directory.\MessageBreak + Maybe it is a URL and you simply forgot to set\MessageBreak + option `url' + }% + }% + }% + }% + }{% + \ifthenelse{\boolean{@MXV@iiiDfeat}\AND\boolean{@MXV@iiid}}{% + \@MXV@includeiiid{\@MXV@width}{\@MXV@height}{\@MXV@depth}{#4}% + }{% + \@MXV@includemovie{\@MXV@width}{\@MXV@height}{\@MXV@depth}{#4}% + }% + }% + % + %insert textbox, overprinting the poster + \ifthenelse{\boolean{@MXV@boxopt}}{% + \ifthenelse{\boolean{@MXV@textoverposter}}{% + \makebox[0pt][r]{\usebox{\@MXV@textbox}}% + }{}% + }{}% +} + +%for remote control of media +\newcommand\movieref[3][]{% + \leavevmode% + % + \@MXV@reset% + % + %check if label is defined at all + \ifthenelse{\equal{\@MXV@getlabelvalue{@MXV@#2.playerid}}{undefined}}{% + \PackageWarning{movie15}{% + Reference `#2' on page \thepage \space undefined% + }% + \ifthenelse{\isundefined{\@MXV@undefwarning}}{% + \gdef\@MXV@undefwarning{}% + \AtEndDocument{% + \PackageWarningNoLine{movie15}{% + @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\MessageBreak + @@ There were undefined references! @@\MessageBreak + @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}% + }% + }{}% + }{}% + % + %retrieve original settings + \ifthenelse{\equal{\@MXV@getlabelvalue{@MXV@#2.mouse}}{true}}{% + \setboolean{@MXV@mouse}{true}% + }{% + \setboolean{@MXV@mouse}{false}% + }% + \edef\@MXV@ctrls{\@MXV@getlabelvalue{@MXV@#2.showUI}}% + \edef\@MXV@palindrome{\@MXV@getlabelvalue{@MXV@#2.palindrome}}% + \edef\@MXV@repeat{\@MXV@getlabelvalue{@MXV@#2.repeat}}% + \edef\@MXV@rate{\@MXV@getlabelvalue{@MXV@#2.rate}}% + \edef\@MXV@startat{\@MXV@getlabelvalue{@MXV@#2.startAt}}% + \edef\@MXV@endat{\@MXV@getlabelvalue{@MXV@#2.endAt}}% + \edef\@MXV@volume{\@MXV@getlabelvalue{@MXV@#2.volume}}% + \setkeys{movie15}{#1}%override with new settings + % + %get page number + \edef\@MXV@playerpage{\@MXV@getlabelvalue{@MXV@player\@MXV@getlabelvalue{@MXV@#2.playerid}.page}}% + % + \edef\@MXV@operation{}% + %create /OP and /JS entries + \if@MXV@linkplay + \edef\@MXV@operation{% + /OP 0% + /JS ( + if(focusonplayer == undefined){% + var focusonplayer = 0; %shared by all annots + } + \@MXV@settings{\@MXV@ctrls}{\@MXV@palindrome}{\@MXV@repeat}% + {\@MXV@rate}{\@MXV@startat}{\@MXV@endat}{\@MXV@volume}% + \@MXV@events{\@MXV@getlabelvalue{@MXV@#2.playerid}}% + {\if@MXV@mouse true\else false\fi}{true}% + try{ + if(player\@MXV@getlabelvalue{@MXV@#2.playerid}.isOpen){% + player\@MXV@getlabelvalue{@MXV@#2.playerid}.close(% + app.media.closeReason.general); + player\@MXV@getlabelvalue{@MXV@#2.playerid}\space = null; + } + } + catch(e){} + % + this.pageNum = \@MXV@playerpage -1;%zero based + % + try{ + var player\@MXV@getlabelvalue{@MXV@#2.playerid}\space = % + app.media.openPlayer({% + settings: settings, + events: events + }); + } + catch (e){} + ) + }% + \fi% + \if@MXV@linkresume% resume/pause + \edef\@MXV@operation{% + /OP 3% + /JS ( + try{% + this.pageNum = \@MXV@playerpage - 1; + player\@MXV@getlabelvalue{@MXV@#2.playerid}.visible = true; + if(!player\@MXV@getlabelvalue{@MXV@#2.playerid}.isPlaying){% + player\@MXV@getlabelvalue{@MXV@#2.playerid}.play(); + if(!player\@MXV@getlabelvalue{@MXV@#2.playerid}.isPlaying){% + %media at end will restart + player\@MXV@getlabelvalue{@MXV@#2.playerid}.seek(% + player\@MXV@getlabelvalue{@MXV@#2.playerid}.settings.startAt); + player\@MXV@getlabelvalue{@MXV@#2.playerid}.play(); + } + } + else{% + player\@MXV@getlabelvalue{@MXV@#2.playerid}.pause(); + } + } + catch(e){}% + ) + }% + \fi% + \if@MXV@linkstop% + \edef\@MXV@operation{% + /OP 1% + /JS ( + try{% + if(!player\@MXV@getlabelvalue{@MXV@#2.playerid}.isPlaying){ + player\@MXV@getlabelvalue{@MXV@#2.playerid}.play(); + } + player\@MXV@getlabelvalue{@MXV@#2.playerid}.stop(); + player\@MXV@getlabelvalue{@MXV@#2.playerid}.seek(% + player\@MXV@getlabelvalue{@MXV@#2.playerid}.settings.startAt); + } + catch(e){} + this.pageNum = \@MXV@playerpage - 1; + )% + }% + \fi% + \if@MXV@linkpause% pause/resume + \edef\@MXV@operation{% + /OP 2% + /JS ( + this.pageNum = \@MXV@playerpage - 1; + try{% + player\@MXV@getlabelvalue{@MXV@#2.playerid}.visible = true; + if(!player\@MXV@getlabelvalue{@MXV@#2.playerid}.isPlaying){% + player\@MXV@getlabelvalue{@MXV@#2.playerid}.play(); + if(!player\@MXV@getlabelvalue{@MXV@#2.playerid}.isPlaying){% + %media at end will restart + player\@MXV@getlabelvalue{@MXV@#2.playerid}.seek(% + player\@MXV@getlabelvalue{@MXV@#2.playerid}.settings.startAt); + player\@MXV@getlabelvalue{@MXV@#2.playerid}.play(); + } + } + else{% + player\@MXV@getlabelvalue{@MXV@#2.playerid}.pause(); + } + } + catch(e){}% + ) + }% + \fi% + \if@MXV@linkclose% + \edef\@MXV@operation{% + /OP 1% + /JS ( + try{% + player\@MXV@getlabelvalue{@MXV@#2.playerid}.close(% + app.media.closeReason.general); + player\@MXV@getlabelvalue{@MXV@#2.playerid}\space = null; + } + catch(e){} + this.pageNum = \@MXV@playerpage - 1; + )% + }% + \fi% + \if@MXV@linkreset% reset to orig. settings + %retrieve original settings + \ifthenelse{\equal{\@MXV@getlabelvalue{@MXV@#2.mouse}}{true}}{% + \setboolean{@MXV@mouse}{true}% + }{% + \setboolean{@MXV@mouse}{false}% + }% + \ifthenelse{\equal{\@MXV@getlabelvalue{@MXV@#2.autoplay}}{true}}{% + \setboolean{@MXV@autoplay}{true}% + }{% + \setboolean{@MXV@autoplay}{false}% + }% + % + \edef\@MXV@operation{% + /OP 0% + /JS ( + if(focusonplayer == undefined){% + var focusonplayer = 0; %shared by all annots + } + \@MXV@settings{\@MXV@getlabelvalue{@MXV@#2.showUI}}% + {\@MXV@getlabelvalue{@MXV@#2.palindrome}}% + {\@MXV@getlabelvalue{@MXV@#2.repeat}}% + {\@MXV@getlabelvalue{@MXV@#2.rate}}% + {\@MXV@getlabelvalue{@MXV@#2.startAt}}% + {\@MXV@getlabelvalue{@MXV@#2.endAt}}% + {\@MXV@getlabelvalue{@MXV@#2.volume}}% + \@MXV@events{\@MXV@getlabelvalue{@MXV@#2.playerid}}% + {\if@MXV@mouse true\else false\fi}% + {\if@MXV@autoplay true\else false\fi}% + try{ + if(player\@MXV@getlabelvalue{@MXV@#2.playerid}.isOpen){% + player\@MXV@getlabelvalue{@MXV@#2.playerid}.close(% + app.media.closeReason.general); + player\@MXV@getlabelvalue{@MXV@#2.playerid}\space = null; + } + } + catch(e){} + % + this.pageNum = \@MXV@playerpage - 1; + % + try{ + var player\@MXV@getlabelvalue{@MXV@#2.playerid}\space = % + app.media.openPlayer({% + settings: settings, + events: events + }); + } + catch (e){} + ) + }% + \fi% + % + \savebox{\@MXV@textbox}{#3}% save text argument + \ifthenelse{\boolean{@MXV@pdf}}{% + \pdfstartlink% + attr{ + \ifx\@pdfborder\@empty\else% + /Border [\@pdfborder]% + \fi% + \ifx\@linkbordercolor\@empty% + /C [1 0 0]% hyperref default + \else% + /C [\@linkbordercolor]% + \fi% + \ifx\@pdfhighlight\@empty\else% + /H \@pdfhighlight% + \fi% + }% + user{% + /Subtype /Link% + /A <<% + /S /Rendition% + /R \@MXV@getlabelvalue{@MXV@#2.rendition}\space 0 R% + /AN \@MXV@getlabelvalue{@MXV@#2.annot}\space 0 R% + \@MXV@operation% + >>% + }% + \usebox{\@MXV@textbox}% write out text box + \pdfendlink% + }{% + \advance\@MXV@links by 1%increment counter + \pdfmark[{\usebox{\@MXV@textbox}}]{% + pdfmark=/ANN,% + Subtype=/Link,% + %ghostscript bug leads to wrong border width in final PDF +% Border=\@pdfborder, + Color=\@linkbordercolor,% + AcroHighlight=\@pdfhighlight,% + Raw={% + /_objdef {linkannot\the\@MXV@links}% + }% + }% + % + %entire action entry moved outside screen annotation + %to workaround a ghostscript bug + \pdfmark{% + pdfmark=/PUT,% + Raw={% + {linkannot\the\@MXV@links} <<% + /A <<% + /S /Rendition% + /R {mediarendition\@MXV@getlabelvalue{@MXV@#2.playerid}}% + /AN {screenannot\@MXV@getlabelvalue{@MXV@#2.playerid}}% + \@MXV@operation% + >>% + >>% + }% + }% + }% +} + +%key definitions for options to \includemovie +\define@key{movie15}{label}{%for use with movieref + \gdef\@MXV@label{#1}% +} +\define@key{movie15}{controls}[true]{% + \xdef\@MXV@ctrls{, showUI: #1}% + \xdef\@MXV@@ctrls{/C #1}% + \ifthenelse{\boolean{@MXV@iiiDfeat}}{% + \setboolean{@MXV@iiidctrls}{#1}% + }{}% +} +\define@key{movie15}{volume}{% + \def\@MXV@@volume{/V #1}% + \def\@MXV@volume{#1}% +} +\define@key{movie15}{mimetype}{% + \ifthenelse{\equal{#1}{model/u3d}}{% + \ifthenelse{\boolean{@MXV@iiiDfeat}}{% + \setboolean{@MXV@iiid}{true}% + \xdef\@MXV@iiidsubtype{U3D}% + }{\@MXV@neediiiD}% + }{}% + \def\@MXV@mime{#1}% +} +\define@key{movie15}{autoplay}[true]{% + \setboolean{@MXV@autoplay}{#1}% + \ifthenelse{\boolean{@MXV@autoplay}}{% + \setboolean{@MXV@autoresume}{false}% + }{}% +} +\define@key{movie15}{autostop}[true]{% + \setboolean{@MXV@autostop}{#1}% + \ifthenelse{\boolean{@MXV@autostop}}{% + \setboolean{@MXV@autopause}{false}% + }{}% +} +\define@key{movie15}{autoresume}[true]{% + \setboolean{@MXV@autoresume}{#1}% + \ifthenelse{\boolean{@MXV@autoresume}}{% + \setboolean{@MXV@autoplay}{false}% + }{}% +} +\define@key{movie15}{autopause}[true]{% + \setboolean{@MXV@autopause}{#1}% + \ifthenelse{\boolean{@MXV@autopause}}{% + \setboolean{@MXV@autostop}{false}% + }{}% +} +\define@key{movie15}{continue}[true]{% + \setboolean{@MXV@autostop}{false}% + \setboolean{@MXV@autopause}{false}% +} +\define@key{movie15}{open}[true]{% + %no longer supported; once open, media remains loaded + %to avoid reloading when media is to be played again +} +\define@key{movie15}{mouse}[true]{% + \setboolean{@MXV@mouse}{#1}% +} +\define@key{movie15}{palindrome}[true]{% + \xdef\@MXV@palindrome{, palindrome: #1}% +} +\define@key{movie15}{rate}{% + \xdef\@MXV@rate{, rate: #1}% +} +\define@key{movie15}{repeat}[Infinity]{% + \ifthenelse{% + \equal{#1}{Infinity}\OR% + \equal{#1}{0}% + }{% + \xdef\@MXV@repeat{, repeat: Infinity}% + \xdef\@MXV@@repeat{/RC 0}% + }{% + \xdef\@MXV@repeat{, repeat: #1}% + \xdef\@MXV@@repeat{/RC #1}% + }% +} +\define@key{movie15}{startat}{% + \xdef\@MXV@startat{, startAt: {#1}}% +} +\define@key{movie15}{endat}{% + \xdef\@MXV@endat{, endAt: {#1}}% +} +\define@key{movie15}{poster}[true]{% + \ifthenelse{\equal{#1}{true}}{% option without arg + \setboolean{@MXV@runposter}{true}% + }{% + \def\@MXV@box##1##2##3{% + \ifthenelse{\boolean{@MXV@pdf}}{% + \mbox{\pdfximage width ##1 height ##2 depth ##3 {#1}}% + \pdfrefximage\pdflastximage% + }{% + \ifthenelse{\isundefined{\includegraphics}}{% + \@MXV@missing{graphicx}% + }{% + \@MXV@totalheight=##2% + \advance\@MXV@totalheight by ##3% + \raisebox{-##3}[##2][##3]{% + \includegraphics[% + width=##1,height=##2,totalheight=\@MXV@totalheight,clip]{#1}% + }% + }% + }% + }% + }% +} +\define@key{movie15}{externalviewer}[true]{% + \setboolean{@MXV@externalviewer}{#1}% +} +\define@key{movie15}{inline}[true]{% + \ifthenelse{\boolean{@MXV@url}}{% + \setboolean{@MXV@inline}{false}% + }{% + \setboolean{@MXV@inline}{#1}% + }% + \ifthenelse{\boolean{@MXV@inline}}{}{% + \setboolean{@MXV@attachment}{false}% + }% +} +\define@key{movie15}{url}[true]{% + \setboolean{@MXV@url}{#1}% + \ifthenelse{\boolean{@MXV@url}}{% + \setboolean{@MXV@inline}{false}% + \def\@MXV@fsentry{/FS /URL}% + }{}% +} +\define@key{movie15}{attach}[true]{% + \setboolean{@MXV@attachment}{#1}% + \ifthenelse{\boolean{@MXV@attachment}}{% + \setboolean{@MXV@inline}{true}% + }{}% +} +\define@key{movie15}{text}{% + \setboolean{@MXV@boxopt}{true}% + \savebox{\@MXV@textbox}{#1}% + \@MXV@width=\wd\@MXV@textbox% + \@MXV@height=\ht\@MXV@textbox% + \@MXV@depth=\dp\@MXV@textbox% +} +\define@key{movie15}{textoverposter}[true]{% + \setboolean{@MXV@textoverposter}{#1}% +} +\define@key{movie15}{depth}{%set depth of display area + \gdef\@MXV@boxdepth{#1}% +} +%3D specific options +\define@key{movie15}{3Dbg}{% + \def\@MXV@background{/BG<</CS/DeviceRGB/C[#1]>>}% +} +\define@key{movie15}{3Djscript}{% + \IfFileExists{#1}{% + \def\@MXV@jscriptiiidfile{#1}% + }{% + \PackageError{movie15}{Script file `#1' cannot be opened for embedding% + }{% + Make sure file `#1' exists and is readable!% + }% + }% +} +\define@key{movie15}{3Dcoo}{% + \ifthenelse{\boolean{@MXV@iiiDfeat}}{% + \def\@MXV@coo{#1}% + \setboolean{@MXV@defaultviewprovided}{true}% + }{\@MXV@neediiiD}% +} +\define@key{movie15}{3Dc2c}{% + \ifthenelse{\boolean{@MXV@iiiDfeat}}{% + \def\@MXV@ctoc{#1}% + \setboolean{@MXV@defaultviewprovided}{true}% + }{\@MXV@neediiiD}% +} +\define@key{movie15}{3Droo}{% + \ifthenelse{\boolean{@MXV@iiiDfeat}}{% + \def\@MXV@roo{#1}% + \setboolean{@MXV@defaultviewprovided}{true}% + }{\@MXV@neediiiD}% +} +\define@key{movie15}{3Daac}{% + \ifthenelse{\boolean{@MXV@iiiDfeat}}{% + \def\@MXV@aac{#1}% + \setboolean{@MXV@defaultviewprovided}{true}% + }{\@MXV@neediiiD}% +} +\define@key{movie15}{3Dviews}{% + \IfFileExists{#1}{% + \def\@MXV@viewsfile{#1}% + }{% + \PackageError{movie15}{3D views file `#1' cannot be opened% + }{% + Make sure file `#1' exists and is readable!% + }% + }% +} +%options for \movieref command +\define@key{movie15}{play}[true]{% + \setboolean{@MXV@linkplay}{#1}% + \ifthenelse{\boolean{@MXV@linkplay}}{% + \setboolean{@MXV@linkpause}{false}% + \setboolean{@MXV@linkresume}{false}% + \setboolean{@MXV@linkstop}{false}% + \setboolean{@MXV@linkclose}{false}% + \setboolean{@MXV@linkreset}{false}% + }{}% +} +\define@key{movie15}{pause}[true]{% + \setboolean{@MXV@linkpause}{#1}% + \ifthenelse{\boolean{@MXV@linkpause}}{% + \setboolean{@MXV@linkresume}{false}% + \setboolean{@MXV@linkstop}{false}% + \setboolean{@MXV@linkclose}{false}% + \setboolean{@MXV@linkreset}{false}% + \setboolean{@MXV@linkplay}{false}% + }{}% +} +\define@key{movie15}{resume}[true]{% + \setboolean{@MXV@linkresume}{#1}% + \ifthenelse{\boolean{@MXV@linkresume}}{% + \setboolean{@MXV@linkpause}{false}% + \setboolean{@MXV@linkstop}{false}% + \setboolean{@MXV@linkclose}{false}% + \setboolean{@MXV@linkreset}{false}% + \setboolean{@MXV@linkplay}{false}% + }{}% +} +\define@key{movie15}{stop}[true]{% + \setboolean{@MXV@linkstop}{#1}% + \ifthenelse{\boolean{@MXV@linkstop}}{% + \setboolean{@MXV@linkpause}{false}% + \setboolean{@MXV@linkresume}{false}% + \setboolean{@MXV@linkclose}{false}% + \setboolean{@MXV@linkreset}{false}% + \setboolean{@MXV@linkplay}{false}% + }{}% +} +\define@key{movie15}{close}[true]{% + \setboolean{@MXV@linkclose}{#1}% + \ifthenelse{\boolean{@MXV@linkclose}}{% + \setboolean{@MXV@linkpause}{false}% + \setboolean{@MXV@linkresume}{false}% + \setboolean{@MXV@linkstop}{false}% + \setboolean{@MXV@linkreset}{false}% + \setboolean{@MXV@linkplay}{false}% + }{}% +} +\define@key{movie15}{reset}[true]{% + \setboolean{@MXV@linkreset}{#1}% + \ifthenelse{\boolean{@MXV@linkreset}}{% + \setboolean{@MXV@linkpause}{false}% + \setboolean{@MXV@linkresume}{false}% + \setboolean{@MXV@linkstop}{false}% + \setboolean{@MXV@linkclose}{false}% + \setboolean{@MXV@linkplay}{false}% + }{}% +} + +%compatibility macros +\newcommand\movie[3][]{% + \leavevmode% + \@MXV@reset% + \def\@MXV@autostart{}\def\@MXV@loop{}\def\@MXV@showcontrols{}% + \def\@MXV@starttime{}\def\@MXV@durationtime{}% + \setkeys{movie15}{#1}% + % + %sanity checks + \if@MXV@boxopt% + \PackageError{movie15}{% + Option `text' cannot be used with command `\string\movie'.\MessageBreak + Instead, put text into the 1st argument of `\string\movie' + }{}% + \fi% + % + \ifx\@MXV@durationtime\@empty\else\ifx\@MXV@startat\@empty\else% + \PackageError{movie15}{% + Options `startat' and `duration' cannot be used\MessageBreak + together.\MessageBreak + Possible combinations are `startat'/`endat',\MessageBreak + `start'/`endat' or `start'/`duration' + }{}% + \fi\fi% + % + %option list + \edef\@MXV@movieoptions{#1\@MXV@autostart\@MXV@loop\@MXV@showcontrols}% + % + %determine playback section + \ifx\@MXV@starttime\@empty\else% + \edef\@MXV@movieoptions{\@MXV@movieoptions, % + startat=time:\strip@pt\@MXV@start}% + \fi% + \ifx\@MXV@durationtime\@empty\else% + \advance\@MXV@end by \@MXV@start% + \edef\@MXV@movieoptions{\@MXV@movieoptions, % + endat=time:\strip@pt\@MXV@end}% + \fi% + % + %text option from 2nd argument + \savebox{\@MXV@textbox}{#2}% + \edef\@MXV@movieoptions{[\@MXV@movieoptions, text={\noexpand\usebox{% + \noexpand\@MXV@textbox}}]}% + \expandafter\includemovie\@MXV@movieoptions{\@MXV@boxwidth}{\@MXV@boxheight}% + {#3}% +} + +\newcommand\hyperlinkmovie[3][]{% + \leavevmode% + \@MXV@reset% + \def\@MXV@autostart{}\def\@MXV@loop{}\def\@MXV@showcontrols{}% + \def\@MXV@starttime{}\def\@MXV@durationtime{}% + \setkeys{movie15}{#1}% + % + %sanity check + \ifx\@MXV@durationtime\@empty\else\ifx\@MXV@startat\@empty\else% + \PackageError{movie15}{% + Options `startat' and `duration' cannot be used\MessageBreak + together.\MessageBreak + Possible combinations are `startat'/`endat',\MessageBreak + `start'/`endat' or `start'/`duration' + }{}% + \fi\fi% + % + %option list + \edef\@MXV@movieoptions{#1\@MXV@autostart\@MXV@loop\@MXV@showcontrols}% + % + %determine playback section + \ifx\@MXV@starttime\@empty\else% + \edef\@MXV@movieoptions{\@MXV@movieoptions, % + startat=time:\strip@pt\@MXV@start}% + \fi% + \ifx\@MXV@durationtime\@empty\else% + \advance\@MXV@end by \@MXV@start% + \edef\@MXV@movieoptions{\@MXV@movieoptions, % + endat=time:\strip@pt\@MXV@end}% + \fi% + % + \edef\@MXV@movieoptions{[\@MXV@movieoptions]}% + \expandafter\movieref\@MXV@movieoptions{#2}{#3}% +} + +%compatibility options for \movie and \hyperlinkmovie commands +\define@key{movie15}{borderwidth}{% + %ignored; acroread doesn't draw borders around screen annots anyway +} +\define@key{movie15}{height}{%set height of display area + \gdef\@MXV@boxheight{#1}% +} +\define@key{movie15}{width}{%set width of display area + \gdef\@MXV@boxwidth{#1}% +} +\define@key{movie15}{autostart}[true]{% + \xdef\@MXV@autostart{, autoplay=#1}% +} +\define@key{movie15}{loop}[Infinity]{% + \xdef\@MXV@loop{, repeat=#1}% +} +\define@key{movie15}{once}[]{% + \xdef\@MXV@loop{, repeat=1}% +} +\define@key{movie15}{showcontrols}[true]{% + \xdef\@MXV@showcontrols{, controls=#1}% +} +\define@key{movie15}{start}{% + \gdef\@MXV@starttime##1s{% + \global\@MXV@start=##1pt% + }% + \@MXV@starttime #1% +} +\define@key{movie15}{duration}{% + \gdef\@MXV@durationtime##1s{% + \global\@MXV@end=##1pt% + }% + \@MXV@durationtime #1% +} |