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

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

-1- [ - Beitrag schreiben - ]

20.01.2008, 23:46 Uhr

Ralf27
Posts: 2779
Nutzer
Ich weiß einfach nicht mehr weiter. Ich hab da ein größeres Problem mit Screens >8Bit.

Die Bilder lade ich mit den Datatypes. Alle Bilder sind <=8Bit. Wenn ich das Programm auf der WB laufen lassen die mit CGX <=8Bit hat oder auf einem CGX-Screen (8Bit) oder mit AGA, dann läuft alles wunderbar. Aber...
Wenn ich das Programm (Sudoku) auf der WB mit mehr als 8Bit laufen lassen, dann geht einfach alles schief: Die Grafik wird falsch geladen oder das Blitten geht in die Hose und was noch schlimmer ist: Das System wird irgendwie in Mitleidenschaft gezogen(z.b. ist auf einem MagicMenu nicht mehr aktiv, etc.) Das ganze aber nur, wenn ich auf einem Screen mit über 8Bit arbeite...

Es läuft alles über die Betriebssystemroutinen, also keine extra CGX-Befehle.

Ich hab mal MuForce mitlaufen lassen, es findet aber auch nichts.

Wo könnte ich denn noch denn Fehler suchen? Ich hab hier gerade noch etwas denn Quellcode überarbeitet, aber ich finde einfach denn Fehler nicht. Da der Quellcode recht lang ist (inzwischen insgesamt ca. 100kb), hier einige hoffentlich markante Punkte:

Hier das laden des Bildes:
code:
IF GetBitMapAttr&(scr&+ScreenBitMap%,BMA_FLAGS&) AND BMF_STANDARD& THEN a&=FALSE& ELSE a&=TRUE&
 rem scr&+ScreenBitMap% ist auch nicht das feine vom Ei. Hab ich eben gesehn, werd ich auch umändern.
 TAGLIST tagsl&, _
 DTA_GroupID&, GID_PICTURE&, _
 PDTA_DestMode&, PMODE42&, _
 PDTA_FreeSourceBitMap&, TRUE&, _
 PDTA_UseFriendBitMap&, a&, _
 PDTA_Remap&, TRUE&, _
 PDTA_Screen&, scr&, _
 TAG_END&
 obild&=NewDTObjectA&(SADD(DatenSatzPfad$+DatenSatz$+".pic"+CHR$(0)),tagsl&)
 IF obild& THEN
  TAGLIST tagsl&, _
  DTM_PROCLAYOUT&, 0, TRUE&, _
  TAG_END&
  IF DoDTMethodA&(obild&,0,0,tagsl&) THEN
   bitmapBild&=0
   oBreite&=0
   oHoehe&=0
   TAGLIST tagsl&, _
   PDTA_DestBitMap&, VARPTR(bitmapBild&), _
   DTA_NominalHoriz&, VARPTR(oBreite&), _
   DTA_NominalVert&, VARPTR(oHoehe&), _
   TAG_END&
   junk=GetDTAttrsA(oBild&,tagsl&)
   Farbtiefe=GetBitMapAttr&(bitmapBild&,BMA_DEPTH&)
   IF Farbtiefe=0 THEN Fehler=FehlerInit_Masketiefe2
  ELSE
   Fehler=FehlerInit_runterrechnen
  END IF
 ELSE
  Fehler=FehlerInit_SkinBildladen
 END IF


PDTA_DestMode&, PMODE42&, _
PDTA_FreeSourceBitMap&, TRUE&, _
PDTA_UseFriendBitMap&, a&, _

Hab ich auch mal weg gelassen, bringt auch nichts.

Hier das laden der Maske:
code:
bitmapMask&=AllocBitMap&(oBreite&,oHoehe&,1,0,0)
 IF bitmapMask&=0 THEN
  Fehler=FehlerInit_Maske
  GOTO FehlerAufbau
 END IF
 Mask&=PEEKL(bitmapMask&+8):REM <- hier bin ich mir nicht so ganz sicher, ob es "legal" ist
