summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbuild.sh3
-rw-r--r--fading-scroll.patch408
-rw-r--r--marshal.list7
3 files changed, 418 insertions, 0 deletions
diff --git a/build.sh b/build.sh
index e646bf7..1940b38 100755
--- a/build.sh
+++ b/build.sh
@@ -1,3 +1,6 @@
+glib-genmarshal --prefix=foo_marshal --header marshal.list > foo-marshal.h
+glib-genmarshal --prefix=foo_marshal --body marshal.list > foo-marshal.c
+
gcc -Wall -g \
`pkg-config --cflags --libs gtk+-2.0 libglade-2.0` \
-DGLADE_FILE=\"oppress.glade\" \
diff --git a/fading-scroll.patch b/fading-scroll.patch
new file mode 100644
index 0000000..f2ba646
--- /dev/null
+++ b/fading-scroll.patch
@@ -0,0 +1,408 @@
+diff --git a/deck.c b/deck.c
+index 74df0fc..8403489 100644
+--- a/deck.c
++++ b/deck.c
+@@ -1,8 +1,10 @@
+ #include "deck.h"
++#include <math.h>
+
+ #define MARGIN 18
+ #define RATIO 1.414
+-#define N_SLIDES 30
++#define N_SLIDES 5
++#define MASK_SIZE 24
+
+ struct Deck
+ {
+@@ -11,6 +13,9 @@ struct Deck
+
+ int view_width;
+ int thumb_width;
++
++ cairo_pattern_t * top_mask;
++ cairo_pattern_t * bottom_mask;
+ };
+
+ Deck *
+@@ -29,6 +34,18 @@ void
+ deck_set_main_width (Deck *deck, int view_width)
+ {
+ deck->view_width = view_width;
++
++ if (deck->top_mask)
++ {
++ cairo_pattern_destroy (deck->top_mask);
++ deck->top_mask = NULL;
++ }
++
++ if (deck->bottom_mask)
++ {
++ cairo_pattern_destroy (deck->bottom_mask);
++ deck->bottom_mask = NULL;
++ }
+ }
+
+ static int
+@@ -50,6 +67,141 @@ deck_get_thumb_slide_height (Deck *deck)
+ }
+
+ static void
++make_gamma_correct_gradient (cairo_pattern_t *gradient,
++ double from, double to,
++ int n_blocks)
++{
++ if (n_blocks == 1)
++ {
++ cairo_pattern_add_color_stop_rgba (gradient, from, 1.0, 1.0, 1.0,
++ (1 - pow(from , 1/2.2)));
++ cairo_pattern_add_color_stop_rgba (gradient, to, 1.0, 1.0, 1.0,
++ (1 - pow(from, 1/2.2)));
++ }
++ else
++ {
++ make_gamma_correct_gradient (gradient, from, to / 2, n_blocks / 2);
++ make_gamma_correct_gradient (gradient, to / 2, to, n_blocks / 2);
++ }
++}
++
++
++static cairo_pattern_t *
++create_gradient_mask (cairo_t *cr, gboolean top)
++{
++ cairo_pattern_t *gradient;
++ double begin = top? 0.0 : 1.0;
++ double end = top? 1.0 : 0.0;
++ double mid = top? 0.8 : 0.8;
++ double i;
++
++ cairo_push_group_with_content (cr, CAIRO_CONTENT_ALPHA);
++
++ cairo_save (cr);
++
++ gradient = cairo_pattern_create_linear (0.0, 0.0, 0.0, MASK_SIZE);
++
++ cairo_pattern_add_color_stop_rgba (gradient, 0.0, 1.0, 1.0, 1.0, begin);
++ cairo_pattern_add_color_stop_rgba (gradient, 0.5, 1.0, 1.0, 1.0, mid);
++ cairo_pattern_add_color_stop_rgba (gradient, 1.0, 1.0, 1.0, 1.0, end);
++
++ cairo_set_source (cr, gradient);
++
++ cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
++
++ cairo_paint (cr);
++
++ cairo_pattern_destroy (gradient);
++
++ cairo_restore (cr);
++
++ return cairo_pop_group (cr);
++}
++
++static void
++ensure_masks (Deck *deck,
++ cairo_t *cr,
++ int width)
++{
++ double dev_x, dev_y;
++ cairo_matrix_t matrix;
++
++ cairo_save (cr);
++
++ /* Limit the size of the mask surfaces */
++ cairo_rectangle (cr, 0, 0, width, MASK_SIZE);
++ cairo_clip (cr);
++
++ if (!deck->top_mask)
++ {
++ deck->top_mask = create_gradient_mask (cr, TRUE);
++#if 0
++ cairo_pattern_set_matrix (deck->top_mask, &matrix);
++#endif
++ }
++
++ if (!deck->bottom_mask)
++ {
++ deck->bottom_mask = create_gradient_mask (cr, FALSE);
++#if 0
++ cairo_pattern_set_matrix (deck->bottom_mask, &matrix);
++#endif
++ }
++
++ cairo_restore (cr);
++}
++
++static void
++layout_set_font (PangoLayout *layout, const char *font)
++{
++ PangoFontDescription *desc = pango_font_description_from_string (font);
++
++ pango_layout_set_font_description (layout, desc);
++
++ pango_font_description_free (desc);
++}
++
++FooScrollArea *the_area;
++
++static void
++draw_text (cairo_t *cr,
++ int width,
++ int x,
++ int y)
++{
++ PangoLayout *layout;
++ PangoRectangle logical, ink;
++ char *string =
++ "A spectre is haunting Europe \342\200\223 the spectre of communism. All the "
++ "powers of old Europe have entered into a holy alliance to exorcise "
++ "this spectre: Pope and Tsar, Metternich and Guizot, French Radicals "
++ "and German police-spies.";
++
++ cairo_save (cr);
++
++ layout = gtk_widget_create_pango_layout (GTK_WIDGET (the_area), string);
++
++ layout_set_font (layout, "Century Old Style 28");
++
++ pango_layout_set_width (layout, PANGO_SCALE * width);
++
++ pango_layout_get_pixel_extents (layout, &ink, &logical);
++
++ x += logical.x;
++ y += logical.y;
++
++ cairo_move_to (cr, x, y);
++
++ cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0);
++
++ pango_cairo_show_layout (cr, layout);
++
++ cairo_restore (cr);
++
++ g_object_unref (layout);
++}
++
++static void
+ deck_paint (Deck *deck,
+ cairo_t *cr,
+ int orig_x,
+@@ -59,7 +211,7 @@ deck_paint (Deck *deck,
+ {
+ int height;
+ int i;
+-
++
+ height = get_slide_height (width);
+
+ width -= 2 * MARGIN;
+@@ -81,9 +233,16 @@ deck_paint (Deck *deck,
+ cairo_set_line_width (cr, 2);
+ cairo_stroke (cr);
+
++ if (!is_thumbnail)
++ {
++ draw_text (cr, deck->view_width - 10 * MARGIN,
++ x + 2 * MARGIN, y + 2 * MARGIN);
++ }
++
+ cairo_set_source_rgba (cr, (i + 1.0) / N_SLIDES, 0,
+ 1 - (i + 1.0) / N_SLIDES, 1);
+
++#if 0
+ if (is_thumbnail)
+ {
+ cairo_rectangle (cr, x + width/2 - 4, y + height/2 - 4,
+@@ -96,16 +255,96 @@ deck_paint (Deck *deck,
+ }
+
+ cairo_fill (cr);
++#endif
+ }
+ }
+
++static void
++translate_pattern (cairo_pattern_t *pattern,
++ double dx, double dy)
++{
++ cairo_matrix_t matrix;
++
++ cairo_pattern_get_matrix (pattern, &matrix);
++ cairo_matrix_translate (&matrix, dx, dy);
++ cairo_pattern_set_matrix (pattern, &matrix);
++}
++
+ void
+ deck_paint_main (Deck *deck,
+ cairo_t *cr,
+ int orig_x,
+- int orig_y)
++ int orig_y,
++ GdkRectangle *viewport)
+ {
++ cairo_pattern_t *mask;
++
++ cairo_save (cr);
++
++ cairo_rectangle (cr,
++ viewport->x, viewport->y + MASK_SIZE,
++ viewport->width, viewport->height - 2 * MASK_SIZE);
++ cairo_clip (cr);
++
++ deck_paint (deck, cr, orig_x, orig_y, deck->view_width, FALSE);
++
++ cairo_restore (cr);
++
++ /* top mask */
++ cairo_save (cr);
++
++
++ cairo_rectangle (cr, viewport->x, viewport->y,
++ viewport->width, MASK_SIZE);
++ cairo_clip (cr);
++
++#if 0
++ cairo_rectangle (cr,
++ viewport->x + MARGIN, viewport->y,
++ viewport->width - 2 * MARGIN,
++ MASK_SIZE);
++
++ cairo_set_source_rgb (cr, 1, 1, 1);
++ cairo_fill (cr);
++#endif
++
++ cairo_push_group (cr);
++ deck_paint (deck, cr, orig_x, orig_y, deck->view_width, FALSE);
++ cairo_pop_group_to_source(cr);
++
++ cairo_translate (cr, viewport->x, viewport->y);
++ mask = create_gradient_mask (cr, TRUE);
++ cairo_mask (cr, mask);
++ cairo_pattern_destroy (mask);
++
++ cairo_restore (cr);
++
++
++ /* bottom mask */
++ cairo_save (cr);
++
++ cairo_rectangle (cr,
++ viewport->x, viewport->y + viewport->height - MASK_SIZE,
++ viewport->width, MASK_SIZE);
++ cairo_clip (cr);
++
++
++ cairo_push_group (cr);
++
+ deck_paint (deck, cr, orig_x, orig_y, deck->view_width, FALSE);
++
++ cairo_pop_group_to_source(cr);
++
++ cairo_translate (cr,
++ viewport->x,
++ viewport->y + viewport->height - MASK_SIZE);
++
++ mask = create_gradient_mask (cr, FALSE);
++
++ cairo_mask (cr, mask);
++ cairo_pattern_destroy (mask);
++
++ cairo_restore (cr);
+ }
+
+ void
+diff --git a/deck.h b/deck.h
+index 3ba2357..b27b550 100644
+--- a/deck.h
++++ b/deck.h
+@@ -10,7 +10,8 @@ Deck *deck_new (DeckChangeNotify notify,
+ void deck_paint_main (Deck *deck,
+ cairo_t *cr,
+ int x,
+- int y);
++ int y,
++ GdkRectangle *viewport);
+ void deck_paint_thumbs (Deck *deck,
+ cairo_t *cr,
+ int x,
+diff --git a/main.c b/main.c
+index 0230d69..5534500 100644
+--- a/main.c
++++ b/main.c
+@@ -124,7 +124,10 @@ on_main_paint (FooScrollArea *scroll_area,
+
+ cairo_save (cr);
+
+- deck_paint_main (app->deck, cr, get_toolbar_width (app), 0);
++ viewport.x += get_toolbar_width (app);
++ viewport.width -= get_toolbar_width (app);
++
++ deck_paint_main (app->deck, cr, get_toolbar_width (app), 0, &viewport);
+ cairo_restore (cr);
+ paint_toolbar (app, scroll_area, cr);
+
+@@ -221,6 +224,8 @@ on_viewport_changed (FooScrollArea *scroll_area,
+ /* Invalidate toolbar */
+ invalidate_toolbar (app, old_viewport);
+ invalidate_toolbar (app, viewport);
++
++ foo_scroll_area_invalidate (scroll_area);
+ }
+
+ static void
+@@ -277,7 +282,7 @@ main (int argc, char **argv)
+
+ app->deck = deck_new (on_deck_changed, app);
+ app->toolbar = toolbar_new ();
+-
++
+ gtk_container_add (
+ GTK_CONTAINER (get_widget (app, "main_area_scrolled_window")),
+ GTK_WIDGET (app->main_area));
+@@ -288,6 +293,10 @@ main (int argc, char **argv)
+
+ foo_scroll_area_set_min_size (app->thumbnails, 200, -1);
+
++ extern FooScrollArea *the_area;
++
++ the_area = app->main_area;
++
+ g_signal_connect (app->main_area, "paint",
+ G_CALLBACK (on_main_paint), app);
+ g_signal_connect (app->main_area, "viewport_size_changed",
+diff --git a/toolbar.c b/toolbar.c
+index 23897b1..4802535 100644
+--- a/toolbar.c
++++ b/toolbar.c
+@@ -46,16 +46,6 @@ toolbar_get_width (Toolbar *bar)
+ }
+
+ static void
+-layout_set_font (PangoLayout *layout, const char *font)
+-{
+- PangoFontDescription *desc = pango_font_description_from_string (font);
+-
+- pango_layout_set_font_description (layout, desc);
+-
+- pango_font_description_free (desc);
+-}
+-
+-static void
+ on_input (FooScrollArea *area,
+ FooScrollAreaEvent *event,
+ gpointer data)
+@@ -77,6 +67,16 @@ on_input (FooScrollArea *area,
+ }
+
+ static void
++layout_set_font (PangoLayout *layout, const char *font)
++{
++ PangoFontDescription *desc = pango_font_description_from_string (font);
++
++ pango_layout_set_font_description (layout, desc);
++
++ pango_font_description_free (desc);
++}
++
++static void
+ draw_number (FooScrollArea *area,
+ cairo_t *cr,
+ int number,
diff --git a/marshal.list b/marshal.list
new file mode 100644
index 0000000..cc18c01
--- /dev/null
+++ b/marshal.list
@@ -0,0 +1,7 @@
+VOID:OBJECT,OBJECT
+VOID:UINT,UINT,UINT,UINT
+VOID:UINT,UINT
+VOID:BOXED
+VOID:BOXED,BOXED
+VOID:POINTER,BOXED,POINTER
+VOID:POINTER,POINTER