; ; ------------------------------------------------------------ ; ; PureBasic - Drawing via Direct Screen Access (DSA) ; ; (c) Fantaisie Software ; ; ------------------------------------------------------------ ; ; ; We disable the debugger to run at full speed ! DisableDebugger #ScreenWidth = 800 ; Feel free to change this to see the pixel filling speed ! #ScreenHeight = 600 If InitSprite() = 0 Or InitKeyboard() = 0 MessageRequester("Error", "Can't initialize the GFX system",0) EndIf Structure Pixel Pixel.l EndStructure Procedure.f GSin(angle.f) ProcedureReturn Sin(angle*(2*3.14/360)) EndProcedure ; Pre-calculated values are faster than realtime calculated ones... ; ... so we save them in an array before starting gfx operations Dim CosTable(#ScreenWidth*2) Dim ColorTable(255) For i = 0 To #ScreenWidth*2 CosTable(i) = GSin(360*i/320)* 32 + 32 Next If OpenScreen(#ScreenWidth, #ScreenHeight, 32, "PB Plasma") Repeat Wave+6 If Wave > 320 : Wave = 0 : EndIf If StartDrawing(ScreenOutput()) Buffer = DrawingBuffer() ; Get the start address of the screen buffer Pitch = DrawingBufferPitch() ; Get the length (in byte) took by one horizontal line PixelFormat = DrawingBufferPixelFormat() ; Get the pixel format. ; We don't care about Y for this effect, so remove it from the fags PixelFormat & ~#PB_PixelFormat_ReversedY If PixelFormat = #PB_PixelFormat_32Bits_RGB Or PixelFormat = #PB_PixelFormat_24Bits_RGB For i = 0 To 255 ColorTable(i) = i << 16 ; Blue is at the 3th pixel Next ElseIf PixelFormat = #PB_PixelFormat_32Bits_BGR Or PixelFormat = #PB_PixelFormat_24Bits_BGR For i = 0 To 255 ColorTable(i) = i ; Blue is at the 1th pixel Next EndIf If PixelFormat = #PB_PixelFormat_32Bits_RGB Or PixelFormat = #PB_PixelFormat_32Bits_BGR Offset = 4 Else ; 24-bit Offset = 3 EndIf For y = 0 To #ScreenHeight-1 pos1 = CosTable(y+wave) *Line.Pixel = Buffer+Pitch*y For x = 0 To #ScreenWidth-1 pos2 = (CosTable(x+Wave) + CosTable(x+y) + pos1) *Line\Pixel = ColorTable(pos2) ; Write the pixel directly to the memory ! *Line+Offset ; You can try with regular plot to see the speed difference ; Plot(x, y, ColorTable(pos2)) Next Next StopDrawing() EndIf ExamineKeyboard() FlipBuffers() Until KeyboardPushed(#PB_Key_Escape) Else MessageRequester("Error","Can't open the screen !",0) EndIf End