Hello community,

here is the log from the commit of package feh for openSUSE:Factory checked in 
at 2015-12-03 13:31:09
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/feh (Old)
 and      /work/SRC/openSUSE:Factory/.feh.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "feh"

Changes:
--------
--- /work/SRC/openSUSE:Factory/feh/feh.changes  2015-10-25 14:18:16.000000000 
+0100
+++ /work/SRC/openSUSE:Factory/.feh.new/feh.changes     2015-12-03 
13:31:11.000000000 +0100
@@ -1,0 +2,6 @@
+Sun Nov 29 19:49:14 UTC 2015 - mimi...@gmail.com
+
+- fix bsc#955576
+- add jpegexiforient to package
+
+-------------------------------------------------------------------

New:
----
  jpegexiforient.c

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ feh.spec ++++++
--- /var/tmp/diff_new_pack.GCQaIC/_old  2015-12-03 13:31:12.000000000 +0100
+++ /var/tmp/diff_new_pack.GCQaIC/_new  2015-12-03 13:31:12.000000000 +0100
@@ -28,6 +28,7 @@
 Source2:        %{name}.png
 Source3:        %{name}-%{version}.tar.bz2.asc
 Source4:        %{name}.keyring
+Source5:        jpegexiforient.c 
 # PATCH-FIX-OPENSUSE feh-makefile_optflags.patch 
https://github.com/derf/feh/issues/71 pascal.ble...@opensuse.org -- pass 
OPTFLAGS to make instead of hard-coded -O2 -g
 Patch1:         feh-makefile_optflags.patch
 # PATCH-FIX-UPSTREAM feh-fix_pointer_arithmetics.patch 
https://github.com/derf/feh/issues/69 pascal.ble...@opensuse.org -- fix 
compiler warnings on casting pointers as ints
@@ -61,6 +62,7 @@
 %patch2 -p1
 %patch4 -p1
 %patch5 -p1
+cp %{SOURCE5} .
 
 %build
 make %{?_smp_mflags} \
@@ -71,6 +73,8 @@
     PREFIX="%{_prefix}" \
     OPTFLAGS="%{optflags} -Wall -Wextra"
 
+%{__cc} %{optflags} jpegexiforient.c -o jpegexiforient
+
 %install
 make \
     PREFIX="%{buildroot}%{_prefix}" \
@@ -78,8 +82,9 @@
 
 rm -rf "%{buildroot}%{_datadir}/doc"
 
-install -D -m0644 "%{SOURCE1}" 
"%{buildroot}%{_datadir}/applications/feh.desktop"
-install -D -m0644 "%{SOURCE2}" "%{buildroot}%{_datadir}/pixmaps/feh.png"
+%{__install} -D -m0644 "%{SOURCE1}" 
"%{buildroot}%{_datadir}/applications/feh.desktop"
+%{__install} -D -m0644 "%{SOURCE2}" "%{buildroot}%{_datadir}/pixmaps/feh.png"
+%{__install} -D -m0755 jpegexiforient %{buildroot}%{_bindir}/jpegexiforient 
 
 %if 0%{?suse_version}
 %suse_update_desktop_file -r feh Graphics Viewer
@@ -91,6 +96,7 @@
 %{_bindir}/feh
 %{_bindir}/feh-cam
 %{_bindir}/gen-cam-menu
+%{_bindir}/jpegexiforient
 %dir %{_datadir}/%{name}
 %{_datadir}/%{name}/*
 %{_datadir}/applications/%{name}.desktop



++++++ jpegexiforient.c ++++++
/*
 * jpegexiforient.c
 *
 * This is a utility program to get and set the Exif Orientation Tag.
 * It can be used together with jpegtran in scripts for automatic
 * orientation correction of digital camera pictures.
 *
 * The Exif orientation value gives the orientation of the camera
 * relative to the scene when the image was captured.  The relation
 * of the '0th row' and '0th column' to visual position is shown as
 * below.
 *
 * Value | 0th Row     | 0th Column
 * ------+-------------+-----------
 *   1   | top         | left side
 *   2   | top         | right side
 *   3   | bottom      | right side
 *   4   | bottom      | left side
 *   5   | left side   | top
 *   6   | right side  | top
 *   7   | right side  | bottom
 *   8   | left side   | bottom
 *
 * For convenience, here is what the letter F would look like if it were
 * tagged correctly and displayed by a program that ignores the orientation
 * tag:
 *
 *   1        2       3      4         5            6           7          8
 *
 * 888888  888888      88  88      8888888888  88                  88  
8888888888
 * 88          88      88  88      88  88      88  88          88  88      88  
88
 * 8888      8888    8888  8888    88          8888888888  8888888888          
88
 * 88          88      88  88
 * 88          88  888888  888888
 *
 */

