diff options
Diffstat (limited to 'Build/source/libs/poppler/poppler-src/poppler/Rendition.cc')
-rw-r--r-- | Build/source/libs/poppler/poppler-src/poppler/Rendition.cc | 222 |
1 files changed, 100 insertions, 122 deletions
diff --git a/Build/source/libs/poppler/poppler-src/poppler/Rendition.cc b/Build/source/libs/poppler/poppler-src/poppler/Rendition.cc index c040bf2b4a8..89bf1a50cf5 100644 --- a/Build/source/libs/poppler/poppler-src/poppler/Rendition.cc +++ b/Build/source/libs/poppler/poppler-src/poppler/Rendition.cc @@ -7,6 +7,7 @@ // Pino Toscano <pino@kde.org> (c) 2008 // Carlos Garcia Campos <carlosgc@gnome.org> (c) 2010 // Tobias Koenig <tobias.koenig@kdab.com> (c) 2012 +// Albert Astals Cid <aacid@kde.org> (C) 2017 // // 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 @@ -44,26 +45,26 @@ MediaWindowParameters::~MediaWindowParameters() { } void MediaWindowParameters::parseFWParams(Object* obj) { - Object tmp; - - if (obj->dictLookup("D", &tmp)->isArray()) { + Object tmp = obj->dictLookup("D"); + if (tmp.isArray()) { Array * dim = tmp.getArray(); if (dim->getLength() >= 2) { - Object dd; - if (dim->get(0, &dd)->isInt()) { + Object dd = dim->get(0); + if (dd.isInt()) { width = dd.getInt(); } - dd.free(); - if (dim->get(1, &dd)->isInt()) { + + dd = dim->get(1); + if (dd.isInt()) { height = dd.getInt(); } - dd.free(); + } } - tmp.free(); - if (obj->dictLookup("RT", &tmp)->isInt()) { + tmp = obj->dictLookup("RT"); + if (tmp.isInt()) { int t = tmp.getInt(); switch(t) { case 0: relativeTo = windowRelativeToDocument; break; @@ -71,9 +72,9 @@ void MediaWindowParameters::parseFWParams(Object* obj) { case 2: relativeTo = windowRelativeToDesktop; break; } } - tmp.free(); - if (obj->dictLookup("P",&tmp)->isInt()) { + tmp = obj->dictLookup("P"); + if (tmp.isInt()) { int t = tmp.getInt(); switch(t) { @@ -115,21 +116,19 @@ void MediaWindowParameters::parseFWParams(Object* obj) { break; } } - tmp.free(); - if (obj->dictLookup("T", &tmp)->isBool()) { + tmp = obj->dictLookup("T"); + if (tmp.isBool()) { hasTitleBar = tmp.getBool(); } - tmp.free(); - if (obj->dictLookup("UC", &tmp)->isBool()) { + tmp = obj->dictLookup("UC"); + if (tmp.isBool()) { hasCloseButton = tmp.getBool(); } - tmp.free(); - if (obj->dictLookup("R", &tmp)->isInt()) { + tmp = obj->dictLookup("R"); + if (tmp.isInt()) { isResizeable = (tmp.getInt() != 0); } - tmp.free(); - } MediaParameters::MediaParameters() { @@ -148,20 +147,18 @@ MediaParameters::~MediaParameters() { } void MediaParameters::parseMediaPlayParameters(Object* obj) { - - Object tmp; - - if (obj->dictLookup("V", &tmp)->isInt()) { + Object tmp = obj->dictLookup("V"); + if (tmp.isInt()) { volume = tmp.getInt(); } - tmp.free(); - if (obj->dictLookup("C", &tmp)->isBool()) { + tmp = obj->dictLookup("C"); + if (tmp.isBool()) { showControls = tmp.getBool(); } - tmp.free(); - if (obj->dictLookup("F", &tmp)->isInt()) { + tmp = obj->dictLookup("F"); + if (tmp.isInt()) { int t = tmp.getInt(); switch(t) { @@ -173,47 +170,42 @@ void MediaParameters::parseMediaPlayParameters(Object* obj) { case 5: fittingPolicy = fittingUndefined; break; } } - tmp.free(); // duration parsing // duration's default value is set to 0, which means : intrinsinc media duration - if (obj->dictLookup("D", &tmp)->isDict()) { - Object oname, ddict, tmp2; - if (tmp.dictLookup("S", &oname)->isName()) { + tmp = obj->dictLookup("D"); + if (tmp.isDict()) { + Object oname = tmp.dictLookup("S"); + if (oname.isName()) { char* name = oname.getName(); if (!strcmp(name, "F")) duration = -1; // infinity else if (!strcmp(name, "T")) { - if (tmp.dictLookup("T", &ddict)->isDict()) { - if (ddict.dictLookup("V", &tmp2)->isNum()) { + Object ddict = tmp.dictLookup("T"); + if (ddict.isDict()) { + Object tmp2 = ddict.dictLookup("V"); + if (tmp2.isNum()) { duration = Gulong(tmp2.getNum()); } - tmp2.free(); } - ddict.free(); } } - oname.free(); } - tmp.free(); - - if (obj->dictLookup("A", &tmp)->isBool()) { + tmp = obj->dictLookup("A"); + if (tmp.isBool()) { autoPlay = tmp.getBool(); } - tmp.free(); - if (obj->dictLookup("RC", &tmp)->isNum()) { + tmp = obj->dictLookup("RC"); + if (tmp.isNum()) { repeatCount = tmp.getNum(); } - tmp.free(); - } void MediaParameters::parseMediaScreenParameters(Object* obj) { - Object tmp; - - if (obj->dictLookup("W", &tmp)->isInt()) { + Object tmp = obj->dictLookup("W"); + if (tmp.isInt()) { int t = tmp.getInt(); switch(t) { @@ -223,102 +215,84 @@ void MediaParameters::parseMediaScreenParameters(Object* obj) { case 3: windowParams.type = MediaWindowParameters::windowEmbedded; break; } } - tmp.free(); // background color - if (obj->dictLookup("B", &tmp)->isArray()) { + tmp = obj->dictLookup("B"); + if (tmp.isArray()) { Array* color = tmp.getArray(); - Object component; - - color->get(0, &component); + Object component = color->get(0); bgColor.r = component.getNum(); - component.free(); - color->get(1, &component); + component = color->get(1); bgColor.g = component.getNum(); - component.free(); - color->get(2, &component); + component = color->get(2); bgColor.b = component.getNum(); - component.free(); } - tmp.free(); - // opacity - if (obj->dictLookup("O", &tmp)->isNum()) { + tmp = obj->dictLookup("O"); + if (tmp.isNum()) { opacity = tmp.getNum(); } - tmp.free(); if (windowParams.type == MediaWindowParameters::windowFloating) { - Object winDict; - if (obj->dictLookup("F",&winDict)->isDict()) { + Object winDict = obj->dictLookup("F"); + if (winDict.isDict()) { windowParams.parseFWParams(&winDict); } - winDict.free(); } } MediaRendition::~MediaRendition() { - if (fileName) - delete fileName; - if (contentType) - delete contentType; - - if (embeddedStream && (!embeddedStream->decRef())) { - delete embeddedStream; - } + delete fileName; + delete contentType; } MediaRendition::MediaRendition(Object* obj) { - Object tmp, tmp2; GBool hasClip = gFalse; ok = gTrue; fileName = NULL; contentType = NULL; isEmbedded = gFalse; - embeddedStream = NULL; // // Parse media clip data // - if (obj->dictLookup("C", &tmp2)->isDict()) { // media clip + Object tmp2 = obj->dictLookup("C"); + if (tmp2.isDict()) { // media clip hasClip = gTrue; - if (tmp2.dictLookup("S", &tmp)->isName()) { + Object tmp = tmp2.dictLookup("S"); + if (tmp.isName()) { if (!strcmp(tmp.getName(), "MCD")) { // media clip data - Object obj1, obj2; - if (tmp2.dictLookup("D", &obj1)->isDict()) { - if (obj1.dictLookup("F", &obj2)->isString()) { + Object obj1 = tmp2.dictLookup("D"); + if (obj1.isDict()) { + Object obj2 = obj1.dictLookup("F"); + if (obj2.isString()) { fileName = obj2.getString()->copy(); } - obj2.free(); - if (obj1.dictLookup("EF", &obj2)->isDict()) { - Object embedded; - if (obj2.dictLookup("F", &embedded)->isStream()) { + obj2 = obj1.dictLookup("EF"); + if (obj2.isDict()) { + Object embedded = obj2.dictLookup("F"); + if (embedded.isStream()) { isEmbedded = gTrue; - embeddedStream = embedded.getStream(); - // "copy" stream - embeddedStream->incRef(); + embeddedStreamObject = embedded.copy(); } - embedded.free(); } - obj2.free(); // TODO: D might be a form XObject too } else { error (errSyntaxError, -1, "Invalid Media Clip Data"); ok = gFalse; } - obj1.free(); // FIXME: ignore CT if D is a form XObject - if (tmp2.dictLookup("CT", &obj1)->isString()) { + obj1 = tmp2.dictLookup("CT"); + if (obj1.isString()) { contentType = obj1.getString()->copy(); } - obj1.free(); } else if (!strcmp(tmp.getName(), "MCS")) { // media clip data // TODO } @@ -326,55 +300,69 @@ MediaRendition::MediaRendition(Object* obj) { error (errSyntaxError, -1, "Invalid Media Clip"); ok = gFalse; } - tmp.free(); } - tmp2.free(); if (!ok) return; // // parse Media Play Parameters - if (obj->dictLookup("P", &tmp2)->isDict()) { // media play parameters - Object params; - if (tmp2.dictLookup("MH", ¶ms)->isDict()) { + tmp2 = obj->dictLookup("P"); + if (tmp2.isDict()) { // media play parameters + Object params = tmp2.dictLookup("MH"); + if (params.isDict()) { MH.parseMediaPlayParameters(¶ms); } - params.free(); - if (tmp2.dictLookup("BE", ¶ms)->isDict()) { + params = tmp2.dictLookup("BE"); + if (params.isDict()) { BE.parseMediaPlayParameters(¶ms); } - params.free(); } else if (!hasClip) { error (errSyntaxError, -1, "Invalid Media Rendition"); ok = gFalse; } - tmp2.free(); // // parse Media Screen Parameters - if (obj->dictLookup("SP", &tmp2)->isDict()) { // media screen parameters - Object params; - if (tmp2.dictLookup("MH", ¶ms)->isDict()) { + tmp2 = obj->dictLookup("SP"); + if (tmp2.isDict()) { // media screen parameters + Object params = tmp2.dictLookup("MH"); + if (params.isDict()) { MH.parseMediaScreenParameters(¶ms); } - params.free(); - if (tmp2.dictLookup("BE", ¶ms)->isDict()) { + params = tmp2.dictLookup("BE"); + if (params.isDict()) { BE.parseMediaScreenParameters(¶ms); } - params.free(); } - tmp2.free(); +} + +MediaRendition::MediaRendition(const MediaRendition &other) { + ok = other.ok; + MH = other.MH; + BE = other.BE; + isEmbedded = other.isEmbedded; + embeddedStreamObject = other.embeddedStreamObject.copy(); + + if (other.contentType) + contentType = other.contentType->copy(); + else + contentType = nullptr; + + if (other.fileName) + fileName = other.fileName->copy(); + else + fileName = nullptr; } void MediaRendition::outputToFile(FILE* fp) { if (!isEmbedded) return; - embeddedStream->reset(); + embeddedStreamObject.streamReset(); while (1) { - int c = embeddedStream->getChar(); + int c = embeddedStreamObject.streamGetChar(); if (c == EOF) break; @@ -383,19 +371,9 @@ void MediaRendition::outputToFile(FILE* fp) { } -MediaRendition *MediaRendition::copy() { - // call default copy constructor - MediaRendition* new_media = new MediaRendition(*this); - - if (contentType) - new_media->contentType = contentType->copy(); - if (fileName) - new_media->fileName = fileName->copy(); - - if (new_media->embeddedStream) - new_media->embeddedStream->incRef(); - - return new_media; +MediaRendition* MediaRendition::copy() +{ + return new MediaRendition(*this); } // TODO: SelectorRendition |