summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Young <chris@unsatisfactorysoftware.co.uk>2009-05-16 14:50:30 +0000
committerChris Young <chris@unsatisfactorysoftware.co.uk>2009-05-16 14:50:30 +0000
commit478d953ea50169cab4ae57ba414c57332b17bf5f (patch)
tree4a47704d8c72555b846318dd117167ae5bdf84a0
parent750a6e624cf3ca0741d8fbc0a0ff3abae468a0cd (diff)
downloadnetsurf-478d953ea50169cab4ae57ba414c57332b17bf5f.tar.gz
netsurf-478d953ea50169cab4ae57ba414c57332b17bf5f.tar.bz2
Copy and save images in IFF ILBM format. Currently, the data in the BODY chunk is
wrong. svn path=/trunk/netsurf/; revision=7516
-rw-r--r--!NetSurf/Resources/de/Messages3
-rw-r--r--!NetSurf/Resources/en/Messages3
-rw-r--r--!NetSurf/Resources/fr/Messages3
-rwxr-xr-x!NetSurf/Resources/it/Messages3
-rw-r--r--!NetSurf/Resources/nl/Messages3
-rw-r--r--amiga/bitmap.c18
-rwxr-xr-xamiga/bitmap.h2
-rwxr-xr-xamiga/clipboard.c84
-rwxr-xr-xamiga/clipboard.h5
-rwxr-xr-xamiga/context_menu.c42
-rwxr-xr-xamiga/context_menu.h2
-rw-r--r--amiga/download.c4
12 files changed, 169 insertions, 3 deletions
diff --git a/!NetSurf/Resources/de/Messages b/!NetSurf/Resources/de/Messages
index b866013a2..0ad5768f3 100644
--- a/!NetSurf/Resources/de/Messages
+++ b/!NetSurf/Resources/de/Messages
@@ -283,6 +283,9 @@ Link:Link
LinkNewTab:Open in new tab
LinkNewWin:Open in new window
CopyURL:Copy URL to clipboard
+CopyClip:Copy to clipboard
+SaveAs:Save as...
+SaveIFF:Save as IFF...
ObjShow:Show object
SelectFile:Select file...
diff --git a/!NetSurf/Resources/en/Messages b/!NetSurf/Resources/en/Messages
index ea30b864b..5efcb7704 100644
--- a/!NetSurf/Resources/en/Messages
+++ b/!NetSurf/Resources/en/Messages
@@ -283,6 +283,9 @@ Link:Link
LinkNewTab:Open in new tab
LinkNewWin:Open in new window
CopyURL:Copy URL to clipboard
+CopyClip:Copy to clipboard
+SaveAs:Save as...
+SaveIFF:Save as IFF...
ObjShow:Show object
SelectFile:Select file...
diff --git a/!NetSurf/Resources/fr/Messages b/!NetSurf/Resources/fr/Messages
index 19bda4f88..4d03d965b 100644
--- a/!NetSurf/Resources/fr/Messages
+++ b/!NetSurf/Resources/fr/Messages
@@ -283,6 +283,9 @@ Link:Link
LinkNewTab:Open in new tab
LinkNewWin:Open in new window
CopyURL:Copy URL to clipboard
+CopyClip:Copy to clipboard
+SaveAs:Save as...
+SaveIFF:Save as IFF...
ObjShow:Show object
SelectFile:Select file...
diff --git a/!NetSurf/Resources/it/Messages b/!NetSurf/Resources/it/Messages
index e6898bfca..e0eb81f2c 100755
--- a/!NetSurf/Resources/it/Messages
+++ b/!NetSurf/Resources/it/Messages
@@ -285,6 +285,9 @@ Link:Link
LinkNewTab:Apri in una nuova scheda
LinkNewWin:Apri in una nuova finestra
CopyURL:Copia URL nella clipboard
+CopyClip:Copy to clipboard
+SaveAs:Save as...
+SaveIFF:Save as IFF...
ObjShow:Mostra oggetto
SelectFile:Seleziona file...
diff --git a/!NetSurf/Resources/nl/Messages b/!NetSurf/Resources/nl/Messages
index a7272c2ee..49273ea6b 100644
--- a/!NetSurf/Resources/nl/Messages
+++ b/!NetSurf/Resources/nl/Messages
@@ -283,6 +283,9 @@ Link:Link
LinkNewTab:Open in new tab
LinkNewWin:Open in new window
CopyURL:Copy URL to clipboard
+CopyClip:Copy to clipboard
+SaveAs:Save as...
+SaveIFF:Save as IFF...
ObjShow:Show object
SelectFile:Select file...
diff --git a/amiga/bitmap.c b/amiga/bitmap.c
index 1e553c287..be34e1951 100644
--- a/amiga/bitmap.c
+++ b/amiga/bitmap.c
@@ -23,6 +23,8 @@
#include <proto/picasso96api.h>
#include <graphics/composite.h>
#include "amiga/options.h"
+#include <proto/iffparse.h>
+#include <proto/dos.h>
/**
* Create a bitmap.
@@ -123,6 +125,22 @@ void bitmap_destroy(void *bitmap)
bool bitmap_save(void *bitmap, const char *path, unsigned flags)
{
+ struct IFFHandle *iffh;
+ struct bitmap *bm = bitmap;
+
+ if(iffh = AllocIFF())
+ {
+ if(iffh->iff_Stream = Open(path,MODE_NEWFILE))
+ {
+ InitIFFasDOS(iffh);
+ ami_easy_clipboard_bitmap(bm,iffh,bm->url,bm->title);
+ bm->url = NULL;
+ bm->title = NULL;
+ Close(iffh->iff_Stream);
+ }
+ FreeIFF(iffh);
+ }
+
return true;
}
diff --git a/amiga/bitmap.h b/amiga/bitmap.h
index 80ae166d5..f3a7c4b89 100755
--- a/amiga/bitmap.h
+++ b/amiga/bitmap.h
@@ -29,6 +29,8 @@ struct bitmap {
struct BitMap *nativebm;
int nativebmwidth;
int nativebmheight;
+ char *url; /* temporary storage space */
+ char *title; /* temporary storage space */
};
struct BitMap *ami_getcachenativebm(struct bitmap *bitmap,int width,int height,struct BitMap *friendbm);
diff --git a/amiga/clipboard.c b/amiga/clipboard.c
index 1a6d46ff1..5afc2d2fe 100755
--- a/amiga/clipboard.c
+++ b/amiga/clipboard.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2008 Chris Young <chris@unsatisfactorysoftware.co.uk>
+ * Copyright 2008,2009 Chris Young <chris@unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -27,9 +27,21 @@
#include "amiga/utf8.h"
#include "utils/utf8.h"
#include "desktop/selection.h"
+#include <datatypes/pictureclass.h>
+#include <proto/utility.h>
+#include <proto/dos.h>
+#include "utils/messages.h"
+#ifndef ID_AUTH
+#define ID_AUTH MAKE_ID('A','U','T','H')
+#endif
+
+#ifndef ID_ANNO
+#define ID_ANNO MAKE_ID('A','N','N','O')
+#endif
struct IFFHandle *iffh = NULL;
+const char * const netsurf_version;
void ami_clipboard_init(void)
{
@@ -232,3 +244,73 @@ bool ami_easy_clipboard(char *text)
return false;
}
+
+bool ami_easy_clipboard_bitmap(struct bitmap *bitmap,struct IFFHandle *ih,
+ char *url,char *name)
+{
+ struct BitMapHeader *bmhd;
+ uint32 bmdatasize = bitmap_get_width(bitmap) *
+ bitmap_get_height(bitmap) *
+ bitmap_get_bpp(bitmap);
+
+ if(!ih) ih = iffh;
+
+ if(!(OpenIFF(ih,IFFF_WRITE)))
+ {
+ if(!(PushChunk(ih,ID_ILBM,ID_FORM,IFFSIZE_UNKNOWN)))
+ {
+ if(bmhd = AllocVec(sizeof(struct BitMapHeader),MEMF_CLEAR | MEMF_PRIVATE))
+ {
+ if(!(PushChunk(ih,0,ID_BMHD,sizeof(struct BitMapHeader))))
+ {
+ bmhd->bmh_Width = (UWORD)bitmap_get_width(bitmap);
+ bmhd->bmh_Height = (UWORD)bitmap_get_height(bitmap);
+ bmhd->bmh_Depth = (UBYTE)bitmap_get_bpp(bitmap) * 8;
+ bmhd->bmh_Masking = mskHasAlpha;
+ WriteChunkBytes(ih,bmhd,sizeof(struct BitMapHeader));
+ }
+ PopChunk(ih);
+ FreeVec(bmhd);
+ }
+
+ if(!(PushChunk(ih,0,ID_AUTH,IFFSIZE_UNKNOWN)))
+ {
+ STRPTR ilbm_auth = ASPrintf("%s %s",messages_get("NetSurf"),netsurf_version);
+ WriteChunkBytes(ih,ilbm_auth,strlen(ilbm_auth));
+ FreeVec(ilbm_auth);
+ }
+ PopChunk(ih);
+
+ if(!(PushChunk(ih,0,ID_NAME,IFFSIZE_UNKNOWN)))
+ {
+ WriteChunkBytes(ih,name,strlen(name));
+ }
+ PopChunk(ih);
+
+ if(!(PushChunk(ih,0,ID_ANNO,IFFSIZE_UNKNOWN)))
+ {
+ WriteChunkBytes(ih,url,strlen(url));
+ }
+ PopChunk(ih);
+
+ if(!(PushChunk(ih,0,ID_BODY,bmdatasize)))
+ {
+ WriteChunkBytes(ih,bitmap_get_buffer(bitmap),bmdatasize);
+ PopChunk(ih);
+ CloseIFF(ih);
+ return true;
+ }
+ else
+ {
+ PopChunk(ih);
+ }
+ }
+ else
+ {
+ PopChunk(ih);
+ }
+ CloseIFF(ih);
+ }
+
+ return false;
+}
diff --git a/amiga/clipboard.h b/amiga/clipboard.h
index 45608a4de..4afbae138 100755
--- a/amiga/clipboard.h
+++ b/amiga/clipboard.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2008 Chris Young <chris@unsatisfactorysoftware.co.uk>
+ * Copyright 2008,2009 Chris Young <chris@unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -18,7 +18,10 @@
#ifndef AMIGA_CLIPBOARD_H
#define AMIGA_CLIPBOARD_H
+
void ami_clipboard_init(void);
void ami_clipboard_free(void);
bool ami_easy_clipboard(char *text);
+bool ami_easy_clipboard_bitmap(struct bitmap *bitmap,struct IFFHandle *ih,
+ char *url,char *name);
#endif
diff --git a/amiga/context_menu.c b/amiga/context_menu.c
index 453c8d62d..97c1ca805 100755
--- a/amiga/context_menu.c
+++ b/amiga/context_menu.c
@@ -32,6 +32,7 @@
#include "utils/utils.h"
#include <proto/asl.h>
#include "desktop/textinput.h"
+#include "amiga/bitmap.h"
uint32 ami_context_menu_hook(struct Hook *hook,Object *item,APTR reserved);
@@ -43,7 +44,10 @@ void ami_context_menu_init(void)
ctxmenulab[CMID_COPYURL] = ami_utf8_easy((char *)messages_get("CopyURL"));
ctxmenulab[CMID_SHOWOBJ] = ami_utf8_easy((char *)messages_get("ObjShow"));
ctxmenulab[CMID_COPYOBJ] = ami_utf8_easy((char *)messages_get("CopyURL"));
- ctxmenulab[CMID_SAVEOBJ] = ami_utf8_easy((char *)messages_get("ObjSave"));
+ ctxmenulab[CMID_CLIPOBJ] = ami_utf8_easy((char *)messages_get("CopyClip"));
+ ctxmenulab[CMID_SAVEOBJ] = ami_utf8_easy((char *)messages_get("SaveAs"));
+ ctxmenulab[CMID_SAVEIFFOBJ] = ami_utf8_easy((char *)messages_get("SaveIFF"));
+
ctxmenulab[CMID_SAVEURL] = ami_utf8_easy((char *)messages_get("LinkDload"));
ctxmenulab[CMID_URLOPENWIN] = ami_utf8_easy((char *)messages_get("LinkNewWin"));
ctxmenulab[CMID_URLOPENTAB] = ami_utf8_easy((char *)messages_get("LinkNewTab"));
@@ -139,10 +143,20 @@ void ami_context_menu_show(struct gui_window_2 *gwin,int x,int y)
PMIA_UserData,curbox->object->url,
TAG_DONE),
PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_CLIPOBJ],
+ PMIA_ID,CMID_CLIPOBJ,
+ PMIA_UserData,curbox->object,
+ TAG_DONE),
+ PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
PMIA_Title, (ULONG)ctxmenulab[CMID_SAVEOBJ],
PMIA_ID,CMID_SAVEOBJ,
PMIA_UserData,curbox->object,
TAG_DONE),
+ PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_SAVEIFFOBJ],
+ PMIA_ID,CMID_SAVEIFFOBJ,
+ PMIA_UserData,curbox->object,
+ TAG_DONE),
TAG_DONE),
TAG_DONE),
~0);
@@ -264,6 +278,11 @@ uint32 ami_context_menu_hook(struct Hook *hook,Object *item,APTR reserved)
browser_window_go(gwin->bw,userdata,gwin->bw->current_content->url,true);
break;
+ case CMID_CLIPOBJ:
+ object = (struct content *)userdata;
+ ami_easy_clipboard_bitmap(object->bitmap,NULL,object->url,object->title);
+ break;
+
case CMID_SAVEOBJ:
object = (struct content *)userdata;
@@ -288,6 +307,27 @@ uint32 ami_context_menu_hook(struct Hook *hook,Object *item,APTR reserved)
}
break;
+ case CMID_SAVEIFFOBJ:
+ object = (struct content *)userdata;
+
+ if(AslRequestTags(savereq,
+ ASLFR_TitleText,messages_get("NetSurf"),
+ ASLFR_Screen,scrn,
+ ASLFR_InitialFile,FilePart(object->url),
+ TAG_DONE))
+ {
+ BPTR fh = 0;
+ char fname[1024];
+ strlcpy(&fname,savereq->fr_Drawer,1024);
+ AddPart(fname,savereq->fr_File,1024);
+ object->bitmap->url = object->url;
+ object->bitmap->title = object->title;
+ bitmap_save(object->bitmap,fname,0);
+ SetComment(fname,object->url);
+ ami_update_pointer(gwin->win,GUI_POINTER_DEFAULT);
+ }
+ break;
+
case CMID_SELCOPY:
browser_window_key_press(gwin->bw, KEY_COPY_SELECTION);
browser_window_key_press(gwin->bw, KEY_CLEAR_SELECTION);
diff --git a/amiga/context_menu.h b/amiga/context_menu.h
index 2c13fe957..a4d509931 100755
--- a/amiga/context_menu.h
+++ b/amiga/context_menu.h
@@ -28,7 +28,9 @@ enum {
CMID_SAVEURL,
CMID_SHOWOBJ,
CMID_COPYOBJ,
+ CMID_CLIPOBJ,
CMID_SAVEOBJ,
+ CMID_SAVEIFFOBJ,
CMID_SELALL,
CMID_SELCOPY,
CMSUB_OBJECT,
diff --git a/amiga/download.c b/amiga/download.c
index 4e9b2966a..fe9f370f5 100644
--- a/amiga/download.c
+++ b/amiga/download.c
@@ -30,6 +30,7 @@
#include "amiga/object.h"
#include "amiga/options.h"
#include "amiga/save_complete.h"
+#include "amiga/bitmap.h"
#include "content/fetch.h"
@@ -367,6 +368,9 @@ void ami_drag_save(struct Window *win)
case GUI_SAVE_OBJECT_NATIVE:
{
struct content *c = drag_save_data;
+ c->bitmap->url = c->url;
+ c->bitmap->title = c->title;
+ AddPart(path,c->title,1024);
bitmap_save(c->bitmap,path,0);
}
break;