#include "rc_os_defines.h" #ifdef RC_ANDROID #define RC_MOBILE #endif #ifdef RC_IOS #define RC_MOBILE #endif #ifdef RC_ANDROID #include //Using SDL and standard IO #include "SDL.h" #include "SDL_image.h" #include "SDL2_gfxPrimitives.h" #include "SDL_ttf.h" #include #include #include #include "SDL_mixer.h" #include "SDL_net.h" //#include "../SDL/src/core/android/SDL_android.h" //#include "../SDL/src/dynapi/SDL_dynapi_overrides.h" //#include "../soft_render/SDL_rotate.c" #include #include "theoraplay.h" #else #ifdef RC_IOS //Using SDL and standard IO #include "SDL2/SDL.h" #include "SDL2/SDL_image.h" #include "SDL2/SDL2_gfxPrimitives.h" #include "SDL2/SDL_ttf.h" #include #include #include #include "SDL2/SDL_mixer.h" #include "SDL2/SDL_net.h" #include #include "theoraplay.h" #else //Using SDL and standard IO #include #include #include #include #include #include #include #include #include #include #include #include #include #include "theoraplay.h" #endif //RC_IOS #endif // RC_ANDROID //#include "soft_render/SDL_rotate.c" #include using namespace std; #ifdef RC_MOBILE //Screen dimension constants const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; const int MAX_WINDOWS = 1; //8 const int MAX_SCREENS = 8; //32 const int MAX_IMAGES = 4096; //65536; const int MAX_SPRITES = 32; //1024; const int MAX_SOUNDS = 1024; const int MAX_MUSIC = 1; const int MAX_FONTS = 32; const int MAX_FINGERS = 10; const int MAX_SOCKETS = 256; const int MAX_ACCELS = 20; const int MAX_GYROS = 20; const int MAX_JOYSTICKS = 8; #else //Screen dimension constants const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; const int MAX_WINDOWS = 8; //8 const int MAX_SCREENS = 8; //32 const int MAX_IMAGES = 4096; //65536; const int MAX_SOUNDS = 1024; const int MAX_MUSIC = 1; const int MAX_FONTS = 32; const int MAX_FINGERS = 10; const int MAX_SOCKETS = 256; const int MAX_ACCELS = 20; const int MAX_GYROS = 20; const int MAX_JOYSTICKS = 8; #endif // RC_MOBILE SDL_Window * rc_win[MAX_WINDOWS]; int rc_win_event[MAX_WINDOWS]; SDL_Texture * rc_backBuffer[MAX_WINDOWS]; SDL_Rect rc_bb_rect[MAX_WINDOWS]; SDL_Surface * rc_win_surface[MAX_WINDOWS]; SDL_Renderer * rc_win_renderer[MAX_WINDOWS]; Uint32 rc_win_id[MAX_WINDOWS]; bool rc_win_exitOnClose[MAX_WINDOWS]; Uint32 rc_screen_format[MAX_WINDOWS]; SDL_Texture * rc_himage[MAX_IMAGES][MAX_WINDOWS]; SDL_Rect rc_himage_rect[MAX_IMAGES]; bool rc_image_isLoaded[MAX_IMAGES]; SDL_Texture * rc_hscreen[MAX_WINDOWS][MAX_SCREENS]; SDL_Surface * rc_sscreen[MAX_WINDOWS][MAX_SCREENS]; SDL_Rect rc_screen_rect[MAX_WINDOWS][MAX_SCREENS]; int rc_screen_z[MAX_WINDOWS][MAX_SCREENS]; SDL_Rect rc_screenview[MAX_WINDOWS][MAX_SCREENS]; int rc_screen_width[MAX_WINDOWS][MAX_SCREENS]; int rc_screen_height[MAX_WINDOWS][MAX_SCREENS]; Uint8 rc_screen_transparent[MAX_WINDOWS][MAX_SCREENS]; int rc_screen_zOrder[MAX_WINDOWS][MAX_SCREENS]; bool rc_screen_visible[MAX_WINDOWS][MAX_SCREENS]; SDL_Surface * rc_simage[MAX_IMAGES]; SDL_Rect rc_image_rect[MAX_IMAGES]; Uint32 rc_image_width[MAX_IMAGES]; Uint32 rc_image_height[MAX_IMAGES]; Uint32 rc_image_colorKey[MAX_IMAGES]; Uint8 rc_image_colorKey_r[MAX_IMAGES]; Uint8 rc_image_colorKey_g[MAX_IMAGES]; Uint8 rc_image_colorKey_b[MAX_IMAGES]; Uint8 rc_image_colorKey_a[MAX_IMAGES]; int rc_active_window = -1; int rc_active_screen = -1; Uint32 rc_ink = 0x00000000; SDL_Color rc_ink_color; Uint32 rc_paper = 0x00000000; Uint32 rc_clearColor = 0x00000000; Uint32 rc_colorKey = 0x00000000; SDL_Color rc_colorKey_color; int rc_colorKey_switch = 0; int rc_console_width[MAX_WINDOWS]; //number of characters wide int rc_console_height[MAX_WINDOWS]; //number of rows int rc_sConsole_x[MAX_WINDOWS]; int rc_sConsole_y[MAX_WINDOWS]; Uint8 rc_cursor_visible = 1; SDL_Color rc_console_pen; int rc_pen_color = 0x00FFFFFF; SDL_Surface * rc_console = NULL; SDL_Texture * rc_hconsole[MAX_WINDOWS]; TTF_Font * rc_console_font = NULL; string rc_input_buffer = ""; TTF_Font * rc_draw_font[MAX_FONTS]; string rc_draw_font_path = ""; int rc_active_font = -1; int rc_inkey = 0; SDL_Keycode rc_keycode; SDL_Scancode rc_scancode; SDL_Keymod rc_keymod; int rc_mouseX = 0; int rc_mouseY = 0; int rc_mbutton1 = 0; int rc_mbutton2 = 0; int rc_mbutton3 = 0; int rc_mwheelx = 0; int rc_mwheely = 0; int rc_global_mouseX = 0; int rc_global_mouseY = 0; //SDL_Event event; Uint32 prev_color = 0; bool rc_engine_isRunning = false; bool rc_engine_isInitialized = false; bool rc_media_isActive = false; const Uint8 * keyState = NULL; SDL_Joystick * rc_joystick[MAX_JOYSTICKS]; int rc_joy_axis[MAX_JOYSTICKS][100]; int rc_numJoysticks = 0; int rc_joybutton[MAX_JOYSTICKS][100]; SDL_JoystickID rc_joyID[MAX_JOYSTICKS]; SDL_Joystick * tmp_joy; SDL_JoystickID tmp_joy_id; int tmp_joy_flag = 0; SDL_Haptic * rc_haptic[MAX_JOYSTICKS]; //1 for each joystick double rc_pressure = 0; int rc_touchX = 0; int rc_touchY = 0; int rc_motionX = 0; int rc_motionY = 0; int rc_touch = 0; int rc_mt_status = 0; int rc_mt_x = 0; int rc_mt_y = 0; int rc_mt_numFingers = 0; double rc_mt_theta = 0; double rc_mt_dist = 0; SDL_TouchID rc_touchDevice; SDL_Finger rc_finger[MAX_FINGERS]; set rc_fingers_pressed; SDL_Sensor * rc_accel[MAX_ACCELS]; int num_accels = 0; SDL_Sensor * rc_gyro[MAX_GYROS]; int num_gyros = 0; int rc_win_width[MAX_WINDOWS]; int rc_win_height[MAX_WINDOWS]; Uint32 rc_update_timer = 0; Uint32 rc_auto_time = 0; int rc_update_flag = 0; Mix_Chunk * rc_sound[MAX_SOUNDS]; Mix_Music * rc_music; TCPsocket rc_socket[MAX_SOCKETS]; UDPsocket rc_udp_socket[MAX_SOCKETS]; UDPpacket * rc_udp_packet; int rc_udp_channel; string rc_udp_data; int rc_udp_len; int rc_udp_maxlen; string rc_udp_host; Uint16 rc_udp_port; int rc_packet_size = 0; SDLNet_SocketSet rc_socket_set; SDL_PixelFormat * rc_pformat; SDL_DisplayMode rc_displayMode[MAX_WINDOWS]; string rc_textinput_string = ""; //string * rc_textinput_oldString; string rc_textinput_char = ""; int rc_textinput_timer = 0; int rc_textinput_delay = 100; bool rc_textinput_flag = true; bool rc_textinput_isActive = false; int rc_textinput_waitHold = 800; bool rc_textinput_hold = false; bool rc_toggleBackspace = true; static Uint32 baseticks = 0; uint32_t rc_fps[MAX_WINDOWS]; uint32_t rc_fps_frames[MAX_WINDOWS]; uint32_t rc_fps_timer[MAX_WINDOWS]; #ifdef RC_MOBILE double rc_mouse_scale_x = 0; double rc_mouse_scale_y = 0; #else double rc_fullscreen_mouse_scale_x[MAX_WINDOWS]; double rc_fullscreen_mouse_scale_y[MAX_WINDOWS]; #endif // RC_MOBILE typedef struct AudioQueue { const THEORAPLAY_AudioPacket *audio; int offset; struct AudioQueue *next; } AudioQueue; static volatile AudioQueue *audio_queue = NULL; static volatile AudioQueue *audio_queue_tail = NULL; THEORAPLAY_Decoder *decoder = NULL; const THEORAPLAY_VideoFrame *video = NULL; const THEORAPLAY_AudioPacket *audio = NULL; SDL_Texture * overlay = NULL; void * overlay_pixels; int pitch; SDL_Event event; Uint32 framems = 0; int initfailed = 0; int quit = 0; bool rc_video_isPlaying = false; Uint32 rc_video_position = 0; bool rc_video_reset = false; int rc_video_loops = 0; const THEORAPLAY_AudioPacket * first_audio = NULL; const THEORAPLAY_VideoFrame * first_video = NULL; bool rc_audio_isOpen = false; bool rc_video_isLoaded = false; string rc_video_file = ""; bool rc_video_isPaused = false; Uint32 rc_video_pauseTicks = 0; bool rc_video_end = false; SDL_Rect rc_video_dstrect; int rc_video_width = 0; int rc_video_height = 0; int rc_video_length = 0; int rc_video_fps = 0; int rc_video_currentLoop = 0; bool mobile_active_window_flag = true; void rc_setTouchFingerEvent(SDL_FingerID fingerID, double x, double y, double pressure) { for(int i = 0; i < MAX_FINGERS; i++) { if(rc_finger[i].id == -1 || rc_finger[i].id == fingerID) { rc_finger[i].id = fingerID; rc_finger[i].x = x; rc_finger[i].y = y; rc_finger[i].pressure = pressure; if(rc_finger[i].pressure > 0) { rc_fingers_pressed.insert(i); } return; } } } int mobile_event_filter(void* userdata, SDL_Event* evt) { SDL_Event event = evt[0]; switch(evt->type) { case SDL_APP_WILLENTERBACKGROUND: mobile_active_window_flag = false; break; case SDL_APP_DIDENTERFOREGROUND: if(!mobile_active_window_flag) { //rc_win_renderer[0] = SDL_GetRenderer(rc_win[0]); } mobile_active_window_flag = true; break; case SDL_FINGERDOWN: rc_touch = 1; rc_touchX = event.tfinger.x * rc_win_width[rc_active_window]; rc_touchY = event.tfinger.y * rc_win_height[rc_active_window]; #ifdef RC_IOS rc_pressure = 1; //FIXME: On IOS pressure is always getting reported as 0 on finger down so I am just setting it to 1 until I figure this out #else rc_pressure = event.tfinger.pressure; #endif rc_setTouchFingerEvent(event.tfinger.fingerId, rc_touchX, rc_touchY, rc_pressure); break; case SDL_FINGERUP: rc_touch = 0; rc_mt_status = 0; rc_touchX = event.tfinger.x * rc_win_width[rc_active_window]; rc_touchY = event.tfinger.y * rc_win_height[rc_active_window]; rc_pressure = event.tfinger.pressure; rc_setTouchFingerEvent(event.tfinger.fingerId, -1, -1, 0); break; case SDL_FINGERMOTION: rc_touch = 1; rc_touchX = event.tfinger.x * rc_win_width[rc_active_window]; rc_touchY = event.tfinger.y * rc_win_height[rc_active_window]; rc_motionX = event.tfinger.dx * rc_win_width[rc_active_window]; rc_motionY = event.tfinger.dy * rc_win_height[rc_active_window]; #ifdef RC_IOS rc_pressure = 1; #else rc_pressure = event.tfinger.pressure; #endif rc_setTouchFingerEvent(event.tfinger.fingerId, rc_touchX, rc_touchY, rc_pressure); break; case SDL_MULTIGESTURE: rc_touch = 2; rc_mt_status = 1; rc_mt_x = event.mgesture.x; rc_mt_y = event.mgesture.y; rc_mt_numFingers = event.mgesture.numFingers; rc_mt_dist = event.mgesture.dDist; rc_mt_theta = event.mgesture.dTheta; #ifdef RC_IOS rc_pressure = 1; #else rc_pressure = event.tfinger.pressure; #endif break; } return 0; } bool rc_media_init() { rc_socket_set = SDLNet_AllocSocketSet(MAX_SOCKETS*2); //*2 for udp and tcp if(rc_socket_set == NULL) { cout << "Init Error: " << SDL_GetError() << endl; } for(int i = 0; i < MAX_SOCKETS; i++) { rc_socket[i] = NULL; rc_udp_socket[i] = NULL; } for(int i = 0; i < MAX_FONTS; i++) rc_draw_font[i] = NULL; for(int i = 0; i < MAX_SOUNDS; i++) rc_sound[i] = NULL; rc_music = NULL; for(int i = 0; i < MAX_WINDOWS; i++) { rc_win[i] = NULL; rc_win_surface[i] = NULL; rc_win_renderer[i] = NULL; rc_win_id[i] = 0; rc_hconsole[i] = NULL; rc_backBuffer[i] = NULL; rc_bb_rect[i].x = 0; rc_bb_rect[i].y = 0; rc_bb_rect[i].w = 0; rc_bb_rect[i].h = 0; rc_fps[i] = 0; rc_fps_frames[i] = 0; rc_fps_timer[i] = 0; for(int j = 0; j < MAX_SCREENS; j++) { rc_hscreen[i][j] = NULL; rc_sscreen[i][j] = NULL; rc_screen_rect[i][j].x = 0; rc_screen_rect[i][j].y = 0; rc_screen_rect[i][j].w = 0; rc_screen_rect[i][j].h = 0; rc_screen_z[i][j] = j; rc_screen_zOrder[i][j] = j; rc_screen_visible[i][j] = false; } } for(int i = 0; i < MAX_IMAGES; i++) { for(int w = 0; w < MAX_WINDOWS; w++) rc_himage[i][w] = NULL; rc_simage[i] = NULL; rc_image_rect[i].x = 0; rc_image_rect[i].y = 0; rc_image_rect[i].w = 0; rc_image_rect[i].h = 0; rc_image_isLoaded[i] = false; } rc_ink_color.r = 0; rc_ink_color.g = 0; rc_ink_color.b = 0; rc_ink_color.a = 0; #ifdef RC_WEB if(SDL_Init(SDL_INIT_AUDIO | SDL_INIT_EVENTS | SDL_INIT_TIMER | SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0) #else if(SDL_Init(SDL_INIT_AUDIO | SDL_INIT_EVENTS | SDL_INIT_TIMER | SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC | SDL_INIT_SENSOR) < 0) #endif { cout << "Init Error: " << SDL_GetError() << endl; //return false; } #ifdef RC_MOBILE SDL_SetEventFilter(mobile_event_filter, NULL); #endif // RC_MOBILE if(IMG_Init(IMG_INIT_JPG | IMG_INIT_PNG | IMG_INIT_TIF) < 0) { cout << "IMG Init Error: " << IMG_GetError() << endl; //return false; } if(TTF_Init() < 0) { cout << "TTF Init Error: " << TTF_GetError() << endl; //return false; } if(Mix_OpenAudio(MIX_DEFAULT_FREQUENCY, MIX_DEFAULT_FORMAT, 2, 2048) < 0) { cout << "OpenAudio Error: " << Mix_GetError() << endl; } if (SDLNet_Init() < 0) { fprintf(stderr, "SDLNet_Init: %s\n", SDLNet_GetError()); exit(EXIT_FAILURE); } for(int i = 0; i < MAX_FINGERS; i++) { rc_finger[i].id = -1; rc_finger[i].x = -1; rc_finger[i].y = -1; rc_finger[i].pressure = 0; } for(int i = 0; i < SDL_NumSensors(); i++) { rc_accel[num_accels] = NULL; rc_gyro[num_gyros] = NULL; switch(SDL_SensorGetDeviceType(i)) { case SDL_SENSOR_ACCEL: rc_accel[num_accels] = SDL_SensorOpen(i); num_accels++; break; case SDL_SENSOR_GYRO: rc_gyro[num_gyros] = SDL_SensorOpen(i); num_gyros++; break; } } rc_pformat = SDL_AllocFormat(SDL_PIXELFORMAT_ARGB8888); //rc_active_font = -1; rc_udp_packet = SDLNet_AllocPacket(512); rc_packet_size = 512; rc_console_pen.r = 255; rc_console_pen.g = 255; rc_console_pen.b = 255; rc_console_pen.a = 0; rc_media_isActive = true; for(int i = 0; i < MAX_JOYSTICKS; i++) { if(i < SDL_NumJoysticks()) { rc_joystick[i] = SDL_JoystickOpen(i); if(rc_joystick[i]==NULL) { cout << "Joystick " << i << " could not be opened: " << SDL_GetError() << endl; } rc_joyID[i] = SDL_JoystickInstanceID(rc_joystick[i]); #ifdef RC_WEB rc_haptic[i] = NULL; #else rc_haptic[i] = SDL_HapticOpenFromJoystick(rc_joystick[i]); SDL_HapticRumbleInit(rc_haptic[i]); #endif //if(rc_haptic[i] == NULL){ cout << "HAP NULL: " << SDL_GetError() << endl; } rc_numJoysticks++; } else { rc_joystick[i] = NULL; rc_haptic[i] = NULL; rc_joyID[i] = -1; } } SDL_SetHint("SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS", "1"); return true; } void rc_media_quit() { for(int i = 0; i < MAX_FONTS; i++) { if(rc_draw_font[i] != NULL) TTF_CloseFont(rc_draw_font[i]); } //cout << "Font closed" << endl; for(int i = 0; i < MAX_SOUNDS; i++) { if(rc_sound[i] != NULL) Mix_FreeChunk(rc_sound[i]); rc_sound[i] = NULL; } if(rc_music != NULL) Mix_FreeMusic(rc_music); rc_music = NULL; for(int i = 0; i < MAX_JOYSTICKS; i++) { SDL_JoystickClose(rc_joystick[i]); SDL_HapticClose(rc_haptic[i]); } //cout << "Music Closed" << endl; for(int i = 0; i < MAX_WINDOWS; i++) { //cout << "Destroy Canvases" << endl; for(int j = 0; j < MAX_SCREENS; j++) { if(rc_sscreen[i][j] != NULL) { //cout << "Free Surface rc_sscreen[" << i << "][" << j << "] ----- "; SDL_FreeSurface(rc_sscreen[i][j]); //cout << "SUCCESS\n"; //SDL_DestroyTexture(rc_hscreen[i][j]); } if(rc_hscreen[i][j] != NULL) { SDL_DestroyTexture(rc_hscreen[i][j]); } } //cout << "Destroy Images" << endl; for(int j = 0; j < MAX_IMAGES; j++) { if(rc_himage[j][i] != NULL) SDL_DestroyTexture(rc_himage[j][i]); rc_himage[j][i] = NULL; } //cout << "Destroy Window #" << i << endl; if(rc_win[i] != NULL) { SDL_DestroyRenderer(rc_win_renderer[i]); rc_win_renderer[i] = NULL; SDL_DestroyWindow(rc_win[i]); rc_win[i] = NULL; } } //cout << "NORMAL BOOTS" << endl; if(audio) { THEORAPLAY_freeAudio(audio); audio = NULL; } if(video) { THEORAPLAY_freeVideo(video); video = NULL; } if(decoder) { THEORAPLAY_stopDecode(decoder); decoder = NULL; } IMG_Quit(); TTF_Quit(); Mix_Quit(); if(rc_socket_set) { SDLNet_FreeSocketSet(rc_socket_set); rc_socket_set = NULL; } //SDLNet_FreePacket(rc_udp_packet); SDLNet_Quit(); SDL_Quit(); } int rc_debug_msg(string msg) { const SDL_MessageBoxButtonData buttons[] = { { /* .flags, .buttonid, .text */ 0, 0, "no" }, { SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT, 1, "yes" }, { SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT, 2, "cancel" }, }; const SDL_MessageBoxColorScheme colorScheme = { { /* .colors (.r, .g, .b) */ /* [SDL_MESSAGEBOX_COLOR_BACKGROUND] */ { 255, 0, 0 }, /* [SDL_MESSAGEBOX_COLOR_TEXT] */ { 0, 255, 0 }, /* [SDL_MESSAGEBOX_COLOR_BUTTON_BORDER] */ { 255, 255, 0 }, /* [SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND] */ { 0, 0, 255 }, /* [SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED] */ { 255, 0, 255 } } }; const SDL_MessageBoxData messageboxdata = { SDL_MESSAGEBOX_INFORMATION, /* .flags */ NULL, /* .window */ msg.c_str(), /* .title */ "select a button", /* .message */ SDL_arraysize(buttons), /* .numbuttons */ buttons, /* .buttons */ &colorScheme /* .colorScheme */ }; int buttonid; if (SDL_ShowMessageBox(&messageboxdata, &buttonid) < 0) { SDL_Log("error displaying message box"); return 1; } if (buttonid == -1) { SDL_Log("no selection"); } else { SDL_Log("selection was %s", buttons[buttonid].text); } return 0; } inline Uint32 rc_media_windowMode(int visible_flag, int fullscreen_flag, int resizable_flag, int borderless_flag, int highDPI_flag) { Uint32 window_mode = ( visible_flag == 0 ? SDL_WINDOW_HIDDEN : SDL_WINDOW_SHOWN ) | ( fullscreen_flag == 0 ? 0 : SDL_WINDOW_FULLSCREEN_DESKTOP ) | ( resizable_flag == 0 ? 0 : SDL_WINDOW_RESIZABLE ) | ( borderless_flag == 0 ? 0 : SDL_WINDOW_BORDERLESS ) | ( highDPI_flag == 0 ? 0 : SDL_WINDOW_ALLOW_HIGHDPI ); return window_mode; } inline Uint32 rc_media_windowFlags(int win_num) { if(win_num < 0 || win_num >= MAX_WINDOWS) { cout << "Window #" << win_num << " is not an available Window Slot" << endl; return 0; } if(rc_win[win_num] == NULL) { cout << "Window #" << win_num << " is not currently open" << endl; return 0; } return SDL_GetWindowFlags(rc_win[win_num]); } inline bool rc_media_openWindow_hw(int win_num, string caption, int x, int y, int w, int h, Uint32 flags, int vsync_flag) { //cout << "start windowOpen" << endl; if(win_num < 0 || win_num >= MAX_WINDOWS) { cout << "Window #" << win_num << " is not an available Window Slot" << endl; return false; } if(rc_win[win_num] != NULL) { cout << "Window #" << win_num << " is currently open" << endl; return false; } bool vsync = vsync_flag == 0 ? false : true; rc_win_exitOnClose[win_num] = true; #ifdef RC_MOBILE flags = flags | SDL_WINDOW_FULLSCREEN_DESKTOP; #endif // RC_MOBILE rc_win[win_num] = SDL_CreateWindow(caption.c_str(), x, y, w, h, flags); if(rc_win[win_num] == NULL) { cout << "Error: " << SDL_GetError() << endl; return false; } if(rc_active_window == -1) rc_active_window = win_num; //rc_win_surface[win_num] = SDL_GetWindowSurface(rc_win[win_num]); rc_win_id[win_num] = SDL_GetWindowID(rc_win[win_num]); rc_win_width[win_num] = w; rc_win_height[win_num] = h; //SDL_SetSurfaceRLE(rc_win_surface[win_num],1); //rc_console = SDL_CreateRGBSurface(0, w, h, 32, 0, 0, 0, 0); //SDL_SetColorKey(rc_console, SDL_TRUE, rc_clearColor); //cout << "boob physics" << endl; #ifdef RC_MOBILE rc_win_renderer[win_num] = SDL_GetRenderer(rc_win[win_num]); if(rc_win_renderer[win_num] != NULL) { SDL_DestroyRenderer(rc_win_renderer[win_num]); } #endif // RC_MOBILE if(vsync) rc_win_renderer[win_num] = SDL_CreateRenderer(rc_win[win_num], -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE | SDL_RENDERER_PRESENTVSYNC); else rc_win_renderer[win_num] = SDL_CreateRenderer(rc_win[win_num], -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE); if(rc_win_renderer[win_num] == NULL) { #ifdef RC_ANDROID //rc_debug_msg("No Renderer"); __android_log_write(ANDROID_LOG_ERROR, "This is crazy: ", SDL_GetError()); rc_win_renderer[win_num] = SDL_GetRenderer(rc_win[win_num]); if(rc_win_renderer[win_num] == NULL) { __android_log_write(ANDROID_LOG_ERROR, "Renderer Error: ", SDL_GetError()); exit(0); } SDL_DestroyRenderer(rc_win_renderer[win_num]); rc_win_renderer[win_num] = NULL; if(vsync) rc_win_renderer[win_num] = SDL_CreateRenderer(rc_win[win_num], -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE); else rc_win_renderer[win_num] = SDL_CreateRenderer(rc_win[win_num], -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE); if(rc_win_renderer[win_num] == NULL) { __android_log_write(ANDROID_LOG_ERROR, "Renderer Error2: ", SDL_GetError()); exit(0); } #else cout << "WindowOpen Error: " << SDL_GetError() << endl; exit(0); #endif } SDL_SetRenderDrawBlendMode(rc_win_renderer[win_num], SDL_BLENDMODE_BLEND); //cout << "booty" << endl; #ifndef RC_MOBILE for(int i = 0; i < MAX_IMAGES; i++) { if(rc_image_isLoaded[i]) { for(int w = 0; w < MAX_WINDOWS; w++) { if(rc_win[w] != NULL && rc_himage[i][w]==NULL) { SDL_Surface * tmp_surf = SDL_CreateRGBSurface(0, rc_image_width[i], rc_image_height[i], 32, 0, 0, 0, 0); //cout << "ColorKey = " << (Uint32)rc_image_colorKey_r[i] << ", "; //cout << (Uint32)rc_image_colorKey_g[i] << ", "; //cout << (Uint32)rc_image_colorKey_b[i] << ", "; //cout << (Uint32)rc_image_colorKey_a[i] << endl; SDL_FillRect(tmp_surf, NULL, rc_image_colorKey[i]); SDL_SetRenderTarget(rc_win_renderer[w], NULL); SDL_Rect t_rect; t_rect.x = 0; t_rect.y = 0; t_rect.w = tmp_surf->w; t_rect.h = tmp_surf->h; Uint8 r, g, b, a; SDL_GetRenderDrawColor(rc_win_renderer[w], &r, &g, &b, &a); SDL_SetRenderDrawColor(rc_win_renderer[w], rc_image_colorKey_r[i], rc_image_colorKey_g[i], rc_image_colorKey_b[i], 255); SDL_RenderFillRect(rc_win_renderer[w], NULL); SDL_SetRenderDrawColor(rc_win_renderer[w], r, g, b, a); SDL_RenderCopy(rc_win_renderer[w], rc_himage[i][w], NULL, &t_rect); SDL_RenderReadPixels(rc_win_renderer[w],&t_rect,tmp_surf->format->format,tmp_surf->pixels,tmp_surf->pitch); SDL_SetColorKey(tmp_surf, SDL_TRUE, rc_image_colorKey[i]); rc_himage[i][w] = SDL_CreateTextureFromSurface(rc_win_renderer[w], tmp_surf); SDL_FreeSurface(tmp_surf); break; } } } } #endif // RC_MOBILE //SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); //SDL_RenderSetLogicalSize(rc_win_renderer[win_num], w, h); //cout << "boobs" << endl; rc_backBuffer[win_num] = SDL_CreateTexture(rc_win_renderer[win_num], rc_pformat->format, SDL_TEXTUREACCESS_TARGET, w, h); //cout << "dbg 1" << endl; #ifdef RC_MOBILE if(SDL_GetDesktopDisplayMode(0, &rc_displayMode[win_num])<0) { cout << "Something happend: " << SDL_GetError() << endl; } #else if(SDL_GetWindowDisplayMode(rc_win[win_num], &rc_displayMode[win_num])<0) { cout << "Something happend: " << SDL_GetError() << endl; } #endif // RC_ANDROID //cout << "dbg 2" << endl; rc_bb_rect[win_num].x = 0; rc_bb_rect[win_num].y = 0; //cout << "dbg 3" << endl; rc_bb_rect[win_num].w = rc_displayMode[win_num].w; //cout << "dbg 4" << endl; rc_bb_rect[win_num].h = rc_displayMode[win_num].h; //cout << "cunt" << endl; #ifdef RC_MOBILE rc_mouse_scale_x = (double)((double)w / (double)rc_displayMode[win_num].w); rc_mouse_scale_y = (double)((double)h / (double)rc_displayMode[win_num].h); #else if((flags&SDL_WINDOW_FULLSCREEN_DESKTOP)!=0) { //cout << "fullscreen" << endl; //cout << "W = " << w << endl; //cout << "D.W = " << rc_displayMode[win_num].w << endl; rc_fullscreen_mouse_scale_x[win_num] = (double)((double)w / (double)rc_displayMode[win_num].w); //cout << "fs = " << rc_fullscreen_mouse_scale_x[win_num] << endl; rc_fullscreen_mouse_scale_y[win_num] = (double)((double)h / (double)rc_displayMode[win_num].h); //cout << "display mode = " << rc_fullscreen_mouse_scale_x[win_num] << ", " << rc_fullscreen_mouse_scale_y[win_num] << endl; } else { rc_fullscreen_mouse_scale_x[win_num] = 1; rc_fullscreen_mouse_scale_y[win_num] = 1; } #endif // RC_ANDROID //#ifndef RC_ANDROID rc_hconsole[win_num] = SDL_CreateTexture(rc_win_renderer[win_num],rc_pformat->format,SDL_TEXTUREACCESS_TARGET,w,h); SDL_SetTextureBlendMode(rc_hconsole[win_num], SDL_BLENDMODE_BLEND); SDL_SetRenderTarget(rc_win_renderer[win_num], rc_hconsole[win_num]); SDL_SetRenderDrawColor(rc_win_renderer[win_num], 0, 0, 0, 0); SDL_RenderClear(rc_win_renderer[win_num]); SDL_SetRenderTarget(rc_win_renderer[win_num], NULL); //#endif // RC_ANDROID //cout << "wtf" << endl; rc_console_width[win_num] = w/8; rc_console_height[win_num] = h/8; rc_sConsole_x[win_num] = 0; rc_sConsole_y[win_num] = 0; //cout << "cdi" << endl; #ifdef RC_MOBILE SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_backBuffer[rc_active_window]); SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], 0, 0, 0, 255); SDL_RenderClear(rc_win_renderer[rc_active_window]); SDL_SetRenderTarget(rc_win_renderer[rc_active_window], NULL); SDL_RenderClear(rc_win_renderer[rc_active_window]); rc_win_width[win_num] = w; rc_win_height[win_num] = h; #else SDL_SetRenderDrawColor(rc_win_renderer[win_num], 0, 0, 0, 255); SDL_RenderClear(rc_win_renderer[win_num]); #endif // RC_ANDROID SDL_RenderPresent(rc_win_renderer[win_num]); //cout << "open complete" << endl; //rc_debug_msg("Window Creation Successful"); return true; } inline void rc_media_closeWindow_hw(int win_num) { if(win_num < 0 && win_num >= MAX_WINDOWS) { cout << "Window Index is out of Range" << endl; return; } SDL_DestroyTexture(rc_hconsole[win_num]); SDL_DestroyTexture(rc_backBuffer[win_num]); SDL_DestroyRenderer(rc_win_renderer[win_num]); if(rc_win[win_num]!=NULL) SDL_DestroyWindow(rc_win[win_num]); rc_win_renderer[win_num] = NULL; rc_win[win_num] = NULL; } inline int rc_media_setRenderScaleQuality(int n) { stringstream s; s << n; if(SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, s.str().c_str())) return 1; return 0; } inline int rc_media_getRenderScaleQuality() { string hint = SDL_GetHint(SDL_HINT_RENDER_SCALE_QUALITY) == NULL ? "" : SDL_GetHint(SDL_HINT_RENDER_SCALE_QUALITY); int hint_val = 0; if(hint.compare("")!=0) { #ifdef RC_WINDOWS hint_val = atoi(hint.c_str()); #else #ifdef RC_ANDROID hint_val = atoi(hint.c_str()); #else hint_val = stoi(hint); #endif #endif } return hint_val; } inline void rc_media_getDesktopDisplayMode(int index, double * w, double * h, double * freq) { SDL_DisplayMode dm; SDL_GetDesktopDisplayMode(index, &dm); *w = (double)dm.w; *h = (double)dm.h; *freq = (double)dm.refresh_rate; } inline void rc_media_setActiveWindow(int win_num) { if(win_num < 0 || win_num >= MAX_WINDOWS) { cout << "Window Index Out of Range" << endl; return; } rc_active_window = win_num; } void rc_media_raiseWindow(int win_num) { if(win_num < 0 || win_num >= MAX_WINDOWS) { cout << "Window Index Out of Range" << endl; return; } if(rc_win[win_num]==NULL) { //cout << "Window does not Exist" << endl; return; } rc_active_window = win_num; SDL_RaiseWindow(rc_win[win_num]); } void rc_media_showWindow(int win_num) { if(win_num < 0 || win_num >= MAX_WINDOWS) { cout << "Window Index Out of Range" << endl; return; } if(rc_win[win_num]==NULL) { //cout << "Window does not Exist" << endl; return; } SDL_ShowWindow(rc_win[win_num]); } void rc_media_hideWindow(int win_num) { if(win_num < 0 || win_num >= MAX_WINDOWS) { cout << "Window Index Out of Range" << endl; return; } if(rc_win[win_num]==NULL) { //cout << "Window does not Exist" << endl; return; } SDL_HideWindow(rc_win[win_num]); } bool rc_winCheck(int win_num) { if(win_num < 0 || win_num >= MAX_WINDOWS) { cout << "Window Index Out of Range" << endl; return false; } if(rc_win[win_num]==NULL) { //cout << "Window does not Exist" << endl; return false; } return true; } void rc_media_setWindowTitle(int win_num, string title) { if(rc_winCheck(win_num)) { SDL_SetWindowTitle(rc_win[win_num], title.c_str()); } else { cout << "SetWindowTitle Error: Window #" << win_num << " is not an active window" << endl; } } string rc_media_getWindowTitle(int win_num) { if(rc_winCheck(win_num)) { return SDL_GetWindowTitle(rc_win[win_num]); } else { cout << "WindowTitle Error: Window #" << win_num << " is not an active window" << endl; return ""; } } void rc_media_setWindowPosition(int win_num, int x, int y) { if(rc_winCheck(win_num)) SDL_SetWindowPosition(rc_win[win_num], x, y); else cout << "SetWindowPosition Error: Window #" << win_num << " is not an active window" << endl; } void rc_media_getWindowPosition(int win_num, double * x, double * y) { int x_data=0, y_data=0; if(rc_winCheck(win_num)) SDL_GetWindowPosition(rc_win[win_num],&x_data,&y_data); else cout << "GetWindowPosition Error: Window #" << win_num << " is not an active window" << endl; *x = x_data; *y = y_data; } void rc_onResize(int win_num) { SDL_Texture * current_tgt = SDL_GetRenderTarget(rc_win_renderer[win_num]); int w = 0; int h = 0; SDL_DestroyTexture(rc_backBuffer[win_num]); rc_backBuffer[win_num] = NULL; Uint32 win_flags = SDL_GetWindowFlags(rc_win[win_num]); if( (win_flags & SDL_WINDOW_RESIZABLE) && !(win_flags & SDL_WINDOW_FULLSCREEN_DESKTOP) ) SDL_GetWindowSize(rc_win[win_num], &w, &h); else { w = rc_win_width[win_num]; h = rc_win_height[win_num]; } rc_win_width[win_num] = w; rc_win_height[win_num] = h; //cout << "debug1: " << w << ", " << h << endl; rc_backBuffer[win_num] = SDL_CreateTexture(rc_win_renderer[win_num], rc_pformat->format, SDL_TEXTUREACCESS_TARGET, w, h); #ifdef RC_MOBILE if(SDL_GetDesktopDisplayMode(0, &rc_displayMode[win_num])<0) { cout << "Something happend: " << SDL_GetError() << endl; } #else if(SDL_GetWindowDisplayMode(rc_win[win_num], &rc_displayMode[win_num])<0) { cout << "Something happend: " << SDL_GetError() << endl; } #endif // RC_ANDROID rc_bb_rect[win_num].x = 0; rc_bb_rect[win_num].y = 0; rc_bb_rect[win_num].w = rc_displayMode[win_num].w; rc_bb_rect[win_num].h = rc_displayMode[win_num].h; //cout << "bb_rect = " << rc_bb_rect[win_num].w << ", " << rc_bb_rect[win_num].h << endl; Uint32 flags = SDL_GetWindowFlags(rc_win[win_num]); #ifdef RC_MOBILE rc_mouse_scale_x = (double)((double)w / (double)rc_displayMode[win_num].w); rc_mouse_scale_y = (double)((double)h / (double)rc_displayMode[win_num].h); #else if((flags & SDL_WINDOW_FULLSCREEN_DESKTOP)!=0) { rc_fullscreen_mouse_scale_x[win_num] = (double)((double)rc_win_width[win_num] / (double)rc_displayMode[win_num].w); rc_fullscreen_mouse_scale_y[win_num] = (double)((double)rc_win_height[win_num] / (double)rc_displayMode[win_num].h); //cout << "resize_fullscreen: " << w << " / " << rc_displayMode[win_num].w << endl; } else { //cout << "resize window mode" << endl; rc_fullscreen_mouse_scale_x[win_num] = 1; rc_fullscreen_mouse_scale_y[win_num] = 1; } #endif // RC_ANDROID SDL_DestroyTexture(rc_hconsole[win_num]); rc_hconsole[win_num] = SDL_CreateTexture(rc_win_renderer[win_num],rc_pformat->format,SDL_TEXTUREACCESS_TARGET,w,h); SDL_SetTextureBlendMode(rc_hconsole[win_num], SDL_BLENDMODE_BLEND); SDL_SetRenderTarget(rc_win_renderer[win_num], rc_hconsole[win_num]); SDL_SetRenderDrawColor(rc_win_renderer[win_num], 0, 0, 0, 0); SDL_RenderClear(rc_win_renderer[win_num]); SDL_SetRenderTarget(rc_win_renderer[win_num], current_tgt); rc_console_width[win_num] = w/8; rc_console_height[win_num] = h/8; rc_sConsole_x[win_num] = 0; rc_sConsole_y[win_num] = 0; } void rc_media_setWindowSize(int win_num, int w, int h) { if(rc_winCheck(win_num)) { SDL_SetWindowSize(rc_win[win_num], w, h); rc_win_width[win_num] = w; rc_win_height[win_num] = h; rc_onResize(win_num); } else cout << "SetWindowSize Error: Window #" << win_num << " is not an active window" << endl; } void rc_media_getWindowSize(int win_num, double * w, double * h) { int w_data = -1, h_data = -1; if(rc_winCheck(win_num)) SDL_GetWindowSize(rc_win[win_num], &w_data, &h_data); else cout << "GetWindowSize Error: Window#" << win_num << " is not an active window" << endl; *w = w_data; *h = h_data; } void rc_media_setWindowMinSize(int win_num, int w, int h) { if(rc_winCheck(win_num)) SDL_SetWindowMinimumSize(rc_win[win_num], w, h); else cout << "SetWindowMinSize Error: Window#" << win_num << " is not an active window" << endl; } void rc_media_getWindowMinSize(int win_num, double * w, double * h) { int w_data=0, h_data=0; if(rc_winCheck(win_num)) SDL_GetWindowMinimumSize(rc_win[win_num], &w_data, &h_data); else cout << "GetWindowMinSize Error: Window #" << win_num << " is not an active window" << endl; *w = w_data; *h = h_data; } void rc_media_setWindowMaxSize(int win_num, int w, int h) { if(rc_winCheck(win_num)) SDL_SetWindowMaximumSize(rc_win[win_num], w, h); else cout << "SetWindowMaxSize Error: Window #" << win_num << " is not an active window" << endl; } void rc_media_getWindowMaxSize(int win_num, double * w, double * h) { int w_data=0, h_data=0; if(rc_winCheck(win_num)) SDL_GetWindowMaximumSize(rc_win[win_num], &w_data, &h_data); else cout << "GetWindowMaxSize Error: Window #" << win_num << " is not an active window" << endl; *w = w_data; *h = h_data; } bool rc_media_windowIsFullscreen(int win_num) { if(rc_winCheck(win_num)) { Uint32 wflags = SDL_GetWindowFlags(rc_win[win_num]); Uint32 wflags_cmp1 = wflags & SDL_WINDOW_FULLSCREEN; Uint32 wflags_cmp2 = wflags & SDL_WINDOW_FULLSCREEN_DESKTOP; if(wflags_cmp1 || wflags_cmp2) { //cout << "wflags = " << (int)wflags << endl; //cout << "SDL_WIN_FSCREEN = " << (int)SDL_WINDOW_FULLSCREEN << endl; //cout << "SDL_WIN_FSCREEN_D = " << (int)SDL_WINDOW_FULLSCREEN_DESKTOP << endl; return true; } else { //cout << "wflags = " << (int)wflags << endl; //cout << "SDL_WIN_FSCREEN = " << (int)SDL_WINDOW_FULLSCREEN << endl; //cout << "SDL_WIN_FSCREEN_D = " << (int)SDL_WINDOW_FULLSCREEN_DESKTOP << endl; return false; } } else { cout << "WindowIsFullscreen Error: Window #" << win_num << " is not an active window" << endl; return false; } } bool rc_media_windowIsVisible(int win_num) { if(rc_winCheck(win_num)) { Uint32 wflags = SDL_GetWindowFlags(rc_win[win_num]); if(wflags & SDL_WINDOW_SHOWN) return true; else return false; } else { cout << "WindowIsVisible Error: Window #" << win_num << " is not an active window" << endl; return false; } } bool rc_media_windowHasMouseFocus(int win_num) { if(rc_winCheck(win_num)) { Uint32 wflags = SDL_GetWindowFlags(rc_win[win_num]); if(wflags & SDL_WINDOW_MOUSE_FOCUS) return true; else return false; } else { cout << "WindowHasMouseFocus Error: Window #" << win_num << " is not an active window" << endl; return false; } } bool rc_media_windowHasInputFocus(int win_num) { if(rc_winCheck(win_num)) { Uint32 wflags = SDL_GetWindowFlags(rc_win[win_num]); if(wflags & SDL_WINDOW_INPUT_FOCUS) return true; else return false; } else { cout << "WindowHasInputFocus Error: Window #" << win_num << " is not an active window" << endl; return false; } } bool rc_media_windowIsBordered(int win_num) { if(rc_winCheck(win_num)) { Uint32 wflags = SDL_GetWindowFlags(rc_win[win_num]); if(wflags & SDL_WINDOW_BORDERLESS) return false; else return true; } else { cout << "WindowIsBordered Error: Window #" << win_num << " is not an active window" << endl; return false; } } bool rc_media_windowIsResizable(int win_num) { if(rc_winCheck(win_num)) { Uint32 wflags = SDL_GetWindowFlags(rc_win[win_num]); if(wflags & SDL_WINDOW_RESIZABLE) return true; else return false; } else { cout << "WindowIsResizable Error: Window #" << win_num << " is not an active window" << endl; return false; } } bool rc_media_windowIsMinimized(int win_num) { if(rc_winCheck(win_num)) { Uint32 wflags = SDL_GetWindowFlags(rc_win[win_num]); if(wflags & SDL_WINDOW_MINIMIZED) return true; else return false; } else { cout << "WindowIsMinimized Error: Window #" << win_num << " is not an active window" << endl; return false; } } bool rc_media_windowIsMaximized(int win_num) { if(rc_winCheck(win_num)) { Uint32 wflags = SDL_GetWindowFlags(rc_win[win_num]); if(wflags & SDL_WINDOW_MAXIMIZED) return true; else return false; } else { cout << "WindowIsMaximized Error: Window #" << win_num << " is not an active window" << endl; return false; } } void rc_media_setWindowFullscreen(int win_num, int flag) { if(rc_winCheck(win_num)) { switch(flag) { case 0: flag = 0; break; default: flag = SDL_WINDOW_FULLSCREEN_DESKTOP; break; } Uint32 wflags_preOp = SDL_GetWindowFlags(rc_win[win_num]); if( flag != 0 && ( (wflags_preOp & SDL_WINDOW_FULLSCREEN_DESKTOP) || (wflags_preOp & SDL_WINDOW_FULLSCREEN) ) ) return; else if( flag == 0 && !((wflags_preOp & SDL_WINDOW_FULLSCREEN_DESKTOP) || (wflags_preOp & SDL_WINDOW_FULLSCREEN))) return; if(SDL_SetWindowFullscreen(rc_win[win_num], flag) < 0) { cout << "SetWindowFullscreen Error: " << SDL_GetError() << endl; return; } rc_win_renderer[win_num] = SDL_GetRenderer(rc_win[win_num]); //cout << "debug = " << (rc_win_renderer[win_num] == NULL) << endl; Uint32 wflags = SDL_GetWindowFlags(rc_win[win_num]); Uint32 wflags_cmp1 = wflags & SDL_WINDOW_FULLSCREEN; Uint32 wflags_cmp2 = wflags & SDL_WINDOW_FULLSCREEN_DESKTOP; if(!(wflags_cmp1 || wflags_cmp2)) { #ifndef RC_MOBILE rc_fullscreen_mouse_scale_x[win_num] = 1; rc_fullscreen_mouse_scale_y[win_num] = 1; #endif // RC_MOBILE } else if(SDL_GetWindowDisplayMode(rc_win[win_num], &rc_displayMode[win_num])<0) { cout << "Something happend: " << SDL_GetError() << endl; #ifndef RC_MOBILE rc_fullscreen_mouse_scale_x[win_num] = 1; rc_fullscreen_mouse_scale_y[win_num] = 1; #endif // RC_MOBILE } else { #ifndef RC_MOBILE rc_fullscreen_mouse_scale_x[win_num] = (double)((double)rc_win_width[win_num] / (double)rc_displayMode[win_num].w); rc_fullscreen_mouse_scale_y[win_num] = (double)((double)rc_win_height[win_num] / (double)rc_displayMode[win_num].h); #endif // RC_MOBILE } SDL_PumpEvents(); SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT); // SDL_GetWindowDisplayMode(rc_win[win_num],&rc_displayMode[win_num]); //rc_bb_rect[win_num].w = rc_displayMode[win_num].w; //rc_bb_rect[win_num].h = rc_displayMode[win_num].h; //rc_win_surface[win_num] = SDL_GetWindowSurface(rc_win[win_num]); } else cout << "SetWindowFullscreen Error: Window #" << win_num << " is not an active window" << endl; } void rc_media_maximizeWindow(int win_num) { if(rc_winCheck(win_num)) { SDL_MaximizeWindow(rc_win[win_num]); if( (SDL_GetWindowFlags(rc_win[win_num]) & SDL_WINDOW_RESIZABLE) ) return; SDL_GetWindowDisplayMode(rc_win[win_num],&rc_displayMode[win_num]); rc_bb_rect[win_num].w = rc_displayMode[win_num].w; rc_bb_rect[win_num].h = rc_displayMode[win_num].h; rc_win_surface[win_num] = SDL_GetWindowSurface(rc_win[win_num]); #ifndef RC_MOBILE rc_fullscreen_mouse_scale_x[win_num] = (double)((double)rc_win_width[win_num] / (double)rc_displayMode[win_num].w); rc_fullscreen_mouse_scale_y[win_num] = (double)((double)rc_win_height[win_num] / (double)rc_displayMode[win_num].h); #endif // RC_MOBILE } else cout << "MaximizeWindow Error: Window #" << win_num << " is not an active window" << endl; } void rc_media_minimizeWindow(int win_num) { if(rc_winCheck(win_num)) { SDL_MinimizeWindow(rc_win[win_num]); SDL_GetWindowDisplayMode(rc_win[win_num],&rc_displayMode[win_num]); rc_bb_rect[win_num].w = rc_displayMode[win_num].w; rc_bb_rect[win_num].h = rc_displayMode[win_num].h; rc_win_surface[win_num] = SDL_GetWindowSurface(rc_win[win_num]); #ifndef RC_MOBILE rc_fullscreen_mouse_scale_x[win_num] = (double)((double)rc_win_width[win_num] / (double)rc_displayMode[win_num].w); rc_fullscreen_mouse_scale_y[win_num] = (double)((double)rc_win_height[win_num] / (double)rc_displayMode[win_num].h); #endif // RC_MOBILE } else cout << "MinimizeWindow Error: Window #" << win_num << " is not an active window" << endl; } void rc_media_setWindowBordered(int win_num, bool b) { SDL_bool bswitch = SDL_FALSE; if(b) bswitch = SDL_TRUE; if(rc_winCheck(win_num)) SDL_SetWindowBordered(rc_win[win_num], bswitch); else cout << "SetWindowBorder Error: Window #" << win_num << " is not an active window" << endl; } void rc_media_setWindowResizable(int win_num, bool b) { SDL_bool bswitch = SDL_FALSE; if(b) bswitch = SDL_TRUE; if(rc_winCheck(win_num)) SDL_SetWindowResizable(rc_win[win_num], bswitch); else cout << "SetWindowResizable Error: Window #" << win_num << " is not an active window" << endl; } int rc_media_numWindows() { int num = 0; for(int i = 0; i < MAX_WINDOWS; i++) if(rc_win[i]) num++; return num; } bool rc_media_windowExists(int win_num) { if(rc_winCheck(win_num)) { if(rc_win[win_num]) return true; return false; } return false; } void rc_media_restoreWindow(int win_num) { if(rc_winCheck(win_num)) { SDL_RestoreWindow(rc_win[win_num]); SDL_GetWindowDisplayMode(rc_win[win_num], &rc_displayMode[win_num]); rc_bb_rect[win_num].w = rc_displayMode[win_num].w; rc_bb_rect[win_num].h = rc_displayMode[win_num].h; rc_win_surface[win_num] = SDL_GetWindowSurface(rc_win[win_num]); #ifndef RC_MOBILE rc_fullscreen_mouse_scale_x[win_num] = (double)((double)rc_win_width[win_num] / (double)rc_displayMode[win_num].w); rc_fullscreen_mouse_scale_y[win_num] = (double)((double)rc_win_height[win_num] / (double)rc_displayMode[win_num].h); #endif // RC_MOBILE } else cout << "RestoreWindow Error: Window #" << win_num << " is not an active window" << endl; } void rc_media_setWindowIcon(int win_num, int slot) { SDL_Rect img_rect; img_rect.x = 0; img_rect.y = 0; img_rect.w = rc_image_width[slot]; img_rect.h = rc_image_height[slot]; if(rc_himage[slot][win_num] != NULL) { //SDL_RendererFlip rf = (SDL_RendererFlip)(SDL_FLIP_VERTICAL); SDL_Surface * tmp_surf = SDL_CreateRGBSurface(0, rc_image_width[slot], rc_image_height[slot], 32, 0, 0, 0, 0); SDL_Texture * tmp_tex = SDL_CreateTexture(rc_win_renderer[rc_active_window], rc_pformat->format, SDL_TEXTUREACCESS_TARGET, rc_image_width[slot], rc_image_height[slot]); SDL_SetRenderTarget(rc_win_renderer[rc_active_window],NULL); SDL_RenderCopy(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,&img_rect); //SDL_RenderCopyEx(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,NULL,0,NULL,rf); SDL_RenderReadPixels(rc_win_renderer[rc_active_window], &img_rect, rc_pformat->format,tmp_surf->pixels,tmp_surf->pitch); SDL_SetColorKey(tmp_surf,SDL_TRUE,rc_image_colorKey[slot]); SDL_SetWindowIcon(rc_win[rc_active_window], tmp_surf); if(rc_active_screen >= 0) SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); SDL_DestroyTexture(tmp_tex); SDL_FreeSurface(tmp_surf); } } string rc_media_getClipboardText() { return (string) SDL_GetClipboardText(); } void rc_media_setClipboardText(string txt) { SDL_SetClipboardText(txt.c_str()); } int rc_media_hasClipboardText() { return (int)SDL_HasClipboardText(); } bool rc_screenCheck(int s_num = -1) { if(s_num == -1) s_num = rc_active_screen; if(s_num > MAX_SCREENS || s_num < 0) return false; if(rc_sscreen[rc_active_window][s_num] == NULL && rc_hscreen[rc_active_window][s_num] == NULL) return false; return true; } void rc_media_openScreen_hw(int s_num, int w, int h, int vpx, int vpy, int vpw, int vph, int flag) { //cout << "start CanvasOpen in " << rc_active_window << ", " << s_num << endl; if(s_num < 0 || s_num > MAX_SCREENS) { cout << "Canvas #" << s_num << " is not available" << endl; return; } if(rc_hscreen[rc_active_window][s_num]!=NULL) { cout << "Canvas #" << s_num << " is already open" << endl; return; } //cout << "got to this point" << endl; rc_hscreen[rc_active_window][s_num] = SDL_CreateTexture(rc_win_renderer[rc_active_window], rc_pformat->format, SDL_TEXTUREACCESS_TARGET, w, h); //cout << "hscreen texture created" << endl; rc_screen_transparent[rc_active_window][s_num] = 0; //cout << "Canvas is created" << endl; switch(flag) { case 0: //solid screen break; case 1: rc_screen_transparent[rc_active_window][s_num] = 1; SDL_SetTextureBlendMode(rc_hscreen[rc_active_window][s_num], SDL_BLENDMODE_BLEND); SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][s_num]); SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], 0, 0, 0, 0); SDL_RenderClear(rc_win_renderer[rc_active_window]); //cout << "screen opened\n"; break; } //cout << "Flags are set" << endl; rc_screen_rect[rc_active_window][s_num].x = vpx; rc_screen_rect[rc_active_window][s_num].y = vpy; rc_screen_rect[rc_active_window][s_num].w = vpw; rc_screen_rect[rc_active_window][s_num].h = vph; rc_screen_width[rc_active_window][s_num] = w; rc_screen_height[rc_active_window][s_num] = h; rc_screenview[rc_active_window][s_num].x = 0; rc_screenview[rc_active_window][s_num].y = 0; rc_screenview[rc_active_window][s_num].w = vpw; rc_screenview[rc_active_window][s_num].h = vph; rc_screen_visible[rc_active_window][s_num] = true; if(rc_active_screen == -1) rc_active_screen = s_num; SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); //cout << "Canvas is open" << endl; } void rc_media_closeScreen_hw(int s_num) { if(rc_screenCheck(s_num)) { SDL_DestroyTexture(rc_hscreen[rc_active_window][s_num]); rc_hscreen[rc_active_window][s_num] = NULL; rc_screen_visible[rc_active_window][s_num] = false; } } void rc_media_screen_hw(int s_num) { if(rc_screenCheck(s_num)) { rc_active_screen = s_num; SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][s_num]); //cout << "active screen = hscreen[" << rc_active_window << "][" << s_num << "]\n"; } } void rc_media_setScreenVisible(int s_num, int flag) { if(rc_screenCheck(s_num) && flag == 0) { rc_screen_visible[rc_active_window][s_num] = false; return; } rc_screen_visible[rc_active_window][s_num] = true; } bool rc_media_screenIsVisible(int s_num) { return rc_screen_visible[rc_active_window][s_num]; } void rc_media_setScreenViewport(int s_num, int x, int y, int w, int h) { if(rc_screenCheck(s_num)) { rc_screen_rect[rc_active_window][s_num].x = x; rc_screen_rect[rc_active_window][s_num].y = y; rc_screen_rect[rc_active_window][s_num].w = w; rc_screen_rect[rc_active_window][s_num].h = h; } } void rc_media_getScreenViewport(int s_num, double * x, double * y, double * w, double * h) { if(rc_screenCheck(s_num)) { *x = rc_screen_rect[rc_active_window][s_num].x; *y = rc_screen_rect[rc_active_window][s_num].y; *w = rc_screen_rect[rc_active_window][s_num].w; *h = rc_screen_rect[rc_active_window][s_num].h; } else cout << "GetScreenViewport Error: Screen #" << s_num << " is not accessible" << endl; } void rc_media_screenOffset(int s_num, int x, int y) { if(rc_screenCheck(s_num)) { //removed error checks because you only live once rc_screenview[rc_active_window][s_num].x = x; rc_screenview[rc_active_window][s_num].y = y; rc_screenview[rc_active_window][s_num].w = rc_screen_rect[rc_active_window][s_num].w; rc_screenview[rc_active_window][s_num].h = rc_screen_rect[rc_active_window][s_num].h; //SDL_SetClipRect(rc_sscreen[rc_active_window][rc_active_screen], &rc_screenview[rc_active_window][rc_active_screen]); } } void rc_media_getScreenOffset(int s_num, double * x, double * y) { if(rc_screenCheck(s_num)) { *x = rc_screenview[rc_active_window][s_num].x; *y = rc_screenview[rc_active_window][s_num].y; } } void rc_media_getScreenSize(int s_num, double * w, double * h) { if(rc_screenCheck(s_num)) { *w = rc_screen_width[rc_active_window][s_num]; *h = rc_screen_height[rc_active_window][s_num]; } } void rc_media_clearScreen_hw() { if(rc_screenCheck()) { //cout << "Clear screen\n"; //SDL_LockSurface(rc_sscreen[rc_active_window][rc_active_screen]); //SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_clearColor>>16, rc_clearColor>>8, rc_clearColor, rc_clearColor>>24); SDL_RenderClear(rc_win_renderer[rc_active_window]); SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); //SDL_RenderFillRect(rc_win_renderer[rc_active_window], &rc_screen_rect[rc_active_window][rc_active_screen]); //SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); } } void rc_media_setScreenAlpha_hw(int s_num, Uint8 alpha) { if(rc_screenCheck(s_num)) { SDL_SetTextureAlphaMod(rc_hscreen[rc_active_window][s_num], alpha); } } Uint32 rc_media_ScreenAlpha_hw(int s_num) { Uint8 alpha = 0; if(rc_screenCheck(s_num)) { SDL_GetTextureAlphaMod(rc_hscreen[rc_active_window][s_num], &alpha); } return (Uint32)alpha; } int rc_media_setScreenBlendMode_hw(int s_num, int blend_mode) { if(!rc_screenCheck(s_num)) { return -1; } int rslt = -1; SDL_BlendMode b = SDL_BLENDMODE_NONE; switch(blend_mode) { case 0: //SDL_BLENDMODE_NONE b = SDL_BLENDMODE_NONE; break; case 1: //SDL_BLENDMODE_BLEND b = SDL_BLENDMODE_BLEND; break; case 2: //SDL_BLENDMODE_ADD b = SDL_BLENDMODE_ADD; break; case 4: //SDL_BLENDMODE_MOD b = SDL_BLENDMODE_MOD; break; default: return rslt; } rslt = SDL_SetTextureBlendMode(rc_hscreen[rc_active_window][s_num], b); return rslt; } int rc_media_screenBlendMode_hw(int s_num) { if(!rc_screenCheck(s_num)) { return -1; } SDL_BlendMode blend_mode = SDL_BLENDMODE_NONE; int rslt = SDL_GetTextureBlendMode(rc_hscreen[rc_active_window][s_num], &blend_mode); if(rslt < 0) { cout << "CanvasBlendMode Error: " << SDL_GetError() << endl; return rslt; } return blend_mode; } int rc_media_setScreenColorMod_hw(int s_num, Uint32 c) { if(!rc_screenCheck(s_num)) { return -1; } int rslt = -1; Uint8 r = c>>16; Uint8 g = c>>8; Uint8 b = c; //cout << "C = " << c << endl; //cout << "RGB = " << (Uint32)r << ", " << (Uint32)g << ", " << (Uint32)b << endl; rslt = SDL_SetTextureColorMod(rc_hscreen[rc_active_window][s_num], r, g, b); return rslt; } int rc_media_screenColorMod_hw(int s_num) { if(!rc_screenCheck(s_num)) { return -1; } Uint8 r = 0; Uint8 g = 0; Uint8 b = 0; int rslt = SDL_GetTextureColorMod(rc_hscreen[rc_active_window][s_num], &r, &g, &b); if(rslt < 0) { cout << "CanvasColorMode Error: " << SDL_GetError() << endl; return rslt; } Uint32 c_mod = (Uint32)SDL_MapRGBA(rc_pformat,r,g,b,255); //cout << "-RGB = " << (int)r << ", " << (int)g << ", " << (int)b << endl; return c_mod; } //---------------- void rc_media_copyScreen_hw(int src_screen, int sx, int sy, int sw, int sh, int dst_screen, int dx, int dy) { if(rc_screenCheck(src_screen) && rc_screenCheck(dst_screen)) { SDL_Rect src_rect, dst_rect; src_rect.x = sx; src_rect.y = sy; src_rect.w = sw; src_rect.h = sh; dst_rect.x = dx; dst_rect.y = dy; dst_rect.w = sw; dst_rect.h = sh; //SDL_BlitSurface(rc_sscreen[rc_active_window][src_screen], &src_rect, rc_sscreen[rc_active_window][dst_screen], &dst_rect); SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][dst_screen]); SDL_RenderCopy(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][src_screen], &src_rect, &dst_rect); SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); } } void rc_media_getScreenClip_hw(int slot, int sx, int sy, int sw, int sh) { if(rc_screenCheck(rc_active_screen)) { SDL_RendererFlip rf = (SDL_RendererFlip)SDL_FLIP_NONE; int w = 0; int h = 0; SDL_QueryTexture(rc_hscreen[rc_active_window][rc_active_screen], NULL, NULL, &w, &h); SDL_Texture * tmp_tex = SDL_CreateTexture(rc_win_renderer[rc_active_window], rc_pformat->format, SDL_TEXTUREACCESS_TARGET, w, h); SDL_SetRenderTarget(rc_win_renderer[rc_active_window], tmp_tex); SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_clearColor>>16, rc_clearColor>>8, rc_clearColor, rc_clearColor>>24); SDL_RenderClear(rc_win_renderer[rc_active_window]); SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); SDL_Point center; center.x = w/2; center.y = h/2; SDL_RenderCopyEx(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen], NULL, NULL, 0, ¢er,rf); SDL_Surface * img_surf = SDL_CreateRGBSurface(0, sw, sh, 32, 0, 0, 0, 0); SDL_Rect src_rect; src_rect.x = sx; src_rect.y = sy; src_rect.w = sw; src_rect.h = sh; //SDL_BlitSurface(rc_sscreen[rc_active_window][src_screen], &src_rect, rc_sscreen[rc_active_window][dst_screen], &dst_rect); SDL_RenderReadPixels(rc_win_renderer[rc_active_window], &src_rect, rc_pformat->format, img_surf->pixels, img_surf->pitch); SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); SDL_DestroyTexture(tmp_tex); for(int i = 0; i < MAX_WINDOWS; i++) { if(rc_win_renderer[i]!=NULL) { if(rc_himage[slot][i]!=NULL) { SDL_DestroyTexture(rc_himage[slot][i]); rc_himage[slot][i] = NULL; } rc_himage[slot][i] = SDL_CreateTextureFromSurface(rc_win_renderer[i], img_surf); rc_himage_rect[slot].x = 0; rc_himage_rect[slot].y = 0; rc_himage_rect[slot].w = img_surf->w; rc_himage_rect[slot].h = img_surf->h; rc_image_width[slot] = img_surf->w; rc_image_height[slot] = img_surf->h; rc_image_isLoaded[slot] = true; } } SDL_FreeSurface(img_surf); } } void rc_media_getScreenClip2_hw(int slot, int sx, int sy, int sw, int sh, bool flag) { if(!flag) { rc_media_getScreenClip_hw(slot, sx, sy, sw, sh); } else if(rc_screenCheck(rc_active_screen)) { if(rc_himage[slot][rc_active_window] != NULL) { cout << "CanvasClip_Ex Error: Image slot is already occupied" << endl; return; } SDL_Rect src, dst; rc_himage[slot][rc_active_window] = SDL_CreateTexture(rc_win_renderer[rc_active_window], rc_pformat->format, SDL_TEXTUREACCESS_TARGET, sw, sh); src.x = sx; src.y = sy; src.w = sw; src.h = sh; dst.x = 0; dst.y = 0; dst.w = sw; dst.h = sh; rc_himage_rect[slot] = dst; rc_image_width[slot] = sw; rc_image_height[slot] = sh; rc_image_isLoaded[slot] = true; SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_himage[slot][rc_active_window]); SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], 0, 0, 0, 0); SDL_RenderClear(rc_win_renderer[rc_active_window]); SDL_RenderCopy(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen], &src, &dst); SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); } } void rc_media_getWindowClip_hw(int slot, int sx, int sy, int sw, int sh) { SDL_Surface * img_surf = SDL_CreateRGBSurface(0, sw, sh, 32, 0, 0, 0, 0); SDL_Rect src_rect; src_rect.x = sx; src_rect.y = sy; src_rect.w = sw; src_rect.h = sh; //SDL_BlitSurface(rc_sscreen[rc_active_window][src_screen], &src_rect, rc_sscreen[rc_active_window][dst_screen], &dst_rect); SDL_SetRenderTarget(rc_win_renderer[rc_active_window], NULL); SDL_RenderReadPixels(rc_win_renderer[rc_active_window], &src_rect, rc_pformat->format, img_surf->pixels, img_surf->pitch); for(int i = 0; i < MAX_WINDOWS; i++) { if(rc_win_renderer[i]!=NULL) { if(rc_himage[slot][i]!=NULL) { SDL_DestroyTexture(rc_himage[slot][i]); rc_himage[slot][i] = NULL; } rc_himage[slot][i] = SDL_CreateTextureFromSurface(rc_win_renderer[i], img_surf); rc_himage_rect[slot].x = 0; rc_himage_rect[slot].y = 0; rc_himage_rect[slot].w = img_surf->w; rc_himage_rect[slot].h = img_surf->h; rc_image_width[slot] = img_surf->w; rc_image_height[slot] = img_surf->h; rc_image_isLoaded[slot] = true; } } SDL_FreeSurface(img_surf); SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); } void rc_media_cloneScreen_hw(int src_screen, int dst_screen) { if(rc_screenCheck(src_screen) && (dst_screen >= 0 && dst_screen < MAX_SCREENS)) { if(rc_hscreen[rc_active_window][dst_screen] == NULL) { rc_hscreen[rc_active_window][dst_screen] = rc_hscreen[rc_active_window][src_screen]; rc_screen_width[rc_active_window][dst_screen] = rc_screen_width[rc_active_window][src_screen]; rc_screen_height[rc_active_window][dst_screen] = rc_screen_height[rc_active_window][src_screen]; rc_screen_rect[rc_active_window][dst_screen] = rc_screen_rect[rc_active_window][src_screen]; rc_screenview[rc_active_window][dst_screen] = rc_screenview[rc_active_window][src_screen]; rc_screen_visible[rc_active_window][dst_screen] = rc_screen_visible[rc_active_window][src_screen]; } } } void rc_sortZ(int priority_screen) { int aw = rc_active_window; int draw_order = 0; for(int z = 0; z < MAX_SCREENS; z++) { if(rc_screen_z[aw][priority_screen] == z) { rc_screen_zOrder[aw][draw_order] = priority_screen; draw_order++; } for(int n = 0; n < MAX_SCREENS; n++) { if(rc_screen_z[aw][n] == z && n != priority_screen) { rc_screen_zOrder[aw][draw_order] = n; draw_order++; } } } } void rc_media_setScreenZ(int s_num, int z) { if(rc_screenCheck(s_num)) { if(z < 0 || z >= MAX_SCREENS) { cout << "SetScreenZ Error: Z Order must be a value from 0 to " << MAX_SCREENS-1 << endl; return; } //int tmp_z = 0; //int tmp_order[MAX_SCREENS]; //cout << "z_start: " << rc_screen_zOrder[rc_active_window][rc_active_screen] << endl; rc_screen_z[rc_active_window][s_num] = z; rc_sortZ(s_num); //for(int i = 0; i < MAX_SCREENS; i++) //cout << "z: " << rc_screen_zOrder[rc_active_window][i] << endl; } } int rc_media_screenZ(int s_num) { if(rc_screenCheck(s_num)) { return rc_screen_z[rc_active_window][s_num]; } return -1; } void rc_media_box_hw(int x1, int y1, int x2, int y2) { Sint16 vx[4], vy[4]; vx[0] = (Sint16)x1; vy[0] = (Sint16)y1; vx[1] = (Sint16)x2; vy[1] = (Sint16)y1; vx[2] = (Sint16)x2; vy[2] = (Sint16)y2; vx[3] = (Sint16)x1; vy[3] = (Sint16)y2; polygonRGBA(rc_win_renderer[rc_active_window], vx, vy, 4, rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); } void rc_media_boxFill_hw(int x1, int y1, int x2, int y2) { Sint16 vx[4], vy[4]; vx[0] = (Sint16)x1; vy[0] = (Sint16)y1; vx[1] = (Sint16)x2; vy[1] = (Sint16)y1; vx[2] = (Sint16)x2; vy[2] = (Sint16)y2; vx[3] = (Sint16)x1; vy[3] = (Sint16)y2; filledPolygonRGBA(rc_win_renderer[rc_active_window], vx, vy, 4, rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); } void rc_media_rectangle(int x, int y, int w, int h) { SDL_Rect rect_dim; rect_dim.x = x; rect_dim.y = y; rect_dim.w = w; rect_dim.h = h; SDL_RenderDrawRect(rc_win_renderer[rc_active_window], &rect_dim); } void rc_media_rectangleFill(int x, int y, int w, int h) { SDL_Rect rect_dim; rect_dim.x = x; rect_dim.y = y; rect_dim.w = w; rect_dim.h = h; SDL_RenderFillRect(rc_win_renderer[rc_active_window], &rect_dim); } void rc_media_roundRect(int x, int y, int w, int h, int r) { roundedRectangleRGBA(rc_win_renderer[rc_active_window], x, y, x+(w-1), y+(h-1), r, rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); } void rc_media_roundRectFill(int x, int y, int w, int h, int r) { roundedBoxRGBA(rc_win_renderer[rc_active_window], x, y, x+(w-1), y+(h-1), r, rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); } void rc_media_circle_hw(int xc, int yc, int r) { circleRGBA(rc_win_renderer[rc_active_window], xc, yc, r, rc_ink >> 16, rc_ink >> 8, rc_ink, rc_ink >> 24); } void rc_media_circleFill_hw(int xc, int yc, int r) { filledCircleRGBA(rc_win_renderer[rc_active_window], xc, yc, r, rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); } void rc_media_ellipse_hw(int xc, int yc, int width, int height) { ellipseRGBA(rc_win_renderer[rc_active_window], xc, yc, width, height, rc_ink >> 16, rc_ink >> 8, rc_ink, rc_ink>>24); } void rc_media_ellipseFill_hw(int xc, int yc, int width, int height) { filledEllipseRGBA(rc_win_renderer[rc_active_window], xc, yc, width, height, rc_ink >> 16, rc_ink >> 8, rc_ink, rc_ink>>24); } Uint32 rc_media_getPixel_hw(int x, int y) { //Uint32 * s_pixels = (Uint32*) rc_win_surface[rc_active_window]->pixels; #ifdef RC_MOBILE SDL_Texture * tmp_buf = SDL_CreateTexture(rc_win_renderer[rc_active_window], rc_pformat->format, SDL_TEXTUREACCESS_TARGET, rc_win_width[rc_active_window], rc_win_height[rc_active_window]); if(tmp_buf==NULL) return 0; SDL_SetRenderTarget(rc_win_renderer[rc_active_window], tmp_buf); SDL_RendererFlip rf = SDL_FLIP_NONE; SDL_RenderCopyEx(rc_win_renderer[rc_active_window], rc_backBuffer[rc_active_window], NULL, NULL, 0, NULL, rf); #else SDL_SetRenderTarget(rc_win_renderer[rc_active_window], NULL); #endif // RC_MOBILE //cout << "surface = ( " << rc_win_surface[rc_active_window]->w << ", " << rc_win_surface[rc_active_window]->h << " ) " << endl; //int w = 0; //int h = 0; //SDL_GetWindowSize(rc_win[rc_active_window], &w, &h); //w = rc_displayMode[rc_active_window].w; //h = rc_displayMode[rc_active_window].h; Uint32 * s_pixels = (Uint32*)SDL_malloc(sizeof(Uint32)); SDL_Rect p_rect; #ifdef RC_MOBILE p_rect.x = x; p_rect.y = y; #else p_rect.x = x / rc_fullscreen_mouse_scale_x[rc_active_window]; p_rect.y = y / rc_fullscreen_mouse_scale_y[rc_active_window]; #endif // RC_MOBILE p_rect.w = 1; p_rect.h = 1; SDL_RenderReadPixels(rc_win_renderer[rc_active_window], &p_rect, rc_pformat->format, (void*)s_pixels, 4); Uint32 p_color = s_pixels[0]; #ifdef RC_MOBILE SDL_DestroyTexture(tmp_buf); int r = p_color & 255; int g = (p_color >> 8) & 255; int b = (p_color >> 16) & 255; int a = (p_color >> 24) & 255; //p_color = SDL_MapRGBA(rc_pformat, r, g, b, a); #endif // RC_MOBILE //cout << "color = " << p_color << endl; SDL_free(s_pixels); SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); return p_color; } void rc_media_ink(Uint32 ink_color) { //cout << "ink = " << ink_color << endl; rc_ink = ink_color; rc_ink_color.a = ink_color>>24;//ink_color >> 24; //cout << "alpha = " << (int)rc_ink_color.a << endl; rc_ink_color.r = ink_color >> 16; rc_ink_color.g = ink_color >> 8; rc_ink_color.b = ink_color; SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); } void rc_media_setClearColor(Uint32 c_color) { rc_clearColor = c_color; } Uint32 rc_media_rgb(Uint8 r, Uint8 g, Uint8 b) { //cout << "r = " << (int) r << " g = " << (int) g << " b = " << (int)b << endl; Uint32 rgba_map = (Uint32)SDL_MapRGBA(rc_pformat,r,g,b,255); //Uint32 rgba_map = (r << 16) + (g << 8) + b + (255 << 24);// + (255<<24); //cout << "rgb_out = " << rgba_map << endl; return rgba_map; } Uint32 rc_media_rgba(Uint8 r, Uint8 g, Uint8 b, Uint8 a) { Uint32 rgba_map = (Uint32)SDL_MapRGBA(rc_pformat,r,g,b,a); //rgba_map = rgba_map + (a<<24); return rgba_map; } void rc_media_line_hw(int x1, int y1, int x2, int y2) { lineRGBA(rc_win_renderer[rc_active_window], x1, y1, x2, y2, rc_ink >> 16, rc_ink >> 8, rc_ink, rc_ink >> 24); } void rc_getPrevColor(int x, int y) { //cout << "PCOLOR #1" << endl; Uint32 * s_pixels = (Uint32*)rc_sscreen[rc_active_window][rc_active_screen]->pixels; //cout << "PCOLOR #2: " << y << " , " << rc_active_window << " , " << rc_active_screen << " , " << x << endl; prev_color = s_pixels[y*rc_sscreen[rc_active_window][rc_active_screen]->w+x]; //cout << "PCOLOR #3" << endl; } void rc_media_floodFill_sw(int x, int y, Uint32* s_pixels, int pitch, int w) { int s_lock = 0; //cout << "u1" << endl; if(SDL_MUSTLOCK(rc_sscreen[rc_active_window][rc_active_screen])) { //cout << "u2" << endl; s_lock = 1; SDL_LockSurface(rc_sscreen[rc_active_window][rc_active_screen]); } //cout << "u3" << endl; //Uint32 * s_pixels = (Uint32*) rc_sscreen[rc_active_window][rc_active_screen]->pixels; //cout << "u4" << endl; //int pitch = rc_sscreen[rc_active_window][rc_active_screen]->pitch; //cout << "u5" << endl; //int w = rc_sscreen[rc_active_window][rc_active_screen]->pitch/4; //cout << "u6" << endl; // Base cases if (x < 0 || x >= rc_screen_width[rc_active_window][rc_active_screen] || y < 0 || y >= rc_screen_height[rc_active_window][rc_active_screen]) return; //cout << "u7" << endl; if (s_pixels[y*w+x] != prev_color) return; //cout << "u8" << endl; // Replace the color at (x, y) s_pixels[y*w+x] = rc_ink; //cout << "u8-1" << endl; cout << "x = " << x << "; y = " << y << endl; // Recur for north, east, south and west rc_media_floodFill_sw(x+1, y, s_pixels, pitch, w); rc_media_floodFill_sw(x-1, y, s_pixels, pitch, w); rc_media_floodFill_sw(x, y+1, s_pixels, pitch, w); rc_media_floodFill_sw(x, y-1, s_pixels, pitch, w); //cout << "u8-2" << endl; if(s_lock == 1) { //cout << "u9" << endl; SDL_UnlockSurface(rc_sscreen[rc_active_window][rc_active_screen]); //cout << "u10" << endl; } } void rc_media_floodFill_hw(int x, int y) { rc_sscreen[rc_active_window][rc_active_screen] = SDL_CreateRGBSurface(0, rc_screen_width[rc_active_window][rc_active_screen], rc_screen_height[rc_active_window][rc_active_screen], 32, 0, 0, 0, 0); SDL_Rect c_screen; c_screen.x = 0; c_screen.y = 0; c_screen.w = rc_screen_width[rc_active_window][rc_active_screen]; c_screen.h = rc_screen_height[rc_active_window][rc_active_screen]; SDL_SetRenderTarget(rc_win_renderer[rc_active_window],NULL); SDL_RenderCopy(rc_win_renderer[rc_active_window],rc_hscreen[rc_active_window][rc_active_screen],NULL,&c_screen); //SDL_RendererFlip rf = (SDL_RendererFlip)SDL_FLIP_VERTICAL; //SDL_RenderCopyEx(rc_win_renderer[rc_active_window],rc_hscreen[rc_active_window][rc_active_screen],NULL,NULL,0,NULL,rf); //cout << "DEBUG_FLOOD CP 1" << endl; if(SDL_RenderReadPixels(rc_win_renderer[rc_active_window], &c_screen, rc_pformat->format,rc_sscreen[rc_active_window][rc_active_screen]->pixels,rc_sscreen[rc_active_window][rc_active_screen]->pitch) < 0) { cout << "ReadPixel Error: " << SDL_GetError() << endl; SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); } else { //cout << "DEBUG_FLOOD CP 2" << endl; rc_getPrevColor(x, y); //cout << "DEBUG_FLOOD CP 3" << endl; Uint32 * s_pixels = (Uint32*) rc_sscreen[rc_active_window][rc_active_screen]->pixels; int pitch = rc_sscreen[rc_active_window][rc_active_screen]->pitch; int w = rc_sscreen[rc_active_window][rc_active_screen]->pitch/4; //cout << "pitch = " << pitch << endl; //cout << "w = " << w << endl; //string bs=""; cin>>bs; if(s_pixels[y*w+x] != rc_ink) rc_media_floodFill_sw(x,y,s_pixels, pitch, w); //cout << "DEBUG_FLOOD CP 4" << endl; SDL_Texture * tmp_tex = SDL_CreateTextureFromSurface(rc_win_renderer[rc_active_window], rc_sscreen[rc_active_window][rc_active_screen]); //cout << "DEBUG_FLOOD CP 5" << endl; if(tmp_tex==NULL) { cout << "FloodFill Error: Canvas Buffer could not be created" << endl; SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); } else { SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); SDL_RenderCopy(rc_win_renderer[rc_active_window],tmp_tex,NULL,NULL); } SDL_DestroyTexture(tmp_tex); } SDL_FreeSurface(rc_sscreen[rc_active_window][rc_active_screen]); rc_sscreen[rc_active_window][rc_active_screen] = NULL; } void rc_media_drawPixel_hw(int x, int y) { pixelRGBA(rc_win_renderer[rc_active_window], x, y, rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); } void rc_media_poly(unsigned int n, double* vx_d, double* vy_d) { Sint16 vx[n], vy[n]; for(int i = 0; i < n; i++) { vx[i] = (Sint16)vx_d[i]; vy[i] = (Sint16)vy_d[i]; } polygonRGBA(rc_win_renderer[rc_active_window], vx, vy, n, rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); } void rc_media_polyfill(unsigned int n, double* vx_d, double* vy_d) { Sint16 vx[n], vy[n]; for(int i = 0; i < n; i++) { vx[i] = (Sint16)vx_d[i]; vy[i] = (Sint16)vy_d[i]; } filledPolygonRGBA(rc_win_renderer[rc_active_window], vx, vy, n, rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); } void rc_media_loadImage_hw(int slot, string img_file) { if(slot < 0 || slot >= MAX_IMAGES) { cout << "LoadImage Error: Image Slot must be in the range of 0 to " << MAX_IMAGES << endl; return; } if(rc_himage[slot][rc_active_window]!=NULL) { cout << "LoadImage Error: Image " << slot << " is already in use" << endl; return; } //mariocircuit-1.png SDL_Surface * image = IMG_Load(img_file.c_str()); if(image == NULL) { cout << "~Image: " << img_file.c_str() << endl; cout << "LoadImage Error: " << IMG_GetError() << endl; return; } #ifdef RC_MOBILE SDL_Surface * image_cv = SDL_ConvertSurfaceFormat(image, rc_pformat->format, 0); #else SDL_Surface * image_cv = SDL_ConvertSurface(image, rc_pformat,0); #endif // RC_MOBILE rc_image_width[slot] = image_cv->w; rc_image_height[slot] = image_cv->h; rc_image_isLoaded[slot] = true; if(image_cv == NULL) { cout << "LoadImage Error: " << SDL_GetError() << endl; SDL_FreeSurface(image); return; } #ifdef RC_MOBILE if(rc_himage[slot][rc_active_window] != NULL) SDL_DestroyTexture(rc_himage[slot][rc_active_window]); rc_himage[slot][rc_active_window] = SDL_CreateTextureFromSurface(rc_win_renderer[rc_active_window], image_cv); SDL_SetTextureBlendMode(rc_himage[slot][rc_active_window], SDL_BLENDMODE_BLEND); #else for(int i = 0; i < MAX_WINDOWS; i++) { if(rc_himage[slot][i] != NULL) SDL_DestroyTexture(rc_himage[slot][i]); rc_himage[slot][i] = SDL_CreateTextureFromSurface(rc_win_renderer[i], image_cv); SDL_SetTextureBlendMode(rc_himage[slot][i], SDL_BLENDMODE_BLEND); if(i == rc_active_window && rc_himage[slot][rc_active_window] == NULL) { cout << "#LoadImage Error: " << SDL_GetError() << endl; SDL_FreeSurface(image); SDL_FreeSurface(image_cv); for(int j = 0; j < i; j++) SDL_DestroyTexture(rc_himage[slot][j]); return; } } #endif // RC_MOBILE SDL_FreeSurface(image); SDL_FreeSurface(image_cv); } void rc_media_loadImage_ex_hw(int slot, string img_file, double color) { if(slot < 0 || slot >= MAX_IMAGES) { cout << "LoadImage_Ex Error: Image Slot must be in the range of 0 to " << MAX_IMAGES << endl; return; } if(rc_himage[slot][rc_active_window]!=NULL) { cout << "LoadImage_Ex Error: Image Slot is already in use" << endl; return; } SDL_Surface * image = IMG_Load(img_file.c_str()); if(image == NULL) { cout << "LoadImage_Ex Error: " << SDL_GetError() << endl; return; } if(color < 0) { Uint32 * c = (Uint32*)image->pixels; SDL_SetColorKey(image, SDL_TRUE, c[0]); } else SDL_SetColorKey(image, SDL_TRUE, (Uint32)color); #ifdef RC_MOBILE SDL_Surface * image_cv = SDL_ConvertSurfaceFormat(image, rc_pformat->format, 0); #else SDL_Surface * image_cv = SDL_ConvertSurface(image, rc_pformat,0); #endif // RC_MOBILE rc_image_width[slot] = image_cv->w; rc_image_height[slot] = image_cv->h; rc_image_isLoaded[slot] = true; if(image_cv == NULL) { cout << "LoadImage_Ex Error: " << SDL_GetError() << endl; SDL_FreeSurface(image); return; } #ifdef RC_MOBILE if(rc_himage[slot][rc_active_window] != NULL) SDL_DestroyTexture(rc_himage[slot][rc_active_window]); rc_himage[slot][rc_active_window] = SDL_CreateTextureFromSurface(rc_win_renderer[rc_active_window], image_cv); SDL_SetTextureBlendMode(rc_himage[slot][rc_active_window], SDL_BLENDMODE_BLEND); #else for(int i = 0; i < MAX_WINDOWS; i++) { if(rc_himage[slot][i] != NULL) SDL_DestroyTexture(rc_himage[slot][i]); rc_himage[slot][i] = SDL_CreateTextureFromSurface(rc_win_renderer[i], image_cv); SDL_SetTextureBlendMode(rc_himage[slot][i], SDL_BLENDMODE_BLEND); if(i == rc_active_window && rc_himage[slot][rc_active_window] == NULL) { cout << "#LoadImage_Ex Error: " << SDL_GetError() << endl; SDL_FreeSurface(image); SDL_FreeSurface(image_cv); for(int j = 0; j < i; j++) SDL_DestroyTexture(rc_himage[slot][j]); return; } } #endif // RC_MOBILE SDL_FreeSurface(image); SDL_FreeSurface(image_cv); } void rc_media_createImage_hw(int slot, int w, int h, double * pdata) { if(rc_himage[slot][rc_active_window] != NULL) { cout << "CreateImage Error: Image already exist" << endl; return; } SDL_Surface * img_surf = SDL_CreateRGBSurface(0, w, h, 32, 0, 0, 0, 0); Uint32 * img_pixels = (Uint32*)img_surf->pixels; for(int i = 0; i < (w*h); i++) { img_pixels[i] = (Uint32)pdata[i]; } #ifdef RC_MOBILE SDL_DestroyTexture(rc_himage[slot][rc_active_window]); rc_himage[slot][rc_active_window] = SDL_CreateTextureFromSurface(rc_win_renderer[rc_active_window], img_surf); SDL_SetTextureBlendMode(rc_himage[slot][rc_active_window], SDL_BLENDMODE_BLEND); if(rc_himage[slot][rc_active_window] == NULL) { cout << "#CreateImage Error: " << SDL_GetError() << endl; SDL_FreeSurface(img_surf); SDL_DestroyTexture(rc_himage[slot][rc_active_window]); return; } #else for(int i = 0; i < MAX_WINDOWS; i++) { SDL_DestroyTexture(rc_himage[slot][i]); rc_himage[slot][i] = SDL_CreateTextureFromSurface(rc_win_renderer[i], img_surf); SDL_SetTextureBlendMode(rc_himage[slot][i], SDL_BLENDMODE_BLEND); } if(rc_himage[slot][rc_active_window] == NULL) { cout << "#CreateImage Error: " << SDL_GetError() << endl; SDL_FreeSurface(img_surf); for(int j = 0; j < MAX_WINDOWS; j++) { SDL_DestroyTexture(rc_himage[slot][j]); rc_himage[slot][j] = NULL; } return; } #endif // RC_MOBILE rc_image_width[slot] = img_surf->w; rc_image_height[slot] = img_surf->h; rc_image_isLoaded[slot] = true; SDL_FreeSurface(img_surf); } void rc_media_createImage_Ex_hw(int slot, int w, int h, double * pdata, double color) { if(rc_himage[slot][rc_active_window] != NULL) { cout << "CreateImage_Ex Error: Image already exist" << endl; return; } SDL_Surface * img_surf = SDL_CreateRGBSurface(0, w, h, 32, 0, 0, 0, 0); Uint32 * img_pixels = (Uint32*)img_surf->pixels; for(int i = 0; i < (w*h); i++) { img_pixels[i] = (Uint32)pdata[i]; } #ifdef RC_MOBILE SDL_Surface * image_cv = SDL_ConvertSurfaceFormat(img_surf, rc_pformat->format,0); #else SDL_Surface * image_cv = SDL_ConvertSurface(img_surf, rc_pformat,0); #endif // RC_MOBILE if(image_cv == NULL) { cout << "CreateImage_Ex Error: " << SDL_GetError() << endl; SDL_FreeSurface(img_surf); return; } if((Uint32)color<0) SDL_SetColorKey(image_cv, SDL_TRUE, img_pixels[0]); else SDL_SetColorKey(image_cv, SDL_TRUE, (Uint32)color); #ifdef RC_MOBILE SDL_DestroyTexture(rc_himage[slot][rc_active_window]); rc_himage[slot][rc_active_window] = SDL_CreateTextureFromSurface(rc_win_renderer[rc_active_window], image_cv); SDL_SetTextureBlendMode(rc_himage[slot][rc_active_window], SDL_BLENDMODE_BLEND); if(rc_himage[slot][rc_active_window] == NULL) { cout << "#CreateImage_Ex Error: " << SDL_GetError() << endl; SDL_FreeSurface(img_surf); SDL_FreeSurface(image_cv); SDL_DestroyTexture(rc_himage[slot][rc_active_window]); rc_himage[slot][rc_active_window] = NULL; return; } #else for(int i = 0; i < MAX_WINDOWS; i++) { SDL_DestroyTexture(rc_himage[slot][i]); rc_himage[slot][i] = SDL_CreateTextureFromSurface(rc_win_renderer[i], image_cv); SDL_SetTextureBlendMode(rc_himage[slot][i], SDL_BLENDMODE_BLEND); } if(rc_himage[slot][rc_active_window] == NULL) { cout << "#CreateImage_Ex Error: " << SDL_GetError() << endl; SDL_FreeSurface(img_surf); SDL_FreeSurface(image_cv); for(int j = 0; j < MAX_WINDOWS; j++) { SDL_DestroyTexture(rc_himage[slot][j]); rc_himage[slot][j] = NULL; } return; } #endif // RC_MOBILE rc_image_width[slot] = image_cv->w; rc_image_height[slot] = image_cv->h; rc_image_isLoaded[slot] = true; SDL_FreeSurface(img_surf); SDL_FreeSurface(image_cv); } void rc_media_bufferFromImage(int slot, double * pdata) { SDL_Rect img_rect; img_rect.x = 0; img_rect.y = 0; img_rect.w = rc_image_width[slot]; img_rect.h = rc_image_height[slot]; //cout << "Debug data: " << img_rect.w << ", " << img_rect.h << endl; //SDL_RendererFlip rf = (SDL_RendererFlip)(SDL_FLIP_VERTICAL); SDL_Surface * tmp_surf = SDL_CreateRGBSurface(0, rc_image_width[slot], rc_image_height[slot], 32, 0, 0, 0, 0); SDL_Texture * tmp_tex = SDL_CreateTexture(rc_win_renderer[rc_active_window], rc_pformat->format, SDL_TEXTUREACCESS_TARGET, rc_image_width[slot], rc_image_height[slot]); SDL_SetRenderTarget(rc_win_renderer[rc_active_window],NULL); SDL_RenderCopy(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,&img_rect); //SDL_RenderCopyEx(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,NULL,0,NULL,rf); SDL_RenderReadPixels(rc_win_renderer[rc_active_window], &img_rect, rc_pformat->format,tmp_surf->pixels,tmp_surf->pitch); //cout << "Colorkey = " << (Uint32)r << ", " << (Uint32)g << ", " << (Uint32)b << ", " << (Uint32)a << endl; Uint32 * pxl = (Uint32*)tmp_surf->pixels; for(int y = 0; y < img_rect.h; y ++) { for(int x = 0; x < img_rect.w; x++) { pdata[y*img_rect.w+x] = pxl[y*img_rect.w+x]; } } SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); SDL_DestroyTexture(tmp_tex); SDL_FreeSurface(tmp_surf); } #ifdef RC_IOS void rc_media_colorKey_hw(int slot, double color) { Uint32 c = (Uint32) color; //Uint8 r = c >> 16; //Uint8 g = c >> 8; //Uint8 b = c; //Uint8 a = c >> 24; //c = SDL_MapRGBA(rc_win_surface[0]->format,r,g,b,255); if(color > 0) { //return; SDL_RendererFlip rf = (SDL_RendererFlip)(SDL_FLIP_NONE); SDL_Surface * tmp_surf = SDL_CreateRGBSurface(0, rc_image_width[slot], rc_image_height[slot], 32, 0, 0, 0, 0); SDL_Texture * tmp_tex = SDL_CreateTexture(rc_win_renderer[rc_active_window], rc_pformat->format, SDL_TEXTUREACCESS_TARGET, rc_image_width[slot], rc_image_height[slot]); SDL_SetRenderTarget(rc_win_renderer[rc_active_window],tmp_tex); //SDL_RenderCopy(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,NULL); SDL_RenderCopyEx(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,NULL,0,NULL,rf); SDL_RenderReadPixels(rc_win_renderer[rc_active_window], NULL, rc_pformat->format,tmp_surf->pixels,tmp_surf->pitch); //cout << "Colorkey = " << (Uint32)r << ", " << (Uint32)g << ", " << (Uint32)b << ", " << (Uint32)a << endl; SDL_SetColorKey(tmp_surf,SDL_TRUE,c); for(int i = 0; i < MAX_WINDOWS; i++) { SDL_DestroyTexture(rc_himage[slot][i]); rc_himage[slot][i] = SDL_CreateTextureFromSurface(rc_win_renderer[i], tmp_surf); } SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); SDL_DestroyTexture(tmp_tex); SDL_FreeSurface(tmp_surf); } else { SDL_RendererFlip rf = (SDL_RendererFlip)(SDL_FLIP_NONE); SDL_Surface * tmp_surf = SDL_CreateRGBSurface(0, rc_image_width[slot], rc_image_height[slot], 32, 0, 0, 0, 0); //SDL_Surface * tmp_surf = SDL_ConvertSurfaceFormat(tmp_psurf, rc_pformat->format, 0); //SDL_FreeSurface(tmp_psurf); SDL_Texture * tmp_tex = SDL_CreateTexture(rc_win_renderer[rc_active_window], rc_pformat->format, SDL_TEXTUREACCESS_TARGET, rc_image_width[slot], rc_image_height[slot]); SDL_SetRenderTarget(rc_win_renderer[rc_active_window],tmp_tex); //SDL_RenderCopy(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,NULL); SDL_RenderCopyEx(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,NULL,0,NULL,rf); SDL_RenderReadPixels(rc_win_renderer[rc_active_window], NULL, rc_pformat->format,tmp_surf->pixels,tmp_surf->pitch); //cout << "Colorkey = " << (Uint32)r << ", " << (Uint32)g << ", " << (Uint32)b << ", " << (Uint32)a << endl; Uint32 * gcolor = (Uint32*)tmp_surf->pixels; c = gcolor[0]; SDL_SetColorKey(tmp_surf,SDL_TRUE,c); for(int i = 0; i < MAX_WINDOWS; i++) { SDL_DestroyTexture(rc_himage[slot][i]); rc_himage[slot][i] = SDL_CreateTextureFromSurface(rc_win_renderer[i], tmp_surf); } SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); SDL_DestroyTexture(tmp_tex); SDL_FreeSurface(tmp_surf); } } #else void rc_media_colorKey_hw(int slot, double color) { Uint32 c = (Uint32) color; //Uint8 r = c >> 16; //Uint8 g = c >> 8; //Uint8 b = c; //Uint8 a = c >> 24; //c = SDL_MapRGBA(rc_win_surface[0]->format,r,g,b,255); SDL_Rect img_rect; img_rect.x = 0; img_rect.y = 0; img_rect.w = rc_image_width[slot]; img_rect.h = rc_image_height[slot]; if(color >= 0) { //return; //SDL_RendererFlip rf = (SDL_RendererFlip)(SDL_FLIP_VERTICAL); SDL_Surface * tmp_surf = SDL_CreateRGBSurface(0, rc_image_width[slot], rc_image_height[slot], 32, 0, 0, 0, 0); SDL_Texture * tmp_tex = SDL_CreateTexture(rc_win_renderer[rc_active_window], rc_pformat->format, SDL_TEXTUREACCESS_TARGET, rc_image_width[slot], rc_image_height[slot]); SDL_SetRenderTarget(rc_win_renderer[rc_active_window],NULL); SDL_RenderCopy(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,&img_rect); //SDL_RenderCopyEx(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,NULL,0,NULL,rf); SDL_RenderReadPixels(rc_win_renderer[rc_active_window], &img_rect, rc_pformat->format,tmp_surf->pixels,tmp_surf->pitch); //cout << "Colorkey = " << (Uint32)r << ", " << (Uint32)g << ", " << (Uint32)b << ", " << (Uint32)a << endl; rc_image_colorKey[slot] = c; rc_image_colorKey_r[slot] = c >> 16; rc_image_colorKey_g[slot] = c >> 8; rc_image_colorKey_b[slot] = c; rc_image_colorKey_a[slot] = c >> 24; SDL_SetColorKey(tmp_surf,SDL_TRUE,c); for(int i = 0; i < MAX_WINDOWS; i++) { SDL_DestroyTexture(rc_himage[slot][i]); rc_himage[slot][i] = SDL_CreateTextureFromSurface(rc_win_renderer[i], tmp_surf); } SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); SDL_DestroyTexture(tmp_tex); SDL_FreeSurface(tmp_surf); } else { //SDL_RendererFlip rf = (SDL_RendererFlip)(SDL_FLIP_VERTICAL); SDL_Surface * tmp_surf = SDL_CreateRGBSurface(0, rc_image_width[slot], rc_image_height[slot], 32, 0, 0, 0, 0); SDL_Texture * tmp_tex = SDL_CreateTexture(rc_win_renderer[rc_active_window], rc_pformat->format, SDL_TEXTUREACCESS_TARGET, rc_image_width[slot], rc_image_height[slot]); SDL_SetRenderTarget(rc_win_renderer[rc_active_window],NULL); SDL_RenderCopy(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,&img_rect); //SDL_RenderCopyEx(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,NULL,0,NULL,rf); SDL_RenderReadPixels(rc_win_renderer[rc_active_window], &img_rect, rc_pformat->format,tmp_surf->pixels,tmp_surf->pitch); //cout << "Colorkey = " << (Uint32)r << ", " << (Uint32)g << ", " << (Uint32)b << ", " << (Uint32)a << endl; Uint32 * pxl = (Uint32*)tmp_surf->pixels; c = pxl[0]; rc_image_colorKey[slot] = c; rc_image_colorKey_r[slot] = c >> 16; rc_image_colorKey_g[slot] = c >> 8; rc_image_colorKey_b[slot] = c; rc_image_colorKey_a[slot] = c >> 24; SDL_SetColorKey(tmp_surf,SDL_TRUE,c); for(int i = 0; i < MAX_WINDOWS; i++) { SDL_DestroyTexture(rc_himage[slot][i]); rc_himage[slot][i] = SDL_CreateTextureFromSurface(rc_win_renderer[i], tmp_surf); } SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); SDL_DestroyTexture(tmp_tex); SDL_FreeSurface(tmp_surf); } } #endif //RC_IOS void rc_media_deleteImage_hw(int slot) { if(slot < 0 || slot >= MAX_IMAGES) { cout << "DeleteImage Error: Image Slot must be in the range of 0 to " << MAX_IMAGES-1 << endl; return; } for(int i = 0; i < MAX_WINDOWS; i++) { if(rc_himage[slot][i] == NULL) continue; SDL_DestroyTexture(rc_himage[slot][i]); rc_himage[slot][i] = NULL; } rc_image_isLoaded[slot] = false; rc_image_width[slot] = 0; rc_image_height[slot] = 0; } void rc_media_setImageAlpha_hw(int slot, Uint8 alpha) { if(slot < 0 || slot >= MAX_IMAGES) { cout << "SetImageAlpha Error: Image Slot must be in the range of 0 to " << MAX_IMAGES-1 << endl; return; } if(rc_himage[slot][rc_active_window]==NULL) { cout << "SetImageAlpha Error: Image Slot is empty" << endl; return; } for(int i = 0; i < MAX_WINDOWS; i++) { if(rc_himage[slot][i] != NULL) { SDL_SetTextureAlphaMod(rc_himage[slot][i],alpha); } } } int rc_media_getImageAlpha_hw(int slot) { if(slot < 0 || slot >= MAX_IMAGES) { cout << "GetImageAlpha Error: Image Slot must be in the range of 0 to " << MAX_IMAGES-1 << endl; return -1; } if(rc_himage[slot][rc_active_window]==NULL) { cout << "GetImageAlpha Error: Image Slot is empty" << endl; return -1; } Uint8 a = 0; SDL_GetTextureAlphaMod(rc_himage[slot][rc_active_window], &a); return a; } void rc_media_getImageSize_hw(int slot, double * w, double * h) { if(slot < 0 || slot >= MAX_IMAGES) { cout << "GetImageSize Error: Image Slot must be in the range of 0 to " << MAX_IMAGES-1 << endl; return; } if(rc_himage[slot][rc_active_window]==NULL) { cout << "GetImageSize Error: Image Slot is empty" << endl; *w = 0; *h = 0; return; } Uint32 format = 0; int access = 0, width = 0, height = 0; SDL_QueryTexture(rc_himage[slot][rc_active_window], &format, &access, &width, &height); *w = width; *h = height; } int rc_media_setImageBlendMode_hw(int slot, int blend_mode) { if(slot < 0 || slot >= MAX_IMAGES) { cout << "SetImageBlendMode Error: Image Slot must be in the range of 0 to " << MAX_IMAGES-1 << endl; return -1; } if(rc_himage[slot][rc_active_window]==NULL) { cout << "SetImageBlendMode Error: Image Slot is empty" << endl; return -1; } int rslt = -1; SDL_BlendMode b = SDL_BLENDMODE_NONE; switch(blend_mode) { case 0: //SDL_BLENDMODE_NONE b = SDL_BLENDMODE_NONE; break; case 1: //SDL_BLENDMODE_BLEND b = SDL_BLENDMODE_BLEND; break; case 2: //SDL_BLENDMODE_ADD b = SDL_BLENDMODE_ADD; break; case 4: //SDL_BLENDMODE_MOD b = SDL_BLENDMODE_MOD; break; default: return rslt; } for(int i = 0; i < MAX_WINDOWS; i++) { if(rc_himage[slot][i] != NULL) { rslt = SDL_SetTextureBlendMode(rc_himage[slot][i], b); } } return rslt; } int rc_media_imageBlendMode_hw(int slot) { if(slot < 0 || slot >= MAX_IMAGES) { cout << "ImageBlendMode Error: Image Slot must be in the range of 0 to " << MAX_IMAGES-1 << endl; return -1; } if(rc_himage[slot][rc_active_window]==NULL) { cout << "ImageBlendMode Error: Image Slot is empty" << endl; return -1; } SDL_BlendMode blend_mode = SDL_BLENDMODE_NONE; int rslt = SDL_GetTextureBlendMode(rc_himage[slot][rc_active_window], &blend_mode); if(rslt < 0) { cout << "ImageBlendMode Error: " << SDL_GetError() << endl; return rslt; } return blend_mode; } int rc_media_setImageColorMod_hw(int slot, Uint32 c) { if(slot < 0 || slot >= MAX_IMAGES) { cout << "SetImageColorMod Error: Image Slot must be in the range of 0 to " << MAX_IMAGES-1 << endl; return -1; } if(rc_himage[slot][rc_active_window]==NULL) { cout << "SetImageColorMod Error: Image Slot is empty" << endl; return -1; } int rslt = -1; Uint8 r = c>>16; Uint8 g = c>>8; Uint8 b = c; //cout << "C = " << c << endl; //cout << "RGB = " << (Uint32)r << ", " << (Uint32)g << ", " << (Uint32)b << endl; for(int i = 0; i < MAX_WINDOWS; i++) { if(rc_himage[slot][i] != NULL) { rslt = SDL_SetTextureColorMod(rc_himage[slot][i], r, g, b); } } return rslt; } int rc_media_imageColorMod_hw(int slot) { if(slot < 0 || slot >= MAX_IMAGES) { cout << "ImageColorMod Error: Image Slot must be in the range of 0 to " << MAX_IMAGES-1 << endl; return -1; } if(rc_himage[slot][rc_active_window]==NULL) { cout << "ImageColorMod Error: Image Slot is empty" << endl; return -1; } Uint8 r = 0; Uint8 g = 0; Uint8 b = 0; int rslt = SDL_GetTextureColorMod(rc_himage[slot][rc_active_window], &r, &g, &b); if(rslt < 0) { cout << "ImageColorMode Error: " << SDL_GetError() << endl; return rslt; } Uint32 c_mod = (Uint32)SDL_MapRGBA(rc_pformat,r,g,b,255); //cout << "-RGB = " << (int)r << ", " << (int)g << ", " << (int)b << endl; return c_mod; } void rc_media_copyImage_hw(int src_slot, int dst_slot) { //return; if(src_slot < 0 || src_slot >= MAX_IMAGES || dst_slot < 0 || dst_slot >= MAX_IMAGES) { cout << "CopyImage Error: Image Slot should be in the range of 0 to " << MAX_IMAGES-1 << endl; return; } if(rc_himage[src_slot][rc_active_window]!=NULL && rc_himage[dst_slot][rc_active_window]==NULL) { //rc_simage[dst_slot] = SDL_ConvertSurface(rc_simage[src_slot], rc_simage[src_slot]->format, 0); SDL_Surface * tmp_surf = SDL_CreateRGBSurface(0, rc_image_width[src_slot], rc_image_height[src_slot], 32, 0, 0, 0, 0); SDL_Texture * tmp_tex = SDL_CreateTexture(rc_win_renderer[rc_active_window], tmp_surf->format->format, SDL_TEXTUREACCESS_TARGET, tmp_surf->w, tmp_surf->h); SDL_SetRenderTarget(rc_win_renderer[rc_active_window], tmp_tex); SDL_RendererFlip rf = SDL_FLIP_NONE; SDL_RenderCopyEx(rc_win_renderer[rc_active_window],rc_himage[src_slot][rc_active_window],NULL,NULL,0,NULL,rf); SDL_RenderReadPixels(rc_win_renderer[rc_active_window],NULL,tmp_surf->format->format,tmp_surf->pixels,tmp_surf->pitch); for(int i = 0; i < MAX_WINDOWS; i++) { if(rc_himage[dst_slot][i] != NULL) { //cout << "slot " << dst_slot << " win " << i << endl; SDL_DestroyTexture(rc_himage[dst_slot][i]); rc_himage[dst_slot][i] = NULL; } rc_himage[dst_slot][i] = SDL_CreateTextureFromSurface(rc_win_renderer[rc_active_window],tmp_surf); } rc_image_width[dst_slot] = tmp_surf->w; rc_image_height[dst_slot] = tmp_surf->h; SDL_FreeSurface(tmp_surf); SDL_DestroyTexture(tmp_tex); SDL_SetRenderTarget(rc_win_renderer[rc_active_window],rc_hscreen[rc_active_window][rc_active_screen]); rc_image_isLoaded[dst_slot] = true; } else { cout << "CopyImage Error: Image slot could not be used" << endl; return; } } void rc_media_rotateImage_hw(int slot, int x, int y, double degrees) { //double PI = 3.14159265359; //double angle = degrees * PI/180; //double theta = SDL_acos(rc_simage[0]->w/2+angle); SDL_Rect dst; dst.x = x; dst.y = y; dst.w = rc_image_width[slot]; dst.h = rc_image_height[slot]; SDL_RendererFlip rf = SDL_FLIP_NONE; SDL_RenderCopyEx(rc_win_renderer[rc_active_window], rc_himage[slot][rc_active_window], NULL, &dst, degrees, NULL, rf); } void rc_media_rotateImageEX_hw(int slot, int x, int y, int src_x, int src_y, int src_w, int src_h, double degrees) { //double PI = 3.14159265359; //double angle = degrees * PI/180; //double theta = SDL_acos(rc_simage[0]->w/2+angle); SDL_RendererFlip rf = SDL_FLIP_NONE; SDL_Rect c_rect; c_rect.x = src_x; c_rect.y = src_y; c_rect.w = src_w; c_rect.h = src_h; SDL_Rect dst; dst.x = x; dst.y = y; dst.w = src_w; dst.h = src_h; SDL_RenderCopyEx(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],&c_rect, &dst,degrees,NULL,rf); } void rc_media_zoomImage_hw(int slot, int x, int y, double zoom_x, double zoom_y) { SDL_Rect dst; dst.x = x; dst.y = y; dst.w = rc_image_width[slot] * zoom_x; dst.h = rc_image_height[slot] * zoom_y; SDL_RenderCopy(rc_win_renderer[rc_active_window], rc_himage[slot][rc_active_window], NULL, &dst); } void rc_media_zoomImageEX_hw(int slot, int x, int y, int src_x, int src_y, int src_w, int src_h, double zoom_x, double zoom_y) { int zw = src_w * zoom_x; int zh = src_h * zoom_y; int ax = src_w/2 - zw/2, ay = src_h/2 - zh/2; SDL_Rect r; r.x = x+ax; r.y = y+ay; r.w = zw; r.h = zh; SDL_Rect s_rect; s_rect.x = src_x; s_rect.y = src_y; s_rect.w = src_w; s_rect.h = src_h; SDL_RendererFlip rf = SDL_FLIP_NONE; SDL_RenderCopyEx(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],&s_rect,&r,0,NULL,rf); } void rc_media_rotozoomImage_hw(int slot, int x, int y, float degrees, float zoom_x, float zoom_y) { SDL_Rect dst; dst.x = x; dst.y = y; dst.w = rc_image_width[slot] * zoom_x; dst.h = rc_image_height[slot] * zoom_y; SDL_RendererFlip rf = SDL_FLIP_NONE; SDL_RenderCopyEx(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,&dst,degrees,NULL,rf); } void rc_media_rotozoomImageEX_hw(int slot, int x, int y, int src_x, int src_y, int src_w, int src_h, float degrees, float zoom_x, float zoom_y) { //cout << "src w,h = " << src_w << ", " << src_h << endl; SDL_Rect src, dst; src.x = src_x; src.y = src_y; src.w = src_w; src.h = src_h; dst.x = x; dst.y = y; dst.w = src_w * zoom_x; dst.h = src_h * zoom_y; SDL_RendererFlip rf = SDL_FLIP_NONE; SDL_RenderCopyEx(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],&src,&dst,degrees,NULL,rf); } void rc_media_MirrorImage_hw(int slot, Uint8 flipH, Uint8 flipV) { SDL_RendererFlip rf = SDL_FLIP_NONE; if(flipH!=0) rf = (SDL_RendererFlip)(rf | SDL_FLIP_HORIZONTAL); if(flipV!=0) rf = (SDL_RendererFlip)(rf | SDL_FLIP_VERTICAL); SDL_Surface * m_surf = SDL_CreateRGBSurface(0, rc_image_width[slot], rc_image_height[slot], 32, 0, 0, 0, 0); SDL_Texture * m_tex = SDL_CreateTexture(rc_win_renderer[rc_active_window], m_surf->format->format,SDL_TEXTUREACCESS_TARGET,rc_image_width[slot],rc_image_height[slot]); SDL_SetRenderTarget(rc_win_renderer[rc_active_window],m_tex); SDL_RenderCopyEx(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,NULL,0,NULL,rf); SDL_RenderReadPixels(rc_win_renderer[rc_active_window],NULL,m_surf->format->format,m_surf->pixels,m_surf->pitch); for(int i = 0; i < MAX_WINDOWS; i++) { if(rc_win[i]!=NULL) { SDL_DestroyTexture(rc_himage[slot][i]); rc_himage[slot][i] = SDL_CreateTextureFromSurface(rc_win_renderer[i],m_surf); } } SDL_DestroyTexture(m_tex); SDL_FreeSurface(m_surf); SDL_SetRenderTarget(rc_win_renderer[rc_active_window],rc_hscreen[rc_active_window][rc_active_screen]); } void rc_media_drawImage_hw(int slot, int x, int y) { if(slot >= 0 && slot < MAX_IMAGES) { if(rc_hscreen[rc_active_window][rc_active_screen] == NULL) { cout << "DrawImage Error: Canvas #" << slot << " does not exist" << endl; return; } SDL_Rect img_pos; img_pos.x = x; img_pos.y = y; img_pos.w = rc_image_width[slot]; img_pos.h = rc_image_height[slot]; if(SDL_RenderCopy(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,&img_pos) < 0) cout << "DrawImage error: " << SDL_GetError() << endl; } } void rc_media_drawImage_Flip(int slot, int x, int y, int flipH, int flipV) { SDL_RendererFlip rf = SDL_FLIP_NONE; if(flipH!=0) rf = (SDL_RendererFlip)(rf | SDL_FLIP_HORIZONTAL); if(flipV!=0) rf = (SDL_RendererFlip)(rf | SDL_FLIP_VERTICAL); SDL_Rect dst; dst.x = x; dst.y = y; dst.w = rc_image_width[slot]; dst.h = rc_image_height[slot]; SDL_RenderCopyEx(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window], NULL, &dst, 0, NULL, rf); } void rc_media_drawImage_Flip_Ex(int slot, int x, int y, int src_x, int src_y, int src_w, int src_h, int flipH, int flipV) { SDL_RendererFlip rf = SDL_FLIP_NONE; if(flipH!=0) rf = (SDL_RendererFlip)(rf | SDL_FLIP_HORIZONTAL); if(flipV!=0) rf = (SDL_RendererFlip)(rf | SDL_FLIP_VERTICAL); SDL_Rect dst; dst.x = x; dst.y = y; dst.w = rc_image_width[slot]; dst.h = rc_image_height[slot]; SDL_Rect src; src.x = src_x; src.y = src_y; src.w = src_w; src.h = src_h; SDL_RenderCopyEx(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window], &src, &dst, 0, NULL, rf); } void rc_media_drawImage_Clip_hw(int slot, int x, int y, int src_x, int src_y, int src_w, int src_h) { SDL_Rect src, dst; src.x = src_x; src.y = src_y; src.w = src_w; src.h = src_h; dst.x = x; dst.y = y; dst.w = src_w; dst.h = src_h; SDL_RenderCopy(rc_win_renderer[rc_active_window], rc_himage[slot][rc_active_window], &src, &dst); } void rc_media_drawImage_Blit_hw(int slot, int screen_x, int screen_y, int scale_w, int scale_h, int src_x, int src_y, int src_w, int src_h) { SDL_Rect src, dst; src.x = src_x; src.y = src_y; src.w = src_w; src.h = src_h; dst.x = screen_x; dst.y = screen_y; dst.w = scale_w; dst.h = scale_h; SDL_RenderCopy(rc_win_renderer[rc_active_window], rc_himage[slot][rc_active_window], &src, &dst); } void rc_media_drawImage_Transform(int slot, int x, int y, int w, int h, int src_x, int src_y, int src_w, int src_h, double angle, int center_x, int center_y, int flipH, int flipV) { SDL_RendererFlip rf = SDL_FLIP_NONE; if(flipH!=0) rf = (SDL_RendererFlip)(rf | SDL_FLIP_HORIZONTAL); if(flipV!=0) rf = (SDL_RendererFlip)(rf | SDL_FLIP_VERTICAL); SDL_Rect dst; dst.x = x; dst.y = y; dst.w = w; dst.h = h; SDL_Rect src; src.x = src_x; src.y = src_y; src.w = src_w; src.h = src_h; SDL_Point center; center.x = center_x; center.y = center_y; SDL_RenderCopyEx(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window], &src, &dst, angle, ¢er, rf); } int SaveBMP(int slot, string file) { SDL_Rect img_rect; img_rect.x = 0; img_rect.y = 0; img_rect.w = rc_image_width[slot]; img_rect.h = rc_image_height[slot]; //cout << "Debug data: " << img_rect.w << ", " << img_rect.h << endl; //SDL_RendererFlip rf = (SDL_RendererFlip)(SDL_FLIP_VERTICAL); SDL_Surface * tmp_surf = SDL_CreateRGBSurface(0, rc_image_width[slot], rc_image_height[slot], 32, 0, 0, 0, 0); SDL_Texture * tmp_tex = SDL_CreateTexture(rc_win_renderer[rc_active_window], rc_pformat->format, SDL_TEXTUREACCESS_TARGET, rc_image_width[slot], rc_image_height[slot]); SDL_SetRenderTarget(rc_win_renderer[rc_active_window],NULL); SDL_RenderCopy(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,&img_rect); //SDL_RenderCopyEx(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,NULL,0,NULL,rf); SDL_RenderReadPixels(rc_win_renderer[rc_active_window], &img_rect, rc_pformat->format,tmp_surf->pixels,tmp_surf->pitch); if(rc_active_screen >= 0 && rc_active_screen < MAX_SCREENS) SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); SDL_DestroyTexture(tmp_tex); int ret_val = SDL_SaveBMP(tmp_surf, file.c_str()); SDL_FreeSurface(tmp_surf); return ret_val; } int SavePNG(int slot, string file) { SDL_Rect img_rect; img_rect.x = 0; img_rect.y = 0; img_rect.w = rc_image_width[slot]; img_rect.h = rc_image_height[slot]; //cout << "Debug data: " << img_rect.w << ", " << img_rect.h << endl; //SDL_RendererFlip rf = (SDL_RendererFlip)(SDL_FLIP_VERTICAL); SDL_Surface * tmp_surf = SDL_CreateRGBSurface(0, rc_image_width[slot], rc_image_height[slot], 32, 0, 0, 0, 0); SDL_Texture * tmp_tex = SDL_CreateTexture(rc_win_renderer[rc_active_window], rc_pformat->format, SDL_TEXTUREACCESS_TARGET, rc_image_width[slot], rc_image_height[slot]); SDL_SetRenderTarget(rc_win_renderer[rc_active_window],NULL); SDL_RenderCopy(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,&img_rect); //SDL_RenderCopyEx(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,NULL,0,NULL,rf); SDL_RenderReadPixels(rc_win_renderer[rc_active_window], &img_rect, rc_pformat->format,tmp_surf->pixels,tmp_surf->pitch); if(rc_active_screen >= 0 && rc_active_screen < MAX_SCREENS) SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); SDL_DestroyTexture(tmp_tex); int ret_val = IMG_SavePNG(tmp_surf, file.c_str()); SDL_FreeSurface(tmp_surf); return ret_val; } int SaveJPG(int slot, string file) { SDL_Rect img_rect; img_rect.x = 0; img_rect.y = 0; img_rect.w = rc_image_width[slot]; img_rect.h = rc_image_height[slot]; //cout << "Debug data: " << img_rect.w << ", " << img_rect.h << endl; //SDL_RendererFlip rf = (SDL_RendererFlip)(SDL_FLIP_VERTICAL); SDL_Surface * tmp_surf = SDL_CreateRGBSurface(0, rc_image_width[slot], rc_image_height[slot], 32, 0, 0, 0, 0); SDL_Texture * tmp_tex = SDL_CreateTexture(rc_win_renderer[rc_active_window], rc_pformat->format, SDL_TEXTUREACCESS_TARGET, rc_image_width[slot], rc_image_height[slot]); SDL_SetRenderTarget(rc_win_renderer[rc_active_window],NULL); SDL_RenderCopy(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,&img_rect); //SDL_RenderCopyEx(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,NULL,0,NULL,rf); SDL_RenderReadPixels(rc_win_renderer[rc_active_window], &img_rect, rc_pformat->format,tmp_surf->pixels,tmp_surf->pitch); if(rc_active_screen >= 0 && rc_active_screen < MAX_SCREENS) SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); SDL_DestroyTexture(tmp_tex); int ret_val = IMG_SaveJPG(tmp_surf, file.c_str(), 100); SDL_FreeSurface(tmp_surf); return ret_val; } #ifdef RC_WEB int rc_media_drawGeometry(int slot, int num_vertices, double* vertices, int num_indices, double* indices) { return 0; } #else int rc_media_drawGeometry(int slot, int num_vertices, double* vertices, int num_indices, double* indices) { SDL_Vertex geo_vert[( num_vertices >= 1 ? num_vertices : 1)]; int vert_size = 8; for(int i = 0; i < num_vertices; i++) { geo_vert[i].position.x = vertices[i*vert_size+0]; geo_vert[i].position.y = vertices[i*vert_size+1]; geo_vert[i].color.r = (Uint8)vertices[i*vert_size+2]; geo_vert[i].color.g = (Uint8)vertices[i*vert_size+3]; geo_vert[i].color.b = (Uint8)vertices[i*vert_size+4]; geo_vert[i].color.a = (Uint8)vertices[i*vert_size+5]; geo_vert[i].tex_coord.x = vertices[i*vert_size+6]; geo_vert[i].tex_coord.y = vertices[i*vert_size+7]; } int geo_index[(num_indices <= 0 ? 1 : num_indices)]; for(int i = 0; i < num_indices; i++) { geo_index[i] = (int) indices[i]; } return SDL_RenderGeometry(rc_win_renderer[rc_active_window], (slot >= 0 ? rc_himage[slot][rc_active_window] : NULL), geo_vert, num_vertices, (num_indices <= 0 ? NULL : geo_index), num_indices); } #endif //RC_WEB void rc_media_getCursor(double * x, double * y) { *x = rc_sConsole_x[rc_active_window]; *y = rc_sConsole_y[rc_active_window]; } void rc_media_showCursor() { rc_cursor_visible = 1; } void rc_media_hideCursor() { rc_cursor_visible = 0; } void rc_media_locate(int x, int y) { rc_sConsole_x[rc_active_window] = x; rc_sConsole_y[rc_active_window] = y; } string rc_fillSpace(int n) { string s = ""; for(int i = 0; i < n; i++) s.append(" "); return s; } void rc_append_sConsole(string txt) { string tc = txt; string t_out[rc_console_height[rc_active_window]]; int i = 0; if(rc_sConsole_x[rc_active_window] >= rc_console_width[rc_active_window]) rc_sConsole_x[rc_active_window] = 0; while(tc.compare("")!=0) { if(tc.substr(i).length() > ( rc_console_width[rc_active_window] - rc_sConsole_x[rc_active_window]) ) { t_out[i] = rc_fillSpace(rc_sConsole_x[rc_active_window]) + tc.substr(i, rc_console_width[rc_active_window] - rc_sConsole_x[rc_active_window]); rc_sConsole_x[rc_active_window] = 0; tc = tc.substr( (rc_console_width[rc_active_window] - rc_sConsole_x[rc_active_window]) ); i++; } else { t_out[i] = rc_fillSpace(rc_sConsole_x[rc_active_window]) + tc; rc_sConsole_x[rc_active_window] = 0; i++; break; } } rc_sConsole_y[rc_active_window] += i; } #ifdef RC_MOBILE void rc_media_cls() { if(rc_winCheck(rc_active_window)) { SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_backBuffer[rc_active_window]); SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_clearColor>>16, rc_clearColor>>8, rc_clearColor, rc_clearColor>>24); SDL_RenderClear(rc_win_renderer[rc_active_window]); SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hconsole[rc_active_window]); SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], 0, 0, 0, 0); SDL_RenderClear(rc_win_renderer[rc_active_window]); SDL_SetRenderTarget(rc_win_renderer[rc_active_window], NULL); SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_clearColor>>16, rc_clearColor>>8, rc_clearColor, rc_clearColor>>24); SDL_RenderClear(rc_win_renderer[rc_active_window]); if(rc_active_screen >= 0) SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); rc_media_ink(rc_ink); } } void rc_media_printS_hw(string txt) { SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hconsole[rc_active_window]); string tc = txt; string t_out[rc_console_height[rc_active_window]]; int i = 0; if(rc_sConsole_x[rc_active_window] >= rc_console_width[rc_active_window]) rc_sConsole_x[rc_active_window] = 0; while(tc.compare("")!=0) { if(tc.substr(i).length() > ( rc_console_width[rc_active_window] - rc_sConsole_x[rc_active_window]) ) { t_out[i] = rc_fillSpace(rc_sConsole_x[rc_active_window]) + tc.substr(i, rc_console_width[rc_active_window] - rc_sConsole_x[rc_active_window]); rc_sConsole_x[rc_active_window] = 0; tc = tc.substr( (rc_console_width[rc_active_window] - rc_sConsole_x[rc_active_window]) ); i++; } else { t_out[i] = rc_fillSpace(rc_sConsole_x[rc_active_window]) + tc; rc_sConsole_x[rc_active_window] = 0; i++; break; } } for(int n = 0; n < i; n++) stringRGBA(rc_win_renderer[rc_active_window], 0, (rc_sConsole_y[rc_active_window] + n) * 8, t_out[n].c_str(), rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); rc_sConsole_y[rc_active_window] += i; SDL_SetRenderTarget(rc_win_renderer[rc_active_window], NULL); SDL_RenderCopy(rc_win_renderer[rc_active_window],rc_hconsole[rc_active_window],NULL,NULL); SDL_RenderPresent(rc_win_renderer[rc_active_window]); if(rc_active_screen >= 0) SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); return; } string rc_media_inputS_hw(string prompt) { SDL_Surface * input_surface = NULL; SDL_Texture * input_texture = NULL; bool loop = true; SDL_Event in_evt; string in_buf = prompt; string rtn_string = ""; string tc = in_buf; string t_out[rc_console_height[rc_active_window]]; int i = 0; SDL_Rect first_line, sub_line; first_line.x = (rc_sConsole_x[rc_active_window] * 8) + (prompt.length()*8); first_line.y = rc_sConsole_y[rc_active_window] * 8; first_line.w = 0; first_line.h = 8; sub_line.x = 0; sub_line.y = (rc_sConsole_y[rc_active_window]+1) * 8; sub_line.w = 0; sub_line.h = 8; SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hconsole[rc_active_window]); SDL_Rect txt_rect; txt_rect = first_line; txt_rect.w = 128; txt_rect.h = 128; //SDL_SetTextInputRect(&txt_rect); SDL_StartTextInput(); while(loop) { while(SDL_PollEvent(&in_evt)) { switch(in_evt.type) { case SDL_TEXTINPUT: in_buf += in_evt.text.text; break; case SDL_KEYDOWN: switch(in_evt.key.keysym.sym) { case SDLK_RETURN: loop = false; break; case SDLK_BACKSPACE: if(in_buf.length()-1 >= prompt.length() && in_buf.length()-1 >= 0) in_buf = in_buf.substr(0, in_buf.length()-1); break; } } } if(in_buf.length()>0) { SDL_SetRenderTarget(rc_win_renderer[rc_active_window],rc_hconsole[rc_active_window]); tc = in_buf; i = 0; int x = rc_sConsole_x[rc_active_window]; if(x >= rc_console_width[rc_active_window]) x = 0; while(tc.compare("")!=0) { if(tc.length() > ( rc_console_width[rc_active_window] - x) ) { t_out[i] = rc_fillSpace(x) + tc.substr(0, rc_console_width[rc_active_window] - x); if(i == 0 && ((t_out[i].length() - prompt.length() - x)*8) > first_line.w) { first_line.w = (t_out[i].length() - prompt.length() - x) * 8; } else if(i != 0 && (t_out[i].length() * 8) > sub_line.w) { sub_line.w = t_out[i].length() * 8; } tc = tc.substr( (rc_console_width[rc_active_window] - x) ); x = 0; i++; } else { t_out[i] = rc_fillSpace(x) + tc; if(i == 0 && ((t_out[i].length() - prompt.length() - x)*8) > first_line.w) { first_line.w = (t_out[i].length() - prompt.length() - x) * 8; } else if(i != 0 && (t_out[i].length() * 8) > sub_line.w) { sub_line.w = t_out[i].length() * 8; } x = 0; i++; break; } if(i >= rc_console_height[rc_active_window]) break; } SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_clearColor>>16, rc_clearColor>>8, rc_clearColor, 255); SDL_RenderFillRect(rc_win_renderer[rc_active_window], &first_line); if(((i-1)*8) > sub_line.h) sub_line.h = i*8; if(sub_line.h > 0) SDL_RenderFillRect(rc_win_renderer[rc_active_window], &sub_line); SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); for(int n = 0; n < i; n++) { stringRGBA(rc_win_renderer[rc_active_window], 0, (rc_sConsole_y[rc_active_window] + n) * 8, t_out[n].c_str(), rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, 255);//rc_ink_color.a); } SDL_SetRenderTarget(rc_win_renderer[rc_active_window],NULL); SDL_RenderCopy(rc_win_renderer[rc_active_window],rc_hconsole[rc_active_window],NULL,NULL); SDL_RenderPresent(rc_win_renderer[rc_active_window]); } } SDL_StopTextInput(); rc_sConsole_y[rc_active_window] += i; rc_sConsole_x[rc_active_window] = 0; if(rc_active_screen >= 0) SDL_SetRenderTarget(rc_win_renderer[rc_active_window],rc_hscreen[rc_active_window][rc_active_screen]); return in_buf.substr(prompt.length()); } string rc_media_ZoneInputS_hw(int x, int y, int w, int h) { SDL_Surface * input_surface = NULL; SDL_Texture * input_texture = NULL; bool loop = true; SDL_Event in_evt; string in_buf = ""; string rtn_string = ""; string tc = ""; string t_out[rc_console_height[rc_active_window]]; int i = 0; SDL_Rect zone; zone.x = x; zone.y = y; zone.w = w; zone.h = h; SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hconsole[rc_active_window]); SDL_StartTextInput(); while(loop) { if(SDL_PollEvent(&in_evt)) { switch(in_evt.type) { case SDL_TEXTINPUT: in_buf += in_evt.text.text; break; case SDL_KEYDOWN: switch(in_evt.key.keysym.sym) { case SDLK_RETURN: loop = false; break; case SDLK_BACKSPACE: if(in_buf.length()-1 >= 0) in_buf = in_buf.substr(0, in_buf.length()-1); break; } } } if(in_buf.length()>=0) { tc = in_buf; i = 0; while(tc.compare("")!=0) { if(tc.length() > (w/8) ) { t_out[i] = tc.substr(0, (w/8) ); tc = tc.substr( w/8 ); i++; } else { t_out[i] = tc; i++; break; } if(i >= rc_console_height[rc_active_window]) break; } SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hconsole[rc_active_window]); SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_clearColor>>16, rc_clearColor>>8, rc_clearColor, rc_clearColor>>24); SDL_RenderFillRect(rc_win_renderer[rc_active_window], &zone); //cout << "zone txt color = " << (int)rc_ink_color.r << ", " << (int)rc_ink_color.g << ", " << (int)rc_ink_color.b << ", " << (int)rc_ink_color.a << endl; SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); //cout << "n < " << (int) (h/8) << endl; for(int n = 0; n < (h/8) && n < i; n++) { stringRGBA(rc_win_renderer[rc_active_window], x, y + (n * 8), t_out[n].c_str(), rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); } SDL_SetRenderTarget(rc_win_renderer[rc_active_window], NULL); SDL_RenderCopy(rc_win_renderer[rc_active_window], rc_hconsole[rc_active_window], NULL, NULL); SDL_RenderPresent(rc_win_renderer[rc_active_window]); } } SDL_StopTextInput(); if(rc_active_screen >= 0) SDL_SetRenderTarget(rc_win_renderer[rc_active_window],rc_hscreen[rc_active_window][rc_active_screen]); return in_buf; } #else void rc_media_cls() { if(rc_winCheck(rc_active_window)) { SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hconsole[rc_active_window]); SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], 0, 0, 0, 0); SDL_RenderClear(rc_win_renderer[rc_active_window]); SDL_SetRenderTarget(rc_win_renderer[rc_active_window], NULL); SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_clearColor>>16, rc_clearColor>>8, rc_clearColor, rc_clearColor>>24); SDL_RenderClear(rc_win_renderer[rc_active_window]); if(rc_active_screen >= 0) SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); rc_media_ink(rc_ink); } } void rc_media_printS_hw(string txt) { if(rc_active_window < 0) return; SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hconsole[rc_active_window]); string tc = txt; string t_out[rc_console_height[rc_active_window]]; int i = 0; if(rc_sConsole_x[rc_active_window] >= rc_console_width[rc_active_window]) rc_sConsole_x[rc_active_window] = 0; while(tc.compare("")!=0) { if(tc.substr(i).length() > ( rc_console_width[rc_active_window] - rc_sConsole_x[rc_active_window]) ) { t_out[i] = rc_fillSpace(rc_sConsole_x[rc_active_window]) + tc.substr(i, rc_console_width[rc_active_window] - rc_sConsole_x[rc_active_window]); rc_sConsole_x[rc_active_window] = 0; tc = tc.substr( (rc_console_width[rc_active_window] - rc_sConsole_x[rc_active_window]) ); i++; } else { t_out[i] = rc_fillSpace(rc_sConsole_x[rc_active_window]) + tc; rc_sConsole_x[rc_active_window] = 0; i++; break; } } for(int n = 0; n < i; n++) stringRGBA(rc_win_renderer[rc_active_window], 0, (rc_sConsole_y[rc_active_window] + n) * 8, t_out[n].c_str(), rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); rc_sConsole_y[rc_active_window] += i; SDL_SetRenderTarget(rc_win_renderer[rc_active_window], NULL); SDL_RenderCopy(rc_win_renderer[rc_active_window], rc_hconsole[rc_active_window], NULL, NULL); SDL_RenderPresent(rc_win_renderer[rc_active_window]); if(rc_active_screen>=0) SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); return; } string rc_media_inputS_hw(string prompt) { //SDL_Surface * input_surface = NULL; //SDL_Texture * input_texture = NULL; bool loop = true; SDL_Event in_evt; string in_buf = prompt; string rtn_string = ""; string tc = in_buf; string t_out[rc_console_height[rc_active_window]]; int i = 0; SDL_Rect first_line, sub_line; first_line.x = (rc_sConsole_x[rc_active_window] * 8) + (prompt.length()*8); first_line.y = rc_sConsole_y[rc_active_window] * 8; first_line.w = 0; first_line.h = 8; sub_line.x = 0; sub_line.y = (rc_sConsole_y[rc_active_window]+1) * 8; sub_line.w = 0; sub_line.h = 8; SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hconsole[rc_active_window]); if(in_buf.length()>0) { tc = in_buf; i = 0; int x = rc_sConsole_x[rc_active_window]; if(x >= rc_console_width[rc_active_window]) x = 0; while(tc.compare("")!=0) { if(tc.length() > ( rc_console_width[rc_active_window] - x) ) { t_out[i] = rc_fillSpace(x) + tc.substr(0, rc_console_width[rc_active_window] - x); if(i == 0 && ((t_out[i].length() - prompt.length() - x)*8) > first_line.w) { first_line.w = (t_out[i].length() - prompt.length() - x) * 8; } else if(i != 0 && (t_out[i].length() * 8) > sub_line.w) { sub_line.w = t_out[i].length() * 8; } tc = tc.substr( (rc_console_width[rc_active_window] - x) ); x = 0; i++; } else { t_out[i] = rc_fillSpace(x) + tc; if(i == 0 && ((t_out[i].length() - prompt.length() - x)*8) > first_line.w) { first_line.w = (t_out[i].length() - prompt.length() - x) * 8; } else if(i != 0 && (t_out[i].length() * 8) > sub_line.w) { sub_line.w = t_out[i].length() * 8; } x = 0; i++; break; } if(i >= rc_console_height[rc_active_window]) break; } SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_clearColor>>16, rc_clearColor>>8, rc_clearColor, rc_clearColor>>24); SDL_RenderFillRect(rc_win_renderer[rc_active_window], &first_line); if(((i-1)*8) > sub_line.h) sub_line.h = i*8; if(sub_line.h > 0) SDL_RenderFillRect(rc_win_renderer[rc_active_window], &sub_line); SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); for(int n = 0; n < i; n++) { stringRGBA(rc_win_renderer[rc_active_window], 0, (rc_sConsole_y[rc_active_window] + n) * 8, t_out[n].c_str(), rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); } SDL_RenderPresent(rc_win_renderer[rc_active_window]); } while(loop) { if(SDL_WaitEvent(&in_evt)) { switch(in_evt.type) { case SDL_TEXTINPUT: in_buf += in_evt.text.text; break; case SDL_KEYDOWN: switch(in_evt.key.keysym.sym) { case SDLK_RETURN: loop = false; break; case SDLK_BACKSPACE: if(in_buf.length()-1 >= prompt.length() && in_buf.length()-1 >= 0) in_buf = in_buf.substr(0, in_buf.length()-1); break; } } } if(in_buf.length()>0) { tc = in_buf; i = 0; int x = rc_sConsole_x[rc_active_window]; if(x >= rc_console_width[rc_active_window]) x = 0; while(tc.compare("")!=0) { if(tc.length() > ( rc_console_width[rc_active_window] - x) ) { t_out[i] = rc_fillSpace(x) + tc.substr(0, rc_console_width[rc_active_window] - x); if(i == 0 && ((t_out[i].length() - prompt.length() - x)*8) > first_line.w) { first_line.w = (t_out[i].length() - prompt.length() - x) * 8; } else if(i != 0 && (t_out[i].length() * 8) > sub_line.w) { sub_line.w = t_out[i].length() * 8; } tc = tc.substr( (rc_console_width[rc_active_window] - x) ); x = 0; i++; } else { t_out[i] = rc_fillSpace(x) + tc; if(i == 0 && ((t_out[i].length() - prompt.length() - x)*8) > first_line.w) { first_line.w = (t_out[i].length() - prompt.length() - x) * 8; } else if(i != 0 && (t_out[i].length() * 8) > sub_line.w) { sub_line.w = t_out[i].length() * 8; } x = 0; i++; break; } if(i >= rc_console_height[rc_active_window]) break; } SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_clearColor>>16, rc_clearColor>>8, rc_clearColor, rc_clearColor>>24); SDL_RenderFillRect(rc_win_renderer[rc_active_window], &first_line); if(((i-1)*8) > sub_line.h) sub_line.h = i*8; if(sub_line.h > 0) SDL_RenderFillRect(rc_win_renderer[rc_active_window], &sub_line); SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); for(int n = 0; n < i; n++) { stringRGBA(rc_win_renderer[rc_active_window], 0, (rc_sConsole_y[rc_active_window] + n) * 8, t_out[n].c_str(), rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); } SDL_SetRenderTarget(rc_win_renderer[rc_active_window], NULL); SDL_RenderCopy(rc_win_renderer[rc_active_window], rc_hconsole[rc_active_window], NULL, NULL); SDL_RenderPresent(rc_win_renderer[rc_active_window]); SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hconsole[rc_active_window]); } } rc_sConsole_y[rc_active_window] += i; rc_sConsole_x[rc_active_window] = 0; if(rc_active_screen >= 0) SDL_SetRenderTarget(rc_win_renderer[rc_active_window],rc_hscreen[rc_active_window][rc_active_screen]); return in_buf.substr(prompt.length()); } string rc_media_ZoneInputS_hw(int x, int y, int w, int h) { //SDL_Surface * input_surface = NULL; //SDL_Texture * input_texture = NULL; bool loop = true; SDL_Event in_evt; string in_buf = ""; string rtn_string = ""; string tc = ""; string t_out[rc_console_height[rc_active_window]]; int i = 0; SDL_Rect zone; zone.x = x; zone.y = y; zone.w = w; zone.h = h; SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hconsole[rc_active_window]); while(loop) { if(SDL_WaitEvent(&in_evt)) { switch(in_evt.type) { case SDL_TEXTINPUT: in_buf += in_evt.text.text; break; case SDL_KEYDOWN: switch(in_evt.key.keysym.sym) { case SDLK_RETURN: loop = false; break; case SDLK_BACKSPACE: if(in_buf.length()-1 >= 0) in_buf = in_buf.substr(0, in_buf.length()-1); break; } } } if(in_buf.length()>=0) { tc = in_buf; i = 0; while(tc.compare("")!=0) { if(tc.length() > (w/8) ) { t_out[i] = tc.substr(0, (w/8) ); tc = tc.substr( w/8 ); i++; } else { t_out[i] = tc; i++; break; } if(i >= rc_console_height[rc_active_window]) break; } SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_clearColor>>16, rc_clearColor>>8, rc_clearColor, rc_clearColor>>24); SDL_RenderFillRect(rc_win_renderer[rc_active_window], &zone); //cout << "zone txt color = " << (int)rc_ink_color.r << ", " << (int)rc_ink_color.g << ", " << (int)rc_ink_color.b << ", " << (int)rc_ink_color.a << endl; SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); //cout << "n < " << (int) (h/8) << endl; for(int n = 0; n < (h/8) && n < i; n++) { stringRGBA(rc_win_renderer[rc_active_window], x, y + (n * 8), t_out[n].c_str(), rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); } SDL_SetRenderTarget(rc_win_renderer[rc_active_window], NULL); SDL_RenderCopy(rc_win_renderer[rc_active_window], rc_hconsole[rc_active_window], NULL, NULL); SDL_RenderPresent(rc_win_renderer[rc_active_window]); SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hconsole[rc_active_window]); } } if(rc_active_screen >= 0) SDL_SetRenderTarget(rc_win_renderer[rc_active_window],rc_hscreen[rc_active_window][rc_active_screen]); return in_buf; } #endif // RC_MOBILE bool rc_media_fontIsLoaded(int slot) { if(rc_draw_font[slot]!=NULL) return true; return false; } void rc_media_font(int slot) { if(rc_draw_font[slot]!= NULL) rc_active_font = slot; } void rc_media_setFontStyle(int f_slot, int style) { TTF_SetFontStyle(rc_draw_font[f_slot], style); } void rc_media_LoadFont(int slot, string font_path, int font_size) { if(rc_draw_font[slot] != NULL) TTF_CloseFont(rc_draw_font[slot]); rc_draw_font[slot] = TTF_OpenFont(font_path.c_str(), font_size); if(rc_active_font == -1) rc_active_font = slot; } void rc_media_DeleteFont(int slot) { if(rc_draw_font[slot] != NULL) TTF_CloseFont(rc_draw_font[slot]); rc_draw_font[slot] = NULL; } void rc_media_drawText_hw(string text, int x, int y) { if(rc_draw_font[rc_active_font] == NULL) { cout << "DrawTextError: Could not load font at " << rc_active_font << endl; return; } SDL_Surface * rendered_text = TTF_RenderUTF8_Solid(rc_draw_font[rc_active_font], text.c_str(), rc_ink_color); //cout << "debug 1\n"; SDL_Rect pos; pos.x = x; pos.y = y; pos.w = rendered_text->w; pos.h = rendered_text->h; SDL_Texture * txt_image = SDL_CreateTextureFromSurface(rc_win_renderer[rc_active_window],rendered_text); //SDL_BlitSurface(rendered_text, NULL, rc_sscreen[rc_active_window][rc_active_screen], &pos); SDL_FreeSurface(rendered_text); SDL_RenderCopy(rc_win_renderer[rc_active_window],txt_image,NULL,&pos); SDL_DestroyTexture(txt_image); } void rc_media_drawText_shaded_hw(string text, int x, int y, Uint32 fg_color, Uint32 bg_color) { if(rc_draw_font[rc_active_font] == NULL) { cout << "DrawTextError: Could not load font at " << rc_active_font << endl; return; } SDL_Color fg, bg; fg.a = fg_color >> 24; fg.r = fg_color >> 16; fg.g = fg_color >> 8; fg.b = fg_color; bg.a = bg_color >> 24; bg.r = bg_color >> 16; bg.g = bg_color >> 8; bg.b = bg_color; SDL_Surface * rendered_text = TTF_RenderUTF8_Shaded(rc_draw_font[rc_active_font], text.c_str(), fg, bg); //cout << "debug 1\n"; SDL_Rect pos; pos.x = x; pos.y = y; pos.w = rendered_text->w; pos.h = rendered_text->h; SDL_Texture * txt_image = SDL_CreateTextureFromSurface(rc_win_renderer[rc_active_window],rendered_text); //SDL_BlitSurface(rendered_text, NULL, rc_sscreen[rc_active_window][rc_active_screen], &pos); SDL_FreeSurface(rendered_text); SDL_RenderCopy(rc_win_renderer[rc_active_window],txt_image,NULL,&pos); SDL_DestroyTexture(txt_image); } void rc_media_drawText_blended_hw(string text, int x, int y) { if(rc_draw_font[rc_active_font] == NULL) { cout << "DrawTextError: Could not load font at " << rc_active_font << endl; return; } SDL_Surface * rendered_text = TTF_RenderUTF8_Blended(rc_draw_font[rc_active_font], text.c_str(), rc_ink_color); //cout << "debug 1\n"; SDL_Rect pos; pos.x = x; pos.y = y; pos.w = rendered_text->w; pos.h = rendered_text->h; SDL_Texture * txt_image = SDL_CreateTextureFromSurface(rc_win_renderer[rc_active_window],rendered_text); //SDL_BlitSurface(rendered_text, NULL, rc_sscreen[rc_active_window][rc_active_screen], &pos); SDL_FreeSurface(rendered_text); SDL_RenderCopy(rc_win_renderer[rc_active_window],txt_image,NULL,&pos); SDL_DestroyTexture(txt_image); } void rc_media_getTextSize(int f_slot, string txt, double * w, double * h) { if(rc_draw_font[f_slot] == NULL) { cout << "GetTextSize Error: No font at " << f_slot << endl; return; } int txt_w = 0, txt_h = 0; TTF_SizeUTF8(rc_draw_font[f_slot], txt.c_str(), &txt_w, &txt_h); *w = txt_w; *h = txt_h; } void rc_media_GetRenderedText_hw(int slot, string text) { if(slot < 0 || slot >= MAX_IMAGES) { cout << "GetRenderedText Error: Image must be in the range of 0 to " << MAX_IMAGES-1 << endl; return; } if(rc_draw_font[rc_active_font] == NULL) { cout << "GetRenderedText Error: Could not load font at " << rc_active_font << endl; return; } SDL_Surface * rendered_text = TTF_RenderUTF8_Solid(rc_draw_font[rc_active_font], text.c_str(), rc_ink_color); for(int i = 0; i < MAX_WINDOWS; i++) { if(rc_himage[slot][i] != NULL) { SDL_DestroyTexture(rc_himage[slot][i]); rc_himage[slot][i] = NULL; } if(rc_win[i] != NULL) { rc_himage[slot][i] = SDL_CreateTextureFromSurface(rc_win_renderer[i], rendered_text); rc_himage_rect[slot].x = 0; rc_himage_rect[slot].y = 0; rc_himage_rect[slot].w = rendered_text->w; rc_himage_rect[slot].h = rendered_text->h; rc_image_width[slot] = rendered_text->w; rc_image_height[slot] = rendered_text->h; rc_image_isLoaded[slot] = true; } } SDL_FreeSurface(rendered_text); } std::string rc_utf8_substr(const std::string& str, unsigned int start, unsigned int leng) { if (leng==0) { return ""; } unsigned int c, i, ix, q, min=std::string::npos, max=std::string::npos; for (q=0, i=0, ix=str.length(); i < ix; i++, q++) { if (q==start){ min=i; } if (q<=start+leng || leng==std::string::npos){ max=i; } c = (unsigned char) str[i]; if ( //c>=0 && c<=127) i+=0; else if ((c & 0xE0) == 0xC0) i+=1; else if ((c & 0xF0) == 0xE0) i+=2; else if ((c & 0xF8) == 0xF0) i+=3; //else if (($c & 0xFC) == 0xF8) i+=4; // 111110bb //byte 5, unnecessary in 4 byte UTF-8 //else if (($c & 0xFE) == 0xFC) i+=5; // 1111110b //byte 6, unnecessary in 4 byte UTF-8 else return "";//invalid utf8 } if (q<=start+leng || leng==std::string::npos){ max=i; } if (min==std::string::npos || max==std::string::npos) { return ""; } return str.substr(min,max-min); } std::size_t rc_utf8_length(std::string const &s) { return std::count_if(s.begin(), s.end(), [](char c) { return (static_cast(c) & 0xC0) != 0x80; } ); } int rc_getEvents() { SDL_Event event; int g_events = SDL_PollEvent(&event); //int g_events = SDL_WaitEvent(&event); //cout << "G_EVENT = " << g_events << endl; //cout << "TYPE = " << event.type << endl; if(!g_events) return 0; switch(event.type) { case SDL_QUIT: SDL_PumpEvents(); //rc_media_quit(); exit(0); break; case SDL_WINDOWEVENT: if(event.window.event == SDL_WINDOWEVENT_RESIZED) { for(int i = 0; i < MAX_WINDOWS; i++) { if(rc_win_id[i] == event.window.windowID) { rc_active_window = i; rc_win_event[i] = 4; rc_onResize(rc_active_window); break; } } } else if(event.window.event == SDL_WINDOWEVENT_CLOSE) { Uint32 win_id = -1; for(int i = 0; i < MAX_WINDOWS; i++) { if(rc_win[i]) { win_id = SDL_GetWindowID(rc_win[i]); if(win_id == event.window.windowID) { rc_win_event[i] = 1; if(SDL_QuitRequested() != 0) { //SDL_PumpEvents(); SDL_FlushEvent(SDL_QUIT); } if(rc_win_exitOnClose[i]) { rc_media_closeWindow_hw(i); return 0; //rc_win_event[i] = 0; } break; } win_id = -1; } } } else if(event.window.event == SDL_WINDOWEVENT_MINIMIZED) { Uint32 win_id = -1; for(int i = 0; i < MAX_WINDOWS; i++) { if(rc_win[i]) { win_id = SDL_GetWindowID(rc_win[i]); if(win_id == event.window.windowID) { rc_win_event[i] = 2; //rc_media_closeWindow_hw(i); break; } win_id = -1; } } } else if(event.window.event == SDL_WINDOWEVENT_MAXIMIZED) { Uint32 win_id = -1; for(int i = 0; i < MAX_WINDOWS; i++) { if(rc_win[i]) { win_id = SDL_GetWindowID(rc_win[i]); if(win_id == event.window.windowID) { rc_win_event[i] = 3; //rc_media_closeWindow_hw(i); break; } win_id = -1; } } } break; case SDL_TEXTINPUT: if(rc_textinput_flag == true) { rc_textinput_string += event.text.text; } break; case SDL_KEYUP: break; case SDL_KEYDOWN: if(rc_textinput_isActive && event.key.keysym.sym == SDLK_BACKSPACE && rc_textinput_string.length() > 0 && rc_toggleBackspace) { rc_textinput_string = rc_utf8_substr(rc_textinput_string, 0, rc_utf8_length(rc_textinput_string)-1); } rc_inkey = event.key.keysym.sym; break; //case SDL_MOUSEMOTION: //SDL_GetMouseState(&rc_mouseX, &rc_mouseY); //break; case SDL_MOUSEBUTTONUP: //SDL_GetMouseState(&rc_mouseX, &rc_mouseY); rc_mbutton1 = 0; rc_mbutton2 = 0; rc_mbutton3 = 0; //break; switch(event.button.button) { case SDL_BUTTON_LEFT: rc_mbutton1 = 0; break; case SDL_BUTTON_MIDDLE: rc_mbutton2 = 0; break; case SDL_BUTTON_RIGHT: rc_mbutton3 = 0; break; } break; case SDL_MOUSEBUTTONDOWN: //SDL_GetMouseState(&rc_mouseX, &rc_mouseY); //rc_mbutton1 = 0; //rc_mbutton2 = 0; //rc_mbutton3 = 0; switch(event.button.button) { case SDL_BUTTON_LEFT: rc_mbutton1 = 1; break; case SDL_BUTTON_MIDDLE: rc_mbutton2 = 1; break; case SDL_BUTTON_RIGHT: rc_mbutton3 = 1; break; } break; case SDL_MOUSEWHEEL: rc_mwheelx = event.wheel.x; rc_mwheely = event.wheel.y; break; // case SDL_JOYBUTTONDOWN: // rc_joybutton[event.jbutton.which][event.jbutton.button] = 1; // break; // case SDL_JOYBUTTONUP: // rc_joybutton[event.jbutton.which][event.jbutton.button] = 0; // break; // case SDL_JOYAXISMOTION: // rc_joy_axis[event.jaxis.which][event.jaxis.axis] = event.jaxis.value; // break; case SDL_JOYDEVICEREMOVED: //cout << "Joystick Removed: Instance " << event.jdevice.which << endl; for(int i = 0; i < 8; i++) { if(event.jdevice.which == rc_joyID[i] && rc_joystick[i]) { //cout << "Joystick [" << i << "] was removed" << endl; SDL_HapticClose(rc_haptic[i]); SDL_JoystickClose(rc_joystick[i]); rc_joystick[i] = NULL; rc_haptic[i] = NULL; rc_joyID[i] = -1; rc_numJoysticks--; break; } } break; case SDL_JOYDEVICEADDED: //cout << "Joystick Added: " << event.jdevice.which << endl; tmp_joy = SDL_JoystickOpen(event.jdevice.which); tmp_joy_id = SDL_JoystickInstanceID(tmp_joy); tmp_joy_flag = 0; for(int i = 0; i < 8; i++) { if(tmp_joy_id == rc_joyID[i]) { tmp_joy_flag = 1; break; } } if(event.jdevice.which >= 0 && tmp_joy_flag == 0) { for(int i = 0; i < 8; i++) { if(rc_joystick[i] == NULL) { //cout << "Assigned " << i << endl; rc_joystick[i] = tmp_joy; rc_haptic[i] = SDL_HapticOpenFromJoystick(rc_joystick[i]); SDL_HapticRumbleInit(rc_haptic[i]); rc_joyID[i] = tmp_joy_id; rc_numJoysticks++; break; } } } break; #ifndef RC_MOBILE //This block handles touch events for non-mobile devices, Just in case it has a touch screen that SDL2 can get events for case SDL_FINGERDOWN: rc_touch = 1; rc_touchX = event.tfinger.x * rc_win_width[rc_active_window]; rc_touchY = event.tfinger.y * rc_win_height[rc_active_window]; #ifdef RC_IOS rc_pressure = 1; //FIXME: On IOS pressure is always getting reported as 0 on finger down so I am just setting it to 1 until I figure this out #else rc_pressure = event.tfinger.pressure; #endif rc_setTouchFingerEvent(event.tfinger.fingerId, rc_touchX, rc_touchY, rc_pressure); break; case SDL_FINGERUP: rc_touch = 0; rc_mt_status = 0; rc_touchX = event.tfinger.x * rc_win_width[rc_active_window]; rc_touchY = event.tfinger.y * rc_win_height[rc_active_window]; rc_pressure = event.tfinger.pressure; rc_setTouchFingerEvent(event.tfinger.fingerId, -1, -1, 0); break; case SDL_FINGERMOTION: rc_touch = 1; rc_touchX = event.tfinger.x * rc_win_width[rc_active_window]; rc_touchY = event.tfinger.y * rc_win_height[rc_active_window]; rc_motionX = event.tfinger.dx * rc_win_width[rc_active_window]; rc_motionY = event.tfinger.dy * rc_win_height[rc_active_window]; #ifdef RC_IOS rc_pressure = 1; #else rc_pressure = event.tfinger.pressure; #endif rc_setTouchFingerEvent(event.tfinger.fingerId, rc_touchX, rc_touchY, rc_pressure); break; case SDL_MULTIGESTURE: rc_touch = 2; rc_mt_status = 1; rc_mt_x = event.mgesture.x; rc_mt_y = event.mgesture.y; rc_mt_numFingers = event.mgesture.numFingers; rc_mt_dist = event.mgesture.dDist; rc_mt_theta = event.mgesture.dTheta; #ifdef RC_IOS rc_pressure = 1; #else rc_pressure = event.tfinger.pressure; #endif break; #endif } //cout << "end_event" << endl; return g_events; } bool rc_media_windowEvent_Close(int win_num) { if(rc_winCheck(win_num)) { if(rc_win_event[win_num]==1) { //cout << "Window #" << win_num << " Close_Event" << endl; return true; } else return false; } return false; } bool rc_media_windowEvent_Minimize(int win_num) { if(rc_winCheck(win_num)) { if(rc_win_event[win_num]==2) return true; else return false; } return false; } bool rc_media_windowEvent_Maximize(int win_num) { if(rc_winCheck(win_num)) { if(rc_win_event[win_num]==3) return true; else return false; } return false; } bool rc_media_windowEvent_Resize(int win_num) { if(rc_winCheck(win_num)) { if(rc_win_event[win_num]==4) return true; else return false; } return false; } void rc_media_windowEvent_setExitOnClose(int win_num, int exitOnClose) { rc_win_exitOnClose[win_num] = (exitOnClose != 0) ? true : false; } void rc_media_getTouchFinger(int finger, double * x, double * y, double * pressure) { if(finger < MAX_FINGERS) { *x = rc_finger[finger].x; *y = rc_finger[finger].y; *pressure = rc_finger[finger].pressure; } } int rc_media_numFingers() { return rc_fingers_pressed.size(); //if(rc_touchDevice) // return SDL_GetNumTouchFingers(rc_touchDevice); //return 0; } double rc_media_touchPressure() { return rc_pressure; } void rc_media_getTouch(double * status, double * x, double * y, double * distX, double * distY) { *status = (double)rc_touch; *x = (double)rc_touchX; *y = (double)rc_touchY; *distX = (double)rc_motionX; *distY = (double)rc_motionY; return; } void rc_media_getMultiTouch(double * status, double * x, double * y, double * numFingers, double * dist, double * theta) { *status = (double)rc_mt_status; *x = (double)rc_mt_x; *y = (double)rc_mt_y; *numFingers = (double)rc_mt_numFingers; *dist = rc_mt_dist; *theta = rc_mt_theta; return; } void rc_media_getAccel(uint32_t accel_num, double * x, double * y, double * z) { float sensor_data[4]; if(accel_num < num_accels) SDL_SensorGetData(rc_accel[accel_num], &sensor_data[0], 3); *x = sensor_data[0]; *y = sensor_data[1]; *z = sensor_data[2]; } string rc_media_accelName(uint32_t accel_num) { if(accel_num < num_accels) return (string)SDL_SensorGetName(rc_accel[accel_num]); return ""; } int rc_media_numAccels() { return num_accels; } void rc_media_getGyro(uint32_t gyro_num, double * x, double * y, double * z) { float sensor_data[4]; if(gyro_num < num_gyros) SDL_SensorGetData(rc_gyro[gyro_num], &sensor_data[0], 3); *x = sensor_data[0]; *y = sensor_data[1]; *z = sensor_data[2]; } string rc_media_gyroName(uint32_t gyro_num) { if(gyro_num < num_gyros) return (string)SDL_SensorGetName(rc_gyro[gyro_num]); return ""; } int rc_media_numGyros() { return num_gyros; } void rc_media_ReadInput_Start() { SDL_StartTextInput(); rc_textinput_isActive = true; rc_textinput_string = ""; rc_textinput_timer = clock() / (double)(CLOCKS_PER_SEC / 1000); } void rc_media_ReadInput_Stop() { rc_textinput_isActive = false; rc_textinput_timer = 0; rc_textinput_string = ""; SDL_StopTextInput(); } string rc_media_ReadInput_Text() { return rc_textinput_string; } void rc_media_ReadInput_SetText(string txt) { rc_textinput_string = txt; } void rc_media_ReadInput_ToggleBackspace(bool flag) { rc_toggleBackspace = flag; } int rc_media_inkey() { int k = rc_inkey; return k; } int rc_media_key(int check_Key) { if(keyState == NULL) keyState = SDL_GetKeyboardState(NULL); return keyState[SDL_GetScancodeFromKey(check_Key)]; } int rc_media_waitKey() { bool wk_loop = true; SDL_Event e; while(wk_loop) { while(SDL_WaitEvent(&e)) { if(e.type == SDL_KEYDOWN) return (int)e.key.keysym.sym; } } return 0; } void rc_media_wait(Uint32 ms) { SDL_Delay(ms); } void rc_media_hideMouse() { SDL_ShowCursor(0); rc_cursor_visible = 0; } void rc_media_showMouse() { SDL_ShowCursor(1); rc_cursor_visible = 1; } bool rc_media_mouseIsVisible() { return rc_cursor_visible; } int rc_media_mouseX() { //SDL_GetMouseState(&rc_mouseX,&rc_mouseY); //cout << "debug: " << rc_fullscreen_mouse_scale_x[rc_active_window] << endl; #ifdef RC_MOBILE return rc_mouseX; #else return rc_mouseX * rc_fullscreen_mouse_scale_x[rc_active_window]; #endif // RC_MOBILE } int rc_media_mouseY() { //SDL_GetMouseState(&rc_mouseX,&rc_mouseY); #ifdef RC_MOBILE return rc_mouseY; #else return rc_mouseY * rc_fullscreen_mouse_scale_y[rc_active_window]; #endif // RC_MOBILE } int rc_media_mouseButton(int m) { switch(m) { case 0: return rc_mbutton1; case 1: return rc_mbutton2; case 2: return rc_mbutton3; } return -1; } void rc_media_getMouse(double * x, double * y, double * mb1, double * mb2, double * mb3) { //SDL_GetMouseState(&rc_mouseX,&rc_mouseY); //SDL_PumpEvents(); *mb1 = rc_mbutton1; *mb2 = rc_mbutton2; *mb3 = rc_mbutton3; #ifdef RC_MOBILE *x = rc_mouseX; *y = rc_mouseY; #else *x = (int)(rc_mouseX * rc_fullscreen_mouse_scale_x[rc_active_window]); *y = (int)(rc_mouseY * rc_fullscreen_mouse_scale_y[rc_active_window]); //cout << "debug getMouse = " << rc_mouseX << " * " << rc_fullscreen_mouse_scale_x[rc_active_window] << endl; #endif // RC_MOBILE return; } int rc_media_globalMouseX() { //SDL_GetGlobalMouseState(&rc_mouseX,&rc_mouseY); return rc_global_mouseX; } int rc_media_globalMouseY() { //SDL_GetGlobalMouseState(&rc_mouseX,&rc_mouseY); return rc_global_mouseY; } void rc_media_getGlobalMouse(double * x, double * y, double * mb1, double * mb2, double * mb3) { //SDL_GetGlobalMouseState(&rc_mouseX,&rc_mouseY); //SDL_PumpEvents(); *mb1 = rc_mbutton1; *mb2 = rc_mbutton2; *mb3 = rc_mbutton3; *x = rc_global_mouseX; *y = rc_global_mouseY; return; } int rc_media_mouseWheelX() { return rc_mwheelx; } int rc_media_mouseWheelY() { return rc_mwheely; } void rc_media_getMouseWheel(double * x_axis, double * y_axis) { *x_axis = rc_mwheelx; *y_axis = rc_mwheely; return; } void rc_media_grabInput(bool flag) { SDL_SetWindowGrab(rc_win[rc_active_window], flag ? SDL_TRUE : SDL_FALSE); } int rc_media_grabbedWindow() { for(int i = 0; i < MAX_WINDOWS; i++) { if(SDL_GetWindowGrab(rc_win[i])) return i; } return -1; } void rc_media_warpMouse(int x, int y) { SDL_WarpMouseInWindow(rc_win[rc_active_window], x, y); } void rc_media_warpMouseGlobal(int x, int y) { SDL_WarpMouseGlobal(x, y); } void rc_media_setMouseZone(int x, int y, int w, int h) { SDL_Rect r; r.x = x; r.y = y; r.w = w; r.h = h; SDL_SetWindowMouseRect(rc_win[rc_active_window], &r); } void rc_media_clearMouseZone() { SDL_SetWindowMouseRect(rc_win[rc_active_window], NULL); } void rc_media_setWindowAlwaysOnTop(int win, bool flag) { if(win < 0 || win >= MAX_WINDOWS) return; SDL_SetWindowAlwaysOnTop(rc_win[win], flag ? SDL_TRUE : SDL_FALSE); } void rc_media_setMouseRelative(bool flag) { SDL_SetRelativeMouseMode(flag ? SDL_TRUE : SDL_FALSE); } void rc_media_setWindowVSync(int win, bool flag) { SDL_RenderSetVSync(rc_win_renderer[win], flag ? SDL_TRUE : SDL_FALSE); } int rc_media_openURL(string url) { return SDL_OpenURL(url.c_str()); } string rc_media_APIVersion() { SDL_version version; SDL_GetVersion(&version); stringstream ss; ss << (uint32_t)version.major << "." << (uint32_t)version.minor << "." << (uint32_t)version.patch; return ss.str(); } int rc_media_flashWindow(int win) { //SDL_FlashOperation op; return SDL_FlashWindow(rc_win[win], SDL_FLASH_UNTIL_FOCUSED); } int rc_media_messageBox(string title, string msg) { return SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION, title.c_str(), msg.c_str(), NULL); } void rc_media_updateWindow_hw() { if(!rc_win[rc_active_window]) return; int s_num = 0; SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_backBuffer[rc_active_window]); SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_clearColor >> 16, rc_clearColor >> 8, rc_clearColor, 255); //SDL_RenderFillRect(rc_win_renderer[rc_active_window], NULL); SDL_RenderClear(rc_win_renderer[rc_active_window]); for(int i = MAX_SCREENS-1; i >= 0; i--) { s_num = rc_screen_zOrder[rc_active_window][i]; //cout << "DRAW SCREEN: " << s_num << endl; if(rc_hscreen[rc_active_window][s_num] != NULL && rc_screen_visible[rc_active_window][s_num]) { //cout << "draw canvas " << s_num << endl; #ifdef RC_WEB SDL_RenderCopy(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][s_num], &rc_screenview[rc_active_window][s_num], &rc_screen_rect[rc_active_window][s_num]); #else SDL_RenderCopy(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][s_num], &rc_screenview[rc_active_window][s_num], &rc_screen_rect[rc_active_window][s_num]); #endif } } //#ifndef RC_ANDROID SDL_RenderCopy(rc_win_renderer[rc_active_window], rc_hconsole[rc_active_window], NULL, NULL); //#endif // RC_ANDROID //cout << endl; SDL_SetRenderTarget(rc_win_renderer[rc_active_window], NULL); #if defined(RC_MOBILE) || defined(RC_WEB) SDL_RenderCopy(rc_win_renderer[rc_active_window], rc_backBuffer[rc_active_window], NULL, NULL); #else SDL_RenderCopy(rc_win_renderer[rc_active_window], rc_backBuffer[rc_active_window], &rc_bb_rect[rc_active_window], NULL); #endif // RC_ANDROID SDL_RenderPresent(rc_win_renderer[rc_active_window]); SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]); SDL_SetRenderDrawColor(rc_win_renderer[rc_active_window], rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); rc_fps_frames[rc_active_window]++; uint32_t t = SDL_GetTicks(); if( (t - rc_fps_timer[rc_active_window]) >= 1000 ) { rc_fps_timer[rc_active_window] = t; rc_fps[rc_active_window] = rc_fps_frames[rc_active_window]; rc_fps_frames[rc_active_window] = 0; } } void rc_media_updateAllWindow_hw() { for(int win_num = 0; win_num < MAX_WINDOWS; win_num++) { if(!rc_win[win_num]) continue; int s_num = 0; SDL_SetRenderTarget(rc_win_renderer[win_num], rc_backBuffer[win_num]); SDL_SetRenderDrawColor(rc_win_renderer[win_num], rc_clearColor >> 16, rc_clearColor >> 8, rc_clearColor, 255); //SDL_RenderFillRect(rc_win_renderer[win_num], NULL); SDL_RenderClear(rc_win_renderer[win_num]); for(int i = MAX_SCREENS-1; i >= 0; i--) { s_num = rc_screen_zOrder[win_num][i]; //cout << "DRAW SCREEN: " << s_num << endl; if(rc_hscreen[win_num][s_num] != NULL && rc_screen_visible[win_num][s_num]) { //cout << "draw canvas " << s_num << endl; #ifdef RC_WEB SDL_RenderCopy(rc_win_renderer[win_num], rc_hscreen[win_num][s_num], &rc_screenview[win_num][s_num], &rc_screen_rect[win_num][s_num]); #else SDL_RenderCopy(rc_win_renderer[win_num], rc_hscreen[win_num][s_num], &rc_screenview[win_num][s_num], &rc_screen_rect[win_num][s_num]); #endif } } //#ifndef RC_ANDROID SDL_RenderCopy(rc_win_renderer[win_num], rc_hconsole[win_num], NULL, NULL); //#endif // RC_ANDROID //cout << endl; SDL_SetRenderTarget(rc_win_renderer[win_num], NULL); #if defined(RC_MOBILE) || defined(RC_WEB) SDL_RenderCopy(rc_win_renderer[win_num], rc_backBuffer[win_num], NULL, NULL); #else SDL_RenderCopy(rc_win_renderer[win_num], rc_backBuffer[win_num], &rc_bb_rect[win_num], NULL); #endif // RC_ANDROID SDL_RenderPresent(rc_win_renderer[win_num]); SDL_SetRenderTarget(rc_win_renderer[win_num], rc_hscreen[win_num][rc_active_screen]); SDL_SetRenderDrawColor(rc_win_renderer[win_num], rc_ink_color.r, rc_ink_color.g, rc_ink_color.b, rc_ink_color.a); rc_fps_frames[win_num]++; uint32_t t = SDL_GetTicks(); if( (t - rc_fps_timer[win_num]) >= 1000 ) { rc_fps_timer[win_num] = t; rc_fps[win_num] = rc_fps_frames[win_num]; rc_fps_frames[win_num] = 0; } } } bool rc_media_imageExist_hw(int slot) { return rc_image_isLoaded[slot]; } int rc_media_numJoysticks() { return SDL_NumJoysticks(); } int rc_media_joyAxis(int joy_num, int axis) { if(joy_num >= 0 && joy_num < MAX_JOYSTICKS) return SDL_JoystickGetAxis(rc_joystick[joy_num], axis); return 0; } int rc_media_joyButton(int joy_num, int jbutton) { if(joy_num >= 0 && joy_num < MAX_JOYSTICKS) return SDL_JoystickGetButton(rc_joystick[joy_num], jbutton); return 0; } string rc_media_joystickName(int joy_num) { if(joy_num >= 0 && joy_num < MAX_JOYSTICKS) return (string)SDL_JoystickName(rc_joystick[joy_num]); return ""; } int rc_media_numJoyButtons(int joy_num) { if(joy_num >= 0 && joy_num < MAX_JOYSTICKS) return SDL_JoystickNumButtons(rc_joystick[joy_num]); return 0; } int rc_media_numJoyAxes(int joy_num) { if(joy_num >= 0 && joy_num < MAX_JOYSTICKS) return SDL_JoystickNumAxes(rc_joystick[joy_num]); return 0; } int rc_media_numJoyHats(int joy_num) { if(joy_num >= 0 && joy_num < MAX_JOYSTICKS) return SDL_JoystickNumHats(rc_joystick[joy_num]); return 0; } int rc_media_joyHat(int joy_num, int hat) { if(joy_num >= 0 && joy_num < MAX_JOYSTICKS) return SDL_JoystickGetHat(rc_joystick[joy_num], hat); return 0; } int rc_media_numJoyTrackBalls(int joy_num) { if(joy_num >= 0 && joy_num < MAX_JOYSTICKS) return SDL_JoystickNumBalls(rc_joystick[joy_num]); return 0; } void rc_media_getJoyTrackBall(int joy_num, int ball, double * dx, double * dy) { int x = 0; int y = 0; if(joy_num >= 0 && joy_num < MAX_JOYSTICKS) SDL_JoystickGetBall(rc_joystick[joy_num], ball, &x, &y); *dx = x; *dy = y; } bool rc_media_joystickIsConnected( int joy_num ) { if(joy_num >= 0 && joy_num < MAX_JOYSTICKS) { if(rc_joystick[joy_num]) return true; return false; } return false; } void rc_media_joyRumblePlay(int joy_num, double strength, double duration) { if(joy_num >= 0 && joy_num < MAX_JOYSTICKS) { SDL_HapticRumblePlay(rc_haptic[joy_num], strength, (Uint32)duration); } } void rc_media_joyRumbleStop(int joy_num) { if(joy_num >= 0 && joy_num < MAX_JOYSTICKS) SDL_HapticRumbleStop(rc_haptic[joy_num]); } int rc_media_joystickIsHaptic( int joy_num ) { if(joy_num >= 0 && joy_num < MAX_JOYSTICKS) { if(rc_haptic[joy_num]) return 1; } return 0; } int rc_media_queryAudioSpec(double * freq, double * format, double * channels) { //need to do something here int qa_freq = 0; Uint16 qa_format = 0; int qa_channels = 0; int result = Mix_QuerySpec(&qa_freq, &qa_format, &qa_channels); *freq = (double)qa_freq; *format = (double)qa_format; *channels = (double)qa_channels; return result; } void rc_media_loadSound(int slot, string fname) { if(rc_sound[slot] != NULL) { Mix_FreeChunk(rc_sound[slot]); } rc_sound[slot] = Mix_LoadWAV(fname.c_str()); if(rc_sound[slot] == NULL) { cout << "Could not load sound: " << Mix_GetError() << endl; return; } } void rc_media_createSound(int slot, double * abuf, Uint32 alen, Uint8 volume) { if(!rc_sound[slot]) { rc_sound[slot] = (Mix_Chunk*)SDL_malloc(sizeof(Mix_Chunk)); //cout << "sound dbg 0" << endl; rc_sound[slot]->allocated = 1; //cout << "GOOD START" << endl; rc_sound[slot]->abuf = (Uint8*)SDL_malloc(sizeof(Uint8)*alen); //cout << "sound dbg 1" << endl; for(int i = 0; i < alen; i++) rc_sound[slot]->abuf[i] = (Uint8)abuf[i]; //cout << "sound dbg 2" << endl; rc_sound[slot]->alen = alen; rc_sound[slot]->volume = volume; } } void rc_media_loadMusic(string fname) { if(rc_music != NULL) { Mix_FreeMusic(rc_music); } rc_music = Mix_LoadMUS(fname.c_str()); if(rc_music == NULL) { cout << "Could not load music: " << Mix_GetError() << endl; return; } } void rc_media_deleteMusic() { if(rc_music) { Mix_FreeMusic(rc_music); rc_music = NULL; } } void rc_media_playSound(int slot, int channel, int loops) { if(rc_sound[slot] != NULL) { Mix_PlayChannel(channel, rc_sound[slot], loops); } } void rc_media_playSoundTimed(int slot, int channel, int loops, int ms) { if(rc_sound[slot] != NULL) { Mix_PlayChannelTimed(channel, rc_sound[slot], loops, ms); } } void rc_media_playMusic(int loops) { if(rc_music != NULL) { Mix_PlayMusic(rc_music, loops); } } int rc_media_musicIsPlaying() { if(rc_music != NULL) { return Mix_PlayingMusic(); } return 0; } void rc_media_pauseSound(int channel) { if(Mix_Playing(channel)) { Mix_Pause(channel); } } void rc_media_resumeSound(int channel) { if(!Mix_Playing(channel)) { Mix_Resume(channel); } } void rc_media_pauseMusic() { if(Mix_PlayingMusic()) { Mix_PauseMusic(); } } void rc_media_resumeMusic() { if(!Mix_PlayingMusic()) { Mix_ResumeMusic(); } } void rc_media_deleteSound(int slot) { if(rc_sound[slot] != NULL) { Mix_FreeChunk(rc_sound[slot]); rc_sound[slot] = NULL; } } void rc_media_fadeMusicIn(int time, int loops) { Mix_FadeInMusic(rc_music, loops, time); } void rc_media_fadeMusicOut(int time) { Mix_FadeOutMusic(time); } bool rc_media_musicExists() { if(rc_music != NULL) return true; return false; } void rc_media_setMusicVolume(int volume) { Mix_VolumeMusic(volume); } int rc_media_getMusicVolume() { return Mix_VolumeMusic(-1); } void rc_media_setMusicPosition(double position) { Mix_SetMusicPosition(position); } double rc_media_getMusicPosition() { return Mix_SetMusicPosition(-1); } void rc_media_rewindMusic() { Mix_RewindMusic(); } void rc_media_setSoundChannels(int max_channels) { Mix_AllocateChannels(max_channels); } int rc_media_getSoundChannels() { return Mix_AllocateChannels(-1); } bool rc_media_soundIsEnabled() { return (bool) Mix_Init(0); } bool rc_media_soundExists(int slot) { if(rc_sound[slot] != NULL) return true; return false; } void rc_media_setChannelVolume(int channel, int volume) { Mix_Volume(channel, volume); } int rc_media_getChannelVolume(int channel) { return Mix_Volume(channel, -1); } void rc_media_setSoundVolume(int slot, int volume) { Mix_VolumeChunk(rc_sound[slot], volume); } int rc_media_getSoundVolume(int slot) { return Mix_VolumeChunk(rc_sound[slot], -1); } void rc_media_stopMusic() { Mix_HaltMusic(); } void rc_media_stopSound(int channel) { Mix_HaltChannel(channel); } int rc_media_channelIsPlaying(int channel) { return Mix_Playing(channel); } int rc_media_channelIsPaused(int channel) { return Mix_Paused(channel); } int rc_media_setChannelDistance(int channel, Uint8 dist) { return Mix_SetDistance(channel, dist); } int rc_media_setChannelPanning(int channel, Uint8 l, Uint8 r) { return Mix_SetPanning(channel, l, r); } int rc_media_setChannelSpacePosition(int channel, double angle, double distance) { return Mix_SetPosition(channel, (Sint16)angle, (Uint8) distance); } //NETWORKING //TCPsocket rc_socket[5]; //UDPsocket rc_udp_socket[5]; //UDPpacket * rc_udp_packet; //int rc_udp_channel; //string rc_udp_data; //int rc_udp_len; //int rc_udp_maxlen; //string rc_udp_host; //Uint16 rc_udp_port; int rc_net_tcp_openSocket(int _socket, string host, Uint16 port) { if(_socket >= MAX_SOCKETS) { cout << "TCP_SocketOpen Error: Maximum number of sockets available is " << MAX_SOCKETS << endl; return 0; } IPaddress ip; if(host.compare("") == 0) { //exit(0); SDLNet_ResolveHost(&ip, NULL, port); } else { //exit(0); SDLNet_ResolveHost(&ip, host.c_str(), port); } rc_socket[_socket] = SDLNet_TCP_Open(&ip); if(rc_socket[_socket]) { //cout << "Add socket to socket_set" << endl; SDLNet_TCP_AddSocket(rc_socket_set, rc_socket[_socket]); return 1; } return 0; } void rc_net_tcp_closeSocket(int _socket) { if( _socket >= MAX_SOCKETS) { cout << "TCP_SocketClose Error: Maximum number of sockets available is " << MAX_SOCKETS << endl; return; } SDLNet_TCP_DelSocket(rc_socket_set, rc_socket[_socket]); SDLNet_TCP_Close(rc_socket[_socket]); rc_socket[_socket] = NULL; } Uint32 rc_net_tcp_remoteHost(int _socket) { IPaddress * ip = SDLNet_TCP_GetPeerAddress(rc_socket[_socket]); return ip->host; } Uint32 rc_net_tcp_remotePort(int _socket) { IPaddress * ip = SDLNet_TCP_GetPeerAddress(rc_socket[_socket]); return ip->port; } int rc_net_checkSockets(Uint32 m) { return SDLNet_CheckSockets(rc_socket_set, m); } int rc_net_tcp_socketReady(int _socket) { return SDLNet_SocketReady(rc_socket[_socket]); } int rc_net_tcp_getData(int socket, void * dst, int numBytes) { int rtn = SDLNet_TCP_Recv(rc_socket[socket], dst, numBytes); return rtn; } int rc_net_tcp_getData_str(int socket, string * dst, int numBytes) { char c[numBytes+1]; int rtn = rc_net_tcp_getData(socket, c, numBytes); c[numBytes] = '\0'; //cout << "Read bytes: " << (string)c << endl; dst[0] = c; return rtn; } int rc_net_tcp_getData_dbl(int socket, double * dst, int numBytes) { int i[numBytes]; int rtn = rc_net_tcp_getData(socket, i, numBytes); for(int n = 0; n < numBytes; n++) { dst[n] = i[n]; } return rtn; } void rc_net_tcp_sendData(int socket, const char * data, int numBytes) { SDLNet_TCP_Send(rc_socket[socket], data, numBytes); } bool rc_net_tcp_acceptSocket(int socket_server, int socket_client) { //cout << "\n\nthis is a test\n\n"; if(rc_socket[socket_server] == NULL) { //cout << "no server" << endl; return false; } bool val = (rc_socket[socket_client] = SDLNet_TCP_Accept(rc_socket[socket_server])); if(val) SDLNet_TCP_AddSocket(rc_socket_set, rc_socket[socket_client]); //cout << "cp1\n"; return val; } bool rc_net_udp_openSocket(int socket, Uint16 port) { bool rtn = (bool)(rc_udp_socket[socket] = SDLNet_UDP_Open(port)); if(rtn) SDLNet_UDP_AddSocket(rc_socket_set, rc_udp_socket[socket]); return rtn; } int rc_net_udp_socketReady(int socket) { return SDLNet_SocketReady(rc_udp_socket[socket]); } int rc_net_udp_readStream(int socket, string * dst, string * host, double * port) { //cout << "DEBUG READSTREAM\n"; //UDPsocket sd; /* Socket descriptor */ //UDPpacket *p; /* Pointer to packet memory */ //int quit = 0; /* Make space for the packet */ //if (!(rc_udp_packet = SDLNet_AllocPacket(512))) //{ // fprintf(stderr, "SDLNet_AllocPacket: %s\n", SDLNet_GetError()); // exit(EXIT_FAILURE); //} /* Main loop */ /* Wait a packet. UDP_Recv returns != 0 if a packet is coming */ //while(!quit) //{ if (SDLNet_UDP_Recv(rc_udp_socket[socket], rc_udp_packet)) { //printf("UDP Packet incoming\n"); //printf("\tChan: %d\n", rc_udp_packet->channel); rc_udp_channel = rc_udp_packet->channel; //printf("\tData: %s\n", (char *)rc_udp_packet->data); const char * c = (const char *)rc_udp_packet->data; //rc_udp_data = (string)c; *dst = (string)c; //printf("\tLen: %d\n", rc_udp_packet->len); rc_udp_len = rc_udp_packet->len; //printf("\tMaxlen: %d\n", rc_udp_packet->maxlen); rc_udp_maxlen = rc_udp_packet->maxlen; //printf("\tStatus: %d\n", rc_udp_packet->status); //printf("\tAddress: %x %x\n", rc_udp_packet->address.host, rc_udp_packet->address.port); //rc_udp_host = SDLNet_ResolveIP(&rc_udp_packet->address); *host = SDLNet_ResolveIP(&rc_udp_packet->address); //rc_udp_port = rc_udp_packet->address.port; *port = rc_udp_packet->address.port; return 1; //quit = 1; } else { rc_udp_channel = 0; //rc_udp_data = ""; *dst = ""; rc_udp_len = 0; rc_udp_maxlen = rc_udp_packet->maxlen; //rc_udp_host = SDLNet_ResolveIP(&rc_udp_packet->address); *host = SDLNet_ResolveIP(&rc_udp_packet->address); //rc_udp_port = rc_udp_packet->address.port; *port = rc_udp_packet->address.port; return 0; } //} //SDLNet_FreePacket(rc_udp_packet); } Uint32 rc_net_udp_len() { return rc_udp_len; } Uint32 rc_net_udp_maxlen() { return rc_udp_maxlen; } string rc_net_udp_getRemoteHost(int socket) { IPaddress * ip = SDLNet_UDP_GetPeerAddress(rc_udp_socket[socket],0); // return SDLNet_ResolveIP(ip); } Uint32 rc_net_udp_getRemotePort(int socket) { IPaddress * ip = SDLNet_UDP_GetPeerAddress(rc_udp_socket[socket],0); return ip->port; } int rc_net_udp_closeSocket(int socket) { SDLNet_UDP_DelSocket(rc_socket_set, rc_udp_socket[socket]); SDLNet_UDP_Close(rc_udp_socket[socket]); rc_udp_socket[socket] = NULL; return 0; } int rc_net_udp_sendData(int slot, string host, Uint16 port, string s_data) { IPaddress srvadd; if(s_data.length()+1 > rc_packet_size) { rc_packet_size = SDLNet_ResizePacket(rc_udp_packet, s_data.length()+1); if(rc_packet_size < s_data.length()) { cout << "UDP_SendData Error: " << SDLNet_GetError() << endl; return 0; } } if(rc_udp_packet == NULL) return 0; if (SDLNet_ResolveHost(&srvadd, host.c_str(), port) == -1) { std::cout << "UDP_SendData Error: " << SDLNet_GetError() << "\n"; //exit(EXIT_FAILURE); return 0; } rc_udp_packet->address.host = srvadd.host; rc_udp_packet->address.port = srvadd.port; rc_udp_packet->data = (Uint8*)s_data.c_str(); rc_udp_packet->len = s_data.length()+1; //cout << "#Data = " << (char*)rc_udp_packet->data << endl; //cout << "#Length = " << rc_udp_packet->len << endl; SDLNet_UDP_Send(rc_udp_socket[slot], -1, rc_udp_packet); return 1; } string rc_byteToString(Uint8 n) { stringstream s; s << (Uint32)n; return s.str(); } string rc_net_myLocalIP() { //cout << "MYLOCALIP" << endl; IPaddress myIP; myIP.host = 0; myIP.port = 0; string net_name = SDLNet_ResolveIP(&myIP); SDLNet_ResolveHost(&myIP,net_name.c_str(),0); string ip = ""; ip += rc_byteToString((Uint8)myIP.host) + "."; ip += rc_byteToString((Uint8)(myIP.host >> 8)) + "."; ip += rc_byteToString((Uint8)(myIP.host >> 16)) + "."; ip += rc_byteToString((Uint8)(myIP.host >> 24)); //cout << "vagina: " << myIP.host << endl; return ip; } //#################VIDEO PLAYBACK##################################################################### #ifdef RC_USE_TREMOR void videoPlayer_audio_callback(void *userdata, Uint8 *stream, int len) { // !!! FIXME: this should refuse to play if item->playms is in the future. //const Uint32 now = SDL_GetTicks() - baseticks; Sint16 *dst = (Sint16 *) stream; while (audio_queue && (len > 0)) { volatile AudioQueue *item = audio_queue; AudioQueue *next = item->next; const int channels = item->audio->channels; const Sint32 *src = (Sint32 *) (item->audio->samples + (item->offset * channels)); int cpy = (item->audio->frames - item->offset) * channels; int i; if (cpy > (len / sizeof (Sint16))) cpy = len / sizeof (Sint16); for (i = 0; i < cpy; i++) { const Sint32 val = *(src++); if (val < -32768) *(dst++) = -32768; else if (val > 32767) *(dst++) = 32767; else { *(dst++) = (Sint16) (val); } } // for item->offset += (cpy / channels); len -= cpy * sizeof (Sint16); if (item->offset >= item->audio->frames) { THEORAPLAY_freeAudio(item->audio); free((void *) item); audio_queue = next; } // if } // while if (!audio_queue) audio_queue_tail = NULL; if (len > 0) memset(dst, '\0', len); } // audio_callback #else void videoPlayer_audio_callback(void *userdata, Uint8 *stream, int len) { // !!! FIXME: this should refuse to play if item->playms is in the future. //const Uint32 now = SDL_GetTicks() - baseticks; Sint16 *dst = (Sint16 *) stream; while (audio_queue && (len > 0)) { volatile AudioQueue *item = audio_queue; AudioQueue *next = item->next; const int channels = item->audio->channels; const float *src = item->audio->samples + (item->offset * channels); int cpy = (item->audio->frames - item->offset) * channels; int i; if (cpy > (len / sizeof (Sint16))) cpy = len / sizeof (Sint16); for (i = 0; i < cpy; i++) { const float val = *(src++); if (val < -1.0f) *(dst++) = -32768; else if (val > 1.0f) *(dst++) = 32767; else *(dst++) = (Sint16) (val * 32767.0f); } // for item->offset += (cpy / channels); len -= cpy * sizeof (Sint16); if (item->offset >= item->audio->frames) { THEORAPLAY_freeAudio(item->audio); free((void *) item); audio_queue = next; } // if } // while if (!audio_queue) audio_queue_tail = NULL; if (len > 0) memset(dst, '\0', len); } // audio_callback #endif static void videoPlayer_queue_audio(const THEORAPLAY_AudioPacket *audio) { AudioQueue *item = (AudioQueue *) malloc(sizeof (AudioQueue)); if (!item) { THEORAPLAY_freeAudio(audio); return; // oh well. } // if item->audio = audio; item->offset = 0; item->next = NULL; //SDL_LockAudio(); if (audio_queue_tail) audio_queue_tail->next = item; else audio_queue = item; audio_queue_tail = item; //SDL_UnlockAudio(); } // queue_audio void rc_media_loadVideo(string fname) { //cout << "CRAP" << endl; decoder = THEORAPLAY_startDecodeFile(fname.c_str(), 30, THEORAPLAY_VIDFMT_RGBA); if(!decoder) { decoder = NULL; cout << "Failed to load video: " << fname << endl; return; } rc_video_file = fname; while (!audio || !video) { if (!audio) audio = THEORAPLAY_getAudio(decoder); if (!video) video = THEORAPLAY_getVideo(decoder); SDL_Delay(10); } // if overlay = SDL_CreateTexture(rc_win_renderer[rc_active_window], SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STREAMING, video->width, video->height); SDL_SetTextureBlendMode(overlay, SDL_BLENDMODE_BLEND); SDL_SetTextureAlphaMod(overlay, 255); framems = (video->fps == 0.0) ? 0 : ((Uint32) (1000.0 / video->fps)); rc_video_dstrect.x = 0; rc_video_dstrect.y = 0; rc_video_dstrect.w = video->width; rc_video_dstrect.h = video->height; rc_video_width = video->width; rc_video_height = video->height; if (!overlay) { fprintf(stderr, "Video failed: %s\n", SDL_GetError()); return; } //} // else initfailed = quit = (!overlay); rc_video_end = false; //fprintf(stderr, "b_debug 3.5\n"); } int rc_media_getVideoStats(string fname, double * v_len, double * v_fps, double * v_width, double * v_height) { //cout << "CRAP" << endl; if(decoder) return 0; decoder = THEORAPLAY_startDecodeFile(fname.c_str(), 30, THEORAPLAY_VIDFMT_RGBA); if(!decoder) { decoder = NULL; cout << "Failed to load video: " << fname << endl; return 0; } while(THEORAPLAY_isDecoding(decoder)) { if(!video) video = THEORAPLAY_getVideo(decoder); if(video) { rc_video_length = video->playms; rc_video_fps = video->fps; rc_video_width = video->width; rc_video_height = video->height; THEORAPLAY_freeVideo(video); video = NULL; } if(!audio) audio = THEORAPLAY_getAudio(decoder); if(audio) { THEORAPLAY_freeAudio(audio); audio = NULL; } //SDL_Delay(1); } THEORAPLAY_stopDecode(decoder); decoder = NULL; *v_len = rc_video_length; *v_fps = rc_video_fps; *v_width = rc_video_width; *v_height = rc_video_height; rc_video_length = 0; rc_video_fps = 0; rc_video_width = 0; rc_video_height = 0; return 1; } void rc_media_getVideoSize(double * w, double * h) { *w = rc_video_width; *h = rc_video_height; } void rc_media_setVideoDrawRect(int x, int y, int w, int h) { rc_video_dstrect.x = x; rc_video_dstrect.y = y; rc_video_dstrect.w = w; rc_video_dstrect.h = h; } void rc_media_getVideoDrawRect(double * x, double * y, double * w, double * h) { *x = rc_video_dstrect.x; *y = rc_video_dstrect.y; *w = rc_video_dstrect.w; *h = rc_video_dstrect.h; } int rc_media_videoLength() { return rc_video_length; } void rc_cleanResume() { //cout << "tat" << endl; //if (overlay) SDL_DestroyTexture(overlay); if (video) THEORAPLAY_freeVideo(video); if (audio) THEORAPLAY_freeAudio(audio); if (decoder) THEORAPLAY_stopDecode(decoder); //cout << "bubble wrap" << endl; //SDL_ClearQueuedAudio(0); //while(SDL_GetQueuedAudioSize(0)>0){} rc_video_isPlaying = false; video = NULL; audio = NULL; decoder = NULL; decoder = THEORAPLAY_startDecodeFile(rc_video_file.c_str(), 30, THEORAPLAY_VIDFMT_RGBA); while(!audio && !video && THEORAPLAY_isDecoding(decoder)) { audio = THEORAPLAY_getAudio(decoder); video = THEORAPLAY_getVideo(decoder); if(audio) { if(audio->playms <= rc_video_pauseTicks) { THEORAPLAY_freeAudio(audio); audio = NULL; } } if(video) { if(video->playms <= rc_video_pauseTicks) { THEORAPLAY_freeVideo(video); video = NULL; } } } //cout << "bankai" << endl; } void rc_media_playVideo(int loops) { if(rc_video_isPlaying) return; if(rc_video_reset) { //cout << "RESET" << endl; decoder = THEORAPLAY_startDecodeFile(rc_video_file.c_str(), 30, THEORAPLAY_VIDFMT_RGBA); if(!decoder) { cout << "Video Reset Error: " << SDL_GetError() << endl; } while(!audio || !video) { if(!audio) audio = THEORAPLAY_getAudio(decoder); if(!video) video = THEORAPLAY_getVideo(decoder); SDL_Delay(10); } rc_video_reset = false; } Mix_CloseAudio(); rc_video_currentLoop = 0; rc_video_loops = loops; rc_video_isPlaying = true; if(Mix_OpenAudio(audio->freq, AUDIO_S16SYS, audio->channels, 2048) < 0) { rc_audio_isOpen = false; cout << "Open Audio Error: " << Mix_GetError() <0){} SDL_Delay(1500); if(rc_audio_isOpen) { Mix_CloseAudio(); if(Mix_OpenAudio(MIX_DEFAULT_FREQUENCY, MIX_DEFAULT_FORMAT, 2, 2048) < 0) { cout << "OpenAudio Error: " << Mix_GetError() << endl; } Mix_HookMusic(NULL, NULL); rc_audio_isOpen = false; } rc_video_isPlaying = false; rc_video_loops = 0; rc_video_currentLoop = 0; rc_video_position = 0; rc_video_reset = true; rc_video_end = false; video = NULL; audio = NULL; decoder = NULL; //cout << "mini" << endl; } static bool cycleVideo() { //cout << "video_start" << endl; if(!rc_video_isPlaying) return false; //cout << "never print this" << endl; //int q = !quit; //int tp = THEORAPLAY_isDecoding(decoder); //cout << "VARS = " << q << " & " << tp << endl; int isDecode = THEORAPLAY_isDecoding(decoder); if(isDecode) rc_video_end = false; else { rc_video_currentLoop++; if((rc_video_currentLoop <= rc_video_loops) || (rc_video_loops < 0)) { rc_media_stopVideo(); rc_media_playVideo(rc_video_loops); return true; } rc_video_end = true; rc_video_isPlaying = false; } if (!quit && isDecode) { const Uint32 now = SDL_GetTicks() - baseticks; rc_video_pauseTicks = now; rc_video_position = now; if (!video) video = THEORAPLAY_getVideo(decoder); //fprintf(stderr, "b_debug A\n"); // Play video frames when it's time. if (video && (video->playms <= now)) { //fprintf(stderr, "b_debug B\n"); //printf("Play video frame (%u ms)!\n", video->playms); if ( framems && ((now - video->playms) >= framems) ) { //fprintf(stderr, "b_debug C\n"); // Skip frames to catch up, but keep track of the last one // in case we catch up to a series of dupe frames, which // means we'd have to draw that final frame and then wait for // more. const THEORAPLAY_VideoFrame *last = video; while ((video = THEORAPLAY_getVideo(decoder)) != NULL) { THEORAPLAY_freeVideo(last); last = video; if ((now - video->playms) < framems) break; } // while //fprintf(stderr, "b_debug D\n"); if (!video) video = last; } // if //fprintf(stderr, "b_debug B.1\n"); int lock_tex = SDL_LockTexture(overlay, NULL, &overlay_pixels, &pitch); //fprintf(stderr, "b_debug B.1.2\n"); if (!video) // do nothing; we're far behind and out of options. { static int warned = 0; if (!warned) { warned = 1; fprintf(stderr, "WARNING: Playback can't keep up!\n"); } // if } // if else if (lock_tex<0) { //fprintf(stderr, "b_debug E\n"); static int warned = 0; if (!warned) { warned = 1; fprintf(stderr, "Couldn't lock video frame: %s\n", SDL_GetError()); } // if } // else if else { //fprintf(stderr, "b_debug 4\n"); //SDL_Rect dstrec = { 0, 0, video->width, video->height }; const int w = video->width; const int h = video->height; Uint8 *dst; const Uint8 * vbuf = (const Uint8*)video->pixels; dst = (Uint8*)overlay_pixels; SDL_memcpy(dst, vbuf, w*h*4); //fprintf(stderr, "b_debug 7\n"); SDL_UnlockTexture(overlay); //if (SDL_DisplayYUVOverlay(overlay, &dstrect) != 0) if(SDL_RenderCopy(rc_win_renderer[rc_active_window], overlay, NULL, &rc_video_dstrect) < 0) { static int warned = 0; if (!warned) { warned = 1; fprintf(stderr, "Couldn't display video frame: %s\n", SDL_GetError()); } // if } // if else { //SDL_RenderPresent(rc_win_renderer[rc_active_window]); //cout << "window drawn" << endl; } } // else //fprintf(stderr, "b_debug B.5\n"); THEORAPLAY_freeVideo(video); video = NULL; } // if else // no new video frame? Give up some CPU. { SDL_Delay(10); } // else //fprintf(stderr, "b_debug F\n"); while ((audio = THEORAPLAY_getAudio(decoder)) != NULL) videoPlayer_queue_audio(audio); return true; } // while return false; } // playfile void rc_media_deleteVideo() { //cout << "cream soda" << endl; if (overlay) SDL_DestroyTexture(overlay); overlay = NULL; if (video) THEORAPLAY_freeVideo(video); video = NULL; if (audio) THEORAPLAY_freeAudio(audio); audio = NULL; if (decoder) THEORAPLAY_stopDecode(decoder); decoder = NULL; //cout << "bubble wrap" << endl; if(rc_audio_isOpen) { Mix_CloseAudio(); if(Mix_OpenAudio(MIX_DEFAULT_FREQUENCY, MIX_DEFAULT_FORMAT, 2, 2048) < 0) { cout << "OpenAudio Error: " << Mix_GetError() << endl; } rc_audio_isOpen = false; Mix_HookMusic(NULL, NULL); } rc_video_file = ""; rc_video_isLoaded = false; rc_video_isPlaying = false; rc_video_loops = 0; rc_video_position = 0; rc_video_length = 0; rc_video_width = 0; rc_video_height = 0; rc_video_dstrect.x = 0; rc_video_dstrect.y = 0; rc_video_dstrect.w = 0; rc_video_dstrect.h = 0; //cout << "mini" << endl; } void rc_media_pauseVideo() { //if(rc_video_isPaused) // return; rc_video_isPlaying = false; if (video) THEORAPLAY_freeVideo(video); if (audio) THEORAPLAY_freeAudio(audio); Mix_Pause(-1); SDL_Delay(1500); if(rc_audio_isOpen) { Mix_CloseAudio(); if(Mix_OpenAudio(MIX_DEFAULT_FREQUENCY, MIX_DEFAULT_FORMAT, 2, 2048) < 0) { cout << "OpenAudio Error: " << Mix_GetError() << endl; } rc_audio_isOpen = false; } video = NULL; audio = NULL; rc_video_isPaused = true; } void rc_media_resumeVideo() { if(!rc_video_isPaused) return; //fprintf(stderr, "RESUME\n" ); int dec_cycle = 0; while(!audio || !video) { if(!audio) audio = THEORAPLAY_getAudio(decoder); if(!video) video = THEORAPLAY_getVideo(decoder); SDL_Delay(10); dec_cycle++; if(dec_cycle == 100) rc_cleanResume(); if(dec_cycle >= 200) { rc_video_isPaused = false; rc_media_stopVideo(); return; } //fprintf(stderr,"working\n"); } //fprintf(stderr,"debug 1\n"); if(!rc_audio_isOpen) Mix_CloseAudio(); rc_video_isPlaying = true; //fprintf(stderr,"debug 2\n"); if(!rc_audio_isOpen) { if(Mix_OpenAudio(audio->freq, AUDIO_S16SYS, audio->channels, 2048) < 0) { cout << "Open Audio Error: " << Mix_GetError() <