/* * dumpToFile() * * For test development, dumps the specified array to a file. * Call |dumpToFile(outData);| in a test to file to a file.
*/ // eslint-disable-next-line no-unused-vars function dumpToFile(aData) { var outputFile = do_get_cwd();
outputFile.append("testdump.webp");
var bos = Cc["@mozilla.org/binaryoutputstream;1"].createInstance(
Ci.nsIBinaryOutputStream
);
bos.setOutputStream(outputStream);
bos.writeByteArray(aData);
outputStream.close();
}
/* * getFileInputStream() * * Returns an input stream for the specified file.
*/ function getFileInputStream(aFile) { var inputStream = Cc[ "@mozilla.org/network/file-input-stream;1"
].createInstance(Ci.nsIFileInputStream); // init the stream as RD_ONLY, -1 == default permissions.
inputStream.init(aFile, 0x01, -1, null);
// Blah. The image decoders use ReadSegments, which isn't implemented on // file input streams. Use a buffered stream to make it work. var bis = Cc["@mozilla.org/network/buffered-input-stream;1"].createInstance(
Ci.nsIBufferedInputStream
);
bis.init(inputStream, 1024);
return bis;
}
/* * streamToArray() * * Consumes an input stream, and returns its bytes as an array.
*/ function streamToArray(aStream) { var size = aStream.available();
// use a binary input stream to grab the bytes. var bis = Cc["@mozilla.org/binaryinputstream;1"].createInstance(
Ci.nsIBinaryInputStream
);
bis.setInputStream(aStream);
var bytes = bis.readByteArray(size); if (size != bytes.length) { thrownew Error("Didn't read expected number of bytes");
}
return bytes;
}
/* * compareArrays * * Compares two arrays, and throws if there's a difference.
*/ function compareArrays(aArray1, aArray2) { Assert.equal(aArray1.length, aArray2.length);
for (var i = 0; i < aArray1.length; i++) { if (aArray1[i] != aArray2[i]) { thrownew Error("arrays differ at index " + i);
}
}
}
/* * checkExpectedError * * Checks to see if a thrown error was expected or not, and if it * matches the expected value.
*/ function checkExpectedError(aExpectedError, aActualError) { if (aExpectedError) { if (!aActualError) { thrownew Error("Didn't throw as expected (" + aExpectedError + ")");
}
if (!aExpectedError.test(aActualError)) { thrownew Error("Threw (" + aActualError + "), not (" + aExpectedError);
}
// We got the expected error, so make a note in the test log.
dump("...that error was expected.\n\n");
} elseif (aActualError) { thrownew Error("Threw unexpected error: " + aActualError);
}
}
function run_test() { try { /* ========== 0 ========== */ var testnum = 0; var testdesc = "imgITools setup"; var err = null;
var imgTools = Cc["@mozilla.org/image/tools;1"].getService(Ci.imgITools);
if (!imgTools) { thrownew Error("Couldn't get imgITools service");
}
// Ugh, this is an ugly hack. The pixel values we get in Windows are sometimes // +/- 1 value compared to other platforms, so we need to compare against a // different set of reference images. nsIXULRuntime.OS doesn't seem to be // available in xpcshell, so we'll use this as a kludgy way to figure out if // we're running on Windows. var isWindows = mozinfo.os == "win";
// 64x64 png, 8415 bytes. var imgName = "image1.png"; var inMimeType = "image/png"; var imgFile = do_get_file(imgName);
var istream = getFileInputStream(imgFile); Assert.equal(istream.available(), 8415);
var buffer = NetUtil.readInputStreamToString(istream, istream.available()); var container = imgTools.decodeImageFromBuffer(
buffer,
buffer.length,
inMimeType
);
// It's not easy to look at the pixel values from JS, so just // check the container's size. Assert.equal(container.width, 64); Assert.equal(container.height, 64);
// we'll reuse the container from the previous test
istream = imgTools.encodeScaledImage(container, "image/jpeg", 16, 16);
var encodedBytes = streamToArray(istream); // Get bytes for expected result var refName = "image1png16x16.jpg"; var refFile = do_get_file(refName);
istream = getFileInputStream(refFile); Assert.equal(istream.available(), 1050); var referenceBytes = streamToArray(istream);
// compare the encoder's output to the reference file.
compareArrays(encodedBytes, referenceBytes);
// It's not easy to look at the pixel values from JS, so just // check the container's size. Assert.equal(container.width, 32); Assert.equal(container.height, 32);
if (!isWindows) { // we'll reuse the container from the previous test
istream = imgTools.encodeImage(container, "image/png");
encodedBytes = streamToArray(istream);
// Get bytes for expected result
refName = isWindows ? "image2jpg32x32-win.png" : "image2jpg32x32.png";
refFile = do_get_file(refName);
istream = getFileInputStream(refFile); Assert.equal(istream.available(), 3026);
referenceBytes = streamToArray(istream);
// compare the encoder's output to the reference file.
compareArrays(encodedBytes, referenceBytes);
}
// It's not easy to look at the pixel values from JS, so just // check the container's size. Assert.equal(container.width, 16); Assert.equal(container.height, 16);
/* ========== 8 ========== */
testnum++;
testdesc = "test encoding a scaled PNG"; // note that we're scaling UP
// we'll reuse the container from the previous test
istream = imgTools.encodeScaledImage(container, "image/png", 32, 32);
encodedBytes = streamToArray(istream);
// Get bytes for expected result
refName = "image3ico32x32.png";
refFile = do_get_file(refName);
istream = getFileInputStream(refFile); Assert.equal(istream.available(), 2280);
referenceBytes = streamToArray(istream);
// compare the encoder's output to the reference file.
compareArrays(encodedBytes, referenceBytes);
// It's not easy to look at the pixel values from JS, so just // check the container's size. Assert.equal(container.width, 32); Assert.equal(container.height, 32);
/* ========== 11 ========== */
testnum++;
testdesc = "test encoding an unscaled ICO with format options " + "(format=bmp;bpp=32)";
// we'll reuse the container from the previous test
istream = imgTools.encodeImage(
container, "image/vnd.microsoft.icon", "format=bmp;bpp=32"
);
encodedBytes = streamToArray(istream);
// Get bytes for expected result
refName = "image4gif32x32bmp32bpp.ico";
refFile = do_get_file(refName);
istream = getFileInputStream(refFile); Assert.equal(istream.available(), 4286);
referenceBytes = streamToArray(istream);
// compare the encoder's output to the reference file.
compareArrays(encodedBytes, referenceBytes);
/* ========== 12 ========== */
testnum++;
testdesc = // eslint-disable-next-line no-useless-concat "test encoding a scaled ICO with format options " + "(format=bmp;bpp=32)";
// we'll reuse the container from the previous test
istream = imgTools.encodeScaledImage(
container, "image/vnd.microsoft.icon",
16,
16, "format=bmp;bpp=32"
);
encodedBytes = streamToArray(istream);
// Get bytes for expected result
refName = "image4gif16x16bmp32bpp.ico";
refFile = do_get_file(refName);
istream = getFileInputStream(refFile); Assert.equal(istream.available(), 1150);
referenceBytes = streamToArray(istream);
// compare the encoder's output to the reference file.
compareArrays(encodedBytes, referenceBytes);
/* ========== 13 ========== */
testnum++;
testdesc = "test encoding an unscaled ICO with format options " + "(format=bmp;bpp=24)";
// we'll reuse the container from the previous test
istream = imgTools.encodeImage(
container, "image/vnd.microsoft.icon", "format=bmp;bpp=24"
);
encodedBytes = streamToArray(istream);
// Get bytes for expected result
refName = "image4gif32x32bmp24bpp.ico";
refFile = do_get_file(refName);
istream = getFileInputStream(refFile); Assert.equal(istream.available(), 3262);
referenceBytes = streamToArray(istream);
// compare the encoder's output to the reference file.
compareArrays(encodedBytes, referenceBytes);
/* ========== 14 ========== */
testnum++;
testdesc = // eslint-disable-next-line no-useless-concat "test encoding a scaled ICO with format options " + "(format=bmp;bpp=24)";
// we'll reuse the container from the previous test
istream = imgTools.encodeScaledImage(
container, "image/vnd.microsoft.icon",
16,
16, "format=bmp;bpp=24"
);
encodedBytes = streamToArray(istream);
// Get bytes for expected result
refName = "image4gif16x16bmp24bpp.ico";
refFile = do_get_file(refName);
istream = getFileInputStream(refFile); Assert.equal(istream.available(), 894);
referenceBytes = streamToArray(istream);
// compare the encoder's output to the reference file.
compareArrays(encodedBytes, referenceBytes);
// It's not easy to look at the pixel values from JS, so just // check the container's size. Assert.equal(container.width, 32); Assert.equal(container.height, 32);
// Get bytes for expected result
refName = "image2jpg16x16cropped.jpg";
refFile = do_get_file(refName);
istream = getFileInputStream(refFile); Assert.equal(istream.available(), 879);
referenceBytes = streamToArray(istream);
// compare the encoder's output to the reference file.
compareArrays(encodedBytes, referenceBytes);
/* ========== 16 ========== */
testnum++;
testdesc = "test cropping a JPG with an offset";
// we'll reuse the container from the previous test
istream = imgTools.encodeCroppedImage(
container, "image/jpeg",
16,
16,
16,
16
);
encodedBytes = streamToArray(istream);
// Get bytes for expected result
refName = "image2jpg16x16cropped2.jpg";
refFile = do_get_file(refName);
istream = getFileInputStream(refFile); Assert.equal(istream.available(), 878);
referenceBytes = streamToArray(istream);
// compare the encoder's output to the reference file.
compareArrays(encodedBytes, referenceBytes);
/* ========== 17 ========== */
testnum++;
testdesc = "test cropping a JPG without a given height";
// we'll reuse the container from the previous test
istream = imgTools.encodeCroppedImage(container, "image/jpeg", 0, 0, 16, 0);
encodedBytes = streamToArray(istream);
// Get bytes for expected result
refName = "image2jpg16x32cropped3.jpg";
refFile = do_get_file(refName);
istream = getFileInputStream(refFile); Assert.equal(istream.available(), 1127);
referenceBytes = streamToArray(istream);
// compare the encoder's output to the reference file.
compareArrays(encodedBytes, referenceBytes);
/* ========== 18 ========== */
testnum++;
testdesc = "test cropping a JPG without a given width";
// we'll reuse the container from the previous test
istream = imgTools.encodeCroppedImage(container, "image/jpeg", 0, 0, 0, 16);
encodedBytes = streamToArray(istream);
// Get bytes for expected result
refName = "image2jpg32x16cropped4.jpg";
refFile = do_get_file(refName);
istream = getFileInputStream(refFile); Assert.equal(istream.available(), 1135);
referenceBytes = streamToArray(istream);
// compare the encoder's output to the reference file.
compareArrays(encodedBytes, referenceBytes);
/* ========== 19 ========== */
testnum++;
testdesc = "test cropping a JPG without a given width and height";
// we'll reuse the container from the previous test
istream = imgTools.encodeCroppedImage(container, "image/jpeg", 0, 0, 0, 0);
encodedBytes = streamToArray(istream);
// Get bytes for expected result
refName = "image2jpg32x32.jpg";
refFile = do_get_file(refName);
istream = getFileInputStream(refFile); Assert.equal(istream.available(), 1634);
referenceBytes = streamToArray(istream);
// compare the encoder's output to the reference file.
compareArrays(encodedBytes, referenceBytes);
/* ========== 20 ========== */
testnum++;
testdesc = "test scaling a JPG without a given width";
// we'll reuse the container from the previous test
istream = imgTools.encodeScaledImage(container, "image/jpeg", 0, 16);
encodedBytes = streamToArray(istream);
// Get bytes for expected result
refName = "image2jpg32x16scaled.jpg";
refFile = do_get_file(refName);
istream = getFileInputStream(refFile); Assert.equal(istream.available(), 1227);
referenceBytes = streamToArray(istream);
// compare the encoder's output to the reference file.
compareArrays(encodedBytes, referenceBytes);
/* ========== 21 ========== */
testnum++;
testdesc = "test scaling a JPG without a given height";
// we'll reuse the container from the previous test
istream = imgTools.encodeScaledImage(container, "image/jpeg", 16, 0);
encodedBytes = streamToArray(istream);
// Get bytes for expected result
refName = "image2jpg16x32scaled.jpg";
refFile = do_get_file(refName);
istream = getFileInputStream(refFile); Assert.equal(istream.available(), 1219);
referenceBytes = streamToArray(istream);
// compare the encoder's output to the reference file.
compareArrays(encodedBytes, referenceBytes);
/* ========== 22 ========== */
testnum++;
testdesc = "test scaling a JPG without a given width and height";
// we'll reuse the container from the previous test
istream = imgTools.encodeScaledImage(container, "image/jpeg", 0, 0);
encodedBytes = streamToArray(istream);
// Get bytes for expected result
refName = "image2jpg32x32.jpg";
refFile = do_get_file(refName);
istream = getFileInputStream(refFile); Assert.equal(istream.available(), 1634);
referenceBytes = streamToArray(istream);
// compare the encoder's output to the reference file.
compareArrays(encodedBytes, referenceBytes);
// We expect to hit an error during encoding because the ICO header of the // image is fine, but the actual resources are corrupt. Since // decodeImageFromBuffer() only performs a metadata decode, it doesn't decode // far enough to realize this, but we'll find out when we do a full decode // during encodeImage(). try {
istream = imgTools.encodeImage(container, "image/png");
} catch (e) {
err = e;
errsrc = "encode";
}
} catch (e) {
err = e;
errsrc = "decode";
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.