#define _GNU_SOURCE #include "selection_menu.h" #include "global.h" #include "result_menu.h" #include "../utils/Application/ApplicationUtils.h" #include "../utils/EZ_UI/EZ_manager.h" #include "../utils/Rendering/RenderingUtils.h" #include "../utils/EZ_UI/elements/EZ_image.h" #include "../utils/EZ_UI/elements/EZ_button.h" #include "../utils/EZ_UI/elements/EZ_text.h" #include "../utils/EZ_UI/elements/EZ_list.h" #include "../utils/EZ_UI/elements/EZ_select_zone.h" #include "../utils/Application/ApplicationUtils.h" #include "../utils/Image/ImageUtils.h" #include "../utils/AI/neural_utils.h" #include #include #include #include #include #include #include "EZ_drag_select.h" EZ_DRAWABLE* selection_menu_drawables[17]; EZ_INTERACTIBLE* selection_menu_interactibles[8]; size_t selection_menu_objects_len = 17; void* selection_menu_objects[17]; int auto_split_grid; int auto_split_words; size_t grid_index; pixel_cluster** cluster_splitting; size_t linkage_length; size_t* array_length; pixel_cluster* manual_grid; size_t manual_grid_len; int grid_x, grid_y; char** grid; pixel_cluster** manual_words; size_t words_nb = 0; size_t* word_len; char** words; int loaded_list = 0; EZ_select_zone** words_select_zones; EZ_MENU selection_menu; void unload_selection_menu(void) { for (size_t i = 0; i < selection_menu_objects_len; i++) { free(selection_menu_objects[i]); } if (!loaded_list) return; EZ_list_clear((EZ_list*)selection_menu_objects[14]); for (size_t i = 0; i < words_nb; i++) { free(words_select_zones[i]); } words_nb = 0; loaded_list = 0; } void selection_menu_process_events(SDL_Window* window, SDL_Renderer* renderer, SDL_Event* event, EZ_MENU* current_menu) //exectuted each frame with all avaliable events { for (size_t i = 0; i < current_menu->interactible_elements_len; i++) { EZ_INTERACTIBLE* inter = current_menu->interactible_elements[i]; if (inter->enable) inter->process_interaction(window, renderer, event, inter, inter->process_data); } } void home_button_action1(EZ_button* tmp) { (void)tmp; EZ_list_clear((EZ_list*)selection_menu_objects[14]); if (loaded_list) { for (size_t i = 0; i < words_nb; i++) //free words select zones { free(words_select_zones[i]); } loaded_list = 0; } auto_split_words = -1; EZ_select_menu(0); } void clear_button_action(EZ_button* tmp) { (void)tmp; EZ_list_clear((EZ_list*)selection_menu_objects[14]); if (!loaded_list) return; for (size_t i = 0; i < words_nb; i++) { free(words_select_zones[i]); } auto_split_words = -1; loaded_list = 0; } SDL_Rect from_surface_to_image_rect(anchore_point image, SDL_Surface* surface, SDL_Rect surface_rect) { SDL_Rect image_rect = anchore_to_rect(main_window, image); double xp = (double)surface_rect.x / (double)surface->w; double yp = (double)surface_rect.y / (double)surface->h; double wp = (double)surface_rect.w / (double)surface->w; double hp = (double)surface_rect.h / (double)surface->h; int x = round((double)xp * (double)image_rect.w); int y = round((double)yp * (double)image_rect.h); int w = round((double)wp * (double)image_rect.w); int h = round((double)hp * (double)image_rect.h); return (SDL_Rect) { image_rect.x + x, image_rect.y + y, w, h }; } SDL_Rect from_image_rect_to_surface(anchore_point image, SDL_Rect selection, SDL_Surface* surface) { SDL_Rect image_rect = anchore_to_rect(main_window, image); SDL_Rect select_rect = { selection.x - image_rect.x, selection.y - image_rect.y, selection.w, selection.h }; double xp = (double)select_rect.x / (double)image_rect.w; double yp = (double)select_rect.y / (double)image_rect.h; double wp = (double)select_rect.w / (double)image_rect.w; double hp = (double)select_rect.h / (double)image_rect.h; int x = round((double)xp * (double)surface->w); int y = round((double)yp * (double)surface->h); int w = round((double)wp * (double)surface->w); int h = round((double)hp * (double)surface->h); return (SDL_Rect) { x, y, w, h }; } void grid_selection_end(EZ_drag_select* tmp) { (void)tmp; auto_split_grid = 0; EZ_drag_select* Drag=((EZ_drag_select*)selection_menu_objects[10]); Drag->interactible_select.enable=0; size_t link_len; size_t* arr_len; SDL_Rect search_rect = from_image_rect_to_surface(selection_menu.drawable_elements[0]->dst_anchore, to_positive_rect(Drag->selected_zone), loaded_image); pixel_cluster** tmp_clusters = get_main_linkages(loaded_image, search_rect, &link_len, &arr_len); size_t res = get_grid_cluster(link_len,arr_len); manual_grid = tmp_clusters[res]; manual_grid_len = arr_len[res]; for (size_t i = 0; i < link_len; i++) { if (i == res) continue; free(tmp_clusters[i]); } free(arr_len); free(tmp_clusters); SDL_Rect GridRect = get_grid_rect(manual_grid, manual_grid_len); selection_menu.drawable_elements[10]->dst_anchore = rect_to_anchore(from_surface_to_image_rect(selection_menu.drawable_elements[0]->dst_anchore, loaded_image, GridRect)); selection_menu.drawable_elements[10]->visible = 1; ((EZ_image*)selection_menu_objects[11])->drawable_image.dst_anchore= Drag->drawable_drag.dst_anchore; ((EZ_image*)selection_menu_objects[10])->drawable_image.visible=1; } void word_selection_end(EZ_drag_select* tmp) { (void)tmp; EZ_drag_select* Drag=((EZ_drag_select*)selection_menu_objects[12]); Drag->interactible_select.enable=0; size_t link_len; size_t* arr_len; SDL_Rect search_rect = from_image_rect_to_surface(selection_menu.drawable_elements[0]->dst_anchore, to_positive_rect(Drag->selected_zone), loaded_image); pixel_cluster** tmp_clusters = get_main_linkages(loaded_image, search_rect, &link_len, &arr_len); size_t prev_len; if (auto_split_words == 0) { prev_len = words_nb; words_nb += link_len; manual_words = realloc(manual_words, words_nb * sizeof(pixel_cluster*)); memcpy(manual_words + prev_len, tmp_clusters, link_len); word_len = realloc(word_len, words_nb * sizeof(pixel_cluster*)); memcpy(word_len + prev_len, arr_len, link_len); words_select_zones = realloc(words_select_zones, words_nb * sizeof(EZ_image*)); } else { prev_len = 0; words_nb = link_len; manual_words = tmp_clusters; word_len = arr_len; words_select_zones = calloc(link_len, sizeof(EZ_image*)); } for (size_t w = 0; w < link_len; w++) { SDL_Rect WordRect = get_grid_rect(tmp_clusters[w], arr_len[w]); words_select_zones[w + prev_len] = EZ_create_select_zone(rect_to_anchore(from_surface_to_image_rect(selection_menu.drawable_elements[0]->dst_anchore, loaded_image, WordRect)), (SDL_Color){255, 255, 0, 255}); words_select_zones[w + prev_len]->drawable_select_zone.visible = 1; EZ_list_element* element = malloc(sizeof(EZ_list_element)); element->drawable_element = &words_select_zones[w + prev_len]->drawable_select_zone; element->interactible_element = NULL; EZ_list_add_element((EZ_list*)selection_menu_objects[14], element); } if (auto_split_words == 0) { free(arr_len); free(tmp_clusters); } loaded_list = 1; auto_split_words = 0; } void button_action_Grid(EZ_button* tmp) { (void)tmp; ((EZ_image*)selection_menu_objects[11])->drawable_image.visible=0; ((EZ_drag_select*)selection_menu_objects[10])->interactible_select.enable=1; } void button_action_Word(EZ_button* tmp) { (void)tmp; ((EZ_image*)selection_menu_objects[13])->drawable_image.visible=0; ((EZ_drag_select*)selection_menu_objects[12])->interactible_select.enable=1; } void button_action_switch_result(EZ_button* tmp) { (void)tmp; size_t i = 0; size_t last_slash; while (loaded_image_path[i] != '\0') { if (loaded_image_path[i] == '/') last_slash = i; i++; } char* spliting_path = combine_path(application_directory, "splitting"); if (auto_split_grid && auto_split_words > 0) export_main_linkages(loaded_image, cluster_splitting, linkage_length, array_length, spliting_path, &grid_x, &grid_y); //Save letter's images else { if (auto_split_grid) { export_main_grid_cluster(loaded_image, cluster_splitting[grid_index], array_length[grid_index], spliting_path, &grid_x, &grid_y); } else { export_main_grid_cluster(loaded_image, manual_grid, manual_grid_len, spliting_path, &grid_x, &grid_y); } if (auto_split_words) { char* words_path = export_prepare_words_dir(spliting_path); for (size_t i = 0; i < words_nb; i++) { if (i == grid_index) continue; export_word_cluster(loaded_image, cluster_splitting[i], array_length[i], (i > grid_index ? i-1 : i), words_path); } }else { export_main_words_cluster(loaded_image, manual_words, words_nb, word_len, spliting_path); } } grid = calloc(grid_x, sizeof(char*)); char* image_path = calloc(last_slash + 2, sizeof(char)); memcpy(image_path, loaded_image_path, last_slash+1); image_path[last_slash + 2] = '\0'; size_t name_len = strlen(loaded_image_path) - last_slash; char* file_name = calloc(name_len + 1, sizeof(char)); memcpy(file_name, loaded_image_path + last_slash + 1, name_len); file_name[name_len] = '\0'; char* new_path; asprintf(&new_path, "%sexamples/gridImages/%s", image_path, file_name); char* path; asprintf(&path, "%snetwork.csv", application_directory); //neural_network network; //load_neural_network(&network, read_file(path)); //Load neural network char* grid_path; asprintf(&grid_path, "%s/grid", spliting_path); //get grid directory path for (int x = 0; x < grid_x; x++) { grid[x] = calloc(grid_y, sizeof(char)); for (int y = 0; y < grid_y; y++) { /*char* file; asprintf(&file, "%s/grid_%i_%i.png", grid_path, x, y); //get image path for each letter in grid size_t len; double* image = image_to_bool_array(file, &len);*/ //network_set_input_double(&network, image); //process_network(&network); //process network to get the character //grid[x][y] = get_network_char_prediction(&network, network.nb_input / 26); //save character in the array } } words_nb = linkage_length - 1; word_len = calloc(words_nb, sizeof(size_t)); words = calloc(words_nb, sizeof(char*)); char* words_path; asprintf(&words_path, "%s/words", spliting_path); //get words directory path for (size_t x = 0; x < words_nb + 1; x++) //for each words { if (x == grid_index) continue; size_t wi = x > grid_index ? x-1 : x; word_len[wi] = array_length[x]; words[wi] = calloc(word_len[wi], sizeof(char)); for (size_t i = 0; i < word_len[wi]; i++) //for each letter in the word { /*char* file; asprintf(&file, "%s/word_%li_letter_%li.png", words_path, wi, i); //get letter's path size_t len; double* image = image_to_bool_array(file, &len);*/ //network_set_input_double(&network, image); //process_network(&network); //process network to get the character //words[wi][i] = get_network_char_prediction(&network, network.nb_input / 26); //save character in the array } } EZ_list_clear((EZ_list*)selection_menu_objects[14]); if (loaded_list) { for (size_t i = 0; i < words_nb; i++) //free words select zones { free(words_select_zones[i]); } loaded_list = 0; words_nb = 0; } auto_split_words = -1; EZ_select_menu(2); result_menu_enter(); } void selection_menu_enter(void) { EZ_drag_select* drag_grid=((EZ_drag_select*)selection_menu_objects[10]); EZ_drag_select* drag_word=((EZ_drag_select*)selection_menu_objects[12]); EZ_image* img = (EZ_image*)selection_menu_objects[0]; EZ_edit_image(img, loaded_image, main_renderer, 1); drag_grid->drag_anchore = img->drawable_image.dst_anchore; drag_grid->interactible_select.anchore = img->drawable_image.dst_anchore; drag_word->drag_anchore = img->drawable_image.dst_anchore; drag_word->interactible_select.anchore = img->drawable_image.dst_anchore; auto_split_grid = 1; auto_split_words = 1; cluster_splitting= get_main_linkages(loaded_image, get_surface_full_rect(loaded_image), &linkage_length, &array_length); grid_index = get_grid_cluster(linkage_length,array_length); words_nb = linkage_length - 1; SDL_Rect GridRect = get_grid_rect(cluster_splitting[grid_index], array_length[grid_index]); selection_menu.drawable_elements[10]->dst_anchore = rect_to_anchore(from_surface_to_image_rect(selection_menu.drawable_elements[0]->dst_anchore, loaded_image, GridRect)); selection_menu.drawable_elements[10]->visible = 1; words_select_zones = calloc(words_nb, sizeof(EZ_image*)); for (size_t w = 0; w < linkage_length; w++) { if (w == grid_index) continue; size_t wi = w > grid_index ? w-1 : w; SDL_Rect WordRect = get_grid_rect(cluster_splitting[w], array_length[w]); //words_select_zones[wi] = EZ_create_image_file(combine_path(application_directory, "resources/SelectImageBlue.png"), main_renderer, rect_to_anchore(from_surface_to_image_rect(selection_menu.drawable_elements[0]->dst_anchore, loaded_image, WordRect)), 0); words_select_zones[wi] = EZ_create_select_zone(rect_to_anchore(from_surface_to_image_rect(selection_menu.drawable_elements[0]->dst_anchore, loaded_image, WordRect)), (SDL_Color){255, 255, 0, 255}); words_select_zones[wi]->drawable_select_zone.visible = 1; EZ_list_element* element = malloc(sizeof(EZ_list_element)); element->drawable_element = &words_select_zones[wi]->drawable_select_zone; element->interactible_element = NULL; EZ_list_add_element((EZ_list*)selection_menu_objects[14], element); } loaded_list = 1; } void load_selection_menu(SDL_Renderer* renderer) { selection_menu.drawable_elements = selection_menu_drawables; selection_menu.drawable_elements_len = 17; selection_menu.interactible_elements = selection_menu_interactibles; selection_menu.interactible_elements_len = 8; SDL_Color back_col = {255, 255, 255, 255}; selection_menu.background_color = back_col; selection_menu.process_event = &selection_menu_process_events; selection_menu.unload_menu = &unload_selection_menu; //Image anchore_point main_img_anchore = { 0.2, 0.8, 0.2, 0.8, 0, 0, 0, 0, 0.0 }; EZ_image* main_img = EZ_create_image_file(combine_path(application_directory, "resources/Upload.png"), renderer, main_img_anchore,1 ); selection_menu.drawable_elements[0] = &main_img->drawable_image; selection_menu_objects[0] = (void*)main_img; // Grid EZ_drag_select* main_grid =EZ_create_drag_select(combine_path(application_directory, "resources/SelectImageBlue.png"),renderer, main_img_anchore); main_grid->interactible_select.enable=0; selection_menu.drawable_elements[10]= &main_grid->drawable_drag; selection_menu.interactible_elements[4]= &main_grid->interactible_select; selection_menu_objects[10]= (void*) main_grid; main_grid->on_end_selecting= &grid_selection_end; // word EZ_drag_select* word_grid =EZ_create_drag_select(combine_path(application_directory, "resources/SelectImageYellow.png"),renderer, main_img_anchore); word_grid->interactible_select.enable=0; selection_menu.drawable_elements[12]= &word_grid->drawable_drag; selection_menu.interactible_elements[5]= &word_grid->interactible_select; selection_menu_objects[12]= (void*) word_grid; word_grid->on_end_selecting= &word_selection_end; anchore_point grid_selection_anchore = { 0, 0, 0, 0, 0, 0, 0, 0, 0.0 }; EZ_image* grid_select_image= EZ_create_image_file(combine_path(application_directory, "resources/SelectImageBlue.png"), renderer, grid_selection_anchore, 0); selection_menu.drawable_elements[11] = &grid_select_image->drawable_image; selection_menu_objects[11]= (void*) grid_select_image; anchore_point word_selection_anchore = { 0, 0, 0, 0, 0, 0, 0, 0, 0.0 }; EZ_image* word_select_image= EZ_create_image_file(combine_path(application_directory, "resources/SelectImageYellow.png"), renderer, word_selection_anchore, 0); selection_menu.drawable_elements[13] = &word_select_image->drawable_image; selection_menu_objects[13]= (void*) word_select_image; //Button anchore_point solve_butt_anchore = { 0.4, 0.6, 0.9, 1, 0, 0, 0, 0, 0.0 }; EZ_button* main_butt = EZ_create_button(combine_path(application_directory, "resources/button.png"), renderer, solve_butt_anchore); main_butt->on_button_up = &button_action_switch_result; selection_menu.drawable_elements[1] = &main_butt->drawable_button; selection_menu.interactible_elements[0] = &main_butt->interactible_button; selection_menu_objects[1] = (void*)main_butt; anchore_point Grid_anchore = { 0.05, 0.25, 0.3, 0.4, 0, 0, 0, 0, 0.0 }; EZ_button* Grid = EZ_create_button(combine_path(application_directory, "resources/button.png"), renderer, Grid_anchore); Grid->on_button_up = &button_action_Grid; selection_menu.drawable_elements[2] = &Grid->drawable_button; selection_menu.interactible_elements[1] = &Grid->interactible_button; selection_menu_objects[2] = (void*)Grid; anchore_point Word_anchore = { 0.05, 0.25, 0.4, 0.5, 0, 0, 0, 0, 0.0 }; EZ_button* Word = EZ_create_button(combine_path(application_directory, "resources/button.png"), renderer, Word_anchore); Word->on_button_up = &button_action_Word; selection_menu.drawable_elements[3] = &Word->drawable_button; selection_menu.interactible_elements[2] = &Word->interactible_button; selection_menu_objects[3] = (void*)Word; anchore_point home_butt_anchore = { 0, 0.2, 0, 0.1, 0, 0, 0, 0, 0.0 }; EZ_button* home_butt = EZ_create_button(combine_path(application_directory, "resources/button.png"), renderer, home_butt_anchore); home_butt->on_button_up = &home_button_action1; selection_menu.drawable_elements[8] = &home_butt->drawable_button; selection_menu.interactible_elements[3] = &home_butt->interactible_button; selection_menu_objects[8] = (void*)home_butt; anchore_point clear_butt_anchore = { 0.05, 0.25, 0.5, 0.6, 0, 0, 0, 0, 0.0 }; EZ_button* clear_butt = EZ_create_button(combine_path(application_directory, "resources/button.png"), renderer, clear_butt_anchore); clear_butt->on_button_up = &clear_button_action; selection_menu.drawable_elements[15] = &clear_butt->drawable_button; selection_menu.interactible_elements[7] = &clear_butt->interactible_button; selection_menu_objects[15] = (void*)clear_butt; //Text anchore_point main_text_anchore = { 0.4, 0.6, 0.9, 1, 0, 0, 0, 0, 0.0 }; SDL_Color color = {255, 255, 255, 255}; SDL_Color color1 = {0,0,0,0}; EZ_text* main_text = EZ_create_text("Solve", main_font, color, renderer, main_text_anchore, 1); selection_menu.drawable_elements[4] = &main_text->drawable_text; selection_menu_objects[4] = (void*)main_text; anchore_point NAME_anchore= { 0.4, 0.6, 0.0, 0.1, 0, 0, 0, 0, 0.0 }; EZ_text* Name= EZ_create_text("Select elements", main_font, color1, renderer, NAME_anchore, 1); selection_menu.drawable_elements[5]= &Name->drawable_text; selection_menu_objects[5]= (void*)Name; anchore_point Select_Grid_anchore= { 0.1, 0.2, 0.3, 0.4, 0, 0, 0, 0, 0.0 }; SDL_Color grid_color = { 61, 161, 255, 255 }; EZ_text* Select_Grid= EZ_create_text("Select Grid", main_font, grid_color, renderer, Select_Grid_anchore, 1); selection_menu.drawable_elements[6]= &Select_Grid->drawable_text; selection_menu_objects[6]= (void*)Select_Grid; anchore_point Select_Word_anchore= { 0.1, 0.2, 0.4, 0.5, 0, 0, 0, 0, 0.0 }; SDL_Color word_color = { 255, 255, 107, 255 }; EZ_text* Select_Word= EZ_create_text("Select Word", main_font, word_color, renderer, Select_Word_anchore, 1); selection_menu.drawable_elements[7]= &Select_Word->drawable_text; selection_menu_objects[7]= (void*)Select_Word; anchore_point home_text_anchore = { 0.05, 0.15, 0, 0.1, 0, 0, 0, 0, 0.0 }; EZ_text* home_text = EZ_create_text("Home", main_font, color, renderer, home_text_anchore, 1); selection_menu.drawable_elements[9] = &home_text->drawable_text; selection_menu_objects[9] = (void*)home_text; anchore_point Word_List_Anchore= { 0.05, 0.25, 0.55, 0.7, 0, 0, 0, 0, 0.0 }; EZ_list* word_list = EZ_create_list(Word_List_Anchore); selection_menu.drawable_elements[14] = &word_list->drawable_list; selection_menu.interactible_elements[6] = &word_list->interactible_list; selection_menu_objects[14] = (void*)word_list; anchore_point Clear_Word_anchore= { 0.1, 0.2, 0.5, 0.6, 0, 0, 0, 0, 0.0 }; SDL_Color clear_color = { 255, 107, 107, 255 }; EZ_text* Clear_Word= EZ_create_text("Clear Words", main_font, clear_color, renderer, Clear_Word_anchore, 1); selection_menu.drawable_elements[16]= &Clear_Word->drawable_text; selection_menu_objects[16]= (void*)Clear_Word; }