Author: abrander
Date: 2009-06-25 23:52:59 +0200 (Thu, 25 Jun 2009)
New Revision: 2509

Modified:
   trunk/src/rs-preview-widget.c
Log:
Enabled loupe in RSPreviewWidget.

Modified: trunk/src/rs-preview-widget.c
===================================================================
--- trunk/src/rs-preview-widget.c       2009-06-25 21:52:12 UTC (rev 2508)
+++ trunk/src/rs-preview-widget.c       2009-06-25 21:52:59 UTC (rev 2509)
@@ -27,6 +27,7 @@
 #include "rs-photo.h"
 #include "rs-actions.h"
 #include "rs-toolbox.h"
+#include "rs-loupe.h"
 #include <gettext.h>
 
 enum {
@@ -156,7 +157,16 @@
 #if GTK_CHECK_VERSION(2,12,0)
        GtkWidget *lightsout_window;
 #endif
+       gboolean last_x;
+       gboolean last_y;
        gboolean prev_inside_image; /* For motion and leave function*/
+
+       gboolean loupe_enabled;
+       RSLoupe *loupe;
+       RSFilter *loupe_filter_cache;
+       RSFilter *loupe_filter_denoise;
+       RSFilter *loupe_filter_render;
+       RSFilter *loupe_filter_end;
 };
 
 /* Define the boiler plate stuff using the predefined macro */
@@ -327,6 +337,12 @@
                preview->last_roi[i] = NULL;
                DIRTY(preview->dirty[i], ALL);
        }
+       preview->loupe_filter_cache = rs_filter_new("RSCache", NULL);
+       preview->loupe_filter_denoise = rs_filter_new("RSDenoise", 
preview->loupe_filter_cache);
+       preview->loupe_filter_render = rs_filter_new("RSBasicRender", 
preview->loupe_filter_denoise);
+       preview->loupe_filter_end = preview->loupe_filter_render;
+       preview->loupe = rs_loupe_new();
+       g_object_set(preview->loupe_filter_cache, "ignore-roi", TRUE, NULL);
        preview->photo = NULL;
        preview->scale = 1.0;
 
@@ -406,7 +422,47 @@
        gtk_widget_hide(preview->vscrollbar);
        gtk_widget_hide(preview->hscrollbar);
 }
+
 /**
+ * Enable the loupe
+ */
+void
+rs_preview_widget_set_loupe_enabled(RSPreviewWidget *preview, gboolean enabled)
+{
+       if (preview->loupe_enabled != enabled)
+       {
+               preview->loupe_enabled = enabled;
+               if (preview->loupe_enabled)
+               {
+                       rs_loupe_set_filter(preview->loupe, 
preview->loupe_filter_end);
+
+                       rs_filter_set_previous(preview->loupe_filter_cache, 
preview->filter_input);
+                       /* FIXME: view is hardcoded to 0 */
+                       g_object_set(preview->loupe_filter_render, "settings", 
preview->photo->settings[preview->snapshot[0]], NULL);
+                       gfloat sharpen, denoise_luma, denoise_chroma;
+
+                       
g_object_get(preview->photo->settings[preview->snapshot[0]],
+                               "sharpen", &sharpen,
+                               "denoise_luma", &denoise_luma,
+                               "denoise_chroma", &denoise_chroma,
+                               NULL);
+                       g_object_set(preview->loupe_filter_denoise,
+                               "sharpen", (gint) sharpen,
+                               "denoise_luma", (gint) denoise_luma,
+                               "denoise_chroma", (gint) denoise_chroma,
+                               NULL);
+
+                       gtk_widget_show_all(GTK_WIDGET(preview->loupe));
+               }
+               else
+               {
+                       if (preview->loupe)
+                               gtk_widget_hide_all(GTK_WIDGET(preview->loupe));
+               }
+       }
+}
+
+/**
  * Sets active photo of a RSPreviewWidget
  * @param preview A RSPreviewWidget
  * @param photo A RS_PHOTO
@@ -477,6 +533,8 @@
 
        for(view=0;view<MAX_VIEWS;view++)
                g_object_set(preview->filter_render[view], "icc-profile", 
profile, NULL);
+
+       g_object_set(preview->loupe_filter_render, "icc-profile", profile, 
NULL);
 }
 
 /**
@@ -1636,6 +1694,7 @@
                && (event->type == GDK_BUTTON_PRESS)
                && (event->button == 1)
                && (preview->state & WB_PICKER)
+           && !(event->state & GDK_CONTROL_MASK)
                && g_signal_has_handler_pending(preview, signals[WB_PICKED], 0, 
FALSE))
        {
                RS_PREVIEW_CALLBACK_DATA cbdata;
@@ -1755,6 +1814,24 @@
                preview->state = WB_PICKER;
                rs_photo_set_angle(preview->photo, preview->straighten_angle, 
TRUE);
        }
+       /* Middle mouse -> loupe */
+       else if ((event->type == GDK_BUTTON_PRESS)
+               && (event->button==2))
+       {
+               rs_loupe_set_coord(preview->loupe, real_x, real_y);
+               rs_preview_widget_set_loupe_enabled(preview, TRUE);
+       }
+       /* CTRL + left mouse -> loupe */
+       else if ((event->type == GDK_BUTTON_PRESS)
+               && (event->button==1)
+               && (event->state & GDK_CONTROL_MASK))
+       {
+               rs_loupe_set_coord(preview->loupe, real_x, real_y);
+               rs_preview_widget_set_loupe_enabled(preview, TRUE);
+       }
+       if (event->type == GDK_BUTTON_RELEASE)
+               rs_preview_widget_set_loupe_enabled(preview, FALSE);
+
        return FALSE;
 }
 static gboolean
@@ -1775,6 +1852,11 @@
        gdk_window_get_pointer(window, &x, &y, &mask);
        view = get_view_from_coord(preview, x, y);
 
+       if ((x == preview->last_x) && (y == preview->last_y))
+               return TRUE;
+       preview->last_x = x;
+       preview->last_y = y;
+
        /* Bail in silence */
        if (!VIEW_IS_VALID(view))
                return TRUE;
@@ -1975,6 +2057,10 @@
                }
        }
 
+       /* Update loupe if needed */
+       if (preview->loupe_enabled)
+               rs_loupe_set_coord(preview->loupe, real_x, real_y);
+
        return TRUE;
 }
 


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to