/* maia (this was written by my daughter in emacs at 3 and an half :)) */ #include #include #include #include #include #define _(String) gettext(String) #include "page.hh" #include "document.hh" #include "slides_canvas.hh" #include "slides_viewport.hh" /* * An array of drawables */ PgmDrawable** drawable; static void key_press_event_cb (PgmViewport *viewport, PgmEventKey *event, gpointer data) { gchar buffer[7]; gint len; guint32 unicode; static double bias = 0.0; unicode = pgm_keyval_to_unicode (event->keyval); len = g_unichar_to_utf8 (unicode, buffer); buffer[len] = '\0'; g_print ("keyval:0x%x ucs:%d char:'%s'\n", event->keyval, unicode, buffer); int slides = 31; for(int i = 0; i < slides; i++) { int idx = -slides/2+i; double speed = std::sqrt(std::sqrt(std::abs((double)idx))); double position = bias; if(idx < 0) position = (-550.0f+bias)*speed; else if (idx > 0) position = (550.0f+bias)*speed; bias += 1.0; double distance = std::min(0.3+pow(27.0, position/1000.0-0.1), 0.3+pow(27.0, -position/1000.0-0.1)); pgm_drawable_set_position(drawable[i], position, 0.0f, -((2.0-distance)*1200.0)); pgm_drawable_set_bg_color(drawable[i], 255, 255, 0, 255); pgm_drawable_set_opacity(drawable[i], 255); double angle = 0.0f; if(position < 0.0) angle = M_PI/2 - 3.295836866*pow(27, position/100.0-0.1); else if(position > 0.0) angle = -M_PI/2 + 3.295836866*pow(27, -position/100.0-0.1); pgm_drawable_set_rotation_y(drawable[i], angle); } } /* * GList enumerating function */ void link_function(gpointer data, gpointer user_data) { PopplerLinkMapping* link = (PopplerLinkMapping*)data; g_print("Link area (%f,%f)x(%f,%f)\n", link->area.x1, link->area.y1, link->area.x2, link->area.y2); } /* * Main program for the new bread PDFCube. Get rid of plain (and pain) * OpenGL and let's use the great pigment library. */ int main(int argc, char* argv[]) { /* * The viewport where the rendering actually takes place */ PgmViewport* viewport; /* * The canvas where the drawables are arranged */ PgmCanvas* canvas; /* * A buffer to render pdf pages */ GdkPixbuf* buffer = NULL; /* * A poppler page */ PopplerPage *page; /* * The poppler document */ PopplerDocument* document; int N; /* * Initialize pigment */ pgm_init(&argc, &argv); pgm_viewport_factory_make("opengl", &viewport); if(!viewport) { g_print(_("Cannot create the 'OpenGL' viewport\n")); return -1; } /* * Open the PDF document using poppler */ document = poppler_document_new_from_file(argv[1], NULL, NULL); if(document == NULL) { g_print(_("PDF file %s cannot be opened, check it exists, permissions" " and that is \nnot encrypted.\n"), argv[1]); return -1; } N = poppler_document_get_n_pages(document); g_print(_("Found a PDF document with %d pages.\n"), N); /* * Initialize the viewport window and its size */ pgm_viewport_set_title(viewport, "PDFCube 0.1.0"); pgm_viewport_set_size(viewport, 1024, 768); canvas = pgm_canvas_new(); pgm_canvas_set_size(canvas, 640, 480); pgm_viewport_set_canvas(viewport, canvas); drawable = (PgmDrawable**)alloca(N * sizeof(PgmDrawable*)); char* transition_name[] = { "replace", "split", "blinds", "box", "wipe", "dissolve", "glitter", "fly", "push", "cover", "uncover", "fade", "unknown", "unknown" }; int slides = N > 31 ? 31 : N; for(int i = 0; i < slides; i++) { PopplerPageTransition* transition; GList* link; page = poppler_document_get_page(document, i); g_print("Page %d has duration %f\n", i, poppler_page_get_duration(page)); transition = poppler_page_get_transition(page); g_print("Page %d has transition %s\n", i, transition_name[transition->type]); link = poppler_page_get_link_mapping(page); g_print("Page %d has %d links\n", i, g_list_length(link)); g_list_foreach(link, link_function, NULL); double w, h; poppler_page_get_size(page, &w, &h); g_print("Page %d is %f by %f\n", i, w, h); buffer = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, 320, 240); poppler_page_render_to_pixbuf(page, 0, 0, 320, 240, 240.0f/h, 0, buffer); drawable[i] = pgm_image_new_from_pixbuf(buffer); pgm_drawable_set_size(drawable[i], 640.0, 480.0); int idx = -slides/2+i; double speed = std::pow(std::abs((double)idx), 0.28); double position = 0.0; if(idx < 0) position = -450.0f*speed; else if (idx > 0) position = 450.0f*speed; // position += 0.001; double distance = std::min(0.3+pow(27.0, position/1000-0.1), 0.3+pow(27.0, -position/1000-0.1)); pgm_drawable_set_position(drawable[i], position, 0.0f, -((2.0-distance)*1200.0)); pgm_drawable_set_bg_color(drawable[i], 255, 255, 0, 255); pgm_drawable_set_opacity(drawable[i], 255); double angle = 0.0f; if(position < 0.0) angle = M_PI/2 - 3.295836866*pow(27, position/1000-0.1); else if(position > 0.0) angle = -M_PI/2 + 3.295836866*pow(27, -position/1000-0.1); pgm_drawable_set_rotation_y(drawable[i], angle); pgm_drawable_show(drawable[i]); pgm_canvas_add(canvas, PGM_DRAWABLE_MIDDLE, drawable[i]); } pgm_viewport_show(viewport); // g_signal_connect (G_OBJECT(viewport), "key-press-event", // G_CALLBACK(key_press_event_cb), NULL); g_signal_connect (G_OBJECT (viewport), "delete-event", G_CALLBACK (pgm_main_quit), NULL); pgm_main(); g_object_unref(buffer); gst_object_unref(canvas); gst_object_unref(viewport); pgm_deinit(); return 0; }