diff options
Diffstat (limited to 'Build/source/libs/poppler/poppler-0.33.0/poppler/Movie.cc')
-rw-r--r-- | Build/source/libs/poppler/poppler-0.33.0/poppler/Movie.cc | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/Build/source/libs/poppler/poppler-0.33.0/poppler/Movie.cc b/Build/source/libs/poppler/poppler-0.33.0/poppler/Movie.cc new file mode 100644 index 00000000000..f68b6adcd4d --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.33.0/poppler/Movie.cc @@ -0,0 +1,285 @@ +//********************************************************************************* +// Movie.cc +//--------------------------------------------------------------------------------- +// +//--------------------------------------------------------------------------------- +// Hugo Mercier <hmercier31[at]gmail.com> (c) 2008 +// Pino Toscano <pino@kde.org> (c) 2008 +// Carlos Garcia Campos <carlosgc@gnome.org> (c) 2010 +// Albert Astals Cid <aacid@kde.org> (c) 2010 +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//********************************************************************************* + +#include <math.h> +#include "Movie.h" +#include "FileSpec.h" + +MovieActivationParameters::MovieActivationParameters() { + // default values + floatingWindow = gFalse; + xPosition = 0.5; + yPosition = 0.5; + rate = 1.0; + volume = 100; + showControls = gFalse; + synchronousPlay = gFalse; + repeatMode = repeatModeOnce; + start.units = 0; + duration.units = 0; + znum = 1; + zdenum = 1; +} + +MovieActivationParameters::~MovieActivationParameters() { +} + +void MovieActivationParameters::parseMovieActivation(Object* aDict) { + Object obj1; + + if (!aDict->dictLookup("Start", &obj1)->isNull()) { + if (obj1.isInt()) { + // If it is representable as an integer (subject to the implementation limit for + // integers, as described in Appendix C), it should be specified as such. + + start.units = obj1.getInt(); + } else if (obj1.isString()) { + // If it is not representable as an integer, it should be specified as an 8-byte + // string representing a 64-bit twos-complement integer, most significant + // byte first. + + // UNSUPPORTED + } else if (obj1.isArray()) { + Array* a = obj1.getArray(); + + Object tmp; + a->get(0, &tmp); + if (tmp.isInt()) { + start.units = tmp.getInt(); + } + if (tmp.isString()) { + // UNSUPPORTED + } + tmp.free(); + + a->get(1, &tmp); + if (tmp.isInt()) { + start.units_per_second = tmp.getInt(); + } + tmp.free(); + } + } + obj1.free(); + + if (!aDict->dictLookup("Duration", &obj1)->isNull()) { + if (obj1.isInt()) { + duration.units = obj1.getInt(); + } else if (obj1.isString()) { + // UNSUPPORTED + } else if (obj1.isArray()) { + Array* a = obj1.getArray(); + + Object tmp; + a->get(0, &tmp); + if (tmp.isInt()) { + duration.units = tmp.getInt(); + } + if (tmp.isString()) { + // UNSUPPORTED + } + tmp.free(); + + a->get(1, &tmp); + if (tmp.isInt()) { + duration.units_per_second = tmp.getInt(); + } + tmp.free(); + } + } + obj1.free(); + + if (aDict->dictLookup("Rate", &obj1)->isNum()) { + rate = obj1.getNum(); + } + obj1.free(); + + if (aDict->dictLookup("Volume", &obj1)->isNum()) { + // convert volume to [0 100] + volume = int((obj1.getNum() + 1.0) * 50); + } + obj1.free(); + + if (aDict->dictLookup("ShowControls", &obj1)->isBool()) { + showControls = obj1.getBool(); + } + obj1.free(); + + if (aDict->dictLookup("Synchronous", &obj1)->isBool()) { + synchronousPlay = obj1.getBool(); + } + obj1.free(); + + if (aDict->dictLookup("Mode", &obj1)->isName()) { + char* name = obj1.getName(); + if (!strcmp(name, "Once")) { + repeatMode = repeatModeOnce; + } else if (!strcmp(name, "Open")) { + repeatMode = repeatModeOpen; + } else if (!strcmp(name, "Repeat")) { + repeatMode = repeatModeRepeat; + } else if (!strcmp(name,"Palindrome")) { + repeatMode = repeatModePalindrome; + } + } + obj1.free(); + + if (aDict->dictLookup("FWScale", &obj1)->isArray()) { + // the presence of that entry implies that the movie is to be played + // in a floating window + floatingWindow = gTrue; + + Array* scale = obj1.getArray(); + if (scale->getLength() >= 2) { + Object tmp; + if (scale->get(0, &tmp)->isInt()) { + znum = tmp.getInt(); + } + tmp.free(); + if (scale->get(1, &tmp)->isInt()) { + zdenum = tmp.getInt(); + } + tmp.free(); + } + } + obj1.free(); + + if (aDict->dictLookup("FWPosition", &obj1)->isArray()) { + Array* pos = obj1.getArray(); + if (pos->getLength() >= 2) { + Object tmp; + if (pos->get(0, &tmp)->isNum()) { + xPosition = tmp.getNum(); + } + tmp.free(); + if (pos->get(1, &tmp)->isNum()) { + yPosition = tmp.getNum(); + } + tmp.free(); + } + } + obj1.free(); +} + +void Movie::parseMovie (Object *movieDict) { + fileName = NULL; + rotationAngle = 0; + width = -1; + height = -1; + showPoster = gFalse; + + Object obj1, obj2; + if (getFileSpecNameForPlatform(movieDict->dictLookup("F", &obj1), &obj2)) { + fileName = obj2.getString()->copy(); + obj2.free(); + } else { + error (errSyntaxError, -1, "Invalid Movie"); + ok = gFalse; + obj1.free(); + return; + } + obj1.free(); + + if (movieDict->dictLookup("Aspect", &obj1)->isArray()) { + Array* aspect = obj1.getArray(); + if (aspect->getLength() >= 2) { + Object tmp; + if( aspect->get(0, &tmp)->isNum() ) { + width = (int)floor( aspect->get(0, &tmp)->getNum() + 0.5 ); + } + tmp.free(); + if( aspect->get(1, &tmp)->isNum() ) { + height = (int)floor( aspect->get(1, &tmp)->getNum() + 0.5 ); + } + tmp.free(); + } + } + obj1.free(); + + if (movieDict->dictLookup("Rotate", &obj1)->isInt()) { + // round up to 90° + rotationAngle = (((obj1.getInt() + 360) % 360) % 90) * 90; + } + obj1.free(); + + // + // movie poster + // + if (!movieDict->dictLookupNF("Poster", &poster)->isNull()) { + if (poster.isRef() || poster.isStream()) { + showPoster = gTrue; + } else if (poster.isBool()) { + showPoster = poster.getBool(); + poster.free(); + } else { + poster.free(); + } + } +} + +Movie::~Movie() { + if (fileName) + delete fileName; + poster.free(); +} + +Movie::Movie(Object *movieDict) { + ok = gTrue; + + if (movieDict->isDict()) + parseMovie(movieDict); + else + ok = gFalse; +} + +Movie::Movie(Object *movieDict, Object *aDict) { + ok = gTrue; + + if (movieDict->isDict()) { + parseMovie(movieDict); + if (aDict->isDict()) + MA.parseMovieActivation(aDict); + } else { + ok = gFalse; + } +} + +void Movie::getFloatingWindowSize(int *widthA, int *heightA) +{ + *widthA = int(width * double(MA.znum) / MA.zdenum); + *heightA = int(height * double(MA.znum) / MA.zdenum); +} + +Movie* Movie::copy() { + + // call default copy constructor + Movie* new_movie = new Movie(*this); + + if (fileName) + new_movie->fileName = fileName->copy(); + + poster.copy(&new_movie->poster); + + return new_movie; +} |