示例#1
0
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);
}
示例#2
0
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;
}