[bmx] Rotate and flip pixmaps by Pineapple [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:40

Previous topic - Next topic

BlitzBot

Title : Rotate and flip pixmaps
Author : Pineapple
Posted : 1+ years ago

Description : Rotates pixmaps CW, CCW, 180 degrees, and flips horizontally and vertically.

Code :
Code (blitzmax) Select
' --+-----------------------------------------------------------------------------------------+--
'  |   This code was originally written by Sophie Kirschner (sophiek@pineapplemachine.com)   |  
'  | It is released as public domain. Please don't interpret that as liberty to claim credit |  
'  |   that isn't yours, or to sell this code when it could otherwise be obtained for free   |  
'  |                because that would be a really shitty thing of you to do.                |
' --+-----------------------------------------------------------------------------------------+--


SuperStrict

Import brl.pixmap

' Example code

Rem

Graphics 280,398

' make the test pixmap
Local testpix:TPixmap=CreatePixmap(64,48,PF_RGB888)
ClearPixels testpix,~0
For Local i%=0 Until 16
For Local j%=0 Until 16
testpix.WritePixel i,j,$ff0000
testpix.WritePixel testpix.width-i-1,j,$00ff00
testpix.WritePixel i,testpix.height-j-1,$0000ff
Next
Next

' draw the original and rotated/flipped pixmaps
Local x%=2,y%=2,yinc%=66
Local tx%=72,ty%=27
DrawPixmap testpix,x,y+yinc*0
DrawPixmap PixmapRotateCW(testpix),x,y+yinc*1
DrawPixmap PixmapRotateCCW(testpix),x,y+yinc*2
DrawPixmap PixmapRotate180(testpix),x,y+yinc*3
DrawPixmap PixmapFlipH(testpix),x,y+yinc*4
DrawPixmap PixmapFlipV(testpix),x,y+yinc*5
DrawText "Original",tx,ty+yinc*0
DrawText "Rotated Clockwise",tx,ty+yinc*1
DrawText "Rotated Counterclockwise",tx,ty+yinc*2
DrawText "Rotated 180",tx,ty+yinc*3
DrawText "Flipped Horizontally",tx,ty+yinc*4
DrawText "Flipped Vertically",tx,ty+yinc*5

' render it to the screen in a loop
Repeat
Flip
If KeyDown(27) Or AppTerminate() Then End
Delay 100
Forever

EndRem

Function PixmapRotateCW:TPixmap(pix:TPixmap)
Local ret:TPixmap=CreatePixmap(pix.height,pix.width,pix.format)
For Local x%=0 Until ret.width
Local gy%=pix.height-x-1
For Local y%=0 Until ret.height
ret.WritePixel x,y,pix.ReadPixel(y,gy)
Next
Next
Return ret
End Function
Function PixmapRotateCCW:TPixmap(pix:TPixmap)
Local ret:TPixmap=CreatePixmap(pix.height,pix.width,pix.format)
For Local y%=0 Until ret.height
Local gx%=pix.width-y-1
For Local x%=0 Until ret.width
ret.WritePixel x,y,pix.ReadPixel(gx,x)
Next
Next
Return ret
End Function
Function PixmapRotate180:TPixmap(pix:TPixmap)
Local ret:TPixmap=CreatePixmap(pix.width,pix.height,pix.format)
For Local x%=0 Until ret.width
Local gx%=pix.width-x-1
For Local y%=0 Until ret.height
Local gy%=pix.height-y-1
ret.WritePixel x,y,pix.ReadPixel(gx,gy)
Next
Next
Return ret
End Function
Function PixmapFlipH:TPixmap(pix:TPixmap)
Local ret:TPixmap=CreatePixmap(pix.width,pix.height,pix.format)
For Local x%=0 Until pix.width
Local gx%=pix.width-x-1
For Local y%=0 Until pix.height
ret.WritePixel x,y,pix.ReadPixel(gx,y)
Next
Next
Return ret
End Function
Function PixmapFlipV:TPixmap(pix:TPixmap)
Local ret:TPixmap=CreatePixmap(pix.width,pix.height,pix.format)
For Local y%=0 Until pix.height
Local gy%=pix.height-y-1
For Local x%=0 Until pix.width
ret.WritePixel x,y,pix.ReadPixel(x,gy)
Next
Next
Return ret
End Function


Comments :


Polan(Posted 1+ years ago)

 For flipping there is XFlipPixmap nad YFlipPixmap function.


Pineapple(Posted 1+ years ago)

 Ah, I wasn't aware. Surprisingly, though, a speed test says that PixmapFlipH is slightly faster than XFlipPixmap.
SuperStrict

Framework brl.system
Import brl.standardio
Import "pixmaprot.bmx"

Const n%=2500,n2%=8
Global ms%,nms%,i%

Global pixfliph%,pixflipv%
Global pixflipx%,pixflipy%

Local pix:TPixmap=CreatePixmap(64,64,PF_RGBA8888)
ClearPixels pix,0
For i=0 Until pix.width
pix.WritePixel i,i,$ffff0000
Next

For Local t%=0 Until n2

ms=MilliSecs()
For i=0 Until n
pixmapfliph pix
Next
nms=MilliSecs()
Print "PixmapFlipH: "+(nms-ms)
pixfliph:+(nms-ms)

ms=MilliSecs()
For i=0 Until n
XFlipPixmap pix
Next
nms=MilliSecs()
Print "XFlipPixmap: "+(nms-ms)
pixflipx:+(nms-ms)

ms=MilliSecs()
For i=0 Until n
pixmapflipv pix
Next
nms=MilliSecs()
Print "PixmapFlipV: "+(nms-ms)
pixflipv:+(nms-ms)

ms=MilliSecs()
For i=0 Until n
YFlipPixmap pix
Next
nms=MilliSecs()
Print "YFlipPixmap: "+(nms-ms)
pixflipy:+(nms-ms)

Next

Print "Average PixmapFlipH ms: "+(pixfliph/n2)
Print "Average PixmapFlipV ms: "+(pixflipv/n2)
Print "Average XFlipPixmap ms: "+(pixflipx/n2)
Print "Average YFlipPixmap ms: "+(pixflipy/n2)
PixmapFlipH: 540
XFlipPixmap: 496
PixmapFlipV: 475
YFlipPixmap: 52
PixmapFlipH: 374
XFlipPixmap: 409
PixmapFlipV: 373
YFlipPixmap: 43
PixmapFlipH: 376
XFlipPixmap: 409
PixmapFlipV: 368
YFlipPixmap: 44
PixmapFlipH: 377
XFlipPixmap: 424
PixmapFlipV: 364
YFlipPixmap: 42
PixmapFlipH: 368
XFlipPixmap: 427
PixmapFlipV: 373
YFlipPixmap: 45
PixmapFlipH: 367
XFlipPixmap: 385
PixmapFlipV: 369
YFlipPixmap: 42
PixmapFlipH: 386
XFlipPixmap: 392
PixmapFlipV: 395
YFlipPixmap: 44
PixmapFlipH: 398
XFlipPixmap: 416
PixmapFlipV: 373
YFlipPixmap: 52
Average PixmapFlipH ms: 398
Average PixmapFlipV ms: 386
Average XFlipPixmap ms: 419
Average YFlipPixmap ms: 45



TomToad(Posted 1+ years ago)

 Found a bug.  In the last 3 functions, you need to exchange pix.height and pix.width in the CreatePixmap calls.


Pineapple(Posted 1+ years ago)

 Ah, whoops. It's fixed now. [/i]