#include <stdio.h>
#include <stdlib.h>

static FILE * myfile;           /* My JPEG file */

static unsigned char exif_data[65536L];

/* Return next input byte, or EOF if no more */
#define NEXTBYTE()  getc(myfile)

/* Error exit handler */
#define ERREXIT(msg)  (exit(0))

/* Read one byte, testing for EOF */
static int
read_1_byte (void)
{
  int c;

  c = NEXTBYTE();
  if (c == EOF)
    ERREXIT("Premature EOF in JPEG file");
  return c;
}

/* Read 2 bytes, convert to unsigned int */
/* All 2-byte quantities in JPEG markers are MSB first */
static unsigned int
read_2_bytes (void)
{
  int c1, c2;

  c1 = NEXTBYTE();
  if (c1 == EOF)
    ERREXIT("Premature EOF in JPEG file");
  c2 = NEXTBYTE();
  if (c2 == EOF)
    ERREXIT("Premature EOF in JPEG file");
  return (((unsigned int) c1) << 8) + ((unsigned int) c2);
}

static const char * progname;   /* program name for error messages */

static void
usage (FILE *out)
/* complain about bad command line */
{
  fprintf(out, "jpegexiforient reads or writes the Exif Orientation Tag ");
  fprintf(out, "in a JPEG Exif file.\n");

  fprintf(out, "Usage: %s [switches] jpegfile\n", progname);

  fprintf(out, "Switches:\n");
  fprintf(out, "  --help     display this help and exit\n");
  fprintf(out, "  --version  output version information and exit\n");
  fprintf(out, "  -n         Do not output the trailing newline\n");
  fprintf(out, "  -1 .. -8   Set orientation value 1 .. 8\n");
}

/*
 * The main program.
 */

