This is rotate.c in view mode; [Download] [Up]
#include <libc.h>
#include <math.h>
#include "../common.h"
#include "../getpixel.h"
static double cosine, sine;
static int xdiff, ydiff;
void rotate_size(int angle, commonInfo *cinf, commonInfo *newinf)
{
if (angle == 90 || angle == 270) {
newinf->width = cinf->height;
newinf->height = cinf->width;
}else if (angle == 0 || angle == 180) {
newinf->width = cinf->width;
newinf->height = cinf->height;
}else {
double th = ((double)angle * 3.14159265) / 180.0;
double co = cos(th);
double si = sin(th);
if (co < 0) co = -co;
if (si < 0) si = -si;
newinf->width = cinf->width * co + cinf->height * si + 0.5;
newinf->height = cinf->width * si + cinf->height * co + 0.5;
if (angle > 270) {
xdiff = cinf->height * si - 0.5;
ydiff = 0.0;
}else if (angle > 180) {
xdiff = newinf->width - 1;
ydiff = cinf->height * co - 0.5;
}else if (angle > 90) {
xdiff = cinf->width * co - 0.5;
ydiff = newinf->height - 1;
}else {
xdiff = 0.0;
ydiff = cinf->width * si - 0.5;
}
cosine = cos(th);
sine = sin(th);
}
}
int sub_rotate(int op, int angle, commonInfo *cinf, commonInfo *newinf,
int idx[], unsigned char **working)
{
int x, y;
int i, pidx, ptr;
int pix[MAXPLANE];
if (op == Horizontal) {
for (y = 0; y < newinf->height; y++) {
ptr = y * newinf->width;
for (x = newinf->width - 1; x >= 0; x--) {
getPixelA(pix);
for (i = 0; i <= ALPHA; i++) {
if ((pidx = idx[i]) < 0) continue;
working[pidx][ptr + x] = pix[i];
}
}
}
}else if (op == Vertical) {
for (y = newinf->height - 1; y >= 0; y--) {
ptr = y * newinf->width;
for (x = 0; x < newinf->width; x++) {
getPixelA(pix);
for (i = 0; i <= ALPHA; i++) {
if ((pidx = idx[i]) < 0) continue;
working[pidx][ptr + x] = pix[i];
}
}
}
}else if (angle == 90) {
for (x = 0; x < newinf->width; x++) {
for (y = newinf->height - 1; y >= 0; y--) {
ptr = y * newinf->width;
getPixelA(pix);
for (i = 0; i <= ALPHA; i++) {
if ((pidx = idx[i]) < 0) continue;
working[pidx][ptr + x] = pix[i];
}
}
}
}else if (angle == 270) {
for (x = newinf->width - 1; x >= 0; x--) {
for (y = 0; y < newinf->height; y++) {
ptr = y * newinf->width;
getPixelA(pix);
for (i = 0; i <= ALPHA; i++) {
if ((pidx = idx[i]) < 0) continue;
working[pidx][ptr + x] = pix[i];
}
}
}
}else if (angle == 180) {
for (y = newinf->height - 1; y >= 0; y--) {
ptr = y * newinf->width;
for (x = newinf->width - 1; x >= 0; x--) {
getPixelA(pix);
for (i = 0; i <= ALPHA; i++) {
if ((pidx = idx[i]) < 0) continue;
working[pidx][ptr + x] = pix[i];
}
}
}
}else /* any */ {
unsigned char *tmp[MAXPLANE];
int dx, dy, ox, oy, pty;
int pl = cinf->numcolors;
if (newinf->alpha) pl++;
if (allocImage(tmp, cinf->width, cinf->height, 8, pl))
return Err_MEMORY;
for (y = 0; y < cinf->height; y++) {
ptr = y * cinf->width;
for (x = 0; x < cinf->width; x++) {
getPixelA(pix);
for (i = 0; i <= ALPHA; i++) {
if ((pidx = idx[i]) < 0) continue;
tmp[pidx][ptr + x] = pix[i];
}
}
}
for (y = 0; y < newinf->height; y++) {
dy = y - ydiff;
ptr = y * newinf->width;
for (x = 0; x < newinf->width; x++) {
dx = x - xdiff;
ox = dx * cosine - dy * sine + 0.5;
oy = dx * sine + dy * cosine + 0.5;
if (ox < 0 || ox >= cinf->width
|| oy < 0 || oy >= cinf->height) {
for (i = 0; i < pl; i++)
working[i][ptr + x] = 0;
}else {
pty = oy * cinf->width + ox;
for (i = 0; i < pl; i++)
working[i][ptr + x] = tmp[i][pty];
}
}
}
free((void *)tmp[0]);
}
return 0;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.