1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/* 2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2016 The Android Open Source Project 3ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 4ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License"); 5ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * you may not use this file except in compliance with the License. 6ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * You may obtain a copy of the License at 7ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 8ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * http://www.apache.org/licenses/LICENSE-2.0 9ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 10ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Unless required by applicable law or agreed to in writing, software 11ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS, 12ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * See the License for the specific language governing permissions and 14ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * limitations under the License. 15ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 16ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 17ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpackage com.android.dialer.callcomposer.camera.exif; 18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 19ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/** 20ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * This class stores the EXIF header in IFDs according to the JPEG specification. It is the result 21ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * produced by {@link ExifReader}. 22ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 23ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @see ExifReader 24ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @see IfdData 25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 26ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic class ExifData { 27ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 28ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final IfdData[] mIfdDatas = new IfdData[IfdId.TYPE_IFD_COUNT]; 29ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 30ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Adds IFD data. If IFD data of the same type already exists, it will be replaced by the new 32ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * data. 33ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 34ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian void addIfdData(IfdData data) { 35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mIfdDatas[data.getId()] = data; 36ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 37ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 38ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** Returns the {@link IfdData} object corresponding to a given IFD if it exists or null. */ 39ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian IfdData getIfdData(int ifdId) { 40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (ExifTag.isValidIfd(ifdId)) { 41ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mIfdDatas[ifdId]; 42ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 43ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return null; 44ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 46ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 47ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Returns the tag with a given TID in the given IFD if the tag exists. Otherwise returns null. 48ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 49ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian protected ExifTag getTag(short tag, int ifd) { 50ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian IfdData ifdData = mIfdDatas[ifd]; 51ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return (ifdData == null) ? null : ifdData.getTag(tag); 52ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 53ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 54ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 55ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Adds the given ExifTag to its default IFD and returns an existing ExifTag with the same TID or 56ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * null if none exist. 57ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 58ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian ExifTag addTag(ExifTag tag) { 59ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (tag != null) { 60ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian int ifd = tag.getIfd(); 61ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return addTag(tag, ifd); 62ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 63ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return null; 64ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 65ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 67ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Adds the given ExifTag to the given IFD and returns an existing ExifTag with the same TID or 68ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * null if none exist. 69ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 70ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private ExifTag addTag(ExifTag tag, int ifdId) { 71ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (tag != null && ExifTag.isValidIfd(ifdId)) { 72ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian IfdData ifdData = getOrCreateIfdData(ifdId); 73ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return ifdData.setTag(tag); 74ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 75ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return null; 76ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 77ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 78ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 79ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Returns the {@link IfdData} object corresponding to a given IFD or generates one if none exist. 80ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 81ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private IfdData getOrCreateIfdData(int ifdId) { 82ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian IfdData ifdData = mIfdDatas[ifdId]; 83ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (ifdData == null) { 84ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian ifdData = new IfdData(ifdId); 85ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mIfdDatas[ifdId] = ifdData; 86ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 87ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return ifdData; 88ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 89ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian} 90