WIP - add extractor, generate snippet_data
This commit is contained in:
7
node_modules/potrace/.editorconfig
generated
vendored
Normal file
7
node_modules/potrace/.editorconfig
generated
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
end_of_line = lf
|
||||
insert_final_newline = false
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
6
node_modules/potrace/.travis.yml
generated
vendored
Normal file
6
node_modules/potrace/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- "0.12"
|
||||
- "4"
|
||||
- "6"
|
||||
sudo: false
|
||||
339
node_modules/potrace/LICENSE
generated
vendored
Normal file
339
node_modules/potrace/LICENSE
generated
vendored
Normal file
@ -0,0 +1,339 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
{description}
|
||||
Copyright (C) {year} {fullname}
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
{signature of Ty Coon}, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
||||
182
node_modules/potrace/README.md
generated
vendored
Normal file
182
node_modules/potrace/README.md
generated
vendored
Normal file
@ -0,0 +1,182 @@
|
||||
# node-potrace
|
||||
A NodeJS-compatible fork of [Potrace in JavaScript][potrace-by-kilobtye] with some additions, which is in turn a port of [the original Potrace][potrace] — a tool for tracing bitmaps.
|
||||
|
||||
## Example and demo
|
||||
|
||||
| **Original image** | **Potrace output** | **Posterized output** |
|
||||
|---------------------------|------------------------------|-----------------------------------------|
|
||||
|  |  |  |
|
||||
|
||||
(Example image inherited from [online demo of the browser version][potrace-js-demo])
|
||||
|
||||
## Usage
|
||||
|
||||
Install
|
||||
|
||||
```sh
|
||||
npm install potrace
|
||||
```
|
||||
|
||||
Basic usage
|
||||
|
||||
```js
|
||||
var potrace = require('potrace'),
|
||||
fs = require('fs');
|
||||
|
||||
potrace.trace('./path/to/image.png', function(err, svg) {
|
||||
if (err) throw err;
|
||||
fs.writeFileSync('./output.svg', svg);
|
||||
});
|
||||
```
|
||||
|
||||
You can also provide a configuration object as a second argument.
|
||||
|
||||
```js
|
||||
var params = {
|
||||
background: '#49ffd2',
|
||||
color: 'blue',
|
||||
threshold: 120
|
||||
};
|
||||
|
||||
potrace.trace('./path/to/image.png', params, function(err, svg) {
|
||||
/*...*/
|
||||
});
|
||||
```
|
||||
|
||||
If you want to run Potrace algorithm multiple times on the same image with different threshold setting and merge results together in a single file - `posterize` method does exactly that.
|
||||
|
||||
```js
|
||||
potrace.posterize('./path/to/image.png', { threshold: 180, steps: 4 }, function(err, svg) {
|
||||
/*...*/
|
||||
});
|
||||
|
||||
// or if you know exactly where you want to break it on different levels
|
||||
|
||||
potrace.posterize('./path/to/image.png', { steps: [40, 85, 135, 180] }, function(err, svg) {
|
||||
/*...*/
|
||||
});
|
||||
```
|
||||
|
||||
### Advanced usage and configuration
|
||||
|
||||
Both `trace` and `posterize` methods return instances of `Potrace` and `Posterizer` classes respectively to a callback function as third argument.
|
||||
|
||||
You can also instantiate these classes directly:
|
||||
|
||||
```js
|
||||
var potrace = require('potrace');
|
||||
|
||||
// Tracing
|
||||
|
||||
var trace = new potrace.Potrace();
|
||||
|
||||
// You can also pass configuration object to the constructor
|
||||
trace.setParameters({
|
||||
threshold: 128,
|
||||
color: '#880000'
|
||||
});
|
||||
|
||||
trace.loadImage('path/to/image.png', function(err) {
|
||||
if (err) throw err;
|
||||
|
||||
trace.getSVG(); // returns SVG document contents
|
||||
trace.getPathTag(); // will return just <path> tag
|
||||
trace.getSymbol('traced-image'); // will return <symbol> tag with given ID
|
||||
});
|
||||
|
||||
// Posterization
|
||||
|
||||
var posterizer = new potrace.Posterize();
|
||||
|
||||
posterizer.loadImage('path/to/image.png', function(err) {
|
||||
if (err) throw err;
|
||||
|
||||
posterizer.setParameter({
|
||||
color: '#ccc',
|
||||
background: '#222',
|
||||
steps: 3,
|
||||
threshold: 200,
|
||||
fillStrategy: potrace.Posterize.FILL_MEAN
|
||||
});
|
||||
|
||||
posterizer.getSVG();
|
||||
// or
|
||||
posterizer.getSymbol('posterized-image');
|
||||
});
|
||||
```
|
||||
|
||||
Callback function provided to `loadImage` methods will be executed in context of the `Potrace`/`Posterizer` instance, so if it doesn't go against your code style - you can just do
|
||||
|
||||
```js
|
||||
new potrace.Potrace()
|
||||
.loadImage('path/to/image.bmp', function() {
|
||||
if (err) throw err;
|
||||
this.getSymbol('foo');
|
||||
});
|
||||
```
|
||||
|
||||
[Jimp module][jimp] is used on the back end, so first argument accepted by `loadImage` method could be anything Jimp can read: a `Buffer`, local path or a url string. Supported formats are: PNG, JPEG or BMP. It also could be a Jimp instance (provided bitmap is not modified)
|
||||
|
||||
### Parameters
|
||||
|
||||
`Potrace` class expects following parameters:
|
||||
|
||||
- **turnPolicy** - how to resolve ambiguities in path decomposition. Possible values are exported as constants: `TURNPOLICY_BLACK`, `TURNPOLICY_WHITE`, `TURNPOLICY_LEFT`, `TURNPOLICY_RIGHT`, `TURNPOLICY_MINORITY`, `TURNPOLICY_MAJORITY`. Refer to [this document][potrace-algorithm] for more information (page 4)
|
||||
(default: `TURNPOLICY_MINORITY`)
|
||||
- **turdSize** - suppress speckles of up to this size
|
||||
(default: 2)
|
||||
- **alphaMax** - corner threshold parameter
|
||||
(default: 1)
|
||||
- **optCurve** - curve optimization
|
||||
(default: true)
|
||||
- **optTolerance** - curve optimization tolerance
|
||||
(default: 0.2)
|
||||
- **threshold** - threshold below which color is considered black.
|
||||
Should be a number in range 0..255 or `THRESHOLD_AUTO` in which case threshold will be selected automatically using [Algorithm For Multilevel Thresholding][multilevel-thresholding]
|
||||
(default: `THRESHOLD_AUTO`)
|
||||
- **blackOnWhite** - specifies colors by which side from threshold should be turned into vector shape
|
||||
(default: `true`)
|
||||
- **color** - Fill color. Will be ignored when exporting as \<symbol\>. (default: `COLOR_AUTO`, which means black or white, depending on `blackOnWhite` property)
|
||||
- **background** - Background color. Will be ignored when exporting as \<symbol\>. By default is not present (`COLOR_TRANSPARENT`)
|
||||
|
||||
---------------
|
||||
|
||||
`Posterizer` class has same methods as `Potrace`, in exception of `.getPathTag()`.
|
||||
Configuration object is extended with following properties:
|
||||
|
||||
- **fillStrategy** - determines how fill color for each layer should be selected. Possible values are exported as constants:
|
||||
- `FILL_DOMINANT` - most frequent color in range (used by default),
|
||||
- `FILL_MEAN` - arithmetic mean (average),
|
||||
- `FILL_MEDIAN` - median color,
|
||||
- `FILL_SPREAD` - ignores color information of the image and just spreads colors equally in range 0..\<threshold\> (or \<threshold\>..255 if `blackOnWhite` is set to `false`),
|
||||
- **rangeDistribution** - how color stops for each layer should be selected. Ignored if `steps` is an array. Possible values are:
|
||||
- `RANGES_AUTO` - Performs automatic thresholding (using [Algorithm For Multilevel Thresholding][multilevel-thresholding]). Preferable method for already posterized sources, but takes long time to calculate 5 or more thresholds (exponential time complexity)
|
||||
*(used by default)*
|
||||
- `RANGES_EQUAL` - Ignores color information of the image and breaks available color space into equal chunks
|
||||
- **steps** - Specifies desired number of layers in resulting image. If a number provided - thresholds for each layer will be automatically calculated according to `rangeDistribution` parameter. If an array provided it expected to be an array with precomputed thresholds for each layer (in range 0..255)
|
||||
(default: `STEPS_AUTO` which will result in `3` or `4`, depending on `threshold` value)
|
||||
- **threshold** - Breaks image into foreground and background (and only foreground being broken into desired number of layers). Basically when provided it becomes a threshold for last (least opaque) layer and then `steps - 1` intermediate thresholds calculated. If **steps** is an array of thresholds and every value from the array is lower (or larger if **blackOnWhite** parameter set to `false`) than threshold - threshold will be added to the array, otherwise just ignored.
|
||||
(default: `Potrace.THRESHOLD_AUTO`)
|
||||
- *all other parameters that Potrace class accepts*
|
||||
|
||||
**Notes:**
|
||||
|
||||
- When number of `steps` is greater than 10 - an extra layer could be added to ensure presence of darkest/brightest colors if needed to ensure presence of probably-important-at-this-point details like shadows or line art.
|
||||
- With big number of layers produced image will be looking brighter overall than original due to math error at the rendering phase because of how layers are composited.
|
||||
- With default configuration `steps`, `threshold` and `rangeDistribution` settings all set to auto, resulting in a 4 thresholds/color stops being calculated with Multilevel Thresholding algorithm mentioned above. Calculation of 4 thresholds takes 3-5 seconds on average laptop. You may want to explicitly limit number of `steps` to 3 to moderately improve processing speed.
|
||||
|
||||
## Thanks to
|
||||
|
||||
- Peter Selinger for [original Potrace tool and algorithm][potrace]
|
||||
- @kilobtye for original [javascript port][potrace-by-kilobtye]
|
||||
|
||||
## License
|
||||
|
||||
The GNU General Public License version 2 (GPLv2). Please see [License File](LICENSE) for more information.
|
||||
|
||||
[potrace]: http://potrace.sourceforge.net/
|
||||
[potrace-algorithm]: http://potrace.sourceforge.net/potrace.pdf
|
||||
[multilevel-thresholding]: http://www.iis.sinica.edu.tw/page/jise/2001/200109_01.pdf
|
||||
[potrace-by-kilobtye]: https://github.com/kilobtye/potrace
|
||||
[potrace-js-demo]: http://kilobtye.github.io/potrace/
|
||||
[jimp]: https://github.com/oliver-moran/jimp
|
||||
449
node_modules/potrace/lib/Posterizer.js
generated
vendored
Normal file
449
node_modules/potrace/lib/Posterizer.js
generated
vendored
Normal file
@ -0,0 +1,449 @@
|
||||
'use strict';
|
||||
|
||||
var Potrace = require('./Potrace');
|
||||
var utils = require('./utils');
|
||||
|
||||
/**
|
||||
* Takes multiple samples using {@link Potrace} with different threshold
|
||||
* settings and combines output into a single file.
|
||||
*
|
||||
* @param {Posterizer~Options} [options]
|
||||
* @constructor
|
||||
*/
|
||||
function Posterizer(options) {
|
||||
this._potrace = new Potrace();
|
||||
|
||||
this._calculatedThreshold = null;
|
||||
|
||||
this._params = {
|
||||
threshold: Potrace.THRESHOLD_AUTO,
|
||||
blackOnWhite: true,
|
||||
steps: Posterizer.STEPS_AUTO,
|
||||
background: Potrace.COLOR_TRANSPARENT,
|
||||
fillStrategy: Posterizer.FILL_DOMINANT,
|
||||
rangeDistribution: Posterizer.RANGES_AUTO
|
||||
};
|
||||
|
||||
if (options) {
|
||||
this.setParameters(options);
|
||||
}
|
||||
}
|
||||
|
||||
// Inherit constants from Potrace class
|
||||
for (var key in Potrace) {
|
||||
if (Object.prototype.hasOwnProperty.call(Potrace, key) && key === key.toUpperCase()) {
|
||||
Posterizer[key] = Potrace[key];
|
||||
}
|
||||
}
|
||||
|
||||
Posterizer.STEPS_AUTO = -1;
|
||||
Posterizer.FILL_SPREAD = 'spread';
|
||||
Posterizer.FILL_DOMINANT = 'dominant';
|
||||
Posterizer.FILL_MEDIAN = 'median';
|
||||
Posterizer.FILL_MEAN = 'mean';
|
||||
|
||||
Posterizer.RANGES_AUTO = 'auto';
|
||||
Posterizer.RANGES_EQUAL = 'equal';
|
||||
|
||||
Posterizer.prototype = {
|
||||
/**
|
||||
* Fine tuning to color ranges.
|
||||
*
|
||||
* If last range (featuring most saturated color) is larger than 10% of color space (25 units)
|
||||
* then we want to add another color stop, that hopefully will include darkest pixels, improving presence of
|
||||
* shadows and line art
|
||||
*
|
||||
* @param ranges
|
||||
* @private
|
||||
*/
|
||||
_addExtraColorStop: function(ranges) {
|
||||
var blackOnWhite = this._params.blackOnWhite;
|
||||
var lastColorStop = ranges[ranges.length - 1];
|
||||
var lastRangeFrom = blackOnWhite ? 0 : lastColorStop.value;
|
||||
var lastRangeTo = blackOnWhite ? lastColorStop.value : 255;
|
||||
|
||||
if (lastRangeTo - lastRangeFrom > 25 && lastColorStop.colorIntensity !== 1) {
|
||||
var histogram = this._getImageHistogram();
|
||||
var levels = histogram.getStats(lastRangeFrom, lastRangeTo).levels;
|
||||
|
||||
var newColorStop = levels.mean + levels.stdDev <= 25 ? levels.mean + levels.stdDev
|
||||
: levels.mean - levels.stdDev <= 25 ? levels.mean - levels.stdDev
|
||||
: 25;
|
||||
|
||||
var newStats = (blackOnWhite ? histogram.getStats(0, newColorStop) : histogram.getStats(newColorStop, 255));
|
||||
var color = newStats.levels.mean;
|
||||
|
||||
ranges.push({
|
||||
value: Math.abs((blackOnWhite ? 0 : 255) - newColorStop),
|
||||
colorIntensity: isNaN(color) ? 0 : ((blackOnWhite ? 255 - color : color) / 255)
|
||||
});
|
||||
}
|
||||
|
||||
return ranges;
|
||||
},
|
||||
|
||||
|
||||
/**
|
||||
* Calculates color intensity for each element of numeric array
|
||||
*
|
||||
* @param {number[]} colorStops
|
||||
* @returns {{ levels: number, colorIntensity: number }[]}
|
||||
* @private
|
||||
*/
|
||||
_calcColorIntensity: function(colorStops) {
|
||||
var blackOnWhite = this._params.blackOnWhite;
|
||||
var colorSelectionStrat = this._params.fillStrategy;
|
||||
var histogram = colorSelectionStrat !== Posterizer.FILL_SPREAD ? this._getImageHistogram() : null;
|
||||
var fullRange = Math.abs(this._paramThreshold() - (blackOnWhite ? 0 : 255));
|
||||
|
||||
return colorStops.map(function(threshold, index) {
|
||||
var nextValue = index + 1 === colorStops.length ? (blackOnWhite ? -1 : 256) : colorStops[index + 1];
|
||||
var rangeStart = Math.round(blackOnWhite ? nextValue + 1 : threshold);
|
||||
var rangeEnd = Math.round(blackOnWhite ? threshold : nextValue - 1);
|
||||
var factor = index / (colorStops.length - 1);
|
||||
var intervalSize = rangeEnd - rangeStart;
|
||||
var stats = histogram.getStats(rangeStart, rangeEnd);
|
||||
var color = -1;
|
||||
|
||||
if (stats.pixels === 0) {
|
||||
return {
|
||||
value: threshold,
|
||||
colorIntensity: 0
|
||||
};
|
||||
}
|
||||
|
||||
switch (colorSelectionStrat) {
|
||||
case Posterizer.FILL_SPREAD:
|
||||
// We want it to be 0 (255 when white on black) at the most saturated end, so...
|
||||
color = (blackOnWhite ? rangeStart : rangeEnd)
|
||||
+ (blackOnWhite ? 1 : -1) * intervalSize * Math.max(0.5, fullRange / 255) * factor;
|
||||
break;
|
||||
case Posterizer.FILL_DOMINANT:
|
||||
color = histogram.getDominantColor(rangeStart, rangeEnd, utils.clamp(intervalSize, 1, 5));
|
||||
break;
|
||||
case Posterizer.FILL_MEAN:
|
||||
color = stats.levels.mean;
|
||||
break;
|
||||
case Posterizer.FILL_MEDIAN:
|
||||
color = stats.levels.median;
|
||||
break;
|
||||
}
|
||||
|
||||
// We don't want colors to be too close to each other, so we introduce some spacing in between
|
||||
if (index !== 0) {
|
||||
color = blackOnWhite
|
||||
? utils.clamp(color, rangeStart, rangeEnd - Math.round(intervalSize * 0.1))
|
||||
: utils.clamp(color, rangeStart + Math.round(intervalSize * 0.1), rangeEnd);
|
||||
}
|
||||
|
||||
return {
|
||||
value: threshold,
|
||||
colorIntensity: color === -1 ? 0 : ((blackOnWhite ? 255 - color : color) / 255)
|
||||
};
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* @returns {Histogram}
|
||||
* @private
|
||||
*/
|
||||
_getImageHistogram: function() {
|
||||
return this._potrace._luminanceData.histogram();
|
||||
},
|
||||
|
||||
/**
|
||||
* Processes threshold, steps and rangeDistribution parameters and returns normalized array of color stops
|
||||
* @returns {*}
|
||||
* @private
|
||||
*/
|
||||
_getRanges: function() {
|
||||
var steps = this._paramSteps();
|
||||
|
||||
if (!Array.isArray(steps)) {
|
||||
return this._params.rangeDistribution === Posterizer.RANGES_AUTO
|
||||
? this._getRangesAuto()
|
||||
: this._getRangesEquallyDistributed();
|
||||
}
|
||||
|
||||
// Steps is array of thresholds and we want to preprocess it
|
||||
|
||||
var colorStops = [];
|
||||
var threshold = this._paramThreshold();
|
||||
var lookingForDarkPixels = this._params.blackOnWhite;
|
||||
|
||||
steps.forEach(function(item) {
|
||||
if (colorStops.indexOf(item) === -1 && utils.between(item, 0, 255)) {
|
||||
colorStops.push(item);
|
||||
}
|
||||
});
|
||||
|
||||
if (!colorStops.length) {
|
||||
colorStops.push(threshold);
|
||||
}
|
||||
|
||||
colorStops = colorStops.sort(function (a, b) {
|
||||
return a < b === lookingForDarkPixels ? 1 : -1;
|
||||
});
|
||||
|
||||
if (lookingForDarkPixels && colorStops[0] < threshold) {
|
||||
colorStops.unshift(threshold);
|
||||
} else if (!lookingForDarkPixels && colorStops[colorStops.length - 1] < threshold) {
|
||||
colorStops.push(threshold);
|
||||
}
|
||||
|
||||
return this._calcColorIntensity(colorStops);
|
||||
},
|
||||
|
||||
/**
|
||||
* Calculates given (or lower) number of thresholds using automatic thresholding algorithm
|
||||
* @returns {*}
|
||||
* @private
|
||||
*/
|
||||
_getRangesAuto: function() {
|
||||
var histogram = this._getImageHistogram();
|
||||
var steps = this._paramSteps(true);
|
||||
var colorStops;
|
||||
|
||||
if (this._params.threshold === Potrace.THRESHOLD_AUTO) {
|
||||
colorStops = histogram.multilevelThresholding(steps);
|
||||
} else {
|
||||
var threshold = this._paramThreshold();
|
||||
|
||||
colorStops = this._params.blackOnWhite
|
||||
? histogram.multilevelThresholding(steps - 1, 0, threshold)
|
||||
: histogram.multilevelThresholding(steps - 1, threshold, 255);
|
||||
|
||||
if (this._params.blackOnWhite) {
|
||||
colorStops.push(threshold);
|
||||
} else {
|
||||
colorStops.unshift(threshold);
|
||||
}
|
||||
}
|
||||
|
||||
if (this._params.blackOnWhite) {
|
||||
colorStops = colorStops.reverse();
|
||||
}
|
||||
|
||||
return this._calcColorIntensity(colorStops);
|
||||
},
|
||||
|
||||
/**
|
||||
* Calculates color stops and color representing each segment, returning them
|
||||
* from least to most intense color (black or white, depending on blackOnWhite parameter)
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
_getRangesEquallyDistributed: function() {
|
||||
var blackOnWhite = this._params.blackOnWhite;
|
||||
var colorsToThreshold = blackOnWhite ? this._paramThreshold() : 255 - this._paramThreshold();
|
||||
var steps = this._paramSteps();
|
||||
|
||||
var stepSize = colorsToThreshold / steps;
|
||||
var colorStops = [];
|
||||
var i = steps - 1,
|
||||
factor,
|
||||
threshold;
|
||||
|
||||
while (i >= 0) {
|
||||
factor = i / (steps - 1);
|
||||
threshold = Math.min(colorsToThreshold, (i + 1) * stepSize);
|
||||
threshold = blackOnWhite ? threshold : 255 - threshold;
|
||||
i--;
|
||||
|
||||
colorStops.push(threshold);
|
||||
}
|
||||
|
||||
return this._calcColorIntensity(colorStops);
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns valid steps value
|
||||
* @param {Boolean} [count=false]
|
||||
* @returns {number|number[]}
|
||||
* @private
|
||||
*/
|
||||
_paramSteps: function(count) {
|
||||
var steps = this._params.steps;
|
||||
|
||||
if (Array.isArray(steps)) {
|
||||
return count ? steps.length : steps;
|
||||
}
|
||||
|
||||
if (steps === Posterizer.STEPS_AUTO && this._params.threshold === Potrace.THRESHOLD_AUTO) {
|
||||
return 4;
|
||||
}
|
||||
|
||||
var blackOnWhite = this._params.blackOnWhite;
|
||||
var colorsCount = blackOnWhite ? this._paramThreshold() : 255 - this._paramThreshold();
|
||||
|
||||
return steps === Posterizer.STEPS_AUTO
|
||||
? (colorsCount > 200 ? 4 : 3)
|
||||
: Math.min(colorsCount, Math.max(2, steps));
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns valid threshold value
|
||||
* @returns {number}
|
||||
* @private
|
||||
*/
|
||||
_paramThreshold: function() {
|
||||
if (this._calculatedThreshold !== null) {
|
||||
return this._calculatedThreshold;
|
||||
}
|
||||
|
||||
if (this._params.threshold !== Potrace.THRESHOLD_AUTO) {
|
||||
this._calculatedThreshold = this._params.threshold;
|
||||
return this._calculatedThreshold;
|
||||
}
|
||||
|
||||
var twoThresholds = this._getImageHistogram().multilevelThresholding(2);
|
||||
this._calculatedThreshold = this._params.blackOnWhite ? twoThresholds[1] : twoThresholds[0];
|
||||
this._calculatedThreshold = this._calculatedThreshold || 128;
|
||||
|
||||
return this._calculatedThreshold;
|
||||
},
|
||||
|
||||
/**
|
||||
* Running potrace on the image multiple times with different thresholds and returns an array
|
||||
* of path tags
|
||||
*
|
||||
* @param {Boolean} [noFillColor]
|
||||
* @returns {string[]}
|
||||
* @private
|
||||
*/
|
||||
_pathTags: function(noFillColor) {
|
||||
var ranges = this._getRanges();
|
||||
var potrace = this._potrace;
|
||||
var blackOnWhite = this._params.blackOnWhite;
|
||||
|
||||
if (ranges.length >= 10) {
|
||||
ranges = this._addExtraColorStop(ranges);
|
||||
}
|
||||
|
||||
potrace.setParameters({ blackOnWhite: blackOnWhite });
|
||||
|
||||
var actualPrevLayersOpacity = 0;
|
||||
|
||||
return ranges.map(function(colorStop) {
|
||||
var thisLayerOpacity = colorStop.colorIntensity;
|
||||
|
||||
if (thisLayerOpacity === 0) {
|
||||
return '';
|
||||
}
|
||||
|
||||
// NOTE: With big number of layers (something like 70) there will be noticeable math error on rendering side.
|
||||
// In Chromium at least image will end up looking brighter overall compared to the same layers painted in solid colors.
|
||||
// However it works fine with sane number of layers, and it's not like we can do much about it.
|
||||
|
||||
var calculatedOpacity = (!actualPrevLayersOpacity || thisLayerOpacity === 1)
|
||||
? thisLayerOpacity
|
||||
: ((actualPrevLayersOpacity - thisLayerOpacity) / (actualPrevLayersOpacity - 1));
|
||||
|
||||
calculatedOpacity = utils.clamp(parseFloat(calculatedOpacity.toFixed(3)), 0, 1);
|
||||
actualPrevLayersOpacity = actualPrevLayersOpacity + (1 - actualPrevLayersOpacity) * calculatedOpacity;
|
||||
|
||||
potrace.setParameters({ threshold: colorStop.value });
|
||||
|
||||
var element = noFillColor ? potrace.getPathTag('') : potrace.getPathTag();
|
||||
element = utils.setHtmlAttr(element, 'fill-opacity', calculatedOpacity.toFixed(3));
|
||||
|
||||
var canBeIgnored = calculatedOpacity === 0 || element.indexOf(' d=""') !== -1;
|
||||
|
||||
// var c = Math.round(Math.abs((blackOnWhite ? 255 : 0) - 255 * thisLayerOpacity));
|
||||
// element = utils.setHtmlAttr(element, 'fill', 'rgb('+c+', '+c+', '+c+')');
|
||||
// element = utils.setHtmlAttr(element, 'fill-opacity', '');
|
||||
|
||||
return canBeIgnored ? '' : element;
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Loads image.
|
||||
*
|
||||
* @param {string|Buffer|Jimp} target Image source. Could be anything that {@link Jimp} can read (buffer, local path or url). Supported formats are: PNG, JPEG or BMP
|
||||
* @param {Function} callback
|
||||
*/
|
||||
loadImage: function(target, callback) {
|
||||
var self = this;
|
||||
|
||||
this._potrace.loadImage(target, function(err) {
|
||||
self._calculatedThreshold = null;
|
||||
callback.call(self, err);
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Sets parameters. Accepts same object as {Potrace}
|
||||
*
|
||||
* @param {Posterizer~Options} params
|
||||
*/
|
||||
setParameters: function(params) {
|
||||
if (!params) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._potrace.setParameters(params);
|
||||
|
||||
if (params.steps && !Array.isArray(params.steps) && (!utils.isNumber(params.steps) || !utils.between(params.steps, 1, 255))) {
|
||||
throw new Error('Bad \'steps\' value');
|
||||
}
|
||||
|
||||
for (var key in this._params) {
|
||||
if (this._params.hasOwnProperty(key) && params.hasOwnProperty(key)) {
|
||||
this._params[key] = params[key];
|
||||
}
|
||||
}
|
||||
|
||||
this._calculatedThreshold = null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns image as <symbol> tag. Always has viewBox specified
|
||||
*
|
||||
* @param {string} id
|
||||
*/
|
||||
getSymbol: function(id) {
|
||||
var width = this._potrace._luminanceData.width;
|
||||
var height = this._potrace._luminanceData.height;
|
||||
var paths = this._pathTags(true);
|
||||
|
||||
return '<symbol viewBox="0 0 ' + width + ' ' + height + '" id="' + id + '">' +
|
||||
paths.join('') +
|
||||
'</symbol>';
|
||||
},
|
||||
|
||||
/**
|
||||
* Generates SVG image
|
||||
* @returns {String}
|
||||
*/
|
||||
getSVG: function() {
|
||||
var width = this._potrace._luminanceData.width,
|
||||
height = this._potrace._luminanceData.height;
|
||||
|
||||
var tags = this._pathTags(false);
|
||||
|
||||
var svg = '<svg xmlns="http://www.w3.org/2000/svg" ' +
|
||||
'width="' + width + '" ' +
|
||||
'height="' + height + '" ' +
|
||||
'viewBox="0 0 ' + width + ' ' + height + '" ' +
|
||||
'version="1.1">\n\t' +
|
||||
(this._params.background !== Potrace.COLOR_TRANSPARENT
|
||||
? '<rect x="0" y="0" width="100%" height="100%" fill="' + this._params.background + '" />\n\t'
|
||||
: '') +
|
||||
tags.join('\n\t') +
|
||||
'\n</svg>';
|
||||
|
||||
return svg.replace(/\n(?:\t*\n)+(\t*)/g, '\n$1');
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = Posterizer;
|
||||
|
||||
/**
|
||||
* Posterizer options
|
||||
*
|
||||
* @typedef {Potrace~Options} Posterizer~Options
|
||||
* @property {Number} [steps] - Number of samples that needs to be taken (and number of layers in SVG). (default: Posterizer.STEPS_AUTO, which most likely will result in 3, sometimes 4)
|
||||
* @property {*} [fillStrategy] - How to select fill color for color ranges - equally spread or dominant. (default: Posterizer.FILL_DOMINANT)
|
||||
* @property {*} [rangeDistribution] - How to choose thresholds in-between - after equal intervals or automatically balanced. (default: Posterizer.RANGES_AUTO)
|
||||
*/
|
||||
1164
node_modules/potrace/lib/Potrace.js
generated
vendored
Normal file
1164
node_modules/potrace/lib/Potrace.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
69
node_modules/potrace/lib/index.js
generated
vendored
Normal file
69
node_modules/potrace/lib/index.js
generated
vendored
Normal file
@ -0,0 +1,69 @@
|
||||
'use strict';
|
||||
|
||||
var Potrace = require('./Potrace');
|
||||
var Posterizer = require('./Posterizer');
|
||||
|
||||
/**
|
||||
* Wrapper for Potrace that simplifies use down to one function call
|
||||
*
|
||||
* @param {string|Buffer|Jimp} file Source image, file path or {@link Jimp} instance
|
||||
* @param {Potrace~Options} [options]
|
||||
* @param {traceCallback} cb Callback function. Accepts 3 arguments: error, svg content and instance of {@link Potrace} (so it could be reused with different set of parameters)
|
||||
*/
|
||||
function trace(file, options, cb) {
|
||||
if (arguments.length === 2) {
|
||||
cb = options;
|
||||
options = {};
|
||||
}
|
||||
|
||||
var potrace = new Potrace(options);
|
||||
|
||||
potrace.loadImage(file, function(err) {
|
||||
if (err) { return cb(err); }
|
||||
cb(null, potrace.getSVG(), potrace);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper for Potrace that simplifies use down to one function call
|
||||
*
|
||||
* @param {string|Buffer|Jimp} file Source image, file path or {@link Jimp} instance
|
||||
* @param {Posterizer~Options} [options]
|
||||
* @param {posterizeCallback} cb Callback function. Accepts 3 arguments: error, svg content and instance of {@link Potrace} (so it could be reused with different set of parameters)
|
||||
*/
|
||||
function posterize(file, options, cb) {
|
||||
if (arguments.length === 2) {
|
||||
cb = options;
|
||||
options = {};
|
||||
}
|
||||
|
||||
var posterizer = new Posterizer(options);
|
||||
|
||||
posterizer.loadImage(file, function(err) {
|
||||
if (err) { return cb(err); }
|
||||
cb(null, posterizer.getSVG(), posterizer);
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
trace: trace,
|
||||
posterize: posterize,
|
||||
Potrace: Potrace,
|
||||
Posterizer: Posterizer
|
||||
};
|
||||
|
||||
/**
|
||||
* Callback for trace method
|
||||
* @callback traceCallback
|
||||
* @param {Error|null} err
|
||||
* @param {string} svg SVG document contents
|
||||
* @param {Potrace} [instance] Potrace class instance
|
||||
*/
|
||||
|
||||
/**
|
||||
* Callback for posterize method
|
||||
* @callback posterizeCallback
|
||||
* @param {Error|null} err
|
||||
* @param {string} svg SVG document contents
|
||||
* @param {Posterizer} [instance] Posterizer class instance
|
||||
*/
|
||||
111
node_modules/potrace/lib/types/Bitmap.js
generated
vendored
Normal file
111
node_modules/potrace/lib/types/Bitmap.js
generated
vendored
Normal file
@ -0,0 +1,111 @@
|
||||
'use strict';
|
||||
|
||||
var Point = require('./Point');
|
||||
var utils = require('../utils');
|
||||
var Histogram;
|
||||
|
||||
/**
|
||||
* Represents a bitmap where each pixel can be a number in range of 0..255
|
||||
* Used internally to store luminance data.
|
||||
*
|
||||
* @param {Number} w
|
||||
* @param {Number} h
|
||||
* @constructor
|
||||
*/
|
||||
function Bitmap(w, h) {
|
||||
this._histogram = null;
|
||||
|
||||
this.width = w;
|
||||
this.height = h;
|
||||
this.size = w * h;
|
||||
this.arrayBuffer = new ArrayBuffer(this.size);
|
||||
this.data = new Uint8Array(this.arrayBuffer);
|
||||
}
|
||||
|
||||
module.exports = Bitmap;
|
||||
Histogram = require('./Histogram');
|
||||
|
||||
Bitmap.prototype = {
|
||||
/**
|
||||
* Returns pixel value
|
||||
*
|
||||
* @param {Number|Point} x - index, point or x
|
||||
* @param {Number} [y]
|
||||
*/
|
||||
getValueAt: function(x, y) {
|
||||
var index = (typeof x === 'number' && typeof y !== 'number') ? x : this.pointToIndex(x, y);
|
||||
return this.data[index];
|
||||
},
|
||||
|
||||
/**
|
||||
* Converts {@link Point} to index value
|
||||
*
|
||||
* @param {Number} index
|
||||
* @returns {Point}
|
||||
*/
|
||||
indexToPoint: function(index) {
|
||||
var point = new Point();
|
||||
|
||||
if (utils.between(index, 0, this.size)) {
|
||||
point.y = Math.floor(index / this.width);
|
||||
point.x = index - point.y * this.width;
|
||||
} else {
|
||||
point.x = -1;
|
||||
point.y = -1;
|
||||
}
|
||||
|
||||
return point;
|
||||
},
|
||||
|
||||
/**
|
||||
* Calculates index for point or coordinate pair
|
||||
*
|
||||
* @param {Number|Point} pointOrX
|
||||
* @param {Number} [y]
|
||||
* @returns {Number}
|
||||
*/
|
||||
pointToIndex: function(pointOrX, y) {
|
||||
var _x = pointOrX,
|
||||
_y = y;
|
||||
|
||||
if (pointOrX instanceof Point) {
|
||||
_x = pointOrX.x;
|
||||
_y = pointOrX.y;
|
||||
}
|
||||
|
||||
if (!utils.between(_x, 0, this.width) || !utils.between(_y, 0, this.height)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return this.width * _y + _x;
|
||||
},
|
||||
|
||||
/**
|
||||
* Makes a copy of current bitmap
|
||||
*
|
||||
* @param {Function} [iterator] optional callback, used for processing pixel value. Accepted arguments: value, index
|
||||
* @returns {Bitmap}
|
||||
*/
|
||||
copy: function(iterator) {
|
||||
var bm = new Bitmap(this.width, this.height),
|
||||
iteratorPresent = typeof iterator === 'function',
|
||||
i;
|
||||
|
||||
for (i = 0; i < this.size; i++) {
|
||||
bm.data[i] = iteratorPresent ? iterator(this.data[i], i) : this.data[i];
|
||||
}
|
||||
|
||||
return bm;
|
||||
},
|
||||
|
||||
histogram: function() {
|
||||
var Histogram = require('./Histogram');
|
||||
|
||||
if (this._histogram) {
|
||||
return this._histogram;
|
||||
}
|
||||
|
||||
this._histogram = new Histogram(this);
|
||||
return this._histogram;
|
||||
}
|
||||
};
|
||||
21
node_modules/potrace/lib/types/Curve.js
generated
vendored
Normal file
21
node_modules/potrace/lib/types/Curve.js
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Curve type
|
||||
*
|
||||
* @param n
|
||||
* @constructor
|
||||
* @protected
|
||||
*/
|
||||
function Curve(n) {
|
||||
this.n = n;
|
||||
this.tag = new Array(n);
|
||||
this.c = new Array(n * 3);
|
||||
this.alphaCurve = 0;
|
||||
this.vertex = new Array(n);
|
||||
this.alpha = new Array(n);
|
||||
this.alpha0 = new Array(n);
|
||||
this.beta = new Array(n);
|
||||
}
|
||||
|
||||
module.exports = Curve;
|
||||
425
node_modules/potrace/lib/types/Histogram.js
generated
vendored
Normal file
425
node_modules/potrace/lib/types/Histogram.js
generated
vendored
Normal file
@ -0,0 +1,425 @@
|
||||
"use strict";
|
||||
|
||||
// Histogram
|
||||
|
||||
var utils = require('../utils');
|
||||
var Jimp = null; try { Jimp = require('jimp'); } catch(e) {}
|
||||
var Bitmap = require('./Bitmap');
|
||||
|
||||
var COLOR_DEPTH = 256;
|
||||
var COLOR_RANGE_END = COLOR_DEPTH - 1;
|
||||
|
||||
/**
|
||||
* Calculates array index for pair of indexes. We multiple column (x) by 256 and then add row to it,
|
||||
* this way `(index(i, j) + 1) === index(i, j + i)` thus we can reuse `index(i, j)` we once calculated
|
||||
*
|
||||
* Note: this is different from how indexes calculated in {@link Bitmap} class, keep it in mind.
|
||||
*
|
||||
* @param x
|
||||
* @param y
|
||||
* @returns {*}
|
||||
* @private
|
||||
*/
|
||||
function index(x, y) {
|
||||
return COLOR_DEPTH * x + y;
|
||||
}
|
||||
|
||||
function normalizeMinMax(levelMin, levelMax) {
|
||||
/**
|
||||
* Shared parameter normalization for methods 'multilevelThresholding', 'autoThreshold', 'getDominantColor' and 'getStats'
|
||||
*
|
||||
* @param levelMin
|
||||
* @param levelMax
|
||||
* @returns {number[]}
|
||||
* @private
|
||||
*/
|
||||
levelMin = typeof levelMin === 'number' ? utils.clamp(Math.round(levelMin), 0, COLOR_RANGE_END) : 0;
|
||||
levelMax = typeof levelMax === 'number' ? utils.clamp(Math.round(levelMax), 0, COLOR_RANGE_END) : COLOR_RANGE_END;
|
||||
|
||||
if (levelMin > levelMax) {
|
||||
throw new Error('Invalid range "'+ levelMin + '...' + levelMax + '"');
|
||||
}
|
||||
|
||||
return [levelMin, levelMax];
|
||||
}
|
||||
|
||||
/**
|
||||
* 1D Histogram
|
||||
*
|
||||
* @param {Number|Bitmap|Jimp} imageSource - Image to collect pixel data from. Or integer to create empty histogram for image of specific size
|
||||
* @param [mode] Used only for Jimp images. {@link Bitmap} currently can only store 256 values per pixel, so it's assumed that it contains values we are looking for
|
||||
* @constructor
|
||||
* @protected
|
||||
*/
|
||||
function Histogram(imageSource, mode) {
|
||||
this.data = null;
|
||||
this.pixels = 0;
|
||||
this._sortedIndexes = null;
|
||||
this._cachedStats = {};
|
||||
this._lookupTableH = null;
|
||||
|
||||
if (typeof imageSource === 'number') {
|
||||
this._createArray(imageSource);
|
||||
} else if (imageSource instanceof Bitmap) {
|
||||
this._collectValuesBitmap(imageSource);
|
||||
} else if (Jimp && imageSource instanceof Jimp) {
|
||||
this._collectValuesJimp(imageSource, mode);
|
||||
} else {
|
||||
throw new Error('Unsupported image source');
|
||||
}
|
||||
}
|
||||
|
||||
Histogram.MODE_LUMINANCE = 'luminance';
|
||||
Histogram.MODE_R = 'r';
|
||||
Histogram.MODE_G = 'g';
|
||||
Histogram.MODE_B = 'b';
|
||||
|
||||
Histogram.prototype = {
|
||||
/**
|
||||
* Initializes data array for an image of given pixel size
|
||||
* @param imageSize
|
||||
* @returns {Uint8Array|Uint16Array|Uint32Array}
|
||||
* @private
|
||||
*/
|
||||
_createArray: function(imageSize) {
|
||||
var ArrayType = imageSize <= Math.pow(2, 8) ? Uint8Array
|
||||
: imageSize <= Math.pow(2, 16) ? Uint16Array : Uint32Array;
|
||||
|
||||
this.pixels = imageSize;
|
||||
|
||||
return this.data = new ArrayType(COLOR_DEPTH);
|
||||
},
|
||||
|
||||
/**
|
||||
* Aggregates color data from {@link Jimp} instance
|
||||
* @param {Jimp} source
|
||||
* @param mode
|
||||
* @private
|
||||
*/
|
||||
_collectValuesJimp: function(source, mode) {
|
||||
var pixelData = source.bitmap.data;
|
||||
var data = this._createArray(source.bitmap.width * source.bitmap.height);
|
||||
|
||||
source.scan(0, 0, source.bitmap.width, source.bitmap.height, function(x, y, idx) {
|
||||
var val = mode === Histogram.MODE_R ? pixelData[idx]
|
||||
: mode === Histogram.MODE_G ? pixelData[idx + 1]
|
||||
: mode === Histogram.MODE_B ? pixelData[idx + 2]
|
||||
: utils.luminance(pixelData[idx], pixelData[idx + 1], pixelData[idx + 2]);
|
||||
|
||||
data[val]++;
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Aggregates color data from {@link Bitmap} instance
|
||||
* @param {Bitmap} source
|
||||
* @private
|
||||
*/
|
||||
_collectValuesBitmap: function(source) {
|
||||
var data = this._createArray(source.size);
|
||||
var len = source.data.length;
|
||||
var color;
|
||||
|
||||
for (var i = 0; i < len; i++) {
|
||||
color = source.data[i];
|
||||
data[color]++
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns array of color indexes in ascending order
|
||||
* @param refresh
|
||||
* @returns {*}
|
||||
* @private
|
||||
*/
|
||||
_getSortedIndexes: function(refresh) {
|
||||
if (!refresh && this._sortedIndexes) {
|
||||
return this._sortedIndexes;
|
||||
}
|
||||
|
||||
var data = this.data;
|
||||
var indexes = new Array(COLOR_DEPTH);
|
||||
var i = 0;
|
||||
|
||||
for (i; i < COLOR_DEPTH; i++) {
|
||||
indexes[i] = i;
|
||||
}
|
||||
|
||||
indexes.sort(function(a, b) {
|
||||
return data[a] > data[b] ? 1 : data[a] < data[b] ? -1 : 0;
|
||||
});
|
||||
|
||||
this._sortedIndexes = indexes;
|
||||
return indexes;
|
||||
},
|
||||
|
||||
/**
|
||||
* Builds lookup table H from lookup tables P and S.
|
||||
* see {@link http://www.iis.sinica.edu.tw/page/jise/2001/200109_01.pdf|this paper} for more details
|
||||
*
|
||||
* @returns {Float64Array}
|
||||
* @private
|
||||
*/
|
||||
_thresholdingBuildLookupTable: function() {
|
||||
var P = new Float64Array(COLOR_DEPTH * COLOR_DEPTH);
|
||||
var S = new Float64Array(COLOR_DEPTH * COLOR_DEPTH);
|
||||
var H = new Float64Array(COLOR_DEPTH * COLOR_DEPTH);
|
||||
var pixelsTotal = this.pixels;
|
||||
var i, j, idx, tmp;
|
||||
|
||||
// diagonal
|
||||
for (i = 1; i < COLOR_DEPTH; ++i) {
|
||||
idx = index(i, i);
|
||||
tmp = this.data[i] / pixelsTotal;
|
||||
|
||||
P[idx] = tmp;
|
||||
S[idx] = i * tmp;
|
||||
}
|
||||
|
||||
// calculate first row (row 0 is all zero)
|
||||
for (i = 1; i < COLOR_DEPTH - 1; ++i) {
|
||||
tmp = this.data[i + 1] / pixelsTotal;
|
||||
idx = index(1, i);
|
||||
|
||||
P[idx+1] = P[idx] + tmp;
|
||||
S[idx+1] = S[idx] + (i + 1) * tmp;
|
||||
}
|
||||
|
||||
// using row 1 to calculate others
|
||||
for (i = 2; i < COLOR_DEPTH; i++) {
|
||||
for (j=i+1; j < COLOR_DEPTH; j++) {
|
||||
P[index(i, j)] = P[index(1, j)] - P[index(1, i-1)];
|
||||
S[index(i, j)] = S[index(1, j)] - S[index(1, i-1)];
|
||||
}
|
||||
}
|
||||
|
||||
// now calculate H[i][j]
|
||||
for (i = 1; i < COLOR_DEPTH; ++i) {
|
||||
for (j = i + 1; j < COLOR_DEPTH; j++) {
|
||||
idx = index(i, j);
|
||||
H[idx] = P[idx] !== 0 ? S[idx] * S[idx] / P[idx] : 0;
|
||||
}
|
||||
}
|
||||
|
||||
return this._lookupTableH = H;
|
||||
},
|
||||
|
||||
/**
|
||||
* Implements Algorithm For Multilevel Thresholding
|
||||
* Receives desired number of color stops, returns array of said size. Could be limited to a range levelMin..levelMax
|
||||
*
|
||||
* Regardless of levelMin and levelMax values it still relies on between class variances for the entire histogram
|
||||
*
|
||||
* @param amount - how many thresholds should be calculated
|
||||
* @param [levelMin=0] - histogram segment start
|
||||
* @param [levelMax=255] - histogram segment end
|
||||
* @returns {number[]}
|
||||
*/
|
||||
multilevelThresholding: function (amount, levelMin, levelMax) {
|
||||
levelMin = normalizeMinMax(levelMin, levelMax);
|
||||
levelMax = levelMin[1];
|
||||
levelMin = levelMin[0];
|
||||
amount = Math.min(levelMax - levelMin - 2, ~~amount);
|
||||
|
||||
if (amount < 1) {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (!this._lookupTableH) {
|
||||
this._thresholdingBuildLookupTable();
|
||||
}
|
||||
|
||||
var H = this._lookupTableH;
|
||||
|
||||
var colorStops = null;
|
||||
var maxSig = 0;
|
||||
|
||||
if (amount > 4) {
|
||||
console.log('[Warning]: Threshold computation for more than 5 levels may take a long time');
|
||||
}
|
||||
|
||||
function iterateRecursive (startingPoint, prevVariance, indexes, previousDepth) {
|
||||
startingPoint = (startingPoint || 0) + 1;
|
||||
prevVariance = prevVariance || 0;
|
||||
indexes = indexes || (new Array(amount));
|
||||
previousDepth = previousDepth || 0;
|
||||
|
||||
var depth = previousDepth + 1; // t
|
||||
var variance;
|
||||
|
||||
for (var i = startingPoint; i < levelMax - amount + previousDepth; i++) {
|
||||
variance = prevVariance + H[index(startingPoint, i)];
|
||||
indexes[depth - 1] = i;
|
||||
|
||||
if (depth + 1 < amount + 1) {
|
||||
// we need to go deeper
|
||||
iterateRecursive(i, variance, indexes, depth);
|
||||
} else {
|
||||
// enough, we can compare values now
|
||||
variance += H[index(i + 1, levelMax)];
|
||||
|
||||
if (maxSig < variance) {
|
||||
maxSig = variance;
|
||||
colorStops = indexes.slice();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
iterateRecursive(levelMin || 0);
|
||||
|
||||
return colorStops ? colorStops : [];
|
||||
},
|
||||
|
||||
/**
|
||||
* Automatically finds threshold value using Algorithm For Multilevel Thresholding
|
||||
*
|
||||
* @param {number} [levelMin]
|
||||
* @param {number} [levelMax]
|
||||
* @returns {null|number}
|
||||
*/
|
||||
autoThreshold: function(levelMin, levelMax) {
|
||||
var value = this.multilevelThresholding(1, levelMin, levelMax);
|
||||
return value.length ? value[0] : null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns dominant color in given range. Returns -1 if not a single color from the range present on the image
|
||||
*
|
||||
* @param [levelMin=0]
|
||||
* @param [levelMax=255]
|
||||
* @param [tolerance=1]
|
||||
* @returns {number}
|
||||
*/
|
||||
getDominantColor: function(levelMin, levelMax, tolerance) {
|
||||
levelMin = normalizeMinMax(levelMin, levelMax);
|
||||
levelMax = levelMin[1];
|
||||
levelMin = levelMin[0];
|
||||
tolerance = tolerance || 1;
|
||||
|
||||
var colors = this.data,
|
||||
dominantIndex = -1,
|
||||
dominantValue = -1,
|
||||
i, j, tmp;
|
||||
|
||||
if (levelMin === levelMax) {
|
||||
return colors[levelMin] ? levelMin : -1;
|
||||
}
|
||||
|
||||
for (i=levelMin; i <= levelMax; i++) {
|
||||
tmp = 0;
|
||||
|
||||
for (j = ~~(tolerance / -2); j < tolerance; j++) {
|
||||
tmp += utils.between(i + j, 0, COLOR_RANGE_END) ? colors[i + j] : 0;
|
||||
}
|
||||
|
||||
var summIsBigger = tmp > dominantValue;
|
||||
var summEqualButMainColorIsBigger = dominantValue === tmp && (dominantIndex < 0 || colors[i] > colors[dominantIndex]);
|
||||
|
||||
if (summIsBigger || summEqualButMainColorIsBigger) {
|
||||
dominantIndex = i;
|
||||
dominantValue = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
return dominantValue <= 0 ? -1 : dominantIndex;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns stats for histogram or its segment.
|
||||
*
|
||||
* Returned object contains median, mean and standard deviation for pixel values;
|
||||
* peak, mean and median number of pixels per level and few other values
|
||||
*
|
||||
* If no pixels colors from specified range present on the image - most values will be NaN
|
||||
*
|
||||
* @param {Number} [levelMin=0] - histogram segment start
|
||||
* @param {Number} [levelMax=255] - histogram segment end
|
||||
* @param {Boolean} [refresh=false] - if cached result can be returned
|
||||
* @returns {{levels: {mean: (number|*), median: *, stdDev: number, unique: number}, pixelsPerLevel: {mean: (number|*), median: (number|*), peak: number}, pixels: number}}
|
||||
*/
|
||||
getStats: function(levelMin, levelMax, refresh) {
|
||||
levelMin = normalizeMinMax(levelMin, levelMax);
|
||||
levelMax = levelMin[1];
|
||||
levelMin = levelMin[0];
|
||||
|
||||
if (!refresh && this._cachedStats[levelMin + '-' + levelMax]) {
|
||||
return this._cachedStats[levelMin + '-' + levelMax];
|
||||
}
|
||||
|
||||
var data = this.data;
|
||||
var sortedIndexes = this._getSortedIndexes();
|
||||
|
||||
var pixelsTotal = 0;
|
||||
var medianValue = null;
|
||||
var meanValue;
|
||||
var medianPixelIndex;
|
||||
var pixelsPerLevelMean;
|
||||
var pixelsPerLevelMedian;
|
||||
var tmpSumOfDeviations = 0;
|
||||
var tmpPixelsIterated = 0;
|
||||
var allPixelValuesCombined = 0;
|
||||
var i, tmpPixels, tmpPixelValue;
|
||||
|
||||
var uniqueValues = 0; // counter for levels that's represented by at least one pixel
|
||||
var mostPixelsPerLevel = 0;
|
||||
|
||||
// Finding number of pixels and mean
|
||||
|
||||
for (i = levelMin; i <= levelMax; i++) {
|
||||
pixelsTotal += data[i];
|
||||
allPixelValuesCombined += data[i] * i;
|
||||
|
||||
uniqueValues += data[i] === 0 ? 0 : 1;
|
||||
|
||||
if (mostPixelsPerLevel < data[i]) {
|
||||
mostPixelsPerLevel = data[i];
|
||||
}
|
||||
}
|
||||
|
||||
meanValue = allPixelValuesCombined / pixelsTotal;
|
||||
pixelsPerLevelMean = pixelsTotal / (levelMax - levelMin);
|
||||
pixelsPerLevelMedian = pixelsTotal / uniqueValues;
|
||||
medianPixelIndex = Math.floor(pixelsTotal / 2);
|
||||
|
||||
// Finding median and standard deviation
|
||||
|
||||
for (i = 0; i < COLOR_DEPTH; i++) {
|
||||
tmpPixelValue = sortedIndexes[i];
|
||||
tmpPixels = data[tmpPixelValue];
|
||||
|
||||
if (tmpPixelValue < levelMin || tmpPixelValue > levelMax) {
|
||||
continue;
|
||||
}
|
||||
|
||||
tmpPixelsIterated += tmpPixels;
|
||||
tmpSumOfDeviations += Math.pow(tmpPixelValue - meanValue, 2) * tmpPixels;
|
||||
|
||||
if (medianValue === null && tmpPixelsIterated >= medianPixelIndex) {
|
||||
medianValue = tmpPixelValue;
|
||||
}
|
||||
}
|
||||
|
||||
return this._cachedStats[levelMin + '-' + levelMax] = {
|
||||
// various pixel counts for levels (0..255)
|
||||
|
||||
levels: {
|
||||
mean: meanValue,
|
||||
median: medianValue,
|
||||
stdDev: Math.sqrt(tmpSumOfDeviations / pixelsTotal),
|
||||
unique: uniqueValues
|
||||
},
|
||||
|
||||
// what's visually represented as bars
|
||||
pixelsPerLevel: {
|
||||
mean: pixelsPerLevelMean,
|
||||
median: pixelsPerLevelMedian,
|
||||
peak: mostPixelsPerLevel
|
||||
},
|
||||
|
||||
pixels: pixelsTotal
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = Histogram;
|
||||
13
node_modules/potrace/lib/types/Opti.js
generated
vendored
Normal file
13
node_modules/potrace/lib/types/Opti.js
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
'use strict';
|
||||
|
||||
var Point = require('./Point');
|
||||
|
||||
function Opti() {
|
||||
this.pen = 0;
|
||||
this.c = [new Point(), new Point()];
|
||||
this.t = 0;
|
||||
this.s = 0;
|
||||
this.alpha = 0;
|
||||
}
|
||||
|
||||
module.exports = Opti;
|
||||
14
node_modules/potrace/lib/types/Path.js
generated
vendored
Normal file
14
node_modules/potrace/lib/types/Path.js
generated
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
'use strict';
|
||||
|
||||
function Path() {
|
||||
this.area = 0;
|
||||
this.len = 0;
|
||||
this.curve = {};
|
||||
this.pt = [];
|
||||
this.minX = 100000;
|
||||
this.minY = 100000;
|
||||
this.maxX = -1;
|
||||
this.maxY = -1;
|
||||
}
|
||||
|
||||
module.exports = Path;
|
||||
14
node_modules/potrace/lib/types/Point.js
generated
vendored
Normal file
14
node_modules/potrace/lib/types/Point.js
generated
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
'use strict';
|
||||
|
||||
function Point(x, y) {
|
||||
this.x = x || 0;
|
||||
this.y = y || 0;
|
||||
}
|
||||
|
||||
Point.prototype = {
|
||||
copy: function() {
|
||||
return new Point(this.x, this.y);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = Point;
|
||||
11
node_modules/potrace/lib/types/Quad.js
generated
vendored
Normal file
11
node_modules/potrace/lib/types/Quad.js
generated
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
'use strict';
|
||||
|
||||
function Quad() {
|
||||
this.data = [0,0,0,0,0,0,0,0,0];
|
||||
}
|
||||
|
||||
Quad.prototype.at = function(x, y) {
|
||||
return this.data[x * 3 + y];
|
||||
};
|
||||
|
||||
module.exports = Quad;
|
||||
11
node_modules/potrace/lib/types/Sum.js
generated
vendored
Normal file
11
node_modules/potrace/lib/types/Sum.js
generated
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
'use strict';
|
||||
|
||||
function Sum(x, y, xy, x2, y2) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.xy = xy;
|
||||
this.x2 = x2;
|
||||
this.y2 = y2;
|
||||
}
|
||||
|
||||
module.exports = Sum;
|
||||
247
node_modules/potrace/lib/utils.js
generated
vendored
Normal file
247
node_modules/potrace/lib/utils.js
generated
vendored
Normal file
@ -0,0 +1,247 @@
|
||||
'use strict';
|
||||
|
||||
var Point = require('./types/Point');
|
||||
var attrRegexps = {};
|
||||
|
||||
function getAttrRegexp(attrName) {
|
||||
if (attrRegexps[attrName]) {
|
||||
return attrRegexps[attrName];
|
||||
}
|
||||
|
||||
attrRegexps[attrName] = new RegExp(' ' + attrName + '="((?:\\\\(?=")"|[^"])+)"', 'i');
|
||||
return attrRegexps[attrName];
|
||||
}
|
||||
|
||||
function setHtmlAttribute(html, attrName, value) {
|
||||
var attr = ' ' + attrName + '="' + value + '"';
|
||||
|
||||
if (html.indexOf(' ' + attrName + '="') === -1) {
|
||||
html = html.replace(/<[a-z]+/i, function(beginning) { return beginning + attr; });
|
||||
} else {
|
||||
html = html.replace(getAttrRegexp(attrName), attr);
|
||||
}
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
function fixed(number) {
|
||||
return number.toFixed(3).replace('.000', '');
|
||||
}
|
||||
|
||||
function mod(a, n) {
|
||||
return a >= n ? a % n : a>=0 ? a : n-1-(-1-a) % n;
|
||||
}
|
||||
|
||||
function xprod(p1, p2) {
|
||||
return p1.x * p2.y - p1.y * p2.x;
|
||||
}
|
||||
|
||||
function cyclic(a, b, c) {
|
||||
if (a <= c) {
|
||||
return (a <= b && b < c);
|
||||
} else {
|
||||
return (a <= b || b < c);
|
||||
}
|
||||
}
|
||||
|
||||
function sign(i) {
|
||||
return i > 0 ? 1 : i < 0 ? -1 : 0;
|
||||
}
|
||||
|
||||
function quadform(Q, w) {
|
||||
var v = new Array(3), i, j, sum;
|
||||
|
||||
v[0] = w.x;
|
||||
v[1] = w.y;
|
||||
v[2] = 1;
|
||||
sum = 0.0;
|
||||
|
||||
for (i=0; i<3; i++) {
|
||||
for (j=0; j<3; j++) {
|
||||
sum += v[i] * Q.at(i, j) * v[j];
|
||||
}
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
function interval(lambda, a, b) {
|
||||
var res = new Point();
|
||||
|
||||
res.x = a.x + lambda * (b.x - a.x);
|
||||
res.y = a.y + lambda * (b.y - a.y);
|
||||
return res;
|
||||
}
|
||||
|
||||
function dorth_infty(p0, p2) {
|
||||
var r = new Point();
|
||||
|
||||
r.y = sign(p2.x - p0.x);
|
||||
r.x = -sign(p2.y - p0.y);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
function ddenom(p0, p2) {
|
||||
var r = dorth_infty(p0, p2);
|
||||
|
||||
return r.y * (p2.x - p0.x) - r.x * (p2.y - p0.y);
|
||||
}
|
||||
|
||||
function dpara(p0, p1, p2) {
|
||||
var x1, y1, x2, y2;
|
||||
|
||||
x1 = p1.x - p0.x;
|
||||
y1 = p1.y - p0.y;
|
||||
x2 = p2.x - p0.x;
|
||||
y2 = p2.y - p0.y;
|
||||
|
||||
return x1 * y2 - x2 * y1;
|
||||
}
|
||||
|
||||
function cprod(p0, p1, p2, p3) {
|
||||
var x1, y1, x2, y2;
|
||||
|
||||
x1 = p1.x - p0.x;
|
||||
y1 = p1.y - p0.y;
|
||||
x2 = p3.x - p2.x;
|
||||
y2 = p3.y - p2.y;
|
||||
|
||||
return x1 * y2 - x2 * y1;
|
||||
}
|
||||
|
||||
function iprod(p0, p1, p2) {
|
||||
var x1, y1, x2, y2;
|
||||
|
||||
x1 = p1.x - p0.x;
|
||||
y1 = p1.y - p0.y;
|
||||
x2 = p2.x - p0.x;
|
||||
y2 = p2.y - p0.y;
|
||||
|
||||
return x1*x2 + y1*y2;
|
||||
}
|
||||
|
||||
function iprod1(p0, p1, p2, p3) {
|
||||
var x1, y1, x2, y2;
|
||||
|
||||
x1 = p1.x - p0.x;
|
||||
y1 = p1.y - p0.y;
|
||||
x2 = p3.x - p2.x;
|
||||
y2 = p3.y - p2.y;
|
||||
|
||||
return x1 * x2 + y1 * y2;
|
||||
}
|
||||
|
||||
function ddist(p, q) {
|
||||
return Math.sqrt((p.x - q.x) * (p.x - q.x) + (p.y - q.y) * (p.y - q.y));
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
luminance: function (r, g, b) {
|
||||
return Math.round(0.2126 * r + 0.7153 * g + 0.0721 * b);
|
||||
},
|
||||
|
||||
between: function(val, min, max) {
|
||||
return val >= min && val <= max;
|
||||
},
|
||||
|
||||
clamp: function(val, min, max) {
|
||||
return Math.min(max, Math.max(min, val));
|
||||
},
|
||||
|
||||
isNumber: function(val) {
|
||||
return typeof val === 'number';
|
||||
},
|
||||
|
||||
setHtmlAttr: setHtmlAttribute,
|
||||
|
||||
/**
|
||||
* Generates path instructions for given curve
|
||||
*
|
||||
* @param {Curve} curve
|
||||
* @param {Number} [scale]
|
||||
* @returns {string}
|
||||
*/
|
||||
renderCurve: function(curve, scale) {
|
||||
scale = scale || 1;
|
||||
|
||||
var startingPoint = curve.c[(curve.n - 1) * 3 + 2];
|
||||
|
||||
var path = 'M '
|
||||
+ fixed(startingPoint.x * scale) + ' '
|
||||
+ fixed(startingPoint.y * scale) + ' ';
|
||||
|
||||
curve.tag.forEach(function(tag, i) {
|
||||
var i3 = i * 3;
|
||||
var p0 = curve.c[i3];
|
||||
var p1 = curve.c[i3 + 1];
|
||||
var p2 = curve.c[i3 + 2];
|
||||
|
||||
if (tag === "CURVE") {
|
||||
path += 'C ';
|
||||
path += fixed(p0.x * scale) + ' ' + fixed(p0.y * scale) + ', ';
|
||||
path += fixed(p1.x * scale) + ' ' + fixed(p1.y * scale) + ', ';
|
||||
path += fixed(p2.x * scale) + ' ' + fixed(p2.y * scale) + ' ';
|
||||
} else if (tag === "CORNER") {
|
||||
path += 'L ';
|
||||
path += fixed(p1.x * scale) + ' ' + fixed(p1.y * scale) + ' ';
|
||||
path += fixed(p2.x * scale) + ' ' + fixed(p2.y * scale) + ' ';
|
||||
}
|
||||
});
|
||||
|
||||
return path;
|
||||
},
|
||||
|
||||
bezier: function bezier(t, p0, p1, p2, p3) {
|
||||
var s = 1 - t, res = new Point();
|
||||
|
||||
res.x = s*s*s*p0.x + 3*(s*s*t)*p1.x + 3*(t*t*s)*p2.x + t*t*t*p3.x;
|
||||
res.y = s*s*s*p0.y + 3*(s*s*t)*p1.y + 3*(t*t*s)*p2.y + t*t*t*p3.y;
|
||||
|
||||
return res;
|
||||
},
|
||||
|
||||
tangent: function tangent(p0, p1, p2, p3, q0, q1) {
|
||||
var A, B, C, a, b, c, d, s, r1, r2;
|
||||
|
||||
A = cprod(p0, p1, q0, q1);
|
||||
B = cprod(p1, p2, q0, q1);
|
||||
C = cprod(p2, p3, q0, q1);
|
||||
|
||||
a = A - 2 * B + C;
|
||||
b = -2 * A + 2 * B;
|
||||
c = A;
|
||||
|
||||
d = b * b - 4 * a * c;
|
||||
|
||||
if (a===0 || d<0) {
|
||||
return -1.0;
|
||||
}
|
||||
|
||||
s = Math.sqrt(d);
|
||||
|
||||
r1 = (-b + s) / (2 * a);
|
||||
r2 = (-b - s) / (2 * a);
|
||||
|
||||
if (r1 >= 0 && r1 <= 1) {
|
||||
return r1;
|
||||
} else if (r2 >= 0 && r2 <= 1) {
|
||||
return r2;
|
||||
} else {
|
||||
return -1.0;
|
||||
}
|
||||
},
|
||||
|
||||
mod: mod,
|
||||
xprod: xprod,
|
||||
cyclic: cyclic,
|
||||
sign: sign,
|
||||
quadform: quadform,
|
||||
interval: interval,
|
||||
dorth_infty: dorth_infty,
|
||||
ddenom: ddenom,
|
||||
dpara: dpara,
|
||||
cprod: cprod,
|
||||
iprod: iprod,
|
||||
iprod1: iprod1,
|
||||
ddist: ddist
|
||||
};
|
||||
66
node_modules/potrace/package.json
generated
vendored
Normal file
66
node_modules/potrace/package.json
generated
vendored
Normal file
@ -0,0 +1,66 @@
|
||||
{
|
||||
"_from": "potrace@^2.1.1",
|
||||
"_id": "potrace@2.1.2",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-dNcUBapRgPkiv3j+70+rSlf0whtJJqEszC04g9a/Ll3p6kA7QVRV1Vsi3jg22voJr2jA9x9fjPbz5MdD+ngbUg==",
|
||||
"_location": "/potrace",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "range",
|
||||
"registry": true,
|
||||
"raw": "potrace@^2.1.1",
|
||||
"name": "potrace",
|
||||
"escapedName": "potrace",
|
||||
"rawSpec": "^2.1.1",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "^2.1.1"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/gatsby-plugin-sharp",
|
||||
"/gatsby-remark-images",
|
||||
"/gatsby-transformer-sharp"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/potrace/-/potrace-2.1.2.tgz",
|
||||
"_shasum": "61473a326be1e734abac6d14d54e1880eed35471",
|
||||
"_spec": "potrace@^2.1.1",
|
||||
"_where": "/Users/stefanfejes/Projects/30-seconds-of-python-code/node_modules/gatsby-plugin-sharp",
|
||||
"author": {
|
||||
"name": "mattmc"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/tooolbox/node-potrace/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"dependencies": {
|
||||
"jimp": "^0.6.4"
|
||||
},
|
||||
"deprecated": false,
|
||||
"description": "Potrace in Javascript, for NodeJS",
|
||||
"devDependencies": {
|
||||
"lodash": "^4.15.0",
|
||||
"mocha": "^3.0.2",
|
||||
"should": "^11.1.0",
|
||||
"should-sinon": "0.0.5",
|
||||
"sinon": "^1.17.5"
|
||||
},
|
||||
"homepage": "https://github.com/tooolbox/node-potrace#readme",
|
||||
"keywords": [
|
||||
"potrace",
|
||||
"trace",
|
||||
"tracing",
|
||||
"svg",
|
||||
"bitmap",
|
||||
"posterization"
|
||||
],
|
||||
"license": "GPL-2.0",
|
||||
"main": "lib/index.js",
|
||||
"name": "potrace",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/tooolbox/node-potrace.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "cd test && mocha test.js --reporter spec"
|
||||
},
|
||||
"version": "2.1.2"
|
||||
}
|
||||
930
node_modules/potrace/yarn.lock
generated
vendored
Normal file
930
node_modules/potrace/yarn.lock
generated
vendored
Normal file
@ -0,0 +1,930 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@babel/polyfill@^7.0.0":
|
||||
version "7.4.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.4.4.tgz#78801cf3dbe657844eeabf31c1cae3828051e893"
|
||||
integrity sha512-WlthFLfhQQhh+A2Gn5NSFl0Huxz36x86Jn+E9OW7ibK8edKPq+KLy4apM1yDpQ8kJOVi1OVjpP4vSDLdrI04dg==
|
||||
dependencies:
|
||||
core-js "^2.6.5"
|
||||
regenerator-runtime "^0.13.2"
|
||||
|
||||
"@jimp/bmp@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.6.4.tgz#0f4b94486e979d82c83e1e87cd00b756afb26e49"
|
||||
integrity sha512-dhKM7Cjw4XoOefx3/we2+vWyTP6hQPpM7mEsziGjtsrK2f/e3/+hhHbEsQNgO9BOA1FPJRXAOiYHts9IlMH1mg==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
bmp-js "^0.1.0"
|
||||
core-js "^2.5.7"
|
||||
|
||||
"@jimp/core@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.6.4.tgz#19ab5f4ff0db4f602b36b159c714e37ebfb5672f"
|
||||
integrity sha512-nyiAXI8/uU54fGO53KrRB8pdn1s+IODZ+rj0jG2owsNJlTlagFrsZAy8IVTUCOiiXjh9TbwFo7D5XMrmi4KUww==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
any-base "^1.1.0"
|
||||
buffer "^5.2.0"
|
||||
core-js "^2.5.7"
|
||||
exif-parser "^0.1.12"
|
||||
file-type "^9.0.0"
|
||||
load-bmfont "^1.3.1"
|
||||
mkdirp "0.5.1"
|
||||
phin "^2.9.1"
|
||||
pixelmatch "^4.0.2"
|
||||
tinycolor2 "^1.4.1"
|
||||
|
||||
"@jimp/custom@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.6.4.tgz#eb1abbda83f13149e50e71f0c5fc78d873fb485b"
|
||||
integrity sha512-sdBHrBoVr1+PFx4dlUAgXvvu4dG0esQobhg7qhpSLRje1ScavIgE2iXdJKpycgzrqwAOL8vW4/E5w2/rONlaoQ==
|
||||
dependencies:
|
||||
"@jimp/core" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
|
||||
"@jimp/gif@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.6.4.tgz#cbe8c27ceffd28112ec045b3f8a74724b8d3cdd0"
|
||||
integrity sha512-14mLoyG0UrYJsGNRoXBFvSJdFtBD0BSBwQ1zCNeW+HpQqdl+Kh5E1Pz4nqT2KNylJe1jypyR51Q2yndgcfGVyg==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
omggif "^1.0.9"
|
||||
|
||||
"@jimp/jpeg@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.6.4.tgz#613e040514b1876a802f7943399be2b304bdb461"
|
||||
integrity sha512-NrFla9fZC/Bhw1Aa9vJ6cBOqpB5ylEPb9jD+yZ0fzcAw5HwILguS//oXv9EWLApIY1XsOMFFe0XWpY653rv8hw==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
jpeg-js "^0.3.4"
|
||||
|
||||
"@jimp/plugin-blit@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.6.4.tgz#f8d7b2fa635fbef79d11f7476ff40e8aed00c026"
|
||||
integrity sha512-suVznd4XozkQIuECX0u8kMl+cAQpZN3WcbWXUcJaVxRi+VBvHIetG1Qs5qGLzuEg9627+kE7ppv0UgZ5mkE6lg==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
|
||||
"@jimp/plugin-blur@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.6.4.tgz#dd5d64454cae865ea8e4c6133b75708e93f31d89"
|
||||
integrity sha512-M2fDMYUUtEKVNnCJZk5J0KSMzzISobmWfnG88RdHXJCkOn98kdawQFwTsYOfJJfCM8jWfhIxwZLFhC/2lkTN2w==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
|
||||
"@jimp/plugin-color@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.6.4.tgz#d5ce139a0e665437ef9d5df7642be66f33735645"
|
||||
integrity sha512-6Nfr2l9KSb6zH2fij8G6fQOw85TTkyRaBlqMvDmsQp/I1IlaDbXzA2C2Eh9jkQYZQDPu61B1MkmlEhJp/TUx6Q==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
tinycolor2 "^1.4.1"
|
||||
|
||||
"@jimp/plugin-contain@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.6.4.tgz#ee2cc03a066cc1ec9dcb2a5c6cdbbfb80af42d05"
|
||||
integrity sha512-qI1MxU1noS6NbEPu/bDDeP405aMviuIsfpOz8J3En8IwIwrJV22qt6QIHmF+eyng8CYgivwIPjEPzFzLR566Nw==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
|
||||
"@jimp/plugin-cover@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.6.4.tgz#1d341438552ffc673c2e8b68b4419b9aaf844657"
|
||||
integrity sha512-z6eafPonj3LJY8cTEfRkXmOfCDi1+f0tbYaNvmiu+OrWJ3Ojw2hMt+BVVvJ8pKe1dWIFkCjxOjyjZWj1gEkaLw==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
|
||||
"@jimp/plugin-crop@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.6.4.tgz#3447611790703cd7d51a0127b2cf77906711f9ec"
|
||||
integrity sha512-w9TR+pn+GeWbznscGe2HRkPxInge0whAF3TLPWhPwBVjZChTT8dSDXsUpUlxQqvI4SfzuKp8z3/0SBqYDCzxxA==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
|
||||
"@jimp/plugin-displace@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.6.4.tgz#7d641e402aade5d13d8eea93dc94fac39027da97"
|
||||
integrity sha512-MEvtBXOAio/3iGJkKBrTtFs3Q38ez2Wy/wTD0Ruas+L8fjJR7l4mDgV+zjRr57CqB5mpY+L48VEoa2/gNXh9cg==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
|
||||
"@jimp/plugin-dither@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.6.4.tgz#3feea3cd3ef59f951759c9ac0bafdd4abee50d7b"
|
||||
integrity sha512-w+AGLcIMUeJZ4CI0FvFomahgKLcW+ICsLidUNOqyLzceluPAfug4X7vDhQ41pNkzKg0M1+Q1j0aWV8bdyF+LhA==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
|
||||
"@jimp/plugin-flip@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.6.4.tgz#3ac31f01a4e1dc07caa9ff8c6a34097fb719de19"
|
||||
integrity sha512-ukINMegMUM9KYjyDCiyYKYdSsbhNRLHDwOJN0xVRalmOKqNaZmjNbiMbaVxKlYt6sHW76RhSMOekw9f6GQB9tQ==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
|
||||
"@jimp/plugin-gaussian@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.6.4.tgz#17d51465dc973cb97ce8d433f2c0c565070377a9"
|
||||
integrity sha512-C1P6ohzIddpNb7CX5X+ygbp+ow8Fpt64ZLoIgdjYPs/42HxKluvY62fVfMhY6m5zUGKIMbg0uYeAtz/9LRJPyw==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
|
||||
"@jimp/plugin-invert@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.6.4.tgz#38c8a6fa5d62f0c2a097041d09595decb10f7d36"
|
||||
integrity sha512-sleGz1jXaNEsP/5Ayqw8oez/6KesWcyCqovIuK4Z4kDmMc2ncuhsXIJQXDWtIF4tTQVzNEgrxUDNA4bi9xpCUA==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
|
||||
"@jimp/plugin-mask@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.6.4.tgz#47bb907a70c457f51439f96e2dc0fa73dd2b8ea2"
|
||||
integrity sha512-3D4FbRxnpO9nzwa6cF8AImgO1aVReYbfRRO4I4bku4/iZ+kuU3fBLV+SRhB4c7di3ejG5u+rGsIfaNc94iYYvw==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
|
||||
"@jimp/plugin-normalize@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.6.4.tgz#6f49eb866b605c947c05fd9ca6ea3934f57137e4"
|
||||
integrity sha512-nOFMwOaVkOKArHkD/T6/1HKAPj3jlW6l0JduVDn1A5eIPCtlnyhlE9zdjgi5Q9IBR/gRjwW6tTzBKuJenS51kg==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
|
||||
"@jimp/plugin-print@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.6.4.tgz#6642e2a5dea7fa6fb70c8655f82a770ae0faa0d9"
|
||||
integrity sha512-3z5DLVCKg0NfZhHATEaYH/4XanIboPP1pOUoxIUeF++qOnGiGgH2giFJlRprHmx2l3E3DukR1v8pt54PGvfrFw==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
load-bmfont "^1.4.0"
|
||||
|
||||
"@jimp/plugin-resize@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.6.4.tgz#cf6b253b4f40a6f9678509b391bf5a8d261951c8"
|
||||
integrity sha512-fk2+KheUNClrOWj6aDNWj1r4byVQb6Qxy4aT1UHX5GXPHDA+nhlej7ghaYdzeWZYodeM3lpasYtByu1XE2qScQ==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
|
||||
"@jimp/plugin-rotate@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.6.4.tgz#3075538a8f644d78d07ea3f126ee3c85a37302bc"
|
||||
integrity sha512-44VgV5D4xQIYInJAVevdW9J3SOhGKyz0OEr2ciA8Q3ktonKx0O5Q1g2kbruiqxFSkK/u2CKPLeKXZzYCFrmJGQ==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
|
||||
"@jimp/plugin-scale@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.6.4.tgz#062305d129ab80d0e49df021ab96202b0594a3dc"
|
||||
integrity sha512-RAQRaDiCHmEz+A8QS5d/Z38EnlNsQizz3Mu3NsjA8uFtJsv1yMKWXZSQuzniofZw8tlMV6oI3VdM0eQVE07/5w==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
|
||||
"@jimp/plugins@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.6.4.tgz#341eeadab17ab1a1bac99b788acf2a43369f119d"
|
||||
integrity sha512-NpO/87CKnF4Q9r8gMl6w+jPKOM/C089qExkViD9cPvcFZEnyVOu7ucGzcMmTcabWOU62iQTOkRViPYr6XaK0LQ==
|
||||
dependencies:
|
||||
"@jimp/plugin-blit" "^0.6.4"
|
||||
"@jimp/plugin-blur" "^0.6.4"
|
||||
"@jimp/plugin-color" "^0.6.4"
|
||||
"@jimp/plugin-contain" "^0.6.4"
|
||||
"@jimp/plugin-cover" "^0.6.4"
|
||||
"@jimp/plugin-crop" "^0.6.4"
|
||||
"@jimp/plugin-displace" "^0.6.4"
|
||||
"@jimp/plugin-dither" "^0.6.4"
|
||||
"@jimp/plugin-flip" "^0.6.4"
|
||||
"@jimp/plugin-gaussian" "^0.6.4"
|
||||
"@jimp/plugin-invert" "^0.6.4"
|
||||
"@jimp/plugin-mask" "^0.6.4"
|
||||
"@jimp/plugin-normalize" "^0.6.4"
|
||||
"@jimp/plugin-print" "^0.6.4"
|
||||
"@jimp/plugin-resize" "^0.6.4"
|
||||
"@jimp/plugin-rotate" "^0.6.4"
|
||||
"@jimp/plugin-scale" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
timm "^1.6.1"
|
||||
|
||||
"@jimp/png@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.6.4.tgz#2a74b14d1c968d1f09e684803d6e170950728b55"
|
||||
integrity sha512-qv3oo6ll3XWVIToBwVC1wQX0MFKwpxbe2o+1ld9B4ZDavqvAHzalzcmTd/iyooI85CVDAcC3RRDo66oiizGZCQ==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
pngjs "^3.3.3"
|
||||
|
||||
"@jimp/tiff@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.6.4.tgz#c999751b977f01817d785327732ed4e40a4ecc9a"
|
||||
integrity sha512-8/vD4qleexmhPdppiu6fSstj/n/kGNTn8iIlf1emiqOuMN2PL9q5GOPDWU0xWdGNyJMMIDXJPgUFUkKfqXdg7w==
|
||||
dependencies:
|
||||
core-js "^2.5.7"
|
||||
utif "^2.0.1"
|
||||
|
||||
"@jimp/types@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.6.4.tgz#242fce9a914875e0b48b6ebac2ab55e95714cdf8"
|
||||
integrity sha512-/EMbipQDg5U6DnBAgcSiydlMBRYoKhnaK7MJRImeTzhDJ6xfgNOF7lYq66o0kmaezKdG/cIwZ1CLecn2y3D8SQ==
|
||||
dependencies:
|
||||
"@jimp/bmp" "^0.6.4"
|
||||
"@jimp/gif" "^0.6.4"
|
||||
"@jimp/jpeg" "^0.6.4"
|
||||
"@jimp/png" "^0.6.4"
|
||||
"@jimp/tiff" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
timm "^1.6.1"
|
||||
|
||||
"@jimp/utils@^0.6.4":
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.6.4.tgz#4a17103829c8487384539f1c2b1db257bbd30c0b"
|
||||
integrity sha512-EFQurCyEnZLSM2Q1BYDTUmsOJPSOYEQd18Fvq8bGo8hnBHoGLWLWWyNi2l4cYhtpKmIXyhvQqa6/WaEpKPzvqA==
|
||||
dependencies:
|
||||
core-js "^2.5.7"
|
||||
|
||||
any-base@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe"
|
||||
integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==
|
||||
|
||||
balanced-match@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
|
||||
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
|
||||
|
||||
base64-js@^1.0.2:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
|
||||
integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==
|
||||
|
||||
bmp-js@^0.1.0:
|
||||
version "0.1.0"
|
||||
resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233"
|
||||
integrity sha1-4Fpj95amwf8l9Hcex62twUjAcjM=
|
||||
|
||||
brace-expansion@^1.1.7:
|
||||
version "1.1.11"
|
||||
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
|
||||
integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
|
||||
dependencies:
|
||||
balanced-match "^1.0.0"
|
||||
concat-map "0.0.1"
|
||||
|
||||
browser-stdout@1.3.0:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f"
|
||||
integrity sha1-81HTKWnTL6XXpVZxVCY9korjvR8=
|
||||
|
||||
buffer-equal@0.0.1:
|
||||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b"
|
||||
integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=
|
||||
|
||||
buffer@^5.2.0:
|
||||
version "5.2.1"
|
||||
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6"
|
||||
integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==
|
||||
dependencies:
|
||||
base64-js "^1.0.2"
|
||||
ieee754 "^1.1.4"
|
||||
|
||||
commander@2.9.0:
|
||||
version "2.9.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
|
||||
integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=
|
||||
dependencies:
|
||||
graceful-readlink ">= 1.0.0"
|
||||
|
||||
concat-map@0.0.1:
|
||||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
||||
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
|
||||
|
||||
core-js@^2.5.7, core-js@^2.6.5:
|
||||
version "2.6.9"
|
||||
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2"
|
||||
integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==
|
||||
|
||||
debug@2.6.8:
|
||||
version "2.6.8"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc"
|
||||
integrity sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=
|
||||
dependencies:
|
||||
ms "2.0.0"
|
||||
|
||||
define-properties@^1.1.2, define-properties@^1.1.3:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
|
||||
integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
|
||||
dependencies:
|
||||
object-keys "^1.0.12"
|
||||
|
||||
diff@3.2.0:
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9"
|
||||
integrity sha1-yc45Okt8vQsFinJck98pkCeGj/k=
|
||||
|
||||
dom-walk@^0.1.0:
|
||||
version "0.1.1"
|
||||
resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
|
||||
integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=
|
||||
|
||||
es-abstract@^1.12.0, es-abstract@^1.5.0:
|
||||
version "1.13.0"
|
||||
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9"
|
||||
integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==
|
||||
dependencies:
|
||||
es-to-primitive "^1.2.0"
|
||||
function-bind "^1.1.1"
|
||||
has "^1.0.3"
|
||||
is-callable "^1.1.4"
|
||||
is-regex "^1.0.4"
|
||||
object-keys "^1.0.12"
|
||||
|
||||
es-to-primitive@^1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377"
|
||||
integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==
|
||||
dependencies:
|
||||
is-callable "^1.1.4"
|
||||
is-date-object "^1.0.1"
|
||||
is-symbol "^1.0.2"
|
||||
|
||||
escape-string-regexp@1.0.5:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
|
||||
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
|
||||
|
||||
exif-parser@^0.1.12:
|
||||
version "0.1.12"
|
||||
resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922"
|
||||
integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=
|
||||
|
||||
file-type@^9.0.0:
|
||||
version "9.0.0"
|
||||
resolved "https://registry.yarnpkg.com/file-type/-/file-type-9.0.0.tgz#a68d5ad07f486414dfb2c8866f73161946714a18"
|
||||
integrity sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==
|
||||
|
||||
for-each@^0.3.3:
|
||||
version "0.3.3"
|
||||
resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
|
||||
integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
|
||||
dependencies:
|
||||
is-callable "^1.1.3"
|
||||
|
||||
formatio@1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9"
|
||||
integrity sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=
|
||||
dependencies:
|
||||
samsam "~1.1"
|
||||
|
||||
fs.realpath@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
|
||||
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
|
||||
|
||||
function-bind@^1.0.2, function-bind@^1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
|
||||
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
|
||||
|
||||
glob@7.1.1:
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
|
||||
integrity sha1-gFIR3wT6rxxjo2ADBs31reULLsg=
|
||||
dependencies:
|
||||
fs.realpath "^1.0.0"
|
||||
inflight "^1.0.4"
|
||||
inherits "2"
|
||||
minimatch "^3.0.2"
|
||||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
global@~4.3.0:
|
||||
version "4.3.2"
|
||||
resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
|
||||
integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=
|
||||
dependencies:
|
||||
min-document "^2.19.0"
|
||||
process "~0.5.1"
|
||||
|
||||
"graceful-readlink@>= 1.0.0":
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
|
||||
integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
|
||||
|
||||
growl@1.9.2:
|
||||
version "1.9.2"
|
||||
resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f"
|
||||
integrity sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=
|
||||
|
||||
has-flag@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
|
||||
integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=
|
||||
|
||||
has-symbols@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
|
||||
integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=
|
||||
|
||||
has@^1.0.1, has@^1.0.3:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
|
||||
integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
|
||||
dependencies:
|
||||
function-bind "^1.1.1"
|
||||
|
||||
he@1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
|
||||
integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0=
|
||||
|
||||
ieee754@^1.1.4:
|
||||
version "1.1.13"
|
||||
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
|
||||
integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
|
||||
|
||||
inflight@^1.0.4:
|
||||
version "1.0.6"
|
||||
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
|
||||
integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
|
||||
dependencies:
|
||||
once "^1.3.0"
|
||||
wrappy "1"
|
||||
|
||||
inherits@2:
|
||||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
||||
|
||||
inherits@2.0.3:
|
||||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
|
||||
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
|
||||
|
||||
is-arguments@^1.0.4:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3"
|
||||
integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==
|
||||
|
||||
is-callable@^1.1.3, is-callable@^1.1.4:
|
||||
version "1.1.4"
|
||||
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
|
||||
integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
|
||||
|
||||
is-date-object@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
|
||||
integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=
|
||||
|
||||
is-function@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5"
|
||||
integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=
|
||||
|
||||
is-generator-function@^1.0.7:
|
||||
version "1.0.7"
|
||||
resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522"
|
||||
integrity sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==
|
||||
|
||||
is-regex@^1.0.4:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
|
||||
integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=
|
||||
dependencies:
|
||||
has "^1.0.1"
|
||||
|
||||
is-symbol@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38"
|
||||
integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==
|
||||
dependencies:
|
||||
has-symbols "^1.0.0"
|
||||
|
||||
jimp@^0.6.4:
|
||||
version "0.6.4"
|
||||
resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.6.4.tgz#266c5777752a6edb4227792ef288198a1e99102f"
|
||||
integrity sha512-WQVMoNhkcq/fgthZOWeMdIguCVPg+t4PDFfSxvbNcrECwl8eq3/Ou2whcFWWjyW45m43yAJEY2UT7acDKl6uSQ==
|
||||
dependencies:
|
||||
"@babel/polyfill" "^7.0.0"
|
||||
"@jimp/custom" "^0.6.4"
|
||||
"@jimp/plugins" "^0.6.4"
|
||||
"@jimp/types" "^0.6.4"
|
||||
core-js "^2.5.7"
|
||||
|
||||
jpeg-js@^0.3.4:
|
||||
version "0.3.5"
|
||||
resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.5.tgz#6fbd6cd0e49627c5a0341796c9e50c70a2aa3673"
|
||||
integrity sha512-hvaExqwmQDS8O9qnZAVDXGWU43Tbu1V0wMZmjROjT11jloSgGICZpscG+P6Nyi1BVAvyu2ARRx8qmEW30sxgdQ==
|
||||
|
||||
json3@3.3.2:
|
||||
version "3.3.2"
|
||||
resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
|
||||
integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=
|
||||
|
||||
load-bmfont@^1.3.1, load-bmfont@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.0.tgz#75f17070b14a8c785fe7f5bee2e6fd4f98093b6b"
|
||||
integrity sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g==
|
||||
dependencies:
|
||||
buffer-equal "0.0.1"
|
||||
mime "^1.3.4"
|
||||
parse-bmfont-ascii "^1.0.3"
|
||||
parse-bmfont-binary "^1.0.5"
|
||||
parse-bmfont-xml "^1.1.4"
|
||||
phin "^2.9.1"
|
||||
xhr "^2.0.1"
|
||||
xtend "^4.0.0"
|
||||
|
||||
lodash._baseassign@^3.0.0:
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e"
|
||||
integrity sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=
|
||||
dependencies:
|
||||
lodash._basecopy "^3.0.0"
|
||||
lodash.keys "^3.0.0"
|
||||
|
||||
lodash._basecopy@^3.0.0:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
|
||||
integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=
|
||||
|
||||
lodash._basecreate@^3.0.0:
|
||||
version "3.0.3"
|
||||
resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821"
|
||||
integrity sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=
|
||||
|
||||
lodash._getnative@^3.0.0:
|
||||
version "3.9.1"
|
||||
resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
|
||||
integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=
|
||||
|
||||
lodash._isiterateecall@^3.0.0:
|
||||
version "3.0.9"
|
||||
resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
|
||||
integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=
|
||||
|
||||
lodash.create@3.1.1:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7"
|
||||
integrity sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=
|
||||
dependencies:
|
||||
lodash._baseassign "^3.0.0"
|
||||
lodash._basecreate "^3.0.0"
|
||||
lodash._isiterateecall "^3.0.0"
|
||||
|
||||
lodash.isarguments@^3.0.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
|
||||
integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=
|
||||
|
||||
lodash.isarray@^3.0.0:
|
||||
version "3.0.4"
|
||||
resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
|
||||
integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=
|
||||
|
||||
lodash.keys@^3.0.0:
|
||||
version "3.1.2"
|
||||
resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
|
||||
integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=
|
||||
dependencies:
|
||||
lodash._getnative "^3.0.0"
|
||||
lodash.isarguments "^3.0.0"
|
||||
lodash.isarray "^3.0.0"
|
||||
|
||||
lodash@^4.15.0:
|
||||
version "4.17.11"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
|
||||
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
|
||||
|
||||
lolex@1.3.2:
|
||||
version "1.3.2"
|
||||
resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31"
|
||||
integrity sha1-fD2mL/yzDw9agKJWbKJORdigHzE=
|
||||
|
||||
mime@^1.3.4:
|
||||
version "1.6.0"
|
||||
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
|
||||
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
|
||||
|
||||
min-document@^2.19.0:
|
||||
version "2.19.0"
|
||||
resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
|
||||
integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
|
||||
dependencies:
|
||||
dom-walk "^0.1.0"
|
||||
|
||||
minimatch@^3.0.2:
|
||||
version "3.0.4"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
|
||||
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
|
||||
dependencies:
|
||||
brace-expansion "^1.1.7"
|
||||
|
||||
minimist@0.0.8:
|
||||
version "0.0.8"
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
|
||||
integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
|
||||
|
||||
mkdirp@0.5.1:
|
||||
version "0.5.1"
|
||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
|
||||
integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
|
||||
dependencies:
|
||||
minimist "0.0.8"
|
||||
|
||||
mocha@^3.0.2:
|
||||
version "3.5.3"
|
||||
resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.3.tgz#1e0480fe36d2da5858d1eb6acc38418b26eaa20d"
|
||||
integrity sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==
|
||||
dependencies:
|
||||
browser-stdout "1.3.0"
|
||||
commander "2.9.0"
|
||||
debug "2.6.8"
|
||||
diff "3.2.0"
|
||||
escape-string-regexp "1.0.5"
|
||||
glob "7.1.1"
|
||||
growl "1.9.2"
|
||||
he "1.1.1"
|
||||
json3 "3.3.2"
|
||||
lodash.create "3.1.1"
|
||||
mkdirp "0.5.1"
|
||||
supports-color "3.1.2"
|
||||
|
||||
ms@2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
|
||||
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
|
||||
|
||||
object-keys@^1.0.12:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
|
||||
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
|
||||
|
||||
object.entries@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519"
|
||||
integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==
|
||||
dependencies:
|
||||
define-properties "^1.1.3"
|
||||
es-abstract "^1.12.0"
|
||||
function-bind "^1.1.1"
|
||||
has "^1.0.3"
|
||||
|
||||
omggif@^1.0.9:
|
||||
version "1.0.9"
|
||||
resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.9.tgz#dcb7024dacd50c52b4d303f04802c91c057c765f"
|
||||
integrity sha1-3LcCTazVDFK00wPwSALJHAV8dl8=
|
||||
|
||||
once@^1.3.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
||||
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
|
||||
dependencies:
|
||||
wrappy "1"
|
||||
|
||||
pako@^1.0.5:
|
||||
version "1.0.10"
|
||||
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732"
|
||||
integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==
|
||||
|
||||
parse-bmfont-ascii@^1.0.3:
|
||||
version "1.0.6"
|
||||
resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285"
|
||||
integrity sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=
|
||||
|
||||
parse-bmfont-binary@^1.0.5:
|
||||
version "1.0.6"
|
||||
resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006"
|
||||
integrity sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=
|
||||
|
||||
parse-bmfont-xml@^1.1.4:
|
||||
version "1.1.4"
|
||||
resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz#015319797e3e12f9e739c4d513872cd2fa35f389"
|
||||
integrity sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==
|
||||
dependencies:
|
||||
xml-parse-from-string "^1.0.0"
|
||||
xml2js "^0.4.5"
|
||||
|
||||
parse-headers@^2.0.0:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.2.tgz#9545e8a4c1ae5eaea7d24992bca890281ed26e34"
|
||||
integrity sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==
|
||||
dependencies:
|
||||
for-each "^0.3.3"
|
||||
string.prototype.trim "^1.1.2"
|
||||
|
||||
path-is-absolute@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
|
||||
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
|
||||
|
||||
phin@^2.9.1:
|
||||
version "2.9.3"
|
||||
resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c"
|
||||
integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==
|
||||
|
||||
pixelmatch@^4.0.2:
|
||||
version "4.0.2"
|
||||
resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854"
|
||||
integrity sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=
|
||||
dependencies:
|
||||
pngjs "^3.0.0"
|
||||
|
||||
pngjs@^3.0.0, pngjs@^3.3.3:
|
||||
version "3.4.0"
|
||||
resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f"
|
||||
integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==
|
||||
|
||||
process@~0.5.1:
|
||||
version "0.5.2"
|
||||
resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
|
||||
integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=
|
||||
|
||||
regenerator-runtime@^0.13.2:
|
||||
version "0.13.2"
|
||||
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447"
|
||||
integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==
|
||||
|
||||
safe-buffer@^5.1.2:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
|
||||
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
|
||||
|
||||
samsam@1.1.2:
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567"
|
||||
integrity sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=
|
||||
|
||||
samsam@~1.1:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.3.tgz#9f5087419b4d091f232571e7fa52e90b0f552621"
|
||||
integrity sha1-n1CHQZtNCR8jJXHn+lLpCw9VJiE=
|
||||
|
||||
sax@>=0.6.0:
|
||||
version "1.2.4"
|
||||
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
|
||||
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
|
||||
|
||||
should-equal@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-1.0.1.tgz#0b6e9516f2601a9fb0bb2dcc369afa1c7e200af7"
|
||||
integrity sha1-C26VFvJgGp+wuy3MNpr6HH4gCvc=
|
||||
dependencies:
|
||||
should-type "^1.0.0"
|
||||
|
||||
should-format@^3.0.2:
|
||||
version "3.0.3"
|
||||
resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1"
|
||||
integrity sha1-m/yPdPo5IFxT04w01xcwPidxJPE=
|
||||
dependencies:
|
||||
should-type "^1.3.0"
|
||||
should-type-adaptors "^1.0.1"
|
||||
|
||||
should-sinon@0.0.5:
|
||||
version "0.0.5"
|
||||
resolved "https://registry.yarnpkg.com/should-sinon/-/should-sinon-0.0.5.tgz#ffc8a851bf450767e7d0ad22ff8715650be950e4"
|
||||
integrity sha1-/8ioUb9FB2fn0K0i/4cVZQvpUOQ=
|
||||
|
||||
should-type-adaptors@^1.0.1:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a"
|
||||
integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==
|
||||
dependencies:
|
||||
should-type "^1.3.0"
|
||||
should-util "^1.0.0"
|
||||
|
||||
should-type@^1.0.0, should-type@^1.3.0, should-type@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3"
|
||||
integrity sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=
|
||||
|
||||
should-util@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.0.tgz#c98cda374aa6b190df8ba87c9889c2b4db620063"
|
||||
integrity sha1-yYzaN0qmsZDfi6h8mInCtNtiAGM=
|
||||
|
||||
should@^11.1.0:
|
||||
version "11.2.1"
|
||||
resolved "https://registry.yarnpkg.com/should/-/should-11.2.1.tgz#90f55145552d01cfc200666e4e818a1c9670eda2"
|
||||
integrity sha1-kPVRRVUtAc/CAGZuToGKHJZw7aI=
|
||||
dependencies:
|
||||
should-equal "^1.0.0"
|
||||
should-format "^3.0.2"
|
||||
should-type "^1.4.0"
|
||||
should-type-adaptors "^1.0.1"
|
||||
should-util "^1.0.0"
|
||||
|
||||
sinon@^1.17.5:
|
||||
version "1.17.7"
|
||||
resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.7.tgz#4542a4f49ba0c45c05eb2e9dd9d203e2b8efe0bf"
|
||||
integrity sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=
|
||||
dependencies:
|
||||
formatio "1.1.1"
|
||||
lolex "1.3.2"
|
||||
samsam "1.1.2"
|
||||
util ">=0.10.3 <1"
|
||||
|
||||
string.prototype.trim@^1.1.2:
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea"
|
||||
integrity sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=
|
||||
dependencies:
|
||||
define-properties "^1.1.2"
|
||||
es-abstract "^1.5.0"
|
||||
function-bind "^1.0.2"
|
||||
|
||||
supports-color@3.1.2:
|
||||
version "3.1.2"
|
||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5"
|
||||
integrity sha1-cqJiiU2dQIuVbKBf83su2KbiotU=
|
||||
dependencies:
|
||||
has-flag "^1.0.0"
|
||||
|
||||
timm@^1.6.1:
|
||||
version "1.6.1"
|
||||
resolved "https://registry.yarnpkg.com/timm/-/timm-1.6.1.tgz#5f8aafc932248c76caf2c6af60542a32d3c30701"
|
||||
integrity sha512-hqDTYi/bWuDxL2i6T3v6nrvkAQ/1Bc060GSkVEQZp02zTSTB4CHSKsOkliequCftQaNRcjRqUZmpGWs5FfhrNg==
|
||||
|
||||
tinycolor2@^1.4.1:
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8"
|
||||
integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=
|
||||
|
||||
utif@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/utif/-/utif-2.0.1.tgz#9e1582d9bbd20011a6588548ed3266298e711759"
|
||||
integrity sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==
|
||||
dependencies:
|
||||
pako "^1.0.5"
|
||||
|
||||
"util@>=0.10.3 <1":
|
||||
version "0.12.0"
|
||||
resolved "https://registry.yarnpkg.com/util/-/util-0.12.0.tgz#bb5e3d29ba2703c7add0ad337003be3ca477798a"
|
||||
integrity sha512-pPSOFl7VLhZ7LO/SFABPraZEEurkJUWSMn3MuA/r3WQZc+Z1fqou2JqLSOZbCLl73EUIxuUVX8X4jkX2vfJeAA==
|
||||
dependencies:
|
||||
inherits "2.0.3"
|
||||
is-arguments "^1.0.4"
|
||||
is-generator-function "^1.0.7"
|
||||
object.entries "^1.1.0"
|
||||
safe-buffer "^5.1.2"
|
||||
|
||||
wrappy@1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
||||
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
|
||||
|
||||
xhr@^2.0.1:
|
||||
version "2.5.0"
|
||||
resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd"
|
||||
integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==
|
||||
dependencies:
|
||||
global "~4.3.0"
|
||||
is-function "^1.0.1"
|
||||
parse-headers "^2.0.0"
|
||||
xtend "^4.0.0"
|
||||
|
||||
xml-parse-from-string@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28"
|
||||
integrity sha1-qQKekp09vN7RafPG4oI42VpdWig=
|
||||
|
||||
xml2js@^0.4.5:
|
||||
version "0.4.19"
|
||||
resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
|
||||
integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==
|
||||
dependencies:
|
||||
sax ">=0.6.0"
|
||||
xmlbuilder "~9.0.1"
|
||||
|
||||
xmlbuilder@~9.0.1:
|
||||
version "9.0.7"
|
||||
resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
|
||||
integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=
|
||||
|
||||
xtend@^4.0.0:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
|
||||
integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
|
||||
Reference in New Issue
Block a user