Various Gimpressionist Cleanups. Made most remaining non-static global

variables static, and created functions that manipulate them. Created
new headers. Renamed some variables and functions to make their names
more menanigful.
This commit is contained in:
Shlomi Fish
2004-07-08 15:55:14 +00:00
parent 1746c311e7
commit cfefd51586
23 changed files with 1475 additions and 105 deletions

View File

@ -37,6 +37,7 @@ gimpressionist_sources = \
gimpressionist.c \
gimpressionist.h \
globals.c \
infile.h \
orientation.c \
orientmap.c \
paper.c \
@ -49,7 +50,9 @@ gimpressionist_sources = \
presets.h \
preview.c \
preview.h \
random.h \
repaint.c \
size.h \
size.c \
sizemap.c \
utils.c

View File

@ -36,6 +36,10 @@ static GtkObject *brushgammaadjust = NULL;
static gchar *last_selected_brush = NULL;
static gint brushfile = 2;
static ppm_t brushppm = {0, 0, NULL};
void brush_restore(void)
{
reselect (brushlist, pcvals.selectedbrush);
@ -54,6 +58,14 @@ void brush_free(void)
g_free (last_selected_brush);
}
void brush_get_selected (ppm_t *p)
{
if(brushfile)
reloadbrush(pcvals.selectedbrush, p);
else
copyppm(&brushppm, p);
}
static void updatebrushprev (const char *fn);
static gboolean file_is_color (const char *fn)
@ -95,8 +107,7 @@ brushdmenuselect (GtkWidget *widget,
#if 0
unselectall(brushlist);
#endif
if (GTK_IS_WIDGET (presetsavebutton))
gtk_widget_set_sensitive (GTK_WIDGET (presetsavebutton), FALSE);
preset_save_button_set_sensitive (FALSE);
}
gtk_adjustment_set_value (GTK_ADJUSTMENT (brushgammaadjust), 1.0);
@ -404,7 +415,7 @@ static void
selectbrushfile (GtkTreeSelection *selection, gpointer data)
{
brushfile = 1;
gtk_widget_set_sensitive (presetsavebutton, TRUE);
preset_save_button_set_sensitive (TRUE);
selectbrush (selection, NULL);
}

View File

@ -1,8 +1,12 @@
#ifndef __BRUSH_H
#define __BRUSH_H
#include "ppmtool.h"
void brush_store(void);
void brush_restore(void);
void brush_free(void);
void create_brushpage(GtkNotebook *);
void brush_get_selected (ppm_t *p);
#endif /* #ifndef __BRUSH_H */

View File

@ -14,12 +14,13 @@
#define NUMCOLORRADIO 2
static GtkWidget *colorradio[NUMCOLORRADIO];
static GtkObject *colornoiseadjust = NULL;
void color_type_restore(void)
void color_restore(void)
{
gtk_toggle_button_set_active
(GTK_TOGGLE_BUTTON(colorradio[pcvals.colortype]), TRUE);
gtk_adjustment_set_value(GTK_ADJUSTMENT(colornoiseadjust), pcvals.colornoise);
}
void create_colorpage(GtkNotebook *notebook)
@ -55,8 +56,6 @@ void create_colorpage(GtkNotebook *notebook)
gtk_box_pack_start(GTK_BOX (vbox), frame, FALSE, FALSE, 0);
gtk_widget_show(frame);
color_type_restore();
table = gtk_table_new (1, 3, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (table), 6);
gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
@ -74,5 +73,7 @@ void create_colorpage(GtkNotebook *notebook)
G_CALLBACK (gimp_double_adjustment_update),
&pcvals.colornoise);
color_restore();
gtk_notebook_append_page_menu (notebook, vbox, label, NULL);
}

View File

@ -7,7 +7,7 @@ enum COLOR_TYPE_ENUM
COLOR_TYPE_CENTER = 1,
};
void color_type_restore(void);
void color_restore(void);
#endif /* #ifndef __COLOR_H */

View File

