Gitweb links:

...log 
http://git.netsurf-browser.org/netsurf.git/shortlog/180295936b686d194b7b4c25b9a0dc2038ffc4cb
...commit 
http://git.netsurf-browser.org/netsurf.git/commit/180295936b686d194b7b4c25b9a0dc2038ffc4cb
...tree 
http://git.netsurf-browser.org/netsurf.git/tree/180295936b686d194b7b4c25b9a0dc2038ffc4cb

The branch, master has been updated
       via  180295936b686d194b7b4c25b9a0dc2038ffc4cb (commit)
      from  e5a05f1c0e1bb7e7388d4fedb584d8ec71be6628 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=180295936b686d194b7b4c25b9a0dc2038ffc4cb
commit 180295936b686d194b7b4c25b9a0dc2038ffc4cb
Author: Chris Young <[email protected]>
Commit: Chris Young <[email protected]>

    Use guigfx.library for 8-bit image quantization
    This achieves speed-up on OS3/68k platforms where 8-bit modes are more 
likely to be used, at the expense of lower quality quantization than the former 
picture.datatype abuse provided.
    Additionally, caching of BitMaps in palette-mapped modes is now possible.
    NetSurf now requires guigfx.library (and render.library) in order to start, 
even on OS4.

diff --git a/amiga/Makefile.target b/amiga/Makefile.target
index 8e16780..54957f7 100644
--- a/amiga/Makefile.target
+++ b/amiga/Makefile.target
@@ -50,10 +50,10 @@ else
   LDFLAGS += $(shell $(PKG_CONFIG) --libs tre)
   LDFLAGS += -L$(GCCSDK_INSTALL_ENV)/lib
 
+  LDFLAGS += -lpbl -liconv
+
   ifeq ($(SUBTARGET),os3)
-    LDFLAGS += -lpbl -liconv -lamiga
-  else
-    LDFLAGS += -lpbl -liconv
+    LDFLAGS += -lamiga -lm
   endif
 endif
 
diff --git a/amiga/bitmap.c b/amiga/bitmap.c
index 9f53444..6ef5157 100644
--- a/amiga/bitmap.c
+++ b/amiga/bitmap.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2008, 2009, 2012 Chris Young <[email protected]>
+ * Copyright 2008, 2009, 2012, 2016 Chris Young 
<[email protected]>
  *
  * This file is part of NetSurf, http://www.netsurf-browser.org/
  *
@@ -30,11 +30,20 @@
 #include <proto/dos.h>
 #include <proto/intuition.h>
 #include <proto/utility.h>
+
+#include <proto/guigfx.h>
+#include <guigfx/guigfx.h>
+#include <render/render.h>
+#ifndef __amigaos4__
+#include <inline/guigfx.h>
+#endif
+
 #ifdef __amigaos4__
 #include <sys/param.h>
 #endif
 #include "assert.h"
 
+#include "utils/log.h"
 #include "utils/nsoption.h"
 #include "utils/nsurl.h"
 #include "utils/messages.h"
