amiga-news 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: 7717
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:
Original von thomas:

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.


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

--
---

:boing: µA1 PPC 750GX-800
:boing: 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:
Original von Ralf27:
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ß.

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:
Original von Holger:
Wieso ist das nicht die feine Art?


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:
Original von thomas:
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().


[ - 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:
Original von kev:
Vor FreeBitMap() gehört übrigens ein WaitBlit().


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.
.