Here's a thing chatgpt made. I had to modify a few things to get it to work, and I added the code to give it a practical test, but it does work "somewhat."
Code: Select all
#include "fbgfx.bi"
declare sub Rotozoom(src As Any Ptr, dst As Any Ptr, src_width As Integer, src_height As Integer, dst_width As Integer, dst_height As Integer, angle As Double, zoom As Double)
screenres 640,480,32
dim as fb.image ptr temp1 = imagecreate(640,480)
dim as fb.image ptr temp2 = imagecreate(640,480)
for y as integer = 0 to 480
for x as integer = 0 to 640
pset temp1, (x,y), rgb(rnd*255,rnd*255,rnd*255)
next
next
dim as double ang
do
ang+=.1
Rotozoom( temp1, temp2, 640,480,640,480,ang,.1)
screenlock
cls
put(0,0),temp2
screensync
screenunlock
sleep 3,1
loop until multikey(FB.SC_ESCAPE)
Sub Rotozoom(src As Any Ptr, dst As Any Ptr, src_width As Integer, src_height As Integer, dst_width As Integer, dst_height As Integer, angle As Double, zoom As Double)
Dim cx As Double = src_width / 2.0
Dim cy As Double = src_height / 2.0
Dim dst_cx As Double = dst_width / 2.0
Dim dst_cy As Double = dst_height / 2.0
Dim cos_angle As Double = Cos(angle)
Dim sin_angle As Double = Sin(angle)
For dst_y As Integer = 0 To dst_height - 1
For dst_x As Integer = 0 To dst_width - 1
Dim src_x As Double = ((dst_x - dst_cx) / zoom) * cos_angle - ((dst_y - dst_cy) / zoom) * sin_angle + cx
Dim src_y As Double = ((dst_y - dst_cy) / zoom) * cos_angle + ((dst_x - dst_cx) / zoom) * sin_angle + cy
Dim x1 As Integer = Int(src_x)
Dim y1 As Integer = Int(src_y)
Dim x2 As Integer = x1 + 1
Dim y2 As Integer = y1 + 1
Dim x_frac As Double = src_x - x1
Dim y_frac As Double = src_y - y1
If x1 >= 0 And x2 < src_width And y1 >= 0 And y2 < src_height Then
Dim src_ptr1 As Any Ptr = src + (y1 * src_width + x1) * 4
Dim src_ptr2 As Any Ptr = src + (y1 * src_width + x2) * 4
Dim src_ptr3 As Any Ptr = src + (y2 * src_width + x1) * 4
Dim src_ptr4 As Any Ptr = src + (y2 * src_width + x2) * 4
Dim r1 As Byte = peek(src_ptr1)
Dim g1 As Byte = peek(src_ptr1+1)
Dim b1 As Byte = peek(src_ptr1+2)
Dim a1 As Byte = Peek(src_ptr1+3)
Dim r2 As Byte = Peek(src_ptr2)
Dim g2 As Byte = Peek(src_ptr2+1)
Dim b2 As Byte = Peek(src_ptr2+2)
Dim a2 As Byte = Peek(src_ptr2+3)
Dim r3 As Byte = Peek(src_ptr3+0)
Dim g3 As Byte = Peek(src_ptr3+1)
Dim b3 As Byte = Peek(src_ptr3+2)
Dim a3 As Byte = Peek(src_ptr3+3)
Dim r4 As Byte = Peek(src_ptr4)
Dim g4 As Byte = Peek(src_ptr4+1)
Dim b4 As Byte = Peek(src_ptr4+2)
Dim a4 As Byte = Peek(src_ptr4+3)
Dim r As Byte = (1.0 - y_frac) * ((1.0 - x_frac) * r1 + x_frac * r2) + y_frac * ((1.0 - x_frac) * r3 + x_frac * r4)
Dim g As Byte = (1.0 - y_frac) * ((1.0 - x_frac) * g1 + x_frac * g2) + y_frac * ((1.0 - x_frac) * g3 + x_frac * g4)
Dim b As Byte = (1.0 - y_frac) * ((1.0 - x_frac) * b1 + x_frac * b2) + y_frac * ((1.0 - x_frac) * b3 + x_frac * b4)
Dim a As Byte = (1.0 - y_frac) * ((1.0 - x_frac) * a1 + x_frac * a2) + y_frac * ((1.0 - x_frac) * a3 + x_frac * a4)
Dim dst_ptr As Any Ptr = dst + (dst_y * dst_width + dst_x) * 4
poke dst_ptr, r
poke dst_ptr+1, g
poke dst_ptr+2, b
poke dst_ptr+3, a
End If
Next
Next
End sub