//############################################################################
//
// LaserBoy !!!
//
// by James Lehman
// Extra Stimulus Inc.
// james@akrobiz.com
//
// began: October 2003
//
// Copyright 2003 to 2024 James Lehman.
// This source is distributed under the terms of the GNU General Public License.
//
// LaserBoy_SDL_GUI.hpp is part of LaserBoy.
//
// LaserBoy 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 3 of the License, or
// (at your option) any later version.
//
// LaserBoy 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 LaserBoy. If not, see .
//
//############################################################################
#ifndef __LASERBOY_SDL_GUI_DEFINITIONS__
#define __LASERBOY_SDL_GUI_DEFINITIONS__
//############################################################################
#ifdef __WITH_SDL2__
#include
#else
#include
#endif
#include "LaserBoy_TUI.hpp"
//############################################################################
class LaserBoy_SDL_GUI
{
public:
LaserBoy_SDL_GUI(int x, int y);
//------------------------------------------------------------------------
~LaserBoy_SDL_GUI();
//------------------------------------------------------------------------
// BITMAP MEMORY AND SDL
//------------------------------------------------------------------------
void bmp_clone_SDL_Surface(struct LaserBoy_bmp* bmp, bool copy)
{
bmp_init(bmp, screen->w, screen->h, screen->format->BitsPerPixel);
if(screen->format->BitsPerPixel <= 8)
memcpy((void*)(bmp->palette), (const void*)(screen->format->palette->colors), bmp->palette_size);
if(copy)
memcpy((void*)(bmp->image), (const void*)(screen->pixels), bmp->image_size);
return;
}
//------------------------------------------------------------------------
void bmp_to_SDL_Surface(struct LaserBoy_bmp* bmp)
{
if(screen->format->BitsPerPixel <= 8)
memcpy((void*)(screen->format->palette->colors),
(const void*)(bmp->palette),
bmp->palette_size
);
memcpy((void*)(screen->pixels),
(const void*)(bmp->image),
bmp->image_size
);
#ifdef __WITH_SDL2__
SDL_UpdateWindowSurface(window);
#else
SDL_UnlockSurface(screen);
SDL_UpdateRect(screen, 0, 0, 0, 0);
SDL_LockSurface(screen);
#endif
return;
}
//------------------------------------------------------------------------
void SDL_Surface_to_bmp(struct LaserBoy_bmp* bmp)
{
if(screen->format->BitsPerPixel <= 8)
memcpy((void*)(bmp->palette),
(const void*)(screen->format->palette->colors),
bmp->palette_size
);
memcpy((void*)(bmp->image),
(const void*)(screen->pixels),
bmp->image_size
);
return;
}
//------------------------------------------------------------------------
void display_space()
{
if(screen->format->BitsPerPixel <= 8)
memcpy((void*)(screen->format->palette->colors),
(const void*)(space.bmp.palette),
space.bmp.palette_size
);
memcpy((void*)(screen->pixels),
(const void*)(space.bmp.image),
space.bmp.image_size
);
#ifdef __WITH_SDL2__
SDL_UpdateWindowSurface(window);
#else
SDL_UnlockSurface(screen);
SDL_UpdateRect(screen, 0, 0, 0, 0);
SDL_LockSurface(screen);
#endif
return;
}
//------------------------------------------------------------------------
void display_state(const string& state)
{
SDL_Rect rect;
rect.x = 0;
rect.y = 0;
rect.w = space.bmp.xres;
rect.h = 8 * space.font_size_factor;
bmp_printf(&(space.bmp),
0,
0,
0x00ffff00,
0x00004000,
0,
space.font_size_factor,
" %s ", // end string
state.c_str()
);
//----------------------------------------------------
memcpy((void*)(screen->pixels),
(const void*)(space.bmp.image),
space.bmp.bytes_per_line * 8 * space.font_size_factor
);
#ifdef __WITH_SDL2__
SDL_UpdateWindowSurfaceRects(window, &rect, 1);
#else
SDL_UnlockSurface(screen);
SDL_UpdateRect(screen,
8 * space.font_size_factor * 12,
0,
space.bmp.xres - 8 * space.font_size_factor * 12,
8 * space.font_size_factor
);
SDL_LockSurface(screen);
#endif
return;
}
//------------------------------------------------------------------------
void display_progress(int countdown)
{
if(!(countdown % 10))
{
bmp_printf(&(space.bmp),
0,
0,
0x00ffff00,
0x00004000,
0,
space.font_size_factor,
"%12d",
countdown
);
//----------------------------------------------------
memcpy((void*)(screen->pixels),
(const void*)(space.bmp.image),
space.bmp.bytes_per_line * 8 * space.font_size_factor
);
#ifdef __WITH_SDL2__
SDL_Rect rect;
rect.x = 0;
rect.y = 0;
rect.w = 8 * space.font_size_factor * 12;
rect.h = 8 * space.font_size_factor;
SDL_UpdateWindowSurfaceRects(window, &rect, 1);
#else
SDL_UnlockSurface(screen);
SDL_UpdateRect(screen,
0,
0,
8 * space.font_size_factor * 12,
8 * space.font_size_factor
);
SDL_LockSurface(screen);
#endif
}
return;
}
//------------------------------------------------------------------------
void display_txt_line_number(int line_number)
{
bmp_printf(&(space.bmp),
space.bmp.xres - 8 * space.font_size_factor * 12,
0,
0x00ffff00,
0x00004000,
0,
space.font_size_factor,
"%12d",
line_number
);
//----------------------------------------------------
memcpy((void*)(screen->pixels),
(const void*)(space.bmp.image),
space.bmp.bytes_per_line * 8 * space.font_size_factor
);
#ifdef __WITH_SDL2__
SDL_Rect rect;
rect.x = 0;
rect.y = 0;
rect.w = space.bmp.xres;
rect.h = 8 * space.font_size_factor;
SDL_UpdateWindowSurfaceRects(window, &rect, 1);
#else
SDL_UnlockSurface(screen);
SDL_UpdateRect(screen,
space.bmp.xres - 8 * space.font_size_factor * 12,
0,
8 * space.font_size_factor * 12,
8 * space.font_size_factor
);
SDL_LockSurface(screen);
#endif
return;
}
//------------------------------------------------------------------------
void capture_screen ();
//------------------------------------------------------------------------
void display_prompt_file_with_auto_complete (const string& prompt = "",
const string& value = ""
);
//------------------------------------------------------------------------
void display_prompt_dir_with_auto_complete (const string& prompt );
void display_prompt_f_effect_with_auto_complete (const string& prompt );
void display_prompt_sf_effect_with_auto_complete(const string& prompt );
void display_prompt_fs_effect_with_auto_complete(const string& prompt );
string display_prompt_and_echo_name (const string& prompt,
const u_int max_len = 64
);
string display_prompt_and_echo_string (const string& prompt );
string display_prompt_and_echo_unicode (const string& prompt );
//------------------------------------------------------------------------
string display_prompt_and_echo_channel_map (const string& prompt );
//------------------------------------------------------------------------
double display_prompt_and_echo_double (const string& prompt,
double value = 0,
double v_max = DBL_MAX,
double v_min = -DBL_MAX
);
//------------------------------------------------------------------------
u_char display_prompt_and_echo_u_char (const string& prompt,
u_char value = 0
);
//------------------------------------------------------------------------
short display_prompt_and_echo_short (const string& prompt,
short value = 0
);
//------------------------------------------------------------------------
int display_prompt_and_echo_int (const string& prompt,
int value = 0
);
//------------------------------------------------------------------------
u_int display_prompt_and_echo_u_int (const string& prompt,
u_int value = 0,
u_int v_max = UINT_MAX
);
//------------------------------------------------------------------------
int display_prompt_and_echo_nibble (const string& prompt );
bool display_prompt_and_echo_bool (const string& prompt );
//------------------------------------------------------------------------
void wait_4_Esc ();
void wait_4_any_key ();
//------------------------------------------------------------------------
// SDL_key menu system
//------------------------------------------------------------------------
#ifdef __WITH_SDL2__
void check_for_nav_keys (struct SDL_Keysym* sdl_keysym);
void check_for_digit_keys (struct SDL_Keysym* sdl_keysym);
#else
void check_for_nav_keys (SDLKey key);
void check_for_digit_keys (SDLKey key);
#endif
void animate_forward ();
void animate_reverse ();
void rotate_forward ();
void rotate_reverse ();
void animate_rotate_forward ();
void animate_rotate_reverse ();
//------------------------------------------------------------------------
void system_settings_menu ();
void optimization_factors_menu ();
void vector_editor_values_menu ();
void timing_and_wav_settings_menu ();
void display_options_menu ();
void edit_background_color_menu ();
void edit_mono_text_color_menu ();
void edit_rendered_blank_menu ();
void edit_rendered_black_menu ();
void wav_channel_i_menu ();
void dots_setting_menu ();
void bit_resolution_menu ();
void visuals_settings_menu ();
void file_type_specific_options_menu ();
void apply_view_menu ();
bool frame_color_trans_menu ();
bool palette_set_trans_menu ();
void add_color_to_target_palette_menu ();
void insert_color_in_target_palette_menu ();
void edit_color_in_target_palette_menu ();
void frame_transforms_menu ();
void frame_set_transforms_menu ();
void draw_color_blank_menu ();
void move_scale_rotate_menu ();
void direct_draw_segments_menu ();
void effect_functions_menu ();
void draw_point_menu ();
void draw_line_menu ();
void draw_rectangle_menu ();
void draw_polygon_menu ();
void draw_polyline_menu ();
void draw_polystar_menu ();
void draw_circular_arc_menu ();
void draw_elliptical_arc_menu ();
void draw_rhodonea_menu ();
void draw_epicycloid_menu ();
void draw_epitrochoid_menu ();
void draw_hypotrochoid_menu ();
void draw_hypocycloid_menu ();
void draw_lissajous_menu ();
void draw_mono_spaced_font_menu ();
void draw_variable_spaced_font_menu ();
void wav_utilities_menu ();
void wav_show_settings_menu ();
void wav_raster_display_menu ();
void set_wav_offsets_menu ();
void set_color_rescales_menu ();
void apply_color_rescales_menu ();
void omit_color_rescales_menu ();
void set_signal_polarities_menu ();
void clear_wav_polarities_menu ();
void bit_resolution_to_wav_menu ();
void file_open_menu ();
bool file_in_cd_menu (string LB_folder);
bool ild_file_open_menu ();
bool dxf_file_open_menu ();
bool wav_file_open_menu ();
bool wav_qm_open_menu (bool append);
bool wav_unformatted_open_menu (bool append);
bool wav_LB_headerless_open_menu (bool append);
bool txt_file_open_menu ();
bool ctn_file_open_menu ();
bool bmp_file_open_menu ();
void save_as_file_menu ();
bool ild_out_cd_menu ();
bool save_as_ild_menu ();
bool save_as_dxf_menu ();
bool save_as_wav_menu ();
bool save_as_txt_menu ();
bool save_as_ctn_menu ();
bool save_as_bmp_menu ();
//------------------------------------------------------------------------
void Laserboy_terminating ();
int start_menu_loop ();
//------------------------------------------------------------------------
bool display_bmp_directory (string bmp_dir, bool scale_to_screen);
//------------------------------------------------------------------------
bool display_wav (string wav_file);
bool display_unframed_wav (string wav_file);
void display_LaserBoy_wav(std::fstream& in, const LaserBoy_wav_header& header);
void display_unframed_wav(std::fstream& in, LaserBoy_wav_header& header);
//------------------------------------------------------------------------
#ifdef __WITH_SDL2__
SDL_Keycode SDL_Keysym_to_char(struct SDL_Keysym* sdl_keysym)
{
if(sdl_keysym->mod & KMOD_SHIFT)
{
if(sdl_keysym->sym >= SDLK_a && sdl_keysym->sym <= SDLK_z)
return toupper((char)sdl_keysym->sym);
else if(sdl_keysym->sym == SDLK_1)
return '!';
else if(sdl_keysym->sym == SDLK_2)
return '@';
else if(sdl_keysym->sym == SDLK_3)
return '#';
else if(sdl_keysym->sym == SDLK_4)
return '$';
else if(sdl_keysym->sym == SDLK_5)
return '%';
else if(sdl_keysym->sym == SDLK_6)
return '^';
else if(sdl_keysym->sym == SDLK_7)
return '&';
else if(sdl_keysym->sym == SDLK_8)
return '*';
else if(sdl_keysym->sym == SDLK_9)
return '(';
else if(sdl_keysym->sym == SDLK_0)
return ')';
else if(sdl_keysym->sym == SDLK_BACKQUOTE)
return '~';
else if(sdl_keysym->sym == SDLK_MINUS)
return '_';
else if(sdl_keysym->sym == SDLK_EQUALS)
return '+';
else if(sdl_keysym->sym == SDLK_LEFTBRACKET)
return '{';
else if(sdl_keysym->sym == SDLK_RIGHTBRACKET)
return '}';
else if(sdl_keysym->sym == SDLK_BACKSLASH)
return '|';
else if(sdl_keysym->sym == SDLK_SEMICOLON)
return ':';
else if(sdl_keysym->sym == SDLK_QUOTE)
return '"';
else if(sdl_keysym->sym == SDLK_COMMA)
return '<';
else if(sdl_keysym->sym == SDLK_PERIOD)
return '>';
else if(sdl_keysym->sym == SDLK_SLASH)
return '?';
}
return sdl_keysym->sym;
}
#endif
//------------------------------------------------------------------------
bool running,
prompt_escaped;
u_int xres,
yres;
LaserBoy_TUI space;
#ifdef __WITH_SDL2__
SDL_Window *window;
#endif
SDL_Surface *screen; // an SDL graphics window
SDL_Event event ; // UI input (keys)
};
//############################################################################
#endif
//############################################################################
//////////////////////////////////////////////////////////////////////////////
//############################################################################