I used one of these two (can't remember which) in Fairway. The image was pre-calced before the screen was shown, wasn't slow enough to notice:
' ----------------------------------------------------------------------------- ' ccCopyImageRect: Copies part of an image onto another image ' by James Chamblin ' ----------------------------------------------------------------------------- Function ccCopyImageRect(Source:TImage,SX:Int,SY:Int,SWidth:Int,SHeight:Int,Dest:TImage,DX:Int,DY:Int) 'get the pixmap for the images Local SourcePix:TPixmap = LockImage(Source) Local DestPix:TPixmap = LockImage(Dest) 'find the dimentions Local SourceWidth:Int = PixmapWidth(SourcePix) Local SourceHeight:Int = PixmapHeight(SourcePix) Local DestWidth:Int = PixmapWidth(DestPix) Local DestHeight:Int = PixmapHeight(DestPix) If SX < SourceWidth And SY < SourceHeight And DX < DestWidth And DY < DestHeight 'make sure rects are on image If SX+SWidth > SourceWidth Then SWidth = SourceWidth - SX 'bound the coordinates to the image area If SY+SHeight > SourceHeight Then SHeight = SourceHeight - SY If DX+SWidth > DestWidth Then SWidth = DestWidth - DX 'Make sure coordinates will fit into the destination If DY+SHeight > DestHeight Then SHeight = DestHeight - DY 'find the pitch Local SourcePitch:Int = PixmapPitch(SourcePix) Local DestPitch:Int = PixmapPitch(DestPix) 'pointers To the first pixel of pixmaps Local SourcePtr:Byte Ptr = PixmapPixelPtr(SourcePix) + SY * SourcePitch + SX * 4 Local DestPtr:Byte Ptr = PixmapPixelPtr(DestPix) + DY * DestPitch + DX * 4 'copy pixels over one line at a time For Local i:Int = 1 To SHeight MemCopy(DestPtr,SourcePtr,SWidth*4) SourcePtr :+ SourcePitch DestPtr :+ DestPitch Next End If 'unlock the buffers UnlockImage(Source) UnlockImage(Dest) End Function ' ----------------------------------------------------------------------------- ' ccCopyImageToImage: Copies one TImage to another with a variety of modes ' by Dave Munsie ' ----------------------------------------------------------------------------- Function ccCopyImageToImage(Source:TImage,SX:Int,SY:Int,SWidth:Int,SHeight:Int,Dest:TImage,DX:Int,DY:Int,flags:Int=0) ' ' flags: 0 = Normal 1 = Mirror 2 = Flip 3 = Mirror and Flip ' Local SourcePix:TPixmap = LockImage(Source) Local DestPix:TPixmap = LockImage(Dest) Local SourceWidth:Int = PixmapWidth(SourcePix) Local SourceHeight:Int = PixmapHeight(SourcePix) Local DestWidth:Int = PixmapWidth(DestPix) Local DestHeight:Int = PixmapHeight(DestPix) If SX < SourceWidth And SY < SourceHeight And DX < DestWidth And DY < DestHeight If SX+SWidth > SourceWidth Then SWidth = SourceWidth - SX If SY+SHeight > SourceHeight Then SHeight = SourceHeight - SY If DX+SWidth > DestWidth Then SWidth = DestWidth - DX If DY+SHeight > DestHeight Then SHeight = DestHeight - DY Select flags Case 0 ' Normal For Local py:Int = 0 To SHeight-1 For Local px:Int = 0 To SWidth- 1 WritePixel(DestPix,DX+px,DY+py,ReadPixel(SourcePix,SX+px,SY+py)) Next Next Case 1 ' Mirror For Local py:Int = 0 To SHeight-1 For Local px:Int = 0 To SWidth- 1 WritePixel(DestPix,DX+px,DY+py,ReadPixel(SourcePix,(SX+(SWidth-1))-px,SY+py)) Next Next Case 2 ' Flip For Local py:Int = 0 To SHeight-1 For Local px:Int = 0 To SWidth- 1 WritePixel(DestPix,DX+px,DY+py,ReadPixel(SourcePix,SX+px,(SY+(SHeight-1))-py)) Next Next Case 3 ' Mirror and Flip For Local py:Int = 0 To SHeight-1 For Local px:Int = 0 To SWidth- 1 WritePixel(DestPix,DX+px,DY+py,ReadPixel(SourcePix,(SX+(SWidth-1))-px,(SY+(SHeight-1))-py)) Next Next End Select EndIf UnlockImage(Source) UnlockImage(Dest) End Function