REM öffne Maske
  TAGLIST tagsl&, _
  DTA_GroupID&, GID_PICTURE&, _
  PDTA_DestMode&, PMODE42&, _
  PDTA_FreeSourceBitMap&, TRUE&, _
  PDTA_Remap&, FALSE&, _
  TAG_END&
  omask&=NewDTObjectA&(SADD(DatenSatzPfad$+DatenSatz$+".mask.pic"+CHR$(0)),tagsl&)
  IF omask& THEN
   TAGLIST tagsl&, _
   DTM_PROCLAYOUT&, 0, TRUE&, _
   TAG_END&
   IF DoDTMethodA&(omask&,0,0,tagsl&) THEN
    obitmapMask&=0
    x&=0
    y&=0
    TAGLIST tagsl&, _   
    PDTA_DestBitMap&, VARPTR(obitmapMask&), _
    DTA_NominalHoriz&, VARPTR(x&), _
    DTA_NominalVert&, VARPTR(y&), _
    TAG_END&
    junk=GetDTAttrsA(omask&,tagsl&)
    t=GetBitMapAttr(obitmapMask&,BMA_DEPTH&)
    IF x&=oBreite& AND y&=oHoehe& AND t=1 THEN
     REM Interleave-Bitmap erst mal konverieren
     junk=BltBitMap(obitmapMask&,0,0,bitmapMask&,0,0,x&,y&,&Hc0,&Hff,0)
    ELSE
     Fehler=FehlerInit_Masketiefe1
     IF t=0 THEN Fehler=FehlerInit_Masketiefe2
     IF t>1 THEN Fehler=FehlerInit_Masketiefe3
    END IF
   ELSE
    Fehler=FehlerInit_Maskebild
   END IF
   DisposeDTObject omask&:omask&=0
  ELSE
   Fehler=FehlerInit_Maskeoeffnen
  END IF


Hier folgt der kleine Puffer für denn Grafikaufbau:
code:
BitmapBuffer&=AllocBitMap&(b,h,Farbtiefe,BMF_INTERLEAVED&,scr&+ScreenBitMap%)
 IF BitmapBuffer& THEN
  Bufferrp&=AllocVec&(RastPort_sizeof%,MEMF_PUBLIC&)
  IF Bufferrp& THEN
   InitRastPort Bufferrp&
   POKEL Bufferrp&+RastPortBitMap%,BitmapBuffer&
  ELSE
   Fehler=FehlerInit_BufferRP
  END IF
 ELSE
  Fehler=FehlerInit_Buffer
 END IF


Ein kleins Blitbeispiel aus dem Programm:
code:
BltMaskBitMapRastport BitMapBild&,0,a*h,rp&,xStart+aax,yStart+aay+a*h,b,h,&He0,Mask&