@ -25,6 +25,7 @@ static GtkWidget *generalcolbutton;
static GtkObject *generalshadowadjust = NULL;
static GtkObject *generalshadowdepth = NULL;
static GtkObject *generalshadowblur = NULL;
static GtkObject *devthreshadjust = NULL;
static int normalize_bg(int n)
{
@ -38,33 +39,42 @@ static void general_bg_store(GtkWidget *wg, void *d)
void general_store(void)
{
pcvals.generalpaintedges = GTK_TOGGLE_BUTTON(generalpaintedges)->active;
pcvals.generaldarkedge = GTK_ADJUSTMENT(generaldarkedgeadjust)->value;
pcvals.generaltileable = GTK_TOGGLE_BUTTON(generaltileable)->active;
pcvals.generaldropshadow = GTK_TOGGLE_BUTTON(generaldropshadow)->active;
pcvals.generalshadowdarkness = GTK_ADJUSTMENT(generalshadowadjust)->value;
pcvals.generalshadowdepth = GTK_ADJUSTMENT(generalshadowdepth)->value;
pcvals.generalshadowblur = GTK_ADJUSTMENT(generalshadowblur)->value;
pcvals.generalpaintedges = GTK_TOGGLE_BUTTON(generalpaintedges)->active;
pcvals.generaldarkedge = GTK_ADJUSTMENT(generaldarkedgeadjust)->value;
pcvals.generaltileable = GTK_TOGGLE_BUTTON(generaltileable)->active;
pcvals.generaldropshadow = GTK_TOGGLE_BUTTON(generaldropshadow)->active;
pcvals.generalshadowdarkness = GTK_ADJUSTMENT(generalshadowadjust)->value;
pcvals.generalshadowdepth = GTK_ADJUSTMENT(generalshadowdepth)->value;
pcvals.generalshadowblur = GTK_ADJUSTMENT(generalshadowblur)->value;
pcvals.devthresh = GTK_ADJUSTMENT(devthreshadjust)->value;
}
void general_restore(void)
{
gtk_toggle_button_set_active (
GTK_TOGGLE_BUTTON (
generalbgradio[normalize_bg (pcvals.generalbgtype)]
),
TRUE
);
gtk_toggle_button_set_active (
GTK_TOGGLE_BUTTON (generalbgradio[normalize_bg (pcvals.generalbgtype)]
),
TRUE
);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(generalpaintedges), pcvals.generalpaintedges);
gtk_adjustment_set_value(GTK_ADJUSTMENT(generaldarkedgeadjust), pcvals.generaldarkedge);
gtk_adjustment_set_value(GTK_ADJUSTMENT(generalshadowadjust), pcvals.generalshadowdarkness);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(generaldropshadow), pcvals.generaldropshadow);
gtk_adjustment_set_value(GTK_ADJUSTMENT(generalshadowdepth), pcvals.generalshadowdepth);
gtk_adjustment_set_value(GTK_ADJUSTMENT(generalshadowblur), pcvals.generalshadowblur);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(generaltileable), pcvals.generaltileable);
gimp_color_button_set_color (GIMP_COLOR_BUTTON(generalcolbutton),
&pcvals.color);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (generalpaintedges),
pcvals.generalpaintedges);
gtk_adjustment_set_value (GTK_ADJUSTMENT (generaldarkedgeadjust),
pcvals.generaldarkedge);
gtk_adjustment_set_value (GTK_ADJUSTMENT (generalshadowadjust),
pcvals.generalshadowdarkness);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (generaldropshadow),
pcvals.generaldropshadow);
gtk_adjustment_set_value (GTK_ADJUSTMENT (generalshadowdepth),
pcvals.generalshadowdepth);
gtk_adjustment_set_value (GTK_ADJUSTMENT (generalshadowblur),
pcvals.generalshadowblur);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (generaltileable),
pcvals.generaltileable);
gimp_color_button_set_color (GIMP_COLOR_BUTTON (generalcolbutton),
&pcvals.color);
gtk_adjustment_set_value (GTK_ADJUSTMENT (devthreshadjust),
pcvals.devthresh);
}
static void selectcolor(GtkWidget *widget, gpointer data)

View File

@ -3,5 +3,6 @@
void general_restore(void);
void general_store(void);
void create_generalpage(GtkNotebook *);
#endif /* #ifndef __GENERAL_H */

View File

