aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/scale.c94
1 files changed, 50 insertions, 44 deletions
diff --git a/src/scale.c b/src/scale.c
index afcf458..e7cc41c 100644
--- a/src/scale.c
+++ b/src/scale.c
@@ -3,17 +3,17 @@
#include <sys/time.h>
#include "meh.h"
-#define TDEBUG 1
+#define TDEBUG 0
-#define GETVAL0(x, c) ((ibuf[bufxs[x] * 3 + (c)] * (ur) + ibuf[bufxs[x+1] * 3 + (c)] * (u)) * (vr) >> 20)
-#define GETVAL(x, c) (( \
+#define GETVAL0(c) ((ibuf[x0 + (c)] * (ur) + ibuf[x1 + (c)] * (u)) * (vr) >> 20)
+#define GETVAL(c) (( \
( \
- ibuf[bufxs[x] * 3 + (c)] * (ur) + \
- ibuf[bufxs[x+1] * 3 + (c)] * (u) \
+ ibuf[x0 + (c)] * (ur) + \
+ ibuf[x1 + (c)] * (u) \
) * (vr) + \
( \
- (ibufn[bufxs[x] * 3 + (c)]) * (ur) + \
- (ibufn[bufxs[x+1] * 3 + (c)]) * (u)\
+ (ibufn[x0 + (c)]) * (ur) + \
+ (ibufn[x1 + (c)]) * (u)\
) * (v)) >> 20)
@@ -22,6 +22,26 @@ struct timeval t0;
struct timeval t1;
#endif
+#define XLOOP(F) \
+ for(x = 0; x < ximg->width*4;){ \
+ const unsigned int x0 = a[x++];\
+ const unsigned int x1 = a[x++];\
+ const unsigned int u = a[x++];\
+ const unsigned int ur = a[x++];\
+ *newBuf++ = F(2);\
+ *newBuf++ = F(1);\
+ *newBuf++ = F(0);\
+ newBuf++;\
+ }
+
+#define YITER \
+ const unsigned int bufy = (y << 10) * img->bufheight / ximg->height;\
+ const unsigned int v = (bufy & 1023);\
+ const unsigned int vr = 1023^(bufy & 1023);\
+ ibuf = &img->buf[y * img->bufheight / ximg->height * img->bufwidth * 3];\
+ ibufn = ibuf + dy;
+
+
void scale(struct image *img, XImage *ximg){
int x, y;
const unsigned char * __restrict__ ibuf;
@@ -35,22 +55,21 @@ void scale(struct image *img, XImage *ximg){
gettimeofday(&t0, NULL);
#endif
- unsigned int bufxs[ximg->width * 2];
- unsigned int us[ximg->width * 2];
+ unsigned int a[ximg->width * 4];
{
unsigned int dx = (img->bufwidth << 10) / ximg->width;
unsigned int bufx = img->bufwidth / ximg->width;
- for(x = 0; x < ximg->width; x++){
+ for(x = 0; x < ximg->width * 4;){
if((bufx >> 10) >= img->bufwidth - 1){
- bufxs[x*2] = img->bufwidth - 1;
- bufxs[x*2+1] = img->bufwidth - 1;
- us[x*2] = 0;
- us[x*2+1] =1023 ^ (bufx & 1023);
+ a[x++] = (img->bufwidth - 1) * 3;
+ a[x++] = (img->bufwidth - 1) * 3;
+ a[x++] = 0;
+ a[x++] = 1023 ^ (bufx & 1023);
}else{
- bufxs[x*2] = bufx >> 10;
- bufxs[x*2+1] = bufxs[x * 2] + 1;
- us[x*2] = (bufx & 1023);
- us[x*2+1] = 1023 ^ us[x * 2];
+ a[x++] = (bufx >> 10) * 3;
+ a[x++] = ((bufx >> 10) + 1) * 3;
+ a[x++] = (bufx & 1023);
+ a[x++] = 1023 ^ (bufx & 1023);
}
bufx += dx;
}
@@ -58,36 +77,23 @@ void scale(struct image *img, XImage *ximg){
y = 0;
ibuf = img->buf;
ibufn = img->buf + dy;
- for(; y < ximg->height; y++){
- unsigned int bufy = (y << 10) * img->bufheight / ximg->height;
- unsigned int v = (bufy & 1023);
- unsigned int vr = 1023^(bufy & 1023);
- ibuf = &img->buf[y * img->bufheight / ximg->height * img->bufwidth * 3];
- ibufn = ibuf + dy;
+ for(;;){
+ YITER
+ if(ibufn + dy > bufend){
+ break;
+ }
+ XLOOP(GETVAL)
+ newBuf += jdy;
+ y++;
+ }
+ for(;;){
+ YITER
if(ibufn > bufend){
break;
- }else if(ibufn + dy > bufend){
- for(x = 0; x < ximg->width*2; x += 2){
- unsigned int u = us[x];
- unsigned int ur = us[x+1];
-
- *newBuf++ = GETVAL0(x, 2);
- *newBuf++ = GETVAL0(x, 1);
- *newBuf++ = GETVAL0(x, 0);
- newBuf++;
- }
- }else{
- for(x = 0; x < ximg->width*2; x += 2){
- unsigned int u = us[x];
- unsigned int ur = us[x+1];
-
- *newBuf++ = GETVAL(x, 2);
- *newBuf++ = GETVAL(x, 1);
- *newBuf++ = GETVAL(x, 0);
- newBuf++;
- }
}
+ XLOOP(GETVAL0)
newBuf += jdy;
+ y++;
}
#if TDEBUG