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 |