@@ -60,6 +69,8 @@ struct bitmap {
        int nativebmheight;
        PLANEPTR native_mask;
        Object *dto;
+       APTR drawhandle;
+       APTR psm;
        struct nsurl *url;   /* temporary storage space */
        char *title; /* temporary storage space */
        ULONG *icondata; /* for appicons */
@@ -94,7 +105,8 @@ void *amiga_bitmap_create(int width, int height, unsigned 
int state)
        bitmap->nativebmwidth = 0;
        bitmap->nativebmheight = 0;
        bitmap->native_mask = NULL;
-       bitmap->dto = NULL;
+       bitmap->drawhandle = NULL;
+       bitmap->psm = NULL;
        bitmap->url = NULL;
        bitmap->title = NULL;
        bitmap->icondata = NULL;
@@ -134,16 +146,13 @@ void amiga_bitmap_destroy(void *bitmap)
 
        if(bm)
        {
-               if((bm->nativebm) && (bm->native == AMI_NSBM_TRUECOLOUR)) {
+               if((bm->nativebm)) { // && (bm->native == AMI_NSBM_TRUECOLOUR)) 
{
                        ami_rtg_freebitmap(bm->nativebm);
                }
 
-               if(bm->dto) {
-                       /**\todo find out why this crashes on exit but not 
during normal program execution */
-                       DisposeDTObject(bm->dto);
-               }
-
                if(bm->native_mask) FreeRaster(bm->native_mask, bm->width, 
bm->height);
+               if(bm->drawhandle) ReleaseDrawHandle(bm->drawhandle);
+               if(bm->psm) DeletePenShareMap(bm->psm);
                FreeVec(bm->pixdata);
 
                if(bm->url) nsurl_unref(bm->url);
@@ -152,7 +161,8 @@ void amiga_bitmap_destroy(void *bitmap)
                bm->pixdata = NULL;
                bm->nativebm = NULL;
                bm->native_mask = NULL;
-               bm->dto = NULL;
+               bm->drawhandle = NULL;
+               bm->psm = NULL;
                bm->url = NULL;
                bm->title = NULL;
        
@@ -192,13 +202,15 @@ void amiga_bitmap_modified(void *bitmap)
 {
        struct bitmap *bm = bitmap;
 
-       if((bm->nativebm) && (bm->native == AMI_NSBM_TRUECOLOUR))
+       if((bm->nativebm)) // && (bm->native == AMI_NSBM_TRUECOLOUR))
                ami_rtg_freebitmap(bm->nativebm);
                
-       if(bm->dto) DisposeDTObject(bm->dto);
+       if(bm->drawhandle) ReleaseDrawHandle(bm->drawhandle);
+       if(bm->psm) DeletePenShareMap(bm->psm);
        if(bm->native_mask) FreeRaster(bm->native_mask, bm->width, bm->height);
        bm->nativebm = NULL;
-       bm->dto = NULL;
+       bm->drawhandle = NULL;
+       bm->psm = NULL;
        bm->native_mask = NULL;
        bm->native = AMI_NSBM_NONE;
 }
@@ -288,17 +300,25 @@ static size_t bitmap_get_bpp(void *vbitmap)
        return 4;
 }
 
-#ifdef __amigaos4__
 static void ami_bitmap_argb_to_rgba(struct bitmap *bm)
 {
        if(bm == NULL) return;
        
        ULONG *data = (ULONG *)amiga_bitmap_get_buffer(bm);
-       for(int i = 0; i < ((amiga_bitmap_get_rowstride(bm) / sizeof(ULONG)) * 
bm->height); i++) { 
+       for(int i = 0; i < (bm->width * bm->height); i++) {
                data[i] = (data[i] << 8) | (data[i] >> 24);
        }
 }
-#endif
+
+static void ami_bitmap_rgba_to_argb(struct bitmap *bm)
+{
+       if(bm == NULL) return;
+       
+       ULONG *data = (ULONG *)amiga_bitmap_get_buffer(bm);
+       for(int i = 0; i < (bm->width * bm->height); i++) {
+               data[i] = (data[i] >> 8) | (data[i] << 24);
+       }
+}
 
 #ifdef BITMAP_DUMP
 void bitmap_dump(struct bitmap *bitmap)
@@ -385,41 +405,64 @@ struct bitmap *ami_bitmap_from_datatype(char *filename)
        return bm;
 }
 
-static inline struct BitMap *ami_bitmap_get_truecolour(struct bitmap 
*bitmap,int width,int height,struct BitMap *friendbm)
+static inline struct BitMap *ami_bitmap_get_generic(struct bitmap *bitmap, int 
width, int height, struct BitMap *friendbm, int type)
 {
        struct BitMap *tbm = NULL;
 
-       if(!bitmap) return NULL;
-
-       if((bitmap->native != AMI_NSBM_NONE) && (bitmap->native != 
AMI_NSBM_TRUECOLOUR)) {
-               amiga_bitmap_modified(bitmap);
-       }
-
        if(bitmap->nativebm)
        {
-               if((bitmap->nativebmwidth == width) && 
(bitmap->nativebmheight==height))
-               {
+               if((bitmap->nativebmwidth == width) && (bitmap->nativebmheight 
== height)) {
                        tbm = bitmap->nativebm;
                        return tbm;
-               }
-               else if((bitmap->nativebmwidth == bitmap->width) && 
(bitmap->nativebmheight==bitmap->height))
-               {
+               } else if((bitmap->nativebmwidth == bitmap->width) &&
+                               (bitmap->nativebmheight == bitmap->height)) { 
// >= width/height ?
                        tbm = bitmap->nativebm;
-               }
-               else
-               {
-                       if(bitmap->nativebm) 
ami_rtg_freebitmap(bitmap->nativebm);
-                       bitmap->nativebm = NULL;
+               } else {
+                       if(bitmap->nativebm) amiga_bitmap_modified(bitmap);
                }
        }
 
-       if(!tbm)
-       {
-               if((tbm = ami_rtg_allocbitmap(bitmap->width, bitmap->height, 
32, 0,
-                                                               friendbm, 
AMI_BITMAP_FORMAT))) {
-                       ami_rtg_writepixelarray(amiga_bitmap_get_buffer(bitmap),
-                                                               tbm, 
bitmap->width, bitmap->height,
-                                                               bitmap->width * 
4, AMI_BITMAP_FORMAT);
+       if(tbm == NULL) {
+               if(type == AMI_NSBM_TRUECOLOUR) {
+                       if((tbm = ami_rtg_allocbitmap(bitmap->width, 
bitmap->height, 32, 0,
+                                                                               
friendbm, AMI_BITMAP_FORMAT))) {
+                               
ami_rtg_writepixelarray(amiga_bitmap_get_buffer(bitmap),
+                                                                               
tbm, bitmap->width, bitmap->height,
+                                                                               
bitmap->width * 4, AMI_BITMAP_FORMAT);
+                       }
+               } else {
+                       if((tbm = ami_rtg_allocbitmap(bitmap->width, 
bitmap->height,
+                                                                               
8, 0, friendbm, AMI_BITMAP_FORMAT))) {
+
+                               struct RastPort rp;
+                               InitRastPort(&rp);
+                               rp.BitMap = tbm;
+                               ULONG dithermode = DITHERMODE_NONE;
+
+                               if(nsoption_int(dither_quality) == 1) {
+                                       dithermode = DITHERMODE_EDD;
+                               } else if(nsoption_int(dither_quality) == 2) {
+                                       dithermode = DITHERMODE_FS;
+                               }
+
+                               ami_bitmap_rgba_to_argb(bitmap);
+                               bitmap->psm = CreatePenShareMap(TAG_DONE);
+                               AddPixelArray(bitmap->psm, (ULONG 
*)amiga_bitmap_get_buffer(bitmap),
+                                                               bitmap->width, 
bitmap->height,
+                                                               
GGFX_PixelFormat, PIXFMT_0RGB_32, TAG_DONE);
+
+                               bitmap->drawhandle = 
ObtainDrawHandle(bitmap->psm, &rp, scrn->ViewPort.ColorMap,
+                                                                               
GGFX_DitherMode, dithermode,
+                                                                               
TAG_DONE);
+
+                               APTR ddh = 
CreateDirectDrawHandle(bitmap->drawhandle,
+                                                                               
bitmap->width, bitmap->height,
+                                                                               
bitmap->width, bitmap->height, NULL);
+
+                               DirectDrawTrueColor(ddh, (ULONG 
*)amiga_bitmap_get_buffer(bitmap), 0, 0, TAG_DONE);
+                               DeleteDirectDrawHandle(ddh);
+                               ami_bitmap_argb_to_rgba(bitmap);
+                       }
                }
 
                if(nsoption_int(cache_bitmaps) == 2)
@@ -427,7 +470,7 @@ static inline struct BitMap 
*ami_bitmap_get_truecolour(struct bitmap *bitmap,int
                        bitmap->nativebm = tbm;
                        bitmap->nativebmwidth = bitmap->width;
                        bitmap->nativebmheight = bitmap->height;
-                       bitmap->native = AMI_NSBM_TRUECOLOUR;
+                       bitmap->native = type;
                }
        }
 
@@ -435,25 +478,29 @@ static inline struct BitMap 
*ami_bitmap_get_truecolour(struct bitmap *bitmap,int
        {
                struct BitMap *scaledbm;
                struct BitScaleArgs bsa;
+               int depth = 32;
+               if(type == AMI_NSBM_PALETTEMAPPED) depth = 8;
 
-               scaledbm = ami_rtg_allocbitmap(width, height, 32, 0,
+               scaledbm = ami_rtg_allocbitmap(width, height, depth, 0,
                                                                        
friendbm, AMI_BITMAP_FORMAT);
 #ifdef __amigaos4__
-               if(__builtin_expect(GfxBase->LibNode.lib_Version >= 53, 1)) {
-               /* AutoDoc says v52, but this function isn't in OS4.0, so 
checking for v53 (OS4.1) */
+               if(__builtin_expect(((GfxBase->LibNode.lib_Version >= 53) &&
+                       (type == AMI_NSBM_TRUECOLOUR)), 1)) {
+                       /* AutoDoc says v52, but this function isn't in OS4.0, 
so checking for v53 (OS4.1)
+                        * Additionally, when we use friend BitMaps in non 
32-bit modes it freezes the OS */
                        uint32 flags = 0;
                        if(nsoption_bool(scale_quality)) flags |= 
COMPFLAG_SrcFilter;
                        
                        CompositeTags(COMPOSITE_Src, tbm, scaledbm,
-                                               
COMPTAG_ScaleX,COMP_FLOAT_TO_FIX((float)width/bitmap->width),
-                                               
COMPTAG_ScaleY,COMP_FLOAT_TO_FIX((float)height/bitmap->height),
+                                               COMPTAG_ScaleX, 
COMP_FLOAT_TO_FIX((float)width/bitmap->width),
+                                               COMPTAG_ScaleY, 
COMP_FLOAT_TO_FIX((float)height/bitmap->height),
                                                COMPTAG_Flags, flags,
-                                               COMPTAG_DestX,0,
-                                               COMPTAG_DestY,0,
-                                               COMPTAG_DestWidth,width,
-                                               COMPTAG_DestHeight,height,
-                                               COMPTAG_OffsetX,0,
-                                               COMPTAG_OffsetY,0,
+                                               COMPTAG_DestX, 0,
+                                               COMPTAG_DestY, 0,
+                                               COMPTAG_DestWidth, width,
+                                               COMPTAG_DestHeight, height,
+                                               COMPTAG_OffsetX, 0,
+                                               COMPTAG_OffsetY, 0,
                                                COMPTAG_FriendBitMap, 
scrn->RastPort.BitMap,
                                                TAG_DONE);
                } else /* Do it the old-fashioned way.  This is pretty slow, 
even on OS4.1 */
@@ -487,13 +534,23 @@ static inline struct BitMap 
*ami_bitmap_get_truecolour(struct bitmap *bitmap,int
                        bitmap->nativebm = tbm;
                        bitmap->nativebmwidth = width;
                        bitmap->nativebmheight = height;
-                       bitmap->native = AMI_NSBM_TRUECOLOUR;
+                       bitmap->native = type;
                }
        }
 
        return tbm;
 }
 
+
+static inline struct BitMap *ami_bitmap_get_truecolour(struct bitmap 
*bitmap,int width,int height,struct BitMap *friendbm)
+{
+       if((bitmap->native != AMI_NSBM_NONE) && (bitmap->native != 
AMI_NSBM_TRUECOLOUR)) {
+               amiga_bitmap_modified(bitmap);
+       }
+
+       return ami_bitmap_get_generic(bitmap, width, height, friendbm, 
AMI_NSBM_TRUECOLOUR);
+}
+
 PLANEPTR ami_bitmap_get_mask(struct bitmap *bitmap, int width,
                        int height, struct BitMap *n_bm)
 {
@@ -525,62 +582,22 @@ PLANEPTR ami_bitmap_get_mask(struct bitmap *bitmap, int 
width,
 }
 
 static inline struct BitMap *ami_bitmap_get_palettemapped(struct bitmap 
*bitmap,
-                                       int width, int height)
+                                       int width, int height, struct BitMap 
*friendbm)
 {
-       struct BitMap *dtbm;
-
        if((bitmap->native != AMI_NSBM_NONE) && (bitmap->native != 
AMI_NSBM_PALETTEMAPPED)) {
                amiga_bitmap_modified(bitmap);
        }
 
-       /* Dispose the DataTypes object if we've performed a layout already,
-               and we need to scale, as scaling can only be performed before
-               the first GM_LAYOUT */
-       
-       if(bitmap->dto &&
-                       ((bitmap->nativebmwidth != width) ||
-                       (bitmap->nativebmheight != height))) {
-               DisposeDTObject(bitmap->dto);
-               bitmap->dto = NULL;
-       }
-       
-       if(bitmap->dto == NULL) {
-               bitmap->dto = ami_datatype_object_from_bitmap(bitmap);
-
-               SetDTAttrs(bitmap->dto, NULL, NULL,
-                               PDTA_Screen, scrn,
-                               PDTA_ScaleQuality, nsoption_bool(scale_quality),
-                               PDTA_DitherQuality, 
nsoption_int(dither_quality),
-                               PDTA_FreeSourceBitMap, TRUE,
-                               TAG_DONE);
-
-               if((bitmap->width != width) || (bitmap->height != height)) {
-                       IDoMethod(bitmap->dto, PDTM_SCALE, width, height, 0);
-               }
-               
-               if((DoDTMethod(bitmap->dto, 0, 0, DTM_PROCLAYOUT, 0, 1)) == 0)
-                       return NULL;
-       }
-       
-       GetDTAttrs(bitmap->dto, 
-               PDTA_DestBitMap, &dtbm,
-               TAG_END);
-       
-       bitmap->nativebmwidth = width;
-       bitmap->nativebmheight = height;
-
-       /**\todo Native bitmaps are stored as DataTypes Objects here?
-          This is sub-optimal and they should be cached as BitMaps according 
to user
-          preferences */
-       bitmap->native = AMI_NSBM_PALETTEMAPPED;
-       return dtbm;
+       return ami_bitmap_get_generic(bitmap, width, height, friendbm, 
AMI_NSBM_PALETTEMAPPED);
 }
 
 struct BitMap *ami_bitmap_get_native(struct bitmap *bitmap,
                                int width, int height, struct BitMap *friendbm)
 {
+       if(bitmap == NULL) return NULL;
+
        if(__builtin_expect(ami_plot_screen_is_palettemapped() == true, 0)) {
-               return ami_bitmap_get_palettemapped(bitmap, width, height);
+               return ami_bitmap_get_palettemapped(bitmap, width, height, 
friendbm);
        } else {
                return ami_bitmap_get_truecolour(bitmap, width, height, 
friendbm);
        }
@@ -673,12 +690,6 @@ void ami_bitmap_set_icondata(struct bitmap *bm, ULONG 
*icondata)
        bm->icondata = icondata;
 }
 
-bool ami_bitmap_has_dto(struct bitmap *bm)
-{
-       if(bm->dto) return true;
-               else return false;
-}
-
 bool ami_bitmap_is_nativebm(struct bitmap *bm, struct BitMap *nbm)
 {
        if(bm->nativebm == nbm) return true;
diff --git a/amiga/bitmap.h b/amiga/bitmap.h
index 743cd8f..d7dd70b 100755
--- a/amiga/bitmap.h
+++ b/amiga/bitmap.h
@@ -83,16 +83,6 @@ ULONG *ami_bitmap_get_icondata(struct bitmap *bm);
 void ami_bitmap_set_icondata(struct bitmap *bm, ULONG *icondata);
 
 /**
- * Test if a bitmap has an associated DataTypes object.
- *
- * \param  bm  a bitmap, as returned by bitmap_create()
- * \return true if the BitMap has a DataTypes object
- *
- * This function probably shouldn't be used!
- */
-bool ami_bitmap_has_dto(struct bitmap *bm);
-
-/**
  * Test if a BitMap is owned by a bitmap.
  *
  * \param  bm  a bitmap, as returned by bitmap_create()
diff --git a/amiga/gui.c b/amiga/gui.c
index 9227b70..9c89084 100644
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -3921,6 +3921,7 @@ gui_window_create(struct browser_window *bw,
                    (strcmp(nsoption_charp(pubscreen_name), "Workbench") == 0))
                                iconifygadget = TRUE;
 
+               LOG("Creating menu");
                struct Menu *menu = ami_menu_create(g->shared);
 
                NewList(&g->shared->tab_list);
diff --git a/amiga/gui_options.c b/amiga/gui_options.c
index 4ac5464..221b0da 100755
--- a/amiga/gui_options.c
+++ b/amiga/gui_options.c
@@ -505,7 +505,7 @@ void ami_gui_opts_open(void)
        BOOL proxyhostdisabled = TRUE, proxyauthdisabled = TRUE, 
proxybypassdisabled = FALSE;
        BOOL disableanims, animspeeddisabled = FALSE, acceptlangdisabled = 
FALSE;
        BOOL scaleselected = nsoption_bool(scale_quality), scaledisabled = 
FALSE;
-       BOOL ditherdisable = TRUE, nativebm_disable = FALSE;
+       BOOL ditherdisable = TRUE;
        BOOL download_notify_disabled = FALSE, tab_always_show_disabled = FALSE;
        BOOL ptr_disable = FALSE;
        char animspeed[10];
@@ -554,7 +554,6 @@ void ami_gui_opts_open(void)
 
        if(ami_plot_screen_is_palettemapped() == true) {
                ditherdisable = FALSE;
-               nativebm_disable = TRUE;
        }
 
        if(nsoption_bool(http_proxy) == true)
@@ -1022,7 +1021,6 @@ void ami_gui_opts_open(void)
                                                                        
LAYOUT_AddChild, gow->objects[GID_OPTS_NATIVEBM] = ChooserObj,
                                                                                
GA_ID, GID_OPTS_NATIVEBM,
                                                                                
GA_RelVerify, TRUE,
-                                                                               
GA_Disabled, nativebm_disable,
                                                                                
CHOOSER_PopUp, TRUE,
 #ifdef __amigaos4__
                                                                                
CHOOSER_LabelArray, nativebmopts,
diff --git a/amiga/libs.c b/amiga/libs.c
index 7c130a8..2303d35 100644
--- a/amiga/libs.c
+++ b/amiga/libs.c
@@ -169,6 +169,8 @@ AMINS_LIB_STRUCT(Locale);
 AMINS_LIB_STRUCT(P96);
 AMINS_LIB_STRUCT(Workbench);
 
+AMINS_LIB_STRUCT(GuiGFX);
+
 AMINS_CLASS_STRUCT(ARexx);
 AMINS_CLASS_STRUCT(Bevel);
 AMINS_CLASS_STRUCT(BitMap);
@@ -224,14 +226,16 @@ bool ami_libs_open(void)
        if(GfxBase->LibNode.lib_Version < 54)
                AMINS_LIB_OPEN("Picasso96API.library",  0, P96,         "main", 
       1, false)
 
+       /* Non-OS provided libraries */
+       AMINS_LIB_OPEN("guigfx.library",    9, GuiGFX,   "main",        1, true)
+
        /* NB: timer.device is opened in schedule.c (ultimately by the 
scheduler process).
         * The library base and interface are obtained there, rather than here, 
due to
         * the additional complexities of opening devices, which aren't 
important here
         * (as we only need the library interface), but are important for the 
scheduler
         * (as it also uses the device interface).  We trust that the scheduler 
has
-        * initialised before any other code requires the timer's library 
interface
-        * (this is ensured by waiting for the scheduler to start up) and that 
it is
-        * OK to use a child process' timer interface, to avoid opening it 
twice.
+        * initialised before any other code requires the timer's library 
interface,
+        * to avoid opening it twice.
         */
 
        /* BOOPSI classes.
@@ -298,6 +302,8 @@ void ami_libs_close(void)
        AMINS_CLASS_CLOSE(Window)
 
        /* Libraries */
+       AMINS_LIB_CLOSE(GuiGFX)
+
        AMINS_LIB_CLOSE(Asl)
        AMINS_LIB_CLOSE(DataTypes)
        AMINS_LIB_CLOSE(Diskfont)
diff --git a/amiga/plotters.c b/amiga/plotters.c
index 9c4f8b0..9c3c3c7 100644
--- a/amiga/plotters.c
+++ b/amiga/plotters.c
@@ -49,6 +49,8 @@
 #include "amiga/rtg.h"
 #include "amiga/utf8.h"
 
+//#define AMI_PLOTTER_DEBUG 1
+
 HOOKF(void, ami_bitmap_tile_hook, struct RastPort *, rp, struct 
BackFillMessage *);
 
 struct bfbitmap {
@@ -153,6 +155,8 @@ void ami_init_layers(struct gui_globals *gg, ULONG width, 
ULONG height, bool for
                /* Screen depth is reported as 24 even when it's actually 
32-bit.
                 * We get freezes and other problems on OS4 if we befriend at 
any
                 * other depths, hence this check.
+                * \todo use friend BitMaps but avoid CompositeTags() at 
non-32-bit
+                * as that seems to be the cause of the problems.
                 */
                if((depth >= 24) && (force32bit == false)) friend = 
scrn->RastPort.BitMap;
 #endif
@@ -613,8 +617,7 @@ static bool ami_bitmap(int x, int y, int width, int height, 
struct bitmap *bitma
 #endif
        }
 
-       if((ami_bitmap_has_dto(bitmap) == false) && 
(ami_bitmap_is_nativebm(bitmap, tbm) == false)) {
-               /**\todo is this logic logical? */
+       if((ami_bitmap_is_nativebm(bitmap, tbm) == false)) {
                ami_rtg_freebitmap(tbm);
        }
 
@@ -719,7 +722,7 @@ static bool ami_bitmap_tile(int x, int y, int width, int 
height,
 #endif
                FreeVec(bfh);
 
-       if((ami_bitmap_has_dto(bitmap) == false) && 
(ami_bitmap_is_nativebm(bitmap, tbm) == false)) {
+       if((ami_bitmap_is_nativebm(bitmap, tbm) == false)) {
                /**\todo is this logic logical? */
                ami_rtg_freebitmap(tbm);
        }


-----------------------------------------------------------------------

Summary of changes:
 amiga/Makefile.target |    6 +-
 amiga/bitmap.c        |  217 ++++++++++++++++++++++++++-----------------------
 amiga/bitmap.h        |   10 ---
 amiga/gui.c           |    1 +
 amiga/gui_options.c   |    4 +-
 amiga/libs.c          |   12 ++-
 amiga/plotters.c      |    9 +-
 7 files changed, 134 insertions(+), 125 deletions(-)

diff --git a/amiga/Makefile.target b/amiga/Makefile.target
index 8e16780..54957f7 100644
--- a/amiga/Makefile.target
+++ b/amiga/Makefile.target
@@ -50,10 +50,10 @@ else
   LDFLAGS += $(shell $(PKG_CONFIG) --libs tre)
   LDFLAGS += -L$(GCCSDK_INSTALL_ENV)/lib
 
+  LDFLAGS += -lpbl -liconv
+
   ifeq ($(SUBTARGET),os3)
-    LDFLAGS += -lpbl -liconv -lamiga
-  else
-    LDFLAGS += -lpbl -liconv
+    LDFLAGS += -lamiga -lm
   endif
 endif
 
diff --git a/amiga/bitmap.c b/amiga/bitmap.c
index 9f53444..6ef5157 100644
--- a/amiga/bitmap.c
+++ b/amiga/bitmap.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2008, 2009, 2012 Chris Young <[email protected]>
+ * Copyright 2008, 2009, 2012, 2016 Chris Young 
<[email protected]>
  *
  * This file is part of NetSurf, http://www.netsurf-browser.org/
  *
@@ -30,11 +30,20 @@
 #include <proto/dos.h>
 #include <proto/intuition.h>
 #include <proto/utility.h>
+
+#include <proto/guigfx.h>
+#include <guigfx/guigfx.h>
+#include <render/render.h>
+#ifndef __amigaos4__
+#include <inline/guigfx.h>
+#endif
+
 #ifdef __amigaos4__
 #include <sys/param.h>
 #endif
 #include "assert.h"
 
+#include "utils/log.h"
 #include "utils/nsoption.h"
 #include "utils/nsurl.h"
 #include "utils/messages.h"
@@ -60,6 +69,8 @@ struct bitmap {
        int nativebmheight;
        PLANEPTR native_mask;
        Object *dto;
+       APTR drawhandle;
+       APTR psm;
        struct nsurl *url;   /* temporary storage space */
        char *title; /* temporary storage space */
        ULONG *icondata; /* for appicons */
@@ -94,7 +105,8 @@ void *amiga_bitmap_create(int width, int height, unsigned 
int state)
        bitmap->nativebmwidth = 0;
        bitmap->nativebmheight = 0;
        bitmap->native_mask = NULL;
-       bitmap->dto = NULL;
+       bitmap->drawhandle = NULL;
+       bitmap->psm = NULL;
        bitmap->url = NULL;
        bitmap->title = NULL;
        bitmap->icondata = NULL;
@@ -134,16 +146,13 @@ void amiga_bitmap_destroy(void *bitmap)
 
        if(bm)
        {
-               if((bm->nativebm) && (bm->native == AMI_NSBM_TRUECOLOUR)) {
+               if((bm->nativebm)) { // && (bm->native == AMI_NSBM_TRUECOLOUR)) 
{
                        ami_rtg_freebitmap(bm->nativebm);
                }
 
-               if(bm->dto) {
-                       /**\todo find out why this crashes on exit but not 
during normal program execution */
-                       DisposeDTObject(bm->dto);
-               }
-
                if(bm->native_mask) FreeRaster(bm->native_mask, bm->width, 
bm->height);
+               if(bm->drawhandle) ReleaseDrawHandle(bm->drawhandle);
+               if(bm->psm) DeletePenShareMap(bm->psm);
                FreeVec(bm->pixdata);
 
                if(bm->url) nsurl_unref(bm->url);
@@ -152,7 +161,8 @@ void amiga_bitmap_destroy(void *bitmap)
                bm->pixdata = NULL;
                bm->nativebm = NULL;
                bm->native_mask = NULL;
-               bm->dto = NULL;
+               bm->drawhandle = NULL;
+               bm->psm = NULL;
                bm->url = NULL;
                bm->title = NULL;
        
@@ -192,13 +202,15 @@ void amiga_bitmap_modified(void *bitmap)
 {
        struct bitmap *bm = bitmap;
 
-       if((bm->nativebm) && (bm->native == AMI_NSBM_TRUECOLOUR))
+       if((bm->nativebm)) // && (bm->native == AMI_NSBM_TRUECOLOUR))
                ami_rtg_freebitmap(bm->nativebm);
                
-       if(bm->dto) DisposeDTObject(bm->dto);
+       if(bm->drawhandle) ReleaseDrawHandle(bm->drawhandle);
+       if(bm->psm) DeletePenShareMap(bm->psm);
        if(bm->native_mask) FreeRaster(bm->native_mask, bm->width, bm->height);
        bm->nativebm = NULL;
-       bm->dto = NULL;
+       bm->drawhandle = NULL;
+       bm->psm = NULL;
        bm->native_mask = NULL;
        bm->native = AMI_NSBM_NONE;
 }
@@ -288,17 +300,25 @@ static size_t bitmap_get_bpp(void *vbitmap)
        return 4;
 }
 
-#ifdef __amigaos4__
 static void ami_bitmap_argb_to_rgba(struct bitmap *bm)
 {
        if(bm == NULL) return;
        
        ULONG *data = (ULONG *)amiga_bitmap_get_buffer(bm);
-       for(int i = 0; i < ((amiga_bitmap_get_rowstride(bm) / sizeof(ULONG)) * 
bm->height); i++) { 
+       for(int i = 0; i < (bm->width * bm->height); i++) {
                data[i] = (data[i] << 8) | (data[i] >> 24);
        }
 }
-#endif
+
+static void ami_bitmap_rgba_to_argb(struct bitmap *bm)
+{
+       if(bm == NULL) return;
+       
+       ULONG *data = (ULONG *)amiga_bitmap_get_buffer(bm);
+       for(int i = 0; i < (bm->width * bm->height); i++) {
+               data[i] = (data[i] >> 8) | (data[i] << 24);
+       }
+}
 
 #ifdef BITMAP_DUMP
 void bitmap_dump(struct bitmap *bitmap)
@@ -385,41 +405,64 @@ struct bitmap *ami_bitmap_from_datatype(char *filename)
        return bm;
 }
 
-static inline struct BitMap *ami_bitmap_get_truecolour(struct bitmap 
*bitmap,int width,int height,struct BitMap *friendbm)
+static inline struct BitMap *ami_bitmap_get_generic(struct bitmap *bitmap, int 
width, int height, struct BitMap *friendbm, int type)
 {
        struct BitMap *tbm = NULL;
 
-       if(!bitmap) return NULL;
-
-       if((bitmap->native != AMI_NSBM_NONE) && (bitmap->native != 
AMI_NSBM_TRUECOLOUR)) {
-               amiga_bitmap_modified(bitmap);
-       }
-
        if(bitmap->nativebm)
        {
-               if((bitmap->nativebmwidth == width) && 
(bitmap->nativebmheight==height))
-               {
+               if((bitmap->nativebmwidth == width) && (bitmap->nativebmheight 
== height)) {
                        tbm = bitmap->nativebm;
                        return tbm;
-               }
-               else if((bitmap->nativebmwidth == bitmap->width) && 
(bitmap->nativebmheight==bitmap->height))
-               {
+               } else if((bitmap->nativebmwidth == bitmap->width) &&
+                               (bitmap->nativebmheight == bitmap->height)) { 
// >= width/height ?
                        tbm = bitmap->nativebm;
-               }
-               else
-               {
-                       if(bitmap->nativebm) 
ami_rtg_freebitmap(bitmap->nativebm);
-                       bitmap->nativebm = NULL;
+               } else {
+                       if(bitmap->nativebm) amiga_bitmap_modified(bitmap);
                }
        }
 
-       if(!tbm)
-       {
-               if((tbm = ami_rtg_allocbitmap(bitmap->width, bitmap->height, 
32, 0,
-                                                               friendbm, 
AMI_BITMAP_FORMAT))) {
-                       ami_rtg_writepixelarray(amiga_bitmap_get_buffer(bitmap),
-                                                               tbm, 
bitmap->width, bitmap->height,
-                                                               bitmap->width * 
4, AMI_BITMAP_FORMAT);
+       if(tbm == NULL) {
+               if(type == AMI_NSBM_TRUECOLOUR) {
+                       if((tbm = ami_rtg_allocbitmap(bitmap->width, 
bitmap->height, 32, 0,
+                                                                               
friendbm, AMI_BITMAP_FORMAT))) {
+                               
ami_rtg_writepixelarray(amiga_bitmap_get_buffer(bitmap),
+                                                                               
tbm, bitmap->width, bitmap->height,
+                                                                               
bitmap->width * 4, AMI_BITMAP_FORMAT);
+                       }
+               } else {
+                       if((tbm = ami_rtg_allocbitmap(bitmap->width, 
bitmap->height,
+                                                                               
8, 0, friendbm, AMI_BITMAP_FORMAT))) {
+
+                               struct RastPort rp;
+                               InitRastPort(&rp);
+                               rp.BitMap = tbm;
+                               ULONG dithermode = DITHERMODE_NONE;
+
+                               if(nsoption_int(dither_quality) == 1) {
+                                       dithermode = DITHERMODE_EDD;
+                               } else if(nsoption_int(dither_quality) == 2) {
+                                       dithermode = DITHERMODE_FS;
+                               }
+
+                               ami_bitmap_rgba_to_argb(bitmap);
+                               bitmap->psm = CreatePenShareMap(TAG_DONE);
+                               AddPixelArray(bitmap->psm, (ULONG 
*)amiga_bitmap_get_buffer(bitmap),
+                                                               bitmap->width, 
bitmap->height,
+                                                               
GGFX_PixelFormat, PIXFMT_0RGB_32, TAG_DONE);
+
+                               bitmap->drawhandle = 
ObtainDrawHandle(bitmap->psm, &rp, scrn->ViewPort.ColorMap,
+                                                                               
GGFX_DitherMode, dithermode,
+                                                                               
TAG_DONE);
+
+                               APTR ddh = 
CreateDirectDrawHandle(bitmap->drawhandle,
+                                                                               
bitmap->width, bitmap->height,
+                                                                               
bitmap->width, bitmap->height, NULL);
+
+                               DirectDrawTrueColor(ddh, (ULONG 
*)amiga_bitmap_get_buffer(bitmap), 0, 0, TAG_DONE);
+                               DeleteDirectDrawHandle(ddh);
+                               ami_bitmap_argb_to_rgba(bitmap);
+                       }
                }
 
                if(nsoption_int(cache_bitmaps) == 2)
@@ -427,7 +470,7 @@ static inline struct BitMap 
*ami_bitmap_get_truecolour(struct bitmap *bitmap,int
                        bitmap->nativebm = tbm;
                        bitmap->nativebmwidth = bitmap->width;
                        bitmap->nativebmheight = bitmap->height;
-                       bitmap->native = AMI_NSBM_TRUECOLOUR;
+                       bitmap->native = type;
                }
        }
 
@@ -435,25 +478,29 @@ static inline struct BitMap 
*ami_bitmap_get_truecolour(struct bitmap *bitmap,int
        {
                struct BitMap *scaledbm;
                struct BitScaleArgs bsa;
+               int depth = 32;
+               if(type == AMI_NSBM_PALETTEMAPPED) depth = 8;
 
-               scaledbm = ami_rtg_allocbitmap(width, height, 32, 0,
+               scaledbm = ami_rtg_allocbitmap(width, height, depth, 0,
                                                                        
friendbm, AMI_BITMAP_FORMAT);
 #ifdef __amigaos4__
-               if(__builtin_expect(GfxBase->LibNode.lib_Version >= 53, 1)) {
-               /* AutoDoc says v52, but this function isn't in OS4.0, so 
checking for v53 (OS4.1) */
+               if(__builtin_expect(((GfxBase->LibNode.lib_Version >= 53) &&
+                       (type == AMI_NSBM_TRUECOLOUR)), 1)) {
+                       /* AutoDoc says v52, but this function isn't in OS4.0, 
so checking for v53 (OS4.1)
+                        * Additionally, when we use friend BitMaps in non 
32-bit modes it freezes the OS */
                        uint32 flags = 0;
                        if(nsoption_bool(scale_quality)) flags |= 
COMPFLAG_SrcFilter;
                        
                        CompositeTags(COMPOSITE_Src, tbm, scaledbm,
-                                               
COMPTAG_ScaleX,COMP_FLOAT_TO_FIX((float)width/bitmap->width),
-                                               
COMPTAG_ScaleY,COMP_FLOAT_TO_FIX((float)height/bitmap->height),
+                                               COMPTAG_ScaleX, 
COMP_FLOAT_TO_FIX((float)width/bitmap->width),
+                                               COMPTAG_ScaleY, 
COMP_FLOAT_TO_FIX((float)height/bitmap->height),
                                                COMPTAG_Flags, flags,
-                                               COMPTAG_DestX,0,
-                                               COMPTAG_DestY,0,
-                                               COMPTAG_DestWidth,width,
-                                               COMPTAG_DestHeight,height,
-                                               COMPTAG_OffsetX,0,
-                                               COMPTAG_OffsetY,0,
+                                               COMPTAG_DestX, 0,
+                                               COMPTAG_DestY, 0,
+                                               COMPTAG_DestWidth, width,
+                                               COMPTAG_DestHeight, height,
+                                               COMPTAG_OffsetX, 0,
+                                               COMPTAG_OffsetY, 0,
                                                COMPTAG_FriendBitMap, 
scrn->RastPort.BitMap,
                                                TAG_DONE);
                } else /* Do it the old-fashioned way.  This is pretty slow, 
even on OS4.1 */
@@ -487,13 +534,23 @@ static inline struct BitMap 
*ami_bitmap_get_truecolour(struct bitmap *bitmap,int
                        bitmap->nativebm = tbm;
                        bitmap->nativebmwidth = width;
                        bitmap->nativebmheight = height;
-                       bitmap->native = AMI_NSBM_TRUECOLOUR;
+                       bitmap->native = type;
                }
        }
 
        return tbm;
 }
 
+
+static inline struct BitMap *ami_bitmap_get_truecolour(struct bitmap 
*bitmap,int width,int height,struct BitMap *friendbm)
+{
+       if((bitmap->native != AMI_NSBM_NONE) && (bitmap->native != 
AMI_NSBM_TRUECOLOUR)) {
+               amiga_bitmap_modified(bitmap);
+       }
+
+       return ami_bitmap_get_generic(bitmap, width, height, friendbm, 
AMI_NSBM_TRUECOLOUR);
+}
+
 PLANEPTR ami_bitmap_get_mask(struct bitmap *bitmap, int width,
                        int height, struct BitMap *n_bm)
 {
@@ -525,62 +582,22 @@ PLANEPTR ami_bitmap_get_mask(struct bitmap *bitmap, int 
width,
 }
 
 static inline struct BitMap *ami_bitmap_get_palettemapped(struct bitmap 
*bitmap,
-                                       int width, int height)
+                                       int width, int height, struct BitMap 
*friendbm)
 {
-       struct BitMap *dtbm;
-
        if((bitmap->native != AMI_NSBM_NONE) && (bitmap->native != 
AMI_NSBM_PALETTEMAPPED)) {
                amiga_bitmap_modified(bitmap);
        }
 
-       /* Dispose the DataTypes object if we've performed a layout already,
-               and we need to scale, as scaling can only be performed before
-               the first GM_LAYOUT */
-       
-       if(bitmap->dto &&
-                       ((bitmap->nativebmwidth != width) ||
-                       (bitmap->nativebmheight != height))) {
-               DisposeDTObject(bitmap->dto);
-               bitmap->dto = NULL;
-       }
-       
-       if(bitmap->dto == NULL) {
-               bitmap->dto = ami_datatype_object_from_bitmap(bitmap);
-
-               SetDTAttrs(bitmap->dto, NULL, NULL,
-                               PDTA_Screen, scrn,
-                               PDTA_ScaleQuality, nsoption_bool(scale_quality),
-                               PDTA_DitherQuality, 
nsoption_int(dither_quality),
-                               PDTA_FreeSourceBitMap, TRUE,
-                               TAG_DONE);
-
-               if((bitmap->width != width) || (bitmap->height != height)) {
-                       IDoMethod(bitmap->dto, PDTM_SCALE, width, height, 0);
-               }
-               
-               if((DoDTMethod(bitmap->dto, 0, 0, DTM_PROCLAYOUT, 0, 1)) == 0)
-                       return NULL;
-       }
-       
-       GetDTAttrs(bitmap->dto, 
-               PDTA_DestBitMap, &dtbm,
-               TAG_END);
-       
-       bitmap->nativebmwidth = width;
-       bitmap->nativebmheight = height;
-
-       /**\todo Native bitmaps are stored as DataTypes Objects here?
-          This is sub-optimal and they should be cached as BitMaps according 
to user
-          preferences */
-       bitmap->native = AMI_NSBM_PALETTEMAPPED;
-       return dtbm;
+       return ami_bitmap_get_generic(bitmap, width, height, friendbm, 
AMI_NSBM_PALETTEMAPPED);
 }
 
 struct BitMap *ami_bitmap_get_native(struct bitmap *bitmap,
                                int width, int height, struct BitMap *friendbm)
 {
+       if(bitmap == NULL) return NULL;
+
        if(__builtin_expect(ami_plot_screen_is_palettemapped() == true, 0)) {
-               return ami_bitmap_get_palettemapped(bitmap, width, height);
+               return ami_bitmap_get_palettemapped(bitmap, width, height, 
friendbm);
        } else {
                return ami_bitmap_get_truecolour(bitmap, width, height, 
friendbm);
        }
@@ -673,12 +690,6 @@ void ami_bitmap_set_icondata(struct bitmap *bm, ULONG 
*icondata)
        bm->icondata = icondata;
 }
 
-bool ami_bitmap_has_dto(struct bitmap *bm)
-{
-       if(bm->dto) return true;
-               else return false;
-}
-
 bool ami_bitmap_is_nativebm(struct bitmap *bm, struct BitMap *nbm)
 {
        if(bm->nativebm == nbm) return true;
diff --git a/amiga/bitmap.h b/amiga/bitmap.h
index 743cd8f..d7dd70b 100755
--- a/amiga/bitmap.h
+++ b/amiga/bitmap.h
@@ -83,16 +83,6 @@ ULONG *ami_bitmap_get_icondata(struct bitmap *bm);
 void ami_bitmap_set_icondata(struct bitmap *bm, ULONG *icondata);
 
 /**
- * Test if a bitmap has an associated DataTypes object.
- *
- * \param  bm  a bitmap, as returned by bitmap_create()
- * \return true if the BitMap has a DataTypes object
- *
- * This function probably shouldn't be used!
- */
-bool ami_bitmap_has_dto(struct bitmap *bm);
-
-/**
  * Test if a BitMap is owned by a bitmap.
  *
  * \param  bm  a bitmap, as returned by bitmap_create()
diff --git a/amiga/gui.c b/amiga/gui.c
index 9227b70..9c89084 100644
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -3921,6 +3921,7 @@ gui_window_create(struct browser_window *bw,
                    (strcmp(nsoption_charp(pubscreen_name), "Workbench") == 0))
                                iconifygadget = TRUE;
 
+               LOG("Creating menu");
                struct Menu *menu = ami_menu_create(g->shared);
 
                NewList(&g->shared->tab_list);
diff --git a/amiga/gui_options.c b/amiga/gui_options.c
index 4ac5464..221b0da 100755
--- a/amiga/gui_options.c
+++ b/amiga/gui_options.c
@@ -505,7 +505,7 @@ void ami_gui_opts_open(void)
        BOOL proxyhostdisabled = TRUE, proxyauthdisabled = TRUE, 
proxybypassdisabled = FALSE;
        BOOL disableanims, animspeeddisabled = FALSE, acceptlangdisabled = 
FALSE;
        BOOL scaleselected = nsoption_bool(scale_quality), scaledisabled = 
FALSE;
-       BOOL ditherdisable = TRUE, nativebm_disable = FALSE;
+       BOOL ditherdisable = TRUE;
        BOOL download_notify_disabled = FALSE, tab_always_show_disabled = FALSE;
        BOOL ptr_disable = FALSE;
        char animspeed[10];
@@ -554,7 +554,6 @@ void ami_gui_opts_open(void)
 
        if(ami_plot_screen_is_palettemapped() == true) {
                ditherdisable = FALSE;
-               nativebm_disable = TRUE;
        }
 
        if(nsoption_bool(http_proxy) == true)
@@ -1022,7 +1021,6 @@ void ami_gui_opts_open(void)
                                                                        
LAYOUT_AddChild, gow->objects[GID_OPTS_NATIVEBM] = ChooserObj,
                                                                                
GA_ID, GID_OPTS_NATIVEBM,
                                                                                
GA_RelVerify, TRUE,
-                                                                               
GA_Disabled, nativebm_disable,
                                                                                
CHOOSER_PopUp, TRUE,
 #ifdef __amigaos4__
                                                                                
CHOOSER_LabelArray, nativebmopts,
diff --git a/amiga/libs.c b/amiga/libs.c
index 7c130a8..2303d35 100644
--- a/amiga/libs.c
+++ b/amiga/libs.c
@@ -169,6 +169,8 @@ AMINS_LIB_STRUCT(Locale);
 AMINS_LIB_STRUCT(P96);
 AMINS_LIB_STRUCT(Workbench);
 
+AMINS_LIB_STRUCT(GuiGFX);
+
 AMINS_CLASS_STRUCT(ARexx);
 AMINS_CLASS_STRUCT(Bevel);
 AMINS_CLASS_STRUCT(BitMap);
@@ -224,14 +226,16 @@ bool ami_libs_open(void)
        if(GfxBase->LibNode.lib_Version < 54)
                AMINS_LIB_OPEN("Picasso96API.library",  0, P96,         "main", 
       1, false)
 
+       /* Non-OS provided libraries */
+       AMINS_LIB_OPEN("guigfx.library",    9, GuiGFX,   "main",        1, true)
+
        /* NB: timer.device is opened in schedule.c (ultimately by the 
scheduler process).
         * The library base and interface are obtained there, rather than here, 
due to
         * the additional complexities of opening devices, which aren't 
important here
         * (as we only need the library interface), but are important for the 
scheduler
         * (as it also uses the device interface).  We trust that the scheduler 
has
-        * initialised before any other code requires the timer's library 
interface
-        * (this is ensured by waiting for the scheduler to start up) and that 
it is
-        * OK to use a child process' timer interface, to avoid opening it 
twice.
+        * initialised before any other code requires the timer's library 
interface,
+        * to avoid opening it twice.
         */
 
        /* BOOPSI classes.
@@ -298,6 +302,8 @@ void ami_libs_close(void)
        AMINS_CLASS_CLOSE(Window)
 
        /* Libraries */
+       AMINS_LIB_CLOSE(GuiGFX)
+
        AMINS_LIB_CLOSE(Asl)
        AMINS_LIB_CLOSE(DataTypes)
        AMINS_LIB_CLOSE(Diskfont)
diff --git a/amiga/plotters.c b/amiga/plotters.c
index 9c4f8b0..9c3c3c7 100644
--- a/amiga/plotters.c
+++ b/amiga/plotters.c
@@ -49,6 +49,8 @@
 #include "amiga/rtg.h"
 #include "amiga/utf8.h"
 
+//#define AMI_PLOTTER_DEBUG 1
+
 HOOKF(void, ami_bitmap_tile_hook, struct RastPort *, rp, struct 
BackFillMessage *);
 
 struct bfbitmap {
@@ -153,6 +155,8 @@ void ami_init_layers(struct gui_globals *gg, ULONG width, 
ULONG height, bool for
                /* Screen depth is reported as 24 even when it's actually 
32-bit.
                 * We get freezes and other problems on OS4 if we befriend at 
any
                 * other depths, hence this check.
+                * \todo use friend BitMaps but avoid CompositeTags() at 
non-32-bit
+                * as that seems to be the cause of the problems.
                 */
                if((depth >= 24) && (force32bit == false)) friend = 
scrn->RastPort.BitMap;
 #endif
@@ -613,8 +617,7 @@ static bool ami_bitmap(int x, int y, int width, int height, 
struct bitmap *bitma
 #endif
        }
 
-       if((ami_bitmap_has_dto(bitmap) == false) && 
(ami_bitmap_is_nativebm(bitmap, tbm) == false)) {
-               /**\todo is this logic logical? */
+       if((ami_bitmap_is_nativebm(bitmap, tbm) == false)) {
                ami_rtg_freebitmap(tbm);
        }
 
@@ -719,7 +722,7 @@ static bool ami_bitmap_tile(int x, int y, int width, int 
height,
 #endif
                FreeVec(bfh);
 
-       if((ami_bitmap_has_dto(bitmap) == false) && 
(ami_bitmap_is_nativebm(bitmap, tbm) == false)) {
+       if((ami_bitmap_is_nativebm(bitmap, tbm) == false)) {
                /**\todo is this logic logical? */
                ami_rtg_freebitmap(tbm);
        }


-- 
NetSurf Browser

_______________________________________________
netsurf-commits mailing list
[email protected]
http://listmaster.pepperfish.net/cgi-bin/mailman/listinfo/netsurf-commits-netsurf-browser.org

Reply via email to