@ -7,10 +7,13 @@
#include <libgimp/gimp.h>
#include "ppmtool.h"
#include "infile.h"
#include "gimpressionist.h"
#include "preview.h"
#include "brush.h"
#include "presets.h"
#include "random.h"
#include "libgimp/stdplugins-intl.h"
@ -31,6 +34,24 @@ GimpPlugInInfo PLUG_IN_INFO = {
}; /* PLUG_IN_INFO */
static GimpDrawable *drawable;
static ppm_t infile = {0,0,NULL};
static ppm_t inalpha = {0,0,NULL};
void infile_copy_to_ppm(ppm_t * p)
{
if(!infile.col)
grabarea();
#if 0
updatepreview (NULL, (void *)2); /* Force grabarea() */
#endif
copyppm(&infile, p);
}
void infile_copy_alpha_to_ppm(ppm_t * p)
{
copyppm(&inalpha, p);
}
MAIN()
@ -107,7 +128,7 @@ run (const gchar *name,
drawable = gimp_drawable_get (param[2].data.d_drawable);
img_has_alpha = gimp_drawable_has_alpha (drawable->drawable_id);
gr = g_rand_new ();
random_generator = g_rand_new ();
switch (run_mode)
{
@ -173,7 +194,7 @@ run (const gchar *name,
}
/* Resources Cleanup */
g_rand_free (gr);
g_rand_free (random_generator);
free_parsepath_cache();
reloadbrush(NULL, NULL);
preview_free_resources();

View File

@ -32,24 +32,17 @@ void storevals(void)
paper_store();
brush_store();
general_store();
pcvals.devthresh = GTK_ADJUSTMENT(devthreshadjust)->value;
}
void restorevals(void)
{
brush_restore();
paper_restore();
orientation_restore();
size_restore();
place_restore();
general_restore();
gtk_adjustment_set_value(GTK_ADJUSTMENT(devthreshadjust), pcvals.devthresh);
gtk_adjustment_set_value(GTK_ADJUSTMENT(colornoiseadjust), pcvals.colornoise);
color_type_restore();
color_restore();
update_orientmap_dialog();
}

View File

@ -5,6 +5,8 @@
/* Includes necessary for the correct processing of this file. */
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include "ppmtool.h"
/* Defines */
#define PLUG_IN_NAME "plug_in_gimpressionist"
@ -117,38 +119,16 @@ enum PRESETS_LIST_COLUMN_ENUM
/* Globals */
extern char *standalone;
extern gimpressionist_vals_t pcvals;
extern char *path;
extern struct ppm infile;
extern struct ppm inalpha;
extern GtkWidget *window;
extern int brushfile;
extern struct ppm brushppm;
extern GtkObject *devthreshadjust;
extern GtkWidget *colortype;
extern GtkObject *colornoiseadjust;
extern GtkWidget *previewbutton;
extern gboolean img_has_alpha;
extern GRand *gr;
/* Prototypes */
GList *parsepath(void);
void free_parsepath_cache(void);
void create_paperpage(GtkNotebook *);
void create_brushpage(GtkNotebook *);
void create_orientationpage(GtkNotebook *);
void create_generalpage(GtkNotebook *);
void create_placementpage(GtkNotebook *);
void create_colorpage(GtkNotebook *);
void grabarea(void);

View File

@ -6,21 +6,9 @@
#include "gimpressionist.h"
#include "ppmtool.h"
GtkWidget *presetsavebutton = NULL;
GtkWidget *presetdesctext = NULL;
GtkObject *devthreshadjust = NULL;
gint brushfile = 2;
ppm_t brushppm = {0, 0, NULL};
gboolean img_has_alpha = FALSE;
GRand *random_generator;
gimpressionist_vals_t pcvals;
ppm_t infile = {0,0,NULL};
ppm_t inalpha = {0,0,NULL};
GRand *gr;
GtkWidget *previewbutton = NULL;
GtkObject *colornoiseadjust = NULL;
/*
* The default values for the application, to be initialized at startup.

View File

@ -0,0 +1,9 @@
#ifndef __INFILE_H
#define __INFILE_H
#include "ppmtool.h"
void infile_copy_to_ppm(ppm_t * p);
void infile_copy_alpha_to_ppm(ppm_t * p);
#endif

File diff suppressed because it is too large Load Diff

View File

@ -12,6 +12,7 @@
#include "gimpressionist.h"
#include "ppmtool.h"
#include "infile.h"
#include "preview.h"
@ -174,9 +175,7 @@ static void updatevectorprev(void)
else val = 0.5;
if(!ok || (val != lastval)) {
if(!infile.col)
updatepreview (NULL, (void *)2); /* Force grabarea() */
copyppm(&infile, &backup);
infile_copy_to_ppm(&backup);
ppmbrightness(&backup, val, 1,1,1);
if((backup.width != OMWIDTH) || (backup.height != OMHEIGHT))
resize_fast(&backup, OMWIDTH, OMHEIGHT);

View File

@ -9,5 +9,6 @@ enum PLACEMENT_TYPE_ENUM
void place_store(void);
void place_restore(void);
void create_placementpage(GtkNotebook *);
#endif

View File

@ -9,6 +9,7 @@
#include "gimpressionist.h"
#include "ppmtool.h"
#include "random.h"
static int pfix(int n)
{
@ -33,21 +34,21 @@ static void mkplasma_sub(ppm_t *p, int x1, int x2, int y1, int y2, float turb)
ny = (y1+y2)/2;
if(!PIXEL(y1,nx,r))
PIXEL(y1,nx,r) = pfix((PIXEL(y1,x1,r)+PIXEL(y1,x2,r))/2.0+
turb * g_rand_double_range (gr, -xr/2.0, xr/2.0));
turb * g_rand_double_range (random_generator, -xr/2.0, xr/2.0));
if(!PIXEL(y2,nx,r))
PIXEL(y2,nx,r) = pfix((PIXEL(y2,x1,r)+PIXEL(y2,x2,r))/2.0+
turb * g_rand_double_range (gr, -xr/2.0, xr/2.0));
turb * g_rand_double_range (random_generator, -xr/2.0, xr/2.0));
if(!PIXEL(ny,x1,r))
PIXEL(ny,x1,r) = pfix((PIXEL(y1,x1,r)+PIXEL(y2,x1,r))/2.0+
turb * g_rand_double_range (gr, -yr/2.0, yr/2.0));
turb * g_rand_double_range (random_generator, -yr/2.0, yr/2.0));
if(!PIXEL(ny,x2,r))
PIXEL(ny,x2,r) = pfix((PIXEL(y1,x2,r)+PIXEL(y2,x2,r))/2.0+
turb * g_rand_double_range (gr, -yr/2.0, yr/2.0));
turb * g_rand_double_range (random_generator, -yr/2.0, yr/2.0));
if(!PIXEL(ny,nx,r))
PIXEL(ny,nx,r) =
pfix((PIXEL(y1,x1,r) + PIXEL(y1,x2,r) + PIXEL(y2,x1,r) +
PIXEL(y2,x2,r))/4.0 + turb *
g_rand_double_range (gr, -(xr + yr)/4.0, (xr + yr)/4.0));
g_rand_double_range (random_generator, -(xr + yr)/4.0, (xr + yr)/4.0));
if(xr>1) {
mkplasma_sub(p,x1,nx,y1,ny, turb);
@ -68,10 +69,10 @@ static void mkplasma_red(ppm_t *p, float turb)
for(y = 0; y < p->height; y++)
PIXEL(y,x,0) = 0;
x--; y--;
PIXEL(0,0,0) = g_rand_int_range (gr, 1, 256);
PIXEL(y,0,0) = g_rand_int_range (gr, 1, 256);
PIXEL(0,x,0) = g_rand_int_range (gr, 1, 256);
PIXEL(y,x,0) = g_rand_int_range (gr, 1, 256);
PIXEL(0,0,0) = g_rand_int_range (random_generator, 1, 256);
PIXEL(y,0,0) = g_rand_int_range (random_generator, 1, 256);
PIXEL(0,x,0) = g_rand_int_range (random_generator, 1, 256);
PIXEL(y,x,0) = g_rand_int_range (random_generator, 1, 256);
mkplasma_sub(p, 0, x, 0, y, turb);
}