Bzw. mal die gesamte Blitunterroutine für ein Feld in Sudoku:
code:
SUB ZeigeFeld(BYVAL x,BYVAL y)
 SHARED asx,asy,fx1,fy1,b,h,rp&
 SHARED BitmapBild&,Mask&
 SHARED BitMapBuffer&,Bufferrp&
 SHARED xStart,yStart
 SHARED TCPCursorX,TCPCursorY
 STATIC y1,x2,y2,x3,y3,z,junk
 x2=asx+(x-1)*b
 y2=asy+(y-1)*h
 y1=feld(x,y)*h
 junk=BltBitMapRastport(BitMapBild&,Fx1+x2,Fy1+y2,Bufferrp&,0,0,b,h,&HC0)
 IF y1 THEN
  IF feldAkt(x,y,2) AND opt(1)=1 THEN
   REM Symbol Fest
   BltMaskBitMapRastport BitMapBild&,b+b,y1,Bufferrp&,0,0,b,h,&He0,Mask&
  ELSE
   REM Symbol Frei
   BltMaskBitMapRastport BitMapBild&,0,y1,Bufferrp&,0,0,b,h,&He0,Mask&
  END IF
 END IF
 IF feldAkt(x,y,3) THEN
  REM Eindeutig
  z=feldAkt(x,y,3)
  IF SkinOpt(13)THEN z=1
  x3=3*b
  y3=z*h-h
  IF opt(15) THEN
   IF z>0 AND AnimStripFeld(z,0)=1 THEN
    x3=AnimStripFeld(z,7)
    y3=AnimStripFeld(z,8)
   END IF
  END IF
  BltMaskBitMapRastport BitMapBild&,x3,y3,Bufferrp&,0,0,b,h,&He0,Mask&
 END IF
 IF feldAkt(x,y,1)THEN
  REM Auswahl
  x3=b
  y3=0:IF SkinOpt(12) THEN y3=y1
  IF AnimStripFeld(5,0)=1 AND opt(15)=1 THEN
   x3=AnimStripFeld(5,7)
   y3=AnimStripFeld(5,8)
  END IF
  BltMaskBitMapRastport BitMapBild&,x3,y3,Bufferrp&,0,0,b,h,&He0,Mask&
 END IF
 IF TCPCursorX=x AND TCPCursorY=y AND SkinOpt(21)>0 THEN
  x3=SkinOpt(21)
  y3=SkinOpt(22)
  IF AnimStripFeld(6,0)=1 AND opt(15)=1 THEN
   x3=AnimStripFeld(6,7)
   y3=AnimStripFeld(6,8)
  END IF
  BltMaskBitMapRastport BitMapBild&,x3,y3,Bufferrp&,0,0,b,h,&He0,Mask&
 END IF
 junk=BltBitMapRastport(BitmapBuffer&,0,0,rp&,xStart+x2,yStart+y2,b,h,&HC0)

 REM Testweise
 IF TCPCursorX=x AND TCPCursorY=y AND SkinOpt(21)=0 THEN
  xBox xStart+x2+2,yStart+y2+2,xStart+x2+b-2,yStart+y2+h-2
 END IF
END SUB




Ich hoffe, der Code ist nicht zu furchtbar. :D Ich lerne aber gerne dazu und hoffe das ich besser werde. :)
--
http://www.alternativercomputerclub.de.vu

[ Dieser Beitrag wurde von Ralf27 am 21.01.2008 um 00:04 Uhr geändert. ]

