summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Young <chris@unsatisfactorysoftware.co.uk>2011-01-08 00:08:47 +0000
committerChris Young <chris@unsatisfactorysoftware.co.uk>2011-01-08 00:08:47 +0000
commit7cde13feeec4bf1240950bdc845d60aec8f819c6 (patch)
tree3eaa9fafe416e66ebc2cf9dd60b794f9763bd58d
parent360f20b2878df8a5471764066cc4fd0af9d8abef (diff)
downloadnetsurf-7cde13feeec4bf1240950bdc845d60aec8f819c6.tar.gz
netsurf-7cde13feeec4bf1240950bdc845d60aec8f819c6.tar.bz2
Partially support 8-bit icons for superimpose
Fix memory leak svn path=/trunk/netsurf/; revision=11255
-rw-r--r--amiga/icon.c56
1 files changed, 49 insertions, 7 deletions
diff --git a/amiga/icon.c b/amiga/icon.c
index eefcd7695..70fa14a2d 100644
--- a/amiga/icon.c
+++ b/amiga/icon.c
@@ -106,8 +106,10 @@ bool amiga_icon_convert(struct content *c)
/* Check icon is direct mapped (truecolour) or palette-mapped colour.
We need additional code to handle planar icons */
- if((format != IDFMT_DIRECTMAPPED) && (format==IDFMT_PALETTEMAPPED))
+ if((format != IDFMT_DIRECTMAPPED) && (format==IDFMT_PALETTEMAPPED)) {
+ if(dobj) FreeDiskObject(dobj);
return false;
+ }
c->bitmap = bitmap_create(width, height, BITMAP_NEW);
if (!c->bitmap) {
@@ -162,6 +164,9 @@ bool amiga_icon_convert(struct content *c)
if(dobj) FreeDiskObject(dobj);
+ if(format==IDFMT_PALETTEMAPPED)
+ FreeVec(imagebufptr);
+
return true;
}
@@ -203,6 +208,8 @@ bool amiga_icon_clone(const struct content *old, struct content *new_content)
return true;
}
+#endif /* WITH_AMIGA_ICON */
+
ULONG *amiga_icon_convertcolouricon32(UBYTE *icondata, ULONG width, ULONG height,
ULONG trans, ULONG pals1, struct ColorRegister *pal1, int alpha)
{
@@ -247,8 +254,6 @@ ULONG *amiga_icon_convertcolouricon32(UBYTE *icondata, ULONG width, ULONG height
}
-#endif /* WITH_AMIGA_ICON */
-
void ami_superimpose_favicon(char *path, struct hlcache_handle *icon, char *type)
{
struct DiskObject *dobj = NULL;
@@ -257,6 +262,10 @@ void ami_superimpose_favicon(char *path, struct hlcache_handle *icon, char *type
ULONG width, height;
long format = 0;
int err = 0;
+ ULONG trans1, pals1;
+ ULONG trans2, pals2;
+ struct ColorRegister *pal1;
+ struct ColorRegister *pal2;
if(!type)
{
@@ -271,6 +280,8 @@ void ami_superimpose_favicon(char *path, struct hlcache_handle *icon, char *type
TAG_DONE);
}
+ if(dobj == NULL) return;
+
err = IconControl(dobj,
ICONCTRLA_GetImageDataFormat,&format,
ICONCTRLA_GetImageData1,&icondata1,
@@ -279,10 +290,31 @@ void ami_superimpose_favicon(char *path, struct hlcache_handle *icon, char *type
ICONCTRLA_GetHeight,&height,
TAG_DONE);
- /* Check icon is direct mapped (truecolour).
- * Quite a bit more code is needed for palette mapped and planar icons,
- * and OS4 default icons should all be truecolour anyway. */
- if(format == IDFMT_DIRECTMAPPED)
+ /* If we have a palette-mapped icon, convert it to a 32-bit one */
+ if(format == IDFMT_PALETTEMAPPED)
+ {
+ IconControl(dobj, ICONCTRLA_GetTransparentColor1, &trans1,
+ ICONCTRLA_GetPalette1, &pal1,
+ ICONCTRLA_GetPaletteSize1, &pals1,
+ ICONCTRLA_GetTransparentColor2, &trans2,
+ ICONCTRLA_GetPalette2, &pal2,
+ ICONCTRLA_GetPaletteSize2, &pals2,
+ TAG_DONE);
+
+ icondata1 = amiga_icon_convertcolouricon32((UBYTE *)icondata1,
+ width, height, trans1, pals1, pal1, 0xff);
+
+ icondata2 = amiga_icon_convertcolouricon32((UBYTE *)icondata2,
+ width, height, trans2, pals2, pal2, 0xff);
+
+ err = IconControl(dobj,
+ ICONCTRLA_SetImageDataFormat, IDFMT_DIRECTMAPPED,
+ ICONCTRLA_SetImageData1, icondata1,
+ ICONCTRLA_SetImageData2, icondata2,
+ TAG_DONE);
+ }
+
+ if((format == IDFMT_DIRECTMAPPED) || (format == IDFMT_PALETTEMAPPED))
{
if ((icon != NULL) && (content_get_type(icon) == CONTENT_ICO))
{
@@ -328,4 +360,14 @@ void ami_superimpose_favicon(char *path, struct hlcache_handle *icon, char *type
PutIconTags(path, dobj,
ICONPUTA_NotifyWorkbench, TRUE, TAG_DONE);
+
+ FreeDiskObject(dobj);
+
+ if(format == IDFMT_PALETTEMAPPED)
+ {
+ /* Free the 32-bit data we created */
+ FreeVec(icondata1);
+ FreeVec(icondata2);
+ }
+
}