From fde74745fcf3293ba5def6fd4fe165c24bdb4b8f Mon Sep 17 00:00:00 2001 From: NicJA Date: Sat, 29 Aug 2015 22:49:55 +0000 Subject: [PATCH] adapt all gfx drivers to use the new gfx.hidd CreateObject API. git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@51032 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- arch/all-android/hidd/androidgfx/agfx.c | 74 ++++---- arch/all-android/hidd/androidgfx/agfx.h | 4 +- arch/all-android/hidd/androidgfx/androidgfx.conf | 4 +- arch/all-android/hidd/androidgfx/startup.c | 4 +- arch/all-hosted/hidd/sdl/gfxclass.c | 57 +++--- arch/all-hosted/hidd/sdl/sdl_intern.h | 4 +- arch/all-hosted/hidd/sdl/startup.c | 3 +- arch/all-hosted/hidd/x11/x11.h | 5 +- arch/all-hosted/hidd/x11/x11gfx.c | 86 +++++---- arch/all-hosted/hidd/x11/x11gfx.conf | 4 +- arch/all-ios/hidd/uikit/classbase.h | 2 + arch/all-ios/hidd/uikit/gfxclass.c | 50 +++-- arch/all-ios/hidd/uikit/startup.c | 4 +- arch/all-ios/hidd/uikit/uikit.conf | 4 +- arch/all-linux/hidd/linuxfb/gfxclass.c | 101 ++++++----- arch/all-linux/hidd/linuxfb/linuxfb.conf | 4 +- arch/all-linux/hidd/linuxfb/linuxfb_intern.h | 5 +- arch/all-linux/hidd/linuxfb/mmakefile.src | 5 +- arch/all-mingw32/hidd/wingdi/gdi.h | 4 +- arch/all-mingw32/hidd/wingdi/gdigfx.c | 103 ++++++----- arch/all-mingw32/hidd/wingdi/startup.c | 4 +- arch/all-mingw32/hidd/wingdi/wingdi.conf | 4 +- arch/all-native/hidd/vga/bitmap.h | 5 +- arch/all-native/hidd/vga/vga.h | 9 +- arch/all-native/hidd/vga/vga_init.c | 6 +- arch/all-native/hidd/vga/vgaclass.c | 55 +++--- arch/all-native/hidd/vga/vgah.conf | 8 +- .../2708/hidd/videocoregfx/videocoregfx.conf | 4 +- .../2708/hidd/videocoregfx/videocoregfx_class.c | 74 ++++---- .../2708/hidd/videocoregfx/videocoregfx_class.h | 2 + .../2708/hidd/videocoregfx/videocoregfx_init.c | 1 + arch/m68k-amiga/hidd/gfx/amigavideo.conf | 4 +- arch/m68k-amiga/hidd/gfx/amigavideogfx.c | 54 +++--- arch/m68k-amiga/hidd/gfx/amigavideogfx.h | 2 + arch/m68k-amiga/hidd/gfx/startup.c | 5 +- arch/m68k-amiga/hidd/uaegfx/startup.c | 4 +- arch/m68k-amiga/hidd/uaegfx/uaegfx.c | 51 ++++-- arch/m68k-amiga/hidd/uaegfx/uaegfx.conf | 4 +- arch/m68k-amiga/hidd/uaegfx/uaegfx.h | 1 + rom/hidds/vesa/vesagfx.conf | 4 +- rom/hidds/vesa/vesagfx_init.c | 68 +++---- rom/hidds/vesa/vesagfxclass.c | 77 ++++---- rom/hidds/vesa/vesagfxclass.h | 4 +- .../devs/monitors/Compositor/compositorclass.c | 10 +- .../devs/monitors/Compositor/include/compositor.h | 19 +- workbench/devs/monitors/IntelGMA/galliumclass.c | 13 +- workbench/devs/monitors/IntelGMA/intelG45_class.c | 84 +++++---- workbench/devs/monitors/IntelGMA/intelG45_intern.h | 3 + workbench/devs/monitors/IntelGMA/startup.c | 2 + workbench/hidds/nouveau/nouveau.conf | 4 +- workbench/hidds/nouveau/nouveau_init.c | 7 +- workbench/hidds/nouveau/nouveau_intern.h | 5 +- workbench/hidds/nouveau/nouveauclass.c | 85 +++++---- workbench/hidds/nvidia/nv.h | 4 +- workbench/hidds/nvidia/nvidia.conf | 4 +- workbench/hidds/nvidia/nvidia_init.c | 6 +- workbench/hidds/nvidia/nvidiaclass.c | 201 +++++++++++---------- workbench/hidds/radeon/ati.h | 4 +- workbench/hidds/radeon/ati_class.c | 169 +++++++++-------- workbench/hidds/radeon/ati_init.c | 4 +- workbench/hidds/radeon/radeon.conf | 4 +- workbench/hidds/sm502/sm502.conf | 4 +- workbench/hidds/sm502/sm502_init.c | 4 +- workbench/hidds/sm502/sm502gfxclass.c | 68 ++++--- workbench/hidds/sm502/sm502gfxclass.h | 4 +- workbench/hidds/vmwaresvga/vmwaresvga.conf | 4 +- workbench/hidds/vmwaresvga/vmwaresvga_init.c | 4 +- workbench/hidds/vmwaresvga/vmwaresvgaclass.c | 90 +++++---- workbench/hidds/vmwaresvga/vmwaresvgaclass.h | 3 +- 69 files changed, 1030 insertions(+), 756 deletions(-) diff --git a/arch/all-android/hidd/androidgfx/agfx.c b/arch/all-android/hidd/androidgfx/agfx.c index f9ecc1dafd..76fffcb37b 100644 --- a/arch/all-android/hidd/androidgfx/agfx.c +++ b/arch/all-android/hidd/androidgfx/agfx.c @@ -1,5 +1,5 @@ /* - Copyright © 1995-2011, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: Android-hosted graphics driver class. @@ -145,43 +145,53 @@ OOP_Object *AGFXCl__Root__New(OOP_Class *cl, OOP_Object *o, struct pRoot_New *ms /****************************************************************************************/ -OOP_Object *AGFXCl__Hidd_Gfx__NewBitMap(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_NewBitMap *msg) +OOP_Object *AGFXCl__Hidd_Gfx__CreateObject(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_CreateObject *msg) { - BOOL displayable; - struct pHidd_Gfx_NewBitMap p; - struct TagItem tags[] = - { - {TAG_IGNORE, 0 }, - {TAG_MORE , (IPTR)msg->attrList} - }; + OOP_Object *object = NULL; - /* Here we select a class for the bitmap to create */ - - displayable = GetTagData(aHidd_BitMap_Displayable, FALSE, msg->attrList); - if (displayable) + if (msg->cl == XSD(cl)->basebm) { - /* Displayable bitmaps are bitmaps of our class */ - tags[0].ti_Tag = aHidd_BitMap_ClassPtr; - tags[0].ti_Data = (IPTR)XSD(cl)->bmclass; + BOOL displayable; + struct pHidd_Gfx_CreateObject p; + struct TagItem tags[] = + { + {TAG_IGNORE, 0 }, + {TAG_MORE , (IPTR)msg->attrList} + }; + + /* Here we select a class for the bitmap to create */ + + displayable = GetTagData(aHidd_BitMap_Displayable, FALSE, msg->attrList); + if (displayable) + { + /* Displayable bitmaps are bitmaps of our class */ + tags[0].ti_Tag = aHidd_BitMap_ClassPtr; + tags[0].ti_Data = (IPTR)XSD(cl)->bmclass; + } + else + { + /* Non-displayable friends of our bitmaps are plain chunky bitmaps */ + OOP_Object *friend = (OOP_Object *)GetTagData(aHidd_BitMap_Friend, 0, msg->attrList); + + if (friend && (OOP_OCLASS(friend) == XSD(cl)->bmclass)) + { + tags[0].ti_Tag = aHidd_BitMap_ClassID; + tags[0].ti_Data = (IPTR)CLID_Hidd_ChunkyBM; + } + } + + /* The base class will take care about other cases */ + + p.mID = msg->mID; + p.cl = msg->cl; + p.attrList = tags; + + object = (OOP_Object *)OOP_DoSuperMethod(cl, o, &p.mID); } else - { - /* Non-displayable friends of our bitmaps are plain chunky bitmaps */ - OOP_Object *friend = (OOP_Object *)GetTagData(aHidd_BitMap_Friend, 0, msg->attrList); - - if (friend && (OOP_OCLASS(friend) == XSD(cl)->bmclass)) - { - tags[0].ti_Tag = aHidd_BitMap_ClassID; - tags[0].ti_Data = (IPTR)CLID_Hidd_ChunkyBM; - } - } - - /* The base class will take care about other cases */ + object = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); - p.mID = msg->mID; - p.attrList = tags; - - return (OOP_Object *)OOP_DoSuperMethod(cl, o, &p.mID); + return object; } /****************************************************************************************/ diff --git a/arch/all-android/hidd/androidgfx/agfx.h b/arch/all-android/hidd/androidgfx/agfx.h index 300f88ddec..87093b38cf 100644 --- a/arch/all-android/hidd/androidgfx/agfx.h +++ b/arch/all-android/hidd/androidgfx/agfx.h @@ -1,5 +1,5 @@ /* - Copyright © 1995-2011, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: Common data structures of androidgfx.hidd @@ -16,6 +16,8 @@ struct agfx_staticdata { OOP_AttrBase *AttrBases; + OOP_Class *basebm; /* baseclass for CreateObject */ + OOP_Class *gfxclass; OOP_Class *bmclass; OOP_Class *mouseclass; diff --git a/arch/all-android/hidd/androidgfx/androidgfx.conf b/arch/all-android/hidd/androidgfx/androidgfx.conf index 92cc62c0b3..3758789b3a 100644 --- a/arch/all-android/hidd/androidgfx/androidgfx.conf +++ b/arch/all-android/hidd/androidgfx/androidgfx.conf @@ -2,7 +2,7 @@ basename AGFXCl libbase AGFXClBase libbasetype struct AGFXBase -version 42.0 +version 42.1 residentpri 9 classid CLID_Hidd_AGfx superclass CLID_Hidd_Gfx @@ -29,7 +29,7 @@ classdatatype struct gfx_data New Get .interface Hidd_Gfx -NewBitMap +CreateObject Show ##end methodlist diff --git a/arch/all-android/hidd/androidgfx/startup.c b/arch/all-android/hidd/androidgfx/startup.c index af2b521f20..8b54320003 100644 --- a/arch/all-android/hidd/androidgfx/startup.c +++ b/arch/all-android/hidd/androidgfx/startup.c @@ -1,5 +1,5 @@ /* - Copyright © 1995-2014, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ */ @@ -44,6 +44,8 @@ static int agfx_Startup(LIBBASETYPEPTR LIBBASE) if (!GfxBase) return FALSE; + LIBBASE->xsd.basebm = OOP_FindClass(CLID_Hidd_BitMap); + /* Add keyboard and mouse driver to the system */ kbd = OOP_NewObject(NULL, CLID_Hidd_Kbd, NULL); if (kbd) diff --git a/arch/all-hosted/hidd/sdl/gfxclass.c b/arch/all-hosted/hidd/sdl/gfxclass.c index 9f003ed78b..7b3ec90746 100644 --- a/arch/all-hosted/hidd/sdl/gfxclass.c +++ b/arch/all-hosted/hidd/sdl/gfxclass.c @@ -1,7 +1,7 @@ /* * sdl.hidd - SDL graphics/sound/keyboard for AROS hosted * Copyright (c) 2007 Robert Norris. All rights reserved. - * Copyright (c) 2010 The AROS Development Team. All rights reserved. + * Copyright (c) 2010-2015 The AROS Development Team. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the same terms as AROS itself. @@ -353,35 +353,44 @@ VOID SDLGfx__Root__Set(OOP_Class *cl, OOP_Object *obj, struct pRoot_Set *msg) OOP_DoSuperMethod(cl, obj, (OOP_Msg)msg); } -OOP_Object *SDLGfx__Hidd_Gfx__NewBitMap(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_NewBitMap *msg) { - struct TagItem *msgtags; - struct pHidd_Gfx_NewBitMap supermsg; - struct gfxdata *data = OOP_INST_DATA(cl, o); +OOP_Object *SDLGfx__Hidd_Gfx__CreateObject(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_CreateObject *msg) { + OOP_Object *object = NULL; - D(bug("[sdl] SDLGfx::NewBitMap, UtilityBase is 0x%p\n", UtilityBase)); + if (msg->cl == LIBBASE->basebm) + { + struct TagItem *msgtags; + struct pHidd_Gfx_CreateObject supermsg; + struct gfxdata *data = OOP_INST_DATA(cl, o); - if (GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList) != vHidd_ModeID_Invalid) { - D(bug("[sdl] bitmap with valid mode, we can handle it\n")); + D(bug("[sdl] SDLGfx::CreateObject, UtilityBase is 0x%p\n", UtilityBase)); - msgtags = TAGLIST( - aHidd_BitMap_ClassPtr, (IPTR) LIBBASE->bmclass, - TAG_MORE, (IPTR) msg->attrList - ); - D(bug("[sdl] ClassPtr is 0x%p\n", LIBBASE->bmclass)); - } else - msgtags = msg->attrList; + if (GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList) != vHidd_ModeID_Invalid) { + D(bug("[sdl] bitmap with valid mode, we can handle it\n")); - supermsg.mID = msg->mID; - supermsg.attrList = msgtags; + msgtags = TAGLIST( + aHidd_BitMap_ClassPtr, (IPTR) LIBBASE->bmclass, + TAG_MORE, (IPTR) msg->attrList + ); + D(bug("[sdl] ClassPtr is 0x%p\n", LIBBASE->bmclass)); + } else + msgtags = msg->attrList; - D(bug("[sdl] Calling DoSuperMethod()\n")); - o = (OOP_Object *) OOP_DoSuperMethod(cl, o, (OOP_Msg) &supermsg); + supermsg.mID = msg->mID; + supermsg.cl = msg->cl; + supermsg.attrList = msgtags; + + D(bug("[sdl] Calling DoSuperMethod()\n")); + object = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg) &supermsg); - if (GetTagData(aHidd_BitMap_FrameBuffer, FALSE, msg->attrList)) - data->framebuffer = o; + if (GetTagData(aHidd_BitMap_FrameBuffer, FALSE, msg->attrList)) + data->framebuffer = object; + + D(bug("[sdl] Created bitmap 0x%p\n", object)); + } + else + object = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); - D(bug("[sdl] Created bitmap 0x%p\n", o)); - return o; + return object; } VOID SDLGfx__Hidd_Gfx__CopyBox(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_CopyBox *msg) { @@ -504,7 +513,7 @@ static struct OOP_MethodDescr SDLGfx_Root_descr[] = { #define NUM_SDLGfx_Root_METHODS 4 static struct OOP_MethodDescr SDLGfx_Hidd_Gfx_descr[] = { - {(OOP_MethodFunc)SDLGfx__Hidd_Gfx__NewBitMap, moHidd_Gfx_NewBitMap}, + {(OOP_MethodFunc)SDLGfx__Hidd_Gfx__CreateObject, moHidd_Gfx_CreateObject}, {(OOP_MethodFunc)SDLGfx__Hidd_Gfx__Show, moHidd_Gfx_Show}, {(OOP_MethodFunc)SDLGfx__Hidd_Gfx__CopyBox, moHidd_Gfx_CopyBox}, {NULL, 0} diff --git a/arch/all-hosted/hidd/sdl/sdl_intern.h b/arch/all-hosted/hidd/sdl/sdl_intern.h index e0e238d644..db9b82f571 100644 --- a/arch/all-hosted/hidd/sdl/sdl_intern.h +++ b/arch/all-hosted/hidd/sdl/sdl_intern.h @@ -1,7 +1,7 @@ /* * sdl.hidd - SDL graphics/sound/keyboard for AROS hosted * Copyright (c) 2007 Robert Norris. All rights reserved. - * Copyright (c) 2010 The AROS Development Team. All rights reserved. + * Copyright (c) 2010-2015 The AROS Development Team. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the same terms as AROS itself. @@ -86,6 +86,8 @@ struct sdlhidd { APTR sdl_handle; + OOP_Class *basebm; /* baseclass for CreateObject */ + OOP_Class *gfxclass; OOP_Class *bmclass; OOP_Class *mouseclass; diff --git a/arch/all-hosted/hidd/sdl/startup.c b/arch/all-hosted/hidd/sdl/startup.c index e62642cfa0..e19f4c8e04 100644 --- a/arch/all-hosted/hidd/sdl/startup.c +++ b/arch/all-hosted/hidd/sdl/startup.c @@ -1,5 +1,5 @@ /* - Copyright © 1995-2014, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ */ @@ -66,6 +66,7 @@ static int sdl_Startup(struct sdlhidd *xsd) OOP_Object *kbd, *ms; ULONG err; + xsd->basebm = OOP_FindClass(CLID_Hidd_BitMap); xsd->mousehidd = NULL; D(bug("[SDL] Class initialization OK, creating objects\n")); diff --git a/arch/all-hosted/hidd/x11/x11.h b/arch/all-hosted/hidd/x11/x11.h index aed3889852..6712c8bdf8 100644 --- a/arch/all-hosted/hidd/x11/x11.h +++ b/arch/all-hosted/hidd/x11/x11.h @@ -2,7 +2,7 @@ #define HIDD_X11_H /* - Copyright © 1995-2013, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: Include for the x11 HIDD. @@ -234,6 +234,9 @@ struct gfx_data int depth; Colormap colmap; Cursor cursor; + + /* baseclass for CreateObject */ + OOP_Class *basebm; }; #define HOSTCLIPBOARDSTATE_IDLE 0 diff --git a/arch/all-hosted/hidd/x11/x11gfx.c b/arch/all-hosted/hidd/x11/x11gfx.c index 81a216bb74..fc3631d2ab 100644 --- a/arch/all-hosted/hidd/x11/x11gfx.c +++ b/arch/all-hosted/hidd/x11/x11gfx.c @@ -1,5 +1,5 @@ /* - Copyright © 1995-2014, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: X11 gfx HIDD for AROS. @@ -428,6 +428,9 @@ OOP_Object *X11Cl__Root__New(OOP_Class *cl, OOP_Object *o, struct pRoot_New *msg XColor bg, fg; struct gfx_data *data = OOP_INST_DATA(cl, o); + data->basebm = OOP_FindClass(CLID_Hidd_BitMap); + bug("[X11] BitMap class @ 0x%p\n", data->basebm); + LOCK_X11 data->display = XSD(cl)->display; data->screen = DefaultScreen( data->display ); @@ -507,51 +510,58 @@ VOID X11Cl__Root__Dispose(OOP_Class *cl, OOP_Object *o, OOP_Msg msg) /****************************************************************************************/ -OOP_Object *X11Cl__Hidd_Gfx__NewBitMap(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_NewBitMap *msg) +OOP_Object *X11Cl__Hidd_Gfx__CreateObject(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_CreateObject *msg) { - struct pHidd_Gfx_NewBitMap p; - OOP_Object *newbm; - HIDDT_ModeID modeid; - struct gfx_data *data; - struct TagItem tags[] = - { - { aHidd_X11BitMap_SysDisplay , 0 }, /* 0 */ - { aHidd_X11BitMap_SysScreen , 0 }, /* 1 */ - { aHidd_X11BitMap_SysCursor , 0 }, /* 2 */ - { aHidd_X11BitMap_ColorMap , 0 }, /* 3 */ - { aHidd_X11BitMap_VisualClass , 0 }, /* 4 */ - { TAG_IGNORE , 0 }, /* 5 */ - { TAG_MORE , 0 } /* 6 */ - }; + struct gfx_data *data = OOP_INST_DATA(cl, o); + OOP_Object *object = NULL; D(bug("[X11Gfx] %s()\n", __PRETTY_FUNCTION__)); - data = OOP_INST_DATA(cl, o); - - tags[0].ti_Data = (IPTR)data->display; - tags[1].ti_Data = data->screen; - tags[2].ti_Data = (IPTR)data->cursor; - tags[3].ti_Data = data->colmap; - tags[4].ti_Data = XSD(cl)->vi.class; - tags[6].ti_Data = (IPTR)msg->attrList; - - /* Displayable bitmap ? */ - modeid = GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); - - if (modeid != vHidd_ModeID_Invalid) + if (msg->cl == data->basebm) { - /* ModeID supplied, it's for sure X11 bitmap */ - tags[5].ti_Tag = aHidd_BitMap_ClassPtr; - tags[5].ti_Data = (IPTR)XSD(cl)->bmclass; - } + struct pHidd_Gfx_CreateObject p; + HIDDT_ModeID modeid; + struct gfx_data *data; + struct TagItem tags[] = + { + { aHidd_X11BitMap_SysDisplay , 0 }, /* 0 */ + { aHidd_X11BitMap_SysScreen , 0 }, /* 1 */ + { aHidd_X11BitMap_SysCursor , 0 }, /* 2 */ + { aHidd_X11BitMap_ColorMap , 0 }, /* 3 */ + { aHidd_X11BitMap_VisualClass , 0 }, /* 4 */ + { TAG_IGNORE , 0 }, /* 5 */ + { TAG_MORE , 0 } /* 6 */ + }; + + data = OOP_INST_DATA(cl, o); + + tags[0].ti_Data = (IPTR)data->display; + tags[1].ti_Data = data->screen; + tags[2].ti_Data = (IPTR)data->cursor; + tags[3].ti_Data = data->colmap; + tags[4].ti_Data = XSD(cl)->vi.class; + tags[6].ti_Data = (IPTR)msg->attrList; + + /* Displayable bitmap ? */ + modeid = GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); + + if (modeid != vHidd_ModeID_Invalid) + { + /* ModeID supplied, it's for sure X11 bitmap */ + tags[5].ti_Tag = aHidd_BitMap_ClassPtr; + tags[5].ti_Data = (IPTR)XSD(cl)->bmclass; + } - /* !!! IMPORTANT !!! */ - p.mID = msg->mID; - p.attrList = tags; + p.mID = msg->mID; + p.cl = msg->cl; + p.attrList = tags; - newbm = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)&p); + object = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)&p); + } + else + object = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); - ReturnPtr("X11Gfx::NewBitMap", OOP_Object *, newbm); + ReturnPtr("X11Gfx::CreateObject", OOP_Object *, object); } /****************************************************************************************/ diff --git a/arch/all-hosted/hidd/x11/x11gfx.conf b/arch/all-hosted/hidd/x11/x11gfx.conf index ccdeff8c5b..2ea3c49f15 100644 --- a/arch/all-hosted/hidd/x11/x11gfx.conf +++ b/arch/all-hosted/hidd/x11/x11gfx.conf @@ -2,7 +2,7 @@ basename X11Cl libbase X11ClBase libbasetype struct x11clbase -version 42.0 +version 42.1 residentpri 9 classid CLID_Hidd_Gfx_X11 superclass CLID_Hidd_Gfx @@ -28,7 +28,7 @@ Dispose Get Set .interface Hidd_Gfx -NewBitMap +CreateObject CopyBox SetCursorShape SetCursorPos diff --git a/arch/all-ios/hidd/uikit/classbase.h b/arch/all-ios/hidd/uikit/classbase.h index 46ed7efa1c..80e268e932 100644 --- a/arch/all-ios/hidd/uikit/classbase.h +++ b/arch/all-ios/hidd/uikit/classbase.h @@ -24,6 +24,8 @@ struct UIKitBase APTR hostlib; struct UIKitInterface *iface; struct DisplayMetrics metrics; + OOP_Class *basebm; /* baseclass for CreateObject */ + OOP_Class *gfxclass; OOP_Class *bmclass; OOP_Class *mouseclass; diff --git a/arch/all-ios/hidd/uikit/gfxclass.c b/arch/all-ios/hidd/uikit/gfxclass.c index 2e65b2e2d8..ab8e9bdf5d 100644 --- a/arch/all-ios/hidd/uikit/gfxclass.c +++ b/arch/all-ios/hidd/uikit/gfxclass.c @@ -1,5 +1,5 @@ /* - Copyright © 1995-2011, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: Cocoa Touch display HIDD for AROS @@ -170,31 +170,41 @@ VOID UIKit__Root__Dispose(OOP_Class *cl, OOP_Object *o, OOP_Msg msg) /****************************************************************************************/ -OOP_Object *UIKit__Hidd_Gfx__NewBitMap(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_NewBitMap *msg) +OOP_Object *UIKit__Hidd_Gfx__CreateObject(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_CreateObject *msg) { struct UIKitBase *base = cl->UserData; - HIDDT_ModeID modeid; - struct pHidd_Gfx_NewBitMap p; - struct TagItem tags[] = - { - {TAG_IGNORE, 0 }, - {TAG_MORE , (IPTR)msg->attrList} - }; + OOP_Object *object = NULL; - /* Here we select a class for the bitmap to create */ - modeid = GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); - if (modeid != vHidd_ModeID_Invalid) + if (msg->cl == base->basebm) { - tags[0].ti_Tag = aHidd_BitMap_ClassPtr; - tags[0].ti_Data = (IPTR)base->bmclass; - - D(bug("[UIKitGfx] ModeID: 0x%08lX, ClassPtr: 0x%p\n", modeid, tags[0].ti_Data)); + HIDDT_ModeID modeid; + struct pHidd_Gfx_CreateObject p; + struct TagItem tags[] = + { + {TAG_IGNORE, 0 }, + {TAG_MORE , (IPTR)msg->attrList} + }; + + /* Here we select a class for the bitmap to create */ + modeid = GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); + if (modeid != vHidd_ModeID_Invalid) + { + tags[0].ti_Tag = aHidd_BitMap_ClassPtr; + tags[0].ti_Data = (IPTR)base->bmclass; + + D(bug("[UIKitGfx] ModeID: 0x%08lX, ClassPtr: 0x%p\n", modeid, tags[0].ti_Data)); + } + + p.mID = msg->mID; + p.cl = msg->cl; + p.attrList = tags; + + object = OOP_DoSuperMethod(cl, o, &p.mID); } + else + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); - p.mID = msg->mID; - p.attrList = tags; - - return (OOP_Object *)OOP_DoSuperMethod(cl, o, &p.mID); + return object; } /****************************************************************************************/ diff --git a/arch/all-ios/hidd/uikit/startup.c b/arch/all-ios/hidd/uikit/startup.c index 58eb30623f..34eead77ba 100644 --- a/arch/all-ios/hidd/uikit/startup.c +++ b/arch/all-ios/hidd/uikit/startup.c @@ -1,5 +1,5 @@ /* - Copyright © 1995-2014, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ */ @@ -45,6 +45,8 @@ static int uikit_Startup(struct UIKitBase *LIBBASE) if (!GfxBase) return FALSE; + LIBBASE->basebm = OOP_FindClass(CLID_Hidd_BitMap); + #ifdef NOT_DONE_YET /* Add keyboard and mouse driver to the system */ kbd = OOP_NewObject(NULL, CLID_Hidd_Kbd, NULL); diff --git a/arch/all-ios/hidd/uikit/uikit.conf b/arch/all-ios/hidd/uikit/uikit.conf index 31b5f3c71a..61b1992209 100644 --- a/arch/all-ios/hidd/uikit/uikit.conf +++ b/arch/all-ios/hidd/uikit/uikit.conf @@ -2,7 +2,7 @@ basename UIKit libbase base libbasetype struct UIKitBase -version 1.0 +version 42.1 residentpri 9 classid CLID_Hidd_UIKitGfx superclass CLID_Hidd_Gfx @@ -28,7 +28,7 @@ New Dispose Get .interface Hidd_Gfx -NewBitMap +CreateObject ShowViewPorts CopyBox ModeProperties diff --git a/arch/all-linux/hidd/linuxfb/gfxclass.c b/arch/all-linux/hidd/linuxfb/gfxclass.c index 9858c83200..6bc55eb2e1 100644 --- a/arch/all-linux/hidd/linuxfb/gfxclass.c +++ b/arch/all-linux/hidd/linuxfb/gfxclass.c @@ -1,5 +1,5 @@ /* - Copyright © 1995-2013, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: Linux fbdev gfx HIDD for AROS. @@ -177,6 +177,8 @@ OOP_Object *LinuxFB__Root__New(OOP_Class *cl, OOP_Object *o, struct pRoot_New *m { struct LinuxFB_data *data = OOP_INST_DATA(cl, o); + data->basebm = OOP_FindClass(CLID_Hidd_BitMap); + data->fbdevinfo.fbdev = fbdev; data->fbdevinfo.fbtype = pftags[8].ti_Data; data->fbdevinfo.baseaddr = baseaddr; @@ -265,60 +267,71 @@ BOOL LinuxFB__Root__Get(OOP_Class *cl, OOP_Object *o, struct pRoot_Get *msg) return OOP_DoSuperMethod(cl, o, &msg->mID); } -/********** FBGfx::NewBitMap() ****************************/ -OOP_Object *LinuxFB__Hidd_Gfx__NewBitMap(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_NewBitMap *msg) +/********** FBGfx::CreateObject() ****************************/ +OOP_Object *LinuxFB__Hidd_Gfx__CreateObject(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_CreateObject *msg) { struct LinuxFB_data *data = OOP_INST_DATA(cl, o); - BOOL fb = GetTagData(aHidd_BitMap_FrameBuffer, FALSE, msg->attrList); - - D(bug("[LinuxFB] NewBitMap, framebuffer=%d\n", fb)); - /* - * Our framebuffer is a chunky bitmap at predetermined address. - * We don't care about friends etc here, because even if our - * class is selected for friend bitmap, it's completely safe - * because it will not get FBDevInfo. Storage overhead per - * bitmap is extremely small here (just 8 bytes). - */ - if (fb) + OOP_Object *object = NULL; + + if (msg->cl == data->basebm) { - struct TagItem tags[] = + struct LinuxFB_data *data = OOP_INST_DATA(cl, o); + BOOL fb = GetTagData(aHidd_BitMap_FrameBuffer, FALSE, msg->attrList); + + D(bug("[LinuxFB] CreateObject, framebuffer=%d\n", fb)); + /* + * Our framebuffer is a chunky bitmap at predetermined address. + * We don't care about friends etc here, because even if our + * class is selected for friend bitmap, it's completely safe + * because it will not get FBDevInfo. Storage overhead per + * bitmap is extremely small here (just 8 bytes). + */ + if (fb) { - {aHidd_BitMap_ClassPtr , (IPTR)LSD(cl)->bmclass }, - {aHidd_BitMap_BytesPerRow , data->fbdevinfo.pitch }, - {aHidd_ChunkyBM_Buffer , (IPTR)data->fbdevinfo.baseaddr}, - {aHidd_LinuxFBBitmap_FBDevInfo, -1 }, - {TAG_MORE , (IPTR)msg->attrList } - }; - struct pHidd_Gfx_NewBitMap p = - { - msg->mID, - tags - }; + struct TagItem tags[] = + { + {aHidd_BitMap_ClassPtr , (IPTR)LSD(cl)->bmclass }, + {aHidd_BitMap_BytesPerRow , data->fbdevinfo.pitch }, + {aHidd_ChunkyBM_Buffer , (IPTR)data->fbdevinfo.baseaddr}, + {aHidd_LinuxFBBitmap_FBDevInfo, -1 }, + {TAG_MORE , (IPTR)msg->attrList } + }; + struct pHidd_Gfx_CreateObject p = + { + msg->mID, + msg->cl, + tags + }; - if (data->fbdevinfo.fbtype == vHidd_ColorModel_Palette) - { - tags[3].ti_Data = data->fbdevinfo.fbdev; - } + if (data->fbdevinfo.fbtype == vHidd_ColorModel_Palette) + { + tags[3].ti_Data = data->fbdevinfo.fbdev; + } - if (data->confd == -1) - { - /* - * Switch console into gfx mode, no more console output - * FIXME: How to determine which console is connected to this framebuffer ? - */ - data->confd = Hidd_UnixIO_OpenFile(data->unixio, "/dev/tty0", O_RDWR, 0, NULL); - if (data->confd != -1) + if (data->confd == -1) { - Hidd_UnixIO_IOControlFile(data->unixio, data->confd, KDGKBMODE, &data->kbmode, NULL); - Hidd_UnixIO_IOControlFile(data->unixio, data->confd, KDSETMODE, (void *)KD_GRAPHICS, NULL); - Hidd_UnixIO_IOControlFile(data->unixio, data->confd, KDSKBMODE, K_RAW, NULL); + /* + * Switch console into gfx mode, no more console output + * FIXME: How to determine which console is connected to this framebuffer ? + */ + data->confd = Hidd_UnixIO_OpenFile(data->unixio, "/dev/tty0", O_RDWR, 0, NULL); + if (data->confd != -1) + { + Hidd_UnixIO_IOControlFile(data->unixio, data->confd, KDGKBMODE, &data->kbmode, NULL); + Hidd_UnixIO_IOControlFile(data->unixio, data->confd, KDSETMODE, (void *)KD_GRAPHICS, NULL); + Hidd_UnixIO_IOControlFile(data->unixio, data->confd, KDSKBMODE, K_RAW, NULL); + } } - } - return (OOP_Object *)OOP_DoSuperMethod(cl, o, &p.mID); + object = (OOP_Object *)OOP_DoSuperMethod(cl, o, &p.mID); + } + else + object = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); } + else + object = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); - return (OOP_Object *)OOP_DoSuperMethod(cl, o, &msg->mID); + return object; } BOOL LinuxFB__Hidd_Gfx__SetGamma(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_Gamma *msg) diff --git a/arch/all-linux/hidd/linuxfb/linuxfb.conf b/arch/all-linux/hidd/linuxfb/linuxfb.conf index 4a56fb51b4..646ede6086 100644 --- a/arch/all-linux/hidd/linuxfb/linuxfb.conf +++ b/arch/all-linux/hidd/linuxfb/linuxfb.conf @@ -2,7 +2,7 @@ basename LinuxFB libbase LinuxFBBase libbasetype struct LinuxFB_base -version 41.0 +version 42.1 residentpri 8 classid CLID_Hidd_LinuxFB superclass CLID_Hidd_Gfx @@ -21,7 +21,7 @@ New Dispose Get .interface Hidd_Gfx -NewBitMap +CreateObject SetGamma ##end methodlist diff --git a/arch/all-linux/hidd/linuxfb/linuxfb_intern.h b/arch/all-linux/hidd/linuxfb/linuxfb_intern.h index b23578aec3..ca364fa6fe 100644 --- a/arch/all-linux/hidd/linuxfb/linuxfb_intern.h +++ b/arch/all-linux/hidd/linuxfb/linuxfb_intern.h @@ -2,7 +2,7 @@ #define LINUX_INTERN_H /* - Copyright © 1995-2013, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: Linux framebuffer hidd for AROS @@ -78,6 +78,9 @@ struct LinuxFB_data /* FBDev info */ struct FBDevInfo fbdevinfo; struct Interrupt resetHandler; + + /* baseclass for CreateObject */ + OOP_Class *basebm; }; /*** Shared data ***/ diff --git a/arch/all-linux/hidd/linuxfb/mmakefile.src b/arch/all-linux/hidd/linuxfb/mmakefile.src index 3144d04469..13908bd470 100644 --- a/arch/all-linux/hidd/linuxfb/mmakefile.src +++ b/arch/all-linux/hidd/linuxfb/mmakefile.src @@ -1,10 +1,11 @@ # $Id$ include $(TOP)/config/make.cfg -FILES := startup linuxfb_init gfxclass bmclass - +USER_LDFLAGS = -static USER_INCLUDES := -isystem $(GENINCDIR) $(KERNEL_INCLUDES) +FILES := startup linuxfb_init gfxclass bmclass + %build_module mmake=kernel-hidd-linuxfb \ modname=linuxfb modtype=hidd \ files=$(FILES) archspecific=yes diff --git a/arch/all-mingw32/hidd/wingdi/gdi.h b/arch/all-mingw32/hidd/wingdi/gdi.h index 41a4999d81..321b27c99a 100644 --- a/arch/all-mingw32/hidd/wingdi/gdi.h +++ b/arch/all-mingw32/hidd/wingdi/gdi.h @@ -2,7 +2,7 @@ #define HIDD_GDI_H /* - Copyright © 1995-2011, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: Include for the gdi HIDD. @@ -90,6 +90,8 @@ struct gdi_staticdata * outside (see gdi_class.h) */ ULONG displaynum; + OOP_Class *basebm; /* baseclass for CreateObject */ + OOP_Class *gfxclass; OOP_Class *bmclass; diff --git a/arch/all-mingw32/hidd/wingdi/gdigfx.c b/arch/all-mingw32/hidd/wingdi/gdigfx.c index 40466d356d..ea9d3c8011 100644 --- a/arch/all-mingw32/hidd/wingdi/gdigfx.c +++ b/arch/all-mingw32/hidd/wingdi/gdigfx.c @@ -1,5 +1,5 @@ /* - Copyright 1995-2010, The AROS Development Team. All rights reserved. + Copyright 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: GDI gfx HIDD for AROS. @@ -336,55 +336,64 @@ VOID GDICl__Root__Dispose(OOP_Class *cl, OOP_Object *o, OOP_Msg msg) /****************************************************************************************/ -OOP_Object *GDICl__Hidd_Gfx__NewBitMap(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_NewBitMap *msg) +OOP_Object *GDICl__Hidd_Gfx__CreateObject(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_CreateObject *msg) { - HIDDT_ModeID modeid; - struct pHidd_Gfx_NewBitMap p; - OOP_Object *newbm; - HIDDT_StdPixFmt stdpf; - - struct gfx_data *data; - struct TagItem tags[] = + OOP_Object *object = NULL; + + if (msg->cl == XSD(cl)->basebm) { - { aHidd_GDIBitMap_SysDisplay, 0UL }, /* 0 */ - { TAG_IGNORE , 0UL }, /* 1 */ - { TAG_IGNORE , 32 }, /* 2 */ - { TAG_MORE , 0UL } /* 3 */ - }; - - EnterFunc(bug("GDIGfx::NewBitMap()\n")); - data = OOP_INST_DATA(cl, o); - - tags[0].ti_Data = (IPTR)data->display; - tags[1].ti_Data = (IPTR)XSD(cl)->bmclass; - tags[3].ti_Data = (IPTR)msg->attrList; - - /* Create a GDI bitmap if we have a valid ModeID. - - Also GDI bitmap can be created if there's no explicit - pixelformat specification and a friend bitmap is supplied, - which is a GDI bitmap. This is handled in the - superclass. - - Some day when AROS learns to deal with several display drivers at once, this check may go - away completely. This should really be handled by graphics.library. We do it here only because - display bitmap classes are currently private and only drivers themselves know about them. - */ - modeid = (HIDDT_ModeID)GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); - stdpf = (HIDDT_StdPixFmt)GetTagData(aHidd_BitMap_StdPixFmt, vHidd_StdPixFmt_Unknown, msg->attrList); - - if (modeid != vHidd_ModeID_Invalid) { - tags[1].ti_Tag = aHidd_BitMap_ClassPtr; - D(bug("[GDI] ModeID: 0x%08lX, ClassPtr: 0x%p\n", modeid, tags[1].ti_Data)); + HIDDT_ModeID modeid; + struct pHidd_Gfx_CreateObject p; + HIDDT_StdPixFmt stdpf; + + struct gfx_data *data; + struct TagItem tags[] = + { + { aHidd_GDIBitMap_SysDisplay, 0UL }, /* 0 */ + { TAG_IGNORE , 0UL }, /* 1 */ + { TAG_IGNORE , 32 }, /* 2 */ + { TAG_MORE , 0UL } /* 3 */ + }; + + EnterFunc(bug("GDIGfx::CreateObject()\n")); + data = OOP_INST_DATA(cl, o); + + tags[0].ti_Data = (IPTR)data->display; + tags[1].ti_Data = (IPTR)XSD(cl)->bmclass; + tags[3].ti_Data = (IPTR)msg->attrList; + + /* Create a GDI bitmap if we have a valid ModeID. + + Also GDI bitmap can be created if there's no explicit + pixelformat specification and a friend bitmap is supplied, + which is a GDI bitmap. This is handled in the + superclass. + + Some day when AROS learns to deal with several display drivers at once, this check may go + away completely. This should really be handled by graphics.library. We do it here only because + display bitmap classes are currently private and only drivers themselves know about them. + */ + modeid = (HIDDT_ModeID)GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); + stdpf = (HIDDT_StdPixFmt)GetTagData(aHidd_BitMap_StdPixFmt, vHidd_StdPixFmt_Unknown, msg->attrList); + + if (modeid != vHidd_ModeID_Invalid) { + tags[1].ti_Tag = aHidd_BitMap_ClassPtr; + D(bug("[GDI] ModeID: 0x%08lX, ClassPtr: 0x%p\n", modeid, tags[1].ti_Data)); + } + /* longword-align planar bitmaps. This is needed for BlitColorExpansion() to work properly. */ + if (stdpf == vHidd_StdPixFmt_Plane) + tags[2].ti_Tag = aHidd_BitMap_Align; + + p.mID = msg->mID; + p.cl = msg->cl; + p.attrList = tags; + + object = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)&p); } - /* longword-align planar bitmaps. This is needed for BlitColorExpansion() to work properly. */ - if (stdpf == vHidd_StdPixFmt_Plane) - tags[2].ti_Tag = aHidd_BitMap_Align; - - p.mID = msg->mID; - p.attrList = tags; - newbm = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)&p); - ReturnPtr("GDIGfx::NewBitMap", OOP_Object *, newbm); + else + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); + + ReturnPtr("GDIGfx::CreateObject", OOP_Object *, object); } /****************************************************************************************/ diff --git a/arch/all-mingw32/hidd/wingdi/startup.c b/arch/all-mingw32/hidd/wingdi/startup.c index abb58e2d0f..5f354ba5e2 100644 --- a/arch/all-mingw32/hidd/wingdi/startup.c +++ b/arch/all-mingw32/hidd/wingdi/startup.c @@ -1,5 +1,5 @@ /* - Copyright © 1995-2014, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ */ @@ -60,6 +60,8 @@ static int gdi_Startup(struct gdiclbase *LIBBASE) if (!GfxBase) return FALSE; + LIBBASE->xsd.basebm = OOP_FindClass(CLID_Hidd_BitMap); + /* Add keyboard and mouse driver to the system */ kbd = OOP_NewObject(NULL, CLID_HW_Kbd, NULL); ms = OOP_NewObject(NULL, CLID_HW_Mouse, NULL); diff --git a/arch/all-mingw32/hidd/wingdi/wingdi.conf b/arch/all-mingw32/hidd/wingdi/wingdi.conf index d688f9421f..dc884445e0 100644 --- a/arch/all-mingw32/hidd/wingdi/wingdi.conf +++ b/arch/all-mingw32/hidd/wingdi/wingdi.conf @@ -2,7 +2,7 @@ basename GDICl libbase GDIClBase libbasetype struct gdiclbase -version 42.0 +version 42.1 residentpri 9 classid CLID_Hidd_GDIGfx superclass CLID_Hidd_Gfx @@ -24,7 +24,7 @@ Dispose Get Set .interface Hidd_Gfx -NewBitMap +CreateObject Show ShowViewPorts CopyBox diff --git a/arch/all-native/hidd/vga/bitmap.h b/arch/all-native/hidd/vga/bitmap.h index 05ca640e86..57fef97922 100644 --- a/arch/all-native/hidd/vga/bitmap.h +++ b/arch/all-native/hidd/vga/bitmap.h @@ -1,5 +1,5 @@ /* - Copyright © 1995-2011, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ */ @@ -14,7 +14,8 @@ classes, although they don't have a common superclass */ -#define IID_Hidd_VGABitMap "hidd.bitmap.vgabitmap" +#define CLID_Hidd_BitMap_VGA "hidd.bitmap.vga" +#define IID_Hidd_BitMap_VGA "hidd.bitmap.vga" #define HiddVGABitMapAB __abHidd_VGABitMap extern OOP_AttrBase HiddVGABitMapAB; diff --git a/arch/all-native/hidd/vga/vga.h b/arch/all-native/hidd/vga/vga.h index 54dff30bbe..a96435c103 100644 --- a/arch/all-native/hidd/vga/vga.h +++ b/arch/all-native/hidd/vga/vga.h @@ -2,7 +2,7 @@ #define HIDD_VGA_H /* - Copyright © 1995-2011, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: Include for the vga gfx HIDD. @@ -27,8 +27,8 @@ /***** VGA gfx HIDD *******************/ /* IDs */ -#define IID_Hidd_VGAgfx "hidd.gfx.vga" -#define CLID_Hidd_VGAgfx "hidd.gfx.vga" +#define IID_Hidd_Gfx_VGA "hidd.gfx.vga" +#define CLID_Hidd_Gfx_VGA "hidd.gfx.vga" /* misc */ @@ -51,6 +51,9 @@ struct vga_staticdata ULONG mouseVisible; /* Is pointer visible flag */ UBYTE *mouseShape; /* Points to pointer shape */ UBYTE mouseBase; /* Pointer base color */ + + /* baseclass for CreateObject */ + OOP_Class *basebm; }; struct vgabase diff --git a/arch/all-native/hidd/vga/vga_init.c b/arch/all-native/hidd/vga/vga_init.c index e1f5c0c0ee..183c790218 100644 --- a/arch/all-native/hidd/vga/vga_init.c +++ b/arch/all-native/hidd/vga/vga_init.c @@ -1,5 +1,5 @@ /* - Copyright © 1995-2011, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: vga gfx Hidd for standalone AROS @@ -49,7 +49,7 @@ static struct OOP_ABDescr abd[] = { IID_Hidd_Gfx, &HiddGfxAttrBase }, { IID_Hidd_Sync, &HiddSyncAttrBase }, /* Private bases */ - { IID_Hidd_VGABitMap, &HiddVGABitMapAB }, + { IID_Hidd_BitMap_VGA, &HiddVGABitMapAB }, { NULL, NULL } }; @@ -119,6 +119,8 @@ static int PCVGA_Init(LIBBASETYPEPTR LIBBASE) return FALSE; } + xsd->basebm = OOP_FindClass(CLID_Hidd_BitMap); + /* * It is unknown (and no way to know) what hardware part this driver uses. * In order to avoid conflicts with disk-based native-mode hardware diff --git a/arch/all-native/hidd/vga/vgaclass.c b/arch/all-native/hidd/vga/vgaclass.c index d43138ca39..7bbf43495c 100644 --- a/arch/all-native/hidd/vga/vgaclass.c +++ b/arch/all-native/hidd/vga/vgaclass.c @@ -1,5 +1,5 @@ /* - Copyright © 1995-2014, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: Class for VGA and compatible cards. @@ -227,30 +227,41 @@ VOID PCVGA__Root__Get(OOP_Class *cl, OOP_Object *o, struct pRoot_Get *msg) return; } -/********** GfxHidd::NewBitMap() ****************************/ -OOP_Object *PCVGA__Hidd_Gfx__NewBitMap(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_NewBitMap *msg) +/********** GfxHidd::CreateObject() ****************************/ +OOP_Object *PCVGA__Hidd_Gfx__CreateObject(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_CreateObject *msg) { - struct TagItem mytags[2]; - struct pHidd_Gfx_NewBitMap mymsg; - HIDDT_ModeID modeid; - - EnterFunc(bug("VGAGfx::NewBitMap()\n")); - - modeid = (HIDDT_ModeID)GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); - if (vHidd_ModeID_Invalid != modeid) { - /* User supplied a valid modeid. We can use our class */ - mytags[0].ti_Tag = aHidd_BitMap_ClassPtr; - mytags[0].ti_Data = (IPTR)XSD(cl)->bmclass; - mytags[1].ti_Tag = TAG_MORE; - mytags[1].ti_Data = (IPTR)msg->attrList; - /* Like in Gfx::New() we init a new message struct */ - mymsg.mID = msg->mID; - mymsg.attrList = mytags; - /* Pass the new message to the superclass */ - msg = &mymsg; + OOP_Object *object = NULL; + + EnterFunc(bug("VGAGfx::CreateObject()\n")); + + if (msg->cl == XSD(cl)->basebm) + { + struct TagItem mytags[] = + { + { TAG_IGNORE, TAG_IGNORE }, /* Placeholder for aHidd_BitMap_ClassPtr */ + { TAG_MORE, (IPTR)msg->attrList } + }; + + struct pHidd_Gfx_CreateObject mymsg; + HIDDT_ModeID modeid; + + modeid = (HIDDT_ModeID)GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); + if (vHidd_ModeID_Invalid != modeid) { + /* User supplied a valid modeid. We can use our class */ + mytags[0].ti_Tag = aHidd_BitMap_ClassPtr; + mytags[0].ti_Data = (IPTR)XSD(cl)->bmclass; + } + /* Like in Gfx::New() we init a new message struct */ + mymsg.mID = msg->mID; + mymsg.cl = msg->cl; + mymsg.attrList = mytags; + + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)&mymsg); } + else + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); - ReturnPtr("VGAGfx::NewBitMap", OOP_Object *, (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)msg)); + ReturnPtr("VGAGfx::CreateObject", OOP_Object *, object); } /********* GfxHidd::Show() ***************************/ diff --git a/arch/all-native/hidd/vga/vgah.conf b/arch/all-native/hidd/vga/vgah.conf index ea0d9a72aa..06092c50ec 100644 --- a/arch/all-native/hidd/vga/vgah.conf +++ b/arch/all-native/hidd/vga/vgah.conf @@ -1,17 +1,18 @@ ##begin config basename PCVGA libbasetype struct vgabase -version 1.4 +version 42.1 residentpri 8 classptr_field vsd.vgaclass classdatatype struct Vga_Data -classid CLID_Hidd_VGAgfx +classid CLID_Hidd_Gfx_VGA superclass CLID_Hidd_Gfx ##end config ##begin cdefprivate #include "vga.h" #include "vgaclass.h" +#include "bitmap.h" ##end cdefprivate ##begin methodlist @@ -20,7 +21,7 @@ New Dispose Get .interface Hidd_Gfx -NewBitMap +CreateObject Show CopyBox SetCursorShape @@ -33,6 +34,7 @@ SetCursorVisible basename PCVGABM type hidd classptr_field vsd.bmclass +classid CLID_Hidd_BitMap_VGA superclass CLID_Hidd_ChunkyBM classdatatype struct bitmap_data ##end config diff --git a/arch/arm-native/soc/broadcom/2708/hidd/videocoregfx/videocoregfx.conf b/arch/arm-native/soc/broadcom/2708/hidd/videocoregfx/videocoregfx.conf index c28e56a546..6350b278c0 100644 --- a/arch/arm-native/soc/broadcom/2708/hidd/videocoregfx/videocoregfx.conf +++ b/arch/arm-native/soc/broadcom/2708/hidd/videocoregfx/videocoregfx.conf @@ -1,7 +1,7 @@ ##begin config basename VideoCoreGfx libbasetype struct VideoCoreGfxBase -version 1.0 +version 42.1 residentpri 9 classptr_field vsd.vcsd_VideoCoreGfxClass classid CLID_Hidd_VideoCoreGfx @@ -19,7 +19,7 @@ New Dispose Get .interface Hidd_Gfx -NewBitMap +CreateObject ##end methodlist diff --git a/arch/arm-native/soc/broadcom/2708/hidd/videocoregfx/videocoregfx_class.c b/arch/arm-native/soc/broadcom/2708/hidd/videocoregfx/videocoregfx_class.c index 0b5a8383b1..a15e275fd0 100644 --- a/arch/arm-native/soc/broadcom/2708/hidd/videocoregfx/videocoregfx_class.c +++ b/arch/arm-native/soc/broadcom/2708/hidd/videocoregfx/videocoregfx_class.c @@ -1,5 +1,5 @@ /* - Copyright © 2013, The AROS Development Team. All rights reserved. + Copyright © 2013-2015, The AROS Development Team. All rights reserved. $Id$ Desc: VideoCore Gfx Hidd Class. @@ -202,42 +202,52 @@ VOID MNAME_ROOT(Get)(OOP_Class *cl, OOP_Object *o, struct pRoot_Get *msg) OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); } -OOP_Object *MNAME_GFX(NewBitMap)(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_NewBitMap *msg) +OOP_Object *MNAME_GFX(CreateObject)(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_CreateObject *msg) { - BOOL displayable; - BOOL framebuffer; - struct TagItem newbm_tags[2] = - { - {TAG_IGNORE, 0 }, - {TAG_MORE , (IPTR)msg->attrList} - }; - struct pHidd_Gfx_NewBitMap newbm_msg; + OOP_Object *object = NULL; - EnterFunc(bug("VideoCoreGfx::NewBitMap()\n")); + EnterFunc(bug("VideoCoreGfx::CreateObject()\n")); - displayable = (BOOL)GetTagData(aHidd_BitMap_Displayable, FALSE, msg->attrList); - framebuffer = (BOOL)GetTagData(aHidd_BitMap_FrameBuffer, FALSE, msg->attrList); - if (framebuffer) + if (msg->cl == )XSD(cl)->vcsd_basebm) { - D(bug("[VideoCoreGfx] VideoCoreGfx::NewBitMap: Using OnScreenBM\n")); - newbm_tags[0].ti_Tag = aHidd_BitMap_ClassPtr; - newbm_tags[0].ti_Data = (IPTR)XSD(cl)->vcsd_VideoCoreGfxOnBMClass; + BOOL displayable; + BOOL framebuffer; + struct TagItem newbm_tags[2] = + { + {TAG_IGNORE, 0 }, + {TAG_MORE , (IPTR)msg->attrList} + }; + struct pHidd_Gfx_CreateObject newbm_msg; + + displayable = (BOOL)GetTagData(aHidd_BitMap_Displayable, FALSE, msg->attrList); + framebuffer = (BOOL)GetTagData(aHidd_BitMap_FrameBuffer, FALSE, msg->attrList); + if (framebuffer) + { + D(bug("[VideoCoreGfx] VideoCoreGfx::CreateObject: Using OnScreenBM\n")); + newbm_tags[0].ti_Tag = aHidd_BitMap_ClassPtr; + newbm_tags[0].ti_Data = (IPTR)XSD(cl)->vcsd_VideoCoreGfxOnBMClass; + } + else + { + /* Non-displayable friends of our bitmaps are plain chunky bitmaps */ + OOP_Object *friend = (OOP_Object *)GetTagData(aHidd_BitMap_Friend, 0, msg->attrList); + + if (displayable || (friend && (OOP_OCLASS(friend) == XSD(cl)->vcsd_VideoCoreGfxOnBMClass))) + { + D(bug("[VideoCoreGfx] VideoCoreGfx::CreateObject: Using OffScreenBM (ChunkyBM)\n")); + newbm_tags[0].ti_Tag = aHidd_BitMap_ClassID; + newbm_tags[0].ti_Data = (IPTR)CLID_Hidd_ChunkyBM; + } + } + + newbm_msg.mID = msg->mID; + newbm_msg.cl = msg->cl; + newbm_msg.attrList = newbm_tags; + + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)&newbm_msg); } else - { - /* Non-displayable friends of our bitmaps are plain chunky bitmaps */ - OOP_Object *friend = (OOP_Object *)GetTagData(aHidd_BitMap_Friend, 0, msg->attrList); - - if (displayable || (friend && (OOP_OCLASS(friend) == XSD(cl)->vcsd_VideoCoreGfxOnBMClass))) - { - D(bug("[VideoCoreGfx] VideoCoreGfx::NewBitMap: Using OffScreenBM (ChunkyBM)\n")); - newbm_tags[0].ti_Tag = aHidd_BitMap_ClassID; - newbm_tags[0].ti_Data = (IPTR)CLID_Hidd_ChunkyBM; - } - } - - newbm_msg.mID = msg->mID; - newbm_msg.attrList = newbm_tags; + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); - ReturnPtr("VideoCoreGfx::NewBitMap: Obj", OOP_Object *, (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)&newbm_msg)); + ReturnPtr("VideoCoreGfx::CreateObject: Obj", OOP_Object *, object); } diff --git a/arch/arm-native/soc/broadcom/2708/hidd/videocoregfx/videocoregfx_class.h b/arch/arm-native/soc/broadcom/2708/hidd/videocoregfx/videocoregfx_class.h index 06fdc77d0c..dde7225e3d 100644 --- a/arch/arm-native/soc/broadcom/2708/hidd/videocoregfx/videocoregfx_class.h +++ b/arch/arm-native/soc/broadcom/2708/hidd/videocoregfx/videocoregfx_class.h @@ -37,6 +37,8 @@ struct VideoCoreGfx_staticdata { struct SignalSemaphore vcsd_GPUMemLock; struct MemHeaderExt vcsd_GPUMemManage; + OOP_Class *vcsd_basebm; /* baseclass for CreateObject */ + OOP_Class *vcsd_VideoCoreGfxClass; OOP_Object *vcsd_VideoCoreGfxInstance; OOP_Class *vcsd_VideoCoreGfxOnBMClass; diff --git a/arch/arm-native/soc/broadcom/2708/hidd/videocoregfx/videocoregfx_init.c b/arch/arm-native/soc/broadcom/2708/hidd/videocoregfx/videocoregfx_init.c index f9f8c70312..de0823d31c 100644 --- a/arch/arm-native/soc/broadcom/2708/hidd/videocoregfx/videocoregfx_init.c +++ b/arch/arm-native/soc/broadcom/2708/hidd/videocoregfx/videocoregfx_init.c @@ -130,6 +130,7 @@ static int FNAME_SUPPORT(Init)(LIBBASETYPEPTR LIBBASE) if ((GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 41)) != NULL) { + LIBBASE->vsd.vcsd_basebm = OOP_FindClass(CLID_Hidd_BitMap); if (AddDisplayDriver(LIBBASE->vsd.vcsd_VideoCoreGfxClass, NULL, DDRV_BootMode, TRUE, TAG_DONE) == DD_OK) { bug("[VideoCoreGfx] BootMode Display Driver Registered\n"); diff --git a/arch/m68k-amiga/hidd/gfx/amigavideo.conf b/arch/m68k-amiga/hidd/gfx/amigavideo.conf index 31d5e7a1d2..c15cac217f 100644 --- a/arch/m68k-amiga/hidd/gfx/amigavideo.conf +++ b/arch/m68k-amiga/hidd/gfx/amigavideo.conf @@ -2,7 +2,7 @@ basename AmigaVideoCl libbase AmigaVideoClBase libbasetype struct amigavideoclbase -version 1.0 +version 42.1 residentpri 9 classid CLID_Hidd_AmigaVideoGfx superclass CLID_Hidd_Gfx @@ -29,7 +29,7 @@ Set .interface Hidd_Gfx CopyBox CopyBoxMasked -NewBitMap +CreateObject ShowViewPorts GetMaxSpriteSize SetCursorShape diff --git a/arch/m68k-amiga/hidd/gfx/amigavideogfx.c b/arch/m68k-amiga/hidd/gfx/amigavideogfx.c index bd31d756fe..795bd7e0e9 100644 --- a/arch/m68k-amiga/hidd/gfx/amigavideogfx.c +++ b/arch/m68k-amiga/hidd/gfx/amigavideogfx.c @@ -1,5 +1,5 @@ /* - Copyright © 1995-2011, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: @@ -647,29 +647,41 @@ VOID AmigaVideoCl__Root__Dispose(OOP_Class *cl, OOP_Object *o, OOP_Msg msg) } -OOP_Object *AmigaVideoCl__Hidd_Gfx__NewBitMap(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_NewBitMap *msg) +OOP_Object *AmigaVideoCl__Hidd_Gfx__CreateObject(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_CreateObject *msg) { - struct amigavideo_staticdata *csd = CSD(cl); - struct Library *UtilityBase = csd->cs_UtilityBase; - HIDDT_ModeID modeid; - struct pHidd_Gfx_NewBitMap newbitmap; - struct TagItem tags[2]; - - EnterFunc(bug("AGFX::NewBitMap()\n")); - - modeid = (HIDDT_ModeID)GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); - D(bug("modeid=%08x\n", modeid)); - if (modeid != vHidd_ModeID_Invalid) { - tags[0].ti_Tag = aHidd_BitMap_ClassPtr; - tags[0].ti_Data = (IPTR)CSD(cl)->amigabmclass; - tags[1].ti_Tag = TAG_MORE; - tags[1].ti_Data = (IPTR)msg->attrList; - newbitmap.mID = msg->mID; - newbitmap.attrList = tags; - msg = &newbitmap; + OOP_Object *object = NULL; + + EnterFunc(bug("AGFX::CreateObject()\n")); + + if (msg->cl == CSD(cl)->cs_basebm) + { + struct amigavideo_staticdata *csd = CSD(cl); + struct Library *UtilityBase = csd->cs_UtilityBase; + HIDDT_ModeID modeid; + struct pHidd_Gfx_CreateObject p; + struct TagItem tags[] = + { + { TAG_IGNORE, TAG_IGNORE }, /* Placeholder for aHidd_BitMap_ClassPtr */ + { TAG_MORE, (IPTR)msg->attrList } + }; + + modeid = (HIDDT_ModeID)GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); + D(bug("modeid=%08x\n", modeid)); + if (modeid != vHidd_ModeID_Invalid) { + tags[0].ti_Tag = aHidd_BitMap_ClassPtr; + tags[0].ti_Data = (IPTR)CSD(cl)->amigabmclass; + + } + p.mID = msg->mID; + p.cl = msg->cl; + p.attrList = tags; + + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)&p); } + else + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); - ReturnPtr("AGFX::NewBitMap", OOP_Object *, (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)msg)); + ReturnPtr("AGFX::CreateObject", OOP_Object *, object); } VOID AmigaVideoCl__Root__Get(OOP_Class *cl, OOP_Object *o, struct pRoot_Get *msg) diff --git a/arch/m68k-amiga/hidd/gfx/amigavideogfx.h b/arch/m68k-amiga/hidd/gfx/amigavideogfx.h index 907bcd345e..8553ac4ab9 100644 --- a/arch/m68k-amiga/hidd/gfx/amigavideogfx.h +++ b/arch/m68k-amiga/hidd/gfx/amigavideogfx.h @@ -42,6 +42,8 @@ struct NativeChipsetMode struct amigavideo_staticdata { + OOP_Class *cs_basebm /* baseclass for CreateObject */ + OOP_Class *amigagfxclass; OOP_Class *amigabmclass; diff --git a/arch/m68k-amiga/hidd/gfx/startup.c b/arch/m68k-amiga/hidd/gfx/startup.c index 4e57c42cf3..c62994be25 100644 --- a/arch/m68k-amiga/hidd/gfx/startup.c +++ b/arch/m68k-amiga/hidd/gfx/startup.c @@ -1,5 +1,5 @@ /* - Copyright © 1995-2014, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ */ @@ -32,6 +32,9 @@ static int AmigaVideo_Init(LIBBASETYPEPTR LIBBASE) initcustom(&LIBBASE->csd); GfxBase = LIBBASE->csd.cs_GfxBase; + + LIBBASE->csd.cs_basebm = OOP_FindClass(CLID_Hidd_BitMap); + Init_AmigaVideoClass(LIBBASE); LIBBASE->library.lib_OpenCnt = 1; diff --git a/arch/m68k-amiga/hidd/uaegfx/startup.c b/arch/m68k-amiga/hidd/uaegfx/startup.c index c62a8e6c5d..32b740269e 100644 --- a/arch/m68k-amiga/hidd/uaegfx/startup.c +++ b/arch/m68k-amiga/hidd/uaegfx/startup.c @@ -1,5 +1,5 @@ /* - Copyright © 1995-2014, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ */ @@ -34,6 +34,8 @@ static int UAEGFX_Init(LIBBASETYPEPTR LIBBASE) if (!GfxBase) return FALSE; + LIBBASE->csd.basebm = OOP_FindClass(CLID_Hidd_BitMap); + if (!Init_UAEGFXClass(LIBBASE)) { CloseLibrary(GfxBase); return FALSE; diff --git a/arch/m68k-amiga/hidd/uaegfx/uaegfx.c b/arch/m68k-amiga/hidd/uaegfx/uaegfx.c index 6d6064102d..d80661a6ac 100644 --- a/arch/m68k-amiga/hidd/uaegfx/uaegfx.c +++ b/arch/m68k-amiga/hidd/uaegfx/uaegfx.c @@ -1,5 +1,5 @@ /* - Copyright 1995-2010, The AROS Development Team. All rights reserved. + Copyright 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: @@ -477,27 +477,38 @@ OOP_Object *UAEGFXCl__Root__New(OOP_Class *cl, OOP_Object *o, struct pRoot_New * } /********** GfxHidd::Dispose() ******************************/ -OOP_Object *UAEGFXCl__Hidd_Gfx__NewBitMap(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_NewBitMap *msg) -{ - struct uaegfx_staticdata *csd = CSD(cl); - HIDDT_ModeID modeid; - struct pHidd_Gfx_NewBitMap newbitmap; - struct TagItem tags[2]; - - EnterFunc(bug("UAEGFX::NewBitMap()\n")); - - modeid = (HIDDT_ModeID)GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); - if (modeid != vHidd_ModeID_Invalid) { - tags[0].ti_Tag = aHidd_BitMap_ClassPtr; - tags[0].ti_Data = (IPTR)CSD(cl)->bmclass; - tags[1].ti_Tag = TAG_MORE; - tags[1].ti_Data = (IPTR)msg->attrList; - newbitmap.mID = msg->mID; - newbitmap.attrList = tags; - msg = &newbitmap; +OOP_Object *UAEGFXCl__Hidd_Gfx__CreateObject(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_CreateObject *msg) +{ + OOP_Object *object = NULL; + + EnterFunc(bug("UAEGFX::CreateObject()\n")); + + if (msg->cl == CSD(cl)->basebm) + { + struct uaegfx_staticdata *csd = CSD(cl); + HIDDT_ModeID modeid; + struct pHidd_Gfx_CreateObject p; + struct TagItem tags[] = + { + { TAG_IGNORE, TAG_IGNORE }, /* Placeholder for aHidd_BitMap_ClassPtr */ + { TAG_MORE, (IPTR)msg->attrList } + }; + + modeid = (HIDDT_ModeID)GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); + if (modeid != vHidd_ModeID_Invalid) { + tags[0].ti_Tag = aHidd_BitMap_ClassPtr; + tags[0].ti_Data = (IPTR)CSD(cl)->bmclass; + } + p.mID = msg->mID; + p.cl = msg->cl; + p.attrList = tags; + + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)&p); } + else + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); - ReturnPtr("UAEGFX::NewBitMap", OOP_Object *, (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)msg)); + ReturnPtr("UAEGFX::CreateObject", OOP_Object *, object); } VOID UAEGFXCl__Root__Get(OOP_Class *cl, OOP_Object *o, struct pRoot_Get *msg) diff --git a/arch/m68k-amiga/hidd/uaegfx/uaegfx.conf b/arch/m68k-amiga/hidd/uaegfx/uaegfx.conf index 8007574214..21710fd21f 100644 --- a/arch/m68k-amiga/hidd/uaegfx/uaegfx.conf +++ b/arch/m68k-amiga/hidd/uaegfx/uaegfx.conf @@ -2,7 +2,7 @@ basename UAEGFXCl libbase UAEGFXClBase libbasetype struct UAEGFXclbase -version 1.0 +version 42.1 residentpri -10 classid CLID_Hidd_UAEGfx superclass CLID_Hidd_Gfx @@ -29,7 +29,7 @@ Set CheckMode CopyBox CopyBoxMasked -NewBitMap +CreateObject Show ShowViewPorts PrepareViewPorts diff --git a/arch/m68k-amiga/hidd/uaegfx/uaegfx.h b/arch/m68k-amiga/hidd/uaegfx/uaegfx.h index 5924b140fa..afdcd21a55 100644 --- a/arch/m68k-amiga/hidd/uaegfx/uaegfx.h +++ b/arch/m68k-amiga/hidd/uaegfx/uaegfx.h @@ -35,6 +35,7 @@ struct RTGMode struct uaegfx_staticdata { + OOP_Class *basebm; /* baseclass for CreateObject */ OOP_Class *gfxclass; OOP_Class *bmclass; diff --git a/rom/hidds/vesa/vesagfx.conf b/rom/hidds/vesa/vesagfx.conf index 01d63b03b4..aafed9da8a 100644 --- a/rom/hidds/vesa/vesagfx.conf +++ b/rom/hidds/vesa/vesagfx.conf @@ -1,7 +1,7 @@ ##begin config basename PCVesa libbasetype struct VesaGfxBase -version 1.2 +version 42.3 residentpri 9 classptr_field vsd.vesagfxclass classdatatype struct VesaGfx_data @@ -20,7 +20,7 @@ New Dispose Get .interface Hidd_Gfx -NewBitMap +CreateObject Show ##end methodlist diff --git a/rom/hidds/vesa/vesagfx_init.c b/rom/hidds/vesa/vesagfx_init.c index 61a131cf3f..20ce975c02 100644 --- a/rom/hidds/vesa/vesagfx_init.c +++ b/rom/hidds/vesa/vesagfx_init.c @@ -1,5 +1,5 @@ /* - Copyright © 1995-2011, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: vesa gfx Hidd for standalone i386 AROS @@ -77,48 +77,50 @@ static int PCVesa_Init(LIBBASETYPEPTR LIBBASE) ULONG err; int res = FALSE; - if (!GetAttrBases(interfaces, xsd->attrBases, ATTRBASES_NUM)) - return FALSE; - - InitSemaphore(&xsd->framebufferlock); - InitSemaphore(&xsd->HW_acc); - - if (!initVesaGfxHW(&xsd->data)) - return FALSE; - - D(bug("[VESA] Init: Everything OK, installing driver\n")); - /* * Open graphics.library ourselves because we will close it * after adding the driver. * Autoinit code would close it only upon driver expunge. */ GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 41); - if (!GfxBase) + if (GfxBase) { - D(bug("[VESA] Failed to open graphics.library!\n")); - - return FALSE; + if (initVesaGfxHW(&xsd->data)) + { + if (GetAttrBases(interfaces, xsd->attrBases, ATTRBASES_NUM)) + { + xsd->basebm = OOP_FindClass(CLID_Hidd_BitMap); + D(bug("[VESA] BitMap class @ 0x%p\n", xsd->basebm)); + + InitSemaphore(&xsd->framebufferlock); + InitSemaphore(&xsd->HW_acc); + + D(bug("[VESA] Init: Everything OK, installing driver\n")); + + /* + * It is unknown (and no way to know) what hardware part this driver uses. + * In order to avoid conflicts with disk-based native-mode hardware + * drivers it needs to be removed from the system when some other driver + * is installed. + * This is done by graphics.library if DDRV_BootMode is set to TRUE. + */ + err = AddDisplayDriver(xsd->vesagfxclass, NULL, DDRV_BootMode, TRUE, TAG_DONE); + + D(bug("[VESA] AddDisplayDriver() result: %u\n", err)); + if (!err) + { + /* expunge protection */ + LIBBASE->library.lib_OpenCnt = 1; + res = TRUE; + } + } + } + CloseLibrary(&GfxBase->LibNode); } - - /* - * It is unknown (and no way to know) what hardware part this driver uses. - * In order to avoid conflicts with disk-based native-mode hardware - * drivers it needs to be removed from the system when some other driver - * is installed. - * This is done by graphics.library if DDRV_BootMode is set to TRUE. - */ - err = AddDisplayDriver(LIBBASE->vsd.vesagfxclass, NULL, DDRV_BootMode, TRUE, TAG_DONE); - - D(bug("[VESA] AddDisplayDriver() result: %u\n", err)); - if (!err) + else { - /* We use ourselves, and no one else does */ - LIBBASE->library.lib_OpenCnt = 1; - res = TRUE; + D(bug("[VESA] Failed to open graphics.library!\n")); } - - CloseLibrary(&GfxBase->LibNode); return res; } diff --git a/rom/hidds/vesa/vesagfxclass.c b/rom/hidds/vesa/vesagfxclass.c index bb7d0fad79..2fde54e6f4 100644 --- a/rom/hidds/vesa/vesagfxclass.c +++ b/rom/hidds/vesa/vesagfxclass.c @@ -1,5 +1,5 @@ /* - Copyright © 1995-2011, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: Class for Vesa. @@ -87,6 +87,8 @@ OOP_Object *PCVesa__Root__New(OOP_Class *cl, OOP_Object *o, struct pRoot_New *ms }; struct pRoot_New yourmsg; + EnterFunc(bug("VesaGfx::New()\n")); + /* Protect against some stupid programmer wishing to create one more VESA driver */ if (XSD(cl)->vesagfxhidd) @@ -110,9 +112,8 @@ OOP_Object *PCVesa__Root__New(OOP_Class *cl, OOP_Object *o, struct pRoot_New *ms yourtags[1].ti_Data = (IPTR)msg->attrList; yourmsg.mID = msg->mID; yourmsg.attrList = yourtags; - msg = &yourmsg; - EnterFunc(bug("VesaGfx::New()\n")); - o = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); + + o = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)&yourmsg); if (o) { struct VesaGfx_data *data = OOP_INST_DATA(cl, o); @@ -152,41 +153,53 @@ VOID PCVesa__Root__Get(OOP_Class *cl, OOP_Object *o, struct pRoot_Get *msg) OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); } -OOP_Object *PCVesa__Hidd_Gfx__NewBitMap(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_NewBitMap *msg) +OOP_Object *PCVesa__Hidd_Gfx__CreateObject(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_CreateObject *msg) { - BOOL displayable; - struct TagItem tags[2] = - { - {TAG_IGNORE, 0 }, - {TAG_MORE , (IPTR)msg->attrList} - }; - struct pHidd_Gfx_NewBitMap yourmsg; + OOP_Object *object = NULL; - EnterFunc(bug("VesaGfx::NewBitMap()\n")); + D(bug("[VESA] %s()\n", __PRETTY_FUNCTION__)); + D(bug("[VESA] %s: requested class 0x%p\n", __PRETTY_FUNCTION__, msg->cl)); + D(bug("[VESA] %s: base bitmap class 0x%p\n", __PRETTY_FUNCTION__, XSD(cl)->basebm)); - displayable = GetTagData(aHidd_BitMap_Displayable, FALSE, msg->attrList); - if (displayable) + if (msg->cl == XSD(cl)->basebm) { - /* Only displayable bitmaps are bitmaps of our class */ - tags[0].ti_Tag = aHidd_BitMap_ClassPtr; - tags[0].ti_Data = (IPTR)XSD(cl)->bmclass; + BOOL displayable; + struct TagItem tags[2] = + { + {TAG_IGNORE, 0 }, + {TAG_MORE , (IPTR)msg->attrList} + }; + struct pHidd_Gfx_CreateObject p; + + displayable = GetTagData(aHidd_BitMap_Displayable, FALSE, msg->attrList); + if (displayable) + { + /* Only displayable bitmaps are bitmaps of our class */ + tags[0].ti_Tag = aHidd_BitMap_ClassPtr; + tags[0].ti_Data = (IPTR)XSD(cl)->bmclass; + } + else + { + /* Non-displayable friends of our bitmaps are plain chunky bitmaps */ + OOP_Object *friend = (OOP_Object *)GetTagData(aHidd_BitMap_Friend, 0, msg->attrList); + + if (friend && (OOP_OCLASS(friend) == XSD(cl)->bmclass)) + { + tags[0].ti_Tag = aHidd_BitMap_ClassID; + tags[0].ti_Data = (IPTR)CLID_Hidd_ChunkyBM; + } + } + + p.mID = msg->mID; + p.cl = msg->cl; + p.attrList = tags; + + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)&p); } else - { - /* Non-displayable friends of our bitmaps are plain chunky bitmaps */ - OOP_Object *friend = (OOP_Object *)GetTagData(aHidd_BitMap_Friend, 0, msg->attrList); - - if (friend && (OOP_OCLASS(friend) == XSD(cl)->bmclass)) - { - tags[0].ti_Tag = aHidd_BitMap_ClassID; - tags[0].ti_Data = (IPTR)CLID_Hidd_ChunkyBM; - } - } - - yourmsg.mID = msg->mID; - yourmsg.attrList = tags; + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); - ReturnPtr("VesaGfx::NewBitMap", OOP_Object *, (OOP_Object *)OOP_DoSuperMethod(cl, o, &yourmsg.mID)); + ReturnPtr("VesaGfx::CreateObject", OOP_Object *, object); } /********* GfxHidd::Show() ***************************/ diff --git a/rom/hidds/vesa/vesagfxclass.h b/rom/hidds/vesa/vesagfxclass.h index 50aac3e1eb..116089abda 100644 --- a/rom/hidds/vesa/vesagfxclass.h +++ b/rom/hidds/vesa/vesagfxclass.h @@ -2,7 +2,7 @@ #define HIDD_VESAGFXCLASS_H /* - Copyright © 1995-2011, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: Some VesaGfx useful data. @@ -33,6 +33,8 @@ struct VesaGfx_data struct VesaGfx_staticdata { + OOP_Class *basebm; /* baseclass for CreateObject */ + OOP_Class *vesagfxclass; OOP_Class *bmclass; OOP_Object *vesagfxhidd; diff --git a/workbench/devs/monitors/Compositor/compositorclass.c b/workbench/devs/monitors/Compositor/compositorclass.c index 21919e1b8c..a58b3f915c 100644 --- a/workbench/devs/monitors/Compositor/compositorclass.c +++ b/workbench/devs/monitors/Compositor/compositorclass.c @@ -1,5 +1,5 @@ /* - Copyright © 2010-2014, The AROS Development Team. All rights reserved. + Copyright © 2010-2015, The AROS Development Team. All rights reserved. $Id$ */ @@ -783,7 +783,7 @@ static BOOL HIDDCompositorToggleCompositing(struct HIDDCompositorData *compdata, if (freebm) FreeBitMap(freebm); else - HIDD_Gfx_DisposeBitMap(compdata->gfx, oldintermedbitmap); + OOP_DisposeObject(oldintermedbitmap); compdata->intermedbitmap = NULL; } @@ -798,7 +798,7 @@ static BOOL HIDDCompositorToggleCompositing(struct HIDDCompositorData *compdata, if (freebm) FreeBitMap(freebm); else - HIDD_Gfx_DisposeBitMap(compdata->gfx, olddisplaybitmap); + OOP_DisposeObject(olddisplaybitmap); } /* Handled */ @@ -833,7 +833,7 @@ static void HIDDCompositorShowSingle(struct HIDDCompositorData *compdata, OOP_Ob { /* Be careful with the framebuffer */ if (compdata->displaybitmap != compdata->fb) - HIDD_Gfx_DisposeBitMap(compdata->gfx, compdata->displaybitmap); + OOP_DisposeObject(compdata->displaybitmap); /* This will deactivate us */ compdata->displaybitmap = NULL; @@ -983,7 +983,7 @@ OOP_Object *METHOD(Compositor, Root, New) if ((compdata->GraphicsBase) && (compdata->gfx != NULL)) { /* Create GC object that will be used for drawing operations */ - compdata->gc = HIDD_Gfx_NewGC(compdata->gfx, NULL); + compdata->gc = HIDD_Gfx_CreateObject(compdata->gfx, OOP_FindClass(CLID_Hidd_GC), NULL); D(bug("[%s] Compositor GC @ %p\n", __PRETTY_FUNCTION__, compdata->gc)); diff --git a/workbench/devs/monitors/Compositor/include/compositor.h b/workbench/devs/monitors/Compositor/include/compositor.h index a2edb6510d..0fb4eba237 100644 --- a/workbench/devs/monitors/Compositor/include/compositor.h +++ b/workbench/devs/monitors/Compositor/include/compositor.h @@ -1,12 +1,25 @@ #ifndef HIDD_COMPOSITOR_H #define HIDD_COMPOSITOR_H /* - Copyright © 2010-2013, The AROS Development Team. All rights reserved. + Copyright © 2010-2015, The AROS Development Team. All rights reserved. $Id$ */ -#include -#include +#ifndef EXEC_TYPES_H +# include +#endif + +#ifndef HIDD_HIDD_H +# include +#endif + +#ifndef OOP_OOP_H +# include +#endif + +#ifndef HIDD_GRAPHICS +# include +#endif /* * Things described here are actually system-internal. diff --git a/workbench/devs/monitors/IntelGMA/galliumclass.c b/workbench/devs/monitors/IntelGMA/galliumclass.c index 028b148f3f..6b747cc9d1 100644 --- a/workbench/devs/monitors/IntelGMA/galliumclass.c +++ b/workbench/devs/monitors/IntelGMA/galliumclass.c @@ -1,5 +1,5 @@ /* - Copyright © 2011, The AROS Development Team. All rights reserved. + Copyright © 2011-2015, The AROS Development Team. All rights reserved. $Id$ */ @@ -86,10 +86,9 @@ BOOL InitGalliumClass() || sd->ProductID == 0x2993 ){ CloseLibrary( OpenLibrary("gallium.library",0)); // ??? - + if((HiddGalliumAttrBase = OOP_ObtainAttrBase(IID_Hidd_Gallium))) { - struct TagItem Gallium_tags[] = { {aMeta_SuperID , (IPTR)CLID_Hidd_Gallium }, @@ -98,19 +97,21 @@ BOOL InitGalliumClass() {aMeta_ID , (IPTR)"hidd.gallium.i915"}, {TAG_DONE, 0} }; - + + sd->basegallium = OOP_FindClass(CLID_Hidd_Gallium); + sd->galliumclass = OOP_NewObject(NULL, CLID_HiddMeta, Gallium_tags); if (sd->galliumclass) { sd->galliumclass->UserData = sd; OOP_AddClass(sd->galliumclass); i915MemPool = CreatePool(MEMF_PUBLIC | MEMF_CLEAR | MEMF_SEM_PROTECTED, 32 * 1024, 16 * 1024); - + init_aros_winsys(); bug("i915 gallium init OK\n"); return TRUE; } - + OOP_ReleaseAttrBase(IID_Hidd_Gallium); } } diff --git a/workbench/devs/monitors/IntelGMA/intelG45_class.c b/workbench/devs/monitors/IntelGMA/intelG45_class.c index 095dc4328c..28305b0759 100644 --- a/workbench/devs/monitors/IntelGMA/intelG45_class.c +++ b/workbench/devs/monitors/IntelGMA/intelG45_class.c @@ -666,48 +666,60 @@ void METHOD(INTELG45, Root, Set) } -OOP_Object * METHOD(INTELG45, Hidd_Gfx, NewBitMap) +OOP_Object * METHOD(INTELG45, Hidd_Gfx, CreateObject) { - struct pHidd_Gfx_NewBitMap mymsg; - HIDDT_ModeID modeid; - HIDDT_StdPixFmt stdpf; + OOP_Object *object = NULL; - struct TagItem mytags [] = + if (msg->cl == SD(cl)->basebm) { - { TAG_IGNORE, TAG_IGNORE }, /* Placeholder for aHidd_BitMap_ClassPtr */ - { TAG_IGNORE, TAG_IGNORE }, /* Placeholder for aHidd_BitMap_Align */ - { aHidd_BitMap_IntelG45_CompositingHidd, (IPTR)sd->compositing }, - { TAG_MORE, (IPTR)msg->attrList } - }; + struct pHidd_Gfx_CreateObject mymsg; + HIDDT_ModeID modeid; + HIDDT_StdPixFmt stdpf; - /* Check if user provided valid ModeID */ - /* Check for framebuffer - not needed as IntelG45 is a NoFramebuffer driver */ - /* Check for displayable - not needed - displayable has ModeID and we don't - distinguish between on-screen and off-screen bitmaps */ - modeid = (HIDDT_ModeID)GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); - if (vHidd_ModeID_Invalid != modeid) - { - /* User supplied a valid modeid. We can use our bitmap class */ - mytags[0].ti_Tag = aHidd_BitMap_ClassPtr; - mytags[0].ti_Data = (IPTR)SD(cl)->BMClass; - } - - /* Check if bitmap is a planar bitmap */ - stdpf = (HIDDT_StdPixFmt)GetTagData(aHidd_BitMap_StdPixFmt, vHidd_StdPixFmt_Unknown, msg->attrList); - if (vHidd_StdPixFmt_Plane == stdpf) + struct TagItem mytags [] = + { + { TAG_IGNORE, TAG_IGNORE }, /* Placeholder for aHidd_BitMap_ClassPtr */ + { TAG_IGNORE, TAG_IGNORE }, /* Placeholder for aHidd_BitMap_Align */ + { aHidd_BitMap_IntelG45_CompositingHidd, (IPTR)sd->compositing }, + { TAG_MORE, (IPTR)msg->attrList } + }; + + /* Check if user provided valid ModeID */ + /* Check for framebuffer - not needed as IntelG45 is a NoFramebuffer driver */ + /* Check for displayable - not needed - displayable has ModeID and we don't + distinguish between on-screen and off-screen bitmaps */ + modeid = (HIDDT_ModeID)GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); + if (vHidd_ModeID_Invalid != modeid) + { + /* User supplied a valid modeid. We can use our bitmap class */ + mytags[0].ti_Tag = aHidd_BitMap_ClassPtr; + mytags[0].ti_Data = (IPTR)SD(cl)->BMClass; + } + + /* Check if bitmap is a planar bitmap */ + stdpf = (HIDDT_StdPixFmt)GetTagData(aHidd_BitMap_StdPixFmt, vHidd_StdPixFmt_Unknown, msg->attrList); + if (vHidd_StdPixFmt_Plane == stdpf) + { + mytags[1].ti_Tag = aHidd_BitMap_Align; + mytags[1].ti_Data = 32; + } + + /* We init a new message struct */ + mymsg.mID = msg->mID; + mymsg.cl = msg->cl; + mymsg.attrList = mytags; + + /* Pass the new message to the superclass */ + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)&mymsg); + } + else if (SD(cl)->basegallium && (msg->cl == SD(cl)->basegallium)) { - mytags[1].ti_Tag = aHidd_BitMap_Align; - mytags[1].ti_Data = 32; + object = OOP_NewObject(NULL, CLID_Hidd_Gallium_IntelGMA, msg->attrList); } - - /* We init a new message struct */ - mymsg.mID = msg->mID; - mymsg.attrList = mytags; - - /* Pass the new message to the superclass */ - msg = &mymsg; + else + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); - return (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); + return object; } @@ -1016,7 +1028,7 @@ static const struct OOP_MethodDescr INTELG45_Root_descr[] = static const struct OOP_MethodDescr INTELG45_Hidd_Gfx_descr[] = { {(OOP_MethodFunc)INTELG45__Hidd_Gfx__CopyBox , moHidd_Gfx_CopyBox }, - {(OOP_MethodFunc)INTELG45__Hidd_Gfx__NewBitMap , moHidd_Gfx_NewBitMap }, + {(OOP_MethodFunc)INTELG45__Hidd_Gfx__CreateObject , moHidd_Gfx_CreateObject }, {(OOP_MethodFunc)INTELG45__Hidd_Gfx__SetCursorVisible, moHidd_Gfx_SetCursorVisible}, {(OOP_MethodFunc)INTELG45__Hidd_Gfx__SetCursorPos , moHidd_Gfx_SetCursorPos }, {(OOP_MethodFunc)INTELG45__Hidd_Gfx__SetCursorShape , moHidd_Gfx_SetCursorShape }, diff --git a/workbench/devs/monitors/IntelGMA/intelG45_intern.h b/workbench/devs/monitors/IntelGMA/intelG45_intern.h index f7314bef31..1d332adfb4 100644 --- a/workbench/devs/monitors/IntelGMA/intelG45_intern.h +++ b/workbench/devs/monitors/IntelGMA/intelG45_intern.h @@ -155,6 +155,9 @@ struct g45staticdata uint32_t DDCPort; + OOP_Class *basebm; /* baseclass for CreateObject */ + OOP_Class *basegallium; /* baseclass for CreateObject */ + OOP_Class * IntelG45Class; OOP_Class * IntelI2C; OOP_Class * BMClass; diff --git a/workbench/devs/monitors/IntelGMA/startup.c b/workbench/devs/monitors/IntelGMA/startup.c index cdbea4d4b7..2417476ae4 100644 --- a/workbench/devs/monitors/IntelGMA/startup.c +++ b/workbench/devs/monitors/IntelGMA/startup.c @@ -170,6 +170,8 @@ int main(void) success = FALSE; } + sd.basebm = OOP_FindClass(CLID_Hidd_BitMap); + if (success) { struct TagItem INTELG45_tags[] = diff --git a/workbench/hidds/nouveau/nouveau.conf b/workbench/hidds/nouveau/nouveau.conf index 2b73e81053..58e5cb5d56 100644 --- a/workbench/hidds/nouveau/nouveau.conf +++ b/workbench/hidds/nouveau/nouveau.conf @@ -1,5 +1,5 @@ ##begin config -version 6.24 +version 42.25 options noexpunge basename Nouveau libbasetype struct IntHIDDNouveauBase @@ -19,7 +19,7 @@ classdatatype struct HIDDNouveauData New Get .interface Hidd_Gfx -NewBitMap +CreateObject CopyBox SetCursorVisible SetCursorPos diff --git a/workbench/hidds/nouveau/nouveau_init.c b/workbench/hidds/nouveau/nouveau_init.c index 14790c36bb..4e2c3a3a0f 100644 --- a/workbench/hidds/nouveau/nouveau_init.c +++ b/workbench/hidds/nouveau/nouveau_init.c @@ -1,5 +1,5 @@ /* - Copyright © 2010-2013, The AROS Development Team. All rights reserved. + Copyright © 2010-2015, The AROS Development Team. All rights reserved. $Id$ */ @@ -40,7 +40,10 @@ static ULONG Nouveau_Init(LIBBASETYPEPTR LIBBASE) if (!OOP_ObtainAttrBases(attrbases)) return FALSE; - + + LIBBASE->sd.basebm = OOP_FindClass(CLID_Hidd_BitMap); + LIBBASE->sd.basegallium = OOP_FindClass(CLID_Hidd_Gallium); + LIBBASE->sd.mid_CopyMemBox16 = OOP_GetMethodID((STRPTR)IID_Hidd_BitMap, moHidd_BitMap_CopyMemBox16); LIBBASE->sd.mid_CopyMemBox32 = OOP_GetMethodID((STRPTR)IID_Hidd_BitMap, moHidd_BitMap_CopyMemBox32); LIBBASE->sd.mid_PutMem32Image16 = OOP_GetMethodID((STRPTR)IID_Hidd_BitMap, moHidd_BitMap_PutMem32Image16); diff --git a/workbench/hidds/nouveau/nouveau_intern.h b/workbench/hidds/nouveau/nouveau_intern.h index e416b20dad..2774884e5a 100644 --- a/workbench/hidds/nouveau/nouveau_intern.h +++ b/workbench/hidds/nouveau/nouveau_intern.h @@ -1,7 +1,7 @@ #ifndef _NOUVEAU_INTERN_H #define _NOUVEAU_INTERN_H /* - Copyright © 2010-2013, The AROS Development Team. All rights reserved. + Copyright © 2010-2015, The AROS Development Team. All rights reserved. $Id$ */ @@ -159,6 +159,9 @@ struct CardData struct staticdata { + OOP_Class *basebm; /* baseclass for CreateObject */ + OOP_Class *basegallium; /* baseclass for CreateObject */ + OOP_Class *gfxclass; OOP_Class *bmclass; OOP_Class *i2cclass; diff --git a/workbench/hidds/nouveau/nouveauclass.c b/workbench/hidds/nouveau/nouveauclass.c index 42f6d1a464..8e5e9b2e80 100644 --- a/workbench/hidds/nouveau/nouveauclass.c +++ b/workbench/hidds/nouveau/nouveauclass.c @@ -1,5 +1,5 @@ /* - Copyright © 2010-2013, The AROS Development Team. All rights reserved. + Copyright © 2010-2015, The AROS Development Team. All rights reserved. $Id$ */ @@ -544,48 +544,61 @@ OOP_Object * METHOD(Nouveau, Root, New) /* FIXME: IMPLEMENT DISPOSE BITMAP - REMOVE FROM FB IF MARKED AS SUCH */ -OOP_Object * METHOD(Nouveau, Hidd_Gfx, NewBitMap) +OOP_Object * METHOD(Nouveau, Hidd_Gfx, CreateObject) { - struct pHidd_Gfx_NewBitMap mymsg; - HIDDT_ModeID modeid; - HIDDT_StdPixFmt stdpf; struct HIDDNouveauData * gfxdata = OOP_INST_DATA(cl, o); - struct TagItem mytags [] = - { - { TAG_IGNORE, TAG_IGNORE }, /* Placeholder for aHidd_BitMap_ClassPtr */ - { TAG_IGNORE, TAG_IGNORE }, /* Placeholder for aHidd_BitMap_Align */ - { aHidd_BitMap_Nouveau_CompositorHidd, (IPTR)gfxdata->compositor }, - { TAG_MORE, (IPTR)msg->attrList } - }; + OOP_Object *object = NULL; - /* Check if user provided valid ModeID */ - /* Check for framebuffer - not needed as Nouveau is a NoFramebuffer driver */ - /* Check for displayable - not needed - displayable has ModeID and we don't - distinguish between on-screen and off-screen bitmaps */ - modeid = (HIDDT_ModeID)GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); - if (vHidd_ModeID_Invalid != modeid) + if (msg->cl == SD(cl)->basebm) { - /* User supplied a valid modeid. We can use our bitmap class */ - mytags[0].ti_Tag = aHidd_BitMap_ClassPtr; - mytags[0].ti_Data = (IPTR)SD(cl)->bmclass; - } - - /* Check if bitmap is a planar bitmap */ - stdpf = (HIDDT_StdPixFmt)GetTagData(aHidd_BitMap_StdPixFmt, vHidd_StdPixFmt_Unknown, msg->attrList); - if (vHidd_StdPixFmt_Plane == stdpf) + struct pHidd_Gfx_CreateObject mymsg; + HIDDT_ModeID modeid; + HIDDT_StdPixFmt stdpf; + + struct TagItem mytags [] = + { + { TAG_IGNORE, TAG_IGNORE }, /* Placeholder for aHidd_BitMap_ClassPtr */ + { TAG_IGNORE, TAG_IGNORE }, /* Placeholder for aHidd_BitMap_Align */ + { aHidd_BitMap_Nouveau_CompositorHidd, (IPTR)gfxdata->compositor }, + { TAG_MORE, (IPTR)msg->attrList } + }; + + /* Check if user provided valid ModeID */ + /* Check for framebuffer - not needed as Nouveau is a NoFramebuffer driver */ + /* Check for displayable - not needed - displayable has ModeID and we don't + distinguish between on-screen and off-screen bitmaps */ + modeid = (HIDDT_ModeID)GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); + if (vHidd_ModeID_Invalid != modeid) + { + /* User supplied a valid modeid. We can use our bitmap class */ + mytags[0].ti_Tag = aHidd_BitMap_ClassPtr; + mytags[0].ti_Data = (IPTR)SD(cl)->bmclass; + } + + /* Check if bitmap is a planar bitmap */ + stdpf = (HIDDT_StdPixFmt)GetTagData(aHidd_BitMap_StdPixFmt, vHidd_StdPixFmt_Unknown, msg->attrList); + if (vHidd_StdPixFmt_Plane == stdpf) + { + mytags[1].ti_Tag = aHidd_BitMap_Align; + mytags[1].ti_Data = 32; + } + + /* We init a new message struct */ + mymsg.mID = msg->mID; + mymsg.cl = msg->cl; + mymsg.attrList = mytags; + + /* Pass the new message to the superclass */ + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)&mymsg); + } + else if (SD(cl)->basegallium && (msg->cl == SD(cl)->basegallium)) { - mytags[1].ti_Tag = aHidd_BitMap_Align; - mytags[1].ti_Data = 32; + object = OOP_NewObject(NULL, CLID_Hidd_Gallium_Nouveau, msg->attrList); } - - /* We init a new message struct */ - mymsg.mID = msg->mID; - mymsg.attrList = mytags; - - /* Pass the new message to the superclass */ - msg = &mymsg; + else + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); - return (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); + return object; } VOID METHOD(Nouveau, Hidd_Gfx, CopyBox) diff --git a/workbench/hidds/nvidia/nv.h b/workbench/hidds/nvidia/nv.h index d3951ce785..947b269be4 100644 --- a/workbench/hidds/nvidia/nv.h +++ b/workbench/hidds/nvidia/nv.h @@ -1,7 +1,7 @@ #ifndef _NV_H #define _NV_H /* - Copyright © 2004-2007, The AROS Development Team. All rights reserved. + Copyright © 2004-2015, The AROS Development Team. All rights reserved. $Id$ Desc: private header file @@ -183,6 +183,8 @@ struct staticdata { struct SignalSemaphore MultiBMLock; /* To lock more than one bitmap at a time */ APTR memPool; + OOP_Class *basebm; /* baseclass for CreateObject */ + OOP_Class *nvclass; OOP_Class *onbmclass; OOP_Class *offbmclass; diff --git a/workbench/hidds/nvidia/nvidia.conf b/workbench/hidds/nvidia/nvidia.conf index e8f7c8c1d1..914d0111c3 100644 --- a/workbench/hidds/nvidia/nvidia.conf +++ b/workbench/hidds/nvidia/nvidia.conf @@ -1,6 +1,6 @@ ##begin config basename NV -version 1.0 +version 42.1 libbasetype struct nvbase classptr_field sd.nvclass classid CLID_Hidd_Gfx_nVidia @@ -18,7 +18,7 @@ New Get Set .interface Hidd_Gfx -NewBitMap +CreateObject Show CopyBox SetCursorVisible diff --git a/workbench/hidds/nvidia/nvidia_init.c b/workbench/hidds/nvidia/nvidia_init.c index 1d0745e457..6972d63758 100644 --- a/workbench/hidds/nvidia/nvidia_init.c +++ b/workbench/hidds/nvidia/nvidia_init.c @@ -1,5 +1,5 @@ /* - Copyright © 2004-2006, The AROS Development Team. All rights reserved. + Copyright © 2004-2015, The AROS Development Team. All rights reserved. $Id$ Desc: nvidia.hidd initialization @@ -772,7 +772,9 @@ static int NV_Init(LIBBASETYPEPTR LIBBASE) { IID_Hidd_PlanarBM, &__IHidd_PlanarBM }, { NULL, NULL } }; - + + sd->basebm = OOP_FindClass(CLID_Hidd_BitMap); + if (OOP_ObtainAttrBases(attrbases)) { Find_NV_Card(sd); diff --git a/workbench/hidds/nvidia/nvidiaclass.c b/workbench/hidds/nvidia/nvidiaclass.c index a04e240a73..fc9d730ffd 100644 --- a/workbench/hidds/nvidia/nvidiaclass.c +++ b/workbench/hidds/nvidia/nvidiaclass.c @@ -1,5 +1,5 @@ /* - Copyright © 2004-2010, The AROS Development Team. All rights reserved. + Copyright © 2004-2015, The AROS Development Team. All rights reserved. $Id$ Desc: NVidia gfx class @@ -267,106 +267,117 @@ OOP_Object *NV__Root__New(OOP_Class *cl, OOP_Object *o, struct pRoot_New *msg) return o; } -OOP_Object *NV__Hidd_Gfx__NewBitMap(OOP_Class *cl, OOP_Object *o, - struct pHidd_Gfx_NewBitMap *msg) +OOP_Object *NV__Hidd_Gfx__CreateObject(OOP_Class *cl, OOP_Object *o, + struct pHidd_Gfx_CreateObject *msg) { - BOOL displayable, framebuffer; - OOP_Class *classptr = NULL; - struct TagItem mytags[2]; - struct pHidd_Gfx_NewBitMap mymsg; + OOP_Object *object = NULL; - /* Displayable bitmap ? */ - displayable = GetTagData(aHidd_BitMap_Displayable, FALSE, msg->attrList); - framebuffer = GetTagData(aHidd_BitMap_FrameBuffer, FALSE, msg->attrList); + if (msg->cl == _sd->basebm) + { + BOOL displayable, framebuffer; + OOP_Class *classptr = NULL; + struct TagItem mytags[] = + { + { TAG_IGNORE, TAG_IGNORE }, /* Placeholder for aHidd_BitMap_ClassPtr */ + { TAG_MORE, (IPTR)msg->attrList } + }; -D(bug("[NVidia] NewBitmap: framebuffer=%d, displayable=%d\n", framebuffer, displayable)); + struct pHidd_Gfx_CreateObject p; - if (framebuffer) - { - /* If the user asks for a framebuffer map we must ALLWAYS supply a class */ - classptr = _sd->onbmclass; - } - else if (displayable) - { - classptr = _sd->onbmclass; //offbmclass; - } - else - { - HIDDT_ModeID modeid; - /* - For the non-displayable case we can either supply a class ourselves - if we can optimize a certain type of non-displayable bitmaps. Or we - can let the superclass create on for us. - - The attributes that might come from the user deciding the bitmap - pixel format are: - - aHidd_BitMap_ModeID: a modeid. create a nondisplayable - bitmap with the size and pixelformat of a gfxmode. - - aHidd_BitMap_StdPixFmt: a standard pixelformat as described in - hidd/graphics.h - - aHidd_BitMap_Friend: if this is supplied and none of the two above - are supplied, then the pixel format of the created bitmap - will be the same as the one of the friend bitmap. - - These tags are listed in prioritized order, so if - the user supplied a ModeID tag, then you should not care about StdPixFmt - or Friend. If there is no ModeID, but a StdPixFmt tag supplied, - then you should not care about Friend because you have to - create the correct pixelformat. And as said above, if only Friend - is supplied, you can create a bitmap with same pixelformat as Frien - */ - - - modeid = (HIDDT_ModeID)GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); - if (vHidd_ModeID_Invalid != modeid) { - /* User supplied a valid modeid. We can use our offscreen class */ - classptr = _sd->offbmclass; - } else { - /* We may create an offscreen bitmap if the user supplied a friend - bitmap. But we need to check that he did not supplied a StdPixFmt - */ - HIDDT_StdPixFmt stdpf; - stdpf = (HIDDT_StdPixFmt)GetTagData(aHidd_BitMap_StdPixFmt, vHidd_StdPixFmt_Unknown, msg->attrList); - if (vHidd_StdPixFmt_Plane == stdpf) { - classptr = _sd->planarbmclass; - } - else if (vHidd_StdPixFmt_Unknown == stdpf) { - /* No std pixfmt supplied */ - OOP_Object *friend; - - /* Did the user supply a friend bitmap ? */ - friend = (OOP_Object *)GetTagData(aHidd_BitMap_Friend, 0, msg->attrList); - if (NULL != friend) { - OOP_Class *friend_class = NULL; - /* User supplied friend bitmap. Is the friend bitmap a - NVidia Gfx hidd bitmap ? */ - OOP_GetAttr(friend, aHidd_BitMap_ClassPtr, (APTR)&friend_class); - if (friend_class == _sd->onbmclass) { - /* Friend was NVidia hidd bitmap. Now we can supply our own class */ - classptr = _sd->offbmclass; - } - } - } - } - } + /* Displayable bitmap ? */ + displayable = GetTagData(aHidd_BitMap_Displayable, FALSE, msg->attrList); + framebuffer = GetTagData(aHidd_BitMap_FrameBuffer, FALSE, msg->attrList); - D(bug("classptr = %p\n", classptr)); - /* Do we supply our own class ? */ - if (NULL != classptr) { - /* Yes. We must let the superclass not that we do this. This is - done through adding a tag in the frot of the taglist */ - mytags[0].ti_Tag = aHidd_BitMap_ClassPtr; - mytags[0].ti_Data = (IPTR)classptr; - mytags[1].ti_Tag = TAG_MORE; - mytags[1].ti_Data = (IPTR)msg->attrList; - - /* Like in Gfx::New() we init a new message struct */ - mymsg.mID = msg->mID; - mymsg.attrList = mytags; - - /* Pass the new message to the superclass */ - msg = &mymsg; + D(bug("[NVidia] CreateObject: framebuffer=%d, displayable=%d\n", framebuffer, displayable)); + + if (framebuffer) + { + /* If the user asks for a framebuffer map we must ALLWAYS supply a class */ + classptr = _sd->onbmclass; + } + else if (displayable) + { + classptr = _sd->onbmclass; //offbmclass; + } + else + { + HIDDT_ModeID modeid; + /* + For the non-displayable case we can either supply a class ourselves + if we can optimize a certain type of non-displayable bitmaps. Or we + can let the superclass create on for us. + + The attributes that might come from the user deciding the bitmap + pixel format are: + - aHidd_BitMap_ModeID: a modeid. create a nondisplayable + bitmap with the size and pixelformat of a gfxmode. + - aHidd_BitMap_StdPixFmt: a standard pixelformat as described in + hidd/graphics.h + - aHidd_BitMap_Friend: if this is supplied and none of the two above + are supplied, then the pixel format of the created bitmap + will be the same as the one of the friend bitmap. + + These tags are listed in prioritized order, so if + the user supplied a ModeID tag, then you should not care about StdPixFmt + or Friend. If there is no ModeID, but a StdPixFmt tag supplied, + then you should not care about Friend because you have to + create the correct pixelformat. And as said above, if only Friend + is supplied, you can create a bitmap with same pixelformat as Frien + */ + + + modeid = (HIDDT_ModeID)GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); + if (vHidd_ModeID_Invalid != modeid) { + /* User supplied a valid modeid. We can use our offscreen class */ + classptr = _sd->offbmclass; + } else { + /* We may create an offscreen bitmap if the user supplied a friend + bitmap. But we need to check that he did not supplied a StdPixFmt + */ + HIDDT_StdPixFmt stdpf; + stdpf = (HIDDT_StdPixFmt)GetTagData(aHidd_BitMap_StdPixFmt, vHidd_StdPixFmt_Unknown, msg->attrList); + if (vHidd_StdPixFmt_Plane == stdpf) { + classptr = _sd->planarbmclass; + } + else if (vHidd_StdPixFmt_Unknown == stdpf) { + /* No std pixfmt supplied */ + OOP_Object *friend; + + /* Did the user supply a friend bitmap ? */ + friend = (OOP_Object *)GetTagData(aHidd_BitMap_Friend, 0, msg->attrList); + if (NULL != friend) { + OOP_Class *friend_class = NULL; + /* User supplied friend bitmap. Is the friend bitmap a + NVidia Gfx hidd bitmap ? */ + OOP_GetAttr(friend, aHidd_BitMap_ClassPtr, (APTR)&friend_class); + if (friend_class == _sd->onbmclass) { + /* Friend was NVidia hidd bitmap. Now we can supply our own class */ + classptr = _sd->offbmclass; + } + } + } + } + } + + D(bug("classptr = %p\n", classptr)); + /* Do we supply our own class ? */ + if (NULL != classptr) { + /* Yes. We must let the superclass not that we do this. This is + done through adding a tag in the frot of the taglist */ + mytags[0].ti_Tag = aHidd_BitMap_ClassPtr; + mytags[0].ti_Data = (IPTR)classptr; + } + + /* Like in Gfx::New() we init a new message struct */ + p.mID = msg->mID; + p.cl = msg->cl; + p.attrList = mytags; + + /* Pass the new message to the superclass */ + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)&p); } + else + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); return (OOP_Object*)OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); } diff --git a/workbench/hidds/radeon/ati.h b/workbench/hidds/radeon/ati.h index 05d0a67634..d65dbf8634 100644 --- a/workbench/hidds/radeon/ati.h +++ b/workbench/hidds/radeon/ati.h @@ -2,7 +2,7 @@ #define _ATI_H /* - Copyright � 2004-2007, The AROS Development Team. All rights reserved. + Copyright � 2004-2015, The AROS Development Team. All rights reserved. $Id$ */ @@ -109,6 +109,8 @@ struct ati_staticdata { OOP_Object *PCIDevice; OOP_Object *PCIDriver; + OOP_Class *basebm; /* baseclass for CreateObject */ + OOP_Class *AtiClass; OOP_Class *AtiI2C; OOP_Class *OnBMClass; diff --git a/workbench/hidds/radeon/ati_class.c b/workbench/hidds/radeon/ati_class.c index f61acd651a..0cb46729b8 100644 --- a/workbench/hidds/radeon/ati_class.c +++ b/workbench/hidds/radeon/ati_class.c @@ -1,5 +1,5 @@ /* - Copyright © 2004, The AROS Development Team. All rights reserved. + Copyright © 2004-2015, The AROS Development Team. All rights reserved. $Id$ */ @@ -124,114 +124,125 @@ OOP_Object *METHOD(ATI, Hidd_Gfx, Show) return fb; } -OOP_Object *METHOD(ATI, Hidd_Gfx, NewBitMap) +OOP_Object *METHOD(ATI, Hidd_Gfx, CreateObject) { - BOOL displayable, framebuffer; - OOP_Class *classptr = NULL; - struct TagItem mytags[2]; - struct pHidd_Gfx_NewBitMap mymsg; + OOP_Object *object = NULL; - /* Displayable bitmap ? */ - displayable = GetTagData(aHidd_BitMap_Displayable, FALSE, msg->attrList); - framebuffer = GetTagData(aHidd_BitMap_FrameBuffer, FALSE, msg->attrList); - - if (framebuffer) - { - /* If the user asks for a framebuffer map we must ALLWAYS supply a class */ - classptr = sd->OnBMClass; - } - else if (displayable) - { - classptr = sd->OnBMClass; //offbmclass; - } - else + if (msg->cl == sd->basebm) { - HIDDT_ModeID modeid; - /* - For the non-displayable case we can either supply a class ourselves - if we can optimize a certain type of non-displayable bitmaps. Or we - can let the superclass create on for us. - - The attributes that might come from the user deciding the bitmap - pixel format are: - - aHidd_BitMap_ModeID: a modeid. create a nondisplayable - bitmap with the size and pixelformat of a gfxmode. - - aHidd_BitMap_StdPixFmt: a standard pixelformat as described in - hidd/graphics.h - - aHidd_BitMap_Friend: if this is supplied and none of the two above - are supplied, then the pixel format of the created bitmap - will be the same as the one of the friend bitmap. - - These tags are listed in prioritized order, so if - the user supplied a ModeID tag, then you should not care about StdPixFmt - or Friend. If there is no ModeID, but a StdPixFmt tag supplied, - then you should not care about Friend because you have to - create the correct pixelformat. And as said above, if only Friend - is supplied, you can create a bitmap with same pixelformat as Frien - */ - - modeid = (HIDDT_ModeID)GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); - - if (vHidd_ModeID_Invalid != modeid) + BOOL displayable, framebuffer; + OOP_Class *classptr = NULL; + struct TagItem mytags[] = { - /* User supplied a valid modeid. We can use our offscreen class */ - classptr = sd->OffBMClass; + { TAG_IGNORE, TAG_IGNORE }, /* Placeholder for aHidd_BitMap_ClassPtr */ + { TAG_MORE, (IPTR)msg->attrList } + }; + + struct pHidd_Gfx_CreateObject p; + + /* Displayable bitmap ? */ + displayable = GetTagData(aHidd_BitMap_Displayable, FALSE, msg->attrList); + framebuffer = GetTagData(aHidd_BitMap_FrameBuffer, FALSE, msg->attrList); + + if (framebuffer) + { + /* If the user asks for a framebuffer map we must ALLWAYS supply a class */ + classptr = sd->OnBMClass; + } + else if (displayable) + { + classptr = sd->OnBMClass; //offbmclass; } else { + HIDDT_ModeID modeid; /* - We may create an offscreen bitmap if the user supplied a friend - bitmap. But we need to check that he did not supplied a StdPixFmt + For the non-displayable case we can either supply a class ourselves + if we can optimize a certain type of non-displayable bitmaps. Or we + can let the superclass create on for us. + + The attributes that might come from the user deciding the bitmap + pixel format are: + - aHidd_BitMap_ModeID: a modeid. create a nondisplayable + bitmap with the size and pixelformat of a gfxmode. + - aHidd_BitMap_StdPixFmt: a standard pixelformat as described in + hidd/graphics.h + - aHidd_BitMap_Friend: if this is supplied and none of the two above + are supplied, then the pixel format of the created bitmap + will be the same as the one of the friend bitmap. + + These tags are listed in prioritized order, so if + the user supplied a ModeID tag, then you should not care about StdPixFmt + or Friend. If there is no ModeID, but a StdPixFmt tag supplied, + then you should not care about Friend because you have to + create the correct pixelformat. And as said above, if only Friend + is supplied, you can create a bitmap with same pixelformat as Frien */ - HIDDT_StdPixFmt stdpf = (HIDDT_StdPixFmt)GetTagData(aHidd_BitMap_StdPixFmt, vHidd_StdPixFmt_Unknown, msg->attrList); - if (vHidd_StdPixFmt_Plane == stdpf) + modeid = (HIDDT_ModeID)GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); + + if (vHidd_ModeID_Invalid != modeid) { - classptr = sd->PlanarBMClass; + /* User supplied a valid modeid. We can use our offscreen class */ + classptr = sd->OffBMClass; } - else if (vHidd_StdPixFmt_Unknown == stdpf) + else { - /* No std pixfmt supplied */ - OOP_Object *friend; + /* + We may create an offscreen bitmap if the user supplied a friend + bitmap. But we need to check that he did not supplied a StdPixFmt + */ + HIDDT_StdPixFmt stdpf = (HIDDT_StdPixFmt)GetTagData(aHidd_BitMap_StdPixFmt, vHidd_StdPixFmt_Unknown, msg->attrList); - /* Did the user supply a friend bitmap ? */ - friend = (OOP_Object *)GetTagData(aHidd_BitMap_Friend, 0, msg->attrList); - if (NULL != friend) + if (vHidd_StdPixFmt_Plane == stdpf) { - OOP_Class *friend_class = NULL; - /* User supplied friend bitmap. Is the friend bitmap a Ati Gfx hidd bitmap ? */ - OOP_GetAttr(friend, aHidd_BitMap_ClassPtr, (APTR)&friend_class); - if (friend_class == sd->OnBMClass) + classptr = sd->PlanarBMClass; + } + else if (vHidd_StdPixFmt_Unknown == stdpf) + { + /* No std pixfmt supplied */ + OOP_Object *friend; + + /* Did the user supply a friend bitmap ? */ + friend = (OOP_Object *)GetTagData(aHidd_BitMap_Friend, 0, msg->attrList); + if (NULL != friend) { - /* Friend was ATI hidd bitmap. Now we can supply our own class */ - classptr = sd->OffBMClass; + OOP_Class *friend_class = NULL; + /* User supplied friend bitmap. Is the friend bitmap a Ati Gfx hidd bitmap ? */ + OOP_GetAttr(friend, aHidd_BitMap_ClassPtr, (APTR)&friend_class); + if (friend_class == sd->OnBMClass) + { + /* Friend was ATI hidd bitmap. Now we can supply our own class */ + classptr = sd->OffBMClass; + } } } } } - } - D(bug("[ATI] classptr = %p\n", classptr)); + D(bug("[ATI] classptr = %p\n", classptr)); - /* Do we supply our own class ? */ - if (NULL != classptr) - { - /* Yes. We must let the superclass not that we do this. This is - done through adding a tag in the frot of the taglist */ - mytags[0].ti_Tag = aHidd_BitMap_ClassPtr; - mytags[0].ti_Data = (IPTR)classptr; - mytags[1].ti_Tag = TAG_MORE; - mytags[1].ti_Data = (IPTR)msg->attrList; + /* Do we supply our own class ? */ + if (NULL != classptr) + { + /* Yes. We must let the superclass not that we do this. This is + done through adding a tag in the frot of the taglist */ + mytags[0].ti_Tag = aHidd_BitMap_ClassPtr; + mytags[0].ti_Data = (IPTR)classptr; + } /* Like in Gfx::New() we init a new message struct */ mymsg.mID = msg->mID; + mymsg.cl = msg->cl; mymsg.attrList = mytags; /* Pass the new message to the superclass */ - msg = &mymsg; + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)&p); } + else + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); - return (OOP_Object*)OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); + return object; } void METHOD(ATI, Hidd_Gfx, CopyBox) diff --git a/workbench/hidds/radeon/ati_init.c b/workbench/hidds/radeon/ati_init.c index 4fb3c3a36b..c5e860110b 100644 --- a/workbench/hidds/radeon/ati_init.c +++ b/workbench/hidds/radeon/ati_init.c @@ -1,5 +1,5 @@ /* - Copyright © 2003-2011, The AROS Development Team. All rights reserved. + Copyright © 2003-2015, The AROS Development Team. All rights reserved. $Id$ */ @@ -250,6 +250,8 @@ static int ATI_Init(LIBBASETYPEPTR LIBBASE) sd->mid_CopyLUTMemBox32 = OOP_GetMethodID((STRPTR)CLID_Hidd_BitMap, moHidd_BitMap_CopyLUTMemBox32); sd->mid_GetImage = OOP_GetMethodID((STRPTR)CLID_Hidd_BitMap, moHidd_BitMap_GetImage); + LIBBASE->sd.basebm = OOP_FindClass(CLID_Hidd_BitMap); + InitSemaphore(&LIBBASE->sd.HWLock); InitSemaphore(&LIBBASE->sd.MultiBMLock); InitSemaphore(&LIBBASE->sd.CardMemLock); diff --git a/workbench/hidds/radeon/radeon.conf b/workbench/hidds/radeon/radeon.conf index 12277b93e3..323fcd9c09 100644 --- a/workbench/hidds/radeon/radeon.conf +++ b/workbench/hidds/radeon/radeon.conf @@ -1,6 +1,6 @@ ##begin config basename ATI -version 1.0 +version 42.1 libbasetype struct atibase classptr_field sd.AtiClass classid CLID_Hidd_Gfx_Ati @@ -19,7 +19,7 @@ New Get Set .interface Hidd_Gfx -NewBitMap +CreateObject Show CopyBox SetCursorShape diff --git a/workbench/hidds/sm502/sm502.conf b/workbench/hidds/sm502/sm502.conf index 321e6e850e..ae2cc23fa0 100644 --- a/workbench/hidds/sm502/sm502.conf +++ b/workbench/hidds/sm502/sm502.conf @@ -1,7 +1,7 @@ ##begin config basename SM502 libbasetype struct SM502GfxBase -version 1.1 +version 42.2 residentpri 9 classptr_field vsd.sm502gfxclass classdatatype struct SM502Gfx_data @@ -20,7 +20,7 @@ New Dispose Get .interface Hidd_Gfx -NewBitMap +CreateObject Show ##end methodlist diff --git a/workbench/hidds/sm502/sm502_init.c b/workbench/hidds/sm502/sm502_init.c index 841090cbea..4b4f3d8050 100644 --- a/workbench/hidds/sm502/sm502_init.c +++ b/workbench/hidds/sm502/sm502_init.c @@ -1,5 +1,5 @@ /* - Copyright © 1995-2011, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: sm502 gfx Hidd for standalone i386 AROS @@ -101,6 +101,8 @@ static int PCSM502_Init(LIBBASETYPEPTR LIBBASE) return FALSE; } + LIBBASE->vsd.basebm = OOP_FindClass(CLID_Hidd_BitMap); + /* * It is unknown (and no way to know) what hardware part this driver uses. * In order to avoid conflicts with disk-based native-mode hardware diff --git a/workbench/hidds/sm502/sm502gfxclass.c b/workbench/hidds/sm502/sm502gfxclass.c index 537b05152f..9570e4b0a1 100644 --- a/workbench/hidds/sm502/sm502gfxclass.c +++ b/workbench/hidds/sm502/sm502gfxclass.c @@ -1,5 +1,5 @@ /* - Copyright © 1995-2011, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: Class for SM502. @@ -151,41 +151,51 @@ VOID SM502__Root__Get(OOP_Class *cl, OOP_Object *o, struct pRoot_Get *msg) OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); } -OOP_Object *SM502__Hidd_Gfx__NewBitMap(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_NewBitMap *msg) +OOP_Object *SM502__Hidd_Gfx__CreateObject(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_CreateObject *msg) { - BOOL displayable; - struct TagItem tags[2] = - { - {TAG_IGNORE, 0 }, - {TAG_MORE , (IPTR)msg->attrList} - }; - struct pHidd_Gfx_NewBitMap yourmsg; + OOP_Object *object = NULL; - EnterFunc(bug("SM502Gfx::NewBitMap()\n")); + EnterFunc(bug("SM502Gfx::CreateObject()\n")); - displayable = GetTagData(aHidd_BitMap_Displayable, FALSE, msg->attrList); - if (displayable) + if (msg->cl == XSD(cl)->basebm) { - /* Only displayable bitmaps are bitmaps of our class */ - tags[0].ti_Tag = aHidd_BitMap_ClassPtr; - tags[0].ti_Data = (IPTR)XSD(cl)->bmclass; + BOOL displayable; + struct TagItem tags[2] = + { + {TAG_IGNORE, 0 }, + {TAG_MORE , (IPTR)msg->attrList} + }; + struct pHidd_Gfx_CreateObject p; + + displayable = GetTagData(aHidd_BitMap_Displayable, FALSE, msg->attrList); + if (displayable) + { + /* Only displayable bitmaps are bitmaps of our class */ + tags[0].ti_Tag = aHidd_BitMap_ClassPtr; + tags[0].ti_Data = (IPTR)XSD(cl)->bmclass; + } + else + { + /* Non-displayable friends of our bitmaps are plain chunky bitmaps */ + OOP_Object *friend = (OOP_Object *)GetTagData(aHidd_BitMap_Friend, 0, msg->attrList); + + if (friend && (OOP_OCLASS(friend) == XSD(cl)->bmclass)) + { + tags[0].ti_Tag = aHidd_BitMap_ClassID; + tags[0].ti_Data = (IPTR)CLID_Hidd_ChunkyBM; + } + } + + p.mID = msg->mID; + p.cl = msg->cl; + p.attrList = tags; + + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)&p); } else - { - /* Non-displayable friends of our bitmaps are plain chunky bitmaps */ - OOP_Object *friend = (OOP_Object *)GetTagData(aHidd_BitMap_Friend, 0, msg->attrList); - - if (friend && (OOP_OCLASS(friend) == XSD(cl)->bmclass)) - { - tags[0].ti_Tag = aHidd_BitMap_ClassID; - tags[0].ti_Data = (IPTR)CLID_Hidd_ChunkyBM; - } - } - - yourmsg.mID = msg->mID; - yourmsg.attrList = tags; + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); - ReturnPtr("SM502Gfx::NewBitMap", OOP_Object *, (OOP_Object *)OOP_DoSuperMethod(cl, o, &yourmsg.mID)); + ReturnPtr("SM502Gfx::CreateObject", OOP_Object *, object); } /********* GfxHidd::Show() ***************************/ diff --git a/workbench/hidds/sm502/sm502gfxclass.h b/workbench/hidds/sm502/sm502gfxclass.h index 34265447b8..03358644d0 100644 --- a/workbench/hidds/sm502/sm502gfxclass.h +++ b/workbench/hidds/sm502/sm502gfxclass.h @@ -2,7 +2,7 @@ #define HIDD_SM502GFXCLASS_H /* - Copyright © 1995-2011, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: Some SM502Gfx useful data. @@ -29,6 +29,8 @@ struct SM502Gfx_data struct SM502Gfx_staticdata { + OOP_Class *basebm; /* baseclass for CreateObject */ + OOP_Class *sm502gfxclass; OOP_Class *bmclass; OOP_Object *sm502gfxhidd; diff --git a/workbench/hidds/vmwaresvga/vmwaresvga.conf b/workbench/hidds/vmwaresvga/vmwaresvga.conf index 9dfc7a25bb..ba968c253f 100644 --- a/workbench/hidds/vmwaresvga/vmwaresvga.conf +++ b/workbench/hidds/vmwaresvga/vmwaresvga.conf @@ -1,7 +1,7 @@ ##begin config basename VMWareSVGA libbasetype struct VMWareSVGABase -version 1.0 +version 42.1 residentpri 9 classptr_field vsd.vmwaresvgaclass classid CLID_Hidd_VMWareSVGA @@ -19,7 +19,7 @@ New Dispose Get .interface Hidd_Gfx -NewBitMap +CreateObject #CopyBox SetCursorShape SetCursorPos diff --git a/workbench/hidds/vmwaresvga/vmwaresvga_init.c b/workbench/hidds/vmwaresvga/vmwaresvga_init.c index dec117e428..79c56ac14c 100644 --- a/workbench/hidds/vmwaresvga/vmwaresvga_init.c +++ b/workbench/hidds/vmwaresvga/vmwaresvga_init.c @@ -1,5 +1,5 @@ /* - Copyright © 1995-2008, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: VMWare SVGA Hidd initialisation code @@ -112,6 +112,8 @@ static int VMWareSVGA_Init(LIBBASETYPEPTR LIBBASE) if (!OOP_ObtainAttrBases(abd)) goto failure; + xsd->basebm = OOP_FindClass(CLID_Hidd_BitMap); + xsd->pcihidd = OOP_NewObject(NULL, CLID_Hidd_PCI, NULL); if (xsd->pcihidd == NULL) goto failure; diff --git a/workbench/hidds/vmwaresvga/vmwaresvgaclass.c b/workbench/hidds/vmwaresvga/vmwaresvgaclass.c index d5b8c1e64c..b4c191af62 100644 --- a/workbench/hidds/vmwaresvga/vmwaresvgaclass.c +++ b/workbench/hidds/vmwaresvga/vmwaresvgaclass.c @@ -1,5 +1,5 @@ /* - Copyright © 1995-2013, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: Class for VMWare. @@ -253,58 +253,72 @@ VOID VMWareSVGA__Root__Get(OOP_Class *cl, OOP_Object *o, struct pRoot_Get *msg) OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); } -OOP_Object *VMWareSVGA__Hidd_Gfx__NewBitMap(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_NewBitMap *msg) +OOP_Object *VMWareSVGA__Hidd_Gfx__CreateObject(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_CreateObject *msg) { - BOOL displayable; - BOOL framebuffer; - OOP_Class *classptr = NULL; - struct TagItem tags[2]; - struct pHidd_Gfx_NewBitMap yourmsg; - - EnterFunc(bug("VMWareSVGA::NewBitMap()\n")); - displayable = GetTagData(aHidd_BitMap_Displayable, FALSE, msg->attrList); - framebuffer = GetTagData(aHidd_BitMap_FrameBuffer, FALSE, msg->attrList); - if (framebuffer) - classptr = XSD(cl)->vmwaresvgaonbmclass; - else if (displayable) - classptr = XSD(cl)->vmwaresvgaoffbmclass; - else + OOP_Object *object = NULL; + + EnterFunc(bug("VMWareSVGA::CreateObject()\n")); + + if (msg->cl == XSD(cl)->basebm) { - HIDDT_ModeID modeid; - modeid = (HIDDT_ModeID)GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); - if (modeid != vHidd_ModeID_Invalid) + BOOL displayable; + BOOL framebuffer; + OOP_Class *classptr = NULL; + struct TagItem tags[] = + { + { TAG_IGNORE, TAG_IGNORE }, /* Placeholder for aHidd_BitMap_ClassPtr */ + { TAG_MORE, (IPTR)msg->attrList } + }; + + struct pHidd_Gfx_CreateObject yourmsg; + + displayable = GetTagData(aHidd_BitMap_Displayable, FALSE, msg->attrList); + framebuffer = GetTagData(aHidd_BitMap_FrameBuffer, FALSE, msg->attrList); + if (framebuffer) + classptr = XSD(cl)->vmwaresvgaonbmclass; + else if (displayable) classptr = XSD(cl)->vmwaresvgaoffbmclass; else { - HIDDT_StdPixFmt stdpf; - stdpf = (HIDDT_StdPixFmt)GetTagData(aHidd_BitMap_StdPixFmt, vHidd_StdPixFmt_Unknown, msg->attrList); - if (stdpf == vHidd_StdPixFmt_Unknown) + HIDDT_ModeID modeid; + modeid = (HIDDT_ModeID)GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList); + if (modeid != vHidd_ModeID_Invalid) + classptr = XSD(cl)->vmwaresvgaoffbmclass; + else { - OOP_Object *friend; - friend = (OOP_Object *)GetTagData(aHidd_BitMap_Friend, (IPTR)NULL, msg->attrList); - if (friend != NULL) + HIDDT_StdPixFmt stdpf; + stdpf = (HIDDT_StdPixFmt)GetTagData(aHidd_BitMap_StdPixFmt, vHidd_StdPixFmt_Unknown, msg->attrList); + if (stdpf == vHidd_StdPixFmt_Unknown) { - OOP_Class *friend_class = NULL; - OOP_GetAttr(friend, aHidd_BitMap_ClassPtr, (IPTR *)&friend_class); - if (friend_class == XSD(cl)->vmwaresvgaonbmclass) + OOP_Object *friend; + friend = (OOP_Object *)GetTagData(aHidd_BitMap_Friend, (IPTR)NULL, msg->attrList); + if (friend != NULL) { - classptr = XSD(cl)->vmwaresvgaoffbmclass; + OOP_Class *friend_class = NULL; + OOP_GetAttr(friend, aHidd_BitMap_ClassPtr, (IPTR *)&friend_class); + if (friend_class == XSD(cl)->vmwaresvgaonbmclass) + { + classptr = XSD(cl)->vmwaresvgaoffbmclass; + } } } } } - } - if (classptr != NULL) - { - tags[0].ti_Tag = aHidd_BitMap_ClassPtr; - tags[0].ti_Data = (IPTR)classptr; - tags[1].ti_Tag = TAG_MORE; - tags[1].ti_Data = (IPTR)msg->attrList; + if (classptr != NULL) + { + tags[0].ti_Tag = aHidd_BitMap_ClassPtr; + tags[0].ti_Data = (IPTR)classptr; + } yourmsg.mID = msg->mID; + yourmsg.cl = msg->cl; yourmsg.attrList = tags; - msg = &yourmsg; + + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)&yourmsg); } - ReturnPtr("VMWareSVGA::NewBitMap", OOP_Object *, (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)msg)); + else + object = OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); + + ReturnPtr("VMWareSVGA::CreateObject", OOP_Object *, object); } VOID VMWareSVGA__Hidd_Gfx__CopyBox(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_CopyBox *msg) diff --git a/workbench/hidds/vmwaresvga/vmwaresvgaclass.h b/workbench/hidds/vmwaresvga/vmwaresvgaclass.h index c1235e7c3f..cb048306c9 100644 --- a/workbench/hidds/vmwaresvga/vmwaresvgaclass.h +++ b/workbench/hidds/vmwaresvga/vmwaresvgaclass.h @@ -2,7 +2,7 @@ #define _VMWARESVGA_CLASS_H /* - Copyright © 1995-2007, The AROS Development Team. All rights reserved. + Copyright © 1995-2015, The AROS Development Team. All rights reserved. $Id$ Desc: Some VMWareSVGA useful data. @@ -20,6 +20,7 @@ struct VMWareSVGA_staticdata { struct MemHeader mh; + OOP_Class *basebm; /* baseclass for CreateObject */ OOP_Class *vmwaresvgaclass; OOP_Class *vmwaresvgaonbmclass; OOP_Class *vmwaresvgaoffbmclass; -- 2.11.4.GIT