canvas
BlitzMax Forums/BlitzMax Programming/canvas
| ||
| hi, i have 2 differnt canvas objects on 2 diff. tabs of a maxgui app. i have a if statement to see which one tab is active and then draw 2 the relevent canvas, however i can swap to the second canvas ok but not back to the first, as soon as i do it gives me a memory violation error? is there a reason for this or prob something i've screwed up? |
| ||
| sourcecode? |
| ||
If actTab = 0 Then
SetGraphics CanvasGraphics(canvas)
DrawImage(tmpImg,0,0)
elseif actTab = 1 then
SetGraphics CanvasGraphics(canvas2)
DrawImage(tmpImg,0,0)
EndIf
Flip
its the DrawImage(tmpImg,0,0) in the first part that throws the error |
| ||
| That's weird because I was just setting up something similar. I have a main canvas and another canvas on a small popup window, and altenate drawing depending on if the popup is open. I tested it first using this as a test case and it seems to work fine, not sure if it will help though:
Global gWindow:TGadget
Global gCanvas1:TGadget
Global gCanvas2:TGadget
gWindow = CreateWindow("Dual Canvas Test",10,10,800,600)
gCanvas1 = CreateCanvas(20,20,200,150,gWindow)
gCanvas2 = CreateCanvas(20,220,200,150,gWindow)
ActivateGadget(gCanvas1)
SetGraphics CanvasGraphics(gCanvas1)
EnablePolledInput()
While KeyHit(KEY_ESCAPE) = False
ActivateGadget(gCanvas1)
SetGraphics CanvasGraphics(gCanvas1)
DrawText("HELLO FROM CANVAS 1",10,10)
Flip
Delay 1000
Cls
Flip
ActivateGadget(gCanvas2)
SetGraphics CanvasGraphics(gCanvas2)
DrawText("HELLO FROM CANVAS 2",10,10)
Flip
Delay 1000
Cls
Flip
Wend
|
| ||
| hmmm.... ok i'll try again, where would be the best place to use flip? inside each if or after? |
| ||
| Well for me I flip for each canvas that is drawn to and that seems to work. The extra flips in the example after the delays are just to show the fields clearing out. but in your code I would have thought either would work |
| ||
ok so i got my main loopWhile True myApp.DrawGFX() Wend myApp.drawgfx() is: Method drawGFX() '-------------------------------------------------------- If (loginWindow <> Null) Or (actTab = 0) Then SetGraphics CanvasGraphics(canvas) DrawImage(tmpImg,0,0) Flip EndIf If flgvisi =1 Then SetGraphics CanvasGraphics(flagcanv) DrawImage(FlagImg,0,0) Flip EndIf End Method but this just locks the program up? why should this happen? |
| ||
| *bump |
| ||
| Are both canvases globally defined or at least as fields? Another thing might be that one canvas uses DX and the other OpenGL in which case I'm not sure if you would need a special setup when loading the image (ie setting the canvas they are used in before loading) |
| ||
| hmmm. both are global and both setup the same way....not sure what to try next |
| ||
| btw: are you sure that the program locks up? Isn't it possible that both IFs fail so that nothing is drawn at all? ... |
| ||
| well the rest of the window stops responding, buttons etc... so i presume locking, it may just be my untidy coding i dont know, but as soon a si remove it it works ok |
| ||
| Can't you post your full code or the smallest example that shows the problem? |
| ||
| hmmm...sure when i get home tonight i'll post something to show the problem :) |
| ||
| I'm having this exact problem. Create a canvas, SetGraphics() to it, and it works. Create another canvas, SetGraphics() to it, and all is well. Go back to the original canvas, SetGraphics() to it, and splat. Some points: 1. Retrieving info from the canvas works ok; ie. GraphicsWidth() and GraphicsHeight() return the correct values. 2. Writing info to the canvas causes the splat. This has got to be a bug within the MaxGUI runtime code. I'm working my way through the code right now, looking for the bug, but I'm quite unfamilier with the code, so it's taking some time. I suspect that the core Gadget definition has a static variable in it somewhere, rather than a regular, stack-based variable, and when the context changes (or, in my case, I free the second canvas), the handle is getting a null or otherwise illegal value. BUT, I'm working my way through the code. Hopefully someone more familier with the code can have a look in this area. |
| ||
| It would really help if somebody who has this problem posted some runnable source code. |
| ||
| In my Making a MaxGUI Application: StripAnimMakerLite Tutorial, I use 3 canvases without any problem. You may want to check out how I did that as full source code is provided there. |
| ||
| *EDIT - removed |
| ||
| @tonyg: Here's a minimum sample to show the problem:
Function DoSomething(canvas:TGadget)
SetGraphics CanvasGraphics(canvas)
Cls
DrawText "Hello :)",10,10
End Function
Local win1:TGadget
Local win2:TGadget
Local can1:TGadget
Local can2:TGadget
win1=CreateWindow("Window 1",60,60,100,100,Null,WINDOW_TITLEBAR|WINDOW_CLIENTCOORDS)
win2=CreateWindow("Window 2",200,60,100,100,Null,WINDOW_TITLEBAR|WINDOW_CLIENTCOORDS)
can1=CreateCanvas(0,0,100,100,win1)
can2=CreateCanvas(0,0,100,100,win2)
DoSomething can1
DoSomething can2
FreeGadget can2
DoSomething can1
If you run the program, it goes splat in the final DoSomething can1. @assari, Your tutorial is good - however, from what I could see you keep the canvas' open at all times, whereas this problem seems to be related to closing a canvas. Neil |
| ||
| You should do the SetGraphics before you free the gadget, otherwise it might lead to problems. |
| ||
Ok, I've isolated the line of code that causes the crash. It's in BRL.D3D7Max2D:Method Cls() device.Clear 1,vp_rect,D3DCLEAR_TARGET,clscolor,0,0 End Method device is null. I believe this comes about in the SetGraphics method Method SetGraphics( g:TGraphics ) If Not g D3D7GraphicsDriver().SetGraphics Null Return EndIf Local t:TMax2DGraphics=TMax2DGraphics( g ) Local d3d7graphics:TD3D7Graphics=TD3D7Graphics( t._graphics ) device=d3d7Graphics.GetDevice( Self ) If Not device Return The last line of the posted code is where the action is. Digging deeper into d3d7graphics.bmx, I find this: Method GetDevice:IDirect3DDevice7(user:Object) If (state&DX7LOST)=False And device painter=user Return device EndIf End Method Now, state was 0, device was valid. If I understand things correctly, we're doing a bitwise comparison on state using DX7LOST. Since state is zero, the comparison SHOULD be false (unless DX7LOST is zero, but I can't find it's definition). device is non-zero, so the code should execute. @Dreamora, tried your suggestion; no change. Any suggestions? Neil |
| ||
| skid had a post where he said this will be fixed in the next update. see post here I get the same problem. Changing the driver to SetGraphicsDriver GLMax2DDriver()fixes the problem so you are right its a DX problem |
| ||
| looks like it's dropping the dx instance entirely when you close the canvas. Tried to find it in the source specifically but was unsuccessful. |
| ||
| @assari, Perfect! Thank you. Neil |
| ||
| huh ... didn't think that the DX Device problem even interferes with canvases ... *putting in my knowledge list for later problem solving* thanks for that assari |