void LoadHandler::parseBgPixmap() { XOJ_CHECK_TYPE(LoadHandler); const char* domain = getAttrib("domain"); const char* filename = getAttrib("filename"); String fileToLoad; bool loadFile = false; if (!strcmp(domain, "absolute")) { fileToLoad = filename; loadFile = true; } else if (!strcmp(domain, "attach")) { fileToLoad = this->filename; fileToLoad += "."; fileToLoad += filename; loadFile = true; } if (loadFile) { GError* error = NULL; BackgroundImage img; img.loadFile(fileToLoad, &error); if (error) { error(_("could not read image: %s, Error message: %s"), fileToLoad.c_str(), error->message); g_error_free(error); } this->page->setBackgroundImage(img); } else if (!strcmp(domain, "clone")) { PageRef p = doc.getPage(atoi(filename)); if (p.isValid()) { this->page->setBackgroundImage(p->getBackgroundImage()); } } else { error(_("Unknown pixmap::domain type: %s"), domain); } this->page->setBackgroundType(BACKGROUND_TYPE_IMAGE); }
void PdfBookmarks::writeOutlines(Document * doc, PdfWriter * writer, int * outlineRoot, GList * pageIds) { XOJ_CHECK_TYPE(PdfBookmarks); GtkTreeModel * model = doc->getContentsModel(); if (!model) { return; } GList * bookmarkList = exportBookmarksFromTreeModel(model, doc); int bookmarksLenght = g_list_length(bookmarkList); if (bookmarksLenght == 0) { return; } Bookmark ** bookmarks = new Bookmark *[bookmarksLenght]; int maxLevel = 0; int i = 0; for (GList * l = bookmarkList; l != NULL; l = l->next) { Bookmark * b = (Bookmark *) l->data; if (maxLevel < b->level) { maxLevel = b->level; } bookmarks[i++] = b; } int * levels = new int[maxLevel + 1]; for (int u = 0; u < maxLevel + 1; u++) { levels[u] = 0; } int level = 0; for (i = 0; i < bookmarksLenght; i++) { Bookmark * b = bookmarks[i]; if (b->level > 0) { int parent = levels[b->level - 1]; //Set parent and last pointers b->parent = parent; bookmarks[parent]->last = i; if (b->level > level) { //Level increasing: set first pointer bookmarks[parent]->first = i; } } else { bookmarks[i]->parent = bookmarksLenght; } if (b->level <= level && i > 0) { //Set prev and next pointers int prev = levels[b->level]; bookmarks[prev]->next = i; bookmarks[i]->prev = prev; } levels[b->level] = i; level = b->level; } int n = writer->getObjectId(); for (i = 0; i < bookmarksLenght; i++) { Bookmark * b = bookmarks[i]; writer->writeObj(); writer->write("<<\n/Title "); writer->writeTxt(b->name.c_str()); writer->write("\n"); writer->write("/Parent "); writer->write(n + b->parent); writer->write(" 0 R\n"); if (b->prev != -1) { writer->write("/Prev "); writer->write(n + b->prev); writer->write(" 0 R\n"); } if (b->next != -1) { writer->write("/Next "); writer->write(n + b->next); writer->write(" 0 R\n"); } if (b->first != -1) { writer->write("/First "); writer->write(n + b->first); writer->write(" 0 R\n"); } if (b->last != -1) { writer->write("/Last "); writer->write(n + b->last); writer->write(" 0 R\n"); } PageRef p = doc->getPage(b->page); float top = 0; if (p.isValid()) { top = (p.getHeight() - b->top) * 72; } //Outline items char buffer[256]; int pObjId = 0; int * pObjIdPtr = (int *)g_list_nth_data(pageIds, b->page); if (pObjIdPtr) { pObjId = *pObjIdPtr; } sprintf(buffer, "/Dest [%d 0 R /XYZ 0 %.2f null]\n", pObjId, top /*($this->h-$o['y'])*$this->k*/); writer->write(buffer); writer->write("/Count 0\n>>\n"); writer->write("endobj\n"); } //Outline root writer->writeObj(); *outlineRoot = writer->getObjectId() - 1; writer->write("<<\n/Type /Outlines /First "); writer->write(n); writer->write(" 0 R\n"); writer->write("/Last "); writer->write(n + levels[0]); writer->write(" 0 R\n>>\n"); writer->write("endobj\n"); for (i = 0; i < bookmarksLenght; i++) { delete bookmarks[i]; } delete[] bookmarks; delete[] levels; return; }