From 5984c24415c5cd793221799ef356e411c06100c2 Mon Sep 17 00:00:00 2001
From: Jonas Jenwald <jonas.jenwald@gmail.com>
Date: Wed, 16 May 2018 13:49:33 +0200
Subject: [PATCH] Add a basic `JpegImage` example using the standalone image
 decoders

The image was "borrowed" from one of the examples found at https://github.com/notmasteryet/jpgjs/tree/master/images
---
 examples/image_decoders/fish.jpg         | Bin 0 -> 22306 bytes
 examples/image_decoders/jpeg_viewer.html |  40 ++++++++++++
 examples/image_decoders/jpeg_viewer.js   |  75 +++++++++++++++++++++++
 3 files changed, 115 insertions(+)
 create mode 100644 examples/image_decoders/fish.jpg
 create mode 100644 examples/image_decoders/jpeg_viewer.html
 create mode 100644 examples/image_decoders/jpeg_viewer.js

diff --git a/examples/image_decoders/fish.jpg b/examples/image_decoders/fish.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..aa5fbd0d96a58150b800984bf87d18ff50d5c1a1
GIT binary patch
literal 22306
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
O{{Z+uE^m*>=l|JY*9L0<

literal 0
HcmV?d00001

diff --git a/examples/image_decoders/jpeg_viewer.html b/examples/image_decoders/jpeg_viewer.html
new file mode 100644
index 000000000..47af71b0d
--- /dev/null
+++ b/examples/image_decoders/jpeg_viewer.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<!--
+Copyright 2018 Mozilla Foundation
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<html dir="ltr" mozdisallowselectionprint>
+<head>
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+  <meta name="google" content="notranslate">
+  <title>PDF.js standalone JpegImage parser</title>
+
+  <style>
+    body {
+      background-color: #808080;
+      margin: 0;
+      padding: 0;
+    }
+  </style>
+
+  <script src="../../node_modules/pdfjs-dist/image_decoders/pdf.image_decoders.js"></script>
+</head>
+
+<body tabindex="1">
+  <canvas id="jpegCanvas" width="0" height="0"></canvas>
+
+  <script src="jpeg_viewer.js"></script>
+</body>
+</html>
diff --git a/examples/image_decoders/jpeg_viewer.js b/examples/image_decoders/jpeg_viewer.js
new file mode 100644
index 000000000..5bc81ecf3
--- /dev/null
+++ b/examples/image_decoders/jpeg_viewer.js
@@ -0,0 +1,75 @@
+/* Copyright 2018 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+'use strict';
+
+if (!pdfjsImageDecoders.JpegImage) {
+  alert('Please build the pdfjs-dist library using `gulp dist-install`');
+}
+
+var JPEG_IMAGE = 'fish.jpg';
+
+var jpegCanvas = document.getElementById('jpegCanvas');
+var jpegCtx = jpegCanvas.getContext('2d');
+
+// Load the image data, and convert it to a Uint8Array.
+//
+var nonBinaryRequest = false;
+var request = new XMLHttpRequest();
+request.open('GET', JPEG_IMAGE, false);
+try {
+  request.responseType = 'arraybuffer';
+  nonBinaryRequest = request.responseType !== 'arraybuffer';
+} catch (e) {
+  nonBinaryRequest = true;
+}
+if (nonBinaryRequest && request.overrideMimeType) {
+  request.overrideMimeType('text/plain; charset=x-user-defined');
+}
+request.send(null);
+
+var typedArrayImage;
+if (nonBinaryRequest) {
+  var str = request.responseText, length = str.length;
+  var bytes = new Uint8Array(length);
+  for (var i = 0; i < length; ++i) {
+    bytes[i] = str.charCodeAt(i) & 0xFF;
+  }
+  typedArrayImage = bytes;
+} else {
+  typedArrayImage = new Uint8Array(request.response);
+}
+
+// Parse the image data using `JpegImage`.
+//
+var jpegImage = new pdfjsImageDecoders.JpegImage();
+jpegImage.parse(typedArrayImage);
+
+var width = jpegImage.width, height = jpegImage.height;
+var jpegData = jpegImage.getData(width, height, /* forceRGB = */ true);
+
+// Render the JPEG image on a <canvas>.
+//
+var imageData = jpegCtx.createImageData(width, height);
+var imageBytes = imageData.data;
+for (var i = 0, j = 0, ii = width * height * 4; i < ii;) {
+  imageBytes[i++] = jpegData[j++];
+  imageBytes[i++] = jpegData[j++];
+  imageBytes[i++] = jpegData[j++];
+  imageBytes[i++] = 255;
+}
+jpegCanvas.width = width, jpegCanvas.height = height;
+jpegCtx.putImageData(imageData, 0, 0);
+