Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 77ee42ba authored by Jaesung Chung's avatar Jaesung Chung Committed by android-build-merger
Browse files

Merge "ExifInterface: fix writing STRING and SRATIONAL formats" into nyc-dev am: f2a1076c

am: 8dec91bf

* commit '8dec91bf':
  ExifInterface: fix writing STRING and SRATIONAL formats
parents de5df131 8dec91bf
Loading
Loading
Loading
Loading
+31 −11
Original line number Diff line number Diff line
@@ -2025,6 +2025,12 @@ public class ExifInterface {
        int bytesWritten = 0;
        int dataFormat = getDataFormatOfExifEntryValue(entryValue);

        if (dataFormat == IFD_FORMAT_STRING) {
            byte[] asciiArray = (entryValue + '\0').getBytes(Charset.forName("US-ASCII"));
            dataOutputStream.write(asciiArray);
            return asciiArray.length;
        }

        // Values can be composed of several components. Each component is separated by char ','.
        String[] components = entryValue.split(",");
        for (String component : components) {
@@ -2037,11 +2043,6 @@ public class ExifInterface {
                    dataOutputStream.writeDouble(Double.parseDouble(component));
                    bytesWritten += 8;
                    break;
                case IFD_FORMAT_STRING:
                    byte[] asciiArray = (component + '\0').getBytes(Charset.forName("US-ASCII"));
                    dataOutputStream.write(asciiArray);
                    bytesWritten += asciiArray.length;
                    break;
                case IFD_FORMAT_SRATIONAL:
                    String[] rationalNumber = component.split("/");
                    dataOutputStream.writeInt(Integer.parseInt(rationalNumber[0]));
@@ -2060,11 +2061,31 @@ public class ExifInterface {
        // See TIFF 6.0 spec Types. page 15.
        // Take the first component if there are more than one component.
        if (entryValue.contains(",")) {
            entryValue = entryValue.split(",")[0];
            String[] entryValues = entryValue.split(",");
            int dataFormat = getDataFormatOfExifEntryValue(entryValues[0]);
            if (dataFormat == IFD_FORMAT_STRING) {
                return IFD_FORMAT_STRING;
            }
            for (int i = 1; i < entryValues.length; ++i) {
                if (getDataFormatOfExifEntryValue(entryValues[i]) != dataFormat) {
                    return IFD_FORMAT_STRING;
                }
            }
            return dataFormat;
        }

        if (entryValue.contains("/")) {
            String[] rationalNumber = entryValue.split("/");
            if (rationalNumber.length == 2) {
                try {
                    Integer.parseInt(rationalNumber[0]);
                    Integer.parseInt(rationalNumber[1]);
                    return IFD_FORMAT_SRATIONAL;
                } catch (NumberFormatException e)  {
                    // Ignored
                }
            }
            return IFD_FORMAT_STRING;
        }
        try {
            Integer.parseInt(entryValue);
@@ -2084,6 +2105,9 @@ public class ExifInterface {
    // Determines the size of EXIF entry value.
    private static int getSizeOfExifEntryValue(int dataFormat, String entryValue) {
        // See TIFF 6.0 spec Types page 15.
        if (dataFormat == IFD_FORMAT_STRING) {
            return (entryValue + '\0').getBytes(Charset.forName("US-ASCII")).length;
        }
        int bytesEstimated = 0;
        String[] components = entryValue.split(",");
        for (String component : components) {
@@ -2094,10 +2118,6 @@ public class ExifInterface {
                case IFD_FORMAT_DOUBLE:
                    bytesEstimated += 8;
                    break;
                case IFD_FORMAT_STRING:
                    bytesEstimated
                            += (component + '\0').getBytes(Charset.forName("US-ASCII")).length;
                    break;
                case IFD_FORMAT_SRATIONAL:
                    bytesEstimated += 8;
                    break;