From 8c4cbd2b1b10c4d4b76ecc6911faa0da2524d540 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Mon, 22 Sep 2008 20:41:01 +0000 Subject: 32-bit mouse pointer support. The pointer imagery are the icon files of the 4-colour custom text file images. Tooltypes XOFFSET and YOFFSET specify the "point" of the image. The 32-bit pointers can be disabled by setting option truecolour_mouse_pointers:0 The OS pointers (for "Default" and "Wait" only) can be used by setting os_mouse_pointers:1 Deleting the relevant files has the same effect :) This complete set of 32-bit images is drawn by Martin Merz (Mason). The code to read them is derived from sample code by Joerg Strohmayer. svn path=/trunk/netsurf/; revision=5401 --- amiga/gui.c | 232 ++++++++++++++++++++++--------- amiga/gui.h | 10 ++ amiga/options.h | 10 +- amiga/resources/Pointers/Blank.info | Bin 0 -> 1719 bytes amiga/resources/Pointers/Caret.info | Bin 0 -> 1605 bytes amiga/resources/Pointers/Cross.info | Bin 0 -> 2046 bytes amiga/resources/Pointers/Default.info | Bin 0 -> 2045 bytes amiga/resources/Pointers/Down.info | Bin 0 -> 1719 bytes amiga/resources/Pointers/Help.info | Bin 0 -> 2775 bytes amiga/resources/Pointers/Left.info | Bin 0 -> 1609 bytes amiga/resources/Pointers/LeftDown.info | Bin 0 -> 1765 bytes amiga/resources/Pointers/LeftUp.info | Bin 0 -> 1695 bytes amiga/resources/Pointers/Menu.info | Bin 0 -> 2577 bytes amiga/resources/Pointers/Move.info | Bin 0 -> 2840 bytes amiga/resources/Pointers/NoDrop.info | Bin 0 -> 2801 bytes amiga/resources/Pointers/NotAllowed.info | Bin 0 -> 2533 bytes amiga/resources/Pointers/Point.info | Bin 0 -> 2755 bytes amiga/resources/Pointers/Progress.info | Bin 0 -> 2851 bytes amiga/resources/Pointers/Right.info | Bin 0 -> 1609 bytes amiga/resources/Pointers/RightDown.info | Bin 0 -> 1669 bytes amiga/resources/Pointers/RightUp.info | Bin 0 -> 1687 bytes amiga/resources/Pointers/Up.info | Bin 0 -> 1617 bytes amiga/resources/Pointers/Wait.info | Bin 0 -> 2449 bytes 23 files changed, 183 insertions(+), 69 deletions(-) create mode 100644 amiga/resources/Pointers/Blank.info create mode 100644 amiga/resources/Pointers/Caret.info create mode 100644 amiga/resources/Pointers/Cross.info create mode 100644 amiga/resources/Pointers/Default.info create mode 100644 amiga/resources/Pointers/Down.info create mode 100644 amiga/resources/Pointers/Help.info create mode 100644 amiga/resources/Pointers/Left.info create mode 100644 amiga/resources/Pointers/LeftDown.info create mode 100644 amiga/resources/Pointers/LeftUp.info create mode 100644 amiga/resources/Pointers/Menu.info create mode 100644 amiga/resources/Pointers/Move.info create mode 100644 amiga/resources/Pointers/NoDrop.info create mode 100644 amiga/resources/Pointers/NotAllowed.info create mode 100644 amiga/resources/Pointers/Point.info create mode 100644 amiga/resources/Pointers/Progress.info create mode 100644 amiga/resources/Pointers/Right.info create mode 100644 amiga/resources/Pointers/RightDown.info create mode 100644 amiga/resources/Pointers/RightUp.info create mode 100644 amiga/resources/Pointers/Up.info create mode 100644 amiga/resources/Pointers/Wait.info (limited to 'amiga') diff --git a/amiga/gui.c b/amiga/gui.c index 5c1e47ee6..78bf209aa 100755 --- a/amiga/gui.c +++ b/amiga/gui.c @@ -57,6 +57,8 @@ #include #include "amiga/iff_cset.h" #include +#include +#include #ifdef WITH_HUBBUB #include @@ -101,13 +103,13 @@ bool win_destroyed = false; static struct RastPort dummyrp; struct IFFHandle *iffh = NULL; -#define AMI_LASTPOINTER GUI_POINTER_PROGRESS +#define AMI_LASTPOINTER GUI_POINTER_PROGRESS+1 +Object *mouseptrobj[AMI_LASTPOINTER+1]; struct BitMap *mouseptrbm[AMI_LASTPOINTER+1]; -int mousexpt[AMI_LASTPOINTER+1]; -int mouseypt[AMI_LASTPOINTER+1]; +int mouseptrcurrent=0; char *ptrs[AMI_LASTPOINTER+1] = { - "Resources/Pointers/Blank", // replaces default + "Resources/Pointers/Default", "Resources/Pointers/Point", "Resources/Pointers/Caret", "Resources/Pointers/Menu", @@ -125,13 +127,15 @@ char *ptrs[AMI_LASTPOINTER+1] = { "Resources/Pointers/Help", "Resources/Pointers/NoDrop", "Resources/Pointers/NotAllowed", - "Resources/Pointers/Progress"}; + "Resources/Pointers/Progress", + "Resources/Pointers/Blank"}; void ami_update_throbber(struct gui_window *g); void ami_update_buttons(struct gui_window *); void ami_scroller_hook(struct Hook *,Object *,struct IntuiMessage *); uint32 ami_popup_hook(struct Hook *hook,Object *item,APTR reserved); void ami_do_redraw(struct gui_window *g); +void ami_init_mouse_pointers(void); #ifdef WITH_HUBBUB static void *myrealloc(void *ptr, size_t len, void *pw); #endif @@ -143,8 +147,6 @@ void gui_init(int argc, char** argv) bool found=FALSE; int i; BPTR lock=0; - struct RastPort mouseptr; - struct IFFHandle *mpiff = NULL; Object *dto; /* ttengine.library @@ -193,47 +195,10 @@ void gui_init(int argc, char** argv) } } - InitRastPort(&mouseptr); - - for(i=0;i<=AMI_LASTPOINTER;i++) - { - BPTR ptrfile = 0; - mouseptrbm[i] = NULL; - - if(ptrfile = Open(ptrs[i],MODE_OLDFILE)) - { - int mx,my; - UBYTE *pprefsbuf = AllocVec(1061,MEMF_CLEAR); - Read(ptrfile,pprefsbuf,1061); - - mouseptrbm[i]=AllocVec(sizeof(struct BitMap),MEMF_CLEAR); - InitBitMap(mouseptrbm[i],2,32,32); - mouseptrbm[i]->Planes[0] = AllocRaster(32,32); - mouseptrbm[i]->Planes[1] = AllocRaster(32,32); - mouseptr.BitMap = mouseptrbm[i]; - - for(my=0;my<32;my++) - { - for(mx=0;mx<32;mx++) - { - SetAPen(&mouseptr,pprefsbuf[(my*(33))+mx]-'0'); - WritePixel(&mouseptr,mx,my); - } - } - - mousexpt[i] = ((pprefsbuf[1056]-'0')*10)+(pprefsbuf[1057]-'0'); - mouseypt[i] = ((pprefsbuf[1059]-'0')*10)+(pprefsbuf[1060]-'0'); - - FreeVec(pprefsbuf); - Close(ptrfile); - } - } -/* need to do some proper checking that components are opening */ - options_read("Resources/Options"); verbose_log = option_verbose_log; - + ami_init_mouse_pointers(); nsscreentitle = ASPrintf("NetSurf %s",netsurf_version); if(lock=Lock("Resources/LangNames",ACCESS_READ)) @@ -1584,39 +1549,170 @@ void gui_window_set_status(struct gui_window *g, const char *text) RefreshSetGadgetAttrs(g->gadgets[GID_STATUS],g->win,NULL,STRINGA_TextVal,text,TAG_DONE); } -Object *ami_custom_pointer(gui_pointer_shape shape) -{ - if(!mouseptrbm[shape]) printf("%ld is null\n",shape); - - return NewObject(NULL,"pointerclass",POINTERA_BitMap,mouseptrbm[shape],POINTERA_WordWidth,2,POINTERA_XOffset,-mousexpt[shape],POINTERA_YOffset,-mouseypt[shape],POINTERA_XResolution,POINTERXRESN_SCREENRES,POINTERA_YResolution,POINTERYRESN_SCREENRESASPECT,TAG_DONE); -} - void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape) { - switch(shape) + if(mouseptrcurrent == shape) return; + + if(option_use_os_pointers) { - case GUI_POINTER_DEFAULT: - SetWindowPointer(g->win,TAG_DONE); - break; + switch(shape) + { + case GUI_POINTER_DEFAULT: + SetWindowPointer(g->win,TAG_DONE); + break; - case GUI_POINTER_WAIT: - SetWindowPointer(g->win, - WA_BusyPointer,TRUE, - WA_PointerDelay,TRUE, - TAG_DONE); - break; + case GUI_POINTER_WAIT: + SetWindowPointer(g->win, + WA_BusyPointer,TRUE, + WA_PointerDelay,TRUE, + TAG_DONE); + break; - default: - SetWindowPointer(g->win,WA_Pointer,ami_custom_pointer(shape),TAG_DONE); - break; + default: + if(mouseptrobj[shape]) + { + SetWindowPointer(g->win,WA_Pointer,mouseptrobj[shape],TAG_DONE); + } + else + { + SetWindowPointer(g->win,TAG_DONE); + } + break; + } + } + else + { + if(mouseptrobj[shape]) + { + SetWindowPointer(g->win,WA_Pointer,mouseptrobj[shape],TAG_DONE); + } + else + { + SetWindowPointer(g->win,TAG_DONE); + } } - + mouseptrcurrent = shape; } void gui_window_hide_pointer(struct gui_window *g) { - SetWindowPointer(g->win,WA_Pointer,ami_custom_pointer(0),TAG_DONE); + if(mouseptrcurrent != AMI_LASTPOINTER) + { + SetWindowPointer(g->win,WA_Pointer,mouseptrobj[AMI_LASTPOINTER],TAG_DONE); + mouseptrcurrent = AMI_LASTPOINTER; + } +} + +void ami_init_mouse_pointers(void) +{ + int i; + struct RastPort mouseptr; + struct DiskObject *dobj; + uint32 format = IDFMT_BITMAPPED; + int32 mousexpt=0,mouseypt=0; + + InitRastPort(&mouseptr); + + for(i=0;i<=AMI_LASTPOINTER;i++) + { + BPTR ptrfile = 0; + mouseptrbm[i] = NULL; + mouseptrobj[i] = NULL; + + if(option_truecolour_mouse_pointers) + { + if(dobj = GetIconTags(ptrs[i],ICONGETA_UseFriendBitMap,TRUE,TAG_DONE)) + { + if(IconControl(dobj, ICONCTRLA_GetImageDataFormat, &format, TAG_DONE)) + { + if(IDFMT_DIRECTMAPPED == format) + { + int32 width = 0, height = 0; + uint8* data = 0; + IconControl(dobj, + ICONCTRLA_GetWidth, &width, + ICONCTRLA_GetHeight, &height, + ICONCTRLA_GetImageData1, &data, + TAG_DONE); + + if (width > 0 && width <= 64 && height > 0 && height <= 64 && data) + { + STRPTR tooltype; + + if(tooltype = FindToolType(dobj->do_ToolTypes, "XOFFSET")) + mousexpt = atoi(tooltype); + + if(tooltype = FindToolType(dobj->do_ToolTypes, "YOFFSET")) + mouseypt = atoi(tooltype); + + if (mousexpt < 0 || mousexpt >= width) + mousexpt = 0; + if (mouseypt < 0 || mouseypt >= height) + mouseypt = 0; + + static uint8 dummyPlane[64 * 64 / 8]; + static struct BitMap dummyBitMap = { 64 / 8, 64, 0, 2, 0, { dummyPlane, dummyPlane, 0, 0, 0, 0, 0, 0 }, }; + + mouseptrobj[i] = NewObject(NULL, POINTERCLASS, + POINTERA_BitMap, &dummyBitMap, + POINTERA_XOffset, -mousexpt, + POINTERA_YOffset, -mouseypt, + POINTERA_WordWidth, (width + 15) / 16, + POINTERA_XResolution, POINTERXRESN_SCREENRES, + POINTERA_YResolution, POINTERYRESN_SCREENRESASPECT, + POINTERA_Dummy + 0x07, data, + POINTERA_Dummy + 0x08, width, + POINTERA_Dummy + 0x09, height, + TAG_DONE); + } + } + } + } + } + + if(!mouseptrobj[i]) + { + if(ptrfile = Open(ptrs[i],MODE_OLDFILE)) + { + int mx,my; + UBYTE *pprefsbuf = AllocVec(1061,MEMF_CLEAR); + Read(ptrfile,pprefsbuf,1061); + + mouseptrbm[i]=AllocVec(sizeof(struct BitMap),MEMF_CLEAR); + InitBitMap(mouseptrbm[i],2,32,32); + mouseptrbm[i]->Planes[0] = AllocRaster(32,32); + mouseptrbm[i]->Planes[1] = AllocRaster(32,32); + mouseptr.BitMap = mouseptrbm[i]; + + for(my=0;my<32;my++) + { + for(mx=0;mx<32;mx++) + { + SetAPen(&mouseptr,pprefsbuf[(my*(33))+mx]-'0'); + WritePixel(&mouseptr,mx,my); + } + } + + mousexpt = ((pprefsbuf[1056]-'0')*10)+(pprefsbuf[1057]-'0'); + mouseypt = ((pprefsbuf[1059]-'0')*10)+(pprefsbuf[1060]-'0'); + + mouseptrobj[i] = NewObject(NULL,"pointerclass", + POINTERA_BitMap,mouseptrbm[i], + POINTERA_WordWidth,2, + POINTERA_XOffset,-mousexpt, + POINTERA_YOffset,-mouseypt, + POINTERA_XResolution,POINTERXRESN_SCREENRES, + POINTERA_YResolution,POINTERYRESN_SCREENRESASPECT, + TAG_DONE); + + FreeVec(pprefsbuf); + Close(ptrfile); + } + + } + + } // for } void gui_window_set_url(struct gui_window *g, const char *url) @@ -1692,6 +1788,8 @@ void gui_window_remove_caret(struct gui_window *g) GetAttr(SPACE_AreaBox,g->gadgets[GID_BROWSER],(ULONG *)&bbox); BltBitMapRastPort(g->bm,g->c_x,g->c_y,g->win->RPort,bbox->Left+g->c_x,bbox->Top+g->c_y,2,g->c_h,0x0C0); + + g->c_h = 0; } void gui_window_new_content(struct gui_window *g) diff --git a/amiga/gui.h b/amiga/gui.h index 179d43e8c..89cd74f03 100755 --- a/amiga/gui.h +++ b/amiga/gui.h @@ -24,6 +24,16 @@ #include "desktop/browser.h" #include +/* temp icon.library stuff */ +#define ICONCTRLA_SetImageDataFormat (ICONA_Dummy + 0x67) /*103*/ +#define ICONCTRLA_GetImageDataFormat (ICONA_Dummy + 0x68) /*104*/ + +/* Values for ICONCTRLA_Set/GetImageDataFormat */ +#define IDFMT_BITMAPPED (0) /* Bitmapped icon (planar, legacy) */ +#define IDFMT_PALETTEMAPPED (1) /* Palette mapped icon (chunky, V44+) */ +#define IDFMT_DIRECTMAPPED (2) /* Direct mapped icon (truecolor 0xAARRGGBB, V51+) */ +/* temp icon.library stuff */ + void ami_get_msg(void); enum diff --git a/amiga/options.h b/amiga/options.h index 40ad24d69..4859ba084 100644 --- a/amiga/options.h +++ b/amiga/options.h @@ -29,6 +29,8 @@ extern char *option_toolbar_images; extern bool option_no_iframes; extern bool option_utf8_clipboard; extern int option_throbber_frames; +extern bool option_truecolour_mouse_pointers; +extern bool option_use_os_pointers; #define EXTRA_OPTION_DEFINE \ bool option_verbose_log = false; \ @@ -39,7 +41,9 @@ int option_modeid = 0; \ char *option_toolbar_images = 0; \ bool option_no_iframes = false; \ bool option_utf8_clipboard = false; \ -int option_throbber_frames = 1; +int option_throbber_frames = 1; \ +bool option_truecolour_mouse_pointers = true; \ +bool option_use_os_pointers = false; \ #define EXTRA_OPTION_TABLE \ { "verbose_log", OPTION_BOOL, &option_verbose_log}, \ @@ -50,5 +54,7 @@ int option_throbber_frames = 1; { "toolbar_images", OPTION_STRING, &option_toolbar_images }, \ { "no_iframes", OPTION_BOOL, &option_no_iframes}, \ { "clipboard_write_utf8", OPTION_BOOL, &option_utf8_clipboard}, \ -{ "throbber_frames", OPTION_INTEGER, &option_throbber_frames}, +{ "throbber_frames", OPTION_INTEGER, &option_throbber_frames}, \ +{ "truecolour_mouse_pointers", OPTION_BOOL, &option_truecolour_mouse_pointers}, \ +{ "os_mouse_pointers", OPTION_BOOL, &option_use_os_pointers}, #endif diff --git a/amiga/resources/Pointers/Blank.info b/amiga/resources/Pointers/Blank.info new file mode 100644 index 000000000..5ce812b26 Binary files /dev/null and b/amiga/resources/Pointers/Blank.info differ diff --git a/amiga/resources/Pointers/Caret.info b/amiga/resources/Pointers/Caret.info new file mode 100644 index 000000000..11d9c5fc9 Binary files /dev/null and b/amiga/resources/Pointers/Caret.info differ diff --git a/amiga/resources/Pointers/Cross.info b/amiga/resources/Pointers/Cross.info new file mode 100644 index 000000000..7aa433139 Binary files /dev/null and b/amiga/resources/Pointers/Cross.info differ diff --git a/amiga/resources/Pointers/Default.info b/amiga/resources/Pointers/Default.info new file mode 100644 index 000000000..dc8c2b0ed Binary files /dev/null and b/amiga/resources/Pointers/Default.info differ diff --git a/amiga/resources/Pointers/Down.info b/amiga/resources/Pointers/Down.info new file mode 100644 index 000000000..e4667bca1 Binary files /dev/null and b/amiga/resources/Pointers/Down.info differ diff --git a/amiga/resources/Pointers/Help.info b/amiga/resources/Pointers/Help.info new file mode 100644 index 000000000..ca5947105 Binary files /dev/null and b/amiga/resources/Pointers/Help.info differ diff --git a/amiga/resources/Pointers/Left.info b/amiga/resources/Pointers/Left.info new file mode 100644 index 000000000..5a4575cfc Binary files /dev/null and b/amiga/resources/Pointers/Left.info differ diff --git a/amiga/resources/Pointers/LeftDown.info b/amiga/resources/Pointers/LeftDown.info new file mode 100644 index 000000000..e8f39cb24 Binary files /dev/null and b/amiga/resources/Pointers/LeftDown.info differ diff --git a/amiga/resources/Pointers/LeftUp.info b/amiga/resources/Pointers/LeftUp.info new file mode 100644 index 000000000..be80018f3 Binary files /dev/null and b/amiga/resources/Pointers/LeftUp.info differ diff --git a/amiga/resources/Pointers/Menu.info b/amiga/resources/Pointers/Menu.info new file mode 100644 index 000000000..2a1143f11 Binary files /dev/null and b/amiga/resources/Pointers/Menu.info differ diff --git a/amiga/resources/Pointers/Move.info b/amiga/resources/Pointers/Move.info new file mode 100644 index 000000000..606f5d283 Binary files /dev/null and b/amiga/resources/Pointers/Move.info differ diff --git a/amiga/resources/Pointers/NoDrop.info b/amiga/resources/Pointers/NoDrop.info new file mode 100644 index 000000000..22e77a4be Binary files /dev/null and b/amiga/resources/Pointers/NoDrop.info differ diff --git a/amiga/resources/Pointers/NotAllowed.info b/amiga/resources/Pointers/NotAllowed.info new file mode 100644 index 000000000..01545bbba Binary files /dev/null and b/amiga/resources/Pointers/NotAllowed.info differ diff --git a/amiga/resources/Pointers/Point.info b/amiga/resources/Pointers/Point.info new file mode 100644 index 000000000..6c7d65f0a Binary files /dev/null and b/amiga/resources/Pointers/Point.info differ diff --git a/amiga/resources/Pointers/Progress.info b/amiga/resources/Pointers/Progress.info new file mode 100644 index 000000000..c47d52e99 Binary files /dev/null and b/amiga/resources/Pointers/Progress.info differ diff --git a/amiga/resources/Pointers/Right.info b/amiga/resources/Pointers/Right.info new file mode 100644 index 000000000..7080c4e77 Binary files /dev/null and b/amiga/resources/Pointers/Right.info differ diff --git a/amiga/resources/Pointers/RightDown.info b/amiga/resources/Pointers/RightDown.info new file mode 100644 index 000000000..0f5c181cf Binary files /dev/null and b/amiga/resources/Pointers/RightDown.info differ diff --git a/amiga/resources/Pointers/RightUp.info b/amiga/resources/Pointers/RightUp.info new file mode 100644 index 000000000..140ef15c5 Binary files /dev/null and b/amiga/resources/Pointers/RightUp.info differ diff --git a/amiga/resources/Pointers/Up.info b/amiga/resources/Pointers/Up.info new file mode 100644 index 000000000..f4b44421f Binary files /dev/null and b/amiga/resources/Pointers/Up.info differ diff --git a/amiga/resources/Pointers/Wait.info b/amiga/resources/Pointers/Wait.info new file mode 100644 index 000000000..88aa27a03 Binary files /dev/null and b/amiga/resources/Pointers/Wait.info differ -- cgit v1.2.3