[ Dieser Beitrag wurde von Ralf27 am 21.01.2008 um 00:40 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

21.01.2008, 10:40 Uhr

thomas
Posts: 7716
Nutzer
Zitat:
dann geht einfach alles schief

Hast du mal einen Screenshot ?



Zitat:
scr&+ScreenBitMap% ist auch nicht das feine vom Ei. Hab ich eben gesehn, werd ich auch umändern.

Unbedingt. Ganz besonders, wenn du mit Grafikkarten-Bitmaps arbeitest.


Zitat:
PDTA_DestMode&, PMODE42&,

Da solltest du PMODE_V43 nehmen. Denn mit V42 bekommst du nur AGA-Kompatible Bitmaps, aber du möchtest ja auf dem Screen mit mehr als 8 Bits arbeiten.


Zitat:
PDTA_UseFriendBitMap&, a&,

Das kannst du dir sparen. Wenn du einen Screen angibst, wird ohnehin das Pixelformat des Screens genommen (bei V43).


Zitat:
PDTA_DestMode&, PMODE42&, _
[...]

Hab ich auch mal weg gelassen, bringt auch nichts.


Klar. V42 ist Default. Weglassen bringt keine Änderung.


Zitat:
Mask&=PEEKL(bitmapMask&+8):REM <- hier bin ich mir nicht so ganz sicher, ob es "legal" ist

Anders geht's ja nicht.



Zitat:
BitmapBuffer&=AllocBitMap&(b,h,Farbtiefe,BMF_INTERLEAVED&,scr&+ScreenBitMap%)

BMF_INTERLEAVED ist Blödsinn an der Stelle IMHO. Du solltest BMF_MINPLANES setzen, um CGX mitzuteilen, daß du es ernst meinst und eine Truecolor-Bitmap möchtest. P96 ist das egal, aber CGX besteht darauf. Und natürlich auch hier wie überall scr->RastPort.BitMap benutzen.



Zitat:
BltMaskBitMapRastport BitMapBild&,x3,y3,Bufferrp&,0,0,b,h,&He0,Mask&
END IF
junk=BltBitMapRastport(BitmapBuffer&,0,0,rp&,xStart+x2,yStart+y2,b,h,&HC0)


Warum schreibst du es einmal so und einmal so ?

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

21.01.2008, 11:53 Uhr

akl
Posts: 265
Nutzer
Gerade für sowas hatte ich eigentlich die dtimage.library in's Aminet gestellt, und würde in dem Zsh. WritePixelLine8() bzw. WriteChunkyPixels() empfehlen. Aber anscheinend passt das nicht ganz in das Konzept der Anwendung hier. Schade.

Allgemeine Anmerkung:
Irgendwo in den OS-Changes habe ich gelesen, dass in irgendeiner OS-Version irgendwer meinte, es sei sinnvoll, auf einmal PMODE_V43 zum Default zu machen. Also besser nicht darauf verlassen, dass PMODE42 default ist.

[ - Antworten - Zitieren - Direktlink - ]

21.01.2008, 20:23 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von thomas:
Zitat:
dann geht einfach alles schief

Hast du mal einen Screenshot ?

Das Problem hat sich mit der geänderten Bitmapflags behoben.
Zitat:
Zitat:
scr&+ScreenBitMap% ist auch nicht das feine vom Ei. Hab ich eben gesehn, werd ich auch umändern.

Unbedingt. Ganz besonders, wenn du mit Grafikkarten-Bitmaps arbeitest.

Hab ich eben gemacht.
Zitat:
Zitat:
PDTA_DestMode&, PMODE42&,

Da solltest du PMODE_V43 nehmen. Denn mit V42 bekommst du nur AGA-Kompatible Bitmaps, aber du möchtest ja auf dem Screen mit mehr als 8 Bits arbeiten.


Zitat:
PDTA_UseFriendBitMap&, a&,

Das kannst du dir sparen. Wenn du einen Screen angibst, wird ohnehin das Pixelformat des Screens genommen (bei V43).


Zitat:
PDTA_DestMode&, PMODE42&, _
[...]

Hab ich auch mal weg gelassen, bringt auch nichts.


Klar. V42 ist Default. Weglassen bringt keine Änderung.

Leider nicht immer. Das war wohl damals das Problem.
Zitat:
Zitat:
Mask&=PEEKL(bitmapMask&+8):REM <- hier bin ich mir nicht so ganz sicher, ob es "legal" ist

Anders geht's ja nicht.

Ok, das freut mich zu lesen. :)
Zitat:
Zitat:
BitmapBuffer&=AllocBitMap&(b,h,Farbtiefe,BMF_INTERLEAVED&,scr&+ScreenBitMap%)

BMF_INTERLEAVED ist Blödsinn an der Stelle IMHO. Du solltest BMF_MINPLANES setzen, um CGX mitzuteilen, daß du es ernst meinst und eine Truecolor-Bitmap möchtest. P96 ist das egal, aber CGX besteht darauf. Und natürlich auch hier wie überall scr->RastPort.BitMap benutzen.

Genau das ist auch die Stelle die die ganze Zeit das Problem verursacht hat. Mit dieser kleinen Änderung läuft nun das ganze! Hab es eben mit AGA, AGA-Screen, CGX-WB 8Bit, CGX-WB >8Bit und CGX-8BitScreen getestet. Perfekt.
Zitat:
Zitat:
BltMaskBitMapRastport BitMapBild&,x3,y3,Bufferrp&,0,0,b,h,&He0,Mask&
END IF
junk=BltBitMapRastport(BitmapBuffer&,0,0,rp&,xStart+x2,yStart+y2,b,h,&HC0)

Warum schreibst du es einmal so und einmal so ?
Ich blitte in dieser Unterroutine alles in einen nicht sichtbaren Puffer und erst am schluss blitte ich das Feld auf den Bildschirm. Das verhindert das störende Flackern, wenn ich mehrere Bilder mit einer Maske übereinanderblitte.


