DEUTSCHE VERSION |
|
Links | | | Forums | | | Comments | | | Report news |
Chat | | | Polls | | | Newsticker | | | Archive |
amiga-news.de Forum > Programmierung > Maskengenerierung | [ - Search - New posts - Register - Login - ] |
-1- | [ - Post reply - ] |
2008-03-02, 20:47 h Ralf27 Posts: 2779 User |
Im folgenden habe ich einen Code der aus einem Bild eine Maske generiert. Dieser Code läuft unter OS3.9 ohne Probleme, bringt aber z.b. unter MorphOS Hits(Store is not allowed because of protection modes). Wie muß ich es denn sonst machen?code:SUB GenMask(BYVAL a$,bitmapMask&) SHARED tagsl&,Fehler,var$ STATIC t&,bild&,Fehler,Farbtiefe STATIC obitmapBild&,oBreite&,oHoehe&,bitmaptmp& STATIC bb&,buf&,rp1&,rp2&,p&,b,h,f,junk IF Fehler THEN EXIT SUB bitmapMask&=0 TAGLIST tagsl&, _ DTA_GroupID&, GID_PICTURE&, _ PDTA_FreeSourceBitMap&, TRUE&, _ TAG_END& bild&=NewDTObjectA&(SADD(a$+CHR$(0)),tagsl&) IF bild& THEN TAGLIST tagsl&, _ DTM_PROCLAYOUT&, 0, TRUE&, _ TAG_END& IF DoDTMethodA&(bild&,0,0,tagsl&) THEN obitmapBild&=0 oBreite&=0 oHoehe&=0 TAGLIST tagsl&, _ PDTA_DestBitMap&, VARPTR(obitmapBild&), _ DTA_NominalHoriz&, VARPTR(oBreite&), _ DTA_NominalVert&, VARPTR(oHoehe&), _ TAG_END& IF GetDTAttrsA(bild&,tagsl&)<>3 THEN Fehler=FehlerInit_Maske ELSE bitmapMask&=AllocBitMap&(oBreite&,oHoehe&,1,0,0) IF bitmapMask&=0 THEN Fehler=FehlerInit_Maske ELSE Farbtiefe=GetBitMapAttr&(obitmapBild&,BMA_DEPTH&) IF Farbtiefe=0 OR Farbtiefe>8 THEN Fehler=FehlerInit_Masketiefe2 ELSE REM Maske selbst generieren bb&=16*((oBreite&+15)16) buf&=AllocVec&(200&+bb&*oHoehe&,MEMF_PUBLIC&+MEMF_CLEAR&) IF buf& THEN bitmaptmp&=AllocBitMap&(oBreite&,1,Farbtiefe,0,0) IF bitmaptmp& THEN rp1&=buf& rp2&=buf&+100 InitRastPort rp1& POKEL rp1&+RastPortBitMap%,obitmapBild& InitRastPort rp2& POKEL rp2&+RastPortBitMap%,bitmaptmp& p&=buf&+200 junk=ReadPixelArray8(rp1&,0,0,oBreite&-1,oHoehe&-1,p&,rp2&) f=PEEK(p&):REM Die Farbnummer vom ersten Pixel oben links (0,0) FOR t&=p& TO p&+bb&*oHoehe& POKE t&,-(PEEK(t&)<>f) NEXT POKEL rp1&+RastPortBitMap%,bitmapMask& junk=WritePixelArray8(rp1&,0,0,oBreite&-1,oHoehe&-1,p&,rp2&) FreeBitMap bitmaptmp& END IF FreeVec buf& END IF END IF END IF END IF ELSE Fehler=Fehler_Grafikrunterrechnen END IF DisposeDTObject bild& ELSE Var$=a$ Fehler=Fehler_Grafikladen END IF END SUB EDIT: Code aktualisiert -- http://www.alternativercomputerclub.de.vu [ Dieser Beitrag wurde von Ralf27 am 03.03.2008 um 23:09 Uhr geändert. ] [ - Answer - Quote - Direct link - ] |
2008-03-02, 21:32 h thomas Posts: 7718 User |
obitmapBild solltest du mit NULL initialisieren und nach dem GetDTAttrsA prüfen, ob sie auch gesetzt wurde. Bei dem AllocVec solltest du MEMF_CLEAR auch setzen, weil InitRastPort u.U. nicht alles initialisiert. Und Mungwall solltest du unbedingt auch laufen haben, das bringt viel mehr als Enforcer und Co. Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Answer - Quote - Direct link - ] |
2008-03-02, 22:46 h Ralf27 Posts: 2779 User |
Zitat: Hab MEMF_CLEAR hinzugefügt, hab Mungwall laufen lassen, keine Fehler, aber mit MorphOS gibt diese Routine Hits... seltsam -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2008-03-03, 23:57 h Ralf27 Posts: 2779 User |
Die Hits kommen bei WritePixelArray8(), und genau bei dieser Routine. Nun, die große Frage: Was mach ich da nur falsch? -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2008-03-04, 21:05 h whose Posts: 2156 User |
@Ralf27: Ich kann im Moment, ehrlich gesagt, nur raten... die Fehlermeldung läßt darauf schließen, daß dem MOS da irgendeiner Deiner Schreibversuche nicht gefällt ("... protection mode..."). Wenn das tatsächlich bei WritePixelArray8() passiert, dürfte es sich um einen weitere Unterschied zu OS3.x handeln (da gibts schon einige Unterschiede), den wohl besser MOS-Kenner erläutern, da diese die notwendigen Infos haben, wie z.B. Array/RastPorts auszusehen haben. Ansonsten ist mir da, außer dem etwas seltsamen Umgang mit dem Puffer fürs Array, der aber normalerweise durchgehen müßte, nichts wirklich falsches aufgefallen. Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ - Answer - Quote - Direct link - ] |
2008-03-07, 09:10 h Ralf27 Posts: 2779 User |
Hatte während der Arbeit ne kleine Eingebung: Ich verwende einfach mal WriteChunkyPixel() statt WritePixelArray8(). Ist zwar nicht die feine Art, und ich werd es vermutlich auch so machen, das man WriteChunkyPixel() via ToolTypes auswählen muß. Aber erst mal muß ein Test auf MorphOS durchlaufen werden, das es so auch läuft... -- http://www.alternativercomputerclub.de.vu [ Dieser Beitrag wurde von Ralf27 am 07.03.2008 um 09:11 Uhr geändert. ] [ - Answer - Quote - Direct link - ] |
2008-03-07, 10:23 h Holger Posts: 8116 User |
Zitat:Wieso ist das nicht die feine Art? mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2008-03-07, 19:44 h Ralf27 Posts: 2779 User |
Zitat: 1. erst ab OS3.1 2. soll langsamer sein als WritePixelArray8(), wenn keine entsprechende Hardwareunterstützung da ist -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2008-03-09, 15:36 h Ralf27 Posts: 2779 User |
Mit WriteChunkyPixel() läuft es leider auch nicht. -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2008-03-09, 18:06 h kev Posts: 56 User |
Zitat: Das gilt für InitSemaphore() und nicht für InitRastPort(). [ - Answer - Quote - Direct link - ] |
2008-03-09, 23:04 h Ralf27 Posts: 2779 User |
Hier nochmal der Codeteil mit etwas Debugcode, der Probleme macht:code:SUB ZeigeGFX(BYVAL n) SHARED tagsl&,scr&,scrbitmap& SHARED BitMapBild&,rp&,Mask& SHARED fx1,fx2,fy1,fy2 SHARED TotalRefresh SHARED xStart,yStart SHARED Var$ STATIC Fehler,x,y,x1,y1,x2,y2,b,h,junk STATIC bild&,obitmapbild&,oBreite&,oHoehe& STATIC bitmapMask&,a& kprintf"Starte ExtraGFX" IF TotalRefresh=n THEN EXIT SUB:REM Wird schon angezeigt Fehler=0 IF GFX$(n,1)="" OR opt(14)=0 THEN PlaySound n:EXIT SUB IF GFX(n,0) x1=GFX(n,0):y1=GFX(n,1):x2=GFX(n,2):y2=GFX(n,3) b=x2-x1:IF b>fx2-fx1 THEN b=fx2-fx1 h=y2-y1:IF h>fy2-fy1 THEN h=fy2-fy1 BltMaskBitMapRastport BitMapBild&,x1,y1,rp&,xStart+(fx2-fx1-b)2,yStart+(fy2-fy1-h)2,b,h,&He0,Mask& ELSE kprintf"Starte Subroutine GenMask" bitmapMask&=0 GenMask GFX$(n,1),bitmapMask& kprintf"bitmapmask in ZeigeGFX="+HEX$(bitmapmask&) IF bitmapMask& kprintf"GetBitMapAttr()" IF GetBitMapAttr&(scrbitmap&,BMA_FLAGS&) AND BMF_STANDARD& THEN a&=FALSE& ELSE a&=TRUE& TAGLIST tagsl&, _ DTA_GroupID&, GID_PICTURE&, _ PDTA_FreeSourceBitMap&, TRUE&, _ PDTA_DestMode&, PMODE42&, _ PDTA_UseFriendBitMap&, a&, _ PDTA_Remap&, TRUE&, _ PDTA_Screen&, scr&, _ TAG_END& kprintf"NewDTObjectA()" bild&=NewDTObjectA&(SADD(GFX$(n,1)+CHR$(0)),tagsl&) IF bild& TAGLIST tagsl&, _ DTM_PROCLAYOUT&, 0, TRUE&, _ TAG_END& kprintf"DoDTMethodA()" IF DoDTMethodA&(bild&,0,0,tagsl&) obitmapBild&=0 oBreite&=0 oHoehe&=0 TAGLIST tagsl&, _ PDTA_DestBitMap&, VARPTR(obitmapBild&), _ DTA_NominalHoriz&, VARPTR(oBreite&), _ DTA_NominalVert&, VARPTR(oHoehe&), _ TAG_END& kprintf"GetDTAttrsA()" IF GetDTAttrsA(bild&,tagsl&)<>3 Fehler=Fehler_Grafikrunterrechnen ELSE b=oBreite&:IF b>fx2-fx1 THEN b=fx2-fx1 h=oHoehe&:IF h>fy2-fy1 THEN h=fy2-fy1 kprintf"BltMaskBitMapRastPort()" BltMaskBitMapRastPort obitmapBild&,(oBreite&-b)2,(oHoehe&-h)2,rp&,xStart+(fx2-fx1-b)2,yStart+(fy2-fy1-h)2,b,h,&He0,PEEKL(BitmapMask&+8) END IF ELSE Fehler=Fehler_Grafikrunterrechnen END IF kprintf"DisposeDTObject()" DisposeDTObject bild& ELSE Var$=GFX$(n,1) Fehler=Fehler_Grafikladen END IF kprintf"FreeBitmap bitmapmask (wird von GenMask generiert, aber in GenMask nicht geschlossen)" kprintf"bitmapmask&="+HEX$(bitmapmask&) FreeBitMap bitmapMask& END IF IF Fehler THEN LocMeldung Fehler:EXIT SUB END IF PlaySound n TotalRefresh=n kprintf"Ende ExtraGFX" END SUB SUB GenMask(BYVAL a$,bitmapMask&) SHARED tagsl&,Fehler,var$ STATIC t&,bild&,Fehler,Farbtiefe STATIC obitmapBild&,oBreite&,oHoehe&,bitmaptmp& STATIC bb&,buf&,rp1&,rp2&,p&,b,h,f,junk IF Fehler THEN EXIT SUB bitmapMask&=0 kprintf"Starte GenMask" TAGLIST tagsl&, _ DTA_GroupID&, GID_PICTURE&, _ PDTA_FreeSourceBitMap&, TRUE&, _ TAG_END& kprintf"NewDTObjectA()" bild&=NewDTObjectA&(SADD(a$+CHR$(0)),tagsl&) IF bild& TAGLIST tagsl&, _ DTM_PROCLAYOUT&, 0, TRUE&, _ TAG_END& kprintf"DoDTMethodA()" IF DoDTMethodA&(bild&,0,0,tagsl&) obitmapBild&=0 oBreite&=0 oHoehe&=0 kprintf"GetDTAttrsA()" TAGLIST tagsl&, _ PDTA_DestBitMap&, VARPTR(obitmapBild&), _ DTA_NominalHoriz&, VARPTR(oBreite&), _ DTA_NominalVert&, VARPTR(oHoehe&), _ TAG_END& IF GetDTAttrsA(bild&,tagsl&)<>3 Fehler=FehlerInit_Maske ELSE kprintf"obitmapBild="+HEX$(obitmapBild&)+" Addresse:"+HEX$(VARPTR(obitmapBild&)) kprintf"oBreite="+HEX$(oBreite&)+" Addresse:"+HEX$(VARPTR(oBreite&)) kprintf"oHoehe="+HEX$(oHoehe&)+" Addresse:"+HEX$(VARPTR(oHoehe&)) kprintf"bitmapMask=AllocBitmap()" bitmapMask&=AllocBitMap&(oBreite&,oHoehe&,1,0,0) IF bitmapMask&=0 Fehler=FehlerInit_Maske ELSE kprintf"Farbtiefe=GetBitMapAttr()" Farbtiefe=GetBitMapAttr&(obitmapBild&,BMA_DEPTH&) IF Farbtiefe=0 OR Farbtiefe>8 Fehler=FehlerInit_Masketiefe2 ELSE REM Maske selbst generieren bb&=16*((oBreite&+15)16) kprintf"buf=AllocVec()" buf&=AllocVec&(201&+bb&*oHoehe&,MEMF_PUBLIC&+MEMF_CLEAR&) IF buf& kprintf"bitmaptmp=AllocBitMap()" bitmaptmp&=AllocBitMap&(oBreite&,1,Farbtiefe,0,0) IF bitmaptmp& rp1&=buf& rp2&=buf&+100 kprintf"InitRastport rp1" InitRastPort rp1& POKEL rp1&+RastPortBitMap%,obitmapBild& kprintf"InitRastport rp2" InitRastPort rp2& POKEL rp2&+RastPortBitMap%,bitmaptmp& p&=buf&+200 kprintf"ReadPixelArray8()" junk=ReadPixelArray8(rp1&,0,0,oBreite&-1,oHoehe&-1,p&,rp2&) f=PEEK(p&):REM Die Farbnummer vom ersten Pixel oben links (0,0) FOR t&=p& TO p&+bb&*oHoehe& POKE t&,-(PEEK(t&)<>f) NEXT POKEL rp1&+RastPortBitMap%,bitmapMask& kprintf"WritePixelArray8()" junk=WritePixelArray8(rp1&,0,0,oBreite&-1,oHoehe&-1,p&,rp2&) kprintf"FreeBitMap bitmaptmp" FreeBitMap bitmaptmp& END IF kprintf"FreeVec buf" FreeVec buf& END IF END IF END IF END IF ELSE Fehler=Fehler_Grafikrunterrechnen END IF kprintf"DisposeDTObject bild" DisposeDTObject bild& ELSE Var$=a$ Fehler=Fehler_Grafikladen END IF kprintf"Ende GenMask, bitmapmask="+HEX$(bitmapmask&) END SUB Debugversion: http://home.pages.at/a1260/WBSudoku1.5.0.testversion Läuft nur in Verbindung mit dem komplett Archiv. Also Archiv runterladen, Debugversion ins Verzeichniss kopieren und starten. -- http://www.alternativercomputerclub.de.vu [ Dieser Beitrag wurde von Ralf27 am 09.03.2008 um 23:42 Uhr geändert. ] [ - Answer - Quote - Direct link - ] |
2008-03-10, 14:59 h kev Posts: 56 User |
Vor FreeBitMap() gehört übrigens ein WaitBlit(). [ - Answer - Quote - Direct link - ] |
2008-03-10, 16:41 h akl Posts: 265 User |
@kev: >>Bei dem AllocVec solltest du MEMF_CLEAR auch setzen, weil InitRastPort >>u.U. nicht alles initialisiert. >Das gilt für InitSemaphore() und nicht für InitRastPort(). Da hast Du Dich verlesen. InitSemaphore() initialisiert alles, was vor AddSemaphore() initialisiert werden muss. [ - Answer - Quote - Direct link - ] |
2008-03-10, 17:15 h kev Posts: 56 User |
Nimm mal die Autodocs und guck mal, was unter INPUTS bei InitSemaphore() steht. [ - Answer - Quote - Direct link - ] |
2008-03-10, 18:55 h Ralf27 Posts: 2779 User |
Zitat: Das war mir neu, danke. Hab mir diesbezüglich auch nochmal die Autodocs durchgelesen. Muß das wohl übersehn haben. Hab eben eine neue Debug-Version online gestellt. -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2008-03-11, 20:58 h Ralf27 Posts: 2779 User |
Ist schon ne harte Nuss. Es bugt als noch. -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
-1- | [ - Post reply - ] |
amiga-news.de Forum > Programmierung > Maskengenerierung | [ - Search - New posts - Register - Login - ] |
Masthead |
Privacy policy |
Netiquette |
Advertising |
Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved. |