source: trunk/poppler/mypoppler/poppler/Movie.cc @ 461

Last change on this file since 461 was 461, checked in by Silvan Scherrer, 11 years ago

poppler update to 0.14.2

File size: 7.0 KB
Line 
1//*********************************************************************************
2//                               Movie.cc
3//---------------------------------------------------------------------------------
4//
5//---------------------------------------------------------------------------------
6// Hugo Mercier <hmercier31[at]gmail.com> (c) 2008
7// Pino Toscano <pino@kde.org> (c) 2008
8// Carlos Garcia Campos <carlosgc@gnome.org> (c) 2010
9//
10// This program is free software; you can redistribute it and/or modify
11// it under the terms of the GNU General Public License as published by
12// the Free Software Foundation; either version 2 of the License, or
13// (at your option) any later version.
14//
15// This program is distributed in the hope that it will be useful,
16// but WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18// GNU General Public License for more details.
19//
20// You should have received a copy of the GNU General Public License
21// along with this program; if not, write to the Free Software
22// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23//*********************************************************************************
24
25#include <math.h>
26#include "Movie.h"
27#include "FileSpec.h"
28
29MovieActivationParameters::MovieActivationParameters() {
30  // default values
31  floatingWindow = gFalse;
32  xPosition = 0.5;
33  yPosition = 0.5;
34  rate = 1.0;
35  volume = 100;
36  showControls = gFalse;
37  synchronousPlay = gFalse;
38  repeatMode = repeatModeOnce;
39  start.units = 0;
40  duration.units = 0;
41  znum = 1;
42  zdenum = 1;
43}
44
45MovieActivationParameters::~MovieActivationParameters() {
46}
47
48void MovieActivationParameters::parseMovieActivation(Object* aDict) {
49  Object obj1;
50
51  if (!aDict->dictLookup("Start", &obj1)->isNull()) {
52    if (obj1.isInt()) {
53      // If it is representable as an integer (subject to the implementation limit for
54      // integers, as described in Appendix C), it should be specified as such.
55
56      start.units = obj1.getInt();
57    } else if (obj1.isString()) {
58      // If it is not representable as an integer, it should be specified as an 8-byte
59      // string representing a 64-bit twos-complement integer, most significant
60      // byte first.
61
62      // UNSUPPORTED
63    } else if (obj1.isArray()) {
64      Array* a = obj1.getArray();
65
66      Object tmp;
67      a->get(0, &tmp);
68      if (tmp.isInt()) {
69        start.units = tmp.getInt();
70      }
71      if (tmp.isString()) {
72        // UNSUPPORTED
73      }
74      tmp.free();
75
76      a->get(1, &tmp);
77      if (tmp.isInt()) {
78        start.units_per_second = tmp.getInt();
79      }
80      tmp.free();
81    }
82  }
83  obj1.free();
84
85  if (!aDict->dictLookup("Duration", &obj1)->isNull()) {
86    if (obj1.isInt()) {
87      duration.units = obj1.getInt();
88    } else if (obj1.isString()) {
89      // UNSUPPORTED
90    } else if (obj1.isArray()) {
91      Array* a = obj1.getArray();
92
93      Object tmp;
94      a->get(0, &tmp);
95      if (tmp.isInt()) {
96        duration.units = tmp.getInt();
97      }
98      if (tmp.isString()) {
99        // UNSUPPORTED
100      }
101      tmp.free();
102
103      a->get(1, &tmp);
104      if (tmp.isInt()) {
105        duration.units_per_second = tmp.getInt();
106      }
107      tmp.free();
108    }
109  }
110  obj1.free();
111
112  if (aDict->dictLookup("Rate", &obj1)->isNum()) {
113    rate = obj1.getNum();
114  }
115  obj1.free();
116
117  if (aDict->dictLookup("Volume", &obj1)->isNum()) {
118    // convert volume to [0 100]
119    volume = int((obj1.getNum() + 1.0) * 50);
120  }
121  obj1.free();
122
123  if (aDict->dictLookup("ShowControls", &obj1)->isBool()) {
124    showControls = obj1.getBool();
125  }
126  obj1.free();
127
128  if (aDict->dictLookup("Synchronous", &obj1)->isBool()) {
129    synchronousPlay = obj1.getBool();
130  }
131  obj1.free();
132
133  if (aDict->dictLookup("Mode", &obj1)->isName()) {
134    char* name = obj1.getName();
135    if (!strcmp(name, "Once")) {
136      repeatMode = repeatModeOnce;
137    } else if (!strcmp(name, "Open")) {
138      repeatMode = repeatModeOpen;
139    } else if (!strcmp(name, "Repeat")) {
140      repeatMode = repeatModeRepeat;
141    } else if (!strcmp(name,"Palindrome")) {
142      repeatMode = repeatModePalindrome;
143    }
144  }
145  obj1.free();
146
147  if (aDict->dictLookup("FWScale", &obj1)->isArray()) {
148    // the presence of that entry implies that the movie is to be played
149    // in a floating window
150    floatingWindow = gTrue;
151
152    Array* scale = obj1.getArray();
153    if (scale->getLength() >= 2) {
154      Object tmp;
155      if (scale->get(0, &tmp)->isInt()) {
156        znum = tmp.getInt();
157      }
158      tmp.free();
159      if (scale->get(1, &tmp)->isInt()) {
160        zdenum = tmp.getInt();
161      }
162      tmp.free();
163    }
164  }
165  obj1.free();
166
167  if (aDict->dictLookup("FWPosition", &obj1)->isArray()) {
168    Array* pos = obj1.getArray();
169    if (pos->getLength() >= 2) {
170      Object tmp;
171      if (pos->get(0, &tmp)->isNum()) {
172        xPosition = tmp.getNum();
173      }
174      tmp.free();
175      if (pos->get(1, &tmp)->isNum()) {
176        yPosition = tmp.getNum();
177      }
178      tmp.free();
179    }
180  }
181  obj1.free();
182}
183
184void Movie::parseMovie (Object *movieDict) {
185  fileName = NULL;
186  rotationAngle = 0;
187  width = -1;
188  height = -1;
189  showPoster = gFalse;
190
191  Object obj1, obj2;
192  if (getFileSpecNameForPlatform(movieDict->dictLookup("F", &obj1), &obj2)) {
193    fileName = obj2.getString()->copy();
194    obj2.free();
195  } else {
196    error (-1, "Invalid Movie");
197    ok = gFalse;
198    obj1.free();
199    return;
200  }
201  obj1.free();
202
203  if (movieDict->dictLookup("Aspect", &obj1)->isArray()) {
204    Array* aspect = obj1.getArray();
205    if (aspect->getLength() >= 2) {
206      Object tmp;
207      if( aspect->get(0, &tmp)->isNum() ) {
208        width = (int)floor( aspect->get(0, &tmp)->getNum() + 0.5 );
209      }
210      tmp.free();
211      if( aspect->get(1, &tmp)->isNum() ) {
212        height = (int)floor( aspect->get(1, &tmp)->getNum() + 0.5 );
213      }
214      tmp.free();
215    }
216  }
217  obj1.free();
218
219  if (movieDict->dictLookup("Rotate", &obj1)->isInt()) {
220    // round up to 90°
221    rotationAngle = (((obj1.getInt() + 360) % 360) % 90) * 90;
222  }
223  obj1.free();
224
225  //
226  // movie poster
227  //
228  if (!movieDict->dictLookupNF("Poster", &poster)->isNull()) {
229    if (poster.isRef() || poster.isStream()) {
230      showPoster = gTrue;
231    } else if (poster.isBool()) {
232      showPoster = obj1.getBool();
233      poster.free();
234    } else {
235      poster.free();
236    }
237  }
238}
239
240Movie::~Movie() {
241  if (fileName)
242    delete fileName;
243  poster.free();
244}
245
246Movie::Movie(Object *movieDict) {
247  ok = gTrue;
248
249  if (movieDict->isDict())
250    parseMovie(movieDict);
251  else
252    ok = gFalse;
253}
254
255Movie::Movie(Object *movieDict, Object *aDict) {
256  ok = gTrue;
257
258  if (movieDict->isDict()) {
259    parseMovie(movieDict);
260    if (aDict->isDict())
261      MA.parseMovieActivation(aDict);
262  } else {
263    ok = gFalse;
264  }
265}
266
267void Movie::getFloatingWindowSize(int *widthA, int *heightA)
268{
269  *widthA = int(width * double(MA.znum) / MA.zdenum);
270  *heightA = int(height * double(MA.znum) / MA.zdenum);
271}
272
273Movie* Movie::copy() {
274
275  // call default copy constructor
276  Movie* new_movie = new Movie(*this);
277
278  if (fileName)
279    new_movie->fileName = fileName->copy();
280
281  poster.copy(&new_movie->poster);
282
283  return new_movie;
284}
Note: See TracBrowser for help on using the repository browser.