From 9c03393d109ac7470e4d3808094923e2758b7360 Mon Sep 17 00:00:00 2001 From: eukos Date: Sun, 20 Sep 2015 13:23:35 +0200 Subject: [PATCH] Editor can now create blank lumps. --- video/vid_gdk.c | 204 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 173 insertions(+), 31 deletions(-) diff --git a/video/vid_gdk.c b/video/vid_gdk.c index 570b043..61fc7a0 100644 --- a/video/vid_gdk.c +++ b/video/vid_gdk.c @@ -728,6 +728,9 @@ void IN_ShowMouse (void) /* * NGUNIX EDITOR GUFF + * ================== + * Most engines don't come with an integrated toolset. + * We are not one of those guys. */ static GtkWidget *ed_window; static GdkGC *ed_pic; @@ -735,8 +738,8 @@ static qpic_t *ed_file; static GtkWidget *ed_menubar; static GdkRgbCmap *ed_cmap = NULL; -/* PALETTE SWITCHER - * =============== +/* EDITOR: PALETTE SWITCHER + * ======================== * TODO: This somehow affects the main engine despite us using our own GdkColmap... */ gint VID_EditorLoadPalette(gpointer data) @@ -748,7 +751,7 @@ gint VID_EditorLoadPalette(gpointer data) loadedfile_t *palfile; unsigned int colors[256]; - dialog = gtk_file_chooser_dialog_new ("Open File", + dialog = gtk_file_chooser_dialog_new ("NGUNIXEd - Open Palette (.lmp) File", NULL, action, ("_Cancel"), @@ -757,11 +760,21 @@ gint VID_EditorLoadPalette(gpointer data) GTK_RESPONSE_ACCEPT, NULL); + // Set the dialog and the default path (current directory) + GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog); + char path[MAX_OSPATH]; + sprintf(path, "file://%s", get_current_dir_name()); + gtk_file_chooser_set_current_folder_uri(chooser, path); + + // Add the filter for .lmp files + GtkFileFilter *filter = gtk_file_filter_new (); + gtk_file_filter_add_pattern (filter, "*.lmp"); + gtk_file_chooser_set_filter (chooser, filter); + res = gtk_dialog_run (GTK_DIALOG (dialog)); if (res == GTK_RESPONSE_ACCEPT) { char *filename; - GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog); filename = gtk_file_chooser_get_filename (chooser); palfile = COM_LoadFile (filename, 2); @@ -793,10 +806,11 @@ gint VID_EditorLoadPalette(gpointer data) return 0; } -/* COLORMAP VIEWER - * =============== +/* EDITOR: COLORMAP VIEWER + * ======================= * Colormaps differ from lump files in the way that they don't start with a width | height header - * Otherwise they are identical in how they refer to palette indexes for their color*/ + * Otherwise they are identical in how they refer to palette indexes for their color + */ gint VID_EditorViewColormap(gpointer data) { int i; @@ -805,7 +819,7 @@ gint VID_EditorViewColormap(gpointer data) gint res; loadedfile_t *pic; - dialog = gtk_file_chooser_dialog_new ("Open File", + dialog = gtk_file_chooser_dialog_new ("NGUNIXEd - Open Colormap (.lmp) File", NULL, action, ("_Cancel"), @@ -814,11 +828,21 @@ gint VID_EditorViewColormap(gpointer data) GTK_RESPONSE_ACCEPT, NULL); + // Set the dialog and the default path (current directory) + GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog); + char path[MAX_OSPATH]; + sprintf(path, "file://%s", get_current_dir_name()); + gtk_file_chooser_set_current_folder_uri(chooser, path); + + // Add the filter for .lmp files + GtkFileFilter *filter = gtk_file_filter_new (); + gtk_file_filter_add_pattern (filter, "*.lmp"); + gtk_file_chooser_set_filter (chooser, filter); + res = gtk_dialog_run (GTK_DIALOG (dialog)); if (res == GTK_RESPONSE_ACCEPT) { char *filename; - GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog); filename = gtk_file_chooser_get_filename (chooser); pic = COM_LoadFile (filename, 2); @@ -844,6 +868,11 @@ gint VID_EditorViewColormap(gpointer data) return 0; } +/* EDITOR: GENERATE COLORMAP + * =============== + * Generate a colormap for the current palette... + * makes use of our builtin function for generating them + */ gint VID_EditorGenerateColormap(gpointer data) { GtkWidget *dialog; @@ -852,7 +881,7 @@ gint VID_EditorGenerateColormap(gpointer data) gint res; byte *pic; - dialog = gtk_file_chooser_dialog_new ("Save File", + dialog = gtk_file_chooser_dialog_new ("NGUNIXEd - Save Generated Colormap (.lmp) File", NULL, action, ("_Cancel"), @@ -863,12 +892,15 @@ gint VID_EditorGenerateColormap(gpointer data) chooser = GTK_FILE_CHOOSER (dialog); gtk_file_chooser_set_do_overwrite_confirmation (chooser, TRUE); - //if (user_edited_a_new_document) - gtk_file_chooser_set_current_name (chooser, - ("colormap.lmp")); - //else - // gtk_file_chooser_set_filename (chooser, - // existing_filename); + // Set the default path (current directory) + char path[MAX_OSPATH]; + sprintf(path, "file://%s", get_current_dir_name()); + gtk_file_chooser_set_current_folder_uri(chooser, path); + + // Add the filter for .lmp files + GtkFileFilter *filter = gtk_file_filter_new (); + gtk_file_filter_add_pattern (filter, "*.lmp"); + gtk_file_chooser_set_filter (chooser, filter); res = gtk_dialog_run (GTK_DIALOG (dialog)); if (res == GTK_RESPONSE_ACCEPT) @@ -885,6 +917,11 @@ gint VID_EditorGenerateColormap(gpointer data) return 0; } +/* EDITOR: SAVE LUMP + * ================= + * Saves the pic currently displayed as a lump... + * This means that you can save special files, such as colormaps as regular piclumps, too! + */ gint VID_EditorSaveFile(gpointer data) { GtkWidget *dialog; @@ -896,7 +933,7 @@ gint VID_EditorSaveFile(gpointer data) if(!ed_file) return; - dialog = gtk_file_chooser_dialog_new ("Save File", + dialog = gtk_file_chooser_dialog_new ("NGUNIXEd - Save LUMP (.lmp) File", NULL, action, ("_Cancel"), @@ -907,6 +944,16 @@ gint VID_EditorSaveFile(gpointer data) chooser = GTK_FILE_CHOOSER (dialog); gtk_file_chooser_set_do_overwrite_confirmation (chooser, TRUE); + // Set the default path (current directory) + char path[MAX_OSPATH]; + sprintf(path, "file://%s", get_current_dir_name()); + gtk_file_chooser_set_current_folder_uri(chooser, path); + + // Add the filter for .lmp files + GtkFileFilter *filter = gtk_file_filter_new (); + gtk_file_filter_add_pattern (filter, "*.lmp"); + gtk_file_chooser_set_filter (chooser, filter); + //if (user_edited_a_new_document) gtk_file_chooser_set_current_name (chooser, ("untitled.lmp")); @@ -914,26 +961,24 @@ gint VID_EditorSaveFile(gpointer data) // gtk_file_chooser_set_filename (chooser, // existing_filename); + res = gtk_dialog_run (GTK_DIALOG (dialog)); if (res == GTK_RESPONSE_ACCEPT) { char *filename; filename = gtk_file_chooser_get_filename (chooser); - //save_to_file (filename); - pic = malloc(2 + (ed_file->width * ed_file->height)); - printf("Saving IMAGE: %i, %i\n", ed_file->width, ed_file->height); - - //memcpy(pic, &ed_file->width, sizeof(ed_file->width)); - //memcpy(pic + sizeof(ed_file->width), &ed_file->height, sizeof(ed_file->height)); - //memcpy(pic + (sizeof(ed_file->width) + sizeof(ed_file->height)), &ed_file->data, sizeof(ed_file->data)); + pic = malloc((sizeof(int)*2) + (ed_file->width * ed_file->height)); pic[0] = ed_file->width; pic[1] = ed_file->height; + memcpy(pic, &ed_file->width, sizeof(int)); + memcpy(pic + sizeof(int), &ed_file->height, sizeof(int)); + int i; for(i = 0; i < ed_file->width * ed_file->height; i++) - pic[i+2] = ed_file->data[i]; + pic[i+(sizeof(int) * 2)] = ed_file->data[i]; #if 0 printf("Saving IMAGE: %i, %i\n", pic[0], pic[1]); @@ -950,6 +995,11 @@ gint VID_EditorSaveFile(gpointer data) return 0; } +/* EDITOR: LOAD LUMP + * ================= + * Loads a lump into the editor as a pic... + * There is nothing more to it, really + */ gint VID_EditorLoadFile(gpointer data) { GtkWidget *dialog; @@ -957,7 +1007,7 @@ gint VID_EditorLoadFile(gpointer data) gint res; loadedfile_t *pic; - dialog = gtk_file_chooser_dialog_new ("Open File", + dialog = gtk_file_chooser_dialog_new ("NGUNIXEd - Open LUMP (.lmp) File", NULL, action, ("_Cancel"), @@ -966,13 +1016,22 @@ gint VID_EditorLoadFile(gpointer data) GTK_RESPONSE_ACCEPT, NULL); + // Set the dialog and the default path (current directory) + GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog); + char path[MAX_OSPATH]; + sprintf(path, "file://%s", get_current_dir_name()); + gtk_file_chooser_set_current_folder_uri(chooser, path); + + // Add the filter for .lmp files + GtkFileFilter *filter = gtk_file_filter_new (); + gtk_file_filter_add_pattern (filter, "*.lmp"); + gtk_file_chooser_set_filter (chooser, filter); + res = gtk_dialog_run (GTK_DIALOG (dialog)); if (res == GTK_RESPONSE_ACCEPT) { char *filename; - GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog); - filename = gtk_file_chooser_get_filename (chooser); - + filename = gtk_file_chooser_get_filename (chooser); pic = COM_LoadFile (filename, 2); if(pic) @@ -986,20 +1045,93 @@ gint VID_EditorLoadFile(gpointer data) #endif gtk_window_resize(ed_window, ed_file->width, ed_file->height + ed_menubar->allocation.height); g_free (filename); - //g_free(pic); } gtk_widget_destroy (dialog); return 0; } +/* EDITOR: CREATE LUMP + * =================== + * Creates a lump based on width*height chosen by the user + * The default pixel color is 255 - which is transparent in-engine + */ +GtkWidget *ed_newwindow; +GtkWidget *ed_widthbox; +GtkWidget *ed_heightbox; +int ed_twi, ed_twh; +gint VID_EditorCreatePic(gpointer data) +{ + int i; + int mem; + + if(ed_file) + free(ed_file); + + mem = (size_t)((sizeof(int) * 2) + (gtk_spin_button_get_value_as_int (ed_widthbox) * gtk_spin_button_get_value_as_int (ed_heightbox))); + //mem = 262152; + printf("[EDITOR] Trying to allocate %i memory...\n", mem); + ed_file = malloc((size_t)mem); + ed_file->width = gtk_spin_button_get_value_as_int (ed_widthbox); + ed_file->height = gtk_spin_button_get_value_as_int (ed_heightbox); + + for(i=0; i < (ed_file->width * ed_file->height); i++) + ed_file->data[i] = 255; + + gtk_window_resize(ed_window, ed_file->width, ed_file->height + ed_menubar->allocation.height); + gtk_widget_destroy(ed_newwindow); +} +gint VID_EditorNewFile(gpointer data) +{ + GtkWidget *table; + GtkWidget *label1; + GtkWidget *label2; + + ed_newwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_position(GTK_WINDOW(ed_newwindow), GTK_WIN_POS_CENTER); + gtk_window_set_title(GTK_WINDOW(ed_newwindow), "NGUNIXEd - New 2D LUMP File"); + gtk_container_set_border_width(GTK_CONTAINER(ed_newwindow), 10); + + table = gtk_table_new(3, 2, FALSE); + gtk_container_add(GTK_CONTAINER(ed_newwindow), table); + + label1 = gtk_label_new("Width"); + label2 = gtk_label_new("Height"); + gtk_table_attach(GTK_TABLE(table), label1, 0, 1, 0, 1, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 5, 5); + gtk_table_attach(GTK_TABLE(table), label2, 0, 1, 1, 2, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 5, 5); + + ed_widthbox = gtk_spin_button_new_with_range (1, 512, 1); + ed_heightbox = gtk_spin_button_new_with_range (1, 512, 1); + gtk_table_attach(GTK_TABLE(table), ed_widthbox, 1, 2, 0, 1, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 5, 5); + gtk_table_attach(GTK_TABLE(table), ed_heightbox, 1, 2, 1, 2, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 5, 5); + + GtkWidget *btnok = gtk_button_new_with_label("Create"); + gtk_table_attach(GTK_TABLE(table), btnok, 1, 2, 2, 3, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 5, 5); + + gtk_widget_show_all(ed_newwindow); + + g_signal_connect(ed_newwindow, "destroy", G_CALLBACK(gtk_widget_destroy), NULL); + g_signal_connect(btnok, "clicked", G_CALLBACK(VID_EditorCreatePic), G_OBJECT(ed_newwindow)); +} + +/* EDITOR: QUIT + * ============ + * Kills the editor, unloads any pics, etc. + */ void VID_EditorQuit(void) { + if(ed_file) + free(ed_file); + gtk_widget_destroy(ed_window); vid_ineditor = false; gtk_main_quit(); } +/* EDITOR: UPDATE + * ============== + * Called every once in a while to update the picture inside the window... + */ gint VID_EditorUpdate(gpointer data) { if(ed_file) @@ -1007,6 +1139,15 @@ gint VID_EditorUpdate(gpointer data) return 1; } + +/* EDITOR: MAIN FUNCTION + * ===================== + * This is the first function called when calling the editor. + * Here we get functions to Create, Load and Save LUMPS, as well as + * play with palettes and generate colormaps. + * + * TODO: Import/Export of PCX files + */ void VID_LaunchEditor(void) { GtkWidget *vbox; @@ -1018,7 +1159,7 @@ void VID_LaunchEditor(void) ed_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_position(GTK_WINDOW(ed_window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(ed_window), 300, 200); - gtk_window_set_title(GTK_WINDOW(ed_window), "NGUNIX - 2D Lump Editor"); + gtk_window_set_title(GTK_WINDOW(ed_window), "NGUNIXEd - 2D Lump Editor"); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(ed_window), vbox); @@ -1054,6 +1195,7 @@ void VID_LaunchEditor(void) gtk_box_pack_start(GTK_BOX(vbox), ed_menubar, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(ed_window), "destroy", G_CALLBACK(VID_EditorQuit), NULL); + g_signal_connect(G_OBJECT(newMi), "activate", G_CALLBACK(VID_EditorNewFile), NULL); g_signal_connect(G_OBJECT(loadMi), "activate", G_CALLBACK(VID_EditorLoadFile), NULL); g_signal_connect(G_OBJECT(saveMi), "activate", G_CALLBACK(VID_EditorSaveFile), NULL); g_signal_connect(G_OBJECT(quitMi), "activate", G_CALLBACK(VID_EditorQuit), NULL);