' ------------------------------------------------------------------------------------
' Large Image made up of multiple fixed size textures.
' o - handles rotation and scaling
' o - displays large images irrespective of graphic card limitations.
' tesuji 2005
' -------------------------------------------------------------------------------------
Strict
Const FRAGSIZE = 256 ' maximum image fragment size
' ------------------------------------------------------------------------------------
' example usage
' ------------------------------------------------------------------------------------
Graphics 800,600,0
Local imageUrl:String = "/Users/sean/Pictures/1280x1024_starwars.jpg" ' <----- edit image file path
Local pixmap:TPixmap = LoadPixmap(imageUrl)
Local img:BigImage = BigImage.Create(pixmap)
Local scaleinc:Float = .01
While Not KeyHit(KEY_ESCAPE)
Cls
img.rotation :+ 1
img.scale :+ scaleinc
If img.scale < 0 Or img.scale > 2 scaleinc = -scaleinc
img.render()
Flip
Wend
End
' =============================
' Image Fragment
' =============================
Type ImageFragment
Field img:TImage
Field x,y
Field rotation:Float = 0
Field angle:Double
Field distance:Double
' ----------------------------------
' constructor
' ----------------------------------
Function create:ImageFragment(pmap:TPixmap,x:Float,y:Float,w,h)
Local frag:ImageFragment = New ImageFragment
frag.img = LoadImage(PixmapWindow(pmap,x,y,w,h),0|FILTEREDIMAGE)
x = (pmap.width*.5) - x
y = (pmap.height*.5) - y
frag.x = x
frag.y = y
frag.angle = ATan2(y,x)-180
frag.distance = Sqr(x*x + y*y)
Return frag
End Function
' --------------------
' Draw individual tile
' --------------------
Method render(scale:Float,xoff:Float=0,yoff:Float=0,rot:Float=0)
SetRotation rot
Local d:Float = Self.distance*scale
SetScale(scale,scale)
DrawImage(Self.img,(Cos(rot+Self.angle)*d)+xoff,(Sin(rot+Self.angle)*d)+yoff )
End Method
End Type
' ==================================
' Big Image
' ==================================
Type BigImage
Field pixmap:TPixmap
Field px,py
Field fragments:TList
Field scale:Float = 1
Field width
Field height
Field x:Float = 0
Field y:Float = 0
Field rotation:Float = 0
' ----------------------------------
' constructor
' ----------------------------------
Function create:BigImage(p:TPixmap)
Local bi:BigImage = New BigImage
bi.pixmap = p
bi.width = p.width
bi.height = p.height
bi.fragments = CreateList()
bi.load()
Return bi
End Function
' -------------------------------------
' convert pixmap into image fragments
' -------------------------------------
Method load()
Local px = 0
Local py = 0
Local loading = True
While (loading)
'FlushMem
Local w = FRAGSIZE
If Self.pixmap.width - px < FRAGSIZE w = Self.pixmap.width - px
Local h = FRAGSIZE
If Self.pixmap.height - py < FRAGSIZE h = Self.pixmap.height - py
Local f1:ImageFragment = ImageFragment.create(Self.pixmap,px,py,w,h)
ListAddLast Self.fragments,f1
px:+FRAGSIZE
If px >= Self.pixmap.width
px = 0
py:+FRAGSIZE
If py >= Self.pixmap.height loading = False
End If
Wend
End Method
' -----------------
' Draw entire image
' -----------------
Method render()
SetOrigin(GraphicsWidth()*.5,GraphicsHeight()*.5)
For Local f:ImageFragment = EachIn Self.fragments
f.render(Self.scale,Self.x,Self.y,Self.rotation)
Next
SetOrigin(0,0)
End Method
End Type |