LCOV - code coverage report
Current view: top level - src/img - img.js (source / functions) Hit Total Coverage
Test: cov_profile.lcov Lines: 86 86 100.0 %
Date: 2021-12-16 00:47:58 Functions: 6 6 100.0 %
Branches: 10 10 100.0 %

           Branch data     Line data    Source code
       1                 :          8 : const RGB = (r, g, b) =>
       2            [ + ]:          8 :   "#" + [r, g, b].map((i) => `0${i.toString(16)}`.slice(-2)).join("");
       3            [ + ]:          8 : 
       4                 :          8 : const getme = (clr) => {
       5                 :         48 :   return clr
       6                 :         48 :     .slice(1)
       7                 :         48 :     .match(/(..)/g)
       8                 :         48 :     .map((i) => parseInt(i, 16));
       9            [ + ]:          8 : };
      10                 :          8 : 
      11                 :          8 : const mapper = (lows, highs) =>
      12                 :         28 :   (i) => {
      13            [ + ]:        428 :     return lows.reduce((memo, _value, index) => {
      14            [ + ]:       1628 :       const low = Math.min(highs[index], lows[index]);
      15                 :       1628 :       const high = Math.max(highs[index], lows[index]);
      16                 :       1628 :       const diff = high - low;
      17                 :       1628 :       return `${memo}${(low + Math.ceil(diff * i)).toString(16)}`;
      18                 :        428 :     }, "#");
      19                 :          8 :   };
      20                 :          8 : 
      21                 :          8 : const colorMapperFactory = (clrs) => {
      22                 :         12 :   const fns = clrs.map(({ start, end }) => mapper(getme(start), getme(end)));
      23            [ + ]:         12 :   return (i) => {
      24            [ + ]:        412 :     const index = Math.floor(clrs.length * i);
      25                 :        412 :     // const index = Math.floor(i * 100) % clrs.length
      26                 :        412 :     return fns[index](i);
      27                 :         12 :   };
      28                 :          8 : };
      29                 :          8 : 
      30                 :          8 : const img = (seeded, opts) => {
      31                 :         12 :   const { seed, width, height, bg, colors } = Object.assign(
      32                 :         12 :     seeded.object({
      33                 :         12 :       seed: seeded.number(),
      34                 :         12 :       width: 1000,
      35                 :         12 :       height: 1000,
      36                 :         12 :       bg: RGB(
      37                 :         12 :         seeded.number({ max: 255 }),
      38                 :         12 :         seeded.number({ max: 255 }),
      39                 :         12 :         seeded.number({ max: 255 }),
      40                 :         12 :       ),
      41                 :         12 :       colors: seeded.array({ min: 1, max: 10 }, (seeded) => ({
      42            [ + ]:         32 :         start: RGB(
      43                 :         32 :           seeded.number({ max: 255 }),
      44                 :         32 :           seeded.number({ max: 255 }),
      45                 :         32 :           seeded.number({ max: 255 }),
      46                 :         32 :         ),
      47                 :         32 :         end: RGB(
      48                 :         32 :           seeded.number({ max: 255 }),
      49                 :         32 :           seeded.number({ max: 255 }),
      50                 :         32 :           seeded.number({ max: 255 }),
      51                 :         32 :         ),
      52                 :         12 :       })),
      53                 :         12 :     }),
      54                 :         12 :     opts,
      55                 :         12 :   );
      56                 :         12 : 
      57                 :         12 :   const colorMapper = colorMapperFactory(colors);
      58                 :         12 : 
      59                 :         12 :   const parts = [];
      60                 :         12 :   for (let i = 0; i < 100; i++) {
      61            [ + ]:        412 :     const fillStyle = colorMapper(i / 100);
      62                 :        412 :     const rotate = (seed * i) % 360;
      63                 :        412 :     const [x, y, w, h] = [5 * i, 5 / seed, i * seed, i]
      64                 :        412 :       .map(Math.floor)
      65                 :        412 :       .map((i) => i % (Math.max(width, height) * 3));
      66            [ + ]:        412 :     parts.push(
      67                 :        412 :       `<rect x="${x}" y="${y}" width="${w}" height="${h}" transform="rotate(${rotate})" fill="${fillStyle}" />`,
      68                 :        412 :     );
      69                 :        412 :   }
      70                 :        412 :   const svgwrapper = (inner) =>
      71                 :        416 :     encodeURIComponent(`
      72                 :        416 :     <svg width="${width}" height="${height}" viewBox="${-1 * width} ${
      73                 :        416 :       -1 *
      74                 :        416 :       height
      75                 :        416 :     } ${width * 2} ${
      76                 :        416 :       height *
      77                 :        416 :       2
      78                 :        416 :     }" preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg">
      79                 :        416 :       <style>svg { background-color: ${bg}; }</style>
      80                 :        416 :       ${inner}
      81                 :        416 :     </svg>
      82                 :        412 :   `);
      83                 :        412 :   return `data:image/svg+xml;utf8,${svgwrapper(parts.join("\n"))}`;
      84                 :          8 : };
      85                 :          8 : 
      86                 :          4 : export default img;

Generated by: LCOV version 1.15