Index: trunk/src/com/drew/imaging/jpeg/JpegMetadataReader.java
===================================================================
--- trunk/src/com/drew/imaging/jpeg/JpegMetadataReader.java	(revision 15218)
+++ 	(revision )
@@ -1,143 +1,0 @@
-/*
- * Copyright 2002-2019 Drew Noakes and contributors
- *
- *    Licensed under the Apache License, Version 2.0 (the "License");
- *    you may not use this file except in compliance with the License.
- *    You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- *
- * More information about this project is available at:
- *
- *    https://drewnoakes.com/code/exif/
- *    https://github.com/drewnoakes/metadata-extractor
- */
-package com.drew.imaging.jpeg;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-import com.drew.lang.StreamReader;
-import com.drew.lang.annotations.NotNull;
-import com.drew.lang.annotations.Nullable;
-import com.drew.metadata.Metadata;
-//import com.drew.metadata.adobe.AdobeJpegReader;
-import com.drew.metadata.exif.ExifReader;
-import com.drew.metadata.file.FileSystemMetadataReader;
-import com.drew.metadata.icc.IccReader;
-import com.drew.metadata.iptc.IptcReader;
-//import com.drew.metadata.jfif.JfifReader;
-//import com.drew.metadata.jfxx.JfxxReader;
-import com.drew.metadata.jpeg.JpegCommentReader;
-import com.drew.metadata.jpeg.JpegDhtReader;
-import com.drew.metadata.jpeg.JpegDnlReader;
-import com.drew.metadata.jpeg.JpegReader;
-import com.drew.metadata.photoshop.DuckyReader;
-import com.drew.metadata.photoshop.PhotoshopReader;
-//import com.drew.metadata.xmp.XmpReader;
-
-/**
- * Obtains all available metadata from JPEG formatted files.
- *
- * @author Drew Noakes https://drewnoakes.com
- */
-public class JpegMetadataReader
-{
-    public static final Iterable<JpegSegmentMetadataReader> ALL_READERS = Arrays.asList(
-            new JpegReader(),
-            new JpegCommentReader(),
-            //new JfifReader(),
-            //new JfxxReader(),
-            new ExifReader(),
-            //new XmpReader(),
-            new IccReader(),
-            new PhotoshopReader(),
-            new DuckyReader(),
-            new IptcReader(),
-            //new AdobeJpegReader(),
-            new JpegDhtReader(),
-            new JpegDnlReader()
-    );
-
-    @NotNull
-    public static Metadata readMetadata(@NotNull InputStream inputStream, @Nullable Iterable<JpegSegmentMetadataReader> readers) throws JpegProcessingException, IOException
-    {
-        Metadata metadata = new Metadata();
-        process(metadata, inputStream, readers);
-        return metadata;
-    }
-
-    @NotNull
-    public static Metadata readMetadata(@NotNull InputStream inputStream) throws JpegProcessingException, IOException
-    {
-        return readMetadata(inputStream, null);
-    }
-
-    @NotNull
-    public static Metadata readMetadata(@NotNull File file, @Nullable Iterable<JpegSegmentMetadataReader> readers) throws JpegProcessingException, IOException
-    {
-        InputStream inputStream = new FileInputStream(file);
-        Metadata metadata;
-        try {
-            metadata = readMetadata(inputStream, readers);
-        } finally {
-            inputStream.close();
-        }
-        new FileSystemMetadataReader().read(file, metadata);
-        return metadata;
-    }
-
-    @NotNull
-    public static Metadata readMetadata(@NotNull File file) throws JpegProcessingException, IOException
-    {
-        return readMetadata(file, null);
-    }
-
-    public static void process(@NotNull Metadata metadata, @NotNull InputStream inputStream) throws JpegProcessingException, IOException
-    {
-        process(metadata, inputStream, null);
-    }
-
-    public static void process(@NotNull Metadata metadata, @NotNull InputStream inputStream, @Nullable Iterable<JpegSegmentMetadataReader> readers) throws JpegProcessingException, IOException
-    {
-        if (readers == null)
-            readers = ALL_READERS;
-
-        Set<JpegSegmentType> segmentTypes = new HashSet<JpegSegmentType>();
-        for (JpegSegmentMetadataReader reader : readers) {
-            for (JpegSegmentType type : reader.getSegmentTypes()) {
-                segmentTypes.add(type);
-            }
-        }
-
-        JpegSegmentData segmentData = JpegSegmentReader.readSegments(new StreamReader(inputStream), segmentTypes);
-
-        processJpegSegmentData(metadata, readers, segmentData);
-    }
-
-    public static void processJpegSegmentData(Metadata metadata, Iterable<JpegSegmentMetadataReader> readers, JpegSegmentData segmentData)
-    {
-        // Pass the appropriate byte arrays to each reader.
-        for (JpegSegmentMetadataReader reader : readers) {
-            for (JpegSegmentType segmentType : reader.getSegmentTypes()) {
-                reader.readJpegSegments(segmentData.getSegments(segmentType), metadata, segmentType);
-            }
-        }
-    }
-
-    private JpegMetadataReader() throws Exception
-    {
-        throw new Exception("Not intended for instantiation");
-    }
-}
Index: trunk/src/com/drew/imaging/jpeg/JpegProcessingException.java
===================================================================
--- trunk/src/com/drew/imaging/jpeg/JpegProcessingException.java	(revision 15218)
+++ 	(revision )
@@ -1,49 +1,0 @@
-/*
- * Copyright 2002-2019 Drew Noakes and contributors
- *
- *    Licensed under the Apache License, Version 2.0 (the "License");
- *    you may not use this file except in compliance with the License.
- *    You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- *
- * More information about this project is available at:
- *
- *    https://drewnoakes.com/code/exif/
- *    https://github.com/drewnoakes/metadata-extractor
- */
-package com.drew.imaging.jpeg;
-
-import com.drew.imaging.ImageProcessingException;
-import com.drew.lang.annotations.Nullable;
-
-/**
- * An exception class thrown upon unexpected and fatal conditions while processing a JPEG file.
- *
- * @author Drew Noakes https://drewnoakes.com
- */
-public class JpegProcessingException extends ImageProcessingException
-{
-    private static final long serialVersionUID = -7870179776125450158L;
-
-    public JpegProcessingException(@Nullable String message)
-    {
-        super(message);
-    }
-
-    public JpegProcessingException(@Nullable String message, @Nullable Throwable cause)
-    {
-        super(message, cause);
-    }
-
-    public JpegProcessingException(@Nullable Throwable cause)
-    {
-        super(cause);
-    }
-}
Index: trunk/src/com/drew/imaging/jpeg/JpegSegmentData.java
===================================================================
--- trunk/src/com/drew/imaging/jpeg/JpegSegmentData.java	(revision 15218)
+++ 	(revision )
@@ -1,270 +1,0 @@
-/*
- * Copyright 2002-2019 Drew Noakes and contributors
- *
- *    Licensed under the Apache License, Version 2.0 (the "License");
- *    you may not use this file except in compliance with the License.
- *    You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- *
- * More information about this project is available at:
- *
- *    https://drewnoakes.com/code/exif/
- *    https://github.com/drewnoakes/metadata-extractor
- */
-package com.drew.imaging.jpeg;
-
-import com.drew.lang.annotations.NotNull;
-import com.drew.lang.annotations.Nullable;
-
-import java.util.*;
-
-/**
- * Holds a collection of JPEG data segments.  This need not necessarily be all segments
- * within the JPEG. For example, it may be convenient to store only the non-image
- * segments when analysing metadata.
- * <p>
- * Segments are keyed via their {@link JpegSegmentType}. Where multiple segments use the
- * same segment type, they will all be stored and available.
- * <p>
- * Each segment type may contain multiple entries. Conceptually the model is:
- * <code>Map&lt;JpegSegmentType, Collection&lt;byte[]&gt;&gt;</code>. This class provides
- * convenience methods around that structure.
- *
- * @author Drew Noakes https://drewnoakes.com
- */
-public class JpegSegmentData
-{
-    // TODO key this on JpegSegmentType rather than Byte, and hopefully lose much of the use of 'byte' with this class
-    @NotNull
-    private final HashMap<Byte, List<byte[]>> _segmentDataMap = new HashMap<Byte, List<byte[]>>(10);
-
-    /**
-     * Adds segment bytes to the collection.
-     *
-     * @param segmentType  the type of the segment being added
-     * @param segmentBytes the byte array holding data for the segment being added
-     */
-    @SuppressWarnings({"MismatchedQueryAndUpdateOfCollection"})
-    public void addSegment(byte segmentType, @NotNull byte[] segmentBytes)
-    {
-        getOrCreateSegmentList(segmentType).add(segmentBytes);
-    }
-
-    /**
-     * Gets the set of JPEG segment type identifiers.
-     */
-    public Iterable<JpegSegmentType> getSegmentTypes()
-    {
-        Set<JpegSegmentType> segmentTypes = new HashSet<JpegSegmentType>();
-
-        for (Byte segmentTypeByte : _segmentDataMap.keySet())
-        {
-            JpegSegmentType segmentType = JpegSegmentType.fromByte(segmentTypeByte);
-            if (segmentType == null) {
-                throw new IllegalStateException("Should not have a segmentTypeByte that is not in the enum: " + Integer.toHexString(segmentTypeByte));
-            }
-            segmentTypes.add(segmentType);
-        }
-
-        return segmentTypes;
-    }
-
-    /**
-     * Gets the first JPEG segment data for the specified type.
-     *
-     * @param segmentType the JpegSegmentType for the desired segment
-     * @return a byte[] containing segment data or null if no data exists for that segment
-     */
-    @Nullable
-    public byte[] getSegment(byte segmentType)
-    {
-        return getSegment(segmentType, 0);
-    }
-
-    /**
-     * Gets the first JPEG segment data for the specified type.
-     *
-     * @param segmentType the JpegSegmentType for the desired segment
-     * @return a byte[] containing segment data or null if no data exists for that segment
-     */
-    @Nullable
-    public byte[] getSegment(@NotNull JpegSegmentType segmentType)
-    {
-        return getSegment(segmentType.byteValue, 0);
-    }
-
-    /**
-     * Gets segment data for a specific occurrence and type.  Use this method when more than one occurrence
-     * of segment data for a given type exists.
-     *
-     * @param segmentType identifies the required segment
-     * @param occurrence  the zero-based index of the occurrence
-     * @return the segment data as a byte[], or null if no segment exists for the type &amp; occurrence
-     */
-    @Nullable
-    public byte[] getSegment(@NotNull JpegSegmentType segmentType, int occurrence)
-    {
-        return getSegment(segmentType.byteValue, occurrence);
-    }
-
-    /**
-     * Gets segment data for a specific occurrence and type.  Use this method when more than one occurrence
-     * of segment data for a given type exists.
-     *
-     * @param segmentType identifies the required segment
-     * @param occurrence  the zero-based index of the occurrence
-     * @return the segment data as a byte[], or null if no segment exists for the type &amp; occurrence
-     */
-    @Nullable
-    public byte[] getSegment(byte segmentType, int occurrence)
-    {
-        final List<byte[]> segmentList = getSegmentList(segmentType);
-
-        return segmentList != null && segmentList.size() > occurrence
-                ? segmentList.get(occurrence)
-                : null;
-    }
-
-    /**
-     * Returns all instances of a given JPEG segment.  If no instances exist, an empty sequence is returned.
-     *
-     * @param segmentType a number which identifies the type of JPEG segment being queried
-     * @return zero or more byte arrays, each holding the data of a JPEG segment
-     */
-    @NotNull
-    public Iterable<byte[]> getSegments(@NotNull JpegSegmentType segmentType)
-    {
-        return getSegments(segmentType.byteValue);
-    }
-
-    /**
-     * Returns all instances of a given JPEG segment.  If no instances exist, an empty sequence is returned.
-     *
-     * @param segmentType a number which identifies the type of JPEG segment being queried
-     * @return zero or more byte arrays, each holding the data of a JPEG segment
-     */
-    @NotNull
-    public Iterable<byte[]> getSegments(byte segmentType)
-    {
-        final List<byte[]> segmentList = getSegmentList(segmentType);
-        return segmentList == null ? new ArrayList<byte[]>() : segmentList;
-    }
-
-    @Nullable
-    private List<byte[]> getSegmentList(byte segmentType)
-    {
-        return _segmentDataMap.get(segmentType);
-    }
-
-    @NotNull
-    private List<byte[]> getOrCreateSegmentList(byte segmentType)
-    {
-        List<byte[]> segmentList;
-        if (_segmentDataMap.containsKey(segmentType)) {
-            segmentList = _segmentDataMap.get(segmentType);
-        } else {
-            segmentList = new ArrayList<byte[]>();
-            _segmentDataMap.put(segmentType, segmentList);
-        }
-        return segmentList;
-    }
-
-    /**
-     * Returns the count of segment data byte arrays stored for a given segment type.
-     *
-     * @param segmentType identifies the required segment
-     * @return the segment count (zero if no segments exist).
-     */
-    public int getSegmentCount(@NotNull JpegSegmentType segmentType)
-    {
-        return getSegmentCount(segmentType.byteValue);
-    }
-
-    /**
-     * Returns the count of segment data byte arrays stored for a given segment type.
-     *
-     * @param segmentType identifies the required segment
-     * @return the segment count (zero if no segments exist).
-     */
-    public int getSegmentCount(byte segmentType)
-    {
-        final List<byte[]> segmentList = getSegmentList(segmentType);
-        return segmentList == null ? 0 : segmentList.size();
-    }
-
-    /**
-     * Removes a specified instance of a segment's data from the collection.  Use this method when more than one
-     * occurrence of segment data exists for a given type exists.
-     *
-     * @param segmentType identifies the required segment
-     * @param occurrence  the zero-based index of the segment occurrence to remove.
-     */
-    @SuppressWarnings({"MismatchedQueryAndUpdateOfCollection"})
-    public void removeSegmentOccurrence(@NotNull JpegSegmentType segmentType, int occurrence)
-    {
-        removeSegmentOccurrence(segmentType.byteValue, occurrence);
-    }
-
-    /**
-     * Removes a specified instance of a segment's data from the collection.  Use this method when more than one
-     * occurrence of segment data exists for a given type exists.
-     *
-     * @param segmentType identifies the required segment
-     * @param occurrence  the zero-based index of the segment occurrence to remove.
-     */
-    @SuppressWarnings({"MismatchedQueryAndUpdateOfCollection"})
-    public void removeSegmentOccurrence(byte segmentType, int occurrence)
-    {
-        final List<byte[]> segmentList = _segmentDataMap.get(segmentType);
-        segmentList.remove(occurrence);
-    }
-
-    /**
-     * Removes all segments from the collection having the specified type.
-     *
-     * @param segmentType identifies the required segment
-     */
-    public void removeSegment(@NotNull JpegSegmentType segmentType)
-    {
-        removeSegment(segmentType.byteValue);
-    }
-
-    /**
-     * Removes all segments from the collection having the specified type.
-     *
-     * @param segmentType identifies the required segment
-     */
-    public void removeSegment(byte segmentType)
-    {
-        _segmentDataMap.remove(segmentType);
-    }
-
-    /**
-     * Determines whether data is present for a given segment type.
-     *
-     * @param segmentType identifies the required segment
-     * @return true if data exists, otherwise false
-     */
-    public boolean containsSegment(@NotNull JpegSegmentType segmentType)
-    {
-        return containsSegment(segmentType.byteValue);
-    }
-
-    /**
-     * Determines whether data is present for a given segment type.
-     *
-     * @param segmentType identifies the required segment
-     * @return true if data exists, otherwise false
-     */
-    public boolean containsSegment(byte segmentType)
-    {
-        return _segmentDataMap.containsKey(segmentType);
-    }
-}
Index: trunk/src/com/drew/imaging/jpeg/JpegSegmentMetadataReader.java
===================================================================
--- trunk/src/com/drew/imaging/jpeg/JpegSegmentMetadataReader.java	(revision 15218)
+++ 	(revision )
@@ -1,26 +1,0 @@
-package com.drew.imaging.jpeg;
-
-import com.drew.lang.annotations.NotNull;
-import com.drew.metadata.Metadata;
-
-/**
- * Defines an object that extracts metadata from in JPEG segments.
- */
-public interface JpegSegmentMetadataReader
-{
-    /**
-     * Gets the set of JPEG segment types that this reader is interested in.
-     */
-    @NotNull
-    Iterable<JpegSegmentType> getSegmentTypes();
-
-    /**
-     * Extracts metadata from all instances of a particular JPEG segment type.
-     *
-     * @param segments A sequence of byte arrays from which the metadata should be extracted. These are in the order
-     *                 encountered in the original file.
-     * @param metadata The {@link Metadata} object into which extracted values should be merged.
-     * @param segmentType The {@link JpegSegmentType} being read.
-     */
-    void readJpegSegments(@NotNull final Iterable<byte[]> segments, @NotNull final Metadata metadata, @NotNull final JpegSegmentType segmentType);
-}
Index: trunk/src/com/drew/imaging/jpeg/JpegSegmentReader.java
===================================================================
--- trunk/src/com/drew/imaging/jpeg/JpegSegmentReader.java	(revision 15218)
+++ 	(revision )
@@ -1,169 +1,0 @@
-/*
- * Copyright 2002-2019 Drew Noakes and contributors
- *
- *    Licensed under the Apache License, Version 2.0 (the "License");
- *    you may not use this file except in compliance with the License.
- *    You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- *
- * More information about this project is available at:
- *
- *    https://drewnoakes.com/code/exif/
- *    https://github.com/drewnoakes/metadata-extractor
- */
-package com.drew.imaging.jpeg;
-
-import com.drew.lang.SequentialReader;
-import com.drew.lang.StreamReader;
-import com.drew.lang.annotations.NotNull;
-import com.drew.lang.annotations.Nullable;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Performs read functions of JPEG files, returning specific file segments.
- * <p>
- * JPEG files are composed of a sequence of consecutive JPEG 'segments'. Each is identified by one of a set of byte
- * values, modelled in the {@link JpegSegmentType} enumeration. Use <code>readSegments</code> to read out the some
- * or all segments into a {@link JpegSegmentData} object, from which the raw JPEG segment byte arrays may be accessed.
- *
- * @author Drew Noakes https://drewnoakes.com
- */
-public class JpegSegmentReader
-{
-    /**
-     * The 0xFF byte that signals the start of a segment.
-     */
-    private static final byte SEGMENT_IDENTIFIER = (byte) 0xFF;
-
-    /**
-     * Private, because this segment crashes my algorithm, and searching for it doesn't work (yet).
-     */
-    private static final byte SEGMENT_SOS = (byte) 0xDA;
-
-    /**
-     * Private, because one wouldn't search for it.
-     */
-    private static final byte MARKER_EOI = (byte) 0xD9;
-
-    /**
-     * Processes the provided JPEG data, and extracts the specified JPEG segments into a {@link JpegSegmentData} object.
-     * <p>
-     * Will not return SOS (start of scan) or EOI (end of image) segments.
-     *
-     * @param file a {@link File} from which the JPEG data will be read.
-     * @param segmentTypes the set of JPEG segments types that are to be returned. If this argument is <code>null</code>
-     *                     then all found segment types are returned.
-     */
-    @NotNull
-    public static JpegSegmentData readSegments(@NotNull File file, @Nullable Iterable<JpegSegmentType> segmentTypes) throws JpegProcessingException, IOException
-    {
-        FileInputStream stream = null;
-        try {
-            stream = new FileInputStream(file);
-            return readSegments(new StreamReader(stream), segmentTypes);
-        } finally {
-            if (stream != null) {
-                stream.close();
-            }
-        }
-    }
-
-    /**
-     * Processes the provided JPEG data, and extracts the specified JPEG segments into a {@link JpegSegmentData} object.
-     * <p>
-     * Will not return SOS (start of scan) or EOI (end of image) segments.
-     *
-     * @param reader a {@link SequentialReader} from which the JPEG data will be read. It must be positioned at the
-     *               beginning of the JPEG data stream.
-     * @param segmentTypes the set of JPEG segments types that are to be returned. If this argument is <code>null</code>
-     *                     then all found segment types are returned.
-     */
-    @NotNull
-    public static JpegSegmentData readSegments(@NotNull final SequentialReader reader, @Nullable Iterable<JpegSegmentType> segmentTypes) throws JpegProcessingException, IOException
-    {
-        // Must be big-endian
-        assert (reader.isMotorolaByteOrder());
-
-        // first two bytes should be JPEG magic number
-        final int magicNumber = reader.getUInt16();
-        if (magicNumber != 0xFFD8) {
-            throw new JpegProcessingException("JPEG data is expected to begin with 0xFFD8 (ÿØ) not 0x" + Integer.toHexString(magicNumber));
-        }
-
-        Set<Byte> segmentTypeBytes = null;
-        if (segmentTypes != null) {
-            segmentTypeBytes = new HashSet<Byte>();
-            for (JpegSegmentType segmentType : segmentTypes) {
-                segmentTypeBytes.add(segmentType.byteValue);
-            }
-        }
-
-        JpegSegmentData segmentData = new JpegSegmentData();
-
-        do {
-            // Find the segment marker. Markers are zero or more 0xFF bytes, followed
-            // by a 0xFF and then a byte not equal to 0x00 or 0xFF.
-
-            byte segmentIdentifier = reader.getInt8();
-            byte segmentType = reader.getInt8();
-
-            // Read until we have a 0xFF byte followed by a byte that is not 0xFF or 0x00
-            while (segmentIdentifier != SEGMENT_IDENTIFIER || segmentType == SEGMENT_IDENTIFIER || segmentType == 0) {
-            	segmentIdentifier = segmentType;
-            	segmentType = reader.getInt8();
-            }
-
-            if (segmentType == SEGMENT_SOS) {
-                // The 'Start-Of-Scan' segment's length doesn't include the image data, instead would
-                // have to search for the two bytes: 0xFF 0xD9 (EOI).
-                // It comes last so simply return at this point
-                return segmentData;
-            }
-
-            if (segmentType == MARKER_EOI) {
-                // the 'End-Of-Image' segment -- this should never be found in this fashion
-                return segmentData;
-            }
-
-            // next 2-bytes are <segment-size>: [high-byte] [low-byte]
-            int segmentLength = reader.getUInt16();
-
-            // segment length includes size bytes, so subtract two
-            segmentLength -= 2;
-
-            if (segmentLength < 0)
-                throw new JpegProcessingException("JPEG segment size would be less than zero");
-
-            // Check whether we are interested in this segment
-            if (segmentTypeBytes == null || segmentTypeBytes.contains(segmentType)) {
-                byte[] segmentBytes = reader.getBytes(segmentLength);
-                assert (segmentLength == segmentBytes.length);
-                segmentData.addSegment(segmentType, segmentBytes);
-            } else {
-                // Skip this segment
-                if (!reader.trySkip(segmentLength)) {
-                    // If skipping failed, just return the segments we found so far
-                    return segmentData;
-                }
-            }
-
-        } while (true);
-    }
-
-    private JpegSegmentReader() throws Exception
-    {
-        throw new Exception("Not intended for instantiation.");
-    }
-}
Index: trunk/src/com/drew/imaging/jpeg/JpegSegmentType.java
===================================================================
--- trunk/src/com/drew/imaging/jpeg/JpegSegmentType.java	(revision 15218)
+++ 	(revision )
@@ -1,194 +1,0 @@
-/*
- * Copyright 2002-2019 Drew Noakes and contributors
- *
- *    Licensed under the Apache License, Version 2.0 (the "License");
- *    you may not use this file except in compliance with the License.
- *    You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- *
- * More information about this project is available at:
- *
- *    https://drewnoakes.com/code/exif/
- *    https://github.com/drewnoakes/metadata-extractor
- */
-package com.drew.imaging.jpeg;
-
-import com.drew.lang.annotations.Nullable;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * An enumeration of the known segment types found in JPEG files.
- *
- * <ul>
- *     <li>http://www.ozhiker.com/electronics/pjmt/jpeg_info/app_segments.html</li>
- *     <li>http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/JPEG.html</li>
- * </ul>
- *
- * @author Drew Noakes https://drewnoakes.com
- */
-public enum JpegSegmentType
-{
-    /** APP0 JPEG segment identifier. Commonly contains JFIF, JFXX. */
-    APP0((byte)0xE0, true),
-
-    /** APP1 JPEG segment identifier. Commonly contains Exif. XMP data is also kept in here, though usually in a second instance. */
-    APP1((byte)0xE1, true),
-
-    /** APP2 JPEG segment identifier. Commonly contains ICC. */
-    APP2((byte)0xE2, true),
-
-    /** APP3 JPEG segment identifier. */
-    APP3((byte)0xE3, true),
-
-    /** APP4 JPEG segment identifier. */
-    APP4((byte)0xE4, true),
-
-    /** APP5 JPEG segment identifier. */
-    APP5((byte)0xE5, true),
-
-    /** APP6 JPEG segment identifier. */
-    APP6((byte)0xE6, true),
-
-    /** APP7 JPEG segment identifier. */
-    APP7((byte)0xE7, true),
-
-    /** APP8 JPEG segment identifier. */
-    APP8((byte)0xE8, true),
-
-    /** APP9 JPEG segment identifier. */
-    APP9((byte)0xE9, true),
-
-    /** APPA (App10) JPEG segment identifier. Can contain Unicode comments, though {@link JpegSegmentType#COM} is more commonly used for comments. */
-    APPA((byte)0xEA, true),
-
-    /** APPB (App11) JPEG segment identifier. */
-    APPB((byte)0xEB, true),
-
-    /** APPC (App12) JPEG segment identifier. */
-    APPC((byte)0xEC, true),
-
-    /** APPD (App13) JPEG segment identifier. Commonly contains IPTC, Photoshop data. */
-    APPD((byte)0xED, true),
-
-    /** APPE (App14) JPEG segment identifier. Commonly contains Adobe data. */
-    APPE((byte)0xEE, true),
-
-    /** APPF (App15) JPEG segment identifier. */
-    APPF((byte)0xEF, true),
-
-    /** Start Of Image segment identifier. */
-    SOI((byte)0xD8, false),
-
-    /** Define Quantization Table segment identifier. */
-    DQT((byte)0xDB, false),
-
-    /** Define Number of Lines segment identifier. */
-    DNL((byte)0xDC, false),
-
-    /** Define Restart Interval segment identifier. */
-    DRI((byte)0xDD, false),
-
-    /** Define Hierarchical Progression segment identifier. */
-    DHP((byte)0xDE, false),
-
-    /** EXPand reference component(s) segment identifier. */
-    EXP((byte)0xDF, false),
-
-    /** Define Huffman Table segment identifier. */
-    DHT((byte)0xC4, false),
-
-    /** Define Arithmetic Coding conditioning segment identifier. */
-    DAC((byte)0xCC, false),
-
-    /** Start-of-Frame (0) segment identifier for Baseline DCT. */
-    SOF0((byte)0xC0, true),
-
-    /** Start-of-Frame (1) segment identifier for Extended sequential DCT. */
-    SOF1((byte)0xC1, true),
-
-    /** Start-of-Frame (2) segment identifier for Progressive DCT. */
-    SOF2((byte)0xC2, true),
-
-    /** Start-of-Frame (3) segment identifier for Lossless (sequential). */
-    SOF3((byte)0xC3, true),
-
-//    /** Start-of-Frame (4) segment identifier. */
-//    SOF4((byte)0xC4, true),
-
-    /** Start-of-Frame (5) segment identifier for Differential sequential DCT. */
-    SOF5((byte)0xC5, true),
-
-    /** Start-of-Frame (6) segment identifier for Differential progressive DCT. */
-    SOF6((byte)0xC6, true),
-
-    /** Start-of-Frame (7) segment identifier for Differential lossless (sequential). */
-    SOF7((byte)0xC7, true),
-
-    /** Reserved for JPEG extensions. */
-    JPG((byte)0xC8, true),
-
-    /** Start-of-Frame (9) segment identifier for Extended sequential DCT. */
-    SOF9((byte)0xC9, true),
-
-    /** Start-of-Frame (10) segment identifier for Progressive DCT. */
-    SOF10((byte)0xCA, true),
-
-    /** Start-of-Frame (11) segment identifier for Lossless (sequential). */
-    SOF11((byte)0xCB, true),
-
-//    /** Start-of-Frame (12) segment identifier. */
-//    SOF12((byte)0xCC, true),
-
-    /** Start-of-Frame (13) segment identifier for Differential sequential DCT. */
-    SOF13((byte)0xCD, true),
-
-    /** Start-of-Frame (14) segment identifier for Differential progressive DCT. */
-    SOF14((byte)0xCE, true),
-
-    /** Start-of-Frame (15) segment identifier for Differential lossless (sequential). */
-    SOF15((byte)0xCF, true),
-
-    /** JPEG comment segment identifier for comments. */
-    COM((byte)0xFE, true);
-
-    public static final Collection<JpegSegmentType> canContainMetadataTypes;
-
-    static {
-        List<JpegSegmentType> segmentTypes = new ArrayList<JpegSegmentType>();
-        for (JpegSegmentType segmentType : JpegSegmentType.class.getEnumConstants()) {
-            if (segmentType.canContainMetadata) {
-                segmentTypes.add(segmentType);
-            }
-        }
-        canContainMetadataTypes = segmentTypes;
-    }
-
-    public final byte byteValue;
-    public final boolean canContainMetadata;
-
-    JpegSegmentType(byte byteValue, boolean canContainMetadata)
-    {
-        this.byteValue = byteValue;
-        this.canContainMetadata = canContainMetadata;
-    }
-
-    @Nullable
-    public static JpegSegmentType fromByte(byte segmentTypeByte)
-    {
-        for (JpegSegmentType segmentType : JpegSegmentType.class.getEnumConstants()) {
-            if (segmentType.byteValue == segmentTypeByte)
-                return segmentType;
-        }
-        return null;
-    }
-}
Index: trunk/src/com/drew/imaging/jpeg/package-info.java
===================================================================
--- trunk/src/com/drew/imaging/jpeg/package-info.java	(revision 15218)
+++ 	(revision )
@@ -1,4 +1,0 @@
-/**
- * Contains classes for working with JPEG files.
- */
-package com.drew.imaging.jpeg;
