Ignore:
Timestamp:
Jun 30, 2008, 10:13:07 AM (13 years ago)
Author:
Eugene Romanenko
Message:

PDF plugin: poppler library updated to version 0.8.3

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/poppler/mypoppler/poppler/Link.cc

    r2 r250  
    2222#include "Dict.h"
    2323#include "Link.h"
    24 #include "UGooString.h"
     24#include "Sound.h"
     25#include "Movie.h"
    2526
    2627//------------------------------------------------------------------------
     
    8384  // Movie action
    8485  } else if (obj2.isName("Movie")) {
    85     obj->dictLookupNF("Annot", &obj3);
    86     obj->dictLookup("T", &obj4);
    87     action = new LinkMovie(&obj3, &obj4);
    88     obj3.free();
    89     obj4.free();
     86    action = new LinkMovie(obj);
     87
     88  // Rendition action
     89  } else if (obj2.isName("Rendition")) {
     90    action = new LinkRendition(obj);
     91
     92  // Sound action
     93  } else if (obj2.isName("Sound")) {
     94    action = new LinkSound(obj);
    9095
    9196  // unknown action
     
    290295    }
    291296    kind = destFitH;
    292     if (!a->get(2, &obj2)->isNum()) {
     297    a->get(2, &obj2);
     298    if (obj2.isNull()) {
     299      changeTop = gFalse;
     300    } else if (obj2.isNum()) {
     301      changeTop = gTrue;
     302      top = obj2.getNum();
     303    } else {
    293304      error(-1, "Bad annotation destination position");
    294       goto err1;
    295     }
    296     top = obj2.getNum();
     305      kind = destFit;
     306    }
    297307    obj2.free();
    298308
     
    304314    }
    305315    kind = destFitV;
    306     if (!a->get(2, &obj2)->isNum()) {
     316    a->get(2, &obj2);
     317    if (obj2.isNull()) {
     318      changeLeft = gFalse;
     319    } else if (obj2.isNum()) {
     320      changeLeft = gTrue;
     321      left = obj2.getNum();
     322    } else {
    307323      error(-1, "Bad annotation destination position");
    308       goto err1;
    309     }
    310     left = obj2.getNum();
     324      kind = destFit;
     325    }
    311326    obj2.free();
    312327
     
    320335    if (!a->get(2, &obj2)->isNum()) {
    321336      error(-1, "Bad annotation destination position");
    322       goto err1;
     337      kind = destFit;
    323338    }
    324339    left = obj2.getNum();
     
    326341    if (!a->get(3, &obj2)->isNum()) {
    327342      error(-1, "Bad annotation destination position");
    328       goto err1;
     343      kind = destFit;
    329344    }
    330345    bottom = obj2.getNum();
     
    332347    if (!a->get(4, &obj2)->isNum()) {
    333348      error(-1, "Bad annotation destination position");
    334       goto err1;
     349      kind = destFit;
    335350    }
    336351    right = obj2.getNum();
     
    338353    if (!a->get(5, &obj2)->isNum()) {
    339354      error(-1, "Bad annotation destination position");
    340       goto err1;
     355      kind = destFit;
    341356    }
    342357    top = obj2.getNum();
     
    358373    }
    359374    kind = destFitBH;
    360     if (!a->get(2, &obj2)->isNum()) {
     375    a->get(2, &obj2);
     376    if (obj2.isNull()) {
     377      changeTop = gFalse;
     378    } else if (obj2.isNum()) {
     379      changeTop = gTrue;
     380      top = obj2.getNum();
     381    } else {
    361382      error(-1, "Bad annotation destination position");
    362       goto err1;
    363     }
    364     top = obj2.getNum();
     383      kind = destFit;
     384    }
    365385    obj2.free();
    366386
     
    372392    }
    373393    kind = destFitBV;
    374     if (!a->get(2, &obj2)->isNum()) {
     394    a->get(2, &obj2);
     395    if (obj2.isNull()) {
     396      changeLeft = gFalse;
     397    } else if (obj2.isNum()) {
     398      changeLeft = gTrue;
     399      left = obj2.getNum();
     400    } else {
    375401      error(-1, "Bad annotation destination position");
    376       goto err1;
    377     }
    378     left = obj2.getNum();
     402      kind = destFit;
     403    }
    379404    obj2.free();
    380405
     
    423448  // named destination
    424449  if (destObj->isName()) {
    425     namedDest = new UGooString(destObj->getName());
     450    namedDest = new GooString(destObj->getName());
    426451  } else if (destObj->isString()) {
    427     namedDest = new UGooString(*destObj->getString());
     452    namedDest = destObj->getString()->copy();
    428453
    429454  // destination dictionary
     
    461486  // named destination
    462487  if (destObj->isName()) {
    463     namedDest = new UGooString(destObj->getName());
     488    namedDest = new GooString(destObj->getName());
    464489  } else if (destObj->isString()) {
    465     namedDest = new UGooString(*destObj->getString());
     490    namedDest = destObj->getString()->copy();
    466491
    467492  // destination dictionary
     
    608633//------------------------------------------------------------------------
    609634
    610 LinkMovie::LinkMovie(Object *annotObj, Object *titleObj) {
     635LinkMovie::LinkMovie(Object *obj) {
    611636  annotRef.num = -1;
    612   title = NULL;
    613   if (annotObj->isRef()) {
    614     annotRef = annotObj->getRef();
    615   } else if (titleObj->isString()) {
    616     title = titleObj->getString()->copy();
    617   } else {
     637  annotTitle = NULL;
     638
     639  Object tmp;
     640  if (obj->dictLookupNF("Annotation", &tmp)->isRef()) {
     641    annotRef = tmp.getRef();
     642  }
     643  tmp.free();
     644
     645  if (obj->dictLookup("T", &tmp)->isString()) {
     646    annotTitle = tmp.getString()->copy();
     647  }
     648  tmp.free();
     649
     650  if ((annotTitle == NULL) && (annotRef.num == -1)) {
    618651    error(-1, "Movie action is missing both the Annot and T keys");
    619652  }
     653
     654  if (obj->dictLookup("Operation", &tmp)->isName()) {
     655    char *name = tmp.getName();
     656   
     657    if (!strcmp(name, "Play")) {
     658      operation = operationTypePlay;
     659    }
     660    else if (!strcmp(name, "Stop")) {
     661      operation = operationTypeStop;
     662    }
     663    else if (!strcmp(name, "Pause")) {
     664      operation = operationTypePause;
     665    }
     666    else if (!strcmp(name, "Resume")) {
     667      operation = operationTypeResume;
     668    }
     669  }
     670  tmp.free();
    620671}
    621672
    622673LinkMovie::~LinkMovie() {
    623   if (title) {
    624     delete title;
    625   }
    626 }
     674  if (annotTitle) {
     675    delete annotTitle;
     676  }
     677}
     678
     679//------------------------------------------------------------------------
     680// LinkSound
     681//------------------------------------------------------------------------
     682
     683LinkSound::LinkSound(Object *soundObj) {
     684  volume = 1.0;
     685  sync = gFalse;
     686  repeat = gFalse;
     687  mix = gFalse;
     688  sound = NULL;
     689  if (soundObj->isDict())
     690  {
     691    Object tmp;
     692    // volume
     693    soundObj->dictLookup("Volume", &tmp);
     694    if (tmp.isNum()) {
     695      volume = tmp.getNum();
     696    }
     697    tmp.free();
     698    // sync
     699    soundObj->dictLookup("Synchronous", &tmp);
     700    if (tmp.isBool()) {
     701      sync = tmp.getBool();
     702    }
     703    tmp.free();
     704    // repeat
     705    soundObj->dictLookup("Repeat", &tmp);
     706    if (tmp.isBool()) {
     707      repeat = tmp.getBool();
     708    }
     709    tmp.free();
     710    // mix
     711    soundObj->dictLookup("Mix", &tmp);
     712    if (tmp.isBool()) {
     713      mix = tmp.getBool();
     714    }
     715    tmp.free();
     716    // 'Sound' object
     717    soundObj->dictLookup("Sound", &tmp);
     718    sound = Sound::parseSound(&tmp);
     719    tmp.free();
     720  }
     721}
     722
     723LinkSound::~LinkSound() {
     724  delete sound;
     725}
     726
     727//------------------------------------------------------------------------
     728// LinkRendition
     729//------------------------------------------------------------------------
     730
     731LinkRendition::LinkRendition(Object *Obj) {
     732  operation = -1;
     733  movie = NULL;
     734  screenRef.num = -1;
     735
     736  if (Obj->isDict())
     737  {
     738    Object tmp;
     739
     740    if (Obj->dictLookup("OP", &tmp)->isNull()) {
     741      error(-1, "Rendition action : no /OP field defined");
     742      tmp.free();
     743    } else {
     744   
     745      operation = tmp.getInt();
     746      tmp.free();
     747
     748      // screen annotation reference
     749      Obj->dictLookupNF("AN", &tmp);
     750      if (tmp.isRef()) {
     751        screenRef = tmp.getRef();
     752      }
     753      tmp.free();
     754
     755      // retrieve rendition object
     756      Obj->dictLookup("R", &renditionObj);
     757      if (renditionObj.isDict()) {
     758
     759        movie = new Movie();
     760        movie->parseMediaRendition(&renditionObj);
     761       
     762        if (screenRef.num == -1) {
     763          error(-1, "Action Rendition : Rendition without Screen Annotation !");
     764        }
     765      }     
     766
     767    }
     768  }
     769
     770}
     771
     772LinkRendition::~LinkRendition() {
     773  renditionObj.free();
     774
     775  if (movie)
     776    delete movie;
     777}
     778
    627779
    628780//------------------------------------------------------------------------
     
    639791
    640792//------------------------------------------------------------------------
    641 // LinkBorderStyle
    642 //------------------------------------------------------------------------
    643 
    644 LinkBorderStyle::LinkBorderStyle(LinkBorderType typeA, double widthA,
    645                                  double *dashA, int dashLengthA,
    646                                  double rA, double gA, double bA) {
    647   type = typeA;
    648   width = widthA;
    649   dash = dashA;
    650   dashLength = dashLengthA;
    651   r = rA;
    652   g = gA;
    653   b = bA;
    654 }
    655 
    656 LinkBorderStyle::~LinkBorderStyle() {
    657   if (dash) {
    658     gfree(dash);
    659   }
    660 }
    661 
    662 //------------------------------------------------------------------------
    663793// Link
    664794//------------------------------------------------------------------------
    665795
    666796Link::Link(Dict *dict, GooString *baseURI) {
    667   Object obj1, obj2, obj3;
    668   LinkBorderType borderType;
    669   double borderWidth;
    670   double *borderDash;
    671   int borderDashLength;
    672   double borderR, borderG, borderB;
     797  Object obj1, obj2;
    673798  double t;
    674   int i;
    675 
    676   borderStyle = NULL;
     799
    677800  action = NULL;
    678801  ok = gFalse;
     
    719842  }
    720843
    721   // get the border style info
    722   borderType = linkBorderSolid;
    723   borderWidth = 1;
    724   borderDash = NULL;
    725   borderDashLength = 0;
    726   borderR = 0;
    727   borderG = 0;
    728   borderB = 1;
    729   if (dict->lookup("BS", &obj1)->isDict()) {
    730     if (obj1.dictLookup("S", &obj2)->isName()) {
    731       if (obj2.isName("S")) {
    732         borderType = linkBorderSolid;
    733       } else if (obj2.isName("D")) {
    734         borderType = linkBorderDashed;
    735       } else if (obj2.isName("B")) {
    736         borderType = linkBorderEmbossed;
    737       } else if (obj2.isName("I")) {
    738         borderType = linkBorderEngraved;
    739       } else if (obj2.isName("U")) {
    740         borderType = linkBorderUnderlined;
    741       }
    742     }
    743     obj2.free();
    744     if (obj1.dictLookup("W", &obj2)->isNum()) {
    745       borderWidth = obj2.getNum();
    746     }
    747     obj2.free();
    748     if (obj1.dictLookup("D", &obj2)->isArray()) {
    749       borderDashLength = obj2.arrayGetLength();
    750       borderDash = (double *)gmallocn(borderDashLength, sizeof(double));
    751       for (i = 0; i < borderDashLength; ++i) {
    752         if (obj2.arrayGet(i, &obj3)->isNum()) {
    753           borderDash[i] = obj3.getNum();
    754         } else {
    755           borderDash[i] = 1;
    756         }
    757         obj3.free();
    758       }
    759     }
    760     obj2.free();
    761   } else {
    762     obj1.free();
    763     if (dict->lookup("Border", &obj1)->isArray()) {
    764       if (obj1.arrayGetLength() >= 3) {
    765         if (obj1.arrayGet(2, &obj2)->isNum()) {
    766           borderWidth = obj2.getNum();
    767         }
    768         obj2.free();
    769         if (obj1.arrayGetLength() >= 4) {
    770           if (obj1.arrayGet(3, &obj2)->isArray()) {
    771             borderType = linkBorderDashed;
    772             borderDashLength = obj2.arrayGetLength();
    773             borderDash = (double *)gmallocn(borderDashLength, sizeof(double));
    774             for (i = 0; i < borderDashLength; ++i) {
    775               if (obj2.arrayGet(i, &obj3)->isNum()) {
    776                 borderDash[i] = obj3.getNum();
    777               } else {
    778                 borderDash[i] = 1;
    779               }
    780               obj3.free();
    781             }
    782           } else {
    783             // Adobe draws no border at all if the last element is of
    784             // the wrong type.
    785             borderWidth = 0;
    786           }
    787           obj2.free();
    788         }
    789       }
    790     }
    791   }
    792   obj1.free();
    793   if (dict->lookup("C", &obj1)->isArray() && obj1.arrayGetLength() == 3) {
    794     if (obj1.arrayGet(0, &obj2)->isNum()) {
    795       borderR = obj2.getNum();
    796     }
    797     obj1.free();
    798     if (obj1.arrayGet(1, &obj2)->isNum()) {
    799       borderG = obj2.getNum();
    800     }
    801     obj1.free();
    802     if (obj1.arrayGet(2, &obj2)->isNum()) {
    803       borderB = obj2.getNum();
    804     }
    805     obj1.free();
    806   }
    807   obj1.free();
    808   borderStyle = new LinkBorderStyle(borderType, borderWidth,
    809                                     borderDash, borderDashLength,
    810                                     borderR, borderG, borderB);
    811 
    812844  // look for destination
    813845  if (!dict->lookup("Dest", &obj1)->isNull()) {
     
    837869
    838870Link::~Link() {
    839   if (borderStyle) {
    840     delete borderStyle;
    841   }
    842871  if (action) {
    843872    delete action;
Note: See TracChangeset for help on using the changeset viewer.