X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Fmandelcuda%2Fmandelbrotwindow.C;fp=cinelerra-5.1%2Fplugins%2Fmandelcuda%2Fmandelbrotwindow.C;h=c4b1168774616d9b58848f21dbb84062439151ca;hp=0000000000000000000000000000000000000000;hb=b1649fe7b38cfb4bbec58b19fb8dda2daa0ce520;hpb=abf5c6bb4dec2c2d03df2872e1d337e3905b3619 diff --git a/cinelerra-5.1/plugins/mandelcuda/mandelbrotwindow.C b/cinelerra-5.1/plugins/mandelcuda/mandelbrotwindow.C new file mode 100644 index 00000000..c4b11687 --- /dev/null +++ b/cinelerra-5.1/plugins/mandelcuda/mandelbrotwindow.C @@ -0,0 +1,215 @@ +/* + * CINELERRA + * Copyright (C) 2014 Adam Williams + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "bcdisplayinfo.h" +#include "clip.h" +#include "cwindow.h" +#include "cwindowgui.h" +#include "edl.h" +#include "edlsession.h" +#include "language.h" +#include "mandelbrot.h" +#include "mandelbrotwindow.h" +#include "mwindow.h" +#include "mwindowgui.h" +#include "pluginserver.h" +#include "theme.h" + +MandelbrotWindow::MandelbrotWindow(Mandelbrot *plugin) + : PluginClientWindow(plugin, 180, 130, 180, 130, 0) +{ + this->plugin = plugin; + press_x = press_y = 0; + button_no = 0; + pending_config = 0; +} + +MandelbrotWindow::~MandelbrotWindow() +{ +} + +void MandelbrotWindow::create_objects() +{ + int x = 10, y = 10, pad = 5; + BC_Title *title; + add_subwindow(title = new BC_Title(x,y, _("Mandelbrot:"), MEDIUMFONT, YELLOW)); + y += title->get_h() + pad; + add_subwindow(is_julia = new MandelbrotIsJulia(this, x, y)); + y += is_julia->get_h() + pad; + add_subwindow(drag = new MandelbrotDrag(this, x, y)); + y += drag->get_h() + pad; + add_subwindow(reset = new MandelbrotReset(this, x, y)); + show_window(); +} + +void MandelbrotWindow::update_gui() +{ +} + + +void MandelbrotWindow::send_configure_change() +{ + pending_config = 0; + plugin->send_configure_change(); +} + +int MandelbrotWindow::grab_event(XEvent *event) +{ + int ret = do_grab_event(event); + if( pending_config && !grab_event_count() ) + send_configure_change(); + return ret; +} + +int MandelbrotWindow::do_grab_event(XEvent *event) +{ + switch( event->type ) { + case ButtonPress: break; + case ButtonRelease: break; + case MotionNotify: break; + default: + return 0; + } + + MWindow *mwindow = plugin->server->mwindow; + CWindowGUI *cwindow_gui = mwindow->cwindow->gui; + CWindowCanvas *canvas = cwindow_gui->canvas; + int cursor_x, cursor_y; + cwindow_gui->get_relative_cursor(cursor_x, cursor_y); + cursor_x -= canvas->view_x; + cursor_y -= canvas->view_y; + float output_x = cursor_x, output_y = cursor_y; + canvas->canvas_to_output(mwindow->edl, 0, output_x, output_y); + + if( !button_no ) { + if( cursor_x < 0 || cursor_x >= canvas->view_w || + cursor_y < 0 || cursor_y >= canvas->view_h ) + return 0; + } + + switch( event->type ) { + case ButtonPress: + if( button_no ) return 0; + press_x = output_x; press_y = output_y; + button_no = event->xbutton.button; + break; + case ButtonRelease: + if( !button_no ) return 0; + button_no = 0; + return 1; + case MotionNotify: { + if( !button_no ) return 0; + EDL *edl = plugin->get_edl(); + double dx = 0, dy = 0, jx = 0, jy = 0, ds = 1; + double out_w = edl->session->output_w, out_h = edl->session->output_h; + double fx = (double)(press_x - output_x) / (2. * out_w); + double fy = (double)(press_y - output_y) / (2. * out_h); + press_x = output_x; press_y = output_y; + switch( button_no ) { + case LEFT_BUTTON: { + dx = fx * plugin->config.scale; + dy = fy * plugin->config.scale; + break; } + case MIDDLE_BUTTON: { + ds = fy >= 0.f ? 1-fy : 1/(1+fy); + bclamp(ds, 1-0.05f, 1+0.05f); + break; } + case RIGHT_BUTTON: { + jx = fx; + jy = fy; + break; } + } + plugin->config.x_off += dx; + plugin->config.y_off += dy; + plugin->config.x_julia += jx; + plugin->config.y_julia += jy; + plugin->config.scale *= ds; + pending_config = 1; + break; } + default: + return 0; + } + + return 1; +} + +void MandelbrotWindow::done_event(int result) +{ + ungrab(client->server->mwindow->cwindow->gui); +} +MandelbrotDrag::MandelbrotDrag(MandelbrotWindow *gui, int x, int y) + : BC_CheckBox(x, y, 0, _("Drag")) +{ + this->gui = gui; +} +int MandelbrotDrag::handle_event() +{ + CWindowGUI *cwindow_gui = gui->plugin->server->mwindow->cwindow->gui; + int value = get_value(); + if( value ) { + if( !gui->grab(cwindow_gui) ) { + update(value = 0); + flicker(10,50); + } + } + else + gui->ungrab(cwindow_gui); + return 1; +} + +MandelbrotIsJulia::MandelbrotIsJulia(MandelbrotWindow *gui, int x, int y) + : BC_CheckBox(x, y, gui->plugin->config.is_julia, _("Julia")) +{ + this->gui = gui; +} +MandelbrotIsJulia::~MandelbrotIsJulia() +{ +} + +int MandelbrotIsJulia::handle_event() +{ + Mandelbrot *plugin = gui->plugin; + plugin->config.is_julia = get_value(); + gui->send_configure_change(); + return 1; +} + +MandelbrotReset::MandelbrotReset(MandelbrotWindow *gui, int x, int y) + : BC_GenericButton(x, y, _("Reset")) +{ + this->gui = gui; +} +MandelbrotReset::~MandelbrotReset() +{ +} + +int MandelbrotReset::handle_event() +{ + Mandelbrot *plugin = gui->plugin; + int is_julia = plugin->config.is_julia; + plugin->config.reset(); + if( is_julia ) + plugin->config.startJulia(); + gui->send_configure_change(); + return 1; +} + + +