# All files parser-sync.js

93.33% Statements 42/45
78.57% Branches 11/14
100% Functions 8/8
93.33% Lines 42/45

Press n or j to go to the next uncovered block, b, p or k for the previous block.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109

    1x
    1x
    1x
    1x

    1x
    1x
    1x
    1x
    1x

    1x
    176x

    13x

    165x

    5x

    73x

    12x

    147x

    176x

    492x

    176x

    176x

    176x
    176x

    176x
    13x

    163x
    163x

    163x
    36x

    127x
    127x
    127x

    162x

    162x

    162x
    162x

    162x
    162x

    162x

    162x
    162x

    162x

     "use strict";

    let hasSyncZlib = true;
    let zlib = require("zlib");
    let inflateSync = require("./sync-inflate");
    Iif (!zlib.deflateSync) {
      hasSyncZlib = false;
    }
    let SyncReader = require("./sync-reader");
    let FilterSync = require("./filter-parse-sync");
    let Parser = require("./parser");
    let bitmapper = require("./bitmapper");
    let formatNormaliser = require("./format-normaliser");

    module.exports = function (buffer, options) {
      Iif (!hasSyncZlib) {
        throw new Error(
          "To use the sync capability of this library in old node versions, please pin pngjs to v2.3.0"
        );
      }

      let err;
      function handleError(_err_) {
        err = _err_;
      }

      let metaData;
      function handleMetaData(_metaData_) {
        metaData = _metaData_;
      }

      function handleTransColor(transColor) {
        metaData.transColor = transColor;
      }

      function handlePalette(palette) {
        metaData.palette = palette;
      }

      function handleSimpleTransparency() {
        metaData.alpha = true;
      }

      let gamma;
      function handleGamma(_gamma_) {
        gamma = _gamma_;
      }

      let inflateDataList = [];
      function handleInflateData(inflatedData) {
        inflateDataList.push(inflatedData);
      }

      let reader = new SyncReader(buffer);

      let parser = new Parser(options, {
        read: reader.read.bind(reader),
        error: handleError,
        metadata: handleMetaData,
        gamma: handleGamma,
        palette: handlePalette,
        transColor: handleTransColor,
        inflateData: handleInflateData,
        simpleTransparency: handleSimpleTransparency,
      });

      parser.start();
      reader.process();

      if (err) {
        throw err;
      }

      //join together the inflate datas
      let inflateData = Buffer.concat(inflateDataList);
      inflateDataList.length = 0;

      let inflatedData;
      if (metaData.interlace) {
        inflatedData = zlib.inflateSync(inflateData);
      } else {
        let rowSize =
          ((metaData.width * metaData.bpp * metaData.depth + 7) >> 3) + 1;
        let imageSize = rowSize * metaData.height;
        inflatedData = inflateSync(inflateData, {
          chunkSize: imageSize,
          maxLength: imageSize,
        });
      }
      inflateData = null;

      Iif (!inflatedData || !inflatedData.length) {
        throw new Error("bad png - invalid inflate data response");
      }

      let unfilteredData = FilterSync.process(inflatedData, metaData);
      inflateData = null;

      let bitmapData = bitmapper.dataToBitMap(unfilteredData, metaData);
      unfilteredData = null;

      let normalisedBitmapData = formatNormaliser(bitmapData, metaData);

      metaData.data = normalisedBitmapData;
      metaData.gamma = gamma || 0;

      return metaData;
    };