Ich bin mit dem ganzen soweit sehr zufrieden, allerdings hab ich da noch eine kleine Unterroutine die immer noch nicht so ganz will. Diese generiert die Maske selbst aus dem Bild und... nunja, es läuft überall außer auf einem Customchip-WB-Screen. Ich muß mir das nochmal genauer ansehn. Ich hoffe, das ich auch mal selbst drauf komme. :)
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

21.01.2008, 22:10 Uhr

thomas
Posts: 7716
Nutzer
Zitat:
Zitat:
Warum schreibst du es einmal so und einmal so ?
Ich blitte in dieser Unterroutine alles in einen nicht sichtbaren Puffer und erst am schluss blitte ich das Feld auf den Bildschirm. Das verhindert das störende Flackern, wenn ich mehrere Bilder mit einer Maske übereinanderblitte.

Nein, ich meinte, warum rufst du die eine Routine als Unterprogramm und die andere als Funktion (junk = ...) ?

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

21.01.2008, 22:14 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von thomas:
Zitat:
Zitat:
Warum schreibst du es einmal so und einmal so ?
Ich blitte in dieser Unterroutine alles in einen nicht sichtbaren Puffer und erst am schluss blitte ich das Feld auf den Bildschirm. Das verhindert das störende Flackern, wenn ich mehrere Bilder mit einer Maske übereinanderblitte.

Nein, ich meinte, warum rufst du die eine Routine als Unterprogramm und die andere als Funktion (junk = ...) ?

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/


Es sind zwei verschiedene Funktionen. Einmal eine die einen Rückgabewert übergibt, die andere nicht.

EDIT:
Um es mal etwas genauer zu schreiben:
In den Includes ist festgelegt welche Funktion einen Rückgabewert zurückk gibt und welche nicht. Und genau so muß ich diese Aufrufe auch tätigen, sonst gibt der Compiler eine Fehlermeldung aus.
--
http://www.alternativercomputerclub.de.vu

[ Dieser Beitrag wurde von Ralf27 am 21.01.2008 um 22:16 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

21.01.2008, 22:55 Uhr

Ralf27
Posts: 2779
Nutzer
So, jetzt bringt mir nur noch die fehlerhafte Grafik in der folgenden Routine kopfschmerzen. Erst mal ein Ausschnitt aus der Routine:

code:
...
  TAGLIST tagsl&, _
  DTA_GroupID&, GID_PICTURE&, _
  PDTA_FreeSourceBitMap&, TRUE&, _
  PDTA_DestMode&, PMODE42&, _
  PDTA_UseFriendBitMap&, TRUE&, _
  PDTA_Remap&, TRUE&, _
  PDTA_Screen&, scr&, _
  TAG_END&
  bild&=NewDTObjectA&(SADD(GFX$(n,1)+CHR$(0)),tagsl&)
  IF bild& THEN
   TAGLIST tagsl&, _
   DTM_PROCLAYOUT&, 0, TRUE&, _
   TAG_END&
   IF DoDTMethodA&(bild&,0,0,tagsl&) THEN
    TAGLIST tagsl&, _
    PDTA_DestBitMap&, VARPTR(obitmapBild&), _
    DTA_NominalHoriz&, VARPTR(oBreite&), _
    DTA_NominalVert&, VARPTR(oHoehe&), _
    TAG_END&
    junk=GetDTAttrsA(bild&,tagsl&)

    bitmapMask&=AllocBitMap&(oBreite&,oHoehe&,1,0,0)
    IF bitmapMask&=0 THEN
     Fehler=FehlerInit_Maske
    ELSE
     Farbtiefe=GetBitMapAttr&(obitmapBild&,BMA_DEPTH&)
     IF Farbtiefe=0 THEN
      Fehler=FehlerInit_Masketiefe2
     ELSE
      REM Maske selbst generieren
      bb&=16*((oBreite&+15)\16)
      buf&=AllocVec&(200+bb&*oHoehe&,MEMF_PUBLIC&)
      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&
        junk=ReadPixelArray8(rp1&,0,0,oBreite&-1,oHoehe&-1,buf&+200,rp2&)
        f=PEEK(buf&+200):REM Die Farbnummer vom ersten Pixel oben links (0,0)
        FOR y=0 TO oHoehe&-1
         t&=buf&+200+y*bb&
         FOR x=0 TO oBreite&-1
          POKE t&,-(PEEK(t&)<>f)
          INCR t&
         NEXT
        NEXT
        POKEL rp1&+RastPortBitMap%,bitmapMask&
        junk=WritePixelArray8(rp1&,0,0,oBreite&-1,oHoehe&-1,buf&+200,rp2&)
        FreeBitMap bitmaptmp&
        b=oBreite&:IF b>fx2-fx1 THEN b=fx2-fx1
        h=oHoehe&:IF h>fy2-fy1 THEN h=fy2-fy1
        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)
 ...


