# modules/jpeg_support.js

    /**
     * @license
     *
     * Licensed under the MIT License.
     * http://opensource.org/licenses/mit-license
     */

    import { jsPDF } from "../jspdf.js";

    /**
     * jsPDF jpeg Support PlugIn
     *
     * @name jpeg_support
     * @module
     */
    (function(jsPDFAPI) {
      "use strict";

      /**
       * 0xc0 (SOF) Huffman  - Baseline DCT
       * 0xc1 (SOF) Huffman  - Extended sequential DCT
       * 0xc2 Progressive DCT (SOF2)
       * 0xc3 Spatial (sequential) lossless (SOF3)
       * 0xc4 Differential sequential DCT (SOF5)
       * 0xc5 Differential progressive DCT (SOF6)
       * 0xc6 Differential spatial (SOF7)
       * 0xc7
       */
      var markers = [0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7];

      //takes a string imgData containing the raw bytes of
      //a jpeg image and returns [width, height]
      //Algorithm from: http://www.64lines.com/jpeg-width-height
      var getJpegInfo = function(imgData) {
        var width, height, numcomponents;
        var blockLength = imgData.charCodeAt(4) * 256 + imgData.charCodeAt(5);
        var len = imgData.length;
        var result = { width: 0, height: 0, numcomponents: 1 };
        for (var i = 4; i < len; i += 2) {
          i += blockLength;
          if (markers.indexOf(imgData.charCodeAt(i + 1)) !== -1) {
            height = imgData.charCodeAt(i + 5) * 256 + imgData.charCodeAt(i + 6);
            width = imgData.charCodeAt(i + 7) * 256 + imgData.charCodeAt(i + 8);
            numcomponents = imgData.charCodeAt(i + 9);
            result = { width: width, height: height, numcomponents: numcomponents };
            break;
          } else {
            blockLength =
              imgData.charCodeAt(i + 2) * 256 + imgData.charCodeAt(i + 3);
          }
        }
        return result;
      };

      /**
       * @ignore
       */
      jsPDFAPI.processJPEG = function(
        data,
        index,
        alias,
        compression,
        dataAsBinaryString,
        colorSpace
      ) {
        var filter = this.decode.DCT_DECODE,
          bpc = 8,
          dims,
          result = null;

        if (
          typeof data === "string" ||
          this.__addimage__.isArrayBuffer(data) ||
          this.__addimage__.isArrayBufferView(data)
        ) {
          // if we already have a stored binary string rep use that
          data = dataAsBinaryString || data;
          data = this.__addimage__.isArrayBuffer(data)
            ? new Uint8Array(data)
            : data;
          data = this.__addimage__.isArrayBufferView(data)
            ? this.__addimage__.arrayBufferToBinaryString(data)
            : data;

          dims = getJpegInfo(data);
          switch (dims.numcomponents) {
            case 1:
              colorSpace = this.color_spaces.DEVICE_GRAY;
              break;
            case 4:
              colorSpace = this.color_spaces.DEVICE_CMYK;
              break;
            case 3:
              colorSpace = this.color_spaces.DEVICE_RGB;
              break;
          }

          result = {
            data: data,
            width: dims.width,
            height: dims.height,
            colorSpace: colorSpace,
            bitsPerComponent: bpc,
            filter: filter,
            index: index,
            alias: alias
          };
        }
        return result;
      };
    })(jsPDF.API);