From 593ec1fbeab32d598bc4cc5de42bb0887ad0d520 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Mon, 13 Feb 2017 18:09:43 +0000 Subject: Manage shared pens internally unless we need multiple lists (eg. per browser_window) --- frontends/amiga/bitmap.c | 2 +- frontends/amiga/corewindow.c | 4 +--- frontends/amiga/gui.c | 6 +++--- frontends/amiga/history_local.c | 2 +- frontends/amiga/plotters.c | 33 +++++++++++++++++++++++++++++---- frontends/amiga/plotters.h | 33 ++++++++++++++++++++++++++++++++- frontends/amiga/print.c | 2 +- 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; -- cgit v1.2.3