⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 link.cc

📁 这是一个做pdf阅读器的源代码文件,是大家学习阅读器资料的很好参考
💻 CC
📖 第 1 页 / 共 2 页
字号:
LinkDest::LinkDest(LinkDest *dest) {  kind = dest->kind;  pageIsRef = dest->pageIsRef;  if (pageIsRef)    pageRef = dest->pageRef;  else    pageNum = dest->pageNum;  left = dest->left;  bottom = dest->bottom;  right = dest->right;  top = dest->top;  zoom = dest->zoom;  changeLeft = dest->changeLeft;  changeTop = dest->changeTop;  changeZoom = dest->changeZoom;  ok = gTrue;}//------------------------------------------------------------------------// LinkGoTo//------------------------------------------------------------------------LinkGoTo::LinkGoTo(Object *destObj) {  dest = NULL;  namedDest = NULL;  // named destination  if (destObj->isName()) {    namedDest = new GString(destObj->getName());  } else if (destObj->isString()) {    namedDest = destObj->getString()->copy();  // destination dictionary  } else if (destObj->isArray()) {    dest = new LinkDest(destObj->getArray());    if (!dest->isOk()) {      delete dest;      dest = NULL;    }  // error  } else {    error(-1, "Illegal annotation destination");  }}LinkGoTo::~LinkGoTo() {  if (dest)    delete dest;  if (namedDest)    delete namedDest;}//------------------------------------------------------------------------// LinkGoToR//------------------------------------------------------------------------LinkGoToR::LinkGoToR(Object *fileSpecObj, Object *destObj) {  dest = NULL;  namedDest = NULL;  // get file name  fileName = getFileSpecName(fileSpecObj);  // named destination  if (destObj->isName()) {    namedDest = new GString(destObj->getName());  } else if (destObj->isString()) {    namedDest = destObj->getString()->copy();  // destination dictionary  } else if (destObj->isArray()) {    dest = new LinkDest(destObj->getArray());    if (!dest->isOk()) {      delete dest;      dest = NULL;    }  // error  } else {    error(-1, "Illegal annotation destination");  }}LinkGoToR::~LinkGoToR() {  if (fileName)    delete fileName;  if (dest)    delete dest;  if (namedDest)    delete namedDest;}//------------------------------------------------------------------------// LinkLaunch//------------------------------------------------------------------------LinkLaunch::LinkLaunch(Object *actionObj) {  Object obj1, obj2;  fileName = NULL;  params = NULL;  if (actionObj->isDict()) {    if (!actionObj->dictLookup("F", &obj1)->isNull()) {      fileName = getFileSpecName(&obj1);    } else {      obj1.free();#ifdef WIN32      if (actionObj->dictLookup("Win", &obj1)->isDict()) {	obj1.dictLookup("F", &obj2);	fileName = getFileSpecName(&obj2);	obj2.free();	if (obj1.dictLookup("P", &obj2)->isString()) {	  params = obj2.getString()->copy();	}	obj2.free();      } else {	error(-1, "Bad launch-type link action");      }#else      //~ This hasn't been defined by Adobe yet, so assume it looks      //~ just like the Win dictionary until they say otherwise.      if (actionObj->dictLookup("Unix", &obj1)->isDict()) {	obj1.dictLookup("F", &obj2);	fileName = getFileSpecName(&obj2);	obj2.free();	if (obj1.dictLookup("P", &obj2)->isString()) {	  params = obj2.getString()->copy();	}	obj2.free();      } else {	error(-1, "Bad launch-type link action");      }#endif    }    obj1.free();  }}LinkLaunch::~LinkLaunch() {  if (fileName)    delete fileName;  if (params)    delete params;}//------------------------------------------------------------------------// LinkURI//------------------------------------------------------------------------LinkURI::LinkURI(Object *uriObj, GString *baseURI) {  GString *uri2;  int n;  char c;  uri = NULL;  if (uriObj->isString()) {    uri2 = uriObj->getString()->copy();    if (baseURI && baseURI->getLength() > 0) {      n = strcspn(uri2->getCString(), "/:");      if (n == uri2->getLength() || uri2->getChar(n) == '/') {	uri = baseURI->copy();	c = uri->getChar(uri->getLength() - 1);	if (c == '/' || c == '?') {	  if (uri2->getChar(0) == '/') {	    uri2->del(0);	  }	} else {	  if (uri2->getChar(0) != '/') {	    uri->append('/');	  }	}	uri->append(uri2);	delete uri2;      } else {	uri = uri2;      }    } else {      uri = uri2;    }  } else {    error(-1, "Illegal URI-type link");  }}LinkURI::~LinkURI() {  if (uri)    delete uri;}//------------------------------------------------------------------------// LinkNamed//------------------------------------------------------------------------LinkNamed::LinkNamed(Object *nameObj) {  name = NULL;  if (nameObj->isName()) {    name = new GString(nameObj->getName());  }}LinkNamed::~LinkNamed() {  if (name) {    delete name;  }}//------------------------------------------------------------------------// LinkMovie//------------------------------------------------------------------------LinkMovie::LinkMovie(Object *annotObj, Object *titleObj) {  annotRef.num = -1;  title = NULL;  if (annotObj->isRef()) {    annotRef = annotObj->getRef();  } else if (titleObj->isString()) {    title = titleObj->getString()->copy();  } else {    error(-1, "Movie action is missing both the Annot and T keys");  }}LinkMovie::~LinkMovie() {  if (title) {    delete title;  }}//------------------------------------------------------------------------// LinkUnknown//------------------------------------------------------------------------LinkUnknown::LinkUnknown(char *actionA) {  action = new GString(actionA);}LinkUnknown::~LinkUnknown() {  delete action;}//------------------------------------------------------------------------// Link//------------------------------------------------------------------------Link::Link(Dict *dict, GString *baseURI) {  Object obj1, obj2;  double t;  action = NULL;  ok = gFalse;  // get rectangle  if (!dict->lookup("Rect", &obj1)->isArray()) {    error(-1, "Annotation rectangle is wrong type");    goto err2;  }  if (!obj1.arrayGet(0, &obj2)->isNum()) {    error(-1, "Bad annotation rectangle");    goto err1;  }  x1 = obj2.getNum();  obj2.free();  if (!obj1.arrayGet(1, &obj2)->isNum()) {    error(-1, "Bad annotation rectangle");    goto err1;  }  y1 = obj2.getNum();  obj2.free();  if (!obj1.arrayGet(2, &obj2)->isNum()) {    error(-1, "Bad annotation rectangle");    goto err1;  }  x2 = obj2.getNum();  obj2.free();  if (!obj1.arrayGet(3, &obj2)->isNum()) {    error(-1, "Bad annotation rectangle");    goto err1;  }  y2 = obj2.getNum();  obj2.free();  obj1.free();  if (x1 > x2) {    t = x1;    x1 = x2;    x2 = t;  }  if (y1 > y2) {    t = y1;    y1 = y2;    y2 = t;  }  // look for destination  if (!dict->lookup("Dest", &obj1)->isNull()) {    action = LinkAction::parseDest(&obj1);  // look for action  } else {    obj1.free();    if (dict->lookup("A", &obj1)->isDict()) {      action = LinkAction::parseAction(&obj1, baseURI);    }  }  obj1.free();  // check for bad action  if (action) {    ok = gTrue;  }  return; err1:  obj2.free(); err2:  obj1.free();}Link::~Link() {  if (action) {    delete action;  }}//------------------------------------------------------------------------// Links//------------------------------------------------------------------------Links::Links(Object *annots, GString *baseURI) {  Link *link;  Object obj1, obj2;  int size;  int i;  links = NULL;  size = 0;  numLinks = 0;  if (annots->isArray()) {    for (i = 0; i < annots->arrayGetLength(); ++i) {      if (annots->arrayGet(i, &obj1)->isDict()) {	if (obj1.dictLookup("Subtype", &obj2)->isName("Link")) {	  link = new Link(obj1.getDict(), baseURI);	  if (link->isOk()) {	    if (numLinks >= size) {	      size += 16;	      links = (Link **)greallocn(links, size, sizeof(Link *));	    }	    links[numLinks++] = link;	  } else {	    delete link;	  }	}	obj2.free();      }      obj1.free();    }  }}Links::~Links() {  int i;  for (i = 0; i < numLinks; ++i)    delete links[i];  gfree(links);}LinkAction *Links::find(double x, double y) {  int i;  for (i = numLinks - 1; i >= 0; --i) {    if (links[i]->inRect(x, y)) {      return links[i]->getAction();    }  }  return NULL;}GBool Links::onLink(double x, double y) {  int i;  for (i = 0; i < numLinks; ++i) {    if (links[i]->inRect(x, y))      return gTrue;  }  return gFalse;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -