summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryawano <yawano@chromium.org>2015-01-06 21:13:21 -0800
committerCommit bot <commit-bot@chromium.org>2015-01-07 05:14:03 +0000
commit4cf5bd9e50d5c81d2d5b09a901badeb1fb8172dd (patch)
treee965177e7f723f00fc36cb7d35fd8fe38d971d45
parent807179c6d8cbfd05554964e1ec290f4042af43c1 (diff)
downloadchromium_src-4cf5bd9e50d5c81d2d5b09a901badeb1fb8172dd.zip
chromium_src-4cf5bd9e50d5c81d2d5b09a901badeb1fb8172dd.tar.gz
chromium_src-4cf5bd9e50d5c81d2d5b09a901badeb1fb8172dd.tar.bz2
Change exif encoder to copy fields of original image.
This CL also changes to set compression tag and update software name tag. BUG=437142 TEST=out/Release/browser_tests --gtest_filter=GalleryJsTest.ExifEncoderTest Review URL: https://codereview.chromium.org/831333005 Cr-Commit-Position: refs/heads/master@{#310234}
-rw-r--r--ui/file_manager/file_manager/foreground/js/metadata/exif_constants.js4
-rw-r--r--ui/file_manager/gallery/js/image_editor/exif_encoder.js34
-rw-r--r--ui/file_manager/gallery/js/image_editor/exif_encoder_unittest.js52
-rw-r--r--ui/file_manager/gallery/js/image_editor/image_encoder.js4
4 files changed, 80 insertions, 14 deletions
diff --git a/ui/file_manager/file_manager/foreground/js/metadata/exif_constants.js b/ui/file_manager/file_manager/foreground/js/metadata/exif_constants.js
index 3df514d..bb23871 100644
--- a/ui/file_manager/file_manager/foreground/js/metadata/exif_constants.js
+++ b/ui/file_manager/file_manager/foreground/js/metadata/exif_constants.js
@@ -51,7 +51,9 @@ Exif.Tag = {
JPG_THUMB_LENGTH: 0x0202,
IMAGE_WIDTH: 0x0100,
IMAGE_HEIGHT: 0x0101,
+ COMPRESSION: 0x0102,
ORIENTATION: 0x0112,
X_DIMENSION: 0xA002,
- Y_DIMENSION: 0xA003
+ Y_DIMENSION: 0xA003,
+ SOFTWARE: 0x0131,
};
diff --git a/ui/file_manager/gallery/js/image_editor/exif_encoder.js b/ui/file_manager/gallery/js/image_editor/exif_encoder.js
index 70a91a4..1ddebbe 100644
--- a/ui/file_manager/gallery/js/image_editor/exif_encoder.js
+++ b/ui/file_manager/gallery/js/image_editor/exif_encoder.js
@@ -5,17 +5,18 @@
/**
* The Exif metadata encoder.
* Uses the metadata format as defined by ExifParser.
- * @param {!Object} original_metadata Metadata to encode.
+ * @param {!Object} originalMetadata Metadata to encode.
* @constructor
* @extends {ImageEncoder.MetadataEncoder}
* @struct
*/
-function ExifEncoder(original_metadata) {
+function ExifEncoder(originalMetadata) {
ImageEncoder.MetadataEncoder.apply(this, arguments);
- this.ifd_ = this.metadata_.ifd;
- if (!this.ifd_)
- this.ifd_ = this.metadata_.ifd = {};
+ if (this.metadata_.media && this.metadata_.media.ifd)
+ this.ifd_ = this.metadata_.media.ifd;
+ else
+ this.ifd_ = {};
}
ExifEncoder.prototype = {__proto__: ImageEncoder.MetadataEncoder.prototype};
@@ -23,6 +24,13 @@ ExifEncoder.prototype = {__proto__: ImageEncoder.MetadataEncoder.prototype};
ImageEncoder.registerMetadataEncoder(ExifEncoder, 'image/jpeg');
/**
+ * Software name of Gallery.app.
+ * @type {string}
+ * @const
+ */
+ExifEncoder.SOFTWARE = 'Chrome OS Gallery App\0';
+
+/**
* @override
*/
ExifEncoder.prototype.setImageData = function(canvas) {
@@ -49,8 +57,12 @@ ExifEncoder.prototype.setImageData = function(canvas) {
// Always save in default orientation.
delete this.metadata_['imageTransform'];
ExifEncoder.findOrCreateTag(image, Exif.Tag.ORIENTATION).value = 1;
-};
+ // Update software name.
+ var softwareTag = ExifEncoder.findOrCreateTag(image, Exif.Tag.SOFTWARE, 2);
+ softwareTag.value = ExifEncoder.SOFTWARE;
+ softwareTag.componentCount = ExifEncoder.SOFTWARE.length;
+};
/**
* @override
@@ -90,6 +102,10 @@ ExifEncoder.prototype.setThumbnailData = function(canvas, quality) {
// Always save in default orientation.
ExifEncoder.findOrCreateTag(thumbnail, Exif.Tag.ORIENTATION).value = 1;
+
+ // When thumbnail is compressed with JPEG, compression must be set as 6.
+ ExifEncoder.findOrCreateTag(this.ifd_.image, Exif.Tag.COMPRESSION).value =
+ 6;
} else {
console.warn(
'Thumbnail URL too long: ' + this.metadata_.thumbnailURL.length);
@@ -331,10 +347,14 @@ ExifEncoder.getComponentWidth = function(tag) {
*/
ExifEncoder.writeValue = function(bw, tag) {
if (tag.format === 2) { // String
- if (tag.componentCount != tag.value.length) {
+ if (tag.componentCount !== tag.value.length) {
throw new Error(
'String size mismatch for 0x' + Number(tag.id).toString(16));
}
+
+ if (tag.value.charAt(tag.value.length - 1) !== '\0')
+ throw new Error('String must end with null character.');
+
bw.writeString(/** @type {string} */ (tag.value));
} else { // Scalar or rational
var width = ExifEncoder.getComponentWidth(tag);
diff --git a/ui/file_manager/gallery/js/image_editor/exif_encoder_unittest.js b/ui/file_manager/gallery/js/image_editor/exif_encoder_unittest.js
index 4afd939..95f5893 100644
--- a/ui/file_manager/gallery/js/image_editor/exif_encoder_unittest.js
+++ b/ui/file_manager/gallery/js/image_editor/exif_encoder_unittest.js
@@ -20,14 +20,39 @@ function testExifEncodeAndDecode() {
id: 0x10f,
format: 2,
componentCount: 12,
- value: 'Manufacture'
+ value: 'Manufacture\0'
},
// Device model
272: {
id: 0x110,
format: 2,
componentCount: 12,
- value: 'DeviceModel'
+ value: 'DeviceModel\0'
+ },
+ // GPS Pointer
+ 34853: {
+ id: 0x8825,
+ format: 4,
+ componentCount: 1,
+ value: 0 // The value is set by the encoder.
+ }
+ },
+ exif: {
+ // Lens model
+ 42036: {
+ id: 0xa434,
+ format: 2,
+ componentCount: 10,
+ value: 'LensModel\0'
+ }
+ },
+ gps: {
+ // GPS latitude ref
+ 1: {
+ id: 0x1,
+ format: 2,
+ componentCount: 2,
+ value: 'N\0'
}
}
}
@@ -56,14 +81,29 @@ function testExifEncodeAndDecode() {
// Check ifd.image.
assertEquals(1, parsedMetadata.ifd.image[0x112].value); // Orientation
+ // Since thumbnail is compressed with JPEG, compression must be 6.
+ assertEquals(6, parsedMetadata.ifd.image[0x102].value);
+
// Check ifd.exif.
assertEquals(1920, parsedMetadata.ifd.exif[0xA002].value); // PixelXDimension
assertEquals(1080, parsedMetadata.ifd.exif[0xA003].value); // PixelYDimension
- // TODO(yawano) Change exif_encoder to preserve these fields.
- // These fileds are not encoded.
- assertEquals(undefined, parsedMetadata.ifd.image[0x10F]); // Manufacture
- assertEquals(undefined, parsedMetadata.ifd.image[0x110]); // Device model
+ // These fields should be copied correctly.
+ // Manufacture
+ assertEquals('Manufacture\0', parsedMetadata.ifd.image[0x10F].value);
+ // Device model
+ assertEquals('DeviceModel\0', parsedMetadata.ifd.image[0x110].value);
+ // Lens model
+ assertEquals('LensModel\0', parsedMetadata.ifd.exif[0xa434].value);
+ // GPS latitude ref
+ assertEquals('N\0', parsedMetadata.ifd.gps[0x1].value);
+
+ // Software should be set as Gallery.app
+ assertEquals('Chrome OS Gallery App\0',
+ parsedMetadata.ifd.image[0x131].value);
+
+ // TODO(yawano): Datetime should be updated.
+ assertEquals(undefined, parsedMetadata.ifd.image[0x132]); // Datetime
// Thumbnail image
assert(parsedMetadata.thumbnailTransform);
diff --git a/ui/file_manager/gallery/js/image_editor/image_encoder.js b/ui/file_manager/gallery/js/image_editor/image_encoder.js
index 7b3ebf3..3c549a5 100644
--- a/ui/file_manager/gallery/js/image_editor/image_encoder.js
+++ b/ui/file_manager/gallery/js/image_editor/image_encoder.js
@@ -205,6 +205,10 @@ ImageEncoder.MetadataEncoder.getMimeType_ = function(metadata) {
/**
* Returns metadata.
* @return {!Object} A metadata.
+ *
+ * TODO(yawano): MetadataEncoder.getMetadata seems not to be used anymore.
+ * Investigate this, and remove if possible. Should not modify a metadata by
+ * using an encoder.
*/
ImageEncoder.MetadataEncoder.prototype.getMetadata = function() {
return this.metadata_;