1711
/* Returns a transformation matrix to do rotation as per the provided
1712
EXIF "Orientation" value.
1714
static CGAffineTransform
1715
exif_rotate (int rot, CGSize rect)
1717
CGAffineTransform trans = CGAffineTransformIdentity;
1719
case 2: // flip horizontal
1720
trans = CGAffineTransformMakeTranslation (rect.width, 0);
1721
trans = CGAffineTransformScale (trans, -1, 1);
1724
case 3: // rotate 180
1725
trans = CGAffineTransformMakeTranslation (rect.width, rect.height);
1726
trans = CGAffineTransformRotate (trans, M_PI);
1729
case 4: // flip vertical
1730
trans = CGAffineTransformMakeTranslation (0, rect.height);
1731
trans = CGAffineTransformScale (trans, 1, -1);
1734
case 5: // transpose (UL-to-LR axis)
1735
trans = CGAffineTransformMakeTranslation (rect.height, rect.width);
1736
trans = CGAffineTransformScale (trans, -1, 1);
1737
trans = CGAffineTransformRotate (trans, 3 * M_PI / 2);
1740
case 6: // rotate 90
1741
trans = CGAffineTransformMakeTranslation (0, rect.width);
1742
trans = CGAffineTransformRotate (trans, 3 * M_PI / 2);
1745
case 7: // transverse (UR-to-LL axis)
1746
trans = CGAffineTransformMakeScale (-1, 1);
1747
trans = CGAffineTransformRotate (trans, M_PI / 2);
1750
case 8: // rotate 270
1751
trans = CGAffineTransformMakeTranslation (rect.height, 0);
1752
trans = CGAffineTransformRotate (trans, M_PI / 2);
1708
1764
jwxyz_draw_NSImage (Display *dpy, Drawable d, void *nsimg_arg,
1709
XRectangle *geom_ret)
1765
XRectangle *geom_ret, int exif_rotation)
1711
1767
NSImage *nsimg = (NSImage *) nsimg_arg;
1721
1777
CGImageRef cgi = CGImageSourceCreateImageAtIndex (cgsrc, 0, NULL);
1723
1779
NSSize imgr = [nsimg size];
1780
Bool rot_p = (exif_rotation >= 5);
1783
imgr = NSMakeSize (imgr.height, imgr.width);
1724
1785
CGRect winr = d->frame;
1725
1786
float rw = winr.size.width / imgr.width;
1726
1787
float rh = winr.size.height / imgr.height;
1727
1788
float r = (rw < rh ? rw : rh);
1730
1791
dst.size.width = imgr.width * r;
1731
1792
dst.size.height = imgr.height * r;
1732
1793
dst.origin.x = (winr.size.width - dst.size.width) / 2;
1733
1794
dst.origin.y = (winr.size.height - dst.size.height) / 2;
1796
dst2.origin.x = dst2.origin.y = 0;
1798
dst2.size.width = dst.size.height;
1799
dst2.size.height = dst.size.width;
1801
dst2.size = dst.size;
1735
1804
// Clear the part not covered by the image to background or black.
1737
1806
if (d->type == WINDOW)
1741
1810
draw_rect (dpy, d, 0, 0, 0, winr.size.width, winr.size.height, NO, YES);
1813
CGAffineTransform trans =
1814
exif_rotate (exif_rotation, rot_p ? dst2.size : dst.size);
1816
CGContextSaveGState (d->cgc);
1817
CGContextConcatCTM (d->cgc,
1818
CGAffineTransformMakeTranslation (dst.origin.x,
1820
CGContextConcatCTM (d->cgc, trans);
1744
1821
//Assert (CGImageGetColorSpace (cgi) == dpy->colorspace, "bad colorspace");
1745
CGContextDrawImage (d->cgc, dst, cgi);
1822
CGContextDrawImage (d->cgc, dst2, cgi);
1823
CGContextRestoreGState (d->cgc);
1747
1825
CFRelease (cgsrc);
1748
1826
CGImageRelease (cgi);