amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Maskengenerierung [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

02.03.2008, 20:47 Uhr

Ralf27
Posts: 2779
Nutzer
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. ]

[ - Antworten - Zitieren - Direktlink - ]

02.03.2008, 21:32 Uhr

thomas
Posts: 7718
Nutzer

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/

[ - Antworten - Zitieren - Direktlink - ]

02.03.2008, 22:46 Uhr

Ralf27
Posts: 2779
Nutzer
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

[ - Antworten - Zitieren - Direktlink - ]

03.03.2008, 23:57 Uhr

Ralf27
Posts: 2779
Nutzer
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

[ - Antworten - Zitieren - Direktlink - ]

04.03.2008, 21:05 Uhr

whose
Posts: 2156
Nutzer
@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

[ - Antworten - Zitieren - Direktlink - ]

07.03.2008, 09:10 Uhr

Ralf27
Posts: 2779
Nutzer
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. ]

[ - Antworten - Zitieren - Direktlink - ]

07.03.2008, 10:23 Uhr

Holger
Posts: 8116
Nutzer
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.

[ - Antworten - Zitieren - Direktlink - ]

07.03.2008, 19:44 Uhr

Ralf27
Posts: 2779
Nutzer
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

[ - Antworten - Zitieren - Direktlink - ]

09.03.2008, 15:36 Uhr

Ralf27
Posts: 2779
Nutzer
Mit WriteChunkyPixel() läuft es leider auch nicht.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

09.03.2008, 18:06 Uhr

kev
Posts: 56
Nutzer
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().


[ - Antworten - Zitieren - Direktlink - ]

09.03.2008, 23:04 Uhr

Ralf27
Posts: 2779
Nutzer
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. ]

[ - Antworten - Zitieren - Direktlink - ]

10.03.2008, 14:59 Uhr

kev
Posts: 56
Nutzer
Vor FreeBitMap() gehört übrigens ein WaitBlit().

[ - Antworten - Zitieren - Direktlink - ]

10.03.2008, 16:41 Uhr

akl
Posts: 265
Nutzer
@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.

[ - Antworten - Zitieren - Direktlink - ]

10.03.2008, 17:15 Uhr

kev
Posts: 56
Nutzer
Nimm mal die Autodocs und guck mal, was unter INPUTS bei InitSemaphore() steht.

[ - Antworten - Zitieren - Direktlink - ]

10.03.2008, 18:55 Uhr

Ralf27
Posts: 2779
Nutzer
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

[ - Antworten - Zitieren - Direktlink - ]

11.03.2008, 20:58 Uhr

Ralf27
Posts: 2779
Nutzer
Ist schon ne harte Nuss. Es bugt als noch.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Maskengenerierung [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.