Skip to content

Commit

Permalink
Update GH pages using commit 60a6b8e
Browse files Browse the repository at this point in the history
  • Loading branch information
github-actions[bot] committed Oct 21, 2023
1 parent 7cf3829 commit e4e3f08
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 9 deletions.
2 changes: 1 addition & 1 deletion exif-reader.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion exif-reader.js.map

Large diffs are not rendered by default.

30 changes: 29 additions & 1 deletion src/exif-reader.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import IccTags from './icc-tags.js';
import PngFileTags from './png-file-tags.js';
import PngTextTags from './png-text-tags.js';
import PngTags from './png-tags.js';
import Vp8xTags from './vp8x-tags.js';
import Thumbnail from './thumbnail.js';
import exifErrors from './errors.js';

Expand Down Expand Up @@ -196,6 +197,7 @@ export function loadView(dataView, {expanded = false, includeUnknown = false} =
let tags = {};

const {
fileType,
fileDataOffset,
jfifDataOffset,
tiffHeaderOffset,
Expand All @@ -205,7 +207,8 @@ export function loadView(dataView, {expanded = false, includeUnknown = false} =
mpfDataOffset,
pngHeaderOffset,
pngTextChunks,
pngChunkOffsets
pngChunkOffsets,
vp8xChunkOffset,
} = ImageHeader.parseAppMarkers(dataView);

if (Constants.USE_JPEG && Constants.USE_FILE && hasFileData(fileDataOffset)) {
Expand Down Expand Up @@ -353,6 +356,16 @@ export function loadView(dataView, {expanded = false, includeUnknown = false} =
}
}

if (Constants.USE_WEBP && hasVp8xData(vp8xChunkOffset)) {
foundMetaData = true;
const readTags = Vp8xTags.read(dataView, vp8xChunkOffset);
if (expanded) {
tags.riff = !tags.riff ? readTags : objectAssign({}, tags.riff, readTags);
} else {
tags = objectAssign({}, tags, readTags);
}
}

const thumbnail = (Constants.USE_JPEG || Constants.USE_WEBP)
&& Constants.USE_EXIF
&& Constants.USE_THUMBNAIL
Expand All @@ -364,6 +377,17 @@ export function loadView(dataView, {expanded = false, includeUnknown = false} =
delete tags.Thumbnail;
}

if (fileType) {
if (expanded) {
if (!tags.file) {
tags.file = {};
}
tags.file.FileType = fileType;
} else {
tags.FileType = fileType;
}
}

if (!foundMetaData) {
throw new exifErrors.MetadataMissingError();
}
Expand Down Expand Up @@ -450,3 +474,7 @@ function hasPngTextData(pngTextChunks) {
function hasPngData(pngChunkOffsets) {
return pngChunkOffsets !== undefined;
}

function hasVp8xData(vp8xChunkOffset) {
return vp8xChunkOffset !== undefined;
}
7 changes: 6 additions & 1 deletion src/image-header-webp.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ function findOffsets(dataView) {
let tiffHeaderOffset;
let xmpChunks;
let iccChunks;
let vp8xChunkOffset;

while (offset + CHUNK_HEADER_SIZE < dataView.byteLength) {
const chunkId = getStringFromDataView(dataView, offset, 4);
Expand All @@ -57,6 +58,9 @@ function findOffsets(dataView) {
chunkNumber: 1,
chunksTotal: 1
}];
} else if (chunkId === 'VP8X') {
hasAppMarkers = true;
vp8xChunkOffset = offset + CHUNK_HEADER_SIZE;
}

offset += CHUNK_HEADER_SIZE + (chunkSize % 2 === 0 ? chunkSize : chunkSize + 1);
Expand All @@ -66,6 +70,7 @@ function findOffsets(dataView) {
hasAppMarkers,
tiffHeaderOffset,
xmpChunks,
iccChunks
iccChunks,
vp8xChunkOffset
};
}
15 changes: 10 additions & 5 deletions src/image-header.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,31 +8,36 @@ import Jpeg from './image-header-jpeg.js';
import Png from './image-header-png.js';
import Heic from './image-header-heic.js';
import Webp from './image-header-webp.js';
import {objectAssign} from './utils.js';

export default {
parseAppMarkers
};

function parseAppMarkers(dataView) {
if (Constants.USE_TIFF && Tiff.isTiffFile(dataView)) {
return Tiff.findTiffOffsets();
return addFileType(Tiff.findTiffOffsets(), 'tiff', 'TIFF');
}

if (Constants.USE_JPEG && Jpeg.isJpegFile(dataView)) {
return Jpeg.findJpegOffsets(dataView);
return addFileType(Jpeg.findJpegOffsets(dataView), 'jpeg', 'JPEG');
}

if (Constants.USE_PNG && Png.isPngFile(dataView)) {
return Png.findPngOffsets(dataView);
return addFileType(Png.findPngOffsets(dataView), 'png', 'PNG');
}

if (Constants.USE_HEIC && Heic.isHeicFile(dataView)) {
return Heic.findHeicOffsets(dataView);
return addFileType(Heic.findHeicOffsets(dataView), 'heic', 'HEIC');
}

if (Constants.USE_WEBP && Webp.isWebpFile(dataView)) {
return Webp.findOffsets(dataView);
return addFileType(Webp.findOffsets(dataView), 'webp', 'WebP');
}

throw new Error('Invalid image format');
}

function addFileType(offsets, fileType, fileTypeDescription) {
return objectAssign({}, offsets, {fileType: {value: fileType, description: fileTypeDescription}});
}
55 changes: 55 additions & 0 deletions src/vp8x-tags.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */

import Types from './types.js';

export default {
read
};

const IMAGE_WIDTH_OFFSET = 4;
const IMAGE_HEIGHT_OFFSET = 7;

// https://developers.google.com/speed/webp/docs/riff_container#extended_file_format
function read(dataView, chunkOffset) {
const tags = {};

const flags = Types.getByteAt(dataView, chunkOffset);

tags['Alpha'] = getAlpha(flags);
tags['Animation'] = getAnimation(flags);
tags['ImageWidth'] = getThreeByteValue(dataView, chunkOffset + IMAGE_WIDTH_OFFSET);
tags['ImageHeight'] = getThreeByteValue(dataView, chunkOffset + IMAGE_HEIGHT_OFFSET);

return tags;
}

function getAlpha(flags) {
const value = flags & 0x10;
return {
value: value ? 1 : 0,
description: value ? 'Yes' : 'No'
};
}

function getAnimation(flags) {
const value = flags & 0x02;
return {
value: value ? 1 : 0,
description: value ? 'Yes' : 'No'
};
}

function getThreeByteValue(dataView, offset) {
// Values are stored little-endian.
const value = Types.getByteAt(dataView, offset)
+ 256 * Types.getByteAt(dataView, offset + 1)
+ 256 * 256 * Types.getByteAt(dataView, offset + 2)
+ 1; // Value is 1-based, i.e. a value of 7 means 8px.

return {
value,
description: value + 'px'
};
}

0 comments on commit e4e3f08

Please sign in to comment.