home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2002 April / pcpro0402.iso / essentials / graphics / Gimp / gimp-src-20001226.exe / src / gimp / plug-ins / FractalExplorer / Events.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-05-28  |  7.8 KB  |  357 lines

  1. #include <stdio.h>
  2.  
  3. #include "FractalExplorer.h"
  4. #include "Events.h"
  5. #include "Dialogs.h"
  6.  
  7. /**********************************************************************
  8.  FUNCTION: preview_button_press_event
  9.  *********************************************************************/
  10.  
  11. gint
  12. preview_button_press_event (GtkWidget      *widget,
  13.                 GdkEventButton *event)
  14. {
  15.   gdouble  left;
  16.   gdouble  right;
  17.   gdouble  bottom;
  18.   gdouble  top;
  19.   gdouble  dx;
  20.   gdouble  dy;
  21.   gint     px;
  22.   gint     py;
  23.   gint     x;
  24.   gint     y;
  25.   gushort  r;
  26.   gushort  g;
  27.   gushort  b;
  28.   guchar  *p_ul;
  29.   guchar  *i;
  30.   guchar  *p;
  31.  
  32.   if (event->button == 1)
  33.     {
  34.       x_press = event->x;
  35.       y_press = event->y;
  36.       left = sel_x1;
  37.       right = sel_x2 - 1;
  38.       bottom = sel_y2 - 1;
  39.       top = sel_y1;
  40.       dx = (right - left) / (preview_width - 1);
  41.       dy = (bottom - top) / (preview_height - 1);
  42.       xbild = preview_width;
  43.       ybild = preview_height;
  44.       xdiff = (xmax - xmin) / xbild;
  45.       ydiff = (ymax - ymin) / ybild;
  46.  
  47.       py = y_press;
  48.       px = 0;
  49.       p_ul = wint.wimage + 3 * (preview_width * py + 0);
  50.  
  51.       for (x = 0; x < preview_width; x++)
  52.     {
  53.       i = wint.wimage + 3 * (preview_width * py + px);
  54.       r = (*i++) ^ 254;
  55.       g = (*i++) ^ 254;
  56.       b = (*i) ^ 254;
  57.       p_ul[0] = r;
  58.       p_ul[1] = g;
  59.       p_ul[2] = b;
  60.       p_ul += 3;
  61.       px += 1;
  62.     }
  63.  
  64.       py = 0;
  65.       p_ul = wint.wimage + 3 * (preview_width * 0 + (int) x_press);
  66.       px = x_press;
  67.  
  68.       for (y = 0; y < preview_height; y++)
  69.     {
  70.       i = wint.wimage + 3 * (preview_width * py + px);
  71.       r = (*i++) ^ 254;
  72.       g = (*i++) ^ 254;
  73.       b = (*i) ^ 254;
  74.       p_ul[0] = r;
  75.       p_ul[1] = g;
  76.       p_ul[2] = b;
  77.       p_ul += 3 * (preview_width);
  78.       py += 1;
  79.     }
  80.  
  81.       p = wint.wimage;
  82.  
  83.       for (y = 0; y < preview_height; y++)
  84.     {
  85.       gtk_preview_draw_row (GTK_PREVIEW (wint.preview), p,
  86.                 0, y, preview_width);
  87.       p += preview_width * 3;
  88.     }
  89.  
  90.       gtk_widget_draw (wint.preview, NULL);
  91.       gdk_flush ();
  92.     }
  93.   return TRUE;
  94. }
  95.  
  96. /**********************************************************************
  97.  FUNCTION: preview_motion_notify_event
  98.  *********************************************************************/
  99.  
  100. gint
  101. preview_motion_notify_event (GtkWidget      *widget,
  102.                  GdkEventButton *event)
  103. {
  104.   gint     px;
  105.   gint     py;
  106.   gint     x;
  107.   gint     y;
  108.   gushort  r;
  109.   gushort  g;
  110.   gushort  b;
  111.   guchar  *p_ul;
  112.   guchar  *i;
  113.   guchar  *p;
  114.  
  115.   ypos = oldypos;
  116.   xpos = oldxpos;
  117.  
  118.   if (oldypos != -1)
  119.     {
  120.       py = ypos;
  121.       px = 0;
  122.       p_ul = wint.wimage + 3 * (preview_width * py + 0);
  123.  
  124.       for (x = 0; x < preview_width; x++)
  125.     {
  126.       i = wint.wimage + 3 * (preview_width * py + px);
  127.       r = (*i++) ^ 254;
  128.       g = (*i++) ^ 254;
  129.       b = (*i) ^ 254;
  130.       p_ul[0] = r;
  131.       p_ul[1] = g;
  132.       p_ul[2] = b;
  133.       p_ul += 3;
  134.       px += 1;
  135.     }
  136.  
  137.       py = 0;
  138.       p_ul = wint.wimage + 3 * (preview_width * 0 + (int) xpos);
  139.       px = xpos;
  140.  
  141.       for (y = 0; y < preview_height; y++)
  142.     {
  143.       i = wint.wimage + 3 * (preview_width * py + px);
  144.       r = (*i++) ^ 254;
  145.       g = (*i++) ^ 254;
  146.       b = (*i) ^ 254;
  147.       p_ul[0] = r;
  148.       p_ul[1] = g;
  149.       p_ul[2] = b;
  150.       p_ul += 3 * (preview_width);
  151.       py += 1;
  152.     }
  153.     }
  154.   oldxpos = xpos = event->x;
  155.   oldypos = ypos = event->y;
  156.  
  157.   if ((xpos >= 0.0) &&
  158.       (ypos >= 0.0) &&
  159.       (xpos < preview_width) &&
  160.       (ypos < preview_height))
  161.     {
  162.       py = ypos;
  163.       px = 0;
  164.       p_ul = wint.wimage + 3 * (preview_width * py + 0);
  165.  
  166.       for (x = 0; x < preview_width; x++)
  167.     {
  168.       i = wint.wimage + 3 * (preview_width * py + px);
  169.       r = (*i++) ^ 254;
  170.       g = (*i++) ^ 254;
  171.       b = (*i) ^ 254;
  172.       p_ul[0] = r;
  173.       p_ul[1] = g;
  174.       p_ul[2] = b;
  175.       p_ul += 3;
  176.       px += 1;
  177.     }
  178.  
  179.       py = 0;
  180.       p_ul = wint.wimage + 3 * (preview_width * 0 + (int) xpos);
  181.       px = xpos;
  182.  
  183.       for (y = 0; y < preview_height; y++)
  184.     {
  185.         i = wint.wimage + 3 * (preview_width * py + px);
  186.         r = (*i++) ^ 254;
  187.         g = (*i++) ^ 254;
  188.         b = (*i) ^ 254;
  189.         p_ul[0] = r;
  190.         p_ul[1] = g;
  191.         p_ul[2] = b;
  192.         p_ul += 3 * (preview_width);
  193.         py += 1;
  194.     }            /* for */
  195.     }
  196.   else
  197.     {
  198.       oldypos = -1;
  199.       oldxpos = -1;
  200.     }
  201.  
  202.   p = wint.wimage;
  203.  
  204.   for (y = 0; y < preview_height; y++)
  205.     {
  206.       gtk_preview_draw_row (GTK_PREVIEW (wint.preview), p, 0, y, preview_width);
  207.       p += preview_width * 3;
  208.     }
  209.  
  210.   gtk_widget_draw (wint.preview, NULL);
  211.   gdk_flush ();
  212.  
  213.   return TRUE;
  214. }
  215.  
  216. /**********************************************************************
  217.  FUNCTION: preview_leave_notify_event
  218.  *********************************************************************/
  219.  
  220. gint
  221. preview_leave_notify_event (GtkWidget      *widget,
  222.                 GdkEventButton *event)
  223. {
  224.   gint     px;
  225.   gint     py;
  226.   gint     x;
  227.   gint     y;
  228.   gushort  r;
  229.   gushort  g;
  230.   gushort  b;
  231.   guchar  *p_ul;
  232.   guchar  *i;
  233.   guchar  *p;
  234.  
  235.   ypos = oldypos;
  236.   xpos = oldxpos;
  237.  
  238.   if (oldypos != -1)
  239.     {
  240.       py = ypos;
  241.       px = 0;
  242.       p_ul = wint.wimage + 3 * (preview_width * py + 0);
  243.  
  244.       for (x = 0; x < preview_width; x++)
  245.     {
  246.       i = wint.wimage + 3 * (preview_width * py + px);
  247.       r = (*i++) ^ 254;
  248.       g = (*i++) ^ 254;
  249.       b = (*i) ^ 254;
  250.       p_ul[0] = r;
  251.       p_ul[1] = g;
  252.       p_ul[2] = b;
  253.       p_ul += 3;
  254.       px += 1;
  255.     }
  256.  
  257.       py = 0;
  258.       p_ul = wint.wimage + 3 * (preview_width * 0 + (int) xpos);
  259.       px = xpos;
  260.  
  261.       for (y = 0; y < preview_height; y++)
  262.     {
  263.       i = wint.wimage + 3 * (preview_width * py + px);
  264.       r = (*i++) ^ 254;
  265.       g = (*i++) ^ 254;
  266.       b = (*i) ^ 254;
  267.       p_ul[0] = r;
  268.       p_ul[1] = g;
  269.       p_ul[2] = b;
  270.       p_ul += 3 * (preview_width);
  271.       py += 1;
  272.     }
  273.     }
  274.   oldxpos = -1;
  275.   oldypos = -1;
  276.  
  277.   p = wint.wimage;
  278.  
  279.   for (y = 0; y < preview_height; y++)
  280.     {
  281.       gtk_preview_draw_row (GTK_PREVIEW (wint.preview), p, 0, y, preview_width);
  282.       p += preview_width * 3;
  283.     }
  284.  
  285.   gtk_widget_draw (wint.preview, NULL);
  286.   gdk_flush ();
  287.  
  288.   MyCursor = gdk_cursor_new (GDK_TOP_LEFT_ARROW);
  289.   gdk_window_set_cursor (maindlg->window, MyCursor);
  290.  
  291.   return TRUE;
  292. }
  293.  
  294. /**********************************************************************
  295.  FUNCTION: preview_enter_notify_event
  296.  *********************************************************************/
  297.  
  298. gint
  299. preview_enter_notify_event (GtkWidget      *widget,
  300.                 GdkEventButton *event)
  301. {
  302.   MyCursor = gdk_cursor_new (GDK_TCROSS);
  303.   gdk_window_set_cursor (maindlg->window, MyCursor);
  304.  
  305.   return TRUE;
  306. }
  307.  
  308. /**********************************************************************
  309.  FUNCTION: preview_button_release_event
  310.  *********************************************************************/
  311.  
  312. gint
  313. preview_button_release_event (GtkWidget      *widget,
  314.                   GdkEventButton *event)
  315. {
  316.   gdouble l_xmin;
  317.   gdouble l_xmax;
  318.   gdouble l_ymin;
  319.   gdouble l_ymax;
  320.  
  321.   if (event->button == 1)
  322.     {
  323.       x_release = event->x;
  324.       y_release = event->y;
  325.  
  326.       if ((x_press >= 0.0) && (y_press >= 0.0) &&
  327.       (x_release >= 0.0) && (y_release >= 0.0) &&
  328.       (x_press < preview_width) && (y_press < preview_height) &&
  329.       (x_release < preview_width) && (y_release < preview_height))
  330.     {
  331.       l_xmin = (wvals.xmin +
  332.             (wvals.xmax - wvals.xmin) * (x_press / preview_width));
  333.       l_xmax = (wvals.xmin +
  334.             (wvals.xmax - wvals.xmin) * (x_release / preview_width));
  335.       l_ymin = (wvals.ymin +
  336.             (wvals.ymax - wvals.ymin) * (y_press / preview_height));
  337.       l_ymax = (wvals.ymin +
  338.             (wvals.ymax - wvals.ymin) * (y_release / preview_height));
  339.  
  340.       zooms[zoomindex] = wvals;
  341.       zoomindex++;
  342.       if (zoomindex > 99)
  343.         zoomindex = 99;
  344.       zoommax = zoomindex;
  345.       wvals.xmin = l_xmin;
  346.       wvals.xmax = l_xmax;
  347.       wvals.ymin = l_ymin;
  348.       wvals.ymax = l_ymax;
  349.       dialog_change_scale ();
  350.       dialog_update_preview ();
  351.       oldypos = oldxpos = -1;
  352.     }
  353.     }
  354.  
  355.   return TRUE;
  356. }
  357.