blob: ed8c528bf0133480f37ef04a4591c47919062191 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/* Base class for image metadata parsers that only need to look at a short
fragment at the start of the file */
function SimpleImageParser(parent, type, urlFilter, headerSize) {
ImageParser.call(this, parent, type, urlFilter);
this.headerSize = headerSize;
}
SimpleImageParser.prototype = {__proto__: ImageParser.prototype};
SimpleImageParser.prototype.parse = function(
file, metadata, callback, errorCallback) {
var self = this;
util.readFileBytes(file, 0, this.headerSize,
function (file, br) {
try {
self.parseHeader(metadata, br);
callback(metadata);
} catch(e) {
errorCallback(e.toString());
}
},
errorCallback);
};
function PngParser(parent) {
SimpleImageParser.call(this, parent, 'png', /\.png$/i, 24);
}
PngParser.prototype = {__proto__: SimpleImageParser.prototype};
PngParser.prototype.parseHeader = function(metadata, br) {
br.setByteOrder(ByteReader.BIG_ENDIAN);
var signature = br.readString(8);
if (signature != '\x89PNG\x0D\x0A\x1A\x0A')
throw new Error('Invalid PNG signature: ' + signature);
br.seek(12);
var ihdr = br.readString(4);
if (ihdr != 'IHDR')
throw new Error('Missing IHDR chunk');
metadata.width = br.readScalar(4);
metadata.height = br.readScalar(4);
};
MetadataDispatcher.registerParserClass(PngParser);
function BmpParser(parent) {
SimpleImageParser.call(this, parent, 'bmp', /\.bmp$/i, 28);
}
BmpParser.prototype = {__proto__: SimpleImageParser.prototype};
BmpParser.prototype.parseHeader = function(metadata, br) {
br.setByteOrder(ByteReader.LITTLE_ENDIAN);
var signature = br.readString(2);
if (signature != 'BM')
throw new Error('Invalid BMP signature: ' + signature);
br.seek(18);
metadata.width = br.readScalar(4);
metadata.height = br.readScalar(4);
};
MetadataDispatcher.registerParserClass(BmpParser);
function GifParser(parent) {
SimpleImageParser.call(this, parent, 'gif', /\.Gif$/i, 10);
}
GifParser.prototype = {__proto__: SimpleImageParser.prototype};
GifParser.prototype.parseHeader = function(metadata, br) {
br.setByteOrder(ByteReader.LITTLE_ENDIAN);
var signature = br.readString(6);
if (!signature.match(/GIF8(7|9)a/))
throw new Error('Invalid GIF signature: ' + signature);
metadata.width = br.readScalar(2);
metadata.height = br.readScalar(2);
};
MetadataDispatcher.registerParserClass(GifParser);