If the page being viewed is rotated 180° by selecting "upside down" (B2 menu), "orig size" retains the angle. But if the page is rotated 180° by selecting "rotate 90" twice, "orig size" doesn't retain the angle. Arvindh Notes: Wed Jan 4 07:31:23 EST 2006 rsc Thanks! Reference: /n/sources/patch/applied/page-angle Date: Tue Jan 3 21:18:22 CET 2006 Reviewed-by: rsc --- /sys/src/cmd/page/page.h Tue Jan 3 20:42:12 2006 +++ /sys/src/cmd/page/page.h Tue Jan 3 20:41:59 2006 @@ -42,6 +42,7 @@ void rot180(Image*); Image *rot90(Image*); +Image *rot270(Image*); Image *resample(Image*, Image*); /* ghostscript interface shared by ps, pdf */ --- /sys/src/cmd/page/rotate.c Tue Jan 3 20:43:06 2006 +++ /sys/src/cmd/page/rotate.c Tue Jan 3 20:42:55 2006 @@ -245,6 +245,31 @@ return(tmp); } +/* rotates an image 270 degrees clockwise */ +Image * +rot270(Image *im) +{ + Image *tmp; + int i, j, dx, dy; + + dx = Dx(im->r); + dy = Dy(im->r); + tmp = xallocimage(display, Rect(0, 0, dy, dx), im->chan, 0, DCyan); + if(tmp == nil) { + fprint(2, "out of memory during rot270: %r\n"); + wexits("memory"); + } + + for(i = 0; i < dy; i++) { + for(j = 0; j < dx; j++) { + drawop(tmp, Rect(i, j, i+1, j+1), im, nil, Pt(dx-(j+1), i), S); + } + } + freeimage(im); + + return(tmp); +} + /* from resample.c -- resize from → to using interpolation */ --- /sys/src/cmd/page/view.c Tue Jan 3 20:44:08 2006 +++ /sys/src/cmd/page/view.c Tue Jan 3 20:43:53 2006 @@ -16,7 +16,7 @@ Document *doc; Image *im; int page; -int upside = 0; +int angle = 0; int showbottom = 0; /* on the next showpage, move the image so the bottom is visible. */ Rectangle ulrange; /* the upper left corner of the image must be in this rectangle */ @@ -156,8 +156,17 @@ im = tmp; } - if(upside) + switch(angle){ + case 90: + im = rot90(im); + break; + case 180: rot180(im); + break; + case 270: + im = rot270(im); + break; + } esetcursor(nil); if(showbottom){ @@ -390,7 +399,7 @@ esetcursor(&reading); rot180(im); esetcursor(nil); - upside = !upside; + angle = (angle+180) % 360; redraw(screen); flushimage(display, 1); break; @@ -589,6 +598,7 @@ esetcursor(&reading); im = rot90(im); esetcursor(nil); + angle = (angle+90) % 360; redraw(screen); flushimage(display, 1); break; @@ -598,7 +608,7 @@ esetcursor(&reading); rot180(im); esetcursor(nil); - upside = !upside; + angle = (angle+180) % 360; redraw(screen); flushimage(display, 1); break;