Diese will nicht so wie es soll. Wenn es nicht klappt, dann sieht die Grafik komplett zerissen aus. In Streifen, als wenn die BytesPerRow total falsch wären.
Ich überarbeite zur Zeit noch denn Sudoku-Code (das hier ist ja ein kleiner Ausriss aus dem ganzen, wie auch ganz am Anfang vom Thread), bzw. versuche meine "erlerntes" auf meine Projekte zu verteilen und alles zu verbessern/optimieren.
--
http://www.alternativercomputerclub.de.vu

[ Dieser Beitrag wurde von Ralf27 am 21.01.2008 um 23:46 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

22.01.2008, 00:30 Uhr

Ralf27
Posts: 2779
Nutzer
Ohoh, ich glaub jetzt ist mir klar wo hier der Pferdefuß liegt... hm, wenn ich mit den Datatypes auf einen Screen mit mehr als 8Bit remape, dann kann ich wohl kaum noch mit ReadPixelArray8() etc. mit der Bitmap arbeiten... das geht wohl nicht. Außerdem gibt es ja noch Dither und dann ist es doppelt schlecht.

Also muß ich wohl erst an die Originalgrafik und aus dieser dann die map generieren und nicht aus der umgerechneten Grafik. Zsss.

Auf sowas komme ich erst zu so später Stunde... :glow:

Ok, das schau ich mir dann morgen an wie ich an die Originaldaten komme. Dürfte nicht so schwer sein.

Jetzt aber erst mal ab in die Falle.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

22.01.2008, 11:30 Uhr

thomas
Posts: 7716
Nutzer
@Ralf27:

Schau dir mal cybergraphics.library/ExtractColor an.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

22.01.2008, 12:19 Uhr

Ralf27
Posts: 2779
Nutzer
Das weiter oben beschriebene Problem ist nun doch noch nicht ganz aus der Welt:

Wenn ich ein und das gleiche Bild(Skin) auf der WB (AGA) mit 3Bit Farbtiefe öffne, dann sieht es richtig aus, aber wenn die WB (AGA) 8Bit hat (selbe Auflösung, andere Farbtiefe), dann sieht es wieder
fehlerhaft aus:

So sollte es aussehn (ca., andere Zahlen):
Bild: http://home.pages.at/a1260/richtig.png

Und das passiert:
Bild: http://home.pages.at/a1260/fehlerhaft.png

Wie kann denn das sein?

Es geht um das obrige Problem, dort wird die Maske als Bild geladen.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

22.01.2008, 12:21 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von thomas:
@Ralf27:

Schau dir mal cybergraphics.library/ExtractColor an.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/


Wow, sieht recht gut aus. Allerdings, was mach ich wenn ich nicht mit CybergraphX arbeite? Z.b. mit AGA?

Ok, ich könnte auch eine Fallunterscheidung einbauen.
--
http://www.alternativercomputerclub.de.vu

[ Dieser Beitrag wurde von Ralf27 am 22.01.2008 um 12:23 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

22.01.2008, 13:06 Uhr

Ralf27
Posts: 2779
Nutzer
Ok, ich muß wohl eine Fallunterscheidung machen ob BMF_STANDARD oder nicht und jenachdem PDTA_FreeSourceBitMap FALSE oder TRUE. Seltsam, aber dann geht es.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

23.01.2008, 16:33 Uhr

Ralf27
Posts: 2779
Nutzer
Hm, das nächste Problem, diesmal mit Datatypes:
Wenn ich ein Datatype geöffnet habe und das Bild wird auf einen angegeben Screen remapt, dann kann ich ja dieses Bild nicht mehr für eine Maskengenerieren benutzen. Ich brauche also das Originalbild. Jetzt fängt es aber an, wie komme ich an das Originalbild?

Mit PDTA_ClassBitMap oder PDTA_BitMap komme ich auf die gleiche Bitmap wie mit PDTA_DestBitMap. Alle drei sind gleich(?!?). Wie kann das sein?

Kurzer Code:

code:
IF GetBitMapAttr&(scrbitmap&,BMA_FLAGS&) AND BMF_STANDARD& THEN a&=FALSE& ELSE a&=TRUE&
  TAGLIST tagsl&, _
  DTA_GroupID&, GID_PICTURE&, _
  PDTA_FreeSourceBitMap&, FALSE&, _
  PDTA_DestMode&, PMODE42&, _
  PDTA_UseFriendBitMap&, a&, _
  PDTA_Remap&, TRUE&, _
  PDTA_Screen&, scr&, _
  TAG_END&
  bild&=NewDTObjectA&(SADD(GFX$(n,1)+CHR$(0)),tagsl&)
  IF bild& THEN
   TAGLIST tagsl&, _
   DTM_PROCLAYOUT&, 0, TRUE&, _
   TAG_END&
   IF DoDTMethodA&(bild&,0,0,tagsl&) THEN
    TAGLIST tagsl&, _
    PDTA_ClassBitMap&, VARPTR(obitmapMask&), _
    PDTA_DestBitMap&, VARPTR(obitmapBild&), _
    DTA_NominalHoriz&, VARPTR(oBreite&), _
    DTA_NominalVert&, VARPTR(oHoehe&), _
    TAG_END&
    junk=GetDTAttrsA(bild&,tagsl&)
 ...

Ich dachte mit PDTA_FreeSoureBitmap FALSE wird die Originalbitmap nicht freigegeben (was auf default ist). Aber wie komme ich denn an die Originalbitmap, ohne das ich das Bild zweimal(einmal mit Remap und einem ohne) aufrufen muß?

Ein Aufruf mit GetDTAttrsA() vor DoDTMethodA() um die ClassBitmap zu ermitteln bringt mir auch nix (NULL). Bzw. bringe ich bestimmt wieder einiges durcheinander. :glow:
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

23.01.2008, 18:06 Uhr

thomas
Posts: 7716
Nutzer
@Ralf27:

Die ganzen Sachen wie PDTA_ClassBitMap, PDTA_DestBitMap, PDTA_UseFriendBitMap und PDTA_FreeSourceBitMap solltest du gleich wieder vergessen. Unter AFA OS z.B. funktioniert das z.B. gar nicht.

An die benutzbare Bitmap kommst du mit PDTA_BitMap. Und um die Originalgrafik zu bekommen, mußt du die Datei nochmal öffnen, diesmal ohne PDTA_Screen und mit PDTA_Remap,FALSE.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

23.01.2008, 18:21 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von thomas:
@Ralf27:

Die ganzen Sachen wie PDTA_ClassBitMap, PDTA_DestBitMap, PDTA_UseFriendBitMap und PDTA_FreeSourceBitMap solltest du gleich wieder vergessen. Unter AFA OS z.B. funktioniert das z.B. gar nicht.

An die benutzbare Bitmap kommst du mit PDTA_BitMap. Und um die Originalgrafik zu bekommen, mußt du die Datei nochmal öffnen, diesmal ohne PDTA_Screen und mit PDTA_Remap,FALSE.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/


Dies hatte ich schon befürchtet und auch schon gemacht. Es funktioniert.

Diesmal denke sogar ich, das das nicht gerade besonderst elegant ist.

--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


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


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