As for 2), consider the source rectangle’s centerpoint the origin and four vectors pointing to the four vertexes. These four points will always be the further away points from the center, so if you make sure that they’re inside the texture after rotating it, you’re good. You can rotate a vector around the z-axis by the angle a (in radians) with the following formula:
x’ = cos(a) * x - sin(a) * y
y’ = sin(a) * x + cos(a) * y
where (x;y) is the original vector and (x’;y’) is the rotated vector. Apply this transformation to all four vectors, then choose the minimal and maximal x and y values, and you have the boundaries of the target texture.
Well, actually, since there are two parallel pairs of vectors, you can simplify the calculation further: you only need two non-parallel vectors and get the width and height with the following formula:
w = 2max(abs(x1’, x2’))
h = 2max(abs(y1’, y2’))
The only problem with this method is that if you now rotate this texture further, you’ll get an ever growing frame. To avoid this, you could remember the dimensions of the original texture and use that in any subsequent transformation.