From 478d953ea50169cab4ae57ba414c57332b17bf5f Mon Sep 17 00:00:00 2001 From: Chris Young Date: Sat, 16 May 2009 14:50:30 +0000 Subject: Copy and save images in IFF ILBM format. Currently, the data in the BODY chunk is wrong. svn path=/trunk/netsurf/; revision=7516 --- amiga/bitmap.c | 18 +++++++++++ amiga/bitmap.h | 2 ++ amiga/clipboard.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++- amiga/clipboard.h | 5 +++- amiga/context_menu.c | 42 +++++++++++++++++++++++++- amiga/context_menu.h | 2 ++ amiga/download.c | 4 +++ 7 files changed, 154 insertions(+), 3 deletions(-) (limited to 'amiga') 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 #include #include "amiga/options.h" +#include +#include /** * 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 + * Copyright 2008,2009 Chris Young * * 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 +#include +#include +#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 + * Copyright 2008,2009 Chris Young * * 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 #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")); @@ -138,11 +142,21 @@ void ami_context_menu_show(struct gui_window_2 *gwin,int x,int y) PMIA_ID,CMID_COPYOBJ, 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; -- cgit v1.2.3