summaryrefslogtreecommitdiff
path: root/frontends
diff options
context:
space:
mode:
Diffstat (limited to 'frontends')
-rw-r--r--frontends/amiga/bitmap.c2
-rw-r--r--frontends/amiga/corewindow.c4
-rw-r--r--frontends/amiga/gui.c6
-rwxr-xr-xfrontends/amiga/history_local.c2
-rw-r--r--frontends/amiga/plotters.c33
-rw-r--r--frontends/amiga/plotters.h33
-rw-r--r--frontends/amiga/print.c2
7 files changed, 68 insertions, 14 deletions
diff --git a/frontends/amiga/bitmap.c b/frontends/amiga/bitmap.c
index 31448d6cc..24471c31f 100644
--- a/frontends/amiga/bitmap.c
+++ b/frontends/amiga/bitmap.c
@@ -733,7 +733,7 @@ static nserror bitmap_render(struct bitmap *bitmap, struct hlcache_handle *conte
plot_height = ((plot_width * bitmap->height) + (bitmap->width / 2)) /
bitmap->width;
- bm_globals = ami_plot_ra_alloc(bitmap->width, bitmap->height, true);
+ bm_globals = ami_plot_ra_alloc(bitmap->width, bitmap->height, true, false);
ami_clearclipreg(bm_globals);
struct redraw_context ctx = {
diff --git a/frontends/amiga/corewindow.c b/frontends/amiga/corewindow.c
index 0c85bafdd..e6293453c 100644
--- a/frontends/amiga/corewindow.c
+++ b/frontends/amiga/corewindow.c
@@ -915,8 +915,7 @@ nserror ami_corewindow_init(struct ami_corewindow *ami_cw)
ami_cw->dragging = false;
/* allocate drawing area etc */
- ami_cw->gg = ami_plot_ra_alloc(100, 100, false); // force tiles to save memory
- ami_cw->gg->shared_pens = ami_AllocMinList();
+ ami_cw->gg = ami_plot_ra_alloc(100, 100, false, true); // force tiles to save memory
ami_cw->deferred_rects = NewObjList();
ami_cw->deferred_rects_pool = ami_memory_itempool_create(sizeof(struct rect));
@@ -986,7 +985,6 @@ nserror ami_corewindow_fini(struct ami_corewindow *ami_cw)
#endif
/* release off-screen bitmap stuff */
- ami_plot_release_pens(ami_cw->gg->shared_pens);
ami_plot_ra_free(ami_cw->gg);
/* free the window title */
diff --git a/frontends/amiga/gui.c b/frontends/amiga/gui.c
index e6f23abe6..973f4e787 100644
--- a/frontends/amiga/gui.c
+++ b/frontends/amiga/gui.c
@@ -885,7 +885,7 @@ static void ami_openscreen(void)
static void ami_openscreenfirst(void)
{
ami_openscreen();
- if(browserglob == NULL) browserglob = ami_plot_ra_alloc(0, 0, false);
+ if(browserglob == NULL) browserglob = ami_plot_ra_alloc(0, 0, false, false);
ami_theme_throbber_setup();
}
@@ -3530,7 +3530,7 @@ static void ami_do_redraw_tiled(struct gui_window_2 *gwin, bool busy,
int tile_x_scale = (int)(tile_size_x / gwin->gw->scale);
int tile_y_scale = (int)(tile_size_y / gwin->gw->scale);
- glob->shared_pens = gwin->shared_pens; /* do we need this?? */
+ ami_plot_ra_set_pen_list(glob, gwin->shared_pens);
if(top < 0) {
height += top;
@@ -4909,7 +4909,7 @@ static void ami_do_redraw(struct gui_window_2 *gwin)
}
else
{
- browserglob->shared_pens = gwin->shared_pens;
+ ami_plot_ra_set_pen_list(browserglob, gwin->shared_pens);
temprp = browserglob->rp;
browserglob->rp = gwin->win->RPort;
clip.x0 = bbox->Left;
diff --git a/frontends/amiga/history_local.c b/frontends/amiga/history_local.c
index 8ebfc7e65..34d6b03c4 100755
--- a/frontends/amiga/history_local.c
+++ b/frontends/amiga/history_local.c
@@ -132,7 +132,7 @@ void ami_history_open(struct gui_window *gw)
if(!gw->hw)
{
gw->hw = calloc(1, sizeof(struct history_window));
- gw->hw->gg = ami_plot_ra_alloc(scrn->Width, scrn->Height, false);
+ gw->hw->gg = ami_plot_ra_alloc(scrn->Width, scrn->Height, false, true);
gw->hw->gw = gw;
browser_window_history_size(gw->bw, &width, &height);
diff --git a/frontends/amiga/plotters.c b/frontends/amiga/plotters.c
index 1911b7d17..e70a9a998 100644
--- a/frontends/amiga/plotters.c
+++ b/frontends/amiga/plotters.c
@@ -102,7 +102,7 @@ static bool palette_mapped = true; /* palette-mapped state for the screen */
/* Define the below to get additional debug */
#undef AMI_PLOTTER_DEBUG
-struct gui_globals *ami_plot_ra_alloc(ULONG width, ULONG height, bool force32bit)
+struct gui_globals *ami_plot_ra_alloc(ULONG width, ULONG height, bool force32bit, bool alloc_pen_list)
{
/* init shared bitmaps */
int depth = 32;
@@ -201,15 +201,24 @@ struct gui_globals *ami_plot_ra_alloc(ULONG width, ULONG height, bool force32bit
InitTmpRas(gg->rp->TmpRas, gg->tmprasbuf, width*height);
- if((gg->palette_mapped == true) && (pool_pens == NULL)) {
- pool_pens = ami_memory_itempool_create(sizeof(struct ami_plot_pen));
+ gg->shared_pens = NULL;
+ gg->managed_pen_list = false;
+
+ if(gg->palette_mapped == true) {
+ if(pool_pens == NULL) {
+ pool_pens = ami_memory_itempool_create(sizeof(struct ami_plot_pen));
+ }
+
+ if(alloc_pen_list == true) {
+ gg->shared_pens = ami_AllocMinList();
+ gg->managed_pen_list = true;
+ }
}
gg->apen = 0x00000000;
gg->open = 0x00000000;
gg->apen_num = -1;
gg->open_num = -1;
- gg->shared_pens = NULL;
init_layers_count++;
LOG("Layer initialised (total: %d)", init_layers_count);
@@ -242,6 +251,12 @@ void ami_plot_ra_free(struct gui_globals *gg)
if(gg->bm) FreeBitMap(gg->bm);
}
+ if(gg->managed_pen_list == true) {
+ ami_plot_release_pens(gg->shared_pens);
+ free(gg->shared_pens);
+ gg->shared_pens = NULL;
+ }
+
free(gg);
}
@@ -250,6 +265,11 @@ struct BitMap *ami_plot_ra_get_bitmap(struct gui_globals *gg)
return gg->bm;
}
+void ami_plot_ra_set_pen_list(struct gui_globals *gg, struct MinList *pen_list)
+{
+ gg->shared_pens = pen_list;
+}
+
void ami_clearclipreg(struct gui_globals *gg)
{
struct Region *reg = NULL;
@@ -261,6 +281,11 @@ void ami_clearclipreg(struct gui_globals *gg)
gg->rect.MinY = 0;
gg->rect.MaxX = scrn->Width-1;
gg->rect.MaxY = scrn->Height-1;
+
+ gg->apen = 0x00000000;
+ gg->open = 0x00000000;
+ gg->apen_num = -1;
+ gg->open_num = -1;
}
static ULONG ami_plot_obtain_pen(struct MinList *shared_pens, ULONG colr)
diff --git a/frontends/amiga/plotters.h b/frontends/amiga/plotters.h
index c82208f53..4d2dc660c 100644
--- a/frontends/amiga/plotters.h
+++ b/frontends/amiga/plotters.h
@@ -34,6 +34,7 @@ struct gui_globals
APTR tmprasbuf;
struct Rectangle rect;
struct MinList *shared_pens;
+ bool managed_pen_list;
bool palette_mapped;
ULONG apen;
ULONG open;
@@ -50,8 +51,38 @@ void ami_plot_clear_bbox(struct RastPort *rp, struct IBox *bbox);
void ami_plot_release_pens(struct MinList *shared_pens);
bool ami_plot_screen_is_palettemapped(void);
-struct gui_globals *ami_plot_ra_alloc(ULONG width, ULONG height, bool force32bit);
+/* Plotter render area management */
+
+/**
+ * Alloc a plotter render area
+ * \param width of render bitmap
+ * \param height of render bitmap
+ * \param force32bit allocate a 32-bit bitmap even if this does not match the screen
+ * \param alloc_pen_list set to false to use own pen list (eg. if multiple pen lists will be required)
+ * \returns pointer to render area
+ */
+struct gui_globals *ami_plot_ra_alloc(ULONG width, ULONG height, bool force32bit, bool alloc_pen_list);
+
+/**
+ * Free a plotter render area
+ * \param gg render area to free
+ */
void ami_plot_ra_free(struct gui_globals *gg);
+
+/**
+ * Get a drawing BitMap associated with a render area
+ * \param gg render area
+ * \returns pointer to render area BitMap
+ */
struct BitMap *ami_plot_ra_get_bitmap(struct gui_globals *gg);
+/**
+ * Set a list of shared pens for a render area to use
+ * Only relevant for palette-mapped screens
+ * \param gg render area
+ * \param pen_list allocated by ami_AllocMinList()
+ */
+void ami_plot_ra_set_pen_list(struct gui_globals *gg, struct MinList *pen_list);
+
#endif
+
diff --git a/frontends/amiga/print.c b/frontends/amiga/print.c
index 23f8eadae..13ffc5b96 100644
--- a/frontends/amiga/print.c
+++ b/frontends/amiga/print.c
@@ -500,7 +500,7 @@ bool ami_print_begin(struct print_settings *ps)
ami_print_info.gg = ami_plot_ra_alloc(ami_print_info.PED->ped_MaxXDots,
ami_print_info.PED->ped_MaxYDots,
- true);
+ true, false);
ami_print_info.page = 0;