int
main (int argc, char **argv)
{
  int n_flag, set_flag;
  unsigned int length, i;
  int is_motorola; /* Flag for byte order */
  unsigned int offset, number_of_tags, tagnum;

  progname = argv[0];
  if (progname == NULL || progname[0] == 0)
    progname = "jpegexiforient";        /* in case C library doesn't provide it 
*/

  if (argc < 2) { usage(stderr); return 1; }

  n_flag = 0; set_flag = 0;

  i = 1;
  while (argv[i][0] == '-') {
    switch (argv[i][1]) {
    case '-': 
      switch (argv[i][2]) {
      case 'h': usage(stdout); return 0;
      case 'v': fprintf(stdout,"jpegexiforient\n"); return 0;
      default:  usage(stderr); return 1;
      }
    case 'n':
      n_flag = 1;
      break;
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
      set_flag = argv[i][1] - '0';
      break;
    default:
      usage(stderr); return 1;
    }
    if (++i >= argc) { usage(stderr); return 1; }
  }

  if (set_flag) {
    if ((myfile = fopen(argv[i], "rb+")) == NULL) {
      fprintf(stderr, "%s: can't open %s\n", progname, argv[i]);
      return 0;
    }
  } else {
    if ((myfile = fopen(argv[i], "rb")) == NULL) {
      fprintf(stderr, "%s: can't open %s\n", progname, argv[i]);
      return 0;
    }
  }

  /* Read File head, check for JPEG SOI + Exif APP1 */
  for (i = 0; i < 4; i++)
    exif_data[i] = (unsigned char) read_1_byte();
  if (exif_data[0] != 0xFF ||
      exif_data[1] != 0xD8 ||
      exif_data[2] != 0xFF ||
      exif_data[3] != 0xE1)
    return 0;

  /* Get the marker parameter length count */
  length = read_2_bytes();
  /* Length includes itself, so must be at least 2 */
  /* Following Exif data length must be at least 6 */
  if (length < 8)
    return 0;
  length -= 8;
  /* Read Exif head, check for "Exif" */
  for (i = 0; i < 6; i++)
    exif_data[i] = (unsigned char) read_1_byte();
  if (exif_data[0] != 0x45 ||
      exif_data[1] != 0x78 ||
      exif_data[2] != 0x69 ||
      exif_data[3] != 0x66 ||
      exif_data[4] != 0 ||
      exif_data[5] != 0)
    return 0;
  /* Read Exif body */
  for (i = 0; i < length; i++)
    exif_data[i] = (unsigned char) read_1_byte();

  if (length < 12) return 0; /* Length of an IFD entry */

  /* Discover byte order */
  if (exif_data[0] == 0x49 && exif_data[1] == 0x49)
    is_motorola = 0;
  else if (exif_data[0] == 0x4D && exif_data[1] == 0x4D)
    is_motorola = 1;
  else
    return 0;

  /* Check Tag Mark */
  if (is_motorola) {
    if (exif_data[2] != 0) return 0;
    if (exif_data[3] != 0x2A) return 0;
  } else {
    if (exif_data[3] != 0) return 0;
    if (exif_data[2] != 0x2A) return 0;
  }

  /* Get first IFD offset (offset to IFD0) */
  if (is_motorola) {
    if (exif_data[4] != 0) return 0;
    if (exif_data[5] != 0) return 0;
    offset = exif_data[6];
    offset <<= 8;
    offset += exif_data[7];
  } else {
    if (exif_data[7] != 0) return 0;
    if (exif_data[6] != 0) return 0;
    offset = exif_data[5];
    offset <<= 8;
    offset += exif_data[4];
  }
  if (offset > length - 2) return 0; /* check end of data segment */

  /* Get the number of directory entries contained in this IFD */
  if (is_motorola) {
    number_of_tags = exif_data[offset];
    number_of_tags <<= 8;
    number_of_tags += exif_data[offset+1];
  } else {
    number_of_tags = exif_data[offset+1];
    number_of_tags <<= 8;
    number_of_tags += exif_data[offset];
  }
  if (number_of_tags == 0) return 0;
  offset += 2;

  /* Search for Orientation Tag in IFD0 */
  for (;;) {
    if (offset > length - 12) return 0; /* check end of data segment */
    /* Get Tag number */
    if (is_motorola) {
      tagnum = exif_data[offset];
      tagnum <<= 8;
      tagnum += exif_data[offset+1];
    } else {
      tagnum = exif_data[offset+1];
      tagnum <<= 8;
      tagnum += exif_data[offset];
    }
    if (tagnum == 0x0112) break; /* found Orientation Tag */
    if (--number_of_tags == 0) return 0;
    offset += 12;
  }

  if (set_flag) {
    /* Set the Orientation value */
    if (is_motorola) {
      exif_data[offset+2] = 0; /* Format = unsigned short (2 octets) */
      exif_data[offset+3] = 3;
      exif_data[offset+4] = 0; /* Number Of Components = 1 */
      exif_data[offset+5] = 0;
      exif_data[offset+6] = 0;
      exif_data[offset+7] = 1;
      exif_data[offset+8] = 0;
      exif_data[offset+9] = (unsigned char)set_flag;
      exif_data[offset+10] = 0;
      exif_data[offset+11] = 0;
    } else {
      exif_data[offset+2] = 3; /* Format = unsigned short (2 octets) */
      exif_data[offset+3] = 0;
      exif_data[offset+4] = 1; /* Number Of Components = 1 */
      exif_data[offset+5] = 0;
      exif_data[offset+6] = 0;
      exif_data[offset+7] = 0;
      exif_data[offset+8] = (unsigned char)set_flag;
      exif_data[offset+9] = 0;
      exif_data[offset+10] = 0;
      exif_data[offset+11] = 0;
    }
    fseek(myfile, (4 + 2 + 6 + 2) + offset, SEEK_SET);
    fwrite(exif_data + 2 + offset, 1, 10, myfile);
  } else {
    /* Get the Orientation value */
    if (is_motorola) {
      if (exif_data[offset+8] != 0) return 0;
      set_flag = exif_data[offset+9];
    } else {
      if (exif_data[offset+9] != 0) return 0;
      set_flag = exif_data[offset+8];
    }
    if (set_flag > 8) return 0;
  }

  /* Write out Orientation value */
  if (n_flag)
    printf("%c", '0' + set_flag);
  else
    printf("%c\n", '0' + set_flag);

  /* All done. */
  return 0;
}

Reply via email to