' imgputt() ... draw image. support H V flip, 90/180/270 degree rotation. ' Original by counting_pine ' https://www.freebasic.net/forum/viewtopic.php?t=12074 ' ' Added transparent color by mieki256 (2024/02/06) ' Last updated: <2024/02/08 19:50:39 +0900> #include "imgputt.bi" ' imgputt ' Put the image to screen. enable transparent color ' ' srcImg : Source image ' [dstImg] : Destination buffer (image). Default 0 ' [x, y] : position. Default (0, 0) ' [transform] : Transform type. look IMGPUT_TRANSFORM. Default TRANSFORM_NONE ' [mode] : IMGPUT_TRANS = 0 is Trans, IMGPUT_PSET = 1 is Pset ' [sx, sy, sw, sh] : Source area x, y, width, height sub imgputt overload( _ ByVal srcImg as any ptr, _ ByVal dstImg as any ptr = 0, _ ByVal x as integer = 0, _ ByVal y as integer = 0, _ ByVal transform as IMGPUT_TRANSFORM = TRANSFORM_NONE, _ ByVal mode As Integer = IMGPUT_TRANS, _ ByVal sx As Integer = 0, _ ByVal sy As Integer = 0, _ ByVal sw As Integer = 0, _ ByVal sh As Integer = 0 ) If transform = TRANSFORM_NONE Then ' transform none If sw > 0 And sh > 0 Then ' chip If mode = IMGPUT_TRANS Then Put (x, y), srcImg, (sx, sy) - Step(sw - 1, sh - 1), TRANS Else Put (x, y), srcImg, (sx, sy) - Step(sw - 1, sh - 1), PSET End If Else ' image If mode = IMGPUT_TRANS Then Put (x, y), srcImg, TRANS Else Put (x, y), srcImg, PSET End If End If Return End If Dim As Integer simgw, simgh, dimgw, dimgh ' image width, height Dim As Integer srcBypp, dstBypp ' 1 dot byte size Dim As Integer spitch, dpitch ' 1 raster byte size dim as any ptr srcPData, dstPData dim as integer screenDest = 0 ' get source image information if imageinfo( srcImg, simgw, simgh, srcBypp, spitch, srcPData ) then Return ' get dest image information if dstImg <> 0 then if imageinfo( dstImg, dimgw, dimgh, dstBypp, dpitch, dstPData ) then Return else dstPData = Screenptr() if dstPData = 0 then Return screeninfo( dimgw, dimgh, , dstBypp, dpitch ) screenDest = 1 end If if srcBypp <> dstBypp then Return dim as integer sdx, sdy, ddx, ddy sdx = srcBypp ' 1 dot byte size sdy = spitch ' 1 raster byte size ddx = dstBypp ddy = dpitch If sw = 0 Or sh = 0 Then sw = simgw sh = simgh End If dim as integer sx0, sx1, sy0, sy1 sx0 = sx sy0 = sy sx1 = sx + sw - 1 sy1 = sy + sh - 1 '' set up transform dim as const integer ptr spx0 = @sx0, spx1 = @sx1 dim as const integer ptr spy0 = @sy0, spy1 = @sy1 if (transform and TRANSFORM_D1FLIP) then swap sdx, sdy swap sx0, sy0 swap sx1, sy1 end If if (transform and TRANSFORM_HFLIP) Then sdx = -sdx swap spx0, spx1 End If if (transform and TRANSFORM_VFLIP) Then sdy = -sdy swap spy0, spy1 End If dim as integer dx0, dx1, dy0, dy1 dx0 = x dy0 = y dx1 = x + sx1 - sx0 dy1 = y + sy1 - sy0 ' dest is out of area If dx0 >= dimgw Or dx1 < 0 Or dy0 >= dimgh Or dy1 < 0 Then Return ' clipping if dx0 < 0 Then If (transform And TRANSFORM_HFLIP) Then sx1 += dx0 Else sx0 -= dx0 End If dx0 = 0 End If if dy0 < 0 Then If (transform And TRANSFORM_VFLIP) Then sy1 += dy0 Else sy0 -= dy0 End If dy0 = 0 End If if dx1 >= dimgw Then If (transform And TRANSFORM_HFLIP) Then sx0 -= (dimgw - 1 - dx1) Else sx1 += (dimgw - 1 - dx1) End If dx1 = (dimgw - 1) End If if dy1 >= dimgh Then If (transform And TRANSFORM_VFLIP) Then sy0 -= (dimgh - 1 - dy1) Else sy1 += (dimgh - 1 - dy1) End If dy1 = (dimgh - 1) End If ' source is out of area If sx0 < 0 Or sy0 < 0 Or sx1 >= simgw Or sy1 >= simgh Then Return ' find starting corner addresses dim as any ptr spr, dpr spr = srcPData + *spy0 * abs(sdy) + *spx0 * abs(sdx) dpr = dstPData + dy0 * abs(ddy) + dx0 * abs(ddx) ' put image if screenDest then screenlock If mode = 0 Then ' Trans. enable transparent color select case SrcBypp case 1: ' 8bit mode Dim As ubyte ptr sp, dp for y As Integer = sy0 to sy1 sp = spr dp = dpr for x As Integer = sx0 to sx1 If *sp <> 0 Then *dp = *sp sp += sdx dp += 1 next x spr += sdy dpr += ddy next y case 2: ' 16bit mode Dim As ushort ptr sp, dp sdx /= 2 for y As Integer = sy0 to sy1 sp = spr dp = dpr for x As Integer = sx0 to sx1 If *sp <> &HF81F Then *dp = *sp sp += sdx dp += 1 next x spr += sdy dpr += ddy next y case 4: ' 32bit mode Dim As ulong ptr sp, dp sdx /= 4 for y As Integer = sy0 to sy1 sp = spr dp = dpr for x As Integer = sx0 to sx1 If (*sp And &H00FFFFFF) <> &H00FF00FF Then *dp = *sp sp += sdx dp += 1 next x spr += sdy dpr += ddy next y end select Else ' Pset. disable transparent color select case SrcBypp case 1: ' 8bit mode Dim As ubyte ptr sp, dp for y As Integer = sy0 to sy1 sp = spr dp = dpr for x As Integer = sx0 to sx1 *dp = *sp sp += sdx dp += 1 next x spr += sdy dpr += ddy next y case 2: ' 16bit mode Dim As ushort ptr sp, dp sdx /= 2 for y As Integer = sy0 to sy1 sp = spr dp = dpr for x As Integer = sx0 to sx1 *dp = *sp sp += sdx dp += 1 next x spr += sdy dpr += ddy next y case 4: ' 32bit mode Dim As ulong ptr sp, dp sdx /= 4 for y As Integer = sy0 to sy1 sp = spr dp = dpr for x As Integer = sx0 to sx1 *dp = *sp sp += sdx dp += 1 next x spr += sdy dpr += ddy next y end select End If if screenDest then screenunlock end sub ' imgputt ' ' transform : Transform type. 0, 90, 180, 270 or IMGPUT_TRANSFORM sub imgputt overload( _ ByVal srcImg as any ptr, _ ByVal dstImg as any ptr = 0, _ ByVal x as integer = 0, _ ByVal y as integer = 0, _ ByVal transform as integer, _ ByVal mode As Integer = IMGPUT_TRANS, _ ByVal sx As Integer = 0, _ ByVal sy As Integer = 0, _ ByVal sw As Integer = 0, _ ByVal sh As Integer = 0 ) if transform and -8 then select case transform mod 360 case 0: transform = TRANSFORM_NONE case 90, -270: transform = TRANSFORM_R90 case 180, -180: transform = TRANSFORM_R180 case 270, -90: transform = TRANSFORM_R270 end select end if imgputt( srcImg, dstImg, x, y, cast(IMGPUT_TRANSFORM, transform), mode, sx, sy, sw, sh ) end sub