[b]MOJO2 WritePixels - Help![/b]
Monkey Forums/Monkey Programming/[b]MOJO2 WritePixels - Help![/b]
| ||
Does anyone knows how WritePixels in MOJO2 stores the data? I am porting my 8080 Arcade Emulator and for some reason the emulator screen shows the images 4 times! I played around with pitch but no luck. May be it has to do with the way WritePixels stores the data. Here are the images for MOJO ![]() and MOJO2 ![]() I played with pitch but no luck, pitch needs to be 244 , the image is 244 x 256. For comparison below are the MOJO and MOJO2 codes of my CopyScreen, it copies the data from the arcade memory to the image screen of Monkey: MOJO WritePixels Method CopyScreen:Int() For Local j:Int = 0 Until 224 Local src:Int = $2400 + (j Shl 5) Local dst:Int = (sh - 1) * pitch + j For Local i:Int = 0 Until 32 Local vram:Int = cpu.memory[src] src += 1 For Local bit:Int = 0 Until 8 Local color:Int = 0 If (vram & 1) Then color = $FFFFFFFF dp[dst] = color dst -= pitch vram = vram Shr 1 Next Next Next screen.WritePixels(dp, 0, 0, sw, sh, 0, pitch) Return 0 End MOJO2 WritePixels Method CopyScreen:Int() Local rgba:= a * 255 Shl 24 | b * 255 Shl 16 | g * 255 Shl 8 | r * 255 For Local j:Int = 0 Until 224 Local src:Int = $2400 + (j Shl 5) Local dst:Int = (sh - 1) * pitch + j For Local i:Int = 0 Until 32 Local vram:Int = cpu.memory[src] '& $ff src += 1 For Local bit:Int = 0 Until 8 'Local color:Int = $FF000000 a = 1.0; b = 0.0; g = 0.0; r = 0.0 rgba = a * 255 Shl 24 | b * 255 Shl 16 | g * 255 Shl 8 | r * 255 If (vram & 1) Then 'color = $FFFFFFFF 'dp[dst] = color a = 1.0; b = 1.0; g = 1.0; r = 1.0 rgba = a * 255 Shl 24 | b * 255 Shl 16 | g * 255 Shl 8 | r * 255 EndIf dp.PokeInt(dst, rgba) 'dp.PokeInt (dst, color) dst -= pitch vram = vram Shr 1 Next Next Next screen.WritePixels(0, 0, sw, sh, dp, 0, pitch) Return 0 End |
| ||
Hi after a while I figured it out. I found the issue, the MOJO2 DrawPixels DataBuffer has to be 4 times the size compared to the MOJO 1, that is because each pixel requires 4 bytes for color and Alpha - RGBA, Besides that pitch has to be multiplied by 4. Field sw:Int = 224 Field sh:Int = 256 Field screen:Image Field dp:DataBuffer Method Init:Int() sw = 224 sh = 256 pitch = sw * 4 screen = New Image(sw, sh) screen.SetHandle(0, 0) dp = New DataBuffer(sw * sh * 4) End Method CopyScreen:Int() Local dst:Int = 0 For Local j:Int = 0 Until 224 Local src:Int = $2400 + j Shl 5 Local dst:Int = j * pitch For Local i:Int = 0 Until 32 Local vram:Int = cpu.memory[src] src += 1 For Local bit:Int = 0 Until 8 Local color:Int = 0 If (vram & 1) Then color = $FFFFFFFF dp.PokeInt(dst, color) dst += 4 vram = vram Shr 1 Next Next Next screen.WritePixels(0, 0, sw, sh, dp, 0, pitch) Return 0 End |