View File

@ -28,10 +28,18 @@
static GtkWidget *presetnameentry = NULL;
static GtkWidget *presetlist = NULL;
static GtkWidget *presetdesclabel = NULL;
static GtkWidget *presetsavebutton = NULL;
static GtkListStore *store;
static gchar *selected_preset_orig_name = NULL;
static gchar *selected_preset_filename = NULL;
void preset_save_button_set_sensitive (gboolean s)
{
if (GTK_IS_WIDGET (presetsavebutton))
gtk_widget_set_sensitive (GTK_WIDGET (presetsavebutton), s);
}
void preset_free(void)
{
g_free (selected_preset_orig_name);

View File

@ -9,9 +9,9 @@ enum SELECT_PRESET_RETURN_VALUES
};
void create_presetpage (GtkNotebook *);
extern GtkWidget *presetsavebutton;
int select_preset (const gchar *preset);
void preset_free (void);
void preset_save_button_set_sensitive (gboolean s);
#endif

View File

@ -14,12 +14,18 @@
#include "gimpressionist.h"
#include "ppmtool.h"
#include "infile.h"
#include "libgimp/stdplugins-intl.h"
static GtkWidget *preview = NULL;
static GtkWidget *previewbutton = NULL;
void preview_set_button_label(gchar * text)
{
gtk_label_set_text(GTK_LABEL(GTK_BIN(previewbutton)->child), text);
}
static void drawalpha(ppm_t *p, ppm_t *a)
{
@ -65,10 +71,23 @@ updatepreview (GtkWidget *wg, gpointer d)
gint i;
guchar buf[PREVIEWSIZE*3];
/* This portion is remmed out because of the remming out of the
* code below.
* -- Shlomi Fish
* */
#if 0
if(!infile.col && d)
grabarea();
#endif
/* It seems that infile.col must be true here. (after grabarea() that is.)
* Thus, I'm removing this entire portion of the code in hope that
* it works OK afterwards.
* -- Shlomi Fish
* */
#if 0
if(!infile.col && !d) {
memset(buf, 0, sizeof(buf));
for(i = 0; i < PREVIEWSIZE; i++)
{
@ -76,15 +95,16 @@ updatepreview (GtkWidget *wg, gpointer d)
}
}
else
#endif
{
if(!backup_ppm.col)
{
copyppm(&infile, &backup_ppm);
infile_copy_to_ppm (&backup_ppm);
if((backup_ppm.width != PREVIEWSIZE) || (backup_ppm.height != PREVIEWSIZE))
resize_fast(&backup_ppm, PREVIEWSIZE, PREVIEWSIZE);
if(img_has_alpha)
{
copyppm(&inalpha, &alpha_backup_ppm);
infile_copy_alpha_to_ppm (&alpha_backup_ppm);
if((alpha_backup_ppm.width != PREVIEWSIZE) || (alpha_backup_ppm.height != PREVIEWSIZE))
resize_fast(&alpha_backup_ppm, PREVIEWSIZE, PREVIEWSIZE);
}

View File

@ -4,5 +4,6 @@
GtkWidget* create_preview (void);
void updatepreview (GtkWidget *wg, gpointer d);
void preview_free_resources(void);
void preview_set_button_label(gchar * text);
#endif /* #ifndef __PREVIEW_H */

View File

@ -0,0 +1,7 @@
#ifndef __RAND_H
#define __RAND_H
extern GRand *random_generator;
#endif

View File

@ -8,9 +8,12 @@
#include <libgimp/gimp.h>
#include "gimpressionist.h"
#include "brush.h"
#include "placement.h"
#include "size.h"
#include "ppmtool.h"
#include "preview.h"
#include "random.h"
#include "size.h"
#include <libgimp/stdplugins-intl.h>
@ -160,7 +163,7 @@ static int bestbrush(ppm_t *p, ppm_t *a, int tx, int ty,
return 0;
}
i = g_rand_int_range (gr, 0, g_list_length(brlist));
i = g_rand_int_range (random_generator, 0, g_list_length(brlist));
best = (long)((g_list_nth(brlist,i))->data);
g_list_free(brlist);
@ -314,10 +317,7 @@ void repaint(ppm_t *p, ppm_t *a)
shadows = NULL;
brushes[0].col = NULL;
if(brushfile)
reloadbrush(runningvals.selectedbrush, &brushes[0]);
else
copyppm(&brushppm, &brushes[0]);
brush_get_selected (&brushes[0]);
resize(&brushes[0], brushes[0].width, brushes[0].height * pow(10,runningvals.brushaspect));
scale = runningvals.sizelast / MAX(brushes[0].width, brushes[0].height);
@ -630,7 +630,7 @@ void repaint(ppm_t *p, ppm_t *a)
}
for(j = 0; j < i; j++) {
int a, b;
a = g_rand_int_range (gr, 0, i);
a = g_rand_int_range (random_generator, 0, i);
b = xpos[j]; xpos[j] = xpos[a]; xpos[a] = b;
b = ypos[j]; ypos[j] = ypos[a]; ypos[a] = b;
}
@ -644,23 +644,24 @@ void repaint(ppm_t *p, ppm_t *a)
char tmps[40];
g_snprintf (tmps, sizeof (tmps),
"%.1f %%", 100 * (1.0 - ((double)i / max_progress)));
gtk_label_set_text(GTK_LABEL(GTK_BIN(previewbutton)->child), tmps);
preview_set_button_label (tmps);
while(gtk_events_pending())
gtk_main_iteration();
}
}
if(runningvals.placetype == PLACEMENT_TYPE_RANDOM) {
tx = g_rand_int_range (gr, maxbrushwidth/2,
tx = g_rand_int_range (random_generator, maxbrushwidth/2,
tmp.width - maxbrushwidth/2);
ty = g_rand_int_range (gr, maxbrushheight/2,
ty = g_rand_int_range (random_generator, maxbrushheight/2,
tmp.height - maxbrushheight/2);
} else if(runningvals.placetype == PLACEMENT_TYPE_EVEN_DIST) {
tx = xpos[i-1];
ty = ypos[i-1];
}
if(runningvals.placecenter) {
double z = g_rand_double_range (gr, 0, 0.75);
double z = g_rand_double_range (random_generator, 0, 0.75);
tx = tx * (1.0-z) + tmp.width/2 * z;
ty = ty * (1.0-z) + tmp.height/2 * z;
}
@ -683,7 +684,7 @@ void repaint(ppm_t *p, ppm_t *a)
switch(runningvals.orienttype) {
case ORIENTATION_RANDOM:
on = g_rand_int_range (gr, 0, runningvals.orientnum);
on = g_rand_int_range (random_generator, 0, runningvals.orientnum);
break;
case ORIENTATION_VALUE:
case ORIENTATION_RADIUS:
@ -703,7 +704,7 @@ void repaint(ppm_t *p, ppm_t *a)
switch(runningvals.sizetype) {
case SIZE_TYPE_RANDOM:
sn = g_rand_int_range (gr, 0, runningvals.sizenum);
sn = g_rand_int_range (random_generator, 0, runningvals.sizenum);
break;
case SIZE_TYPE_VALUE:
case SIZE_TYPE_RADIUS:
@ -787,7 +788,7 @@ void repaint(ppm_t *p, ppm_t *a)
#define BOUNDS(a) (((a) < 0) ? (a) : ((a) > 255) ? 255 : (a))
#define MYASSIGN(a) \
{ \
a = a + g_rand_double_range (gr, -v/2.0, v/2.0); \
a = a + g_rand_double_range (random_generator, -v/2.0, v/2.0); \
a = BOUNDS(a) ; \
}
MYASSIGN(r);
@ -900,7 +901,7 @@ void repaint(ppm_t *p, ppm_t *a)
if(runningvals.run) {
gimp_progress_update(0.8);
} else {
gtk_label_set_text(GTK_LABEL(GTK_BIN(previewbutton)->child), _("Update"));
preview_set_button_label (_("Update"));
}
running = 0;
}

View File

@ -103,9 +103,13 @@ static void updatesmvectorprev(void)
if(!ok || (val != lastval))
{
#if 0
if(!infile.col)
updatepreview (NULL, (void *)2); /* Force grabarea() */
copyppm(&infile, &backup);
#else
infile_copy_to_ppm (&backup);
#endif
ppmbrightness(&backup, val, 1,1,1);
if (backup.width != OMWIDTH || backup.height != OMHEIGHT)
resize_fast(&backup, OMWIDTH, OMHEIGHT);