Seite 2 von 2

Verfasst: 07.09.2004 13:35
von remi_meier
Lock Ok
UnLock Ok

Verfasst: 07.09.2004 16:03
von Stefan
Hallo remi_meier

Ich glaube,dass es ein Fehler von Purebasic ist.
Kannst du bitte noch diese 2 Codes testen:

Code: Alles auswählen

;Test 1 (sollte bei dir funktionieren)

Procedure GetBackDDS() 
!extrn _PB_DirectX_BackBuffer 
!MOV Eax,[_PB_DirectX_BackBuffer] 
ProcedureReturn 
EndProcedure 

InitSprite() 
InitKeyboard()
OpenScreen(800,600,32,"Farbverlauf")


Repeat 
*DDS.IDirectDrawSurface7=GetBackDDS() 

DDSD2=AllocateMemory(124) 
PokeL(DDSD2,124) 

*DDS\Lock(0,DDSD2,0,0) 

Pitch=PeekL(DDSD2+16)
Addr=PeekL(DDSD2+36)

For X=0 To 799
For Y=0 To 599

R=(X*255)/800
G=(Y*255)/600
B=255-((X*255)/800)

PokeL(Addr+X*4+Y*Pitch,RGB(B,G,R));BGR-Format
Next
Next

*DDS\UnLock(0)

 
FlipBuffers() 
ExamineKeyboard()
Until KeyboardPushed(#PB_KEY_ESCAPE)

Code: Alles auswählen

;Test 2 (sollte bei dir nicht richtig funktionieren)

Procedure GetBackDDS() 
!extrn _PB_DirectX_BackBuffer 
!MOV Eax,[_PB_DirectX_BackBuffer] 
ProcedureReturn 
EndProcedure 

InitSprite() 
InitKeyboard()
OpenScreen(800,600,32,"Farbverlauf")


Repeat 
*DDS.IDirectDrawSurface7=GetBackDDS() 

DDSD2=AllocateMemory(124) 
PokeL(DDSD2,124) 

*DDS\Lock(0,DDSD2,0,0) 
*DDS\GetDC(@DC)

Pitch=PeekL(DDSD2+16)
Addr=PeekL(DDSD2+36)

For X=0 To 799
For Y=0 To 599

R=(X*255)/800
G=(Y*255)/600
B=255-((X*255)/800)

PokeL(Addr+X*4+Y*Pitch,RGB(B,G,R));BGR-Format
Next
Next

*DDS\ReleaseDC(DC) 
*DDS\UnLock(0)

 
FlipBuffers() 
ExamineKeyboard()
Until KeyboardPushed(#PB_KEY_ESCAPE)

Gruß
Stefan

Verfasst: 07.09.2004 17:50
von remi_meier
Beide Codes ergeben den gleichen Farbverlauf.
Habe noch meinen Code im Fullscreen getestet und dort ist alles ok...

greetz
remi

Verfasst: 08.09.2004 08:34
von Stefan
Das gleiche im Fenstermodus: /:->

Code: Alles auswählen

;Test 1 (sollte bei dir funktionieren) 



Procedure GetBackDDS() 
  !extrn _PB_DirectX_BackBuffer 
  !MOV Eax,[_PB_DirectX_BackBuffer] 
  ProcedureReturn 
EndProcedure 

Procedure GetDDBase() 
  !extrn _PB_DDrawBase
  !MOV Eax,[_PB_DDrawBase] 
  ProcedureReturn 
EndProcedure 

InitSprite() 
InitKeyboard() 
*DD.IDirectDraw7=GetDDBase()
*DD\SetDisplayMode(800,600,32,0,0)
  
OpenWindow(1,0,0,320,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Farbverlauf")
OpenWindowedScreen(WindowID(),0,0,320,200,0,0,0)

DDSD2=AllocateMemory(124) 
PokeL(DDSD2,124) 
Repeat 
  *DDS.IDirectDrawSurface7=GetBackDDS() 
  
  Result=*DDS\Lock(0,DDSD2,0,0) 
  If Result:Debug "Lock Err "+Str(Result):EndIf
  
  Pitch=PeekL(DDSD2+16) 
  Addr=PeekL(DDSD2+36) 
  
  For X=0 To 319
    For Y=0 To 199 
      
      R=(X*255)/320 
      G=(Y*255)/200 
      B=255-((X*255)/320) 
      
      PokeL(Addr+X*4+Y*Pitch,RGB(B,G,R));BGR-Format 
    Next 
  Next 
  
  Result=*DDS\UnLock(0) 
  If Result:Debug "UnLock Err "+Str(Result):EndIf
  
  FlipBuffers() 
  ExamineKeyboard() 
Until KeyboardPushed(#PB_Key_Escape) Or WindowEvent()=#PB_Event_CloseWindow 

Code: Alles auswählen

;Test 2 (sollte bei dir nicht richtig funktionieren) 

Procedure GetBackDDS() 
  !extrn _PB_DirectX_BackBuffer 
  !MOV Eax,[_PB_DirectX_BackBuffer] 
  ProcedureReturn 
EndProcedure 

Procedure GetDDBase() 
  !extrn _PB_DDrawBase
  !MOV Eax,[_PB_DDrawBase] 
  ProcedureReturn 
EndProcedure 

InitSprite() 
InitKeyboard() 
*DD.IDirectDraw7=GetDDBase()
*DD\SetDisplayMode(800,600,32,0,0)
  
OpenWindow(1,0,0,320,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Farbverlauf")
OpenWindowedScreen(WindowID(),0,0,320,200,0,0,0)

DDSD2=AllocateMemory(124) 
PokeL(DDSD2,124) 
Repeat 
  *DDS.IDirectDrawSurface7=GetBackDDS() 
  
  
  
  Result=*DDS\Lock(0,DDSD2,0,0) 
  If Result:Debug "Lock Err "+Str(Result):EndIf
  
  Result=*DDS\GetDC(@DC) 
  If Result:Debug "GetDC Err "+Str(Result):EndIf
  
  Pitch=PeekL(DDSD2+16) 
  Addr=PeekL(DDSD2+36) 
  
  For X=0 To 319
    For Y=0 To 199 
      
      R=(X*255)/320 
      G=(Y*255)/200 
      B=255-((X*255)/320) 
      
      PokeL(Addr+X*4+Y*Pitch,RGB(B,G,R));BGR-Format 
    Next 
  Next 
  
  Result=*DDS\ReleaseDC(DC) 
  If Result:Debug "ReleaseDC Err "+Str(Result):EndIf
  Result=*DDS\UnLock(0) 
  If Result:Debug "UnLock Err "+Str(Result):EndIf
  
  FlipBuffers() 
  ExamineKeyboard() 
Until KeyboardPushed(#PB_Key_Escape) Or WindowEvent()=#PB_Event_CloseWindow 

Danke für das Testen.

Gruß
Stefan

Verfasst: 08.09.2004 18:01
von remi_meier
Beide zeigen den gleichen Farbverlauf ohne Fehler...

greetz
remi

Verfasst: 09.09.2004 19:21
von Stefan
Hallo remi_meier

Das ist ja komisch.
Sorry, ich kann dir wohl doch nicht helfen. :cry:

Gruß
Stefan

Verfasst: 09.09.2004 19:32
von remi_meier
Schade :( :cry:

Verfasst: 09.09.2004 20:50
von SoS
Ich habe auch dieses kunterbunte wirre Fenster (was alle ati nutzer haben werden.) :?
und wenn ich mal nach Blitzbasic schaue gibt es dort diese Befehle die die inkompatibilität ausgleichen.

Code: Alles auswählen

LockBuffer buffer
Parameters
buffer = any valid screen/image buffer (optional)  

Description
After you use LockBuffer on a buffer, the only graphics commands you can use are the read/write pixel commands ReadPixel, WritePixel, ReadPixelFast, WritePixelFast, CopyPixelFast, and CopyPixel. You must UnlockBuffer before using other graphics commands or API calls, and you are advised to only keep the buffer locked for as long as it is needed. 

The buffer parameter isn't required. If omitted, the default buffer set with SetBuffer will be used. 

UnlockBuffer buffer
Parameters
buffer = any valid screen/image buffer (optional)  

Description
After you use LockBuffer on a buffer, the only graphics commands you can use are the read/write pixel commands ReadPixel, WritePixel, ReadPixelFast, and WritePixelFast. You must use this command before using other graphics commands. 

The buffer parameter isn't required. If omitted, the default buffer set with SetBuffer will be used. 
Für Purebasic wurde dieses schlichtweg vergessen :freak:

Verfasst: 09.02.2005 10:53
von remi_meier
Juhu :D
Nur um euch zu informieren: Es war doch ein Bug und Fred hat ihn behoben!
http://jconserv.net/purebasic/viewtopic.php?t=12762