Editor can now create blank lumps.

This commit is contained in:
eukos 2015-09-20 13:23:35 +02:00
parent 18c7f1ed7c
commit 9c03393d10

View file

@ -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);