summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgregor herrmann <gregoa@debian.org>2022-07-14 11:24:08 +0200
committergregor herrmann <gregoa@debian.org>2022-07-14 11:24:08 +0200
commit4422e134b05bebc2dd147dca5d3816db893bfda9 (patch)
tree8853f2e8f2f405adb9e5c5c554543de47213ad0e
parent28c1e3b461463116dbb2146d97dae9656498ad1f (diff)
New upstream version 2.403.2
-rw-r--r--Changes84
-rw-r--r--LICENSE556
-rw-r--r--MANIFEST312
-rw-r--r--META.json109
-rw-r--r--META.yml76
-rw-r--r--Makefile.PL16
-rw-r--r--README430
-rw-r--r--Readme.md50
-rw-r--r--TODO16
-rw-r--r--cpanfile5
-rw-r--r--dist.ini59
-rw-r--r--doc/LaTeX/Appendix.tex14
-rw-r--r--doc/LaTeX/AppendixRGB.tex879
-rw-r--r--doc/LaTeX/Aufbau.pngbin6175 -> 0 bytes
-rw-r--r--doc/LaTeX/Bars.tex84
-rw-r--r--doc/LaTeX/Base.tex497
-rw-r--r--doc/LaTeX/Composite.tex136
-rw-r--r--doc/LaTeX/Direction.tex125
-rw-r--r--doc/LaTeX/Documentation.pdfbin389668 -> 0 bytes
-rw-r--r--doc/LaTeX/Documentation.tex81
-rw-r--r--doc/LaTeX/Elemente.pngbin6656 -> 0 bytes
-rw-r--r--doc/LaTeX/ErrorBars.tex119
-rw-r--r--doc/LaTeX/HorizontalBars.tex58
-rw-r--r--doc/LaTeX/Lines.tex102
-rw-r--r--doc/LaTeX/LinesPoints.tex153
-rw-r--r--doc/LaTeX/Mountain.tex47
-rw-r--r--doc/LaTeX/Pareto.tex73
-rw-r--r--doc/LaTeX/Pie.tex78
-rw-r--r--doc/LaTeX/Points.tex122
-rw-r--r--doc/LaTeX/Split.tex99
-rw-r--r--doc/LaTeX/Stacked.tex53
-rw-r--r--doc/LaTeX/brushstyles.pngbin4326 -> 0 bytes
-rw-r--r--doc/LaTeX/composite.pngbin2257 -> 0 bytes
-rw-r--r--doc/LaTeX/d_bars.pngbin4466 -> 0 bytes
-rw-r--r--doc/LaTeX/d_hbars4.pngbin1452 -> 0 bytes
-rw-r--r--doc/LaTeX/d_lines2.pngbin3754 -> 0 bytes
-rw-r--r--doc/LaTeX/d_linesp2.pngbin5733 -> 0 bytes
-rw-r--r--doc/LaTeX/d_pareto2.pngbin3426 -> 0 bytes
-rw-r--r--doc/LaTeX/d_pie3.pngbin2924 -> 0 bytes
-rw-r--r--doc/LaTeX/definitions.tex155
-rw-r--r--doc/LaTeX/description.tex197
-rw-r--r--doc/LaTeX/direction.pngbin7921 -> 0 bytes
-rw-r--r--doc/LaTeX/error.pngbin1601 -> 0 bytes
-rw-r--r--doc/LaTeX/mountain.pngbin2258 -> 0 bytes
-rw-r--r--doc/LaTeX/points.pngbin1330 -> 0 bytes
-rw-r--r--doc/LaTeX/rgb.dat414
-rw-r--r--doc/LaTeX/rgb.tex416
-rw-r--r--doc/LaTeX/stackedbars.pngbin1712 -> 0 bytes
-rw-r--r--doc/LaTeX/stunde.pngbin4163 -> 0 bytes
-rw-r--r--lib/Chart.pm522
-rw-r--r--lib/Chart/Bars.pm2
-rw-r--r--lib/Chart/Base.pm880
-rw-r--r--lib/Chart/BrushStyles.pm3
-rw-r--r--lib/Chart/Color.pm525
-rw-r--r--lib/Chart/Color/Constant.pm1136
-rw-r--r--lib/Chart/Color/Named.pm502
-rw-r--r--lib/Chart/Color/Scheme.pm105
-rw-r--r--lib/Chart/Color/Value.pm262
-rw-r--r--lib/Chart/Composite.pm76
-rw-r--r--lib/Chart/Constants.pm2
-rw-r--r--lib/Chart/Direction.pm2
-rw-r--r--lib/Chart/ErrorBars.pm2
-rw-r--r--lib/Chart/Font.pm90
-rw-r--r--lib/Chart/HorizontalBars.pm2
-rw-r--r--lib/Chart/Lines.pm2
-rw-r--r--lib/Chart/LinesPoints.pm2
-rw-r--r--lib/Chart/Manual.pod56
-rw-r--r--lib/Chart/Manual/Methods.pod68
-rw-r--r--lib/Chart/Manual/Properties.pod805
-rw-r--r--lib/Chart/Manual/Types.pod251
-rw-r--r--lib/Chart/Manual/Workflows.pod25
-rw-r--r--lib/Chart/Mountain.pm2
-rw-r--r--lib/Chart/Pareto.pm2
-rw-r--r--lib/Chart/Pie.pm13
-rw-r--r--lib/Chart/Points.pm2
-rw-r--r--lib/Chart/Property.pm34
-rw-r--r--lib/Chart/Split.pm2
-rw-r--r--lib/Chart/StackedBars.pm4
-rw-r--r--t/001_color_value.t169
-rw-r--r--t/002_color_constant.t125
-rw-r--r--t/003_color.t372
-rw-r--r--t/bars.t1
-rw-r--r--t/hbars_2.t2
-rw-r--r--t/mountain.t2
-rw-r--r--t/mountain_2.t2
-rw-r--r--t/patterns/PATTERN0.GIF (renamed from patterns/PATTERN0.GIF)bin54 -> 54 bytes
-rw-r--r--t/patterns/PATTERN0.PNG (renamed from patterns/PATTERN0.PNG)bin134 -> 134 bytes
-rw-r--r--t/patterns/PATTERN1.GIF (renamed from patterns/PATTERN1.GIF)bin55 -> 55 bytes
-rw-r--r--t/patterns/PATTERN1.PNG (renamed from patterns/PATTERN1.PNG)bin125 -> 125 bytes
-rw-r--r--t/patterns/PATTERN2.GIF (renamed from patterns/PATTERN2.GIF)bin53 -> 53 bytes
-rw-r--r--t/patterns/PATTERN2.PNG (renamed from patterns/PATTERN2.PNG)bin129 -> 129 bytes
-rw-r--r--t/patterns/PATTERN3.GIF (renamed from patterns/PATTERN3.GIF)bin53 -> 53 bytes
-rw-r--r--t/patterns/PATTERN3.PNG (renamed from patterns/PATTERN3.PNG)bin126 -> 126 bytes
-rw-r--r--t/patterns/PATTERN4.GIF (renamed from patterns/PATTERN4.GIF)bin55 -> 55 bytes
-rw-r--r--t/patterns/PATTERN4.PNG (renamed from patterns/PATTERN4.PNG)bin130 -> 130 bytes
-rw-r--r--t/patterns/PATTERN5.GIF (renamed from patterns/PATTERN5.GIF)bin56 -> 56 bytes
-rw-r--r--t/patterns/PATTERN5.PNG (renamed from patterns/PATTERN5.PNG)bin128 -> 128 bytes
-rw-r--r--t/split_1.t5
98 files changed, 4844 insertions, 6828 deletions
diff --git a/Changes b/Changes
index f42c342..bf6c095 100644
--- a/Changes
+++ b/Changes
@@ -1,21 +1,73 @@
-
-2.401.1 2022-04-04
- = minor fix release & test for init dzil file
- ~ new file headers
- ! 2 patches by Petr Pisar fixing tests
- ? expanded TODO
-
-2.400.10 2022-04-02
- = Testrelease for new metafiles
- + cpan file
-
-2.400.5 2022-03-31
- = Upload fix for failed 2.4.19 .. 2.400.04
- ~ first upload by new maintainer: LICHTKIND
- + files CONTRIBUTING
+2.403.2 2022-08-13 lichtkind
+-------
+ * = POD fix release
+ * ? completed properties page in manual
+ * ? started types page in manual with first test example
+ * ! linkfixes on landing POD of Chart.pm
+ * ! linkfixes on Color::Constants.pm POD
+
+2.403.1 2022-08-12 lichtkind
+-------
+ * = POD fix release
+ * ? completed most of properties
+ * ? all names listed in Color::Constants.POD
+
+2.403.0 2022-08-07 lichtkind
+-------
+ * = test release to check metacpan POD parser
+ * + added Chart::Manual + property sub page
+ * - drop PDF and HTML documentation
+ * - drop dependency on module: POSIX
+
+2.402.3 2022-07-18 lichtkind
+-------
+ * + string method to Color objects
+ * ? fixed #18891 : document that y_ticks1, y_ticks2 is composite only
+ * ! fixed (not interrupting Color::Value::distance_rgb even sub sub carped)
+
+2.402.2 2022-06-15 lichtkind
+-------
+ * ? linking POD of Chart::Color.pm
+ * ? POD typo f_y_ticks1 => f_y_tick1
+ * ? document -ring setting for ring charts
+ * ! added shebang to new tests by Petr Pisar
+
+2.402.1 2022-06-09 lichtkind
+-------
+ * ! fixing color value rounding in Chart::Color::Value
+
+2.402.0 2022-06-08 lichtkind
+-------
+ * = first minor feature add under new maintainer
+ * # main theme: colors
+ * + added 3 classes of Graph::Color::*
+ * + get pantone report colors by name
+ * + access to external color libs of Graphics::ColorNames::* via syntax: 'standard_name:color_name'
+ * + full fledged color objects (also for later use)
+ * ~ slight change in default colors for more calm professional look
+ * ! fixed and added colors from X11 and HTML standard
+ * ! fixing licence issues back to Perl 5
+
+2.401.1 2022-04-04 lichtkind
+-------
+ * = minor fix release & test for init dzil file
+ * ~ new file headers
+ * ! 2 patches by Petr Pisar fixing tests
+ * ? expanded TODO
+
+2.400.10 2022-04-02 lichtkind
+-------
+ * = Testrelease for new metafiles
+ * + cpan file
+
+2.400.5 2022-03-31 lichtkind
+-------
+ * = Upload fix for failed 2.4.19 .. 2.400.04
+ * ~ first upload by new maintainer: LICHTKIND
+ * + files CONTRIBUTING
2.4.10 Upload to pause.perl.org failed for version 2.4.9. Therefore, the version 2.4.9 was renamed to 2.4.10
- for a new upload.
+ for a new upload.
2.4.9 Upload to pause.perl.org failed for version 2.4.8. Therefore, the version 2.4.8 was renamed to 2.4.9
for a new upload.
diff --git a/LICENSE b/LICENSE
index d5fe75f..b36b73d 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,207 +1,379 @@
-This software is Copyright (c) 1997-2022 by Chart-Group <chartgrp@web.de>.
-
-This is free software, licensed under:
-
- The Artistic License 2.0 (GPL Compatible)
-
- The Artistic License 2.0
-
- Copyright (c) 2000-2006, The Perl Foundation.
-
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-Preamble
-
-This license establishes the terms under which a given free software
-Package may be copied, modified, distributed, and/or redistributed.
-The intent is that the Copyright Holder maintains some artistic
-control over the development of that Package while still keeping the
-Package available as open source and free software.
-
-You are always permitted to make arrangements wholly outside of this
-license directly with the Copyright Holder of a given Package. If the
-terms of this license do not permit the full use that you propose to
-make of the Package, you should contact the Copyright Holder and seek
-a different licensing arrangement.
-
-Definitions
+This software is copyright (c) 1997-2022 by Chart-Group <chartgrp@web.de>.
- "Copyright Holder" means the individual(s) or organization(s)
- named in the copyright notice for the entire Package.
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
- "Contributor" means any party that has contributed code or other
- material to the Package, in accordance with the Copyright Holder's
- procedures.
+Terms of the Perl programming language system itself
- "You" and "your" means any person who would like to copy,
- distribute, or modify the Package.
+a) the GNU General Public License as published by the Free
+ Software Foundation; either version 1, or (at your option) any
+ later version, or
+b) the "Artistic License"
- "Package" means the collection of files distributed by the
- Copyright Holder, and derivatives of that collection and/or of
- those files. A given Package may consist of either the Standard
- Version, or a Modified Version.
+--- The GNU General Public License, Version 1, February 1989 ---
- "Distribute" means providing a copy of the Package or making it
- accessible to anyone else, or in the case of a company or
- organization, to others outside of your company or organization.
-
- "Distributor Fee" means any fee that you charge for Distributing
- this Package or providing support for this Package to another
- party. It does not mean licensing fees.
-
- "Standard Version" refers to the Package if it has not been
- modified, or has been modified only in ways explicitly requested
- by the Copyright Holder.
-
- "Modified Version" means the Package, if it has been changed, and
- such changes were not explicitly requested by the Copyright
- Holder.
-
- "Original License" means this Artistic License as Distributed with
- the Standard Version of the Package, in its current version or as
- it may be modified by The Perl Foundation in the future.
-
- "Source" form means the source code, documentation source, and
- configuration files for the Package.
-
- "Compiled" form means the compiled bytecode, object code, binary,
- or any other form resulting from mechanical transformation or
- translation of the Source form.
+This software is Copyright (c) 1997-2022 by Chart-Group <chartgrp@web.de>.
+This is free software, licensed under:
+
+ The GNU General Public License, Version 1, February 1989
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 1, February 1989
+
+ Copyright (C) 1989 Free Software Foundation, Inc.
+ 51 Franklin St, 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 license agreements of most software companies try to keep users
+at the mercy of those companies. By contrast, our 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. The
+General Public License applies to the Free Software Foundation's
+software and to any other program whose authors commit to using it.
+You can use it for your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Specifically, the General Public License is designed to make
+sure that you have the freedom to give away or sell copies of free
+software, 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 a 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 tell them 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.
+
+ 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 Agreement 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 work containing the
+Program or a portion of it, either verbatim or with modifications. Each
+licensee is addressed as "you".
+
+ 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
+General Public License and to the absence of any warranty; and give any
+other recipients of the Program a copy of this General Public License
+along with the Program. You may charge a fee for the physical act of
+transferring a copy.
+
+ 2. You may modify your copy or copies of the Program or any portion of
+it, and copy and distribute such modifications under the terms of Paragraph
+1 above, provided that you also do the following:
+
+ a) cause the modified files to carry prominent notices stating that
+ you changed the files and the date of any change; and
+
+ b) cause the whole of any work that you distribute or publish, that
+ in whole or in part contains the Program or any part thereof, either
+ with or without modifications, to be licensed at no charge to all
+ third parties under the terms of this General Public License (except
+ that you may choose to grant warranty protection to some or all
+ third parties, at your option).
+
+ c) If the modified program normally reads commands interactively when
+ run, you must cause it, when started running for such interactive use
+ in the simplest and most usual 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 General
+ Public License.
+
+ d) 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.
+
+Mere aggregation of another independent work with the Program (or its
+derivative) on a volume of a storage or distribution medium does not bring
+the other work under the scope of these terms.
+
+ 3. You may copy and distribute the Program (or a portion or derivative of
+it, under Paragraph 2) in object code or executable form under the terms of
+Paragraphs 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
+ Paragraphs 1 and 2 above; or,
+
+ b) accompany it with a written offer, valid for at least three
+ years, to give any third party free (except for a nominal charge
+ for the cost of distribution) a complete machine-readable copy of the
+ corresponding source code, to be distributed under the terms of
+ Paragraphs 1 and 2 above; or,
+
+ c) accompany it with the information you received as to where the
+ corresponding source code may be obtained. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form alone.)
+
+Source code for a work means the preferred form of the work for making
+modifications to it. For an executable file, complete source code means
+all the source code for all modules it contains; but, as a special
+exception, it need not include source code for modules which are standard
+libraries that accompany the operating system on which the executable
+file runs, or for standard header files or definitions files that
+accompany that operating system.
+
+ 4. You may not copy, modify, sublicense, distribute or transfer the
+Program except as expressly provided under this General Public License.
+Any attempt otherwise to copy, modify, sublicense, distribute or transfer
+the Program is void, and will automatically terminate your rights to use
+the Program under this License. However, parties who have received
+copies, or rights to use copies, from you under this General Public
+License will not have their licenses terminated so long as such parties
+remain in full compliance.
+
+ 5. By copying, distributing or modifying 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.
+
+ 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.
+
+ 7. 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 the 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
+the license, you may choose any version ever published by the Free Software
+Foundation.
+
+ 8. 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
+
+ 9. 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.
+
+ 10. 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
+
+ Appendix: 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 humanity, 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.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ 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 1, 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) 19xx 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 a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ program `Gnomovision' (a program to direct compilers to make passes
+ at assemblers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+That's all there is to it!
-Permission for Use and Modification Without Distribution
-(1) You are permitted to use the Standard Version and create and use
-Modified Versions for any purpose without restriction, provided that
-you do not Distribute the Modified Version.
+--- The Artistic License 1.0 ---
+This software is Copyright (c) 1997-2022 by Chart-Group <chartgrp@web.de>.
-Permissions for Redistribution of the Standard Version
+This is free software, licensed under:
-(2) You may Distribute verbatim copies of the Source form of the
-Standard Version of this Package in any medium without restriction,
-either gratis or for a Distributor Fee, provided that you duplicate
-all of the original copyright notices and associated disclaimers. At
-your discretion, such verbatim copies may or may not include a
-Compiled form of the Package.
+ The Artistic License 1.0
-(3) You may apply any bug fixes, portability changes, and other
-modifications made available from the Copyright Holder. The resulting
-Package will still be considered the Standard Version, and as such
-will be subject to the Original License.
+The Artistic License
+Preamble
-Distribution of Modified Versions of the Package as Source
+The intent of this document is to state the conditions under which a Package
+may be copied, such that the Copyright Holder maintains some semblance of
+artistic control over the development of the package, while giving the users of
+the package the right to use and distribute the Package in a more-or-less
+customary fashion, plus the right to make reasonable modifications.
+
+Definitions:
+
+ - "Package" refers to the collection of files distributed by the Copyright
+ Holder, and derivatives of that collection of files created through
+ textual modification.
+ - "Standard Version" refers to such a Package if it has not been modified,
+ or has been modified in accordance with the wishes of the Copyright
+ Holder.
+ - "Copyright Holder" is whoever is named in the copyright or copyrights for
+ the package.
+ - "You" is you, if you're thinking about copying or distributing this Package.
+ - "Reasonable copying fee" is whatever you can justify on the basis of media
+ cost, duplication charges, time of people involved, and so on. (You will
+ not be required to justify it to the Copyright Holder, but only to the
+ computing community at large as a market that must bear the fee.)
+ - "Freely Available" means that no fee is charged for the item itself, though
+ there may be fees involved in handling the item. It also means that
+ recipients of the item may redistribute it under the same conditions they
+ received it.
+
+1. You may make and give away verbatim copies of the source form of the
+Standard Version of this Package without restriction, provided that you
+duplicate all of the original copyright notices and associated disclaimers.
+
+2. You may apply bug fixes, portability fixes and other modifications derived
+from the Public Domain or from the Copyright Holder. A Package modified in such
+a way shall still be considered the Standard Version.
+
+3. You may otherwise modify your copy of this Package in any way, provided that
+you insert a prominent notice in each changed file stating how and when you
+changed that file, and provided that you do at least ONE of the following:
+
+ a) place your modifications in the Public Domain or otherwise make them
+ Freely Available, such as by posting said modifications to Usenet or an
+ equivalent medium, or placing the modifications on a major archive site
+ such as ftp.uu.net, or by allowing the Copyright Holder to include your
+ modifications in the Standard Version of the Package.
+
+ b) use the modified Package only within your corporation or organization.
+
+ c) rename any non-standard executables so the names do not conflict with
+ standard executables, which must also be provided, and provide a separate
+ manual page for each non-standard executable that clearly documents how it
+ differs from the Standard Version.
+
+ d) make other distribution arrangements with the Copyright Holder.
+
+4. You may distribute the programs of this Package in object code or executable
+form, provided that you do at least ONE of the following:
+
+ a) distribute a Standard Version of the executables and library files,
+ together with instructions (in the manual page or equivalent) on where to
+ get the Standard Version.
+
+ b) accompany the distribution with the machine-readable source of the Package
+ with your modifications.
+
+ c) accompany any non-standard executables with their corresponding Standard
+ Version executables, giving the non-standard executables non-standard
+ names, and clearly documenting the differences in manual pages (or
+ equivalent), together with instructions on where to get the Standard
+ Version.
+
+ d) make other distribution arrangements with the Copyright Holder.
+
+5. You may charge a reasonable copying fee for any distribution of this
+Package. You may charge any fee you choose for support of this Package. You
+may not charge a fee for this Package itself. However, you may distribute this
+Package in aggregate with other (possibly commercial) programs as part of a
+larger (possibly commercial) software distribution provided that you do not
+advertise this Package as a product of your own.
+
+6. The scripts and library files supplied as input to or produced as output
+from the programs of this Package do not automatically fall under the copyright
+of this Package, but belong to whomever generated them, and may be sold
+commercially, and may be aggregated with this Package.
+
+7. C or perl subroutines supplied by you and linked into this Package shall not
+be considered part of this Package.
+
+8. The name of the Copyright Holder may not be used to endorse or promote
+products derived from this software without specific prior written permission.
+
+9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+The End
-(4) You may Distribute your Modified Version as Source (either gratis
-or for a Distributor Fee, and with or without a Compiled form of the
-Modified Version) provided that you clearly document how it differs
-from the Standard Version, including, but not limited to, documenting
-any non-standard features, executables, or modules, and provided that
-you do at least ONE of the following:
-
- (a) make the Modified Version available to the Copyright Holder
- of the Standard Version, under the Original License, so that the
- Copyright Holder may include your modifications in the Standard
- Version.
-
- (b) ensure that installation of your Modified Version does not
- prevent the user installing or running the Standard Version. In
- addition, the Modified Version must bear a name that is different
- from the name of the Standard Version.
-
- (c) allow anyone who receives a copy of the Modified Version to
- make the Source form of the Modified Version available to others
- under
-
- (i) the Original License or
-
- (ii) a license that permits the licensee to freely copy,
- modify and redistribute the Modified Version using the same
- licensing terms that apply to the copy that the licensee
- received, and requires that the Source form of the Modified
- Version, and of any works derived from it, be made freely
- available in that license fees are prohibited but Distributor
- Fees are allowed.
-
-
-Distribution of Compiled Forms of the Standard Version
-or Modified Versions without the Source
-
-(5) You may Distribute Compiled forms of the Standard Version without
-the Source, provided that you include complete instructions on how to
-get the Source of the Standard Version. Such instructions must be
-valid at the time of your distribution. If these instructions, at any
-time while you are carrying out such distribution, become invalid, you
-must provide new instructions on demand or cease further distribution.
-If you provide valid instructions or cease distribution within thirty
-days after you become aware that the instructions are invalid, then
-you do not forfeit any of your rights under this license.
-
-(6) You may Distribute a Modified Version in Compiled form without
-the Source, provided that you comply with Section 4 with respect to
-the Source of the Modified Version.
-
-
-Aggregating or Linking the Package
-
-(7) You may aggregate the Package (either the Standard Version or
-Modified Version) with other packages and Distribute the resulting
-aggregation provided that you do not charge a licensing fee for the
-Package. Distributor Fees are permitted, and licensing fees for other
-components in the aggregation are permitted. The terms of this license
-apply to the use and Distribution of the Standard or Modified Versions
-as included in the aggregation.
-
-(8) You are permitted to link Modified and Standard Versions with
-other works, to embed the Package in a larger work of your own, or to
-build stand-alone binary or bytecode versions of applications that
-include the Package, and Distribute the result without restriction,
-provided the result does not expose a direct interface to the Package.
-
-
-Items That are Not Considered Part of a Modified Version
-
-(9) Works (including, but not limited to, modules and scripts) that
-merely extend or make use of the Package, do not, by themselves, cause
-the Package to be a Modified Version. In addition, such works are not
-considered parts of the Package itself, and are not subject to the
-terms of this license.
-
-
-General Provisions
-
-(10) Any use, modification, and distribution of the Standard or
-Modified Versions is governed by this Artistic License. By using,
-modifying or distributing the Package, you accept this license. Do not
-use, modify, or distribute the Package, if you do not accept this
-license.
-
-(11) If your Modified Version has been derived from a Modified
-Version made by someone other than you, you are nevertheless required
-to ensure that your Modified Version complies with the requirements of
-this license.
-
-(12) This license does not grant you the right to use any trademark,
-service mark, tradename, or logo of the Copyright Holder.
-
-(13) This license includes the non-exclusive, worldwide,
-free-of-charge patent license to make, have made, use, offer to sell,
-sell, import and otherwise transfer the Package with respect to any
-patent claims licensable by the Copyright Holder that are necessarily
-infringed by the Package. If you institute patent litigation
-(including a cross-claim or counterclaim) against any party alleging
-that the Package constitutes direct or contributory patent
-infringement, then this Artistic License to you shall terminate on the
-date that such litigation is filed.
-
-(14) Disclaimer of Warranty:
-THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS
-IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED
-WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
-NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL
-LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/MANIFEST b/MANIFEST
index ad55af1..181aadd 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -1,319 +1,45 @@
-# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.024.
+# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.025.
CONTRIBUTING
Changes
-Documentation.pdf
LICENSE
MANIFEST
META.json
META.yml
Makefile.PL
README
-Readme.md
TODO
cpanfile
dist.ini
-doc/LaTeX/Appendix.tex
-doc/LaTeX/AppendixRGB.tex
-doc/LaTeX/Aufbau.png
-doc/LaTeX/Bars.tex
-doc/LaTeX/Base.tex
-doc/LaTeX/Composite.tex
-doc/LaTeX/Direction.tex
-doc/LaTeX/Documentation.pdf
-doc/LaTeX/Documentation.tex
-doc/LaTeX/Elemente.png
-doc/LaTeX/ErrorBars.tex
-doc/LaTeX/HorizontalBars.tex
-doc/LaTeX/Lines.tex
-doc/LaTeX/LinesPoints.tex
-doc/LaTeX/Mountain.tex
-doc/LaTeX/Pareto.tex
-doc/LaTeX/Pie.tex
-doc/LaTeX/Points.tex
-doc/LaTeX/Split.tex
-doc/LaTeX/Stacked.tex
-doc/LaTeX/brushstyles.png
-doc/LaTeX/composite.png
-doc/LaTeX/d_bars.png
-doc/LaTeX/d_hbars4.png
-doc/LaTeX/d_lines2.png
-doc/LaTeX/d_linesp2.png
-doc/LaTeX/d_pareto2.png
-doc/LaTeX/d_pie3.png
-doc/LaTeX/definitions.tex
-doc/LaTeX/description.tex
-doc/LaTeX/direction.png
-doc/LaTeX/error.png
-doc/LaTeX/mountain.png
-doc/LaTeX/points.png
-doc/LaTeX/rgb.dat
-doc/LaTeX/rgb.tex
-doc/LaTeX/stackedbars.png
-doc/LaTeX/stunde.png
-doc/html/Bars_8pm.html
-doc/html/Base_8pm.html
-doc/html/BrushStyles_8pm.html
-doc/html/Composite_8pm.html
-doc/html/Constants_8pm.html
-doc/html/Direction_8pm.html
-doc/html/ErrorBars_8pm.html
-doc/html/HorizontalBars_8pm.html
-doc/html/LinesPoints_8pm.html
-doc/html/Lines_8pm.html
-doc/html/Mountain_8pm.html
-doc/html/Pareto_8pm.html
-doc/html/Pie_8pm.html
-doc/html/Points_8pm.html
-doc/html/Split_8pm.html
-doc/html/StackedBars_8pm.html
-doc/html/annotated.html
-doc/html/annotated.js
-doc/html/bc_s.png
-doc/html/bdwn.png
-doc/html/classChart_1_1Bars-members.html
-doc/html/classChart_1_1Bars.html
-doc/html/classChart_1_1Bars.js
-doc/html/classChart_1_1Bars__coll__graph.map
-doc/html/classChart_1_1Bars__coll__graph.md5
-doc/html/classChart_1_1Bars__coll__graph.png
-doc/html/classChart_1_1Bars__inherit__graph.map
-doc/html/classChart_1_1Bars__inherit__graph.md5
-doc/html/classChart_1_1Bars__inherit__graph.png
-doc/html/classChart_1_1Base-members.html
-doc/html/classChart_1_1Base.html
-doc/html/classChart_1_1Base.js
-doc/html/classChart_1_1Base__coll__graph.map
-doc/html/classChart_1_1Base__coll__graph.md5
-doc/html/classChart_1_1Base__coll__graph.png
-doc/html/classChart_1_1Base__inherit__graph.map
-doc/html/classChart_1_1Base__inherit__graph.md5
-doc/html/classChart_1_1Base__inherit__graph.png
-doc/html/classChart_1_1BrushStyles-members.html
-doc/html/classChart_1_1BrushStyles.html
-doc/html/classChart_1_1BrushStyles.js
-doc/html/classChart_1_1BrushStyles__coll__graph.map
-doc/html/classChart_1_1BrushStyles__coll__graph.md5
-doc/html/classChart_1_1BrushStyles__coll__graph.png
-doc/html/classChart_1_1BrushStyles__inherit__graph.map
-doc/html/classChart_1_1BrushStyles__inherit__graph.md5
-doc/html/classChart_1_1BrushStyles__inherit__graph.png
-doc/html/classChart_1_1Composite-members.html
-doc/html/classChart_1_1Composite.html
-doc/html/classChart_1_1Composite.js
-doc/html/classChart_1_1Composite__coll__graph.map
-doc/html/classChart_1_1Composite__coll__graph.md5
-doc/html/classChart_1_1Composite__coll__graph.png
-doc/html/classChart_1_1Composite__inherit__graph.map
-doc/html/classChart_1_1Composite__inherit__graph.md5
-doc/html/classChart_1_1Composite__inherit__graph.png
-doc/html/classChart_1_1Constants.html
-doc/html/classChart_1_1Direction-members.html
-doc/html/classChart_1_1Direction.html
-doc/html/classChart_1_1Direction.js
-doc/html/classChart_1_1Direction__coll__graph.map
-doc/html/classChart_1_1Direction__coll__graph.md5
-doc/html/classChart_1_1Direction__coll__graph.png
-doc/html/classChart_1_1Direction__inherit__graph.map
-doc/html/classChart_1_1Direction__inherit__graph.md5
-doc/html/classChart_1_1Direction__inherit__graph.png
-doc/html/classChart_1_1ErrorBars-members.html
-doc/html/classChart_1_1ErrorBars.html
-doc/html/classChart_1_1ErrorBars.js
-doc/html/classChart_1_1ErrorBars__coll__graph.map
-doc/html/classChart_1_1ErrorBars__coll__graph.md5
-doc/html/classChart_1_1ErrorBars__coll__graph.png
-doc/html/classChart_1_1ErrorBars__inherit__graph.map
-doc/html/classChart_1_1ErrorBars__inherit__graph.md5
-doc/html/classChart_1_1ErrorBars__inherit__graph.png
-doc/html/classChart_1_1HorizontalBars-members.html
-doc/html/classChart_1_1HorizontalBars.html
-doc/html/classChart_1_1HorizontalBars.js
-doc/html/classChart_1_1HorizontalBars__coll__graph.map
-doc/html/classChart_1_1HorizontalBars__coll__graph.md5
-doc/html/classChart_1_1HorizontalBars__coll__graph.png
-doc/html/classChart_1_1HorizontalBars__inherit__graph.map
-doc/html/classChart_1_1HorizontalBars__inherit__graph.md5
-doc/html/classChart_1_1HorizontalBars__inherit__graph.png
-doc/html/classChart_1_1Lines-members.html
-doc/html/classChart_1_1Lines.html
-doc/html/classChart_1_1Lines.js
-doc/html/classChart_1_1LinesPoints-members.html
-doc/html/classChart_1_1LinesPoints.html
-doc/html/classChart_1_1LinesPoints.js
-doc/html/classChart_1_1LinesPoints__coll__graph.map
-doc/html/classChart_1_1LinesPoints__coll__graph.md5
-doc/html/classChart_1_1LinesPoints__coll__graph.png
-doc/html/classChart_1_1LinesPoints__inherit__graph.map
-doc/html/classChart_1_1LinesPoints__inherit__graph.md5
-doc/html/classChart_1_1LinesPoints__inherit__graph.png
-doc/html/classChart_1_1Lines__coll__graph.map
-doc/html/classChart_1_1Lines__coll__graph.md5
-doc/html/classChart_1_1Lines__coll__graph.png
-doc/html/classChart_1_1Lines__inherit__graph.map
-doc/html/classChart_1_1Lines__inherit__graph.md5
-doc/html/classChart_1_1Lines__inherit__graph.png
-doc/html/classChart_1_1Mountain-members.html
-doc/html/classChart_1_1Mountain.html
-doc/html/classChart_1_1Mountain.js
-doc/html/classChart_1_1Mountain__coll__graph.map
-doc/html/classChart_1_1Mountain__coll__graph.md5
-doc/html/classChart_1_1Mountain__coll__graph.png
-doc/html/classChart_1_1Mountain__inherit__graph.map
-doc/html/classChart_1_1Mountain__inherit__graph.md5
-doc/html/classChart_1_1Mountain__inherit__graph.png
-doc/html/classChart_1_1Pareto-members.html
-doc/html/classChart_1_1Pareto.html
-doc/html/classChart_1_1Pareto.js
-doc/html/classChart_1_1Pareto__coll__graph.map
-doc/html/classChart_1_1Pareto__coll__graph.md5
-doc/html/classChart_1_1Pareto__coll__graph.png
-doc/html/classChart_1_1Pareto__inherit__graph.map
-doc/html/classChart_1_1Pareto__inherit__graph.md5
-doc/html/classChart_1_1Pareto__inherit__graph.png
-doc/html/classChart_1_1Pie-members.html
-doc/html/classChart_1_1Pie.html
-doc/html/classChart_1_1Pie.js
-doc/html/classChart_1_1Pie__coll__graph.map
-doc/html/classChart_1_1Pie__coll__graph.md5
-doc/html/classChart_1_1Pie__coll__graph.png
-doc/html/classChart_1_1Pie__inherit__graph.map
-doc/html/classChart_1_1Pie__inherit__graph.md5
-doc/html/classChart_1_1Pie__inherit__graph.png
-doc/html/classChart_1_1Points-members.html
-doc/html/classChart_1_1Points.html
-doc/html/classChart_1_1Points.js
-doc/html/classChart_1_1Points__coll__graph.map
-doc/html/classChart_1_1Points__coll__graph.md5
-doc/html/classChart_1_1Points__coll__graph.png
-doc/html/classChart_1_1Points__inherit__graph.map
-doc/html/classChart_1_1Points__inherit__graph.md5
-doc/html/classChart_1_1Points__inherit__graph.png
-doc/html/classChart_1_1Split-members.html
-doc/html/classChart_1_1Split.html
-doc/html/classChart_1_1Split.js
-doc/html/classChart_1_1Split__coll__graph.map
-doc/html/classChart_1_1Split__coll__graph.md5
-doc/html/classChart_1_1Split__coll__graph.png
-doc/html/classChart_1_1Split__inherit__graph.map
-doc/html/classChart_1_1Split__inherit__graph.md5
-doc/html/classChart_1_1Split__inherit__graph.png
-doc/html/classChart_1_1StackedBars-members.html
-doc/html/classChart_1_1StackedBars.html
-doc/html/classChart_1_1StackedBars.js
-doc/html/classChart_1_1StackedBars__coll__graph.map
-doc/html/classChart_1_1StackedBars__coll__graph.md5
-doc/html/classChart_1_1StackedBars__coll__graph.png
-doc/html/classChart_1_1StackedBars__inherit__graph.map
-doc/html/classChart_1_1StackedBars__inherit__graph.md5
-doc/html/classChart_1_1StackedBars__inherit__graph.png
-doc/html/classes.html
-doc/html/closed.png
-doc/html/dir_4c1e16b25926905315b25af094fe9aa3.html
-doc/html/dir_4c1e16b25926905315b25af094fe9aa3.js
-doc/html/dir_4c1e16b25926905315b25af094fe9aa3_dep.map
-doc/html/dir_4c1e16b25926905315b25af094fe9aa3_dep.md5
-doc/html/dir_4c1e16b25926905315b25af094fe9aa3_dep.png
-doc/html/doxygen.css
-doc/html/doxygen.png
-doc/html/dynsections.js
-doc/html/files.html
-doc/html/files.js
-doc/html/ftv2blank.png
-doc/html/ftv2cl.png
-doc/html/ftv2doc.png
-doc/html/ftv2folderclosed.png
-doc/html/ftv2folderopen.png
-doc/html/ftv2lastnode.png
-doc/html/ftv2link.png
-doc/html/ftv2mlastnode.png
-doc/html/ftv2mnode.png
-doc/html/ftv2mo.png
-doc/html/ftv2node.png
-doc/html/ftv2ns.png
-doc/html/ftv2plastnode.png
-doc/html/ftv2pnode.png
-doc/html/ftv2splitbar.png
-doc/html/ftv2vertline.png
-doc/html/functions.html
-doc/html/functions_func.html
-doc/html/functions_vars.html
-doc/html/graph_legend.html
-doc/html/graph_legend.md5
-doc/html/graph_legend.png
-doc/html/hierarchy.html
-doc/html/hierarchy.js
-doc/html/index.html
-doc/html/inherit__graph__0.map
-doc/html/inherit__graph__0.md5
-doc/html/inherit__graph__0.png
-doc/html/inherit__graph__1.map
-doc/html/inherit__graph__1.md5
-doc/html/inherit__graph__1.png
-doc/html/inherit__graph__2.map
-doc/html/inherit__graph__2.md5
-doc/html/inherit__graph__2.png
-doc/html/inherit_graph_0.map
-doc/html/inherit_graph_0.md5
-doc/html/inherit_graph_0.png
-doc/html/inherit_graph_1.map
-doc/html/inherit_graph_1.md5
-doc/html/inherit_graph_1.png
-doc/html/inherits.html
-doc/html/jquery.js
-doc/html/main.html
-doc/html/nav_f.png
-doc/html/nav_g.png
-doc/html/nav_h.png
-doc/html/navtree.css
-doc/html/navtree.js
-doc/html/navtreeindex0.js
-doc/html/open.png
-doc/html/pages.html
-doc/html/resize.js
-doc/html/sync_off.png
-doc/html/sync_on.png
-doc/html/tab_a.png
-doc/html/tab_b.gif
-doc/html/tab_b.png
-doc/html/tab_h.png
-doc/html/tab_l.gif
-doc/html/tab_r.gif
-doc/html/tab_s.png
-doc/html/tabs.css
-doc/html/todo.html
-doc/html/tree.html
lib/Chart.pm
lib/Chart/Bars.pm
lib/Chart/Base.pm
lib/Chart/BrushStyles.pm
lib/Chart/Color.pm
-lib/Chart/Color/Named.pm
-lib/Chart/Color/Scheme.pm
+lib/Chart/Color/Constant.pm
+lib/Chart/Color/Value.pm
lib/Chart/Composite.pm
lib/Chart/Constants.pm
lib/Chart/Direction.pm
lib/Chart/ErrorBars.pm
+lib/Chart/Font.pm
lib/Chart/HorizontalBars.pm
lib/Chart/Lines.pm
lib/Chart/LinesPoints.pm
+lib/Chart/Manual.pod
+lib/Chart/Manual/Methods.pod
+lib/Chart/Manual/Properties.pod
+lib/Chart/Manual/Types.pod
+lib/Chart/Manual/Workflows.pod
lib/Chart/Mountain.pm
lib/Chart/Pareto.pm
lib/Chart/Pie.pm
lib/Chart/Points.pm
+lib/Chart/Property.pm
lib/Chart/Split.pm
lib/Chart/StackedBars.pm
-patterns/PATTERN0.GIF
-patterns/PATTERN0.PNG
-patterns/PATTERN1.GIF
-patterns/PATTERN1.PNG
-patterns/PATTERN2.GIF
-patterns/PATTERN2.PNG
-patterns/PATTERN3.GIF
-patterns/PATTERN3.PNG
-patterns/PATTERN4.GIF
-patterns/PATTERN4.PNG
-patterns/PATTERN5.GIF
-patterns/PATTERN5.PNG
+t/001_color_value.t
+t/002_color_constant.t
+t/003_color.t
t/Humidity.t
t/Math_1_over_x.t
t/bars.t
@@ -375,6 +101,18 @@ t/mountain_4.t
t/pareto_1.t
t/pareto_2.t
t/pareto_3.t
+t/patterns/PATTERN0.GIF
+t/patterns/PATTERN0.PNG
+t/patterns/PATTERN1.GIF
+t/patterns/PATTERN1.PNG
+t/patterns/PATTERN2.GIF
+t/patterns/PATTERN2.PNG
+t/patterns/PATTERN3.GIF
+t/patterns/PATTERN3.PNG
+t/patterns/PATTERN4.GIF
+t/patterns/PATTERN4.PNG
+t/patterns/PATTERN5.GIF
+t/patterns/PATTERN5.PNG
t/pie_1.t
t/pie_10.t
t/pie_11.t
diff --git a/META.json b/META.json
index 39e1285..113c6b7 100644
--- a/META.json
+++ b/META.json
@@ -1,25 +1,30 @@
{
- "abstract" : "a series of charting modules ",
+ "abstract" : "a series of charting modules",
"author" : [
"Chart-Group <chartgrp@web.de>"
],
"dynamic_config" : 0,
- "generated_by" : "Dist::Zilla version 6.024, CPAN::Meta::Converter version 2.150010",
+ "generated_by" : "Dist::Zilla version 6.025, CPAN::Meta::Converter version 2.150010",
"license" : [
- "artistic_2"
+ "perl_5"
],
"meta-spec" : {
"url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
- "version" : "2"
+ "version" : 2
},
"name" : "Chart",
"no_index" : {
"directory" : [
- "patterns",
"t"
],
+ "namespace" : [
+ "Chart::Color",
+ "Chart::Manual"
+ ],
"package" : [
- "Chart::Base"
+ "Chart::Base",
+ "Chart::BrushStyles",
+ "Chart::Constants"
]
},
"prereqs" : {
@@ -33,21 +38,103 @@
"Carp" : "1.35",
"GD" : "2",
"perl" : "v5.12.0"
+ },
+ "suggests" : {
+ "Graphics::ColorNames" : "0"
}
},
"test" : {
"requires" : {
- "File::Temp" : "0.19"
+ "File::Temp" : "0.19",
+ "Test::More" : "1.3",
+ "Test::Warn" : "0.30"
}
}
},
+ "provides" : {
+ "Chart" : {
+ "file" : "lib/Chart.pm",
+ "version" : "v2.403.2"
+ },
+ "Chart::Bars" : {
+ "file" : "lib/Chart/Bars.pm",
+ "version" : "v2.403.2"
+ },
+ "Chart::Color" : {
+ "file" : "lib/Chart/Color.pm",
+ "version" : "v2.403.2"
+ },
+ "Chart::Composite" : {
+ "file" : "lib/Chart/Composite.pm",
+ "version" : "v2.403.2"
+ },
+ "Chart::Direction" : {
+ "file" : "lib/Chart/Direction.pm",
+ "version" : "v2.403.2"
+ },
+ "Chart::ErrorBars" : {
+ "file" : "lib/Chart/ErrorBars.pm",
+ "version" : "v2.403.2"
+ },
+ "Chart::Font" : {
+ "file" : "lib/Chart/Font.pm",
+ "version" : "v2.403.2"
+ },
+ "Chart::HorizontalBars" : {
+ "file" : "lib/Chart/HorizontalBars.pm",
+ "version" : "v2.403.2"
+ },
+ "Chart::Lines" : {
+ "file" : "lib/Chart/Lines.pm",
+ "version" : "v2.403.2"
+ },
+ "Chart::LinesPoints" : {
+ "file" : "lib/Chart/LinesPoints.pm",
+ "version" : "v2.403.2"
+ },
+ "Chart::Mountain" : {
+ "file" : "lib/Chart/Mountain.pm",
+ "version" : "v2.403.2"
+ },
+ "Chart::Pareto" : {
+ "file" : "lib/Chart/Pareto.pm",
+ "version" : "v2.403.2"
+ },
+ "Chart::Pie" : {
+ "file" : "lib/Chart/Pie.pm",
+ "version" : "v2.403.2"
+ },
+ "Chart::Points" : {
+ "file" : "lib/Chart/Points.pm",
+ "version" : "v2.403.2"
+ },
+ "Chart::Property" : {
+ "file" : "lib/Chart/Property.pm",
+ "version" : "v2.403.2"
+ },
+ "Chart::Split" : {
+ "file" : "lib/Chart/Split.pm",
+ "version" : "v2.403.2"
+ },
+ "Chart::StackedBars" : {
+ "file" : "lib/Chart/StackedBars.pm",
+ "version" : "v2.403.2"
+ }
+ },
"release_status" : "stable",
- "version" : "v2.401.1",
- "x_generated_by_perl" : "v5.26.1",
+ "resources" : {
+ "repository" : {
+ "type" : "git",
+ "url" : "git://github.com/lichtkind/Chart.git",
+ "web" : "https://github.com/lichtkind/Chart"
+ }
+ },
+ "version" : "v2.403.2",
+ "x_generated_by_perl" : "v5.30.0",
"x_maintainers" : [
"Herbert Breunung <lichtkind@cpan.org>"
],
- "x_serialization_backend" : "JSON::XS version 3.04",
- "x_spdx_expression" : "Artistic-2.0"
+ "x_serialization_backend" : "Cpanel::JSON::XS version 4.19",
+ "x_spdx_expression" : "Artistic-1.0-Perl OR GPL-1.0-or-later"
}
diff --git a/META.yml b/META.yml
index 34acddf..fde7952 100644
--- a/META.yml
+++ b/META.yml
@@ -1,31 +1,91 @@
---
-abstract: 'a series of charting modules '
+abstract: 'a series of charting modules'
author:
- 'Chart-Group <chartgrp@web.de>'
build_requires:
File::Temp: '0.19'
+ Test::More: '1.3'
+ Test::Warn: '0.30'
configure_requires:
ExtUtils::MakeMaker: '0'
dynamic_config: 0
-generated_by: 'Dist::Zilla version 6.024, CPAN::Meta::Converter version 2.150010'
-license: artistic_2
+generated_by: 'Dist::Zilla version 6.025, CPAN::Meta::Converter version 2.150010'
+license: perl
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.4.html
version: '1.4'
name: Chart
no_index:
directory:
- - patterns
- t
+ namespace:
+ - Chart::Color
+ - Chart::Manual
package:
- Chart::Base
+ - Chart::BrushStyles
+ - Chart::Constants
+provides:
+ Chart:
+ file: lib/Chart.pm
+ version: v2.403.2
+ Chart::Bars:
+ file: lib/Chart/Bars.pm
+ version: v2.403.2
+ Chart::Color:
+ file: lib/Chart/Color.pm
+ version: v2.403.2
+ Chart::Composite:
+ file: lib/Chart/Composite.pm
+ version: v2.403.2
+ Chart::Direction:
+ file: lib/Chart/Direction.pm
+ version: v2.403.2
+ Chart::ErrorBars:
+ file: lib/Chart/ErrorBars.pm
+ version: v2.403.2
+ Chart::Font:
+ file: lib/Chart/Font.pm
+ version: v2.403.2
+ Chart::HorizontalBars:
+ file: lib/Chart/HorizontalBars.pm
+ version: v2.403.2
+ Chart::Lines:
+ file: lib/Chart/Lines.pm
+ version: v2.403.2
+ Chart::LinesPoints:
+ file: lib/Chart/LinesPoints.pm
+ version: v2.403.2
+ Chart::Mountain:
+ file: lib/Chart/Mountain.pm
+ version: v2.403.2
+ Chart::Pareto:
+ file: lib/Chart/Pareto.pm
+ version: v2.403.2
+ Chart::Pie:
+ file: lib/Chart/Pie.pm
+ version: v2.403.2
+ Chart::Points:
+ file: lib/Chart/Points.pm
+ version: v2.403.2
+ Chart::Property:
+ file: lib/Chart/Property.pm
+ version: v2.403.2
+ Chart::Split:
+ file: lib/Chart/Split.pm
+ version: v2.403.2
+ Chart::StackedBars:
+ file: lib/Chart/StackedBars.pm
+ version: v2.403.2
requires:
Carp: '1.35'
GD: '2'
perl: v5.12.0
-version: v2.401.1
-x_generated_by_perl: v5.26.1
+resources:
+ repository: git://github.com/lichtkind/Chart.git
+version: v2.403.2
+x_generated_by_perl: v5.30.0
x_maintainers:
- 'Herbert Breunung <lichtkind@cpan.org>'
-x_serialization_backend: 'YAML::Tiny version 1.70'
-x_spdx_expression: Artistic-2.0
+x_serialization_backend: 'YAML::Tiny version 1.73'
+x_spdx_expression: 'Artistic-1.0-Perl OR GPL-1.0-or-later'
diff --git a/Makefile.PL b/Makefile.PL
index 564723c..6a9174b 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -1,4 +1,4 @@
-# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.024.
+# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.025.
use strict;
use warnings;
@@ -7,13 +7,13 @@ use 5.012000;
use ExtUtils::MakeMaker;
my %WriteMakefileArgs = (
- "ABSTRACT" => "a series of charting modules ",
+ "ABSTRACT" => "a series of charting modules",
"AUTHOR" => "Chart-Group <chartgrp\@web.de>",
"CONFIGURE_REQUIRES" => {
"ExtUtils::MakeMaker" => 0
},
"DISTNAME" => "Chart",
- "LICENSE" => "artistic_2",
+ "LICENSE" => "perl",
"MIN_PERL_VERSION" => "5.012000",
"NAME" => "Chart",
"PREREQ_PM" => {
@@ -21,9 +21,11 @@ my %WriteMakefileArgs = (
"GD" => 2
},
"TEST_REQUIRES" => {
- "File::Temp" => "0.19"
+ "File::Temp" => "0.19",
+ "Test::More" => "1.3",
+ "Test::Warn" => "0.30"
},
- "VERSION" => "v2.401.1",
+ "VERSION" => "v2.403.2",
"test" => {
"TESTS" => "t/*.t"
}
@@ -33,7 +35,9 @@ my %WriteMakefileArgs = (
my %FallbackPrereqs = (
"Carp" => "1.35",
"File::Temp" => "0.19",
- "GD" => 2
+ "GD" => 2,
+ "Test::More" => "1.3",
+ "Test::Warn" => "0.30"
);
diff --git a/README b/README
index 81d88c7..055b4b4 100644
--- a/README
+++ b/README
@@ -36,17 +36,9 @@ SYNOPSIS
$imagemap_ref = $obj->imagemap_dump ();
DESCRIPTION
- These man-pages give you the most important information about Chart.
- There is also a complete documentation (Documentation.pdf) within the
- Chart package. Look at it to get more information. This module is an
- attempt to build a general purpose graphing module that is easily
- modified and expanded. I borrowed most of the API from Martien
- Verbruggen's GIFgraph module. I liked most of GIFgraph, but I thought it
- was to difficult to modify, and it was missing a few things that I
- needed, most notably legends. So I decided to write a new module from
- scratch, and I've designed it from the bottom up to be easy to modify.
- Like GIFgraph, Chart uses Lincoln Stein's GD module for all of its
- graphics primitives calls.
+ Chart help you to create PNG and JPG images with visualizations of
+ numeric data. This page gives you a summary how to use it. For a more
+ thorough documentation please visit the Chart::Manual.
use-ing Chart
Okay, so you caught me. There's really no Chart::type module. All of the
@@ -58,7 +50,10 @@ DESCRIPTION
use Chart::Lines;
- would invoke the lines module.
+ would invoke the lines module. Alternatively write to load all chart
+ types at ones with
+
+ use Chart;
Getting an object
The new method can either be called without arguments, in which case it
@@ -83,390 +78,7 @@ DESCRIPTION
$obj->set ('title' => 'Foo Bar');
- The following are all of the currently supported options:
-
- 'transparent'
- Makes the background of the image transparent if set to 'true'.
- Useful for making web page images. Default is 'false'.
-
- 'png_border'
- Sets the number of pixels used as a border between the graph and the
- edges of the png/j-peg. Defaults to 10.
-
- 'graph_border'
- Sets the number of pixels used as a border between the title/labels
- and the actual graph within the png. Defaults to 10.
-
- 'text_space'
- Sets the amount of space left on the sides of text, to make it more
- readable. Defaults to 2.
-
- 'title'
- Tells GD graph what to use for the title of the graph. If empty, no
- title is drawn. It recognizes '\n' as a newline, and acts
- accordingly. Remember, if you want to use normal quotation marks
- instead of single quotation marks then you have to quote "\\n".
- Default is empty.
-
- 'sub_title'
- Write a sub-title under the title in smaller letters.
-
- 'x_label'
- Tells Chart what to use for the x-axis label. If empty, no label is
- drawn. Default is empty.
-
- 'y_label', 'y_label2'
- Tells Chart what to use for the y-axis labels. If empty, no label is
- drawn. Default is empty.
-
- 'legend'
- Specifies the placement of the legend. Valid values are 'left',
- 'right', 'top', 'bottom'. Setting this to 'none' tells chart not to
- draw a legend. Default is 'right'.
-
- 'legend_labels'
- Sets the values for the labels for the different data sets. Should
- be assigned a reference to an array of labels. For example,
-
- @labels = ('foo', 'bar');
- $obj->set ('legend_labels' => \@labels);
-
- Default is empty, in which case 'Dataset 1', 'Dataset 2', etc. are
- used as the labels.
-
- 'tick_len'
- Sets the length of the x- and y-ticks in pixels. Default is 4.
-
- 'x_ticks'
- Specifies how to draw the x-tick labels. Valid values are 'normal',
- 'staggered' (staggers the labels vertically), and 'vertical' (the
- labels are draw upwards). Default is 'normal'.
-
- 'xy_plot'
- Forces Chart to plot a x-y-graph, which means, that the x-axis is
- also numeric if set to 'true'. Very useful for mathematical graphs.
- Works for Lines, Points, LinesPoints and ErrorBars. Split makes
- always a xy_plot. Defaults to 'false'.
-
- 'min_y_ticks'
- Sets the minimum number of y_ticks to draw when generating a scale.
- Default is 6, The minimum is 2.
-
- 'max_y_ticks'
- Sets the maximum number of y_ticks to draw when generating a scale.
- Default is 100. This limit is used to avoid plotting an unreasonable
- large number of ticks if non-round values are used for the min_val
- and max_val.
-
- The value for 'max_y_ticks' should be at least 5 times larger than
- 'min_y_ticks'.
-
- 'max_x_ticks', 'min_x_ticks'
- Work similar as 'max_y_ticks' and 'min_y_ticks'. Of course, only for
- a xy_plot.
-
- 'integer_ticks_only'
- Specifies how to draw the x- and y-ticks: as floating point
- ('false', '0') or as integer numbers ('true', 1). Default: 'false'
-
- 'skip_int_ticks'
- If 'integer_ticks_only' was set to 'true' the labels and ticks will
- be drawn every nth tick. Of course in horizontalBars it affects the
- x-axis. Default to 1, no skipping.
-
- 'precision'
- Sets the number of numerals after the decimal point. Affects in most
- cases the y-axis. But also the x-axis if 'xy_plot' was set and also
- the labels in a pie chart. Defaults to 3.
-
- 'max_val'
- Sets the maximum y-value on the graph, overriding the normal
- auto-scaling. Default is undef.
-
- 'min_val'
- Sets the minimum y-value on the graph, overriding the normal
- auto-scaling. Default is undef.
-
- Caution should be used when setting 'max_val' and 'min_val' to
- floating point or non-round numbers. This is because the scale must
- start & end on a tick, ticks must have round-number intervals, and
- include round numbers.
-
- Example: Suppose your data set has a range of 35-114 units. If you
- specify them as the 'min_val' & 'max_val', the y_axis will be
- plotted with 80 ticks every 1 unit.. If no 'min_val' & 'max_val',
- the system will auto scale the range to 30-120 with 10 ticks every
- 10 units.
-
- If the 'min_val' & 'max_val' are specified to excessive precision,
- they may be overridden by the system, plotting a maximum
- 'max_y_ticks' ticks.
-
- 'include_zero'
- If 'true', forces the y-axis to include zero if it is not in the
- dataset range. Default is 'false'.
-
- In general, it is better to use this, than to set the 'min_val' if
- that is all you want to achieve.
-
- 'pt_size'
- Sets the radius of the points (for Chart::Points, etc.) in pixels.
- Default is 18.
-
- 'brush_size'
- Sets the width of the lines (for Chart::Lines, etc.) in pixels.
- Default is 6.
-
- 'brushStyle'
- Sets the shape of points for Chart::Points, Chart::LinesPoints. The
- possibilities are 'FilledCircle', 'circle', 'donut', 'OpenCircle',
- 'fatPlus', 'triangle', 'upsidedownTriangle', 'square',
- 'hollowSquare', 'OpenRectangle', 'FilledDiamond', 'OpenDiamond',
- 'Star', 'OpenStar'. Default: 'FilledCircle
-
- 'skip_x_ticks'
- Sets the number of x-ticks and x-tick labels to skip. (ie. if
- 'skip_x_ticks' was set to 4, Chart would draw every 4th x-tick and
- x-tick label). Default is undef.
-
- 'custom_x_ticks'
- Used in points, lines, linespoints, errorbars and bars charts, this
- option allows you to you to specify exactly which x-ticks and x-tick
- labels should be drawn. It should be assigned a reference to an
- array of desired ticks. Just remember that I'm counting from the 0th
- element of the array. (ie., if 'custom_x_ticks' is assigned [0,3,4],
- then the 0th, 3rd, and 4th x-ticks will be displayed)
-
- 'f_x_tick'
- Needs a reference to a function which uses the x-tick labels
- generated by the '@data[0]' as the argument. The result of this
- function can reformat the labels. For instance
-
- $obj -> set ('f_x_tick' => \&formatter );
-
- An example for the function formatter: x labels are seconds since an
- event. The referenced function can transform this seconds to hour,
- minutes and seconds.
-
- 'f_y_tick'
- The same situation as for 'f_x_tick' but now used for y labels.
-
- 'colors'
- This option lets you control the colors the chart will use. It takes
- a reference to a hash. The hash should contain keys mapped to
- references to arrays of rgb values. For instance,
-
- $obj->set('colors' => {'background' => [255,255,255]});
-
- sets the background color to white (which is the default). Valid
- keys for this hash are
-
- 'background' (background color for the png)
- 'title' (color of the title)
- 'text' (all the text in the chart)
- 'x_label' (color of the x-axis label)
- 'y_label' (color of the first y axis label)
- 'y_label2' (color of the second y axis label)
- 'grid_lines' (color of the grid lines)
- 'x_grid_lines' (color of the x grid lines - for x axis ticks)
- 'y_grid_lines' (color of the y grid lines - for to left y axis ticks)
- 'y2_grid_lines' (color of the y2 grid lines - for right y axis ticks)
- 'dataset0'..'dataset63' (the different datasets)
- 'misc' (everything else, ie. ticks, box around the legend)
-
- NB. For composite charts, there is a limit of 8 datasets per
- component. The colors for 'dataset8' through 'dataset15' become the
- colors for 'dataset0' through 'dataset7' for the second component
- chart.
-
- 'title_font'
- This option changes the font of the title. The key has to be a GD
- font. eg. GD::Font->Large
-
- 'label_font'
- This option changes the font of the labels. The key has to be a GD
- font.
-
- 'legend_font'
- This option changes the font of the text in the legend. The key has
- to be a GD font.
-
- 'tick_label_font'
- This is the font for the tick labels. It also needs a GD font object
- as an argument.
-
- 'grey_background'
- Puts a nice soft grey background on the actual data plot when set to
- 'true'. Default is 'true'.
-
- 'y_axes'
- Tells Chart where to place the y-axis. Has no effect on Composite
- and Pie. Valid values are 'left', 'right' and 'both'. Defaults to
- 'left'.
-
- 'x_grid_lines'
- Draws grid lines matching up to x ticks if set to 'true'. Default is
- false.
-
- 'y_grid_lines'
- Draws grid lines matching up to y ticks if set to 'true'. Default is
- false.
-
- 'grid_lines'
- Draws grid lines matching up to x and y ticks.
-
- 'spaced_bars'
- Leaves space between the groups of bars at each data point when set
- to 'true'. This just makes it easier to read a bar chart. Default is
- 'true'.
-
- 'imagemap'
- Lets Chart know you're going to ask for information about the
- placement of the data for use in creating an image map from the png.
- This information can be retrieved using the imagemap_dump() method.
- NB. that the imagemap_dump() method cannot be called until after the
- Chart has been generated (ie. using the png() or cgi_png() methods).
-
- 'sort'
- In a xy-plot, the data will be sorted ascending if set to 'true'.
- (Should be set if the data isn't sorted, especially in Lines, Split
- and LinesPoints) In a Pareto Chart the data will be sorted
- descending. Defaults to 'false'.
-
- 'composite_info'
- This option is only used for composite charts. It contains the
- information about which types to use for the two component charts,
- and which datasets belong to which component chart. It should be a
- reference to an array of array references, containing information
- like the following
-
- $obj->set ('composite_info' => [ ['Bars', [1,2]],
- ['Lines', [3,4] ] ]);
-
- This example would set the two component charts to be a bar chart
- and a line chart. It would use the first two data sets for the bar
- chart (note that the numbering starts at 1, not zero like most of
- the other numbered things in Chart), and the second two data sets
- for the line chart. The default is undef.
-
- NB. Chart::Composite can only do two component charts.
-
- 'min_val1', 'min_val2'
- Only for composite charts, these options specify the minimum y-value
- for the first and second components respectively. Both default to
- undef.
-
- 'max_val1', 'max_val2'
- Only for composite charts, these options specify the maximum y-value
- for the first and second components respectively. Both default to
- undef.
-
- 'ylabel2'
- The label for the right y-axis (the second component chart) on a
- composite chart. Default is undef.
-
- 'y_ticks1', 'y_ticks2'
- The number of y ticks to use on the first and second y-axis on a
- composite chart. Please note that if you just set the 'y_ticks'
- option, both axes will use that number of y ticks. Both default to
- undef.
-
- 'f_y_ticks1', 'f_y_ticks2'
- Only for composite charts, needs a reference to a function which has
- one argument and has to return a string which labels the first resp.
- second y axis. Both default to undef.
-
- 'same_y_axes'
- Forces both component charts in a composite chart to use the same
- maximum and minimum y-values if set to 'true'. This helps to keep
- the composite charts from being too confusing. Default is undef.
-
- 'no_cache'
- Adds Pragma: no-cache to the http header. Be careful with this one,
- as Netscape 4.5 is unfriendly with POST using this method.
-
- 'legend_example_size'
- Sets the length of the example line in the legend in pixels.
- Defaults to 20.
-
- 'same_error'
- This is a option only for ErrorBars. It tells chart that you want
- use the same error value of a data point if set to 'true'. Look at
- the documentation to see how the module ErrorBars works. Default:
- 'false'.
-
- 'skip_y_ticks'
- Does the same for the y-axis at a HorizontalBars chart as
- 'skip_x_ticks' does for other charts. Defaults to 1.
-
- 'label_values'
- Tells a pie chart what labels to draw beside the pie. Valid values
- are 'percent', 'value', 'both' and 'none'. Defaults to 'percent'.
-
- 'legend_label_values'
- Tells a pie chart what labels to draw in the legend. Valid values
- are 'percent', 'value', 'both' and 'none'. Defaults to 'value'.
-
- 'start'
- Required value for a split chart. Sets the start value of the first
- interval. If the x coordinate of the first data point is zero, you
- should 'set' to zero. Default is 'undef'.
-
- 'interval'
- Also a required value for a split chart. It sets the interval of one
- line to plot. Defaults 'undef'.
-
- 'interval_ticks'
- Sets the number of ticks for the x-axis of a Split chart. Defaults
- to 5.
-
- 'scale'
- Every y-value of a split chart will be multiplied with that value,
- but the scale won't change. Which means that split allows one to
- overdraw certain rows! Only useful if you want to give prominence to
- the maximal amplitudes of the data. Defaults to 1.
-
- 'point'
- Indicates to draw points in a direction chart. 'true' or 'false'
- possible. Defaults to 'true'.
-
- 'line'
- If you turn this option to 'true', then direction will connect the
- points with lines. Defaults to 'false'.
-
- 'arrow'
- This is also an option for the direction module. If set to 'true',
- chart will draw a arrow from the center to the point. Defaults to
- 'false'.
-
- 'angle_interval'
- This option tells direction, how many angle lines should be drawn.
- The default value is 30, which means that a line will be drawn every
- 30 degrees. Valid Values are: 0, 5, 10, 15, 20, 30, 45 and 60. If
- you choose 0, direction will draw no line.
-
- 'min_circles'
- Sets the minimum number of circles when generating a scale for
- direction. Default is 4, minimum is 2.
-
- 'max_circles'
- Sets the maximum number of circles when generating a scale for
- direction. Default is 100. This limit is used to avoid plotting an
- unreasonable large number of ticks if non-round values are used for
- the min_val and max_val.
-
- 'pairs'
- Only used for direction how to handle more datasets. If 'pairs' is
- set to 'true', Chart uses the first dataset as a set of degrees and
- the second dataset as a set of values. Then, the third set is a set
- of degrees and the fourth a set of values \dots. \\ If 'pairs' is
- set to 'false', Chart uses the first dataset as a set of angels and
- all following datasets as sets of values. Defaults to 'false'.
-
- Sets the maximum number of circles when generating a scale for
- direction. Default is 100. This limit is used to avoid plotting an
- unreasonable large number of ticks if non-round values are used for
- the min_val and max_val.
+ Chart::Manual::Properties lists all currently supported keys and values.
GIFgraph.pm-style API
Sending the image to a file
@@ -647,8 +259,25 @@ DESCRIPTION
will be empty, since that's the place in the @data array for the data
point labels.
+PLAN
+ This module is currently under a complete rebuild, that will take place
+ in two phases. First: rewrite all functionality within a modular
+ architecture and hierarchical property system. This will be accessed via
+ a central API using the so far unutilized Chart module ("my $c =
+ Chart-"new(...);>). This API will have in part different method and
+ property names, but the old API will not be touched. In a second phase
+ we will see hoch much new code can be used by the old modules and which
+ new features can be brought to the legacy parts, which will be than
+ discouraged, but not scrapped.
+
TO DO
- * Add some 3-D graphs. Include True Type Fonts Violine and Box plots
+ * Include True Type Fonts
+
+ * Violine and Box plots
+
+ * Add some 3-D graphs.
+
+ For more please check the TODO file.
BUGS
Probably quite a few, since it's been completely rewritten. As usual,
@@ -676,7 +305,8 @@ CONTRIBUTORS
COPYRIGHT
Copyright(c) 1997-1998 by David Bonner, 1999 by Peter Clark, 2001 by the
- Chart group at BKG-Wettzell. All rights reserved. This program is free
- software; you can redistribute it and/or modify it under the same terms
- as Perl itself.
+ Chart group at BKG-Wettzell. 2022 by Herbert Breunung and Chart group
+
+ All rights reserved. This program is free software; you can redistribute
+ it and/or modify it under the same terms as Perl itself.
diff --git a/Readme.md b/Readme.md
deleted file mode 100644
index d0d789e..0000000
--- a/Readme.md
+++ /dev/null
@@ -1,50 +0,0 @@
-# NAME
-
- Chart - a series of charting modules
-
-# VERSION
-
- 2.401.1
-
-# INSTALLING
-
-
- The usual.
-
- perl Makefile.PL
- make
- make test
- make install
-
- This should install to your site_perl directory. The test scripts also
- put samples of the different charts in the samples/ directory.
-
-
-# PREREQUISITES
-
- Lincoln Stein's GD module version 2.0.36 or higher.
- Carp
-
-# CHANGES
-
- are in file Changes
-
-# MAINTAINER
-
- - Chart-Group (chart@fs.wettzell.de)
- - Herbert Breunung (lichtkind@cpan.org)
-
-
-# CONTRIBUTING
-
-
- If you want to help please read file CONTRIBUTING
-
-
-# COPYRIGHT
-
- Copyright(c) 1997-1998 David Bonner, 1999 Peter Clark,
- 2001-2012 Chart-Group at BKG.
- All rights reserved.
- This program is free software; you can redistribute it and/or modify it under
- the same terms as Perl itself.
diff --git a/TODO b/TODO
index cd62b96..331e8c0 100644
--- a/TODO
+++ b/TODO
@@ -1,3 +1,13 @@
+ROADMAP:
+-------
+ 2.403: true type fonts
+ 2.404: better documentation in package Chart::Setting::Legacy.pod
+ 2.405: better legend drawing with additional settings and logos
+
+ 2.5 smooth graphics
+ 3.0: SVG backend
+
+
TODO's:
-------
@@ -16,7 +26,11 @@ General:
- 3-D charts
--
+- add optional desciption text maybe with a picture (logo) ?
+
+- svg, html and webp backend?
+
+
Plottype specific:
------------------
diff --git a/cpanfile b/cpanfile
index a3a00fe..f32db83 100644
--- a/cpanfile
+++ b/cpanfile
@@ -1,12 +1,15 @@
-# This file is generated by Dist::Zilla::Plugin::CPANFile v6.024
+# This file is generated by Dist::Zilla::Plugin::CPANFile v6.025
# Do not edit this file directly. To change prereqs, edit the `dist.ini` file.
requires "Carp" => "1.35";
requires "GD" => "2";
requires "perl" => "v5.12.0";
+suggests "Graphics::ColorNames" => "0";
on 'test' => sub {
requires "File::Temp" => "0.19";
+ requires "Test::More" => "1.3";
+ requires "Test::Warn" => "0.30";
};
on 'configure' => sub {
diff --git a/dist.ini b/dist.ini
index 25636cc..cf6fbc0 100644
--- a/dist.ini
+++ b/dist.ini
@@ -1,49 +1,76 @@
name = Chart
-;main_module = lib/Chart.pm
-;abstract = a series of charting modules
-;version = 2.401.00
+;main_module = lib/Chart.pm ; will set automatically
+;abstract = a series of charting modules ; ..
+;version = 2.402.00 ; ..
author = Chart-Group <chartgrp@web.de>
-license = Artistic_2_0
+license = Perl_5
copyright_holder = Chart-Group <chartgrp@web.de>
copyright_year = 1997-2022
+[Meta::Maintainers]
+maintainer = Herbert Breunung <lichtkind@cpan.org>
+
[Prereqs]
perl = v5.12.0
Carp = 1.35
+;List::Util = 1.2
GD = 2
+[Prereqs / RuntimeSuggests]
+Graphics::ColorNames = 0
+
[Prereqs / TestRequires]
File::Temp = 0.19
+Test::More = 1.3
+Test::Warn = 0.30
+
[MetaNoIndex]
directory = t
-directory = patterns
package = Chart::Base
+package = Chart::Constants
+package = Chart::BrushStyles
+;package = Chart::Font
+;namespace = Chart::Setting
+namespace = Chart::Color
+namespace = Chart::Manual
-[Meta::Maintainers]
-maintainer = Herbert Breunung <lichtkind@cpan.org>
+; pollutes meta section 'provides'
+[MetaProvides::Package]
+[MungeFile]
+;file = Readme.md
-[VersionFromModule]
+[Git::GatherDir]
+exclude_filename = Readme.md
+exclude_match = ^blib
+exclude_match = ^dev
+exclude_match = ^doc
+exclude_match = ^utils
+
+; use RewriteVersion or VersionFromModule
+;[VersionFromModule]
+[RewriteVersion]
+[Repository]
[AbstractFromPOD]
[Pod2Readme]
[MetaJSON]
[MetaYAML]
+[Manifest]
[MakeMaker]
[License]
[CPANFile]
-[Manifest]
-[GatherDir]
-prune_directory = ^utils$
-prune_directory = ^samples$
+;[Signature]
[TestRelease]
[ConfirmRelease]
[UploadToCPAN]
-
-;[MetaProvides::Package]
-;Chart::Pie = 2.400.5
-
;[PodSyntaxTests]
;[PodCoverageTests]
+;[Pod2Html]
+; dir = my_docs ; where to create HTML files
+; ignore = bin/myscript1 ; what input file to ignore
+
+; [=inc::Documentation]
+; module = Chart::Manual
diff --git a/doc/LaTeX/Appendix.tex b/doc/LaTeX/Appendix.tex
deleted file mode 100644
index 8914477..0000000
--- a/doc/LaTeX/Appendix.tex
+++ /dev/null
@@ -1,14 +0,0 @@
-%
-% Appendix.tex
-%
-\section{Appendix}
-\renewcommand{\thisname}{Named Colors}
-\name{\thisname}
-\label{app:colors}
-
-The following list summarizes the named colors which can be defined in respect to \textsc{rgb}
-values. The colors are defined by\\
-\methoduse{\$obj->set('colors' \fatcomma \{'background' \fatcomma 'green'\});}
-
-\vspace{2ex}
-\input{AppendixRGB}
diff --git a/doc/LaTeX/AppendixRGB.tex b/doc/LaTeX/AppendixRGB.tex
deleted file mode 100644
index e2cdbd7..0000000
--- a/doc/LaTeX/AppendixRGB.tex
+++ /dev/null
@@ -1,879 +0,0 @@
-%
-% AppendixRGB.tex
-%
-
-The list of all defined colors is:\\
-white
-black
-red
-green
-blue
-orange
-orange2
-orange3
-orange4
-yellow
-purple
-light\_blue
-light\_green
-light\_purple
-pink
-peach
-olive
-plum
-turquoise
-mauve
-brown
-grey
-HotPink
-PaleGreen1
-PaleGreen2
-PaleGreen3
-PaleGreen4
-DarkBlue
-BlueViolet
-PeachPuff
-PeachPuff1
-PeachPuff2
-PeachPuff3
-PeachPuff4
-chocolate1
-chocolate2
-chocolate3
-chocolate4
-LightGreen
-lavender
-MediumPurple
-DarkOrange
-DarkOrange2
-DarkOrange3
-DarkOrange4
-SlateBlue
-BlueViolet
-RoyalBlue
-AntiqueWhite
-AntiqueWhite1
-AntiqueWhite2
-AntiqueWhite3
-AntiqueWhite4
-CadetBlue
-CadetBlue1
-CadetBlue2
-CadetBlue3
-CadetBlue4
-DarkGoldenrod
-DarkGoldenrod1
-DarkGoldenrod2
-DarkGoldenrod3
-DarkGoldenrod4
-DarkOliveGreen
-DarkOliveGreen1
-DarkOliveGreen2
-DarkOliveGreen3
-DarkOliveGreen4
-DarkOrange1
-DarkOrchid
-DarkOrchid1
-DarkOrchid2
-DarkOrchid3
-DarkOrchid4
-DarkSeaGreen
-DarkSeaGreen1
-DarkSeaGreen2
-DarkSeaGreen3
-DarkSeaGreen4
-DarkSlateGray
-DarkSlateGray1
-DarkSlateGray2
-DarkSlateGray3
-DarkSlateGray4
-DeepPink
-DeepPink1
-DeepPink2
-DeepPink3
-DeepPink4
-DeepSkyBlue
-DeepSkyBlue1
-DeepSkyBlue2
-DeepSkyBlue3
-DeepSkyBlue4
-DodgerBlue
-DodgerBlue1
-DodgerBlue2
-DodgerBlue3
-DodgerBlue4
-HotPink1
-HotPink2
-HotPink3
-HotPink4
-IndianRed
-IndianRed1
-IndianRed2
-IndianRed3
-IndianRed4
-LavenderBlush
-LavenderBlush1
-LavenderBlush2
-LavenderBlush3
-LavenderBlush4
-LemonChiffon
-LemonChiffon1
-LemonChiffon2
-LemonChiffon3
-LemonChiffon4
-LightBlue
-LightBlue1
-LightBlue2
-LightBlue3
-LightBlue4
-LightCyan
-LightCyan1
-LightCyan2
-LightCyan3
-LightCyan4
-LightGoldenrod
-LightGoldenrod1
-LightGoldenrod2
-LightGoldenrod3
-LightGoldenrod4
-LightPink
-LightPink1
-LightPink2
-LightPink3
-LightPink4
-LightSalmon
-LightSalmon1
-LightSalmon2
-LightSalmon3
-LightSalmon4
-LightSkyBlue
-LightSkyBlue1
-LightSkyBlue2
-LightSkyBlue3
-LightSkyBlue4
-LightSteelBlue
-LightSteelBlue1
-LightSteelBlue2
-LightSteelBlue3
-LightSteelBlue4
-LightYellow
-LightYellow1
-LightYellow2
-LightYellow3
-LightYellow4
-MediumOrchid
-MediumOrchid1
-MediumOrchid2
-MediumOrchid3
-MediumOrchid4
-MediumPurple1
-MediumPurple2
-MediumPurple3
-MediumPurple4
-MistyRose
-MistyRose1
-MistyRose2
-MistyRose3
-MistyRose4
-NavajoWhite
-NavajoWhite1
-NavajoWhite2
-NavajoWhite3
-NavajoWhite4
-OliveDrab
-OliveDrab1
-OliveDrab2
-OliveDrab3
-OliveDrab4
-OrangeRed
-OrangeRed1
-OrangeRed2
-OrangeRed3
-OrangeRed4
-PaleGreen
-PaleTurquoise
-PaleTurquoise1
-PaleTurquoise2
-PaleTurquoise3
-PaleTurquoise4
-PaleVioletRed
-PaleVioletRed1
-PaleVioletRed2
-PaleVioletRed3
-PaleVioletRed4
-RosyBrown
-RosyBrown1
-RosyBrown2
-RosyBrown3
-RosyBrown4
-RoyalBlue1
-RoyalBlue2
-RoyalBlue3
-RoyalBlue4
-SeaGreen
-SeaGreen1
-SeaGreen2
-SeaGreen3
-SeaGreen4
-SkyBlue
-SkyBlue1
-SkyBlue2
-SkyBlue3
-SkyBlue4
-SlateBlue1
-SlateBlue2
-SlateBlue3
-SlateBlue4
-SlateGray
-SlateGray1
-SlateGray2
-SlateGray3
-SlateGray4
-SpringGreen
-SpringGreen1
-SpringGreen2
-SpringGreen3
-SpringGreen4
-SteelBlue
-SteelBlue1
-SteelBlue2
-SteelBlue3
-SteelBlue4
-VioletRed
-VioletRed1
-VioletRed2
-VioletRed3
-VioletRed4
-aquamarine
-aquamarine1
-aquamarine2
-aquamarine3
-aquamarine4
-azure
-azure1
-azure2
-azure3
-azure4
-bisque
-bisque1
-bisque2
-bisque3
-bisque4
-blue1
-blue2
-blue3
-blue4
-brown1
-brown2
-brown3
-brown4
-burlywood
-burlywood1
-burlywood2
-burlywood3
-burlywood4
-chartreuse
-chartreuse1
-chartreuse2
-chartreuse3
-chartreuse4
-chocolate
-coral
-coral1
-coral2
-coral3
-coral4
-cornsilk
-cornsilk1
-cornsilk2
-cornsilk3
-cornsilk4
-cyan
-cyan1
-cyan2
-cyan3
-cyan4
-firebrick
-firebrick1
-firebrick2
-firebrick3
-firebrick4
-gold
-gold1
-gold2
-gold3
-gold4
-goldenrod
-goldenrod1
-goldenrod2
-goldenrod3
-goldenrod4
-gray
-gray1
-gray2
-gray3
-gray4
-green1
-green2
-green3
-green4
-grey1
-grey2
-grey3
-grey4
-honeydew
-honeydew1
-honeydew2
-honeydew3
-honeydew4
-ivory
-ivory1
-ivory2
-ivory3
-ivory4
-khaki
-khaki1
-khaki2
-khaki3
-khaki4
-magenta
-magenta1
-magenta2
-magenta3
-magenta4
-maroon
-maroon1
-maroon2
-maroon3
-maroon4
-orange1
-orchid
-orchid1
-orchid2
-orchid3
-orchid4
-pink1
-pink2
-pink3
-pink4
-plum1
-plum2
-plum3
-plum4
-purple1
-purple2
-purple3
-purple4
-red1
-red2
-red3
-red4
-salmon
-salmon1
-salmon2
-salmon3
-salmon4
-seashell
-seashell1
-seashell2
-seashell3
-seashell4
-sienna
-sienna1
-sienna2
-sienna3
-sienna4
-snow
-snow1
-snow2
-snow3
-snow4
-tan
-tan1
-tan2
-tan3
-tan4
-thistle
-thistle1
-thistle2
-thistle3
-thistle4
-tomato
-tomato1
-tomato2
-tomato3
-tomato4
-turquoise1
-turquoise2
-turquoise3
-turquoise4
-wheat
-wheat1
-wheat2
-wheat3
-wheat4
-yellow1
-yellow2
-yellow3
-yellow4
-
-
-\vspace{2ex}
-The following tables will show the named colors, the corresponding RGB values and an example of the colors.
-
-
-\begin{tabular}{|l|c|c|}
-white & [ 255, 255, 255 ] & \color{white} \rule{1cm}{1.5ex}\\
-black & [ 0, 0, 0 ] & \color{black} \rule{1cm}{1.5ex}\\
-red & [ 200, 0, 0 ] & \color{red} \rule{1cm}{1.5ex}\\
-green & [ 0, 175, 0 ] & \color{green} \rule{1cm}{1.5ex}\\
-blue & [ 0, 0, 200 ] & \color{blue} \rule{1cm}{1.5ex}\\
-orange & [ 250, 125, 0 ] & \color{orange} \rule{1cm}{1.5ex}\\
-orange2 & [ 238, 154, 0 ] & \color{orange2} \rule{1cm}{1.5ex}\\
-orange3 & [ 205, 133, 0 ] & \color{orange3} \rule{1cm}{1.5ex}\\
-orange4 & [ 139, 90, 0 ] & \color{orange4} \rule{1cm}{1.5ex}\\
-yellow & [ 225, 225, 0 ] & \color{yellow} \rule{1cm}{1.5ex}\\
-purple & [ 200, 0, 200 ] & \color{purple} \rule{1cm}{1.5ex}\\
-light\_blue & [ 0, 125, 250 ] & \color{light_blue} \rule{1cm}{1.5ex}\\
-light\_green & [ 125, 250, 0 ] & \color{light_green} \rule{1cm}{1.5ex}\\
-light\_purple & [ 145, 0, 250 ] & \color{light_purple} \rule{1cm}{1.5ex}\\
-pink & [ 250, 0, 125 ] & \color{pink} \rule{1cm}{1.5ex}\\
-peach & [ 250, 125, 125 ] & \color{peach} \rule{1cm}{1.5ex}\\
-olive & [ 125, 125, 0 ] & \color{olive} \rule{1cm}{1.5ex}\\
-plum & [ 125, 0, 125 ] & \color{plum} \rule{1cm}{1.5ex}\\
-turquoise & [ 0, 125, 125 ] & \color{turquoise} \rule{1cm}{1.5ex}\\
-mauve & [ 200, 125, 125 ] & \color{mauve} \rule{1cm}{1.5ex}\\
-brown & [ 160, 80, 0 ] & \color{brown} \rule{1cm}{1.5ex}\\
-grey & [ 225, 225, 225 ] & \color{grey} \rule{1cm}{1.5ex}\\
-HotPink & [ 255, 105, 180 ] & \color{HotPink} \rule{1cm}{1.5ex}\\
-PaleGreen1 & [ 154, 255, 154 ] & \color{PaleGreen1} \rule{1cm}{1.5ex}\\
-PaleGreen2 & [ 144, 238, 144 ] & \color{PaleGreen2} \rule{1cm}{1.5ex}\\
-PaleGreen3 & [ 124, 205, 124 ] & \color{PaleGreen3} \rule{1cm}{1.5ex}\\
-PaleGreen4 & [ 84, 138, 84 ] & \color{PaleGreen4} \rule{1cm}{1.5ex}\\
-DarkBlue & [ 0, 0, 139 ] & \color{DarkBlue} \rule{1cm}{1.5ex}\\
-BlueViolet & [ 138, 43, 226 ] & \color{BlueViolet} \rule{1cm}{1.5ex}\\
-PeachPuff & [ 255, 218, 185 ] & \color{PeachPuff} \rule{1cm}{1.5ex}\\
-PeachPuff1 & [ 255, 218, 185 ] & \color{PeachPuff1} \rule{1cm}{1.5ex}\\
-PeachPuff2 & [ 238, 203, 173 ] & \color{PeachPuff2} \rule{1cm}{1.5ex}\\
-PeachPuff3 & [ 205, 175, 149 ] & \color{PeachPuff3} \rule{1cm}{1.5ex}\\
-PeachPuff4 & [ 139, 119, 101 ] & \color{PeachPuff4} \rule{1cm}{1.5ex}\\
-chocolate1 & [ 255, 127, 36 ] & \color{chocolate1} \rule{1cm}{1.5ex}\\
-chocolate2 & [ 238, 118, 33 ] & \color{chocolate2} \rule{1cm}{1.5ex}\\
-chocolate3 & [ 205, 102, 29 ] & \color{chocolate3} \rule{1cm}{1.5ex}\\
-chocolate4 & [ 139, 69, 19 ] & \color{chocolate4} \rule{1cm}{1.5ex}\\
-LightGreen & [ 144, 238, 144 ] & \color{LightGreen} \rule{1cm}{1.5ex}\\
-\end{tabular}
-
-
-\begin{tabular}{|l|c|c|}
-lavender & [ 230, 230, 250 ] & \color{lavender} \rule{1cm}{1.5ex}\\
-MediumPurple & [ 147, 112, 219 ] & \color{MediumPurple} \rule{1cm}{1.5ex}\\
-DarkOrange & [ 255, 127, 0 ] & \color{DarkOrange} \rule{1cm}{1.5ex}\\
-DarkOrange2 & [ 238, 118, 0 ] & \color{DarkOrange2} \rule{1cm}{1.5ex}\\
-DarkOrange3 & [ 205, 102, 0 ] & \color{DarkOrange3} \rule{1cm}{1.5ex}\\
-DarkOrange4 & [ 139, 69, 0 ] & \color{DarkOrange4} \rule{1cm}{1.5ex}\\
-SlateBlue & [ 106, 90, 205 ] & \color{SlateBlue} \rule{1cm}{1.5ex}\\
-BlueViolet & [ 138, 43, 226 ] & \color{BlueViolet} \rule{1cm}{1.5ex}\\
-RoyalBlue & [ 65, 105, 225 ] & \color{RoyalBlue} \rule{1cm}{1.5ex}\\
-AntiqueWhite & [ 250, 235, 215 ] & \color{AntiqueWhite} \rule{1cm}{1.5ex}\\
-AntiqueWhite1 & [ 255, 239, 219 ] & \color{AntiqueWhite1} \rule{1cm}{1.5ex}\\
-AntiqueWhite2 & [ 238, 223, 204 ] & \color{AntiqueWhite2} \rule{1cm}{1.5ex}\\
-AntiqueWhite3 & [ 205, 192, 176 ] & \color{AntiqueWhite3} \rule{1cm}{1.5ex}\\
-AntiqueWhite4 & [ 139, 131, 120 ] & \color{AntiqueWhite4} \rule{1cm}{1.5ex}\\
-CadetBlue & [ 95, 158, 160 ] & \color{CadetBlue} \rule{1cm}{1.5ex}\\
-CadetBlue1 & [ 152, 245, 255 ] & \color{CadetBlue1} \rule{1cm}{1.5ex}\\
-CadetBlue2 & [ 142, 229, 238 ] & \color{CadetBlue2} \rule{1cm}{1.5ex}\\
-CadetBlue3 & [ 122, 197, 205 ] & \color{CadetBlue3} \rule{1cm}{1.5ex}\\
-CadetBlue4 & [ 83, 134, 139 ] & \color{CadetBlue4} \rule{1cm}{1.5ex}\\
-DarkGoldenrod & [ 184, 134, 11 ] & \color{DarkGoldenrod} \rule{1cm}{1.5ex}\\
-DarkGoldenrod1 & [ 255, 185, 15 ] & \color{DarkGoldenrod1} \rule{1cm}{1.5ex}\\
-DarkGoldenrod2 & [ 238, 173, 14 ] & \color{DarkGoldenrod2} \rule{1cm}{1.5ex}\\
-DarkGoldenrod3 & [ 205, 149, 12 ] & \color{DarkGoldenrod3} \rule{1cm}{1.5ex}\\
-DarkGoldenrod4 & [ 139, 101, 8 ] & \color{DarkGoldenrod4} \rule{1cm}{1.5ex}\\
-DarkOliveGreen & [ 85, 107, 47 ] & \color{DarkOliveGreen} \rule{1cm}{1.5ex}\\
-DarkOliveGreen1 & [ 202, 255, 112 ] & \color{DarkOliveGreen1} \rule{1cm}{1.5ex}\\
-DarkOliveGreen2 & [ 188, 238, 104 ] & \color{DarkOliveGreen2} \rule{1cm}{1.5ex}\\
-DarkOliveGreen3 & [ 162, 205, 90 ] & \color{DarkOliveGreen3} \rule{1cm}{1.5ex}\\
-DarkOliveGreen4 & [ 110, 139, 61 ] & \color{DarkOliveGreen4} \rule{1cm}{1.5ex}\\
-DarkOrange1 & [ 255, 127, 0 ] & \color{DarkOrange1} \rule{1cm}{1.5ex}\\
-DarkOrchid & [ 153, 50, 204 ] & \color{DarkOrchid} \rule{1cm}{1.5ex}\\
-DarkOrchid1 & [ 191, 62, 255 ] & \color{DarkOrchid1} \rule{1cm}{1.5ex}\\
-DarkOrchid2 & [ 178, 58, 238 ] & \color{DarkOrchid2} \rule{1cm}{1.5ex}\\
-DarkOrchid3 & [ 154, 50, 205 ] & \color{DarkOrchid3} \rule{1cm}{1.5ex}\\
-DarkOrchid4 & [ 104, 34, 139 ] & \color{DarkOrchid4} \rule{1cm}{1.5ex}\\
-DarkSeaGreen & [ 143, 188, 143 ] & \color{DarkSeaGreen} \rule{1cm}{1.5ex}\\
-DarkSeaGreen1 & [ 193, 255, 193 ] & \color{DarkSeaGreen1} \rule{1cm}{1.5ex}\\
-DarkSeaGreen2 & [ 180, 238, 180 ] & \color{DarkSeaGreen2} \rule{1cm}{1.5ex}\\
-DarkSeaGreen3 & [ 155, 205, 155 ] & \color{DarkSeaGreen3} \rule{1cm}{1.5ex}\\
-\end{tabular}
-
-
-\begin{tabular}{|l|c|c|}
-DarkSeaGreen4 & [ 105, 139, 105 ] & \color{DarkSeaGreen4} \rule{1cm}{1.5ex}\\
-DarkSlateGray & [ 47, 79, 79 ] & \color{DarkSlateGray} \rule{1cm}{1.5ex}\\
-DarkSlateGray1 & [ 151, 255, 255 ] & \color{DarkSlateGray1} \rule{1cm}{1.5ex}\\
-DarkSlateGray2 & [ 141, 238, 238 ] & \color{DarkSlateGray2} \rule{1cm}{1.5ex}\\
-DarkSlateGray3 & [ 121, 205, 205 ] & \color{DarkSlateGray3} \rule{1cm}{1.5ex}\\
-DarkSlateGray4 & [ 82, 139, 139 ] & \color{DarkSlateGray4} \rule{1cm}{1.5ex}\\
-DeepPink & [ 255, 20, 147 ] & \color{DeepPink} \rule{1cm}{1.5ex}\\
-DeepPink1 & [ 255, 20, 147 ] & \color{DeepPink1} \rule{1cm}{1.5ex}\\
-DeepPink2 & [ 238, 18, 137 ] & \color{DeepPink2} \rule{1cm}{1.5ex}\\
-DeepPink3 & [ 205, 16, 118 ] & \color{DeepPink3} \rule{1cm}{1.5ex}\\
-DeepPink4 & [ 139, 10, 80 ] & \color{DeepPink4} \rule{1cm}{1.5ex}\\
-DeepSkyBlue & [ 0, 191, 255 ] & \color{DeepSkyBlue} \rule{1cm}{1.5ex}\\
-DeepSkyBlue1 & [ 0, 191, 255 ] & \color{DeepSkyBlue1} \rule{1cm}{1.5ex}\\
-DeepSkyBlue2 & [ 0, 178, 238 ] & \color{DeepSkyBlue2} \rule{1cm}{1.5ex}\\
-DeepSkyBlue3 & [ 0, 154, 205 ] & \color{DeepSkyBlue3} \rule{1cm}{1.5ex}\\
-DeepSkyBlue4 & [ 0, 104, 139 ] & \color{DeepSkyBlue4} \rule{1cm}{1.5ex}\\
-DodgerBlue & [ 30, 144, 255 ] & \color{DodgerBlue} \rule{1cm}{1.5ex}\\
-DodgerBlue1 & [ 30, 144, 255 ] & \color{DodgerBlue1} \rule{1cm}{1.5ex}\\
-DodgerBlue2 & [ 28, 134, 238 ] & \color{DodgerBlue2} \rule{1cm}{1.5ex}\\
-DodgerBlue3 & [ 24, 116, 205 ] & \color{DodgerBlue3} \rule{1cm}{1.5ex}\\
-DodgerBlue4 & [ 16, 78, 139 ] & \color{DodgerBlue4} \rule{1cm}{1.5ex}\\
-HotPink1 & [ 255, 110, 180 ] & \color{HotPink1} \rule{1cm}{1.5ex}\\
-HotPink2 & [ 238, 106, 167 ] & \color{HotPink2} \rule{1cm}{1.5ex}\\
-HotPink3 & [ 205, 96, 144 ] & \color{HotPink3} \rule{1cm}{1.5ex}\\
-HotPink4 & [ 139, 58, 98 ] & \color{HotPink4} \rule{1cm}{1.5ex}\\
-IndianRed & [ 205, 92, 92 ] & \color{IndianRed} \rule{1cm}{1.5ex}\\
-IndianRed1 & [ 255, 106, 106 ] & \color{IndianRed1} \rule{1cm}{1.5ex}\\
-IndianRed2 & [ 238, 99, 99 ] & \color{IndianRed2} \rule{1cm}{1.5ex}\\
-IndianRed3 & [ 205, 85, 85 ] & \color{IndianRed3} \rule{1cm}{1.5ex}\\
-IndianRed4 & [ 139, 58, 58 ] & \color{IndianRed4} \rule{1cm}{1.5ex}\\
-LavenderBlush & [ 255, 240, 245 ] & \color{LavenderBlush} \rule{1cm}{1.5ex}\\
-LavenderBlush1 & [ 255, 240, 245 ] & \color{LavenderBlush1} \rule{1cm}{1.5ex}\\
-LavenderBlush2 & [ 238, 224, 229 ] & \color{LavenderBlush2} \rule{1cm}{1.5ex}\\
-LavenderBlush3 & [ 205, 193, 197 ] & \color{LavenderBlush3} \rule{1cm}{1.5ex}\\
-LavenderBlush4 & [ 139, 131, 134 ] & \color{LavenderBlush4} \rule{1cm}{1.5ex}\\
-LemonChiffon & [ 255, 250, 205 ] & \color{LemonChiffon} \rule{1cm}{1.5ex}\\
-LemonChiffon1 & [ 255, 250, 205 ] & \color{LemonChiffon1} \rule{1cm}{1.5ex}\\
-LemonChiffon2 & [ 238, 233, 191 ] & \color{LemonChiffon2} \rule{1cm}{1.5ex}\\
-LemonChiffon3 & [ 205, 201, 165 ] & \color{LemonChiffon3} \rule{1cm}{1.5ex}\\
-\end{tabular}
-
-
-\begin{tabular}{|l|c|c|}
-LemonChiffon4 & [ 139, 137, 112 ] & \color{LemonChiffon4} \rule{1cm}{1.5ex}\\
-LightBlue & [ 173, 216, 230 ] & \color{LightBlue} \rule{1cm}{1.5ex}\\
-LightBlue1 & [ 191, 239, 255 ] & \color{LightBlue1} \rule{1cm}{1.5ex}\\
-LightBlue2 & [ 178, 223, 238 ] & \color{LightBlue2} \rule{1cm}{1.5ex}\\
-LightBlue3 & [ 154, 192, 205 ] & \color{LightBlue3} \rule{1cm}{1.5ex}\\
-LightBlue4 & [ 104, 131, 139 ] & \color{LightBlue4} \rule{1cm}{1.5ex}\\
-LightCyan & [ 224, 255, 255 ] & \color{LightCyan} \rule{1cm}{1.5ex}\\
-LightCyan1 & [ 224, 255, 255 ] & \color{LightCyan1} \rule{1cm}{1.5ex}\\
-LightCyan2 & [ 209, 238, 238 ] & \color{LightCyan2} \rule{1cm}{1.5ex}\\
-LightCyan3 & [ 180, 205, 205 ] & \color{LightCyan3} \rule{1cm}{1.5ex}\\
-LightCyan4 & [ 122, 139, 139 ] & \color{LightCyan4} \rule{1cm}{1.5ex}\\
-LightGoldenrod & [ 238, 221, 130 ] & \color{LightGoldenrod} \rule{1cm}{1.5ex}\\
-LightGoldenrod1 & [ 255, 236, 139 ] & \color{LightGoldenrod1} \rule{1cm}{1.5ex}\\
-LightGoldenrod2 & [ 238, 220, 130 ] & \color{LightGoldenrod2} \rule{1cm}{1.5ex}\\
-LightGoldenrod3 & [ 205, 190, 112 ] & \color{LightGoldenrod3} \rule{1cm}{1.5ex}\\
-LightGoldenrod4 & [ 139, 129, 76 ] & \color{LightGoldenrod4} \rule{1cm}{1.5ex}\\
-LightPink & [ 255, 182, 193 ] & \color{LightPink} \rule{1cm}{1.5ex}\\
-LightPink1 & [ 255, 174, 185 ] & \color{LightPink1} \rule{1cm}{1.5ex}\\
-LightPink2 & [ 238, 162, 173 ] & \color{LightPink2} \rule{1cm}{1.5ex}\\
-LightPink3 & [ 205, 140, 149 ] & \color{LightPink3} \rule{1cm}{1.5ex}\\
-LightPink4 & [ 139, 95, 101 ] & \color{LightPink4} \rule{1cm}{1.5ex}\\
-LightSalmon & [ 255, 160, 122 ] & \color{LightSalmon} \rule{1cm}{1.5ex}\\
-LightSalmon1 & [ 255, 160, 122 ] & \color{LightSalmon1} \rule{1cm}{1.5ex}\\
-LightSalmon2 & [ 238, 149, 114 ] & \color{LightSalmon2} \rule{1cm}{1.5ex}\\
-LightSalmon3 & [ 205, 129, 98 ] & \color{LightSalmon3} \rule{1cm}{1.5ex}\\
-LightSalmon4 & [ 139, 87, 66 ] & \color{LightSalmon4} \rule{1cm}{1.5ex}\\
-LightSkyBlue & [ 135, 206, 250 ] & \color{LightSkyBlue} \rule{1cm}{1.5ex}\\
-LightSkyBlue1 & [ 176, 226, 255 ] & \color{LightSkyBlue1} \rule{1cm}{1.5ex}\\
-LightSkyBlue2 & [ 164, 211, 238 ] & \color{LightSkyBlue2} \rule{1cm}{1.5ex}\\
-LightSkyBlue3 & [ 141, 182, 205 ] & \color{LightSkyBlue3} \rule{1cm}{1.5ex}\\
-LightSkyBlue4 & [ 96, 123, 139 ] & \color{LightSkyBlue4} \rule{1cm}{1.5ex}\\
-LightSteelBlue & [ 176, 196, 222 ] & \color{LightSteelBlue} \rule{1cm}{1.5ex}\\
-LightSteelBlue1 & [ 202, 225, 255 ] & \color{LightSteelBlue1} \rule{1cm}{1.5ex}\\
-LightSteelBlue2 & [ 188, 210, 238 ] & \color{LightSteelBlue2} \rule{1cm}{1.5ex}\\
-LightSteelBlue3 & [ 162, 181, 205 ] & \color{LightSteelBlue3} \rule{1cm}{1.5ex}\\
-LightSteelBlue4 & [ 110, 123, 139 ] & \color{LightSteelBlue4} \rule{1cm}{1.5ex}\\
-LightYellow & [ 255, 255, 224 ] & \color{LightYellow} \rule{1cm}{1.5ex}\\
-LightYellow1 & [ 255, 255, 224 ] & \color{LightYellow1} \rule{1cm}{1.5ex}\\
-LightYellow2 & [ 238, 238, 209 ] & \color{LightYellow2} \rule{1cm}{1.5ex}\\
-\end{tabular}
-
-
-\begin{tabular}{|l|c|c|}
-LightYellow3 & [ 205, 205, 180 ] & \color{LightYellow3} \rule{1cm}{1.5ex}\\
-LightYellow4 & [ 139, 139, 122 ] & \color{LightYellow4} \rule{1cm}{1.5ex}\\
-MediumOrchid & [ 186, 85, 211 ] & \color{MediumOrchid} \rule{1cm}{1.5ex}\\
-MediumOrchid1 & [ 224, 102, 255 ] & \color{MediumOrchid1} \rule{1cm}{1.5ex}\\
-MediumOrchid2 & [ 209, 95, 238 ] & \color{MediumOrchid2} \rule{1cm}{1.5ex}\\
-MediumOrchid3 & [ 180, 82, 205 ] & \color{MediumOrchid3} \rule{1cm}{1.5ex}\\
-MediumOrchid4 & [ 122, 55, 139 ] & \color{MediumOrchid4} \rule{1cm}{1.5ex}\\
-MediumPurple1 & [ 171, 130, 255 ] & \color{MediumPurple1} \rule{1cm}{1.5ex}\\
-MediumPurple2 & [ 159, 121, 238 ] & \color{MediumPurple2} \rule{1cm}{1.5ex}\\
-MediumPurple3 & [ 137, 104, 205 ] & \color{MediumPurple3} \rule{1cm}{1.5ex}\\
-MediumPurple4 & [ 93, 71, 139 ] & \color{MediumPurple4} \rule{1cm}{1.5ex}\\
-MistyRose & [ 255, 228, 225 ] & \color{MistyRose} \rule{1cm}{1.5ex}\\
-MistyRose1 & [ 255, 228, 225 ] & \color{MistyRose1} \rule{1cm}{1.5ex}\\
-MistyRose2 & [ 238, 213, 210 ] & \color{MistyRose2} \rule{1cm}{1.5ex}\\
-MistyRose3 & [ 205, 183, 181 ] & \color{MistyRose3} \rule{1cm}{1.5ex}\\
-MistyRose4 & [ 139, 125, 123 ] & \color{MistyRose4} \rule{1cm}{1.5ex}\\
-NavajoWhite & [ 255, 222, 173 ] & \color{NavajoWhite} \rule{1cm}{1.5ex}\\
-NavajoWhite1 & [ 255, 222, 173 ] & \color{NavajoWhite1} \rule{1cm}{1.5ex}\\
-NavajoWhite2 & [ 238, 207, 161 ] & \color{NavajoWhite2} \rule{1cm}{1.5ex}\\
-NavajoWhite3 & [ 205, 179, 139 ] & \color{NavajoWhite3} \rule{1cm}{1.5ex}\\
-NavajoWhite4 & [ 139, 121, 94 ] & \color{NavajoWhite4} \rule{1cm}{1.5ex}\\
-OliveDrab & [ 107, 142, 35 ] & \color{OliveDrab} \rule{1cm}{1.5ex}\\
-OliveDrab1 & [ 192, 255, 62 ] & \color{OliveDrab1} \rule{1cm}{1.5ex}\\
-OliveDrab2 & [ 179, 238, 58 ] & \color{OliveDrab2} \rule{1cm}{1.5ex}\\
-OliveDrab3 & [ 154, 205, 50 ] & \color{OliveDrab3} \rule{1cm}{1.5ex}\\
-OliveDrab4 & [ 105, 139, 34 ] & \color{OliveDrab4} \rule{1cm}{1.5ex}\\
-OrangeRed & [ 255, 69, 0 ] & \color{OrangeRed} \rule{1cm}{1.5ex}\\
-OrangeRed1 & [ 255, 69, 0 ] & \color{OrangeRed1} \rule{1cm}{1.5ex}\\
-OrangeRed2 & [ 238, 64, 0 ] & \color{OrangeRed2} \rule{1cm}{1.5ex}\\
-OrangeRed3 & [ 205, 55, 0 ] & \color{OrangeRed3} \rule{1cm}{1.5ex}\\
-OrangeRed4 & [ 139, 37, 0 ] & \color{OrangeRed4} \rule{1cm}{1.5ex}\\
-PaleGreen & [ 152, 251, 152 ] & \color{PaleGreen} \rule{1cm}{1.5ex}\\
-PaleTurquoise & [ 175, 238, 238 ] & \color{PaleTurquoise} \rule{1cm}{1.5ex}\\
-PaleTurquoise1 & [ 187, 255, 255 ] & \color{PaleTurquoise1} \rule{1cm}{1.5ex}\\
-PaleTurquoise2 & [ 174, 238, 238 ] & \color{PaleTurquoise2} \rule{1cm}{1.5ex}\\
-PaleTurquoise3 & [ 150, 205, 205 ] & \color{PaleTurquoise3} \rule{1cm}{1.5ex}\\
-PaleTurquoise4 & [ 102, 139, 139 ] & \color{PaleTurquoise4} \rule{1cm}{1.5ex}\\
-PaleVioletRed & [ 219, 112, 147 ] & \color{PaleVioletRed} \rule{1cm}{1.5ex}\\
-PaleVioletRed1 & [ 255, 130, 171 ] & \color{PaleVioletRed1} \rule{1cm}{1.5ex}\\
-\end{tabular}
-
-
-\begin{tabular}{|l|c|c|}
-PaleVioletRed2 & [ 238, 121, 159 ] & \color{PaleVioletRed2} \rule{1cm}{1.5ex}\\
-PaleVioletRed3 & [ 205, 104, 137 ] & \color{PaleVioletRed3} \rule{1cm}{1.5ex}\\
-PaleVioletRed4 & [ 139, 71, 93 ] & \color{PaleVioletRed4} \rule{1cm}{1.5ex}\\
-RosyBrown & [ 188, 143, 143 ] & \color{RosyBrown} \rule{1cm}{1.5ex}\\
-RosyBrown1 & [ 255, 193, 193 ] & \color{RosyBrown1} \rule{1cm}{1.5ex}\\
-RosyBrown2 & [ 238, 180, 180 ] & \color{RosyBrown2} \rule{1cm}{1.5ex}\\
-RosyBrown3 & [ 205, 155, 155 ] & \color{RosyBrown3} \rule{1cm}{1.5ex}\\
-RosyBrown4 & [ 139, 105, 105 ] & \color{RosyBrown4} \rule{1cm}{1.5ex}\\
-RoyalBlue1 & [ 72, 118, 255 ] & \color{RoyalBlue1} \rule{1cm}{1.5ex}\\
-RoyalBlue2 & [ 67, 110, 238 ] & \color{RoyalBlue2} \rule{1cm}{1.5ex}\\
-RoyalBlue3 & [ 58, 95, 205 ] & \color{RoyalBlue3} \rule{1cm}{1.5ex}\\
-RoyalBlue4 & [ 39, 64, 139 ] & \color{RoyalBlue4} \rule{1cm}{1.5ex}\\
-SeaGreen & [ 46, 139, 87 ] & \color{SeaGreen} \rule{1cm}{1.5ex}\\
-SeaGreen1 & [ 84, 255, 159 ] & \color{SeaGreen1} \rule{1cm}{1.5ex}\\
-SeaGreen2 & [ 78, 238, 148 ] & \color{SeaGreen2} \rule{1cm}{1.5ex}\\
-SeaGreen3 & [ 67, 205, 128 ] & \color{SeaGreen3} \rule{1cm}{1.5ex}\\
-SeaGreen4 & [ 46, 139, 87 ] & \color{SeaGreen4} \rule{1cm}{1.5ex}\\
-SkyBlue & [ 135, 206, 235 ] & \color{SkyBlue} \rule{1cm}{1.5ex}\\
-SkyBlue1 & [ 135, 206, 255 ] & \color{SkyBlue1} \rule{1cm}{1.5ex}\\
-SkyBlue2 & [ 126, 192, 238 ] & \color{SkyBlue2} \rule{1cm}{1.5ex}\\
-SkyBlue3 & [ 108, 166, 205 ] & \color{SkyBlue3} \rule{1cm}{1.5ex}\\
-SkyBlue4 & [ 74, 112, 139 ] & \color{SkyBlue4} \rule{1cm}{1.5ex}\\
-SlateBlue1 & [ 131, 111, 255 ] & \color{SlateBlue1} \rule{1cm}{1.5ex}\\
-SlateBlue2 & [ 122, 103, 238 ] & \color{SlateBlue2} \rule{1cm}{1.5ex}\\
-SlateBlue3 & [ 105, 89, 205 ] & \color{SlateBlue3} \rule{1cm}{1.5ex}\\
-SlateBlue4 & [ 71, 60, 139 ] & \color{SlateBlue4} \rule{1cm}{1.5ex}\\
-SlateGray & [ 112, 128, 144 ] & \color{SlateGray} \rule{1cm}{1.5ex}\\
-SlateGray1 & [ 198, 226, 255 ] & \color{SlateGray1} \rule{1cm}{1.5ex}\\
-SlateGray2 & [ 185, 211, 238 ] & \color{SlateGray2} \rule{1cm}{1.5ex}\\
-SlateGray3 & [ 159, 182, 205 ] & \color{SlateGray3} \rule{1cm}{1.5ex}\\
-SlateGray4 & [ 108, 123, 139 ] & \color{SlateGray4} \rule{1cm}{1.5ex}\\
-SpringGreen & [ 0, 255, 127 ] & \color{SpringGreen} \rule{1cm}{1.5ex}\\
-SpringGreen1 & [ 0, 255, 127 ] & \color{SpringGreen1} \rule{1cm}{1.5ex}\\
-SpringGreen2 & [ 0, 238, 118 ] & \color{SpringGreen2} \rule{1cm}{1.5ex}\\
-SpringGreen3 & [ 0, 205, 102 ] & \color{SpringGreen3} \rule{1cm}{1.5ex}\\
-SpringGreen4 & [ 0, 139, 69 ] & \color{SpringGreen4} \rule{1cm}{1.5ex}\\
-SteelBlue & [ 70, 130, 180 ] & \color{SteelBlue} \rule{1cm}{1.5ex}\\
-SteelBlue1 & [ 99, 184, 255 ] & \color{SteelBlue1} \rule{1cm}{1.5ex}\\
-SteelBlue2 & [ 92, 172, 238 ] & \color{SteelBlue2} \rule{1cm}{1.5ex}\\
-\end{tabular}
-
-
-\begin{tabular}{|l|c|c|}
-SteelBlue3 & [ 79, 148, 205 ] & \color{SteelBlue3} \rule{1cm}{1.5ex}\\
-SteelBlue4 & [ 54, 100, 139 ] & \color{SteelBlue4} \rule{1cm}{1.5ex}\\
-VioletRed & [ 208, 32, 144 ] & \color{VioletRed} \rule{1cm}{1.5ex}\\
-VioletRed1 & [ 255, 62, 150 ] & \color{VioletRed1} \rule{1cm}{1.5ex}\\
-VioletRed2 & [ 238, 58, 140 ] & \color{VioletRed2} \rule{1cm}{1.5ex}\\
-VioletRed3 & [ 205, 50, 120 ] & \color{VioletRed3} \rule{1cm}{1.5ex}\\
-VioletRed4 & [ 139, 34, 82 ] & \color{VioletRed4} \rule{1cm}{1.5ex}\\
-aquamarine & [ 127, 255, 212 ] & \color{aquamarine} \rule{1cm}{1.5ex}\\
-aquamarine1 & [ 127, 255, 212 ] & \color{aquamarine1} \rule{1cm}{1.5ex}\\
-aquamarine2 & [ 118, 238, 198 ] & \color{aquamarine2} \rule{1cm}{1.5ex}\\
-aquamarine3 & [ 102, 205, 170 ] & \color{aquamarine3} \rule{1cm}{1.5ex}\\
-aquamarine4 & [ 69, 139, 116 ] & \color{aquamarine4} \rule{1cm}{1.5ex}\\
-azure & [ 240, 255, 255 ] & \color{azure} \rule{1cm}{1.5ex}\\
-azure1 & [ 240, 255, 255 ] & \color{azure1} \rule{1cm}{1.5ex}\\
-azure2 & [ 224, 238, 238 ] & \color{azure2} \rule{1cm}{1.5ex}\\
-azure3 & [ 193, 205, 205 ] & \color{azure3} \rule{1cm}{1.5ex}\\
-azure4 & [ 131, 139, 139 ] & \color{azure4} \rule{1cm}{1.5ex}\\
-bisque & [ 255, 228, 196 ] & \color{bisque} \rule{1cm}{1.5ex}\\
-bisque1 & [ 255, 228, 196 ] & \color{bisque1} \rule{1cm}{1.5ex}\\
-bisque2 & [ 238, 213, 183 ] & \color{bisque2} \rule{1cm}{1.5ex}\\
-bisque3 & [ 205, 183, 158 ] & \color{bisque3} \rule{1cm}{1.5ex}\\
-bisque4 & [ 139, 125, 107 ] & \color{bisque4} \rule{1cm}{1.5ex}\\
-blue1 & [ 0, 0, 255 ] & \color{blue1} \rule{1cm}{1.5ex}\\
-blue2 & [ 0, 0, 238 ] & \color{blue2} \rule{1cm}{1.5ex}\\
-blue3 & [ 0, 0, 205 ] & \color{blue3} \rule{1cm}{1.5ex}\\
-blue4 & [ 0, 0, 139 ] & \color{blue4} \rule{1cm}{1.5ex}\\
-brown1 & [ 255, 64, 64 ] & \color{brown1} \rule{1cm}{1.5ex}\\
-brown2 & [ 238, 59, 59 ] & \color{brown2} \rule{1cm}{1.5ex}\\
-brown3 & [ 205, 51, 51 ] & \color{brown3} \rule{1cm}{1.5ex}\\
-brown4 & [ 139, 35, 35 ] & \color{brown4} \rule{1cm}{1.5ex}\\
-burlywood & [ 222, 184, 135 ] & \color{burlywood} \rule{1cm}{1.5ex}\\
-burlywood1 & [ 255, 211, 155 ] & \color{burlywood1} \rule{1cm}{1.5ex}\\
-burlywood2 & [ 238, 197, 145 ] & \color{burlywood2} \rule{1cm}{1.5ex}\\
-burlywood3 & [ 205, 170, 125 ] & \color{burlywood3} \rule{1cm}{1.5ex}\\
-burlywood4 & [ 139, 115, 85 ] & \color{burlywood4} \rule{1cm}{1.5ex}\\
-chartreuse & [ 127, 255, 0 ] & \color{chartreuse} \rule{1cm}{1.5ex}\\
-chartreuse1 & [ 127, 255, 0 ] & \color{chartreuse1} \rule{1cm}{1.5ex}\\
-chartreuse2 & [ 118, 238, 0 ] & \color{chartreuse2} \rule{1cm}{1.5ex}\\
-chartreuse3 & [ 102, 205, 0 ] & \color{chartreuse3} \rule{1cm}{1.5ex}\\
-\end{tabular}
-
-
-\begin{tabular}{|l|c|c|}
-chartreuse4 & [ 69, 139, 0 ] & \color{chartreuse4} \rule{1cm}{1.5ex}\\
-chocolate & [ 210, 105, 30 ] & \color{chocolate} \rule{1cm}{1.5ex}\\
-coral & [ 255, 127, 80 ] & \color{coral} \rule{1cm}{1.5ex}\\
-coral1 & [ 255, 114, 86 ] & \color{coral1} \rule{1cm}{1.5ex}\\
-coral2 & [ 238, 106, 80 ] & \color{coral2} \rule{1cm}{1.5ex}\\
-coral3 & [ 205, 91, 69 ] & \color{coral3} \rule{1cm}{1.5ex}\\
-coral4 & [ 139, 62, 47 ] & \color{coral4} \rule{1cm}{1.5ex}\\
-cornsilk & [ 255, 248, 220 ] & \color{cornsilk} \rule{1cm}{1.5ex}\\
-cornsilk1 & [ 255, 248, 220 ] & \color{cornsilk1} \rule{1cm}{1.5ex}\\
-cornsilk2 & [ 238, 232, 205 ] & \color{cornsilk2} \rule{1cm}{1.5ex}\\
-cornsilk3 & [ 205, 200, 177 ] & \color{cornsilk3} \rule{1cm}{1.5ex}\\
-cornsilk4 & [ 139, 136, 120 ] & \color{cornsilk4} \rule{1cm}{1.5ex}\\
-cyan & [ 0, 255, 255 ] & \color{cyan} \rule{1cm}{1.5ex}\\
-cyan1 & [ 0, 255, 255 ] & \color{cyan1} \rule{1cm}{1.5ex}\\
-cyan2 & [ 0, 238, 238 ] & \color{cyan2} \rule{1cm}{1.5ex}\\
-cyan3 & [ 0, 205, 205 ] & \color{cyan3} \rule{1cm}{1.5ex}\\
-cyan4 & [ 0, 139, 139 ] & \color{cyan4} \rule{1cm}{1.5ex}\\
-firebrick & [ 178, 34, 34 ] & \color{firebrick} \rule{1cm}{1.5ex}\\
-firebrick1 & [ 255, 48, 48 ] & \color{firebrick1} \rule{1cm}{1.5ex}\\
-firebrick2 & [ 238, 44, 44 ] & \color{firebrick2} \rule{1cm}{1.5ex}\\
-firebrick3 & [ 205, 38, 38 ] & \color{firebrick3} \rule{1cm}{1.5ex}\\
-firebrick4 & [ 139, 26, 26 ] & \color{firebrick4} \rule{1cm}{1.5ex}\\
-gold & [ 255, 215, 0 ] & \color{gold} \rule{1cm}{1.5ex}\\
-gold1 & [ 255, 215, 0 ] & \color{gold1} \rule{1cm}{1.5ex}\\
-gold2 & [ 238, 201, 0 ] & \color{gold2} \rule{1cm}{1.5ex}\\
-gold3 & [ 205, 173, 0 ] & \color{gold3} \rule{1cm}{1.5ex}\\
-gold4 & [ 139, 117, 0 ] & \color{gold4} \rule{1cm}{1.5ex}\\
-goldenrod & [ 218, 165, 32 ] & \color{goldenrod} \rule{1cm}{1.5ex}\\
-goldenrod1 & [ 255, 193, 37 ] & \color{goldenrod1} \rule{1cm}{1.5ex}\\
-goldenrod2 & [ 238, 180, 34 ] & \color{goldenrod2} \rule{1cm}{1.5ex}\\
-goldenrod3 & [ 205, 155, 29 ] & \color{goldenrod3} \rule{1cm}{1.5ex}\\
-goldenrod4 & [ 139, 105, 20 ] & \color{goldenrod4} \rule{1cm}{1.5ex}\\
-gray & [ 190, 190, 190 ] & \color{gray} \rule{1cm}{1.5ex}\\
-gray1 & [ 3, 3, 3 ] & \color{gray1} \rule{1cm}{1.5ex}\\
-gray2 & [ 5, 5, 5 ] & \color{gray2} \rule{1cm}{1.5ex}\\
-gray3 & [ 8, 8, 8 ] & \color{gray3} \rule{1cm}{1.5ex}\\
-gray4 & [ 10, 10, 10 ] & \color{gray4} \rule{1cm}{1.5ex}\\
-green1 & [ 0, 255, 0 ] & \color{green1} \rule{1cm}{1.5ex}\\
-green2 & [ 0, 238, 0 ] & \color{green2} \rule{1cm}{1.5ex}\\
-\end{tabular}
-
-
-\begin{tabular}{|l|c|c|}
-green3 & [ 0, 205, 0 ] & \color{green3} \rule{1cm}{1.5ex}\\
-green4 & [ 0, 139, 0 ] & \color{green4} \rule{1cm}{1.5ex}\\
-grey1 & [ 3, 3, 3 ] & \color{grey1} \rule{1cm}{1.5ex}\\
-grey2 & [ 5, 5, 5 ] & \color{grey2} \rule{1cm}{1.5ex}\\
-grey3 & [ 8, 8, 8 ] & \color{grey3} \rule{1cm}{1.5ex}\\
-grey4 & [ 10, 10, 10 ] & \color{grey4} \rule{1cm}{1.5ex}\\
-honeydew & [ 240, 255, 240 ] & \color{honeydew} \rule{1cm}{1.5ex}\\
-honeydew1 & [ 240, 255, 240 ] & \color{honeydew1} \rule{1cm}{1.5ex}\\
-honeydew2 & [ 224, 238, 224 ] & \color{honeydew2} \rule{1cm}{1.5ex}\\
-honeydew3 & [ 193, 205, 193 ] & \color{honeydew3} \rule{1cm}{1.5ex}\\
-honeydew4 & [ 131, 139, 131 ] & \color{honeydew4} \rule{1cm}{1.5ex}\\
-ivory & [ 255, 255, 240 ] & \color{ivory} \rule{1cm}{1.5ex}\\
-ivory1 & [ 255, 255, 240 ] & \color{ivory1} \rule{1cm}{1.5ex}\\
-ivory2 & [ 238, 238, 224 ] & \color{ivory2} \rule{1cm}{1.5ex}\\
-ivory3 & [ 205, 205, 193 ] & \color{ivory3} \rule{1cm}{1.5ex}\\
-ivory4 & [ 139, 139, 131 ] & \color{ivory4} \rule{1cm}{1.5ex}\\
-khaki & [ 240, 230, 140 ] & \color{khaki} \rule{1cm}{1.5ex}\\
-khaki1 & [ 255, 246, 143 ] & \color{khaki1} \rule{1cm}{1.5ex}\\
-khaki2 & [ 238, 230, 133 ] & \color{khaki2} \rule{1cm}{1.5ex}\\
-khaki3 & [ 205, 198, 115 ] & \color{khaki3} \rule{1cm}{1.5ex}\\
-khaki4 & [ 139, 134, 78 ] & \color{khaki4} \rule{1cm}{1.5ex}\\
-magenta & [ 255, 0, 255 ] & \color{magenta} \rule{1cm}{1.5ex}\\
-magenta1 & [ 255, 0, 255 ] & \color{magenta1} \rule{1cm}{1.5ex}\\
-magenta2 & [ 238, 0, 238 ] & \color{magenta2} \rule{1cm}{1.5ex}\\
-magenta3 & [ 205, 0, 205 ] & \color{magenta3} \rule{1cm}{1.5ex}\\
-magenta4 & [ 139, 0, 139 ] & \color{magenta4} \rule{1cm}{1.5ex}\\
-maroon & [ 176, 48, 96 ] & \color{maroon} \rule{1cm}{1.5ex}\\
-maroon1 & [ 255, 52, 179 ] & \color{maroon1} \rule{1cm}{1.5ex}\\
-maroon2 & [ 238, 48, 167 ] & \color{maroon2} \rule{1cm}{1.5ex}\\
-maroon3 & [ 205, 41, 144 ] & \color{maroon3} \rule{1cm}{1.5ex}\\
-maroon4 & [ 139, 28, 98 ] & \color{maroon4} \rule{1cm}{1.5ex}\\
-orange1 & [ 255, 165, 0 ] & \color{orange1} \rule{1cm}{1.5ex}\\
-orchid & [ 218, 112, 214 ] & \color{orchid} \rule{1cm}{1.5ex}\\
-orchid1 & [ 255, 131, 250 ] & \color{orchid1} \rule{1cm}{1.5ex}\\
-orchid2 & [ 238, 122, 233 ] & \color{orchid2} \rule{1cm}{1.5ex}\\
-orchid3 & [ 205, 105, 201 ] & \color{orchid3} \rule{1cm}{1.5ex}\\
-orchid4 & [ 139, 71, 137 ] & \color{orchid4} \rule{1cm}{1.5ex}\\
-pink1 & [ 255, 181, 197 ] & \color{pink1} \rule{1cm}{1.5ex}\\
-pink2 & [ 238, 169, 184 ] & \color{pink2} \rule{1cm}{1.5ex}\\
-\end{tabular}
-
-
-\begin{tabular}{|l|c|c|}
-pink3 & [ 205, 145, 158 ] & \color{pink3} \rule{1cm}{1.5ex}\\
-pink4 & [ 139, 99, 108 ] & \color{pink4} \rule{1cm}{1.5ex}\\
-plum1 & [ 255, 187, 255 ] & \color{plum1} \rule{1cm}{1.5ex}\\
-plum2 & [ 238, 174, 238 ] & \color{plum2} \rule{1cm}{1.5ex}\\
-plum3 & [ 205, 150, 205 ] & \color{plum3} \rule{1cm}{1.5ex}\\
-plum4 & [ 139, 102, 139 ] & \color{plum4} \rule{1cm}{1.5ex}\\
-purple1 & [ 155, 48, 255 ] & \color{purple1} \rule{1cm}{1.5ex}\\
-purple2 & [ 145, 44, 238 ] & \color{purple2} \rule{1cm}{1.5ex}\\
-purple3 & [ 125, 38, 205 ] & \color{purple3} \rule{1cm}{1.5ex}\\
-purple4 & [ 85, 26, 139 ] & \color{purple4} \rule{1cm}{1.5ex}\\
-red1 & [ 255, 0, 0 ] & \color{red1} \rule{1cm}{1.5ex}\\
-red2 & [ 238, 0, 0 ] & \color{red2} \rule{1cm}{1.5ex}\\
-red3 & [ 205, 0, 0 ] & \color{red3} \rule{1cm}{1.5ex}\\
-red4 & [ 139, 0, 0 ] & \color{red4} \rule{1cm}{1.5ex}\\
-salmon & [ 250, 128, 114 ] & \color{salmon} \rule{1cm}{1.5ex}\\
-salmon1 & [ 255, 140, 105 ] & \color{salmon1} \rule{1cm}{1.5ex}\\
-salmon2 & [ 238, 130, 98 ] & \color{salmon2} \rule{1cm}{1.5ex}\\
-salmon3 & [ 205, 112, 84 ] & \color{salmon3} \rule{1cm}{1.5ex}\\
-salmon4 & [ 139, 76, 57 ] & \color{salmon4} \rule{1cm}{1.5ex}\\
-seashell & [ 255, 245, 238 ] & \color{seashell} \rule{1cm}{1.5ex}\\
-seashell1 & [ 255, 245, 238 ] & \color{seashell1} \rule{1cm}{1.5ex}\\
-seashell2 & [ 238, 229, 222 ] & \color{seashell2} \rule{1cm}{1.5ex}\\
-seashell3 & [ 205, 197, 191 ] & \color{seashell3} \rule{1cm}{1.5ex}\\
-seashell4 & [ 139, 134, 130 ] & \color{seashell4} \rule{1cm}{1.5ex}\\
-sienna & [ 160, 82, 45 ] & \color{sienna} \rule{1cm}{1.5ex}\\
-sienna1 & [ 255, 130, 71 ] & \color{sienna1} \rule{1cm}{1.5ex}\\
-sienna2 & [ 238, 121, 66 ] & \color{sienna2} \rule{1cm}{1.5ex}\\
-sienna3 & [ 205, 104, 57 ] & \color{sienna3} \rule{1cm}{1.5ex}\\
-sienna4 & [ 139, 71, 38 ] & \color{sienna4} \rule{1cm}{1.5ex}\\
-snow & [ 255, 250, 250 ] & \color{snow} \rule{1cm}{1.5ex}\\
-snow1 & [ 255, 250, 250 ] & \color{snow1} \rule{1cm}{1.5ex}\\
-snow2 & [ 238, 233, 233 ] & \color{snow2} \rule{1cm}{1.5ex}\\
-snow3 & [ 205, 201, 201 ] & \color{snow3} \rule{1cm}{1.5ex}\\
-snow4 & [ 139, 137, 137 ] & \color{snow4} \rule{1cm}{1.5ex}\\
-tan & [ 210, 180, 140 ] & \color{tan} \rule{1cm}{1.5ex}\\
-tan1 & [ 255, 165, 79 ] & \color{tan1} \rule{1cm}{1.5ex}\\
-tan2 & [ 238, 154, 73 ] & \color{tan2} \rule{1cm}{1.5ex}\\
-tan3 & [ 205, 133, 63 ] & \color{tan3} \rule{1cm}{1.5ex}\\
-tan4 & [ 139, 90, 43 ] & \color{tan4} \rule{1cm}{1.5ex}\\
-\end{tabular}
-
-
-\begin{tabular}{|l|c|c|}
-thistle & [ 216, 191, 216 ] & \color{thistle} \rule{1cm}{1.5ex}\\
-thistle1 & [ 255, 225, 255 ] & \color{thistle1} \rule{1cm}{1.5ex}\\
-thistle2 & [ 238, 210, 238 ] & \color{thistle2} \rule{1cm}{1.5ex}\\
-thistle3 & [ 205, 181, 205 ] & \color{thistle3} \rule{1cm}{1.5ex}\\
-thistle4 & [ 139, 123, 139 ] & \color{thistle4} \rule{1cm}{1.5ex}\\
-tomato & [ 255, 99, 71 ] & \color{tomato} \rule{1cm}{1.5ex}\\
-tomato1 & [ 255, 99, 71 ] & \color{tomato1} \rule{1cm}{1.5ex}\\
-tomato2 & [ 238, 92, 66 ] & \color{tomato2} \rule{1cm}{1.5ex}\\
-tomato3 & [ 205, 79, 57 ] & \color{tomato3} \rule{1cm}{1.5ex}\\
-tomato4 & [ 139, 54, 38 ] & \color{tomato4} \rule{1cm}{1.5ex}\\
-turquoise1 & [ 0, 245, 255 ] & \color{turquoise1} \rule{1cm}{1.5ex}\\
-turquoise2 & [ 0, 229, 238 ] & \color{turquoise2} \rule{1cm}{1.5ex}\\
-turquoise3 & [ 0, 197, 205 ] & \color{turquoise3} \rule{1cm}{1.5ex}\\
-turquoise4 & [ 0, 134, 139 ] & \color{turquoise4} \rule{1cm}{1.5ex}\\
-wheat & [ 245, 222, 179 ] & \color{wheat} \rule{1cm}{1.5ex}\\
-wheat1 & [ 255, 231, 186 ] & \color{wheat1} \rule{1cm}{1.5ex}\\
-wheat2 & [ 238, 216, 174 ] & \color{wheat2} \rule{1cm}{1.5ex}\\
-wheat3 & [ 205, 186, 150 ] & \color{wheat3} \rule{1cm}{1.5ex}\\
-wheat4 & [ 139, 126, 102 ] & \color{wheat4} \rule{1cm}{1.5ex}\\
-yellow1 & [ 255, 255, 0 ] & \color{yellow1} \rule{1cm}{1.5ex}\\
-yellow2 & [ 238, 238, 0 ] & \color{yellow2} \rule{1cm}{1.5ex}\\
-yellow3 & [ 205, 205, 0 ] & \color{yellow3} \rule{1cm}{1.5ex}\\
-yellow4 & [ 139, 139, 0 ] & \color{yellow4} \rule{1cm}{1.5ex}\\
-\end{tabular}
diff --git a/doc/LaTeX/Aufbau.png b/doc/LaTeX/Aufbau.png
deleted file mode 100644
index 4fbcbce..0000000
--- a/doc/LaTeX/Aufbau.png
+++ /dev/null
Binary files differ
diff --git a/doc/LaTeX/Bars.tex b/doc/LaTeX/Bars.tex
deleted file mode 100644
index dfede25..0000000
--- a/doc/LaTeX/Bars.tex
+++ /dev/null
@@ -1,84 +0,0 @@
-%
-% bars.tex
-%
-\renewcommand{\thisname}{Chart::Bars}
-\section{\thisname}
-\name{\thisname}
-\file{Bars.pm}
-\requires{Chart::Base, GD, Carp, FileHandle}
-\begin{Description}
-The class \thisclass creates a chart made up of vertical bars.
-\thisclass is a subclass of \class{Chart::Base}.
-\end{Description}
-
-\example
-\begin{figure}[ht]
- \begin{center}
- \includegraphics[scale=0.4]{d_bars.png}
- \end{center}
- \caption{Bar chart}
- \label{fig:bars}
-\end{figure}
-
-{\small
-\begin{verbatim}
-use Chart::Bars;
-
-$g = Chart::Bars->new(600,500);
-
-$g->add_dataset('Berlin', 'Paris', 'Rome', 'London', 'Munich');
-$g->add_dataset(14, 5, 4, 5, 11);
-$g->add_dataset(12, 4, 6, 7, 12);
-$g->add_dataset(18, 2, 3, 3, 9);
-$g->add_dataset(17, 5, 7, 6, 6);
-$g->add_dataset(15, 3, 4, 5, 11);
-$g->add_dataset(11, 6, 5, 6, 12);
-$g->add_dataset(12, 1, 4, 5, 15);
-$g->add_dataset(10, 4, 6, 8, 10);
-$g->add_dataset(14, 5, 4, 5, 11);
-$g->add_dataset(12, 4, 6, 6, 12);
-$g->add_dataset(18, 2, 3, 3, 9);
-$g->add_dataset(17, 5, 7, 2, 6);
-
-%hash = ('title' => 'Sold Cars in 2001',
- 'text_space' => 5,
- 'grey_background' => 'false',
- 'integer_ticks_only' => 'true',
- 'x_label' => 'City',
- 'y_label' => 'Number of Cars',
- 'legend' => 'bottom',
- 'legend_labels' => ['January', 'February',
- 'March', 'April',
- 'May', 'June',
- 'July', 'August',
- 'September','October',
- 'November', 'December'
- ],
- 'min_val' => 0,
- 'max_val' => 20,
- 'grid_lines' =>'true',
- 'colors' => {'title' => 'red',
- 'x_label' => 'blue',
- 'y_label' => 'blue'
- }
- );
-
-$g->set(%hash);
-
-$g->png("bars.png");
-\end{verbatim}
-}
-
-\constructorblurb{\thisname}
-
-\begin{AttrDecl}{spaced\_bars}
-Leaves some space between each group of bars when set to \literal{true}.
-This usually make it easier to read a bar chart. Default is
-\literal{true}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{y\_axes}
-Tells \thisclass where to place the $y$ axis. Valid values are
-\literal{left}, \literal{right} and \literal{both}. Defaults to
-\literal{left}.
-\end{AttrDecl}
diff --git a/doc/LaTeX/Base.tex b/doc/LaTeX/Base.tex
deleted file mode 100644
index c8566e7..0000000
--- a/doc/LaTeX/Base.tex
+++ /dev/null
@@ -1,497 +0,0 @@
-%
-% Base.tex
-%
-\renewcommand{\thisname}{Chart::Base}
-\section{\thisname}
-\name{\thisname}
-\file{Base.pm}
-\requires{GD, Carp, FileHandle}
-\begin{Description}
-\thisclass is the abstract superclass of classes \class{Chart::Bars},
-\class{Chart::Composite}, \class{Chart::Direction},
-\class{Chart::ErrorBars}, \class{Chart::HorizontalBars},
-\class{Chart::Lines}, \class{Chart::LinesPoints},
-\class{Chart::Mountain}, \class{Chart::Pareto}, \class{Chart::Pie},
-\class{Chart::Points}, \class{Chart::Split}, and
-\class{Chart::StackedBars}.
-
-Class \thisclass provides all public methods and most of the
-attributes of \chart objects.
-\end{Description}
-
-\begin{Constructor}
-An object instance of class \class{Chart} can be created with the
-constructor \methoduse{new()}:\index{Methods!new()}
-\begin{SmallExample}
-\$obj = Chart::\textit{Type}\deref new();\\
-\$obj = Chart::\textit{Type}\deref new(\parameter{width}, \parameter{height});
-\end{SmallExample}
-\textit{Type} here denotes the type of chart that is to be returned,
-\eg, \methoduse{Chart::Bars\deref new()} returns a bar chart.
-
-If \methoduse{new()} is called without arguments, the constructor will
-return an object of size 300\ensuremath{\times}400 pixels. If
-\methoduse{new()} is called with two arguments, \parameter{width} and
-\parameter{height}, it will return a \chart object of the desired
-size.
-\end{Constructor}
-
-
-\Methods\label{methods}\noindent%
-\methoduse{\$obj\deref add\_dataset(\parameter{@array})}{\index{Methods!add\_dataset()}}\\
-\begin{MethDecl}{\$obj\deref add\_dataset(\parameter{\bs @array\_ref})}{add\_dataset()}
-Adds a dataset to the object. The argument is an array or a reference to
-an array. Generally, the first array added is interpreted as being the
-$x$ tick labels. The subsequent arrays contain the data points. \Eg,
-after the calls\\
-\methoduse{\$obj\deref add\_dataset('Harry', 'Sally');}\\
-\methoduse{\$obj\deref add\_dataset(5, 8);}\\
-\chart will draw a picture with two bars and label them `Harry' and
-`Sally'.
-
-Some modules will operate slightly differently. Have a look at the
-description of the specific subclass to get more information. Such
-differences will also come up if you want to use the \texttt{xy\_plot}
-option in order to create a $x$--$y$ graph.
-\end{MethDecl}
-
-\methoddecl{\$obj\deref add\_pt(\parameter{@array})}{add\_pt()}
-\begin{MethDecl}{\$obj\deref add\_pt(\parameter{\bs @array\_ref})}{add\_pt()}
-This is a different method for adding data to a
-\chart object. The argument can be an array or a reference to an
-array. If you use this method, \chart wants the complete data of
-one data point, \ie, all the data that are associated with the same $x$
-value specified first in this call. \Eg,\\
-\methoduse{\$obj\deref add\_pt('Harry', 5);}\\
-\methoduse{\$obj\deref add\_pt('Sally', 8);}\\
-would create the same graph as the example for \methoduse{add\_dataset()} above.
-\end{MethDecl}
-
-\methoddecl{\$obj\deref add\_datafile("\parameter{filename}", \textit{type})}{add\_datafile()}
-\methoddecl{\$obj\deref add\_datafile(\parameter{\$filehandle}, \textit{type})}{add\_datafile()}
-\begin{MethDecl}{\$obj\deref add\_datafile()}{add\_datafile()}
-This method adds the contents of a complete data file to the chart object.
-\textit{type} can be \literal{set} or \literal{pt}.
-In the former case, \literal{set}, each line in the data file must
-represent a complete data set (\emph{data series}). The values of the set
-must be separated by whitespace. \Eg, the file contents could look like
-this:
-\begin{quote}
-\texttt{Harry Sally}\\
-\texttt{3 8}\\
-\texttt{2 1}
-\end{quote}
-
-If the argument is \literal{pt}, the lines of the file must look
-analogous to the parameter arrays used by method \methoduse{add\_pt()}:
-Each line includes all the values of one data point (\ie, all the $y$
-values associated with the same $x$ value), also separated by
-whitespace. \Eg:
-\begin{quote}
-\small
-\texttt{Harry 3 2}\\
-\texttt{Sally 8 1}
-\end{quote}
-\end{MethDecl}
-
-\begin{MethDecl}{\$obj\deref get\_data()}{get\_data()}
-If you want a copy of the data that have been added
-so far, make a call to this method like so:\\
-\methoduse{\$dataref = \$obj\deref get\_data();}\\[\itemabstand]
-This will return a reference to an array of references to
-datasets. For example, you can get the $x$ tick labels by:\\
-\methoduse{@x\_labels = @\{\$dataref->[0]\};}
-\end{MethDecl}
-
-\begin{MethDecl}{\$obj\deref clear\_data()}{clear\_data()}
-This is the method to remove all data that may have been entered until now.
-\end{MethDecl}
-
-\methoddecl{\$obj\deref set(\parameter{attribute$_1$} \fatcomma \parameter{value$_1$}, \ldots, \mbox{\parameter{attribute$_n$} \fatcomma \parameter{value$_n$}})}{set()}
-\methoddecl{\$obj\deref set(\parameter{\%hash})}{set()}
-\methoddecl{\$obj\deref set(\parameter{attribute1}, \parameter{value$_1$}, \ldots, \mbox{\parameter{attribute$_n$}, \parameter{value$_n$}})}{set()}
-\begin{MethDecl}{\$obj\deref set(\parameter{@array})}{set()}
-Use this method to change the attributes of the chart object.
-\methoduse{set()} looks for a hash of keys and values or an array of
-keys and values. \Eg,\\
-\methoduse{\$obj\deref set('title' \fatcomma 'The title of the image');}\\
-would set the title. This would do the same job:\\
-\methoduse{\%hash = ('title' \fatcomma 'The title of the image');}\\
-\methoduse{\$obj\deref set(\%hash);}
-\end{MethDecl}
-
-\methoddecl{\$obj\deref png("\parameter{filename}")}{png()}
-\methoddecl{\$obj\deref png(\$\parameter{filehandle})}{png()}
-\methoddecl{\$obj\deref png(\parameter{FILEHANDLE})}{png()}
-\methoddecl{\$obj\deref png("\parameter{filename}", \parameter{\bs@data})}{png()}
-\begin{MethDecl}{\$obj\deref png()}{png()}
-This method creates a \textsc{png} file.
-The file parameter can be a file name, a reference to a filehandle or a
-filehandle itself. If the file does not exist, \chart will
-create it for you. If there is already a file, \chart will
-overwrite it. In case of an error, the file is not created.\\
-You can also add data to a \chart object through its
-\methoduse{png()} method. The \parameter{@data} array should contain
-references to arrays of data, with the first array reference pointing
-to an array of $x$ labels. \parameter{@data} might look like this:\\
-\methoduse{@data = (['Harry', 'Sally'], [5, 8], [50, 80]);}\\
-This would set up a graph with two datasets and three data points in
-these sets.
-\end{MethDecl}
-
-\methoddecl{\$obj\deref jpeg("\parameter{filename}")}{jpeg()}
-\methoddecl{\$obj\deref jpeg(\parameter{\$filehandle})}{jpeg()}
-\methoddecl{\$obj\deref jpeg(\parameter{FILEHANDLE})}{jpeg()}
-\methoddecl{\$obj\deref jpeg("\parameter{filename}", \bs@data)}{jpeg()}
-\begin{MethDecl}{\$obj\deref jpeg()}{jpeg()}
-This is the method to create \textsc{jpeg} files. It works analogously
-to the \methoduse{png()} method.
-\end{MethDecl}
-
-\methoddecl{\$obj\deref cgi\_png()}{cgi\_png()}
-\begin{MethDecl}{\$obj\deref cgi\_jpeg()}{cgi\_jpeg()}
-With the \textsc{cgi} methods you can create dynamic images for your web
-site. The \textsc{cgi} methods will print the chart along with the
-appropriate \textsc{http} header to \textsc{stdout}, allowing you to
-call chart-generating scripts directly from your \textsc{html} pages
-(\eg, with a \literal{$\langle$img src="image.pl" /$\rangle$}
-\textsc{html} tag).
-\end{MethDecl}
-
-\begin{MethDecl}{\$obj\deref imagemap\_dump()}{imagemap\_dump()}
-\chart can also return pixel position information so that you can
-create image maps from the files generated by \chart. Simply set the
-\literal{imagemap} option to \literal{true} before you generate the
-file, then at the end call the \methoduse{imagemap\_dump()} method to
-retrieve the information. A structure will be returned almost identical
-to the \parameter{@data} array described above to pass the data into \chart.
-
-\methoduse{\$imagemap\_data = \$obj\deref imagemap\_dump();}
-
-Instead of single data values, references to arrays of pixel information
-are passed. For the classes \class{Chart::Bars},
-\class{Chart::HorizontalBars}, \class{Chart::Pareto} and
-\class{Chart::StackedBars}, the arrays will contain two $x$--$y$ pairs
-(specifying the upper left and the lower right corner of the bar).
-Compare to: \\
-\methoduse{(\$x1,\$y1,\$x2,\$y2) = @\{\$imagemap\_data\deref [\$dataset][\$datapoint]\};}
-
-For the classes \class{Chart::Lines}, \class{Chart::Points},
-\class{Chart::LinesPoints} and \class{Chart::Split}, the arrays will
-contain a single $x$--$y$ pair (specifying the center of the point).
-Compare to:\\
-\methoduse{(\$x, \$y) = @\{\$imagemap\_data\deref [\$dataset][\$datapoint]\};}
-
-A few caveats apply here. First of all, \chart uses the GD module by
-Lincoln Stein to draw lines, circles, strings, and so on. GD treats the
-upper-left corner of the \textsc{png}/\textsc{jpeg} image as the
-reference point, therefore, positive $y$ values are measured from the
-top of the image, not from the bottom. Second, these values will mostly
-contain long decimal values. GD, of course, has to truncate these to
-integer pixel coordinates. In a worst-case scenario, this will result in
-an error of one pixel on your imagemap. If this is really an issue, your
-only option is to experiment with it, or to contact Lincoln Stein and
-ask him. Third, please remember that the $0^{th}$ dataset will be empty,
-since that is the place for the data point labels on the $x$ axis.
-\end{MethDecl}
-
-
-\Attributes\label{options}%
-These are the options which take effect on most \chart types.
-There are three different kinds of attributes:
-\begin{itemize}
-\item attributes expecting a number for value (\eg, the number of pixels),
-\item attributes expecting a textual value (\eg, the title of the chart),
-\item attributes expecting a Boolean value.
-\end{itemize}
-
-Before Version 2.5 of the module, the Boolean value \literal{true} was
-represented by the string \texttt{'true'}, and the Boolean value
-\literal{false} was represented by the string \texttt{'false'}. For all
-other values, the Boolean value was not well-defined.
-From version 2.5 onwards, the Boolean value \literal{true} may be
-represented by any of \texttt{1}, \texttt{'t'} and \texttt{'true'},
-where case does not matter.
-From version 2.5 onwards, the Boolean value \literal{false} may be
-represented by any of \texttt{0}, \texttt{'f'}, \texttt{'false'}, and
-\texttt{undef}, where case does not matter. For all other values, the
-Boolean value is again not well-defined. Note that this behaviour is
-closer to the standard Perl way but is not identical, due to the need
-for backward compatibility in this module.
-
-\begin{AttrDecl}{transparent}
-Makes the background of the image transparent if set to \literal{true}.
-Useful for making web page images. However, it does not seem to work
-for all browsers. Defaults to \literal{false}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{png\_border}
-Sets the number of pixels used as a border between the graph and the
-edges of the image. Defaults to 10.
-\end{AttrDecl}
-
-\begin{AttrDecl}{graph\_border}
-Sets the number of pixels used as a border between the title/labels and
-the actual graph within the image. Defaults to 10.
-\end{AttrDecl}
-
-\begin{AttrDecl}{text\_space}
-Sets the amount of space left on the sides of text, to make it more
-readable. Defaults to 3.
-\end{AttrDecl}
-
-\begin{AttrDecl}{title}
-Tells \chart what to use for the title of the graph. If empty, no title
-is drawn. \literal{\bs\bs} is treated as a newline. If you want to use
-normal quotation marks instead of single quotation marks, remember to
-quote (\literal{\bs\bs\bs\bs}) to get a linebreak. Default is empty.
-\end{AttrDecl}
-
-\begin{AttrDecl}{sub\_title}
-Writes a subtitle under the title in smaller letters.
-\end{AttrDecl}
-
-\begin{AttrDecl}{x\_label}
-Tells \chart what text to use as a label for the $x$ axis. If empty, no
-label is drawn. Default is undef.
-\end{AttrDecl}
-
-\attrdecl{y\_label}
-\begin{AttrDecl}{y\_label2}
-Tells \chart what kind of label should be used for the description of
-the $y$ axis on the left or the right side accordingly. If empty, no
-label is drawn. Default is undef.
-\end{AttrDecl}
-
-\begin{AttrDecl}{legend}
-Specifies the placement of the legend. Valid values are
-\literal{left}, \literal{right}, \literal{top},
-\literal{bottom}, and \literal{none}. Choosing \literal{none}
-tells \chart not to draw a legend. Default is \literal{right}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{legend\_labels}
-Sets the values for the labels for the different datasets. Should be
-assigned a reference to an array of labels. \Eg,\\
-\methoduse{@labels = ('foo', 'bar')};\\
-\methoduse{\$obj->set ('legend\_labels' \fatcomma \bs @labels);}\\
-Default is empty, in which case \literal{Dataset 1},
-\literal{Dataset 2}, etc. are used as labels.
-\end{AttrDecl}
-
-\begin{AttrDecl}{tick\_len}
-Sets the length of the $x$ and $y$ ticks in pixels. Default is 4.
-\end{AttrDecl}
-
-\begin{AttrDecl}{x\_ticks}
-Specifies how to draw the $x$ tick labels. Valid values are
-\literal{normal}, \literal{staggered} (labels are drawn alternatingly
-close to the axis and further away from it), and \literal{vertical}
-(label texts are rotated 90 degrees counter-clockwise). Default is
-\literal{normal}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{y\_ticks}
-The number of ticks to plot on the $y$ scale, including the end points.
-\Eg, for a $y$ axis ranging from 0 to 50, with ticks every 10 units,
-\attruse{y\_ticks} should have a value of 6.
-\end{AttrDecl}
-
-\begin{AttrDecl}{min\_y\_ticks}
-Sets the minimum number of $y$ ticks to draw when generating the $y$
-axis. Default is 6, minimum is 2.
-\end{AttrDecl}
-
-\begin{AttrDecl}{max\_y\_ticks}
-Sets the maximum number of $y$ ticks to draw when generating the $y$
-axis. Default is 100. This limit is used to avoid plotting an
-unreasonably large number of ticks if non-round values are used for
-\attruse{min\_val} and \attruse{max\_val}. The value for
-\attruse{max\_y\_ticks} should be at least 5 times as large as
-\attruse{min\_y\_ticks}.
-\end{AttrDecl}
-
-\attrdecl{min\_x\_ticks}
-\begin{AttrDecl}{max\_x\_ticks}
-These work similar to \attruse{max\_y\_ticks} and
-\attruse{min\_y\_ticks}, respectively. Of course, this applies only to
-$x$--$y$ plots.
-\end{AttrDecl}
-
-\begin{AttrDecl}{integer\_ticks\_only}
-Specifies how to draw the $x$ and $y$ ticks: as floating point
-(\literal{false}, \literal{0}) or as integer numbers
-(\literal{true}, \literal{1}). If you want integer ticks, it may
-be better to set the attribute \attruse{precision} to zero. Default:
-\literal{false}
-\end{AttrDecl}
-
-\begin{AttrDecl}{skip\_int\_ticks}
-If \attruse{integer\_ticks\_only} was set to \literal{true} the
-labels and ticks for the $y$ axis will be drawn every $n^{th}$ tick.
-(Note that in \class{Chart::HorizontalBars} the $y$ axis runs
-horizontally.) Defaults to 1, \ie, no skipping.
-\end{AttrDecl}
-
-\begin{AttrDecl}{precision}
-Sets the number of digits after the decimal point. Affects in most cases
-the $y$ axis only. In $x$--$y$ plots also affects the $x$ axis, and in
-pie charts the labels. Defaults to 3.
-\end{AttrDecl}
-
-\begin{AttrDecl}{max\_val}
-Sets the maximum $y$ value on the graph, overriding normal autoscaling.
-Does not work for \class{Chart::Split} charts. Default is undef.
-\end{AttrDecl}
-
-\begin{AttrDecl}{min\_val}
-Sets the minimum $y$ value on the graph, overriding normal autoscaling.
-Does not work for Split charts. Default is undef. Caution should be
-used when setting \attruse{max\_val} and \attruse{min\_val} to
-floating point or non-round numbers: The range must start and end on a
-tick, ticks must have round-number intervals and must include round
-numbers.\\
-Example: Suppose your dataset has a range of 35\ldots 114
-units. If you specify these values as \attruse{min\_val} and
-\attruse{max\_val}, respectively, the $y$ axis will be plotted with 80
-ticks, so one at every unit. Without specification of
-\attruse{min\_val} and \attruse{max\_val}, the system would
-autoscale the range to 30\ldots 120 with 10 ticks every 10 units. If
-\attruse{min\_val} and \attruse{max\_val} are specified to excessive
-precision, they may be overridden by the system, plotting a maximum
-\attruse{max\_y\_ticks} ticks.
-\end{AttrDecl}
-
-\begin{AttrDecl}{include\_zero}
-If \literal{true}, forces the $y$ axis to include zero even if it is
-not in the dataset range. Default is \literal{false}. -- Note:
-It is better to use this option than to set \attruse{min\_val}
-if this is all you want to achieve.
-\end{AttrDecl}
-
-\begin{AttrDecl}{skip\_x\_ticks}
-Sets the number of $x$ ticks and $x$ tick labels to skip. (\Ie, if
-\attruse{skip\_x\_ticks} were set to 4, \chart would draw every
-$4^{th}$ $x$ tick and $x$ tick label). Default is undef.
-\end{AttrDecl}
-
-\begin{AttrDecl}{custom\_x\_ticks}
-This option allows you to specify exactly which $x$ ticks and $x$ tick
-labels should be drawn. It should be assigned a reference to an array of
-desired ticks. Just remember that we are counting from the $0^{th}$
-element of the array. (\Eg, if \attruse{custom\_x\_ticks} is assigned
-[0,3,4], then the $0^{th}$, $3^{rd}$, and $4^{th}$ $x$ ticks will be
-displayed) This does not apply to \class{Chart::Split},
-\class{Chart::HorizontalBars} and \class{Chart::Pie}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{f\_x\_tick}
-Needs a reference to a function which accepts the $x$ tick labels
-generated by \parameter{\$data\deref [0]} as its argument. This function
-should return a reformatted version of the label as a string. \Eg\\
-\methoduse{\$obj\deref set ('f\_x\_tick' \fatcomma \bs\&formatter;})\\
-An example for the formatter function: Assume that $x$ labels are
-seconds since some event. The referenced function could be designed to
-transform this number of seconds to hours, minutes and seconds.
-\end{AttrDecl}
-
-\begin{AttrDecl}{f\_y\_tick}
-Similar to \attruse{f\_x\_tick}, but for $y$ labels.
-\end{AttrDecl}
-
-\begin{AttrDecl}{colors}
-\label{colors}
-This option lets you control the colors the chart will use. It takes a
-reference to a hash. The hash should contain keys mapped to references
-to arrays of \textsc{rgb} values. E.g.,\\
-\methoduse{\$obj->set('colors' \fatcomma \{'background' \fatcomma [255,255,255]\});}\\
-sets the background color to white (which is the default).\\
-Another possibility is to use named colors like 'red', 'blue'. The possible
-list of named colors can be found in chapter \ref{app:colors}, page \pageref{app:colors}.\\
-Valid keys for this hash are
-\begin{itemize}
-\item \literal{background} (background color for the chart)
-\item \literal{title} (color of the title)
-\item \literal{text} (all the text in the chart)
-\item \literal{x\_label} (color of the $x$ axis label)
-\item \literal{y\_label} (color of the primary $y$ axis label)
-\item \literal{y\_label2} (color of the secondary $y$ axis label)
-\item \literal{grid\_lines} (color of the grid lines)
-\item \literal{x\_grid\_lines} (color of the $x$ grid lines -- on $x$ axis ticks)
-\item \literal{y\_grid\_lines} (color of the $y$ grid lines -- on primary $y$ axis ticks)
-\item \literal{y2\_grid\_lines} (color of the y2 grid lines -- on secondary $y$ axis ticks)
-\item \literal{dataset0} \ldots \literal{dataset63} (the different datasets)
-\item \literal{misc} (everything else, \eg, ticks, box around the legend)
-\end{itemize}
-
-NB. For composite charts, there is a limit of eight datasets per
-component. The colors for \literal{dataset8} through \literal{dataset15}
-will be the same as those for \literal{dataset0} through
-\literal{dataset7} for the second component chart.
-\end{AttrDecl}
-
-\begin{AttrDecl}{title\_font}
-This option changes the font of the title line. The value must be a GD
-font, \eg, \methoduse{GD::Font\deref Large}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{label\_font}
-This option changes the font of the labels. The value must be a GD font.
-\end{AttrDecl}
-
-\begin{AttrDecl}{legend\_font}
-This option changes the font for the legend text. The value must be a
-GD font.
-\end{AttrDecl}
-
-\begin{AttrDecl}{tick\_label\_font}
-This option changes the font of the ticks. The value must be a GD font.
-\end{AttrDecl}
-
-\begin{AttrDecl}{grey\_background}
-Puts a nice soft grey background on the actual data plot when set to
-\literal{true}. This is a flag. If you set this flag to 'false' then you may
-redefine the background color to a color you like. For further information see chapter \ref{colors}
-on page \pageref{colors}. Default is \literal{true}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{x\_grid\_lines}
-Draws grid lines matching up to $x$ ticks if set to \literal{true}.
-Default is \literal{false}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{y\_grid\_lines}
-Draws grid lines matching up to $y$ ticks if set to \literal{true}.
-Default is \literal{false}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{grid\_lines}
-Draws grid lines matching up to $x$ and $y$ ticks if set to
-\literal{true}. Default is \literal{false}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{imagemap}
-Lets \chart know that you are going to ask for information about the
-placement of the data for use in creating an image map from the chart.
-This information can be retrieved using the
-\mbox{\methoduse{imagemap\_dump()}}
-method. NB. The \methoduse{imagemap\_dump()} method cannot be called
-until after the chart has been generated (\eg, using the \methoduse{png()}
-or \methoduse{cgi\_png()} methods).
-\end{AttrDecl}
-
-\begin{AttrDecl}{ylabel2}
-The label for the secondary (right-hand side) $y$ axis. (In a composite
-chart, this is the axis for the second component). Default is undef.
-\end{AttrDecl}
-
-\begin{AttrDecl}{no\_cache}
-Adds \literal{Pragma: no-cache} to the \textsc{http} header.
-Be careful with this one, since some older browsers (like Netscape~4.5)
-are unhappy about \textsc{post} using this method.
-\end{AttrDecl}
-
-\begin{AttrDecl}{legend\_example\_size}
-Sets the length of the example line in the legend. Defaults to 20.
-\end{AttrDecl}
-
diff --git a/doc/LaTeX/Composite.tex b/doc/LaTeX/Composite.tex
deleted file mode 100644
index f79fb38..0000000
--- a/doc/LaTeX/Composite.tex
+++ /dev/null
@@ -1,136 +0,0 @@
-% composite.tex
-%
-\renewcommand{\thisname}{Chart::Composite}
-\section{\thisname}
-\name{\thisname}
-\file{Composite.pm}
-\requires{Chart::Base, GD, Carp, FileHandle}
-\begin{Description}
-The class \thisclass creates a two component chart with two types of
-charts which are layered one above each other. Just set the option
-\attruse{composite\_info}. For example, you can create a two component
-chart with bars and lines. A composite chart does not make sense with
-all combinations of chart types, but it works pretty good with Lines,
-Points, LinesPoints and Bars. Note that two similar chart types may come
-into visual conflict. \thisclass can do only composite charts made up of
-two components. \thisclass is a subclass of \class{Chart::Base}.
-\end{Description}
-
-\example
-\begin{figure}[ht]
- \begin{center}
- \includegraphics[scale=0.6]{composite.png}
- \end{center}
- \caption{Composite chart}
- \label{fig:composite}
-\end{figure}
-\begin{verbatim}
-use Chart::Composite;
-
-$g = Chart::Composite->new();
-
-$g->add_dataset(1, 2, 3, 4, 5, 6);
-$g->add_dataset(0.1, 0.2, 0.3, 0.2, 0.4, 0.1);
-$g->add_dataset(0.3, 0.5, 0.2, 0.6, 0.7, 0.4);
-$g->add_dataset(10, 11, 6, 7, 7, 8);
-
-$g->set('composite_info' => [ ['Bars', [1, 2]],
- ['LinesPoints', [3] ]
- ],
- 'title' => 'Composite Chart',
- 'legend' => 'top',
- 'legend_example_height' => 'true',
- 'legend_example_height0..1' => 10,
- 'legend_example_height2' => 3,
- );
-$g->set('include_zero' => 'true');
-
-$g->png("composite.png");
-\end{verbatim}
-
-\constructorblurb{\thisname}
-
-\attrdecl{brush\_size1}
-\begin{AttrDecl}{brush\_size2}
-If using component charts having \attruse{brush\_size} as one of their
-attributes, you can define the sizes of the brushes individually.
-Default is 6 (pixel).
-\end{AttrDecl}
-
-\begin{AttrDecl}{composite\_info}
-This option is only used for composite charts. It contains the
-information which types to use for the two component charts, and which
-datasets belong to which component chart. It should be a reference to an
-array of array references, containing information like the following:\\
-\$obj\deref set ('composite\_info' \fatcomma [ ['Bars', [1,2]], ['Lines', [3,4] ] ]);
-
-This example would set the two component charts to be a bar chart and a
-line chart. It would use the first two data sets for the bar chart and
-the second two data sets for the line chart. The default is undef. Note
-that the numbering starts at 1, not at 0 like most of the other numbered
-things in \class{Chart}, because index 0 refers to the $x$ values which
-are shared by the two component charts. The ordering of the components
-may be important, since the first component is drawn first and then
-(partially) overdrawn with the second component. \Eg, when composing a
-line graph and a bar graph, it is safer to have the bars in the first
-component since otherwise the line(s) might be hidden behind them.
-\end{AttrDecl}
-
-\attrdecl{f\_y\_tick1}
-\begin{AttrDecl}{f\_y\_tick2}
-Needs a reference to a function which uses the $y$ tick labels for the
-primary and for the secondary $y$ axis, respectively. These functions
-should return a reformatted version of the label as a string. \Eg
-\begin{SmallExample}
-\$obj\deref set ('f\_y\_tick1' \fatcomma \bs\&formatter1);\\
-\$obj\deref set ('f\_y\_tick2' \fatcomma \bs\&formatter2);
-\end{SmallExample}
-\end{AttrDecl}
-
-\attrdecl{max\_val1}
-\begin{AttrDecl}{max\_val2}
-Only for composite charts. These options specify the maximum $y$ value
-for the first and the second component, respectively. Both default to
-undef.
-\end{AttrDecl}
-
-\attrdecl{min\_val1}
-\begin{AttrDecl}{min\_val2}
-Only for composite charts. These options specify the minimum $y$ value
-for the first and the second component, respectively. Both default to
-undef.
-\end{AttrDecl}
-
-\begin{AttrDecl}{legend\_example\_height}
-Only for composite charts. This option changes the thickness of the
-lines in the legend. If `legend\_example\_height' is set to `true' the
-thickness of each legend line can be changed individually. Default is
-false. \Eg
-\begin{SmallExample}
-\$obj\deref set ('legend\_example\_height' \fatcomma 'true');\\
-\$obj\deref set ('legend\_example\_height0' \fatcomma '3');\\
-\$obj\deref set ('legend\_example\_height1..4' \fatcomma '10');
-\end{SmallExample}
-
-This example would set the thickness of the first line in the legend to
-3, and the thicknesses of the following 4 lines to 10 (using the same
-indexing scheme as in `composite\_info'). The default value for each
-individual entry is 1, \ie a `normal' line is drawn. It is not possible
-to change a 'legend\_example\_height\#'(where \# denotes a dataset
-number) which was once defined. (The first setting will remain
-unchanged.)
-\end{AttrDecl}
-
-\begin{AttrDecl}{same\_y\_axes}
-Forces both component charts in a composite chart to use the same
-maximum and minimum $y$ values if set to `true'. This helps to keep
-some composite charts from being too confusing. Default is undef.
-\end{AttrDecl}
-
-\attrdecl{y\_ticks1}
-\begin{AttrDecl}{y\_ticks2}
-The number of $y$ ticks to use on the primary and on the secondary $y$
-axis on a composite chart, respectively. Please note that if you just
-set the `y\_ticks' option, both axes will use that number of $y$ ticks.
-Both default to undef.
-\end{AttrDecl}
diff --git a/doc/LaTeX/Direction.tex b/doc/LaTeX/Direction.tex
deleted file mode 100644
index a948e25..0000000
--- a/doc/LaTeX/Direction.tex
+++ /dev/null
@@ -1,125 +0,0 @@
-%
-% direction.tex
-%
-\renewcommand{\thisname}{Chart::Direction}
-\section{\thisname}
-\name{\thisname}
-\file{Direction.pm}
-\requires{Chart::Base, GD, Carp, FileHandle}
-\begin{Description}
-The class \thisclass creates a diagram based on polar
-coordinates. This type of diagram is occasionally referred to as a
-\emph{radial} or as a \emph{radar} chart. \thisclass plots data
-specified by angle (\eg, wind direction) and absolute value (\eg, wind
-strength). The first dataset to add is always the set of angles in
-degrees. The second set contains the absolute values. How additional
-datasets should be entered depends on the option \attruse{pairs} (cf.
-below). By default, \thisclass will draw a point chart. You can also
-get a lines chart by setting the option \attruse{point} to
-\literal{false} and the option \attruse{line} to \literal{true}. If you
-want a lines and point chart, then set both \attruse{point} and
-\attruse{line} to \literal{true}. In addition, \thisclass plots arrows
-from the center to the point or to the end of the line if the option
-\attruse{arrow} is set to \literal{true}. \thisclass is a subclass of
-\class{Chart::Base}.
-\end{Description}
-
-\example
-\begin{figure}[ht]
- \begin{center}
- \includegraphics[width = 8cm, height =8cm]{direction.png}
- \end{center}
- \caption{Direction chart}
- \label{fig:direction}
-\end{figure}
-\begin{verbatim}
-use Chart::Direction;
-$g = Chart::Direction->new(500,500);
-
-$g->add_dataset( 0, 100, 50, 200, 280, 310);
-$g->add_dataset(30, 40, 20, 35, 45, 20);
-
-$g->add_dataset(10, 110, 60, 210, 290, 320);
-$g->add_dataset(20, 30, 40, 20, 35, 45);
-
-$g->add_dataset(20, 120, 70, 220, 300, 330);
-$g->add_dataset(45, 20, 30, 40, 20, 35,);
-
-%hash = ( 'title' => 'Direction Demo',
- 'angle_interval' => 45,
- 'precision' => 0,
- 'arrow' => 'true',
- 'point' => 'false',
- 'include_zero' => 'true',
- 'pairs' => 'true',
- 'legend' => 'none',
- 'grey_background' => 'false'
- );
-
-$g->set(%hash);
-
-$g->png("direction.png");
-\end{verbatim}
-
-\constructorblurb{\thisname}
-
-\begin{AttrDecl}{angle\_interval}
-This option tells \thisclass how many angle lines should be drawn. It is
-the difference between two angle lines. The default value is 30, which
-means that one line will be drawn every 30 degrees. Not all values are
-permissible; the valid ones are: 0, 5, 10, 15, 20, 30, 45, and 90. If
-you choose 0, \thisclass will draw no lines.
-\end{AttrDecl}
-
-\begin{AttrDecl}{arrow}
-Draws an arrow from the center of the chart to the point if set to
-\literal{true}. By default \literal{false}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{brush\_size}
-Sets the width of the lines in pixels. Default is 6.
-\end{AttrDecl}
-
-\begin{AttrDecl}{line}
-Connects the points with lines if set to \literal{true}. Defaults to
-\literal{false}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{max\_circles}
-Sets the maximum number of circles to draw when generating the set of
-circles. Default is 100. This limit is used to avoid plotting an
-unreasonably large number of circles if non-round values are used for
-\attruse{min\_val} and \attruse{max\_val}. The value for
-\attruse{max\_circles} should be at least 5 times that of
-\attruse{min\_circles}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{min\_circles}
-Sets the minimum number of circles to draw when generating a scale.
-Default is 4, minimum is 2.
-\end{AttrDecl}
-
-\begin{AttrDecl}{pairs}
-This option tells \thisclass how to handle additional datasets. If
-\attruse{pairs} is set to \literal{true}, \thisclass uses the first
-dataset as a set of degrees and the second dataset as a set of values.
-Then, the third set is a set of degrees and the fourth a set of values,
-and so forth. If \attruse{pairs} is set to \literal{false}, \thisclass
-uses the first dataset as a set of angles and all following datasets as
-sets of values. Defaults to \literal{false}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{point}
-Indicates to draw points for representing the data values. Possible
-values: \literal{true} and \literal{false}, by default \literal{true}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{pt\_size}
-Sets the radius of the points in pixels. Default is 18.
-\end{AttrDecl}
-
-\begin{AttrDecl}{sort}
-Sorts the data in ascending order if set to \literal{true}. Should be
-set if the input data is not sorted and \attruse{line} is set to
-\literal{true}. Defaults to \literal{false}.
-\end{AttrDecl}
diff --git a/doc/LaTeX/Documentation.pdf b/doc/LaTeX/Documentation.pdf
deleted file mode 100644
index 92fe678..0000000
--- a/doc/LaTeX/Documentation.pdf
+++ /dev/null
Binary files differ
diff --git a/doc/LaTeX/Documentation.tex b/doc/LaTeX/Documentation.tex
deleted file mode 100644
index fc1f1a5..0000000
--- a/doc/LaTeX/Documentation.tex
+++ /dev/null
@@ -1,81 +0,0 @@
-% Documentation.tex
-%
-\documentclass[11pt,titlepage]{article}
-\usepackage[latin1]{inputenc}
-\usepackage{ifthen}
-\usepackage[pdftex]{graphicx}
-\usepackage{makeidx}
-\usepackage{rotating}
-\usepackage{xspace}
-\usepackage{color}
-%\usepackage{colortbl}
-\makeindex
-
-\include{definitions}
-\include{rgb}
-%\includeonly{definitions,Base}
-%\includeonly{definitions,Bars}
-%\includeonly{definitions,Composite}
-%\includeonly{definitions,Direction}
-%\includeonly{definitions,ErrorBars}
-%\includeonly{definitions,HorizontalBars}
-%\includeonly{definitions,Lines}
-%\includeonly{definitions,LinesPoints}
-%\includeonly{definitions,Mountain}
-%\includeonly{definitions,Pareto}
-%\includeonly{definitions,Pie}
-%\includeonly{definitions,Points}
-%\includeonly{definitions,Split}
-%\includeonly{definitions,Stacked}
-
-% Hyphenations
-\hyphenation{init dataref}
-\sloppy
-
-\title{Documentation for Perl Package \textbf{Chart}\\
- {\Large Version 2.400.1}
-}
-
-%% Name der Autoren
-%% Die Adressenangaben werden mit \thanks{} eingeschlossen
-%% Name des ersten Autors
-\author{Chart Group\thanks{Bundesamt f\"ur Kartographie und Geod\"asie,
-Geod\"atisches Observatorium Wettzell, Sackenrieder Strasse 25,
-D-93444 Bad K\"otzting, E-mail: chart@fs.wettzell.de}}
-\date{Last change: 2014-06-17}
-
-\begin{document}
-
-\maketitle
-
-\pagenumbering{roman}
-\tableofcontents
-\newpage
-\listoffigures
-
-% Einleitung
-\newpage
-\pagenumbering{arabic}
-
-\include{description}
-%\include{example}
-\include{Base}
-\include{Bars}
-\include{Composite}
-\include{Direction}
-\include{ErrorBars}
-\include{HorizontalBars}
-\include{Lines}
-\include{LinesPoints}
-\include{Mountain}
-\include{Pareto}
-\include{Pie}
-\include{Points}
-\include{Split}
-\include{Stacked}
-%\include{Colors}
-\include{Appendix}
-\clearpage
-\printindex
-
-\end{document}
diff --git a/doc/LaTeX/Elemente.png b/doc/LaTeX/Elemente.png
deleted file mode 100644
index 561b113..0000000
--- a/doc/LaTeX/Elemente.png
+++ /dev/null
Binary files differ
diff --git a/doc/LaTeX/ErrorBars.tex b/doc/LaTeX/ErrorBars.tex
deleted file mode 100644
index ece263b..0000000
--- a/doc/LaTeX/ErrorBars.tex
+++ /dev/null
@@ -1,119 +0,0 @@
-%
-% error.tex
-%
-\renewcommand{\thisname}{Chart::ErrorBars}
-\section{\thisname}
-\name{\thisname}
-\file{ErrorBars.pm}
-\requires{Chart::Base, GD, Carp, FileHandle}
-
-\begin{Description}
-The class \thisclass creates a point chart with error bars. This
-class expects the error values within the data array. By use of the
-\methoduse{add\_dataset()} method the error values are the next two sets
-after the $y$ values. The first set after the $y$ values has to be the
-set of values for the upper error bounds. The next set is the array of
-the lower error bounds. Note that the error values are not specified
-absolutely but rather as offsets from the $y$ value: the upper error
-values will be added to the $y$ values, the lower error values will be
-subtracted.
-
-If you want to use the same value for the upper and lower error, you
-can set the \attruse{same\_error} option to \literal{true}. In this
-case only the set after the $y$ values is interpreted as a set of
-errors.
-
-Of course, it is also possible to use the \methoduse{add\_pt()}
-method in the appropriate way to achieve the same results.
-\thisclass is a subclass of \class{Chart::Base}.
-\end{Description}
-
-\example
-\begin{figure}[ht]
- \begin{center}
- \includegraphics[scale=0.7]{error.png}
- \end{center}
- \caption{Error bars chart}
- \label{fig:error}
-\end{figure}
-
-\begin{verbatim}
-use Chart::ErrorBars;
-$g = Chart::ErrorBars->new();
-
-# the x values
-$g->add_dataset(qw(1 1.1 1.2 1.3 1.4 1.5 1.6 1.7
- 1.8 1.9 2 2.1 2.2 2.3 2.4 2.5));
-# the y values
-$g->add_dataset(qw(1 1.1 1.2 1.1 1.14 1.15 1.26 1.2
- 1.1 1.19 1.2 1.4 1.6 2.0 2.5 3.1));
-# the upper errors
-$g->add_dataset(qw(0.4 0.1 0.2 0.1 0.14 0.15 0.26 0.27
- 0.1 0.19 0.2 0.1 0.1 0.2 0.1 0.3));
-# the lower errors
-$g->add_dataset(qw(0.2 0.11 0.12 0.11 0.2 0.3 0.12 0.27
- 0.11 0.3 0.2 0.2 0.2 0.1 0.1 0.2));
-
-$g->set( 'xy_plot' => 'true',
- 'precision' => 1,
- 'pt_size' => 10,
- 'brush_size' => 2,
- 'legend' => 'none',
- 'title' => 'Error Bars Demo',
- 'grid_lines' => 'true'
- );
-
-$g->png("errorbars.png");
-\end{verbatim}
-
-\constructorblurb{\thisname}
-
-\begin{AttrDecl}{brush\_size}
-Sets the width of the lines in pixels. Default is 6.
-\end{AttrDecl}
-
-\begin{AttrDecl}{pt\_size}
-Sets the radius of the points in pixels. Default is 18.
-\end{AttrDecl}
-
-\begin{AttrDecl}{same\_error}
-Tells \thisclass that you want to use the same values for
-upper and lower error bounds if set to \literal{true}. Then you have to
-add just one set of error values. Defaults to \literal{false}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{sort}
-Sorts the data in ascending order if set to \literal{true}. Should be
-set if the input data is not sorted. Defaults to \literal{false}.
-\end{AttrDecl}
-
-\attrdecl{xlabels}
-\begin{AttrDecl}{xrange}
-This pair of options allows arbitrary positioning of $x$ axis labels.
-The two options must either both be specified or both be omitted.
-\attruse{xlabels} is a reference to 2-element array. The first of the
-elements is a nested (reference to an) array of strings that are the
-labels. The second element is a nested (reference to an) array of
-numbers that are the $x$ values at which the labels should be placed.
-\attruse{xrange} is a 2-element array specifying the minimum and maximum
-$x$ values on the axis. \Eg,
-\begin{verbatim}
-@labels = (['Jan', 'Feb', 'Mar'],
- [10, 40, 70 ]);
-$chart->set(xlabels => \bs @labels,
- xrange => [0, 100]
- );
-\end{verbatim}
-\end{AttrDecl}
-
-\begin{AttrDecl}{xy\_plot}
-Forces \thisclass to plot a $x$--$y$ graph if set to \literal{true},
-\ie, to treat the $x$ axis as numeric. Very useful for plots of
-mathematical functions. Defaults to \literal{false}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{y\_axes}
-Tells \thisclass where to place the $y$ axis. Valid values are
-\literal{left}, \literal{right} and \literal{both}. Defaults to
-\literal{left}.
-\end{AttrDecl}
diff --git a/doc/LaTeX/HorizontalBars.tex b/doc/LaTeX/HorizontalBars.tex
deleted file mode 100644
index 0bed29e..0000000
--- a/doc/LaTeX/HorizontalBars.tex
+++ /dev/null
@@ -1,58 +0,0 @@
-%
-% hbars.tex
-%
-\renewcommand{\thisname}{Chart::HorizontalBars}
-\section{\thisname}
-\name{\thisname}
-\file{HorizontalBars.pm}
-\requires{Chart::Base, GD, Carp, FileHandle}
-\begin{Description}
-The class \thisclass creates a chart of horizontally oriented bars.
-\thisclass is a subclass of \class{Chart::Base}.
-\end{Description}
-
-\example
-\begin{figure}[ht]
- \begin{center}
- \includegraphics[scale=0.7]{d_hbars4.png}
- \end{center}
- \caption{Chart with horizontal bars}
- \label{fig:hbars}
-\end{figure}
-\begin{verbatim}
-use Chart::HorizontalBars;
-
-$g = Chart::HorizontalBars->new();
-$g->add_dataset('Foo', 'bar', 'junk', 'ding', 'bat');
-$g->add_dataset(4, 3, 4, 2, 8);
-$g->add_dataset(2, 10, 3, 8, 3);
-
-%hash = ( 'title' => 'Horizontal Bars Demo',
- 'grid_lines' => 'true',
- 'x_label' => 'x axis',
- 'y_label' => 'y axis',
- 'include_zero' => 'true',
- 'x_ticks' => 'vertical',
- );
-$g->set(%hash);
-
-$g->png("hbars.png");
-\end{verbatim}
-
-\constructorblurb{\thisname}
-
-\begin{AttrDecl}{skip\_y\_ticks}
-Does the same fo the $y$ axis in a horizontal chart as
-\attruse{skip\_x\_ticks} does for other charts. Defaults to 1.
-\end{AttrDecl}
-
-\begin{AttrDecl}{spaced\_bars}
-Leaves some space between each group of bars when set to \literal{true}. This
-usually make it easier to read a bar chart. Default is \literal{true}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{y\_axes}
-Tells \thisclass where to place the $y$ axis.
-\literal{left}, \literal{right} and \literal{both}. Defaults to
-\literal{left}.
-\end{AttrDecl}
diff --git a/doc/LaTeX/Lines.tex b/doc/LaTeX/Lines.tex
deleted file mode 100644
index 15cb268..0000000
--- a/doc/LaTeX/Lines.tex
+++ /dev/null
@@ -1,102 +0,0 @@
-%
-% lines.tex
-%
-\renewcommand{\thisname}{Chart::Lines}
-\section{\thisname}
-\name{\thisname}
-\requires{Chart::Base, GD, Carp, FileHandle}
-\begin{Description}
-The class \thisclass creates a lines chart. (If you want the data
-points marked with symbols, check \class{Chart::LinesPoints} on
-page \pageref{Chart::LinesPoints}.) \thisclass is a subclass of
-\class{Chart::Base}.
-\end{Description}
-
-\example
-\begin{figure}[ht]
- \begin{center}
- \includegraphics[scale=0.5]{d_lines2.png}
- \end{center}
- \caption{Lines chart}
- \label{fig:lines}
-\end{figure}
-\begin{verbatim}
-use Chart::Lines;
-
-$g = Chart::Lines->new();
-$g->add_dataset('foo', 'bar', 'junk', 'ding', 'bat');
-$g->add_dataset( -4, 3, -4, -5, -2);
-$g->add_dataset( 2, 10, -3, 8, 3);
-$g->add_dataset(-10, 2, 4, -3, -3);
-$g->add_dataset( 7, -5, -3, 4, 7);
-
-%hash = ('legend_labels' => ['1st Quarter', '2nd Quarter',
- '3rd Quarter', '4th Quarter'],
- 'y_axes' => 'both',
- 'title' => 'Lines Demo',
- 'grid_lines' => 'true',
- 'legend' => 'left',
- 'legend_example_size' => 20,
- 'colors' => {'text' => 'blue',
- 'misc' => 'blue',
- 'background' => 'grey',
- 'grid_lines' => 'light_blue',
- 'dataset0' => [220,0,0],
- 'dataset1' => [200,0,100],
- 'dataset2' => [150,50,175],
- 'dataset3' => [170,0,255]
- }
- );
-
-$g->set(%hash);
-
-$g->png("lines.png");
-\end{verbatim}
-
-\constructorblurb{\thisname}
-
-\begin{AttrDecl}{brush\_size}
-Sets the width of the lines in pixels. Default is 6.
-\end{AttrDecl}
-
-\begin{AttrDecl}{sort}
-Sorts the data in ascending order if set to \literal{true}. Should be
-set if the input data is not sorted. Defaults to \literal{false}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{stepline}
-The points are connected by a stepping function,instead of by a direct
-line if set to \literal{true}. Defaults to \literal{false}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{stepline\_mode}
-Determines whether to plot each stepping line at the level of the
-start of the interval (if set to \literal{begin}) or at its end if set
-to \literal{end}. Defaults to \literal{begin}.
-\end{AttrDecl}
-
-\attrdecl{xlabels}
-\begin{AttrDecl}{xrange}
-This pair of options allows arbitrary positioning of $x$ axis labels.
-The two options must either both be specified or both be omitted.
-\attruse{xlabels} is a reference to 2-element array. The first of the
-elements is a nested (reference to an) array of strings that are the
-labels. The second element is a nested (reference to an) array of
-numbers that are the $x$ values at which the labels should be placed.
-\attruse{xrange} is a 2-element array specifying the minimum and maximum
-$x$ values on the axis. \Eg,
-\begin{verbatim}
-@labels = (['Jan', 'Feb', 'Mar'],
- [10, 40, 70 ]);
-$chart->set(xlabels => \bs @labels,
- xrange => [0, 100]
- );
-\end{verbatim}
-\end{AttrDecl}
-
-\begin{AttrDecl}{xy\_plot}
-Forces \thisclass to plot a $x$--$y$ graph if set to \literal{true},
-\ie, to treat the $x$ axis as numeric. Very useful for plots of
-mathematical functions. Defaults to \literal{false}.
-\end{AttrDecl}
-
diff --git a/doc/LaTeX/LinesPoints.tex b/doc/LaTeX/LinesPoints.tex
deleted file mode 100644
index be17a1f..0000000
--- a/doc/LaTeX/LinesPoints.tex
+++ /dev/null
@@ -1,153 +0,0 @@
-%
-% linespoints.tex
-%
-\renewcommand{\thisname}{Chart::LinesPoints}
-\section{\thisname}
-\name{\thisname}
-\file{LinesPoints.pm}
-\requires{Chart::Base, GD, Carp, FileHandle}
-\begin{Description}
-The class \thisclass creates a lines chart where additionally the
-individual data points are marked with a symbol. (If you want just
-lines without additional symbols, check \class{Chart::Lines} on page
-\pageref{Chart::Lines}. If you want just symbols for the data points but
-no lines, check \class{Chart::Points} on page \pageref{Chart::Points}.)
-\thisclass is a subclass of \class{Chart::Base}.
-\end{Description}
-
-\example
-\begin{figure}[ht]
- \begin{center}
- \includegraphics[scale=0.6]{d_linesp2.png}
- \end{center}
- \caption{Linespoints chart}
- \label{fig:d_linesp2}
-\end{figure}
-\begin{verbatim}
-use Chart::LinesPoints;
-use strict;
-
-my (@data1, @data2, @data4, @data3, @labels, %hash, $g);
-
-@labels = qw(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17);
-@data1 = qw (-7 -5 -6 -8 -9 -7 -5 -4 -3 -2 -4 -6 -3 -5 -3 -4 -6);
-@data2 = qw (-1 -1 -1 -1 -2 -2 -3 -3 -4 -4 -6 -3 -2 -2 -2 -1 -1);
-@data3 = qw (-4 -4 -3 -2 -1 -1 -1 -2 -1 -1 -3 -2 -4 -3 -4 -2 -2);
-@data4 = qw (-6 -3 -2 -3 -3 -3 -2 -1 -2 -3 -1 -1 -1 -1 -1 -3 -3);
-
-$g = Chart::LinesPoints->new(600,300);
-$g->add_dataset(@labels);
-$g->add_dataset(@data1);
-$g->add_dataset(@data2);
-$g->add_dataset(@data3);
-$g->add_dataset(@data4);
-
-%hash = ('integer_ticks_only' => 'true',
- 'title' => 'Soccer Season 2002\n ',
- 'legend_labels' => ['NY Soccer Club', 'Denver Tigers',
- 'Houston Spacecats',
- 'Washington Presidents'],
- 'y_label' => 'position in the table',
- 'x_label' => 'day of play',
- 'grid_lines' => 'true',
- 'f_y_tick' => \&formatter,
- );
-
-$g->set( %hash);
-
-$g->png("d_linesp2.png");
-
-# Just a trick to have the y scale start at the biggest point:
-# Initialise with negative values, remove the minus sign!
-sub formatter {
- my $label = shift;
- $label = substr($label, 1);
- return $label;
-}
-
-\end{verbatim}
-
-\constructorblurb{\thisname}
-
-\begin{AttrDecl}{brush\_size}
-Sets the width of the lines in pixels. Default is 6.
-\end{AttrDecl}
-
-\begin{AttrDecl}{brushStyle}
-Define the share of the points. The share may be specified to each dataset.\\
-The possible shapes of the 'points' are
-\begin{itemize}
-\item FilledCircle (default),
-\item circle,
-\item donut,
-\item OpenCircle,
-\item triangle,
-\item upsidedownTriangle,
-\item square,
-\item hollowSquare,
-\item OpenRectangle,
-\item fatPlus,
-\item Star,
-\item OpenStar,
-\item FilledDiamond,
-\item OpenDiamond
-\end{itemize}
-To apply a different brush style to different data sets the following
-example of code can be used:
-\begin{verbatim}
-$g->set(brushStyles => { dataset0 => 'fatPlus', dataset1 => 'hollowSquare' });
-\end{verbatim}
-\end{AttrDecl}
-
-
-\begin{AttrDecl}{pt\_size}
-Sets the radius of the points in pixels. Default is 18.
-\end{AttrDecl}
-
-\begin{AttrDecl}{sort}
-Sorts the data in ascending order if set to \literal{true}. Should be
-set if the input data is not sorted. Defaults to \literal{false}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{stepline}
-The points are connected by a stepping function,instead of by a direct
-line if set to \literal{true}. Defaults to \literal{false}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{stepline\_mode}
-Determines whether to plot each stepping line at the level of the
-start of the interval (if set to \literal{begin}) or at its end if set
-to \literal{end}. Defaults to \literal{begin}.
-\end{AttrDecl}
-
-\attrdecl{xlabels}
-\begin{AttrDecl}{xrange}
-This pair of options allows arbitrary positioning of $x$ axis labels.
-The two options must either both be specified or both be omitted.
-\attruse{xlabels} is a reference to 2-element array. The first of the
-elements is a nested (reference to an) array of strings that are the
-labels. The second element is a nested (reference to an) array of
-numbers that are the $x$ values at which the labels should be placed.
-\attruse{xrange} is a 2-element array specifying the minimum and maximum
-$x$ values on the axis. \Eg,
-\begin{verbatim}
-@labels = (['Jan', 'Feb', 'Mar'],
- [10, 40, 70 ]);
-$chart->set(xlabels => \bs @labels,
- xrange => [0, 100]
- );
-\end{verbatim}
-\end{AttrDecl}
-
-\begin{AttrDecl}{xy\_plot}
-Forces \thisclass to plot a $x$--$y$ graph if set to \literal{true}, \ie, to
-treat the $x$ axis as numeric. Very useful for plots of mathematical
-functions. Defaults to \literal{false}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{y\_axes}
-Tells \thisclass where to place the $y$ axis. Valid
-values are \literal{left}, \literal{right} and \literal{both}. Defaults
-to \literal{left}.
-\end{AttrDecl}
-
diff --git a/doc/LaTeX/Mountain.tex b/doc/LaTeX/Mountain.tex
deleted file mode 100644
index 7556a5b..0000000
--- a/doc/LaTeX/Mountain.tex
+++ /dev/null
@@ -1,47 +0,0 @@
-%
-% mountain.tex
-%
-\renewcommand{\thisname}{Chart::Mountain}
-\section{\thisname}
-\name{\thisname}
-\file{Mountain.pm}
-\requires{Chart::Base, GD, Carp, FileHandle}
-\begin{Description}
-The class \thisclass creates a mountain chart, \ie, the individual data
-sets are stacked and the areas under the curves are colour filled.
-The first data set will be shown at the top of the stack, the last at
-the bottom. \thisclass is a subclass of Chart::Base.
-\end{Description}
-
-\example
-\begin{figure}[ht]
- \begin{center}
- \includegraphics[scale =0.6]{mountain.png}
- \end{center}
- \caption{Mountain chart}
- \label{fig:mountain}
-\end{figure}
-\begin{verbatim}
-use Chart::Mountain;
-
-$g = Chart::Mountain->new();
-
-@data = [ [1910, 1930, 1950, 1970],
- [1, 3, 4, 2],
- [2, 4, 3, 3],
- [0.5, 1, 2, 1]];
-
-$g->set('title' => 'Mountain Chart',
- 'grid_lines' => 'false',
- 'precision' => 1);
-
-$g->png("mountain.png", @data);
-\end{verbatim}
-
-\constructorblurb{\thisname}
-
-\begin{AttrDecl}{y\_axes}
-Tells \thisclass where to place the $y$ axis. Valid
-values are \literal{left}, \literal{right} and \literal{both}. Defaults
-to \literal{left}.
-\end{AttrDecl}
diff --git a/doc/LaTeX/Pareto.tex b/doc/LaTeX/Pareto.tex
deleted file mode 100644
index fee70cb..0000000
--- a/doc/LaTeX/Pareto.tex
+++ /dev/null
@@ -1,73 +0,0 @@
-%
-% pareto.tex
-%
-\renewcommand{\thisname}{Chart::Pareto}
-\section{\thisname}
-\name{\thisname}
-\file{Pareto.pm}
-\requires{Chart::Base, GD, Carp, FileHandle}
-\begin{Description}
-The class \thisclass creates a Pareto chart, \ie, a set of absolute
-values overlaid with a line chart of the accumulated values. (This
-latter curve is also known as an \emph{empirical cumulative distribution
-function} or as a \emph{Lorenz curve}.) This representation usually
-makes sense only if the values are sorted (either in ascending or in
-descending order). \thisclass plots only one data set and its labels.
-\thisclass is a subclass of \class{Chart::Base}.
-\end{Description}
-
-\example
-
-\begin{figure}[ht]
- \begin{center}
- \includegraphics[scale=0.7]{d_pareto2.png}
- \end{center}
- \caption{Pareto chart}
- \label{fig:pareto}
-\end{figure}
-\begin{verbatim}
-use Chart::Pareto;
-
-$g = Chart::Pareto->new(500,400);
-$g->add_dataset('1st week', '2nd week', '3rd week', '4th week',
- '5th week', '6th week', '7th week', '8th week',
- '9th week', '10th week');
-$g->add_dataset(37, 15, 9, 4, 3.5, 2.1, 1.2, 1.5, 6.2, 16);
-
-%hash = ('colors' => { 'dataset0' => 'mauve',
- 'dataset1' => 'light_blue',
- 'title' => 'orange'
- },
- 'title' => 'Visitors at the Picasso Exhibition',
- 'integer_ticks_only' => 'true',
- 'skip_int_ticks' => 5,
- 'grey_background' => 'false',
- 'max_val' => 100,
- 'y_label' => 'Visitors in Thousands',
- 'x_ticks' => 'vertical',
- 'spaced_bars' => 'true',
- 'legend' => 'none'
- );
-
-$g->set(%hash);
-
-$g->png("pareto.png");
-\end{verbatim}
-
-\constructorblurb{\thisname}
-
-\begin{AttrDecl}{sort}
-Sorts the data in ascending order if set to \literal{true}. Should be set if
-the input data is not sorted. Defaults to \literal{false}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{spaced\_bars}
-Leaves some space between each group of bars when set to \literal{true}. This
-usually make it easier to read a bar chart. Default is \literal{true}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{y\_axes}
-Tells \thisclass where to place the $y$ axis. Valid
-values are \literal{left}, \literal{right} and \literal{both}. Defaults
-to \literal{left}.
-\end{AttrDecl}
diff --git a/doc/LaTeX/Pie.tex b/doc/LaTeX/Pie.tex
deleted file mode 100644
index 0258504..0000000
--- a/doc/LaTeX/Pie.tex
+++ /dev/null
@@ -1,78 +0,0 @@
-%
-% pie.tex
-%
-\renewcommand{\thisname}{Chart::Pie}
-\section{\thisname}
-\name{\thisname}
-\file{Pie.pm}
-\requires{Chart::Base, GD, Carp, FileHandle}
-\begin{Description}
-The class \thisclass creates a pie chart. The first added set must
-contain the labels, the second set the values. \thisclass is a subclass
-of \class{Chart::Base}.
-\end{Description}
-
-\example
-\begin{figure}[ht]
- \begin{center}
- \includegraphics[scale = 0.6]{d_pie3.png}
- \end{center}
- \caption{Pie chart}
- \label{fig:pie}
-\end{figure}
-\begin{verbatim}
-use Chart::Pie;
-
-$g = Chart::Pie->new();
-
-$g->add_dataset('Har', 'Sug', 'Ert', 'Her', 'Tar', 'Kure');
-$g->add_dataset(12000, 20000 , 13000, 15000, 9000, 11000 );
-
-%opt = ('title' => 'Another Pie Demo Chart',
- 'label_values' => 'both',
- 'legend' => 'none',
- 'text_space' => 10,
- 'png_border' => 1,
- 'graph_border' => 0,
- 'colors' => { 'x_label' => 'red',
- 'misc' => 'plum',
- 'background' => 'grey',
- 'dataset0' => [120, 0, 255],
- 'dataset1' => [120, 100, 255],
- 'dataset2' => [120, 200, 255],
- 'dataset3' => [255, 100, 0],
- 'dataset4' => [255, 50, 0],
- 'dataset5' => [255, 0, 0],
- },
- 'x_label' => 'The Winner is Team Blue!',
- );
-
-$g->set(%opt);
-
-$g->png("pie.png");
-\end{verbatim}
-
-\constructorblurb{\thisname}
-
-\begin{AttrDecl}{label\_values}
-Tells \thisclass what kind of value labels to show alongside the pie.
-Valid values are \literal{percent}, \literal{value}, \literal{both} and
-\literal{none}. Defaults to \literal{percent}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{legend\_label\_values}
-Tells \thisclass what kind of labels to show in the legend. Valid values
-are \literal{percent}, \literal{value}, \literal{both} and
-\literal{none}. Defaults to \literal{value}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{legend\_lines}
-The labels drawn alongside the pie are connected with a line to the
-segment if this option is set to \literal{true}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{ring}
-The pie can have a ring shape instead of the usual disc shape. This
-option determines the thickness of the ring as a fraction of the radius.
-Default is 1, \ie, a full pie.
-\end{AttrDecl}
diff --git a/doc/LaTeX/Points.tex b/doc/LaTeX/Points.tex
deleted file mode 100644
index 9a1e48a..0000000
--- a/doc/LaTeX/Points.tex
+++ /dev/null
@@ -1,122 +0,0 @@
-%
-% points.tex
-%
-\renewcommand{\thisname}{Chart::Points}
-\section{\thisname}
-\name{\thisname}
-\file{Points.pm}
-\requires{Chart::Base, GD, Carp, FileHandle}
-\begin{Description}
-The class \thisclass creates a point chart (also called
-\emph{scattergram}) where the individual data points are marked with a
-symbol. (If you want lines in addition, check
-\class{Chart::LinesPoints} on page~\pageref{Chart::LinesPoints}.)
-\thisclass is a subclass of \class{Chart::Base}.
-\end{Description}
-
-\example
-\begin{figure}[ht]
- \begin{center}
- \includegraphics[scale=0.5]{points.png}
- \end{center}
- \caption{Points chart}
- \label{fig:points}
-\end{figure}
-
-\begin{verbatim}
-use Chart::Points;
-
-$g = Chart::Points->new();
-$g->add_dataset(1, 4, 3, 6, 2, 2.5); # x-coordinates
-$g->add_dataset(1, 5, 3, 2, 3, 3.2); # y-coordinates dataset 1
-$g->add_dataset(2, 6, 4.8, 1, 4, 4.2); # y-coordinates dataset 2
-
-@hash = ('title' => 'Points Chart',
- 'xy_plot' => 'true',
- 'x_ticks' => 'vertical',
- 'legend' => 'none',
- 'sort' => 'true',
- 'precision' => 3,
- 'include_zero' => 'true',
- );
-
-$g->set(@hash);
-
-$g->png("Grafiken/points.png");
-\end{verbatim}
-
-\constructorblurb{\thisname}
-
-\begin{AttrDecl}{pt\_size}
-Sets the radius of the points in pixels. Default is 18.\\
-The points are extended by different brush styles.
-\end{AttrDecl}
-
-\begin{AttrDecl}{brushStyle}
-Define the share of the points. The share may be specified to each dataset.\\
-The possible shapes of the 'points' are
-\begin{itemize}
-\item FilledCircle (default),
-\item circle,
-\item donut,
-\item OpenCircle,
-\item triangle,
-\item upsidedownTriangle,
-\item square,
-\item hollowSquare,
-\item OpenRectangle,
-\item fatPlus,
-\item Star,
-\item OpenStar,
-\item FilledDiamond,
-\item OpenDiamond
-\end{itemize}
-To apply a different brush style to different data sets the following
-example of code can be used:
-\begin{verbatim}
-$g->set(brushStyles => { dataset0 => 'fatPlus', dataset1 => 'hollowSquare' });
-\end{verbatim}
-\begin{figure}[htp]
- \begin{center}
- \includegraphics{brushstyles.png}
- \end{center}
- \caption{Points chart as an example for brush styles}
- \label{fig:brushStyles}
-\end{figure}
-\end{AttrDecl}
-
-\begin{AttrDecl}{sort}
-Sorts the data in ascending order if set to \literal{true}. Should be
-set if the input data is not sorted. Defaults to \literal{false}.
-\end{AttrDecl}
-
-\attrdecl{xlabels}
-\begin{AttrDecl}{xrange}
-This pair of options allows arbitrary positioning of $x$ axis labels.
-The two options must either both be specified or both be omitted.
-\attruse{xlabels} is a reference to 2-element array. The first of the
-elements is a nested (reference to an) array of strings that are the
-labels. The second element is a nested (reference to an) array of
-numbers that are the $x$ values at which the labels should be placed.
-\attruse{xrange} is a 2-element array specifying the minimum and maximum
-$x$ values on the axis. \Eg,
-\begin{verbatim}
-@labels = (['Jan', 'Feb', 'Mar'],
- [10, 40, 70 ]);
-$chart->set(xlabels => \bs @labels,
- xrange => [0, 100]
- );
-\end{verbatim}
-\end{AttrDecl}
-
-\begin{AttrDecl}{xy\_plot}
-Forces \thisclass to plot a $x$--$y$ graph if set to \literal{true},
-\ie, to treat the $x$ axis as numeric. Very useful for plots of
-mathematical functions. Defaults to \literal{false}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{y\_axes}
-Tells \thisclass where to place the $y$ axis. Valid
-values are \literal{left}, \literal{right} and \literal{both}. Defaults
-to \literal{left}.
-\end{AttrDecl}
diff --git a/doc/LaTeX/Split.tex b/doc/LaTeX/Split.tex
deleted file mode 100644
index 3bee38e..0000000
--- a/doc/LaTeX/Split.tex
+++ /dev/null
@@ -1,99 +0,0 @@
-%
-% split.tex
-%
-\renewcommand{\thisname}{Chart::Split}
-\section{\thisname}
-\name{\thisname}
-\file{Split.pm}
-\requires{Chart::Base, GD, Carp, FileHandle}
-\begin{Description}
-The class \thisclass creates a lines chart where both $x$ and $y$ axes
-are assumed to be numeric. Split charts are mainly intended for cases
-where many data points are spread over a wide $x$ range while at the
-same time the $y$ range is limited. Typical examples are weather or
-seismic data. The $x$ axis will be split into several intervals of the
-same length (specified with the mandatory option \attruse{interval}).
-The intervals will be displayed in a stacked fashion. The start of the
-top interval is set with the mandatory option \attruse{start}.
-\thisclass will draw only positive $x$ coordinates. The $y$ axis will
-not be labelled with the $y$ values. Rather, the axis will show only
-the sequence numbers of the intervals. \thisclass is a subclass of
-\class{Chart::Base}.
-\end{Description}
-
-\example
-
-\begin{figure}[ht]
- \begin{center}
- \includegraphics[width=\textwidth, height=\textwidth]{stunde.png}
- \end{center}
- \caption{Split chart}
- \label{fig:split}
-\end{figure}
-\begin{verbatim}
-use Chart::Split;
-
-$g = Chart::Split->new(650, 900);
-
-# Get the data from a file and push them into arrays
-open(FILE, "data.dat") or die "Can't open the data file!\n";
-while (<FILE>) {
- ($x, $y) = split;
- push (@x, $x);
- push (@y, $y);
-}
-close(FILE);
-
-# Add the data
-$g->add_dataset(@x);
-$g->add_dataset(@y);
-
-# Set the options
-$g->set('xy_plot' => 'true');
-$g->set('legend' => 'none');
-$g->set('title' => 'Split Demo');
-$g->set('interval' => 1/288);
-$g->set('interval_ticks' => 10);
-$g->set('start' => 260.5);
-$g->set('brush_size' => 1);
-$g->set('precision' => 4);
-$g->set('y_label' => '5 minutes interval');
-
-# Give me a nice picture
-$g->png("split.png");
-\end{verbatim}
-
-\constructorblurb{\thisname}
-
-\begin{AttrDecl}{start}
-Sets the start value of the first interval. If the $x$ coordinate of
-the first data point is 0, \attruse{start} should also be set to 0.
-\emph{Required} value for a \thisclass chart. Defaults to undef.
-\end{AttrDecl}
-
-\begin{AttrDecl}{interval}
-Sets the interval of one segment to plot. \emph{Required} value for a
-split chart. Defaults to undef.
-\end{AttrDecl}
-
-\begin{AttrDecl}{interval\_ticks}
-Sets the number of ticks for the $x$ axis. Defaults to 5.
-\end{AttrDecl}
-
-\begin{AttrDecl}{scale}
-Every $y$ value of a \thisclass chart will be multiplied by this value,
-without however changing the sclaing of the $y$ axis. (This might result
-in some segments being overdrawn by others.) Only useful if you want to
-give prominence to the maximal amplitudes of data. Defaults to 1.
-\end{AttrDecl}
-
-\begin{AttrDecl}{sort}
-Sorts the data in ascending order if set to \literal{true}. Should be set if
-the input data is not sorted. Defaults to \literal{false}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{y\_axes}
-Tells \thisclass where to place the $y$ axis. Valid
-values are \literal{left}, \literal{right} and \literal{both}. Defaults
-to \literal{left}.
-\end{AttrDecl}
diff --git a/doc/LaTeX/Stacked.tex b/doc/LaTeX/Stacked.tex
deleted file mode 100644
index 66e4164..0000000
--- a/doc/LaTeX/Stacked.tex
+++ /dev/null
@@ -1,53 +0,0 @@
-%
-% stacked.tex
-%
-\renewcommand{\thisname}{Chart::StackedBars}
-\section{\thisname}
-\name{\thisname}
-\file{StackedBars.pm}
-\requires{Chart::Base, GD, Carp, FileHandle}
-\begin{Description}
-The class \thisclass creates a chart made up of stacked vertical bars.
-The first data set will be shown at the bottom of the stack, the last at
-the top. \thisclass is a subclass of \class{Chart::Base}.
-\end{Description}
-
-\example
-\begin{figure}[ht]
- \begin{center}
- \includegraphics[scale=0.6]{stackedbars.png}
- \end{center}
- \caption{Chart with stacked bars}
- \label{fig:stackedbars}
-\end{figure}
-\begin{verbatim}
-use Chart::StackedBars;
-
-$g = Chart::StackedBars->new();
-
-$g->add_dataset(qw(foo bar junk taco karp));
-$g->add_dataset(3, 4, 9, 10, 11);
-$g->add_dataset(8, 6, 1, 12, 1);
-$g->add_dataset(5, 7, 2, 13, 4);
-
-$g->set('title' => 'Stacked Bar Chart');
-$g->set('y_grid_lines' => 'true');
-$g->set('legend' => 'bottom');
-
-$g->png("stackedbars.png");
-\end{verbatim}
-
-\constructorblurb{\thisname}
-
-\begin{AttrDecl}{spaced\_bars}
-Leaves some space between the individual bars when set to
-\literal{true}. This usually make it easier to read a bar chart, with
-stacked bars, however, it is not as important as with groups of bars.
-Default is \literal{true}.
-\end{AttrDecl}
-
-\begin{AttrDecl}{y\_axes}
-Tells \thisclass where to place the $y$ axis. Valid values are
-\literal{left}, \literal{right} and \literal{both}. Defaults to
-\literal{left}.
-\end{AttrDecl}
diff --git a/doc/LaTeX/brushstyles.png b/doc/LaTeX/brushstyles.png
deleted file mode 100644
index edb1827..0000000
--- a/doc/LaTeX/brushstyles.png
+++ /dev/null
Binary files differ
diff --git a/doc/LaTeX/composite.png b/doc/LaTeX/composite.png
deleted file mode 100644
index 49b3c7e..0000000
--- a/doc/LaTeX/composite.png
+++ /dev/null
Binary files differ
diff --git a/doc/LaTeX/d_bars.png b/doc/LaTeX/d_bars.png
deleted file mode 100644
index 8123c21..0000000
--- a/doc/LaTeX/d_bars.png
+++ /dev/null
Binary files differ
diff --git a/doc/LaTeX/d_hbars4.png b/doc/LaTeX/d_hbars4.png
deleted file mode 100644
index 7176928..0000000
--- a/doc/LaTeX/d_hbars4.png
+++ /dev/null
Binary files differ
diff --git a/doc/LaTeX/d_lines2.png b/doc/LaTeX/d_lines2.png
deleted file mode 100644
index 603b5ce..0000000
--- a/doc/LaTeX/d_lines2.png
+++ /dev/null
Binary files differ
diff --git a/doc/LaTeX/d_linesp2.png b/doc/LaTeX/d_linesp2.png
deleted file mode 100644
index 274ad48..0000000
--- a/doc/LaTeX/d_linesp2.png
+++ /dev/null
Binary files differ
diff --git a/doc/LaTeX/d_pareto2.png b/doc/LaTeX/d_pareto2.png
deleted file mode 100644
index 97078a3..0000000
--- a/doc/LaTeX/d_pareto2.png
+++ /dev/null
Binary files differ
diff --git a/doc/LaTeX/d_pie3.png b/doc/LaTeX/d_pie3.png
deleted file mode 100644
index 7b68179..0000000
--- a/doc/LaTeX/d_pie3.png
+++ /dev/null
Binary files differ
diff --git a/doc/LaTeX/definitions.tex b/doc/LaTeX/definitions.tex
deleted file mode 100644
index d2e3140..0000000
--- a/doc/LaTeX/definitions.tex
+++ /dev/null
@@ -1,155 +0,0 @@
-%
-% definitions.tex
-% ---------------
-%
-% Lengths
-\newlength{\parabstand}
-\setlength{\parabstand}{2ex plus1ex minus1ex}
-%
-\newlength{\itemabstand}
-\setlength{\itemabstand}{1ex plus1ex minus1ex}
-%
-% Commands
-\newcommand{\deref}{\ensuremath{\rightarrow}} % Dereferenzierungspfeil ->
-\newcommand{\fatcomma}{\ensuremath{\Rightarrow}} % Fat comma for use in hash declarations: =>
-\newcommand{\ie}{i.\,e.\xspace} % Nicely typeset i.e.
-\newcommand{\Ie}{I.\,e.\xspace} % Nicely typeset I.e.
-\newcommand{\eg}{e.\,g.\xspace} % Nicely typeset e.g.
-\newcommand{\Eg}{E.\,g.\xspace} % Nicely typeset E.g.
-\newcommand{\chart}{\class{Chart}\xspace} % Our most prominent name
-\newcommand{\thisname}{Chart} % Each class will overwrite this with its own name
-\newcommand{\thisclass}{\class{\thisname}\xspace} % Abbreviation for frequently used command
-%
-% Standard text for constructor:
-\newcommand{\constructorblurb}[1]{
-\begin{Constructor}
-An object instance of \class{#1} can be created with the
-constructor \methoduse{new()}\index{Methods!new()}:
-\begin{SmallExample}
-\$obj = #1\deref new();\\
-\$obj = #1\deref new(\parameter{width}, \parameter{height});
-\end{SmallExample}
-
-If \methoduse{new()} is called without arguments, the constructor will
-return an image of size 300\ensuremath{\times}400 pixels. If
-\methoduse{new()} is called with two arguments, \parameter{width} and
-\parameter{height}, it will return a \class{#1} object of the
-desired size.
-\end{Constructor}
-
-\Methods\nopagebreak
-All universally valid methods, see page \pageref{methods} of
-class \class{Chart::Base}.\hfill
-
-\Attributes\nopagebreak
-All universally valid options, see page \pageref{options} of
-class \class{Chart::Base}. In addition, the following options are
-defined for this class:
-}
-%
-%-------------- command class -------------------------
-\newcommand{\class}[1]{\textsf{#1}\index{Class!#1}}
-%
-%-------------- command parameter -------------------------
-\newcommand{\parameter}[1]{\textrm{\textit{#1}}}
-%
-%-------------- command backslash -------------------------
-\newcommand{\bs}{\ensuremath{\backslash}}
-%
-%-------------- command name -------------------------
-\newcommand{\name}[1]{\label{#1}%
- \parbox{15ex}{\bf\large Name:} #1\index{#1}\\[\itemabstand]}
-%
-%-------------- command synopsis -------------------------
-\newcommand{\synopsis}{\label{Synopsis}{\bf\large Synopsis}\index{Synopsis}}
-%
-%-------------- command file -------------------------
-\newcommand{\file}[1]{%
- \parbox{15ex}{\bf\large File:} #1\\[\itemabstand]}
-%
-%-------------- command requires -------------------------
-\newcommand{\requires}[1]{%
- \parbox{15ex}{\bf\large Requires:} #1\\[\itemabstand]}
-%
-%-------------- command example -------------------------
-\newcommand{\example}{\parbox{15ex}{\bf\large Example:}}
-%
-%-------------- command literal -------------------------
-\newcommand{\literal}[1]{`\texttt{#1}'}
-%
-%-------------- command methoduse -------------------------
-\newcommand{\methoduse}[1]{\texttt{#1}}
-%
-%-------------- command methoddecl -------------------------
-\newcommand{\methoddecl}[2]{\methoduse{#1}\index{Methods!#2}\\*}
-%
-%-------------- command attruse -------------------------
-\newcommand{\attruse}[1]{\textbf{#1}}
-%
-%-------------- command attrdecl -------------------------
-\newcommand{\attrdecl}[1]{\attruse{#1}\index{Attributes!#1}\\*}
-%
-%-------------- command Methods -------------------------
-\newcommand{\Methods}{\parindent 0pt \textbf{\large Methods:}\\*}
-%
-%-------------- command Attributes -------------------------
-\newcommand{\Attributes}{\vspace*{1ex}\parindent 0pt \textbf{\large Attributes/Options:}\\*}
-%
-%
-%% Environment definitions
-% Environment Description
-\newenvironment{Description}
-{\nopagebreak \parindent 0pt \textbf{\large Description:}
- \begin{list}{\relax}{
- \setlength{\leftmargin}{0.1\textwidth}
- \setlength{\topsep}{0pt}
- }
- \item
-}%
-{\end{list}
-\vspace{\parabstand}
-}% end Description
-%
-% Environment Constructor
-\newenvironment{Constructor}%
-{\nopagebreak \parindent 0pt \textbf{\large Constructor:}\index{Constructor}
- \begin{list}{\relax}{
- \setlength{\leftmargin}{0.1\textwidth}
- \setlength{\topsep}{0pt}
- }
- \item
-}%
-{\end{list}
-\vspace{\parabstand}
-}% end Constructor
-%
-% Environment MethDecl
-\newlength{\minilength}
-\newenvironment{MethDecl}[2]%
-{\parindent 0pt \methoduse{#1}\index{Methods!#2}
- \begin{list}{\relax}{
- \setlength{\leftmargin}{0.1\textwidth}
- \setlength{\topsep}{0pt}
- }
- \item
-}%
-{\end{list}
-}% end MethDecl
-%
-% Environment AttrDecl
-\newenvironment{AttrDecl}[1]%
-{\parindent 0pt \attruse{#1}\index{Attributes!#1}
- \begin{list}{\relax}{
- \setlength{\leftmargin}{0.1\textwidth}
- \setlength{\topsep}{0pt}
- }
- \item
-}%
-{\end{list}
-}% end AttrDecl
-%
-% Environment SmallExample
-\newenvironment{SmallExample}%
-{\begin{quote}\ttfamily}%
-{\end{quote}}% end SmallExample
-%
diff --git a/doc/LaTeX/description.tex b/doc/LaTeX/description.tex
deleted file mode 100644
index 39d464e..0000000
--- a/doc/LaTeX/description.tex
+++ /dev/null
@@ -1,197 +0,0 @@
-% description.tex
-%-----------------
-\clearpage
-\section{Description}
-\synopsis
-
-\begin{verbatim}
- use Chart::type; (type is one of: Bars, Composite,
- Direction, ErrorBars, HorizontalBars, Lines, LinesPoints,
- Mountain, Pareto, Pie, Points, Split or StackedBars)
-
- $obj = Chart::type->new();
- $obj = Chart::type->new(\$width, \$height);
-
- $obj->set( $key_1, $val_1, ... , $key_n, $val_n);
- $obj->set( $key_1 => $val_1, ... , $key_n => $val_n);
- $obj->set( %hash );
-
- # Graph.pm-style API to produce PNG formatted charts:
- @data = ( \@x_tick_labels, \@dataset_1, ... , \@dataset_n);
- $obj->png( "filename", \@data );
- $obj->png( $filehandle, \@data );
- $obj->png( FILEHANDLE, \@data );
- $obj->cgi_png();
-
- # Graph.pm-style API:
- $obj->add_pt($label, $val_1, ..., $val_n);
- $obj->add_dataset($val_1, ..., $val_n);
- $obj->png("filename");
- $obj->png($filehandle);
- $obj->png(FILEHANDLE);
- $obj->cgi_png();
- # Similar functions are available for JPEG output.
-
- # Retrieve imagemap information:
- $obj->set('imagemap' => 'true');
- $imagemap_ref = $obj->imagemap_dump();
-
-\end{verbatim}
-\clearpage
-
-The Perl module \class{Chart} creates \textsc{png} or \textsc{jpeg}
-output which can be written to a file or to stdout. Therefore,
-\class{Chart} can also create dynamic charts for web sites.
-
-Many different chart types are available, viz., Bars,
-Composite, Direction, ErrorBars, HorizontalBars, Lines, LinesPoints,
-Mountain, Pareto, Pie, Points, Split, and StackedBars. Each
-specific type is implemented as a class by itself which is
-derived from the same abstract superclass, Base.
-
-The hierarchy of \class{Chart} classes is shown in
-Figure~\ref{fig:Aufbau}.
-
-\begin{figure}[ht]
- \begin{center}
- \includegraphics[scale=0.5]{Aufbau.png}
- \end{center}
- \caption{The hierarchy of \class{Chart} classes}
- \label{fig:Aufbau}
-\end{figure}
-
-You must create an \emph{instance of one of the concrete subclasses} to
-get a \class{Chart} object. Take a look at the individual class
-descriptions to see how they work.
-
-All the methods and most of the options \class{Chart} provides are
-implemented in the \class{Chart::Base} class. However, drawing of the
-graph itself happens in the appropriate subclass.
-Figure~\ref{fig:Elemente} shows the elements of a chart from a layout
-perspective.
-
-\begin{figure}[ht]
- \begin{center}
- \includegraphics[scale=0.4]{Elemente.png}
- \end{center}
- \caption{Layout Elements of a chart}
- \label{fig:Elemente}
-\end{figure}
-
-The graph area in the middle is drawn by the subclass, all the other
-elements are drawn by \class{Chart::Base}. But some classes do not need
-all of those elements, or they may need additional elements. The
-\class{Chart::Base} methods producing these elements have then to be
-overwritten in the respective subclass. For example, class
-\class{Chart::Pie} needs no axes, so the methods for drawing these in
-file Base.pm are overwritten by methods in class \class{Chart::Pie}; in
-this case, no axes are drawn. Furthermore, the legend in a pie chart is
-slightly different. Therefore, Pie.pm has its own methods for drawing
-the legends. All these rules are managed by \class{Chart}, so you do not
-have to attend to it.
-
-\class{Chart} uses Lincoln Stein's GD module for all its graphics
-primitives calls. So you need an installed version of GD.pm to use
-\class{Chart}. This module is available in the CPAN online archive at
-\texttt{http://www.cpan.org/}, just like \class{Chart} itself.
-\index{GD (module by Lincoln Stein)}
-
-The table lists all attributes that are currently used within the Chart
-package. It shows which of the concrete subclasses uses each attribute.
-
-{
-\begin{sidewaystable}
-\tiny
-\begin{tabular}{|l|c|c|c|c|c|c|c|c|c|c|c|c|c|}
-\hline
-Attribute & Bars& Composite& Direction& ErrorBars& HorizontalBars& Lines& LinesPoints& Mountain& Pareto& Pie& Points& Split& StackedBars \\
-\hline
-angle\_interval & & & X & & & & & & & & & & \\
-arrow & & & X & & & & & & & & & & \\
-brush\_size & & & X & X & & X & X & & & & & & \\
-brush\_size1 & & X & & & & & & & & & & & \\
-brush\_size2 & & X & & & & & & & & & & & \\
-brushStyle & & & & & & & X & & & & X & & \\
-brushStyle1 & & X & & & & & & & & & & & \\
-brushStyle2 & & X & & & & & & & & & & & \\
-colors & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-composite\_info & & X & & & & & & & & & & & \\
-custom\_x\_ticks & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-f\_x\_tick & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-f\_y\_tick & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-f\_y\_tick1 & & X & & & & & & & & & & & \\
-f\_y\_tick2 & & X & & & & & & & & & & & \\
-graph\_border & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-grey\_background & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-grid\_lines & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-imagemap & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-include\_zero & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-integer\_ticks\_only & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-interval & & & & & & & & & & & & X & \\
-interval\_ticks & & & & & & & & & & & & X & \\
-label\_font & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-label\_values & & & & & & & & & & X & & & \\
-legend & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-legend\_example\_height& & X & & & & & & & & & & & \\
-legend\_example\_size & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-legend\_font & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-legend\_label\_values & & & & & & & & & & X & & & \\
-legend\_labels & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-legend\_lines & & & & & & & & & & X & & & \\
-line & & & X & & & & & & & & & & \\
-max\_circles & & & X & & & & & & & & & & \\
-max\_val & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-max\_val1 & & X & & & & & & & & & & & \\
-max\_val2 & & X & & & & & & & & & & & \\
-max\_x\_ticks & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-max\_y\_ticks & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-min\_circles & & & X & & & & & & & & & & \\
-min\_val & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-min\_val1 & & X & & & & & & & & & & & \\
-min\_val2 & & X & & & & & & & & & & & \\
-min\_x\_ticks & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-min\_y\_ticks & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-no\_cache & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-pairs & & & X & & & & & & & & & & \\
-png\_border & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-point & & & X & & & & & & & & & & \\
-precision & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-pt\_size & & & X & X & & & X & & & & X & & \\
-ring & & & & & & & & & & X & & & \\
-same\_error & & & & X & & & & & & & & & \\
-same\_y\_axes & & X & & & & & & & & & & & \\
-scale & & & & & & & & & & & & X & \\
-skip\_int\_ticks & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-skip\_x\_ticks & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-skip\_y\_ticks & & & & & X & & & & & & & & \\
-sort & & & X & X & & X & X & & X & & X & X & \\
-spaced\_bars & X & & & & X & & & & X & & & & X \\
-start & & & & & & & & & & & & X & \\
-stepline & & & & & & X & X & & & & & & \\
-stepline\_mode & & & & & & X & X & & & & & & \\
-sub\_title & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-text\_space & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-tick\_label\_font & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-tick\_len & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-title & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-title\_font & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-transparent & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-x\_grid\_lines & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-x\_label & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-x\_ticks & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-xlabels & & & & X & & X & X & & & & X & & \\
-xrange & & & & X & & X & X & & & & X & & \\
-xy\_plot & & & & X & & X & X & & & & X & & \\
-y\_axes & X & & & X & X & & X & X & X & & X & X & X \\
-y\_grid\_lines & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-y\_label & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-y\_label2 & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-y\_ticks & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-y\_ticks1 & & X & & & & & & & & & & & \\
-y\_ticks2 & & X & & & & & & & & & & & \\
-ylabel2 & X & X & X & X & X & X & X & X & X & X & X & X & X \\
-\hline
-\end{tabular}
-\end{sidewaystable}
-}
-
diff --git a/doc/LaTeX/direction.png b/doc/LaTeX/direction.png
deleted file mode 100644
index fe1de17..0000000
--- a/doc/LaTeX/direction.png
+++ /dev/null
Binary files differ
diff --git a/doc/LaTeX/error.png b/doc/LaTeX/error.png
deleted file mode 100644
index 7f0c26c..0000000
--- a/doc/LaTeX/error.png
+++ /dev/null
Binary files differ
diff --git a/doc/LaTeX/mountain.png b/doc/LaTeX/mountain.png
deleted file mode 100644
index 9513ec9..0000000
--- a/doc/LaTeX/mountain.png
+++ /dev/null
Binary files differ
diff --git a/doc/LaTeX/points.png b/doc/LaTeX/points.png
deleted file mode 100644
index 770096d..0000000
--- a/doc/LaTeX/points.png
+++ /dev/null
Binary files differ
diff --git a/doc/LaTeX/rgb.dat b/doc/LaTeX/rgb.dat
deleted file mode 100644
index c3f8263..0000000
--- a/doc/LaTeX/rgb.dat
+++ /dev/null
@@ -1,414 +0,0 @@
- 'white' => [ 255, 255, 255 ],
- 'black' => [ 0, 0, 0 ],
- 'red' => [ 200, 0, 0 ],
- 'green' => [ 0, 175, 0 ],
- 'blue' => [ 0, 0, 200 ],
- 'orange' => [ 250, 125, 0 ],
- 'orange2' => [ 238, 154, 0 ],
- 'orange3' => [ 205, 133, 0 ],
- 'orange4' => [ 139, 90, 0 ],
- 'yellow' => [ 225, 225, 0 ],
- 'purple' => [ 200, 0, 200 ],
- 'light_blue' => [ 0, 125, 250 ],
- 'light_green' => [ 125, 250, 0 ],
- 'light_purple' => [ 145, 0, 250 ],
- 'pink' => [ 250, 0, 125 ],
- 'peach' => [ 250, 125, 125 ],
- 'olive' => [ 125, 125, 0 ],
- 'plum' => [ 125, 0, 125 ],
- 'turquoise' => [ 0, 125, 125 ],
- 'mauve' => [ 200, 125, 125 ],
- 'brown' => [ 160, 80, 0 ],
- 'grey' => [ 225, 225, 225 ],
- 'HotPink' => [ 255, 105, 180 ],
- 'PaleGreen1' => [ 154, 255, 154 ],
- 'PaleGreen2' => [ 144, 238, 144 ],
- 'PaleGreen3' => [ 124, 205, 124 ],
- 'PaleGreen4' => [ 84, 138, 84 ],
- 'DarkBlue' => [ 0, 0, 139 ],
- 'BlueViolet' => [ 138, 43, 226 ],
- 'PeachPuff' => [ 255, 218, 185 ],
- 'PeachPuff1' => [ 255, 218, 185 ],
- 'PeachPuff2' => [ 238, 203, 173 ],
- 'PeachPuff3' => [ 205, 175, 149 ],
- 'PeachPuff4' => [ 139, 119, 101 ],
- 'chocolate1' => [ 255, 127, 36 ],
- 'chocolate2' => [ 238, 118, 33 ],
- 'chocolate3' => [ 205, 102, 29 ],
- 'chocolate4' => [ 139, 69, 19 ],
- 'LightGreen' => [ 144, 238, 144 ],
- 'lavender' => [ 230, 230, 250 ],
- 'MediumPurple' => [ 147, 112, 219 ],
- 'DarkOrange' => [ 255, 127, 0 ],
- 'DarkOrange2' => [ 238, 118, 0 ],
- 'DarkOrange3' => [ 205, 102, 0 ],
- 'DarkOrange4' => [ 139, 69, 0 ],
- 'SlateBlue' => [ 106, 90, 205 ],
- 'BlueViolet' => [ 138, 43, 226 ],
- 'RoyalBlue' => [ 65, 105, 225 ],
- 'AntiqueWhite' => [ 250, 235, 215 ],
- 'AntiqueWhite1' => [ 255, 239, 219 ],
- 'AntiqueWhite2' => [ 238, 223, 204 ],
- 'AntiqueWhite3' => [ 205, 192, 176 ],
- 'AntiqueWhite4' => [ 139, 131, 120 ],
- 'CadetBlue' => [ 95, 158, 160 ],
- 'CadetBlue1' => [ 152, 245, 255 ],
- 'CadetBlue2' => [ 142, 229, 238 ],
- 'CadetBlue3' => [ 122, 197, 205 ],
- 'CadetBlue4' => [ 83, 134, 139 ],
- 'DarkGoldenrod' => [ 184, 134, 11 ],
- 'DarkGoldenrod1' => [ 255, 185, 15 ],
- 'DarkGoldenrod2' => [ 238, 173, 14 ],
- 'DarkGoldenrod3' => [ 205, 149, 12 ],
- 'DarkGoldenrod4' => [ 139, 101, 8 ],
- 'DarkOliveGreen' => [ 85, 107, 47 ],
- 'DarkOliveGreen1' => [ 202, 255, 112 ],
- 'DarkOliveGreen2' => [ 188, 238, 104 ],
- 'DarkOliveGreen3' => [ 162, 205, 90 ],
- 'DarkOliveGreen4' => [ 110, 139, 61 ],
- 'DarkOrange1' => [ 255, 127, 0 ],
- 'DarkOrchid' => [ 153, 50, 204 ],
- 'DarkOrchid1' => [ 191, 62, 255 ],
- 'DarkOrchid2' => [ 178, 58, 238 ],
- 'DarkOrchid3' => [ 154, 50, 205 ],
- 'DarkOrchid4' => [ 104, 34, 139 ],
- 'DarkSeaGreen' => [ 143, 188, 143 ],
- 'DarkSeaGreen1' => [ 193, 255, 193 ],
- 'DarkSeaGreen2' => [ 180, 238, 180 ],
- 'DarkSeaGreen3' => [ 155, 205, 155 ],
- 'DarkSeaGreen4' => [ 105, 139, 105 ],
- 'DarkSlateGray' => [ 47, 79, 79 ],
- 'DarkSlateGray1' => [ 151, 255, 255 ],
- 'DarkSlateGray2' => [ 141, 238, 238 ],
- 'DarkSlateGray3' => [ 121, 205, 205 ],
- 'DarkSlateGray4' => [ 82, 139, 139 ],
- 'DeepPink' => [ 255, 20, 147 ],
- 'DeepPink1' => [ 255, 20, 147 ],
- 'DeepPink2' => [ 238, 18, 137 ],
- 'DeepPink3' => [ 205, 16, 118 ],
- 'DeepPink4' => [ 139, 10, 80 ],
- 'DeepSkyBlue' => [ 0, 191, 255 ],
- 'DeepSkyBlue1' => [ 0, 191, 255 ],
- 'DeepSkyBlue2' => [ 0, 178, 238 ],
- 'DeepSkyBlue3' => [ 0, 154, 205 ],
- 'DeepSkyBlue4' => [ 0, 104, 139 ],
- 'DodgerBlue' => [ 30, 144, 255 ],
- 'DodgerBlue1' => [ 30, 144, 255 ],
- 'DodgerBlue2' => [ 28, 134, 238 ],
- 'DodgerBlue3' => [ 24, 116, 205 ],
- 'DodgerBlue4' => [ 16, 78, 139 ],
- 'HotPink1' => [ 255, 110, 180 ],
- 'HotPink2' => [ 238, 106, 167 ],
- 'HotPink3' => [ 205, 96, 144 ],
- 'HotPink4' => [ 139, 58, 98 ],
- 'IndianRed' => [ 205, 92, 92 ],
- 'IndianRed1' => [ 255, 106, 106 ],
- 'IndianRed2' => [ 238, 99, 99 ],
- 'IndianRed3' => [ 205, 85, 85 ],
- 'IndianRed4' => [ 139, 58, 58 ],
- 'LavenderBlush' => [ 255, 240, 245 ],
- 'LavenderBlush1' => [ 255, 240, 245 ],
- 'LavenderBlush2' => [ 238, 224, 229 ],
- 'LavenderBlush3' => [ 205, 193, 197 ],
- 'LavenderBlush4' => [ 139, 131, 134 ],
- 'LemonChiffon' => [ 255, 250, 205 ],
- 'LemonChiffon1' => [ 255, 250, 205 ],
- 'LemonChiffon2' => [ 238, 233, 191 ],
- 'LemonChiffon3' => [ 205, 201, 165 ],
- 'LemonChiffon4' => [ 139, 137, 112 ],
- 'LightBlue' => [ 173, 216, 230 ],
- 'LightBlue1' => [ 191, 239, 255 ],
- 'LightBlue2' => [ 178, 223, 238 ],
- 'LightBlue3' => [ 154, 192, 205 ],
- 'LightBlue4' => [ 104, 131, 139 ],
- 'LightCyan' => [ 224, 255, 255 ],
- 'LightCyan1' => [ 224, 255, 255 ],
- 'LightCyan2' => [ 209, 238, 238 ],
- 'LightCyan3' => [ 180, 205, 205 ],
- 'LightCyan4' => [ 122, 139, 139 ],
- 'LightGoldenrod' => [ 238, 221, 130 ],
- 'LightGoldenrod1' => [ 255, 236, 139 ],
- 'LightGoldenrod2' => [ 238, 220, 130 ],
- 'LightGoldenrod3' => [ 205, 190, 112 ],
- 'LightGoldenrod4' => [ 139, 129, 76 ],
- 'LightPink' => [ 255, 182, 193 ],
- 'LightPink1' => [ 255, 174, 185 ],
- 'LightPink2' => [ 238, 162, 173 ],
- 'LightPink3' => [ 205, 140, 149 ],
- 'LightPink4' => [ 139, 95, 101 ],
- 'LightSalmon' => [ 255, 160, 122 ],
- 'LightSalmon1' => [ 255, 160, 122 ],
- 'LightSalmon2' => [ 238, 149, 114 ],
- 'LightSalmon3' => [ 205, 129, 98 ],
- 'LightSalmon4' => [ 139, 87, 66 ],
- 'LightSkyBlue' => [ 135, 206, 250 ],
- 'LightSkyBlue1' => [ 176, 226, 255 ],
- 'LightSkyBlue2' => [ 164, 211, 238 ],
- 'LightSkyBlue3' => [ 141, 182, 205 ],
- 'LightSkyBlue4' => [ 96, 123, 139 ],
- 'LightSteelBlue' => [ 176, 196, 222 ],
- 'LightSteelBlue1' => [ 202, 225, 255 ],
- 'LightSteelBlue2' => [ 188, 210, 238 ],
- 'LightSteelBlue3' => [ 162, 181, 205 ],
- 'LightSteelBlue4' => [ 110, 123, 139 ],
- 'LightYellow' => [ 255, 255, 224 ],
- 'LightYellow1' => [ 255, 255, 224 ],
- 'LightYellow2' => [ 238, 238, 209 ],
- 'LightYellow3' => [ 205, 205, 180 ],
- 'LightYellow4' => [ 139, 139, 122 ],
- 'MediumOrchid' => [ 186, 85, 211 ],
- 'MediumOrchid1' => [ 224, 102, 255 ],
- 'MediumOrchid2' => [ 209, 95, 238 ],
- 'MediumOrchid3' => [ 180, 82, 205 ],
- 'MediumOrchid4' => [ 122, 55, 139 ],
- 'MediumPurple1' => [ 171, 130, 255 ],
- 'MediumPurple2' => [ 159, 121, 238 ],
- 'MediumPurple3' => [ 137, 104, 205 ],
- 'MediumPurple4' => [ 93, 71, 139 ],
- 'MistyRose' => [ 255, 228, 225 ],
- 'MistyRose1' => [ 255, 228, 225 ],
- 'MistyRose2' => [ 238, 213, 210 ],
- 'MistyRose3' => [ 205, 183, 181 ],
- 'MistyRose4' => [ 139, 125, 123 ],
- 'NavajoWhite' => [ 255, 222, 173 ],
- 'NavajoWhite1' => [ 255, 222, 173 ],
- 'NavajoWhite2' => [ 238, 207, 161 ],
- 'NavajoWhite3' => [ 205, 179, 139 ],
- 'NavajoWhite4' => [ 139, 121, 94 ],
- 'OliveDrab' => [ 107, 142, 35 ],
- 'OliveDrab1' => [ 192, 255, 62 ],
- 'OliveDrab2' => [ 179, 238, 58 ],
- 'OliveDrab3' => [ 154, 205, 50 ],
- 'OliveDrab4' => [ 105, 139, 34 ],
- 'OrangeRed' => [ 255, 69, 0 ],
- 'OrangeRed1' => [ 255, 69, 0 ],
- 'OrangeRed2' => [ 238, 64, 0 ],
- 'OrangeRed3' => [ 205, 55, 0 ],
- 'OrangeRed4' => [ 139, 37, 0 ],
- 'PaleGreen' => [ 152, 251, 152 ],
- 'PaleTurquoise' => [ 175, 238, 238 ],
- 'PaleTurquoise1' => [ 187, 255, 255 ],
- 'PaleTurquoise2' => [ 174, 238, 238 ],
- 'PaleTurquoise3' => [ 150, 205, 205 ],
- 'PaleTurquoise4' => [ 102, 139, 139 ],
- 'PaleVioletRed' => [ 219, 112, 147 ],
- 'PaleVioletRed1' => [ 255, 130, 171 ],
- 'PaleVioletRed2' => [ 238, 121, 159 ],
- 'PaleVioletRed3' => [ 205, 104, 137 ],
- 'PaleVioletRed4' => [ 139, 71, 93 ],
- 'RosyBrown' => [ 188, 143, 143 ],
- 'RosyBrown1' => [ 255, 193, 193 ],
- 'RosyBrown2' => [ 238, 180, 180 ],
- 'RosyBrown3' => [ 205, 155, 155 ],
- 'RosyBrown4' => [ 139, 105, 105 ],
- 'RoyalBlue1' => [ 72, 118, 255 ],
- 'RoyalBlue2' => [ 67, 110, 238 ],
- 'RoyalBlue3' => [ 58, 95, 205 ],
- 'RoyalBlue4' => [ 39, 64, 139 ],
- 'SeaGreen' => [ 46, 139, 87 ],
- 'SeaGreen1' => [ 84, 255, 159 ],
- 'SeaGreen2' => [ 78, 238, 148 ],
- 'SeaGreen3' => [ 67, 205, 128 ],
- 'SeaGreen4' => [ 46, 139, 87 ],
- 'SkyBlue' => [ 135, 206, 235 ],
- 'SkyBlue1' => [ 135, 206, 255 ],
- 'SkyBlue2' => [ 126, 192, 238 ],
- 'SkyBlue3' => [ 108, 166, 205 ],
- 'SkyBlue4' => [ 74, 112, 139 ],
- 'SlateBlue1' => [ 131, 111, 255 ],
- 'SlateBlue2' => [ 122, 103, 238 ],
- 'SlateBlue3' => [ 105, 89, 205 ],
- 'SlateBlue4' => [ 71, 60, 139 ],
- 'SlateGray' => [ 112, 128, 144 ],
- 'SlateGray1' => [ 198, 226, 255 ],
- 'SlateGray2' => [ 185, 211, 238 ],
- 'SlateGray3' => [ 159, 182, 205 ],
- 'SlateGray4' => [ 108, 123, 139 ],
- 'SpringGreen' => [ 0, 255, 127 ],
- 'SpringGreen1' => [ 0, 255, 127 ],
- 'SpringGreen2' => [ 0, 238, 118 ],
- 'SpringGreen3' => [ 0, 205, 102 ],
- 'SpringGreen4' => [ 0, 139, 69 ],
- 'SteelBlue' => [ 70, 130, 180 ],
- 'SteelBlue1' => [ 99, 184, 255 ],
- 'SteelBlue2' => [ 92, 172, 238 ],
- 'SteelBlue3' => [ 79, 148, 205 ],
- 'SteelBlue4' => [ 54, 100, 139 ],
- 'VioletRed' => [ 208, 32, 144 ],
- 'VioletRed1' => [ 255, 62, 150 ],
- 'VioletRed2' => [ 238, 58, 140 ],
- 'VioletRed3' => [ 205, 50, 120 ],
- 'VioletRed4' => [ 139, 34, 82 ],
- 'aquamarine' => [ 127, 255, 212 ],
- 'aquamarine1' => [ 127, 255, 212 ],
- 'aquamarine2' => [ 118, 238, 198 ],
- 'aquamarine3' => [ 102, 205, 170 ],
- 'aquamarine4' => [ 69, 139, 116 ],
- 'azure' => [ 240, 255, 255 ],
- 'azure1' => [ 240, 255, 255 ],
- 'azure2' => [ 224, 238, 238 ],
- 'azure3' => [ 193, 205, 205 ],
- 'azure4' => [ 131, 139, 139 ],
- 'bisque' => [ 255, 228, 196 ],
- 'bisque1' => [ 255, 228, 196 ],
- 'bisque2' => [ 238, 213, 183 ],
- 'bisque3' => [ 205, 183, 158 ],
- 'bisque4' => [ 139, 125, 107 ],
- 'blue1' => [ 0, 0, 255 ],
- 'blue2' => [ 0, 0, 238 ],
- 'blue3' => [ 0, 0, 205 ],
- 'blue4' => [ 0, 0, 139 ],
- 'brown1' => [ 255, 64, 64 ],
- 'brown2' => [ 238, 59, 59 ],
- 'brown3' => [ 205, 51, 51 ],
- 'brown4' => [ 139, 35, 35 ],
- 'burlywood' => [ 222, 184, 135 ],
- 'burlywood1' => [ 255, 211, 155 ],
- 'burlywood2' => [ 238, 197, 145 ],
- 'burlywood3' => [ 205, 170, 125 ],
- 'burlywood4' => [ 139, 115, 85 ],
- 'chartreuse' => [ 127, 255, 0 ],
- 'chartreuse1' => [ 127, 255, 0 ],
- 'chartreuse2' => [ 118, 238, 0 ],
- 'chartreuse3' => [ 102, 205, 0 ],
- 'chartreuse4' => [ 69, 139, 0 ],
- 'chocolate' => [ 210, 105, 30 ],
- 'coral' => [ 255, 127, 80 ],
- 'coral1' => [ 255, 114, 86 ],
- 'coral2' => [ 238, 106, 80 ],
- 'coral3' => [ 205, 91, 69 ],
- 'coral4' => [ 139, 62, 47 ],
- 'cornsilk' => [ 255, 248, 220 ],
- 'cornsilk1' => [ 255, 248, 220 ],
- 'cornsilk2' => [ 238, 232, 205 ],
- 'cornsilk3' => [ 205, 200, 177 ],
- 'cornsilk4' => [ 139, 136, 120 ],
- 'cyan' => [ 0, 255, 255 ],
- 'cyan1' => [ 0, 255, 255 ],
- 'cyan2' => [ 0, 238, 238 ],
- 'cyan3' => [ 0, 205, 205 ],
- 'cyan4' => [ 0, 139, 139 ],
- 'firebrick' => [ 178, 34, 34 ],
- 'firebrick1' => [ 255, 48, 48 ],
- 'firebrick2' => [ 238, 44, 44 ],
- 'firebrick3' => [ 205, 38, 38 ],
- 'firebrick4' => [ 139, 26, 26 ],
- 'gold' => [ 255, 215, 0 ],
- 'gold1' => [ 255, 215, 0 ],
- 'gold2' => [ 238, 201, 0 ],
- 'gold3' => [ 205, 173, 0 ],
- 'gold4' => [ 139, 117, 0 ],
- 'goldenrod' => [ 218, 165, 32 ],
- 'goldenrod1' => [ 255, 193, 37 ],
- 'goldenrod2' => [ 238, 180, 34 ],
- 'goldenrod3' => [ 205, 155, 29 ],
- 'goldenrod4' => [ 139, 105, 20 ],
- 'gray' => [ 190, 190, 190 ],
- 'gray1' => [ 3, 3, 3 ],
- 'gray2' => [ 5, 5, 5 ],
- 'gray3' => [ 8, 8, 8 ],
- 'gray4' => [ 10, 10, 10 ],
- 'green1' => [ 0, 255, 0 ],
- 'green2' => [ 0, 238, 0 ],
- 'green3' => [ 0, 205, 0 ],
- 'green4' => [ 0, 139, 0 ],
- 'grey1' => [ 3, 3, 3 ],
- 'grey2' => [ 5, 5, 5 ],
- 'grey3' => [ 8, 8, 8 ],
- 'grey4' => [ 10, 10, 10 ],
- 'honeydew' => [ 240, 255, 240 ],
- 'honeydew1' => [ 240, 255, 240 ],
- 'honeydew2' => [ 224, 238, 224 ],
- 'honeydew3' => [ 193, 205, 193 ],
- 'honeydew4' => [ 131, 139, 131 ],
- 'ivory' => [ 255, 255, 240 ],
- 'ivory1' => [ 255, 255, 240 ],
- 'ivory2' => [ 238, 238, 224 ],
- 'ivory3' => [ 205, 205, 193 ],
- 'ivory4' => [ 139, 139, 131 ],
- 'khaki' => [ 240, 230, 140 ],
- 'khaki1' => [ 255, 246, 143 ],
- 'khaki2' => [ 238, 230, 133 ],
- 'khaki3' => [ 205, 198, 115 ],
- 'khaki4' => [ 139, 134, 78 ],
- 'magenta' => [ 255, 0, 255 ],
- 'magenta1' => [ 255, 0, 255 ],
- 'magenta2' => [ 238, 0, 238 ],
- 'magenta3' => [ 205, 0, 205 ],
- 'magenta4' => [ 139, 0, 139 ],
- 'maroon' => [ 176, 48, 96 ],
- 'maroon1' => [ 255, 52, 179 ],
- 'maroon2' => [ 238, 48, 167 ],
- 'maroon3' => [ 205, 41, 144 ],
- 'maroon4' => [ 139, 28, 98 ],
- 'orange1' => [ 255, 165, 0 ],
- 'orchid' => [ 218, 112, 214 ],
- 'orchid1' => [ 255, 131, 250 ],
- 'orchid2' => [ 238, 122, 233 ],
- 'orchid3' => [ 205, 105, 201 ],
- 'orchid4' => [ 139, 71, 137 ],
- 'pink1' => [ 255, 181, 197 ],
- 'pink2' => [ 238, 169, 184 ],
- 'pink3' => [ 205, 145, 158 ],
- 'pink4' => [ 139, 99, 108 ],
- 'plum1' => [ 255, 187, 255 ],
- 'plum2' => [ 238, 174, 238 ],
- 'plum3' => [ 205, 150, 205 ],
- 'plum4' => [ 139, 102, 139 ],
- 'purple1' => [ 155, 48, 255 ],
- 'purple2' => [ 145, 44, 238 ],
- 'purple3' => [ 125, 38, 205 ],
- 'purple4' => [ 85, 26, 139 ],
- 'red1' => [ 255, 0, 0 ],
- 'red2' => [ 238, 0, 0 ],
- 'red3' => [ 205, 0, 0 ],
- 'red4' => [ 139, 0, 0 ],
- 'salmon' => [ 250, 128, 114 ],
- 'salmon1' => [ 255, 140, 105 ],
- 'salmon2' => [ 238, 130, 98 ],
- 'salmon3' => [ 205, 112, 84 ],
- 'salmon4' => [ 139, 76, 57 ],
- 'seashell' => [ 255, 245, 238 ],
- 'seashell1' => [ 255, 245, 238 ],
- 'seashell2' => [ 238, 229, 222 ],
- 'seashell3' => [ 205, 197, 191 ],
- 'seashell4' => [ 139, 134, 130 ],
- 'sienna' => [ 160, 82, 45 ],
- 'sienna1' => [ 255, 130, 71 ],
- 'sienna2' => [ 238, 121, 66 ],
- 'sienna3' => [ 205, 104, 57 ],
- 'sienna4' => [ 139, 71, 38 ],
- 'snow' => [ 255, 250, 250 ],
- 'snow1' => [ 255, 250, 250 ],
- 'snow2' => [ 238, 233, 233 ],
- 'snow3' => [ 205, 201, 201 ],
- 'snow4' => [ 139, 137, 137 ],
- 'tan' => [ 210, 180, 140 ],
- 'tan1' => [ 255, 165, 79 ],
- 'tan2' => [ 238, 154, 73 ],
- 'tan3' => [ 205, 133, 63 ],
- 'tan4' => [ 139, 90, 43 ],
- 'thistle' => [ 216, 191, 216 ],
- 'thistle1' => [ 255, 225, 255 ],
- 'thistle2' => [ 238, 210, 238 ],
- 'thistle3' => [ 205, 181, 205 ],
- 'thistle4' => [ 139, 123, 139 ],
- 'tomato' => [ 255, 99, 71 ],
- 'tomato1' => [ 255, 99, 71 ],
- 'tomato2' => [ 238, 92, 66 ],
- 'tomato3' => [ 205, 79, 57 ],
- 'tomato4' => [ 139, 54, 38 ],
- 'turquoise1' => [ 0, 245, 255 ],
- 'turquoise2' => [ 0, 229, 238 ],
- 'turquoise3' => [ 0, 197, 205 ],
- 'turquoise4' => [ 0, 134, 139 ],
- 'wheat' => [ 245, 222, 179 ],
- 'wheat1' => [ 255, 231, 186 ],
- 'wheat2' => [ 238, 216, 174 ],
- 'wheat3' => [ 205, 186, 150 ],
- 'wheat4' => [ 139, 126, 102 ],
- 'yellow1' => [ 255, 255, 0 ],
- 'yellow2' => [ 238, 238, 0 ],
- 'yellow3' => [ 205, 205, 0 ],
- 'yellow4' => [ 139, 139, 0 ],
-
diff --git a/doc/LaTeX/rgb.tex b/doc/LaTeX/rgb.tex
deleted file mode 100644
index 051f954..0000000
--- a/doc/LaTeX/rgb.tex
+++ /dev/null
@@ -1,416 +0,0 @@
-%
-% rgb.tex
-%
-\definecolor{white}{rgb}{1.00,1.00,1.00}
-\definecolor{black}{rgb}{0.00,0.00,0.00}
-\definecolor{red}{rgb}{0.78,0.00,0.00}
-\definecolor{green}{rgb}{0.00,0.69,0.00}
-\definecolor{blue}{rgb}{0.00,0.00,0.78}
-\definecolor{orange}{rgb}{0.98,0.49,0.00}
-\definecolor{orange2}{rgb}{0.93,0.60,0.00}
-\definecolor{orange3}{rgb}{0.80,0.52,0.00}
-\definecolor{orange4}{rgb}{0.55,0.35,0.00}
-\definecolor{yellow}{rgb}{0.88,0.88,0.00}
-\definecolor{purple}{rgb}{0.78,0.00,0.78}
-\definecolor{light_blue}{rgb}{0.00,0.49,0.98}
-\definecolor{light_green}{rgb}{0.49,0.98,0.00}
-\definecolor{light_purple}{rgb}{0.57,0.00,0.98}
-\definecolor{pink}{rgb}{0.98,0.00,0.49}
-\definecolor{peach}{rgb}{0.98,0.49,0.49}
-\definecolor{olive}{rgb}{0.49,0.49,0.00}
-\definecolor{plum}{rgb}{0.49,0.00,0.49}
-\definecolor{turquoise}{rgb}{0.00,0.49,0.49}
-\definecolor{mauve}{rgb}{0.78,0.49,0.49}
-\definecolor{brown}{rgb}{0.63,0.31,0.00}
-\definecolor{grey}{rgb}{0.88,0.88,0.88}
-\definecolor{HotPink}{rgb}{1.00,0.41,0.71}
-\definecolor{PaleGreen1}{rgb}{0.60,1.00,0.60}
-\definecolor{PaleGreen2}{rgb}{0.56,0.93,0.56}
-\definecolor{PaleGreen3}{rgb}{0.49,0.80,0.49}
-\definecolor{PaleGreen4}{rgb}{0.33,0.54,0.33}
-\definecolor{DarkBlue}{rgb}{0.00,0.00,0.55}
-\definecolor{BlueViolet}{rgb}{0.54,0.17,0.89}
-\definecolor{PeachPuff}{rgb}{1.00,0.85,0.73}
-\definecolor{PeachPuff1}{rgb}{1.00,0.85,0.73}
-\definecolor{PeachPuff2}{rgb}{0.93,0.80,0.68}
-\definecolor{PeachPuff3}{rgb}{0.80,0.69,0.58}
-\definecolor{PeachPuff4}{rgb}{0.55,0.47,0.40}
-\definecolor{chocolate1}{rgb}{1.00,0.50,0.14}
-\definecolor{chocolate2}{rgb}{0.93,0.46,0.13}
-\definecolor{chocolate3}{rgb}{0.80,0.40,0.11}
-\definecolor{chocolate4}{rgb}{0.55,0.27,0.07}
-\definecolor{LightGreen}{rgb}{0.56,0.93,0.56}
-\definecolor{lavender}{rgb}{0.90,0.90,0.98}
-\definecolor{MediumPurple}{rgb}{0.58,0.44,0.86}
-\definecolor{DarkOrange}{rgb}{1.00,0.50,0.00}
-\definecolor{DarkOrange2}{rgb}{0.93,0.46,0.00}
-\definecolor{DarkOrange3}{rgb}{0.80,0.40,0.00}
-\definecolor{DarkOrange4}{rgb}{0.55,0.27,0.00}
-\definecolor{SlateBlue}{rgb}{0.42,0.35,0.80}
-\definecolor{BlueViolet}{rgb}{0.54,0.17,0.89}
-\definecolor{RoyalBlue}{rgb}{0.25,0.41,0.88}
-\definecolor{AntiqueWhite}{rgb}{0.98,0.92,0.84}
-\definecolor{AntiqueWhite1}{rgb}{1.00,0.94,0.86}
-\definecolor{AntiqueWhite2}{rgb}{0.93,0.87,0.80}
-\definecolor{AntiqueWhite3}{rgb}{0.80,0.75,0.69}
-\definecolor{AntiqueWhite4}{rgb}{0.55,0.51,0.47}
-\definecolor{CadetBlue}{rgb}{0.37,0.62,0.63}
-\definecolor{CadetBlue1}{rgb}{0.60,0.96,1.00}
-\definecolor{CadetBlue2}{rgb}{0.56,0.90,0.93}
-\definecolor{CadetBlue3}{rgb}{0.48,0.77,0.80}
-\definecolor{CadetBlue4}{rgb}{0.33,0.53,0.55}
-\definecolor{DarkGoldenrod}{rgb}{0.72,0.53,0.04}
-\definecolor{DarkGoldenrod1}{rgb}{1.00,0.73,0.06}
-\definecolor{DarkGoldenrod2}{rgb}{0.93,0.68,0.05}
-\definecolor{DarkGoldenrod3}{rgb}{0.80,0.58,0.05}
-\definecolor{DarkGoldenrod4}{rgb}{0.55,0.40,0.03}
-\definecolor{DarkOliveGreen}{rgb}{0.33,0.42,0.18}
-\definecolor{DarkOliveGreen1}{rgb}{0.79,1.00,0.44}
-\definecolor{DarkOliveGreen2}{rgb}{0.74,0.93,0.41}
-\definecolor{DarkOliveGreen3}{rgb}{0.64,0.80,0.35}
-\definecolor{DarkOliveGreen4}{rgb}{0.43,0.55,0.24}
-\definecolor{DarkOrange1}{rgb}{1.00,0.50,0.00}
-\definecolor{DarkOrchid}{rgb}{0.60,0.20,0.80}
-\definecolor{DarkOrchid1}{rgb}{0.75,0.24,1.00}
-\definecolor{DarkOrchid2}{rgb}{0.70,0.23,0.93}
-\definecolor{DarkOrchid3}{rgb}{0.60,0.20,0.80}
-\definecolor{DarkOrchid4}{rgb}{0.41,0.13,0.55}
-\definecolor{DarkSeaGreen}{rgb}{0.56,0.74,0.56}
-\definecolor{DarkSeaGreen1}{rgb}{0.76,1.00,0.76}
-\definecolor{DarkSeaGreen2}{rgb}{0.71,0.93,0.71}
-\definecolor{DarkSeaGreen3}{rgb}{0.61,0.80,0.61}
-\definecolor{DarkSeaGreen4}{rgb}{0.41,0.55,0.41}
-\definecolor{DarkSlateGray}{rgb}{0.18,0.31,0.31}
-\definecolor{DarkSlateGray1}{rgb}{0.59,1.00,1.00}
-\definecolor{DarkSlateGray2}{rgb}{0.55,0.93,0.93}
-\definecolor{DarkSlateGray3}{rgb}{0.47,0.80,0.80}
-\definecolor{DarkSlateGray4}{rgb}{0.32,0.55,0.55}
-\definecolor{DeepPink}{rgb}{1.00,0.08,0.58}
-\definecolor{DeepPink1}{rgb}{1.00,0.08,0.58}
-\definecolor{DeepPink2}{rgb}{0.93,0.07,0.54}
-\definecolor{DeepPink3}{rgb}{0.80,0.06,0.46}
-\definecolor{DeepPink4}{rgb}{0.55,0.04,0.31}
-\definecolor{DeepSkyBlue}{rgb}{0.00,0.75,1.00}
-\definecolor{DeepSkyBlue1}{rgb}{0.00,0.75,1.00}
-\definecolor{DeepSkyBlue2}{rgb}{0.00,0.70,0.93}
-\definecolor{DeepSkyBlue3}{rgb}{0.00,0.60,0.80}
-\definecolor{DeepSkyBlue4}{rgb}{0.00,0.41,0.55}
-\definecolor{DodgerBlue}{rgb}{0.12,0.56,1.00}
-\definecolor{DodgerBlue1}{rgb}{0.12,0.56,1.00}
-\definecolor{DodgerBlue2}{rgb}{0.11,0.53,0.93}
-\definecolor{DodgerBlue3}{rgb}{0.09,0.45,0.80}
-\definecolor{DodgerBlue4}{rgb}{0.06,0.31,0.55}
-\definecolor{HotPink1}{rgb}{1.00,0.43,0.71}
-\definecolor{HotPink2}{rgb}{0.93,0.42,0.65}
-\definecolor{HotPink3}{rgb}{0.80,0.38,0.56}
-\definecolor{HotPink4}{rgb}{0.55,0.23,0.38}
-\definecolor{IndianRed}{rgb}{0.80,0.36,0.36}
-\definecolor{IndianRed1}{rgb}{1.00,0.42,0.42}
-\definecolor{IndianRed2}{rgb}{0.93,0.39,0.39}
-\definecolor{IndianRed3}{rgb}{0.80,0.33,0.33}
-\definecolor{IndianRed4}{rgb}{0.55,0.23,0.23}
-\definecolor{LavenderBlush}{rgb}{1.00,0.94,0.96}
-\definecolor{LavenderBlush1}{rgb}{1.00,0.94,0.96}
-\definecolor{LavenderBlush2}{rgb}{0.93,0.88,0.90}
-\definecolor{LavenderBlush3}{rgb}{0.80,0.76,0.77}
-\definecolor{LavenderBlush4}{rgb}{0.55,0.51,0.53}
-\definecolor{LemonChiffon}{rgb}{1.00,0.98,0.80}
-\definecolor{LemonChiffon1}{rgb}{1.00,0.98,0.80}
-\definecolor{LemonChiffon2}{rgb}{0.93,0.91,0.75}
-\definecolor{LemonChiffon3}{rgb}{0.80,0.79,0.65}
-\definecolor{LemonChiffon4}{rgb}{0.55,0.54,0.44}
-\definecolor{LightBlue}{rgb}{0.68,0.85,0.90}
-\definecolor{LightBlue1}{rgb}{0.75,0.94,1.00}
-\definecolor{LightBlue2}{rgb}{0.70,0.87,0.93}
-\definecolor{LightBlue3}{rgb}{0.60,0.75,0.80}
-\definecolor{LightBlue4}{rgb}{0.41,0.51,0.55}
-\definecolor{LightCyan}{rgb}{0.88,1.00,1.00}
-\definecolor{LightCyan1}{rgb}{0.88,1.00,1.00}
-\definecolor{LightCyan2}{rgb}{0.82,0.93,0.93}
-\definecolor{LightCyan3}{rgb}{0.71,0.80,0.80}
-\definecolor{LightCyan4}{rgb}{0.48,0.55,0.55}
-\definecolor{LightGoldenrod}{rgb}{0.93,0.87,0.51}
-\definecolor{LightGoldenrod1}{rgb}{1.00,0.93,0.55}
-\definecolor{LightGoldenrod2}{rgb}{0.93,0.86,0.51}
-\definecolor{LightGoldenrod3}{rgb}{0.80,0.75,0.44}
-\definecolor{LightGoldenrod4}{rgb}{0.55,0.51,0.30}
-\definecolor{LightPink}{rgb}{1.00,0.71,0.76}
-\definecolor{LightPink1}{rgb}{1.00,0.68,0.73}
-\definecolor{LightPink2}{rgb}{0.93,0.64,0.68}
-\definecolor{LightPink3}{rgb}{0.80,0.55,0.58}
-\definecolor{LightPink4}{rgb}{0.55,0.37,0.40}
-\definecolor{LightSalmon}{rgb}{1.00,0.63,0.48}
-\definecolor{LightSalmon1}{rgb}{1.00,0.63,0.48}
-\definecolor{LightSalmon2}{rgb}{0.93,0.58,0.45}
-\definecolor{LightSalmon3}{rgb}{0.80,0.51,0.38}
-\definecolor{LightSalmon4}{rgb}{0.55,0.34,0.26}
-\definecolor{LightSkyBlue}{rgb}{0.53,0.81,0.98}
-\definecolor{LightSkyBlue1}{rgb}{0.69,0.89,1.00}
-\definecolor{LightSkyBlue2}{rgb}{0.64,0.83,0.93}
-\definecolor{LightSkyBlue3}{rgb}{0.55,0.71,0.80}
-\definecolor{LightSkyBlue4}{rgb}{0.38,0.48,0.55}
-\definecolor{LightSteelBlue}{rgb}{0.69,0.77,0.87}
-\definecolor{LightSteelBlue1}{rgb}{0.79,0.88,1.00}
-\definecolor{LightSteelBlue2}{rgb}{0.74,0.82,0.93}
-\definecolor{LightSteelBlue3}{rgb}{0.64,0.71,0.80}
-\definecolor{LightSteelBlue4}{rgb}{0.43,0.48,0.55}
-\definecolor{LightYellow}{rgb}{1.00,1.00,0.88}
-\definecolor{LightYellow1}{rgb}{1.00,1.00,0.88}
-\definecolor{LightYellow2}{rgb}{0.93,0.93,0.82}
-\definecolor{LightYellow3}{rgb}{0.80,0.80,0.71}
-\definecolor{LightYellow4}{rgb}{0.55,0.55,0.48}
-\definecolor{MediumOrchid}{rgb}{0.73,0.33,0.83}
-\definecolor{MediumOrchid1}{rgb}{0.88,0.40,1.00}
-\definecolor{MediumOrchid2}{rgb}{0.82,0.37,0.93}
-\definecolor{MediumOrchid3}{rgb}{0.71,0.32,0.80}
-\definecolor{MediumOrchid4}{rgb}{0.48,0.22,0.55}
-\definecolor{MediumPurple1}{rgb}{0.67,0.51,1.00}
-\definecolor{MediumPurple2}{rgb}{0.62,0.47,0.93}
-\definecolor{MediumPurple3}{rgb}{0.54,0.41,0.80}
-\definecolor{MediumPurple4}{rgb}{0.36,0.28,0.55}
-\definecolor{MistyRose}{rgb}{1.00,0.89,0.88}
-\definecolor{MistyRose1}{rgb}{1.00,0.89,0.88}
-\definecolor{MistyRose2}{rgb}{0.93,0.84,0.82}
-\definecolor{MistyRose3}{rgb}{0.80,0.72,0.71}
-\definecolor{MistyRose4}{rgb}{0.55,0.49,0.48}
-\definecolor{NavajoWhite}{rgb}{1.00,0.87,0.68}
-\definecolor{NavajoWhite1}{rgb}{1.00,0.87,0.68}
-\definecolor{NavajoWhite2}{rgb}{0.93,0.81,0.63}
-\definecolor{NavajoWhite3}{rgb}{0.80,0.70,0.55}
-\definecolor{NavajoWhite4}{rgb}{0.55,0.47,0.37}
-\definecolor{OliveDrab}{rgb}{0.42,0.56,0.14}
-\definecolor{OliveDrab1}{rgb}{0.75,1.00,0.24}
-\definecolor{OliveDrab2}{rgb}{0.70,0.93,0.23}
-\definecolor{OliveDrab3}{rgb}{0.60,0.80,0.20}
-\definecolor{OliveDrab4}{rgb}{0.41,0.55,0.13}
-\definecolor{OrangeRed}{rgb}{1.00,0.27,0.00}
-\definecolor{OrangeRed1}{rgb}{1.00,0.27,0.00}
-\definecolor{OrangeRed2}{rgb}{0.93,0.25,0.00}
-\definecolor{OrangeRed3}{rgb}{0.80,0.22,0.00}
-\definecolor{OrangeRed4}{rgb}{0.55,0.15,0.00}
-\definecolor{PaleGreen}{rgb}{0.60,0.98,0.60}
-\definecolor{PaleTurquoise}{rgb}{0.69,0.93,0.93}
-\definecolor{PaleTurquoise1}{rgb}{0.73,1.00,1.00}
-\definecolor{PaleTurquoise2}{rgb}{0.68,0.93,0.93}
-\definecolor{PaleTurquoise3}{rgb}{0.59,0.80,0.80}
-\definecolor{PaleTurquoise4}{rgb}{0.40,0.55,0.55}
-\definecolor{PaleVioletRed}{rgb}{0.86,0.44,0.58}
-\definecolor{PaleVioletRed1}{rgb}{1.00,0.51,0.67}
-\definecolor{PaleVioletRed2}{rgb}{0.93,0.47,0.62}
-\definecolor{PaleVioletRed3}{rgb}{0.80,0.41,0.54}
-\definecolor{PaleVioletRed4}{rgb}{0.55,0.28,0.36}
-\definecolor{RosyBrown}{rgb}{0.74,0.56,0.56}
-\definecolor{RosyBrown1}{rgb}{1.00,0.76,0.76}
-\definecolor{RosyBrown2}{rgb}{0.93,0.71,0.71}
-\definecolor{RosyBrown3}{rgb}{0.80,0.61,0.61}
-\definecolor{RosyBrown4}{rgb}{0.55,0.41,0.41}
-\definecolor{RoyalBlue1}{rgb}{0.28,0.46,1.00}
-\definecolor{RoyalBlue2}{rgb}{0.26,0.43,0.93}
-\definecolor{RoyalBlue3}{rgb}{0.23,0.37,0.80}
-\definecolor{RoyalBlue4}{rgb}{0.15,0.25,0.55}
-\definecolor{SeaGreen}{rgb}{0.18,0.55,0.34}
-\definecolor{SeaGreen1}{rgb}{0.33,1.00,0.62}
-\definecolor{SeaGreen2}{rgb}{0.31,0.93,0.58}
-\definecolor{SeaGreen3}{rgb}{0.26,0.80,0.50}
-\definecolor{SeaGreen4}{rgb}{0.18,0.55,0.34}
-\definecolor{SkyBlue}{rgb}{0.53,0.81,0.92}
-\definecolor{SkyBlue1}{rgb}{0.53,0.81,1.00}
-\definecolor{SkyBlue2}{rgb}{0.49,0.75,0.93}
-\definecolor{SkyBlue3}{rgb}{0.42,0.65,0.80}
-\definecolor{SkyBlue4}{rgb}{0.29,0.44,0.55}
-\definecolor{SlateBlue1}{rgb}{0.51,0.44,1.00}
-\definecolor{SlateBlue2}{rgb}{0.48,0.40,0.93}
-\definecolor{SlateBlue3}{rgb}{0.41,0.35,0.80}
-\definecolor{SlateBlue4}{rgb}{0.28,0.24,0.55}
-\definecolor{SlateGray}{rgb}{0.44,0.50,0.56}
-\definecolor{SlateGray1}{rgb}{0.78,0.89,1.00}
-\definecolor{SlateGray2}{rgb}{0.73,0.83,0.93}
-\definecolor{SlateGray3}{rgb}{0.62,0.71,0.80}
-\definecolor{SlateGray4}{rgb}{0.42,0.48,0.55}
-\definecolor{SpringGreen}{rgb}{0.00,1.00,0.50}
-\definecolor{SpringGreen1}{rgb}{0.00,1.00,0.50}
-\definecolor{SpringGreen2}{rgb}{0.00,0.93,0.46}
-\definecolor{SpringGreen3}{rgb}{0.00,0.80,0.40}
-\definecolor{SpringGreen4}{rgb}{0.00,0.55,0.27}
-\definecolor{SteelBlue}{rgb}{0.27,0.51,0.71}
-\definecolor{SteelBlue1}{rgb}{0.39,0.72,1.00}
-\definecolor{SteelBlue2}{rgb}{0.36,0.67,0.93}
-\definecolor{SteelBlue3}{rgb}{0.31,0.58,0.80}
-\definecolor{SteelBlue4}{rgb}{0.21,0.39,0.55}
-\definecolor{VioletRed}{rgb}{0.82,0.13,0.56}
-\definecolor{VioletRed1}{rgb}{1.00,0.24,0.59}
-\definecolor{VioletRed2}{rgb}{0.93,0.23,0.55}
-\definecolor{VioletRed3}{rgb}{0.80,0.20,0.47}
-\definecolor{VioletRed4}{rgb}{0.55,0.13,0.32}
-\definecolor{aquamarine}{rgb}{0.50,1.00,0.83}
-\definecolor{aquamarine1}{rgb}{0.50,1.00,0.83}
-\definecolor{aquamarine2}{rgb}{0.46,0.93,0.78}
-\definecolor{aquamarine3}{rgb}{0.40,0.80,0.67}
-\definecolor{aquamarine4}{rgb}{0.27,0.55,0.45}
-\definecolor{azure}{rgb}{0.94,1.00,1.00}
-\definecolor{azure1}{rgb}{0.94,1.00,1.00}
-\definecolor{azure2}{rgb}{0.88,0.93,0.93}
-\definecolor{azure3}{rgb}{0.76,0.80,0.80}
-\definecolor{azure4}{rgb}{0.51,0.55,0.55}
-\definecolor{bisque}{rgb}{1.00,0.89,0.77}
-\definecolor{bisque1}{rgb}{1.00,0.89,0.77}
-\definecolor{bisque2}{rgb}{0.93,0.84,0.72}
-\definecolor{bisque3}{rgb}{0.80,0.72,0.62}
-\definecolor{bisque4}{rgb}{0.55,0.49,0.42}
-\definecolor{blue1}{rgb}{0.00,0.00,1.00}
-\definecolor{blue2}{rgb}{0.00,0.00,0.93}
-\definecolor{blue3}{rgb}{0.00,0.00,0.80}
-\definecolor{blue4}{rgb}{0.00,0.00,0.55}
-\definecolor{brown1}{rgb}{1.00,0.25,0.25}
-\definecolor{brown2}{rgb}{0.93,0.23,0.23}
-\definecolor{brown3}{rgb}{0.80,0.20,0.20}
-\definecolor{brown4}{rgb}{0.55,0.14,0.14}
-\definecolor{burlywood}{rgb}{0.87,0.72,0.53}
-\definecolor{burlywood1}{rgb}{1.00,0.83,0.61}
-\definecolor{burlywood2}{rgb}{0.93,0.77,0.57}
-\definecolor{burlywood3}{rgb}{0.80,0.67,0.49}
-\definecolor{burlywood4}{rgb}{0.55,0.45,0.33}
-\definecolor{chartreuse}{rgb}{0.50,1.00,0.00}
-\definecolor{chartreuse1}{rgb}{0.50,1.00,0.00}
-\definecolor{chartreuse2}{rgb}{0.46,0.93,0.00}
-\definecolor{chartreuse3}{rgb}{0.40,0.80,0.00}
-\definecolor{chartreuse4}{rgb}{0.27,0.55,0.00}
-\definecolor{chocolate}{rgb}{0.82,0.41,0.12}
-\definecolor{coral}{rgb}{1.00,0.50,0.31}
-\definecolor{coral1}{rgb}{1.00,0.45,0.34}
-\definecolor{coral2}{rgb}{0.93,0.42,0.31}
-\definecolor{coral3}{rgb}{0.80,0.36,0.27}
-\definecolor{coral4}{rgb}{0.55,0.24,0.18}
-\definecolor{cornsilk}{rgb}{1.00,0.97,0.86}
-\definecolor{cornsilk1}{rgb}{1.00,0.97,0.86}
-\definecolor{cornsilk2}{rgb}{0.93,0.91,0.80}
-\definecolor{cornsilk3}{rgb}{0.80,0.78,0.69}
-\definecolor{cornsilk4}{rgb}{0.55,0.53,0.47}
-\definecolor{cyan}{rgb}{0.00,1.00,1.00}
-\definecolor{cyan1}{rgb}{0.00,1.00,1.00}
-\definecolor{cyan2}{rgb}{0.00,0.93,0.93}
-\definecolor{cyan3}{rgb}{0.00,0.80,0.80}
-\definecolor{cyan4}{rgb}{0.00,0.55,0.55}
-\definecolor{firebrick}{rgb}{0.70,0.13,0.13}
-\definecolor{firebrick1}{rgb}{1.00,0.19,0.19}
-\definecolor{firebrick2}{rgb}{0.93,0.17,0.17}
-\definecolor{firebrick3}{rgb}{0.80,0.15,0.15}
-\definecolor{firebrick4}{rgb}{0.55,0.10,0.10}
-\definecolor{gold}{rgb}{1.00,0.84,0.00}
-\definecolor{gold1}{rgb}{1.00,0.84,0.00}
-\definecolor{gold2}{rgb}{0.93,0.79,0.00}
-\definecolor{gold3}{rgb}{0.80,0.68,0.00}
-\definecolor{gold4}{rgb}{0.55,0.46,0.00}
-\definecolor{goldenrod}{rgb}{0.85,0.65,0.13}
-\definecolor{goldenrod1}{rgb}{1.00,0.76,0.15}
-\definecolor{goldenrod2}{rgb}{0.93,0.71,0.13}
-\definecolor{goldenrod3}{rgb}{0.80,0.61,0.11}
-\definecolor{goldenrod4}{rgb}{0.55,0.41,0.08}
-\definecolor{gray}{rgb}{0.75,0.75,0.75}
-\definecolor{gray1}{rgb}{0.01,0.01,0.01}
-\definecolor{gray2}{rgb}{0.02,0.02,0.02}
-\definecolor{gray3}{rgb}{0.03,0.03,0.03}
-\definecolor{gray4}{rgb}{0.04,0.04,0.04}
-\definecolor{green1}{rgb}{0.00,1.00,0.00}
-\definecolor{green2}{rgb}{0.00,0.93,0.00}
-\definecolor{green3}{rgb}{0.00,0.80,0.00}
-\definecolor{green4}{rgb}{0.00,0.55,0.00}
-\definecolor{grey1}{rgb}{0.01,0.01,0.01}
-\definecolor{grey2}{rgb}{0.02,0.02,0.02}
-\definecolor{grey3}{rgb}{0.03,0.03,0.03}
-\definecolor{grey4}{rgb}{0.04,0.04,0.04}
-\definecolor{honeydew}{rgb}{0.94,1.00,0.94}
-\definecolor{honeydew1}{rgb}{0.94,1.00,0.94}
-\definecolor{honeydew2}{rgb}{0.88,0.93,0.88}
-\definecolor{honeydew3}{rgb}{0.76,0.80,0.76}
-\definecolor{honeydew4}{rgb}{0.51,0.55,0.51}
-\definecolor{ivory}{rgb}{1.00,1.00,0.94}
-\definecolor{ivory1}{rgb}{1.00,1.00,0.94}
-\definecolor{ivory2}{rgb}{0.93,0.93,0.88}
-\definecolor{ivory3}{rgb}{0.80,0.80,0.76}
-\definecolor{ivory4}{rgb}{0.55,0.55,0.51}
-\definecolor{khaki}{rgb}{0.94,0.90,0.55}
-\definecolor{khaki1}{rgb}{1.00,0.96,0.56}
-\definecolor{khaki2}{rgb}{0.93,0.90,0.52}
-\definecolor{khaki3}{rgb}{0.80,0.78,0.45}
-\definecolor{khaki4}{rgb}{0.55,0.53,0.31}
-\definecolor{magenta}{rgb}{1.00,0.00,1.00}
-\definecolor{magenta1}{rgb}{1.00,0.00,1.00}
-\definecolor{magenta2}{rgb}{0.93,0.00,0.93}
-\definecolor{magenta3}{rgb}{0.80,0.00,0.80}
-\definecolor{magenta4}{rgb}{0.55,0.00,0.55}
-\definecolor{maroon}{rgb}{0.69,0.19,0.38}
-\definecolor{maroon1}{rgb}{1.00,0.20,0.70}
-\definecolor{maroon2}{rgb}{0.93,0.19,0.65}
-\definecolor{maroon3}{rgb}{0.80,0.16,0.56}
-\definecolor{maroon4}{rgb}{0.55,0.11,0.38}
-\definecolor{orange1}{rgb}{1.00,0.65,0.00}
-\definecolor{orchid}{rgb}{0.85,0.44,0.84}
-\definecolor{orchid1}{rgb}{1.00,0.51,0.98}
-\definecolor{orchid2}{rgb}{0.93,0.48,0.91}
-\definecolor{orchid3}{rgb}{0.80,0.41,0.79}
-\definecolor{orchid4}{rgb}{0.55,0.28,0.54}
-\definecolor{pink1}{rgb}{1.00,0.71,0.77}
-\definecolor{pink2}{rgb}{0.93,0.66,0.72}
-\definecolor{pink3}{rgb}{0.80,0.57,0.62}
-\definecolor{pink4}{rgb}{0.55,0.39,0.42}
-\definecolor{plum1}{rgb}{1.00,0.73,1.00}
-\definecolor{plum2}{rgb}{0.93,0.68,0.93}
-\definecolor{plum3}{rgb}{0.80,0.59,0.80}
-\definecolor{plum4}{rgb}{0.55,0.40,0.55}
-\definecolor{purple1}{rgb}{0.61,0.19,1.00}
-\definecolor{purple2}{rgb}{0.57,0.17,0.93}
-\definecolor{purple3}{rgb}{0.49,0.15,0.80}
-\definecolor{purple4}{rgb}{0.33,0.10,0.55}
-\definecolor{red1}{rgb}{1.00,0.00,0.00}
-\definecolor{red2}{rgb}{0.93,0.00,0.00}
-\definecolor{red3}{rgb}{0.80,0.00,0.00}
-\definecolor{red4}{rgb}{0.55,0.00,0.00}
-\definecolor{salmon}{rgb}{0.98,0.50,0.45}
-\definecolor{salmon1}{rgb}{1.00,0.55,0.41}
-\definecolor{salmon2}{rgb}{0.93,0.51,0.38}
-\definecolor{salmon3}{rgb}{0.80,0.44,0.33}
-\definecolor{salmon4}{rgb}{0.55,0.30,0.22}
-\definecolor{seashell}{rgb}{1.00,0.96,0.93}
-\definecolor{seashell1}{rgb}{1.00,0.96,0.93}
-\definecolor{seashell2}{rgb}{0.93,0.90,0.87}
-\definecolor{seashell3}{rgb}{0.80,0.77,0.75}
-\definecolor{seashell4}{rgb}{0.55,0.53,0.51}
-\definecolor{sienna}{rgb}{0.63,0.32,0.18}
-\definecolor{sienna1}{rgb}{1.00,0.51,0.28}
-\definecolor{sienna2}{rgb}{0.93,0.47,0.26}
-\definecolor{sienna3}{rgb}{0.80,0.41,0.22}
-\definecolor{sienna4}{rgb}{0.55,0.28,0.15}
-\definecolor{snow}{rgb}{1.00,0.98,0.98}
-\definecolor{snow1}{rgb}{1.00,0.98,0.98}
-\definecolor{snow2}{rgb}{0.93,0.91,0.91}
-\definecolor{snow3}{rgb}{0.80,0.79,0.79}
-\definecolor{snow4}{rgb}{0.55,0.54,0.54}
-\definecolor{tan}{rgb}{0.82,0.71,0.55}
-\definecolor{tan1}{rgb}{1.00,0.65,0.31}
-\definecolor{tan2}{rgb}{0.93,0.60,0.29}
-\definecolor{tan3}{rgb}{0.80,0.52,0.25}
-\definecolor{tan4}{rgb}{0.55,0.35,0.17}
-\definecolor{thistle}{rgb}{0.85,0.75,0.85}
-\definecolor{thistle1}{rgb}{1.00,0.88,1.00}
-\definecolor{thistle2}{rgb}{0.93,0.82,0.93}
-\definecolor{thistle3}{rgb}{0.80,0.71,0.80}
-\definecolor{thistle4}{rgb}{0.55,0.48,0.55}
-\definecolor{tomato}{rgb}{1.00,0.39,0.28}
-\definecolor{tomato1}{rgb}{1.00,0.39,0.28}
-\definecolor{tomato2}{rgb}{0.93,0.36,0.26}
-\definecolor{tomato3}{rgb}{0.80,0.31,0.22}
-\definecolor{tomato4}{rgb}{0.55,0.21,0.15}
-\definecolor{turquoise1}{rgb}{0.00,0.96,1.00}
-\definecolor{turquoise2}{rgb}{0.00,0.90,0.93}
-\definecolor{turquoise3}{rgb}{0.00,0.77,0.80}
-\definecolor{turquoise4}{rgb}{0.00,0.53,0.55}
-\definecolor{wheat}{rgb}{0.96,0.87,0.70}
-\definecolor{wheat1}{rgb}{1.00,0.91,0.73}
-\definecolor{wheat2}{rgb}{0.93,0.85,0.68}
-\definecolor{wheat3}{rgb}{0.80,0.73,0.59}
-\definecolor{wheat4}{rgb}{0.55,0.49,0.40}
-\definecolor{yellow1}{rgb}{1.00,1.00,0.00}
-\definecolor{yellow2}{rgb}{0.93,0.93,0.00}
-\definecolor{yellow3}{rgb}{0.80,0.80,0.00}
-\definecolor{yellow4}{rgb}{0.55,0.55,0.00}
diff --git a/doc/LaTeX/stackedbars.png b/doc/LaTeX/stackedbars.png
deleted file mode 100644
index f440c26..0000000
--- a/doc/LaTeX/stackedbars.png
+++ /dev/null
Binary files differ
diff --git a/doc/LaTeX/stunde.png b/doc/LaTeX/stunde.png
deleted file mode 100644
index b088d02..0000000
--- a/doc/LaTeX/stunde.png
+++ /dev/null
Binary files differ
diff --git a/lib/Chart.pm b/lib/Chart.pm
index 06412c3..6fbd654 100644
--- a/lib/Chart.pm
+++ b/lib/Chart.pm
@@ -1,6 +1,26 @@
+use v5.12;
package Chart;
-our $VERSION = 2.401.1;
+our $VERSION = 'v2.403.2';
+
+use Chart::Points;
+use Chart::Lines;
+use Chart::LinesPoints;
+use Chart::Mountain;
+
+use Chart::ErrorBars;
+use Chart::Direction;
+use Chart::Split;
+use Chart::Pareto;
+use Chart::Composite;
+
+use Chart::Bars;
+use Chart::HorizontalBars;
+use Chart::StackedBars;
+
+use Chart::Pie;
+
+
1;
@@ -8,7 +28,7 @@ our $VERSION = 2.401.1;
=head1 NAME
-Chart - a series of charting modules
+Chart - a series of charting modules
=head1 SYNOPSIS
@@ -48,17 +68,19 @@ Chart - a series of charting modules
=head1 DESCRIPTION
-These man-pages give you the most important information about Chart.
-There is also a complete documentation (Documentation.pdf) within
-the Chart package. Look at it to get more information.
-This module is an attempt to build a general purpose graphing module
-that is easily modified and expanded. I borrowed most of the API
-from Martien Verbruggen's GIFgraph module. I liked most of GIFgraph,
-but I thought it was to difficult to modify, and it was missing a few
-things that I needed, most notably legends. So I decided to write
-a new module from scratch, and I've designed it from the bottom up
-to be easy to modify. Like GIFgraph, Chart uses Lincoln Stein's GD
-module for all of its graphics primitives calls.
+Chart help you to create PNG and JPG images with visualizations of numeric data.
+This page gives you a summary how to use it.
+For a more thorough documentation please visit the L<Chart::Manual>.
+
+
+=for HTML <p>
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/test/samples/stackedbars.png" alt="stacked bars">
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/test/samples/bars_2.png" alt="multi bar chart">
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/test/samples/hbars_2.png" alt="horizontal bar chart">
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/test/samples/direction_4.png" alt="polar chart">
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/test/samples/pie_4.png" alt="pie chart">
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/test/samples/split_2.png" alt="multi chart">
+</p>
=head2 use-ing Chart
@@ -73,6 +95,9 @@ For example,
use Chart::Lines;
would invoke the lines module.
+Alternatively write to load all chart types at ones with
+
+ use Chart;
=head2 Getting an object
@@ -100,452 +125,9 @@ or you can try just constructing the hash inside the set call, like
$obj->set ('title' => 'Foo Bar');
-The following are all of the currently supported options:
-
-=over 4
-
-=item 'transparent'
-
-Makes the background of the image transparent if set to 'true'. Useful
-for making web page images. Default is 'false'.
-
-=item 'png_border'
-
-Sets the number of pixels used as a border between the graph
-and the edges of the png/j-peg. Defaults to 10.
-
-=item 'graph_border'
-
-Sets the number of pixels used as a border between the title/labels
-and the actual graph within the png. Defaults to 10.
-
-=item 'text_space'
-
-Sets the amount of space left on the sides of text, to make it more
-readable. Defaults to 2.
-
-=item 'title'
-
-Tells GD graph what to use for the title of the graph. If empty,
-no title is drawn. It recognizes '\n' as a newline, and acts accordingly.
-Remember, if you want to use normal quotation marks instead of single
-quotation marks then you have to quote "\\n". Default is empty.
-
-=item 'sub_title'
-
-Write a sub-title under the title in smaller letters.
-
-=item 'x_label'
-
-Tells Chart what to use for the x-axis label. If empty, no label
-is drawn. Default is empty.
-
-=item 'y_label', 'y_label2'
-
-Tells Chart what to use for the y-axis labels. If empty, no label
-is drawn. Default is empty.
-
-=item 'legend'
-
-Specifies the placement of the legend. Valid values are 'left', 'right',
-'top', 'bottom'. Setting this to 'none' tells chart not to draw a
-legend. Default is 'right'.
-
-=item 'legend_labels'
-
-Sets the values for the labels for the different data sets. Should
-be assigned a reference to an array of labels. For example,
-
- @labels = ('foo', 'bar');
- $obj->set ('legend_labels' => \@labels);
-
-Default is empty, in which case 'Dataset 1', 'Dataset 2', etc. are
-used as the labels.
-
-
-=item 'tick_len'
-
-Sets the length of the x- and y-ticks in pixels. Default is 4.
-
-=item 'x_ticks'
-
-Specifies how to draw the x-tick labels. Valid values are 'normal',
-'staggered' (staggers the labels vertically), and 'vertical' (the
-labels are draw upwards). Default is 'normal'.
-
-=item 'xy_plot'
-
-Forces Chart to plot a x-y-graph, which means, that the x-axis is also
-numeric if set to 'true'. Very useful for mathematical graphs.
-Works for Lines, Points, LinesPoints and ErrorBars. Split makes always a
-xy_plot. Defaults to 'false'.
-
-=item 'min_y_ticks'
-
-Sets the minimum number of y_ticks to draw when generating a scale.
-Default is 6, The minimum is 2.
-
-=item 'max_y_ticks'
-
-Sets the maximum number of y_ticks to draw when generating a scale.
-Default is 100. This limit is used to avoid plotting an unreasonable
-large number of ticks if non-round values are used for the min_val
-and max_val.
-
-The value for 'max_y_ticks' should be at least 5 times larger than
-'min_y_ticks'.
-
-=item 'max_x_ticks', 'min_x_ticks'
-
-Work similar as 'max_y_ticks' and 'min_y_ticks'. Of course, only for a
-xy_plot.
-
-=item 'integer_ticks_only'
-
-Specifies how to draw the x- and y-ticks: as floating point
-('false', '0') or as integer numbers ('true', 1). Default: 'false'
-
-=item 'skip_int_ticks'
-
-If 'integer_ticks_only' was set to 'true' the labels and ticks will
-be drawn every nth tick. Of course in horizontalBars it affects the
-x-axis. Default to 1, no skipping.
-
-=item 'precision'
-
-Sets the number of numerals after the decimal point. Affects in most
-cases the y-axis. But also the x-axis if 'xy_plot' was set and also
-the labels in a pie chart. Defaults to 3.
-
-=item 'max_val'
-
-Sets the maximum y-value on the graph, overriding the normal auto-scaling.
-Default is undef.
-
-=item 'min_val'
-
-Sets the minimum y-value on the graph, overriding the normal auto-scaling.
-Default is undef.
-
-Caution should be used when setting 'max_val' and 'min_val' to floating
-point or non-round numbers. This is because the scale must start & end
-on a tick, ticks must have round-number intervals, and include round
-numbers.
-
-Example: Suppose your data set has a range of 35-114 units. If you specify
-them as the 'min_val' & 'max_val', the y_axis will be plotted with 80 ticks
-every 1 unit.. If no 'min_val' & 'max_val', the system will auto scale the
-range to 30-120 with 10 ticks every 10 units.
-
-If the 'min_val' & 'max_val' are specified to excessive precision, they may
-be overridden by the system, plotting a maximum 'max_y_ticks' ticks.
-
-=item 'include_zero'
-
-If 'true', forces the y-axis to include zero if it is not in the dataset
-range. Default is 'false'.
-
-In general, it is better to use this, than to set the 'min_val' if that
-is all you want to achieve.
-
-=item 'pt_size'
-
-Sets the radius of the points (for Chart::Points, etc.) in pixels.
-Default is 18.
-
-=item 'brush_size'
-
-Sets the width of the lines (for Chart::Lines, etc.) in pixels.
-Default is 6.
-
-=item 'brushStyle'
-
-Sets the shape of points for Chart::Points, Chart::LinesPoints.
-The possibilities are 'FilledCircle', 'circle', 'donut',
-'OpenCircle', 'fatPlus', 'triangle', 'upsidedownTriangle',
-'square', 'hollowSquare', 'OpenRectangle', 'FilledDiamond',
-'OpenDiamond', 'Star', 'OpenStar'.
-Default: 'FilledCircle
-
-=item 'skip_x_ticks'
-
-Sets the number of x-ticks and x-tick labels to skip. (ie.
-if 'skip_x_ticks' was set to 4, Chart would draw every 4th x-tick
-and x-tick label). Default is undef.
-
-=item 'custom_x_ticks'
-
-Used in points, lines, linespoints, errorbars and bars charts, this option
-allows you to you to specify exactly which x-ticks and x-tick labels should
-be drawn. It should be assigned a reference to an array of desired
-ticks. Just remember that I'm counting from the 0th element of the
-array. (ie., if 'custom_x_ticks' is assigned [0,3,4], then the 0th,
-3rd, and 4th x-ticks will be displayed)
-
-=item 'f_x_tick'
-
-Needs a reference to a function which uses the x-tick labels generated by
-the '@data[0]' as the argument. The result of this function can reformat
-the labels. For instance
-
- $obj -> set ('f_x_tick' => \&formatter );
-
-An example for the function formatter: x labels are seconds since an event.
-The referenced function can transform this seconds to hour, minutes and seconds.
-
-=item 'f_y_tick'
-
-The same situation as for 'f_x_tick' but now used for y labels.
-
-=item 'colors'
-
-This option lets you control the colors the chart will use. It takes
-a reference to a hash. The hash should contain keys mapped to references
-to arrays of rgb values. For instance,
-
- $obj->set('colors' => {'background' => [255,255,255]});
-
-sets the background color to white (which is the default). Valid keys for
-this hash are
-
- 'background' (background color for the png)
- 'title' (color of the title)
- 'text' (all the text in the chart)
- 'x_label' (color of the x-axis label)
- 'y_label' (color of the first y axis label)
- 'y_label2' (color of the second y axis label)
- 'grid_lines' (color of the grid lines)
- 'x_grid_lines' (color of the x grid lines - for x axis ticks)
- 'y_grid_lines' (color of the y grid lines - for to left y axis ticks)
- 'y2_grid_lines' (color of the y2 grid lines - for right y axis ticks)
- 'dataset0'..'dataset63' (the different datasets)
- 'misc' (everything else, ie. ticks, box around the legend)
-
-NB. For composite charts, there is a limit of 8 datasets per component.
-The colors for 'dataset8' through 'dataset15' become the colors
-for 'dataset0' through 'dataset7' for the second component chart.
-
-=item 'title_font'
-
-This option changes the font of the title. The key has to be a GD font.
-eg. GD::Font->Large
-
-=item 'label_font'
-
-This option changes the font of the labels. The key has to be a GD font.
-=item 'legend_font'
+L<Chart::Manual::Properties> lists all currently supported keys and values.
-This option changes the font of the text in the legend.
-The key has to be a GD font.
-
-=item 'tick_label_font'
-
-This is the font for the tick labels. It also needs
-a GD font object as an argument.
-
-=item 'grey_background'
-
-Puts a nice soft grey background on the actual data plot when
-set to 'true'. Default is 'true'.
-
-=item 'y_axes'
-
-Tells Chart where to place the y-axis. Has no effect on Composite and Pie.
-Valid values are 'left', 'right' and 'both'. Defaults to 'left'.
-
-=item 'x_grid_lines'
-
-Draws grid lines matching up to x ticks if set to 'true'. Default is false.
-
-=item 'y_grid_lines'
-
-Draws grid lines matching up to y ticks if set to 'true'. Default is false.
-
-=item 'grid_lines'
-
-Draws grid lines matching up to x and y ticks.
-
-=item 'spaced_bars'
-
-Leaves space between the groups of bars at each data point when set
-to 'true'. This just makes it easier to read a bar chart. Default
-is 'true'.
-
-=item 'imagemap'
-
-Lets Chart know you're going to ask for information about the placement
-of the data for use in creating an image map from the png. This information
-can be retrieved using the imagemap_dump() method. NB. that the
-imagemap_dump() method cannot be called until after the Chart has been
-generated (ie. using the png() or cgi_png() methods).
-
-=item 'sort'
-
-In a xy-plot, the data will be sorted ascending if set to 'true'.
-(Should be set if the data isn't sorted, especially in Lines, Split
-and LinesPoints) In a Pareto Chart the data will be sorted descending.
-Defaults to 'false'.
-
-=item 'composite_info'
-
-This option is only used for composite charts. It contains the
-information about which types to use for the two component charts,
-and which datasets belong to which component chart. It should be
-a reference to an array of array references, containing information
-like the following
-
- $obj->set ('composite_info' => [ ['Bars', [1,2]],
- ['Lines', [3,4] ] ]);
-
-This example would set the two component charts to be a bar chart and
-a line chart. It would use the first two data sets for the bar
-chart (note that the numbering starts at 1, not zero like most of
-the other numbered things in Chart), and the second two data sets
-for the line chart. The default is undef.
-
-NB. Chart::Composite can only do two component charts.
-
-=item 'min_val1', 'min_val2'
-
-Only for composite charts, these options specify the minimum y-value
-for the first and second components respectively. Both default to
-undef.
-
-=item 'max_val1', 'max_val2'
-
-Only for composite charts, these options specify the maximum y-value
-for the first and second components respectively. Both default to
-undef.
-
-=item 'ylabel2'
-
-The label for the right y-axis (the second component chart) on a composite
-chart. Default is undef.
-
-=item 'y_ticks1', 'y_ticks2'
-
-The number of y ticks to use on the first and second y-axis on a composite
-chart. Please note that if you just set the 'y_ticks' option, both axes
-will use that number of y ticks. Both default to undef.
-
-=item 'f_y_ticks1', 'f_y_ticks2'
-
-Only for composite charts, needs a reference to a function
-which has one argument and has to return
-a string which labels the first resp. second y axis.
-Both default to undef.
-
-=item 'same_y_axes'
-
-Forces both component charts in a composite chart to use the same maximum
-and minimum y-values if set to 'true'. This helps to keep the composite
-charts from being too confusing. Default is undef.
-
-=item 'no_cache'
-
-Adds Pragma: no-cache to the http header. Be careful with this one, as
-Netscape 4.5 is unfriendly with POST using this method.
-
-=item 'legend_example_size'
-
-Sets the length of the example line in the legend in pixels. Defaults to 20.
-
-=item 'same_error'
-
-This is a option only for ErrorBars. It tells chart that you want use the same
-error value of a data point if set to 'true'. Look at the documentation
-to see how the module ErrorBars works. Default: 'false'.
-
-=item 'skip_y_ticks'
-
-Does the same for the y-axis at a HorizontalBars chart as 'skip_x_ticks'
-does for other charts. Defaults to 1.
-
-=item 'label_values'
-
-Tells a pie chart what labels to draw beside the pie. Valid values are
-'percent', 'value', 'both' and 'none'. Defaults to 'percent'.
-
-=item 'legend_label_values'
-
-Tells a pie chart what labels to draw in the legend. Valid values are
-'percent', 'value', 'both' and 'none'. Defaults to 'value'.
-
-=item 'start'
-
-Required value for a split chart. Sets the start value of the first interval.
-If the x coordinate of the first data point is zero, you should 'set' to
-zero. Default is 'undef'.
-
-=item 'interval'
-
-Also a required value for a split chart. It sets the interval of one line
-to plot. Defaults 'undef'.
-
-=item 'interval_ticks'
-
-Sets the number of ticks for the x-axis of a Split chart. Defaults to 5.
-
-=item 'scale'
-
-Every y-value of a split chart will be multiplied with that value, but
-the scale won't change. Which means that split allows one to overdraw certain
-rows! Only useful if you want to give prominence to the maximal amplitudes
-of the data. Defaults to 1.
-
-=item 'point'
-
-Indicates to draw points in a direction chart. 'true' or 'false' possible.
-Defaults to 'true'.
-
-=item 'line'
-
-If you turn this option to 'true', then direction will connect the points
-with lines. Defaults to 'false'.
-
-=item 'arrow'
-
-This is also an option for the direction module. If set to 'true', chart
-will draw a arrow from the center to the point. Defaults to 'false'.
-
-=item 'angle_interval'
-
-This option tells direction, how many angle lines should be drawn. The
-default value is 30, which means that a line will be drawn every
-30 degrees. Valid Values are: 0, 5, 10, 15, 20, 30, 45 and 60. If you
-choose 0, direction will draw no line.
-
-=item 'min_circles'
-
-Sets the minimum number of circles when generating a scale for direction.
-Default is 4, minimum is 2.
-
-=item 'max_circles'
-
-Sets the maximum number of circles when generating a scale for direction.
-Default is 100. This limit is used to avoid plotting an unreasonable
-large number of ticks if non-round values are used for the min_val and
-max_val.
-
-=item 'pairs'
-
-Only used for direction how to handle more datasets.
- If 'pairs' is set to 'true',
- Chart uses the first dataset as a set of degrees and
- the second dataset as a set of values.
- Then, the third set is a set of degrees and the fourth a set of values \dots. \\
- If 'pairs' is set to 'false',
- Chart uses the first dataset as a set of angels
- and all following datasets as sets of values.
- Defaults to 'false'.
-
-Sets the maximum number of circles when generating a scale for direction.
-Default is 100. This limit is used to avoid plotting an unreasonable
-large number of ticks if non-round values are used for the min_val and
-max_val.
-
-=back
=head2 GIFgraph.pm-style API
@@ -753,19 +335,39 @@ and ask him. Third, please remember that the 0th dataset will be empty,
since that's the place in the @data array for the data point labels.
+=head1 PLAN
+
+This module is currently under a complete rebuild, that will take place
+in two phases. First: rewrite all functionality within a modular
+architecture and hierarchical property system. This will be accessed
+via a central API using the so far unutilized Chart module
+(C<my $c = Chart->new(...);>). This API will have in part different
+method and property names, but the old API will not be touched.
+In a second phase we will see hoch much new code can be used by the old
+modules and which new features can be brought to the legacy parts,
+which will be than discouraged, but not scrapped.
+
+
=head1 TO DO
=over 4
-
=item *
-Add some 3-D graphs.
Include True Type Fonts
+
+=item *
+
Violine and Box plots
+=item *
+
+Add some 3-D graphs.
+
=back
+For more please check the TODO file.
+
=head1 BUGS
Probably quite a few, since it's been completely rewritten. As usual,
@@ -824,6 +426,8 @@ Petr Pisar (ppisar@redhat.com)
Copyright(c) 1997-1998 by David Bonner, 1999 by Peter Clark,
2001 by the Chart group at BKG-Wettzell.
+2022 by Herbert Breunung and Chart group
+
All rights reserved. This program is free software; you can
redistribute it and/or modify it under the same terms as Perl
itself.
diff --git a/lib/Chart/Bars.pm b/lib/Chart/Bars.pm
index e682af5..8e573da 100644
--- a/lib/Chart/Bars.pm
+++ b/lib/Chart/Bars.pm
@@ -5,7 +5,7 @@ use v5.12;
package Chart::Bars;
our @ISA = qw(Chart::Base);
-our $VERSION = 2.400.5;
+our $VERSION = 'v2.403.2';
use Chart::Base;
use GD;
diff --git a/lib/Chart/Base.pm b/lib/Chart/Base.pm
index 79e319b..c9958a7 100644
--- a/lib/Chart/Base.pm
+++ b/lib/Chart/Base.pm
@@ -5,19 +5,20 @@
use v5.12;
package Chart::Base;
-our $VERSION = '2.400.5';
+our $VERSION = 'v2.403.2';
use FileHandle;
use Carp;
use GD;
use GD::Image;
-use Chart::Constants;
+use Chart::Color;
+#use Chart::Font;
#>>>>>>>>>>>>>>>>>>>>>>>>>>#
# public methods #
#<<<<<<<<<<<<<<<<<<<<<<<<<<#
-sub new # Standard normal constructor
+sub new # Standard constructor
{
my $proto = shift;
my $class = ref($proto) || $proto;
@@ -43,21 +44,17 @@ sub set {
}
# set the options
- for ( keys %opts )
- {
+ for ( keys %opts ) {
$self->{$_} = $opts{$_};
$self->{saveopts}->{$_} = $opts{$_};
# if someone wants to change the grid_lines color, we should set all
# the colors of the grid_lines
- if ( $_ =~ /^colors$/ )
- {
+ if ( $_ =~ /^colors$/ ) {
my %hash = %{ $opts{$_} };
- foreach my $key ( sort keys %hash )
- {
- if ( $key =~ /^grid_lines$/ )
- {
+ foreach my $key ( sort keys %hash ) {
+ if ( $key =~ /^grid_lines$/ ) {
# ORIG:
#$self->{'colors'}{'y_grid_lines'} = $hash{'grid_lines'},
# $self->{'colors'}{'x_grid_lines'} = $hash{'grid_lines'},
@@ -78,9 +75,7 @@ sub set {
$self->{'colors'}{'x_grid_lines'} = $sLocal;
$self->{'colors'}{'y2_grid_lines'} = $sLocal;
}
- else {
- carp "colors{'grid_lines'} is not SCALAR and not ARRAY\n";
- }
+ else { carp "colors{'grid_lines'} is not SCALAR and not ARRAY\n" }
}
}
}
@@ -88,26 +83,6 @@ sub set {
return 1;
}
-## @method hash getopts()
-# @return hash of all set options so far
-#
-# @brief
-# get all options
-#
-# @details
-# @return set options as a hash
-sub getopts
-{
- my $self = shift;
- my %opts = ();
-
- foreach ( keys %{ $self->{saveopts} } )
- {
- $opts{$_} = $self->{saveopts};
- }
- return %opts;
-}
-
## @method int add_pt(@data)
# Graph API\n
# Add one dataset (as a list) to the dataref
@@ -127,8 +102,7 @@ sub getopts
#
# @param data Dataset to add
#
-sub add_pt
-{
+sub add_pt {
my $self = shift;
my @data = ();
@@ -139,15 +113,8 @@ sub add_pt
}
elsif ( ( ref \$_[0] ) =~ /^SCALAR/ )
{
- if ( defined $_[0] )
- {
- @data = @_;
- }
- }
- else
- {
- croak "Not an array or reference to array";
- }
+ @data = @_ if defined $_[0];
+ } else { croak "Not an array or reference to array" }
# error check the data (carp, don't croak)
if ( $self->{'dataref'} && ( $#{ $self->{'dataref'} } != $#data ) )
@@ -157,11 +124,8 @@ sub add_pt
}
# copy it into the dataref
- for ( 0 .. $#data )
- {
- push @{ $self->{'dataref'}->[$_] }, $data[$_];
- }
-
+ push @{ $self->{'dataref'}->[$_] }, $data[$_] for 0 .. $#data;
+
# now return
return 1;
}
@@ -225,8 +189,7 @@ sub add_dataset
# @param[in] filename Name of file which contents is to be added
# @param[in] format 'pt' or 'set' to distiguish between function add_pt() in case of 'pt'
# or function add_dataset() in case of 'set'
-sub add_datafile
-{
+sub add_datafile {
my $self = shift;
my $filename = shift;
my $format = shift;
@@ -324,8 +287,7 @@ sub get_data
# @param[in] file Name of file to write graph to
# @param[in] dataref Reference to external data space
# @return Status of the plot
-sub png
-{
+sub png {
my $self = shift;
my $file = shift;
my $dataref = shift;
@@ -395,8 +357,7 @@ sub png
# draw the chart and plot the data
# @param[in] dataref Reference to external data space
# @return Status of the plot
-sub cgi_png
-{
+sub cgi_png {
my $self = shift;
my $dataref = shift;
@@ -633,8 +594,7 @@ sub scalar_jpeg
# draw the chart and plot the data
# @param dataref Reference to data
# @return Status of the plot
-sub make_gd
-{
+sub make_gd {
my $self = shift;
my $dataref = shift;
@@ -659,8 +619,7 @@ sub make_gd
# get the information to turn the chart into an imagemap
#
# @return Reference to an array of the image
-sub imagemap_dump
-{
+sub imagemap_dump {
my $self = shift;
my $ref = [];
my ( $i, $j );
@@ -689,8 +648,7 @@ sub imagemap_dump
# determine minimum of an array of values
# @param array List of numerical values (\@array)
# @return Minimal value of list of values
-sub minimum
-{
+sub minimum {
my $self = shift;
my @array = @_;
@@ -707,8 +665,7 @@ sub minimum
# determine maximum of an array of values
# @param array List of numerical values (@array)
# @return Maximal value of list of values
-sub maximum
-{
+sub maximum {
my $self = shift;
my @array = @_;
@@ -725,8 +682,7 @@ sub maximum
# Function arccos(a)
# @param a Value
# @return arccos(a)
-sub arccos
-{
+sub arccos {
my $self = shift;
my $a = shift;
@@ -749,8 +705,7 @@ sub arcsin
# determine true value of argument
# @param[in] arg Bool value to check for true
# @return 1 if argument is equal to TRUE, true, 1, t, T, and defined
-sub true
-{
+sub true {
my $pkg = shift;
my $arg = shift;
@@ -775,8 +730,7 @@ sub true
# determine false value of argument
# @param[in] arg Bool value to check for true
# @return 1 if argument is equal to false, FALSE, 0, f, F or undefined
-sub false
-{
+sub false {
my $pkg = shift;
my $arg = shift;
@@ -804,8 +758,7 @@ sub false
# @param[in] a a in a%b
# @param[in] b b in a%b
# @return $a % $b in float
-sub modulo
-{
+sub modulo {
my $pkg = shift;
my $a = shift;
my $b = shift;
@@ -835,8 +788,7 @@ sub modulo
# @param[in] x Width of the final image in pixels (Default: 400)
# @param[in] y Height of the final image in pixels (Default: 300)
#
-sub _init
-{
+sub _init {
my $self = shift;
my $x = shift || 400; # give them a 400x300 image
my $y = shift || 300; # unless they say otherwise
@@ -1033,70 +985,23 @@ sub _init
y_label => 'black',
y_label2 => 'black',
grid_lines => 'black',
- grey_background => 'grey',
+ grey_background => 'gray90',
(
map { 'dataset' . $d++ => $_ }
- qw (red green blue purple peach orange mauve olive pink light_purple light_blue plum yellow turquoise light_green brown
- HotPink PaleGreen1 DarkBlue BlueViolet orange2 chocolate1 LightGreen pink light_purple light_blue plum yellow turquoise light_green brown
- pink PaleGreen2 MediumPurple PeachPuff1 orange3 chocolate2 olive pink light_purple light_blue plum yellow turquoise light_green brown
- DarkOrange PaleGreen3 SlateBlue BlueViolet PeachPuff2 orange4 chocolate3 LightGreen pink light_purple light_blue plum yellow turquoise light_green brown
+ qw (flamescarlet forestgreen navy olive lightseagreen purple
+ orangepeel gold2 chartreuse3 cornflowerblue mediumpurple2 deeppink2
+ galaxyblue hazelnut pottersclay BlueViolet
+
+ PaleGreen1 DarkBlue orange2 chocolate1 LightGreen
+ pink light_purple light_blue plum yellow turquoise light_green brown
+ PaleGreen2 MediumPurple PeachPuff1 orange3 chocolate2
+ olive light_purple light_blue yellow turquoise light_green brown
+ DarkOrange PaleGreen3 SlateBlue BlueViolet PeachPuff2 orange4
+ chocolate3 LightGreen light_purple light_blue light_green
snow1 honeydew3 SkyBlue1 cyan3 DarkOliveGreen1 IndianRed3
orange1 LightPink3 MediumPurple1 snow3 LavenderBlush1 SkyBlue3
DarkSlateGray1 DarkOliveGreen3 sienna1 orange3 PaleVioletRed1
- MediumPurple3 seashell1 LavenderBlush3 LightSkyBlue1
- DarkSlateGray3 khaki1 sienna3 DarkOrange1 PaleVioletRed3
- thistle1 seashell3 MistyRose1 LightSkyBlue3 aquamarine1 khaki3
- burlywood1 DarkOrange3 maroon1 thistle3 AntiqueWhite1
- MistyRose3 SlateGray1 aquamarine3 LightGoldenrod1 burlywood3
- coral1 maroon3 AntiqueWhite3 azure1 SlateGray3 DarkSeaGreen1
- LightGoldenrod3 wheat1 coral3 VioletRed1 bisque1 azure3
- LightSteelBlue1 DarkSeaGreen3 LightYellow1 wheat3 tomato1
- VioletRed3 bisque3 SlateBlue1 LightSteelBlue3 SeaGreen1
- LightYellow3 tan1 tomato3 magenta1 PeachPuff1 SlateBlue3
- LightBlue1 SeaGreen3 yellow1 tan3 OrangeRed1 magenta3
- PeachPuff3 RoyalBlue1 LightBlue3 PaleGreen1 yellow3 chocolate1
- OrangeRed3 orchid1 NavajoWhite1 RoyalBlue3 LightCyan1
- PaleGreen3 gold1 chocolate3 red1 orchid3 NavajoWhite3 blue1
- LightCyan3 SpringGreen1 gold3 firebrick1 red3 plum1
- LemonChiffon1 blue3 PaleTurquoise1 SpringGreen3 goldenrod1
- firebrick3 DeepPink1 plum3 LemonChiffon3 DodgerBlue1
- PaleTurquoise3 green1 goldenrod3 brown1 DeepPink3
- MediumOrchid1 cornsilk1 DodgerBlue3 CadetBlue1 green3
- DarkGoldenrod1 brown3 HotPink1 MediumOrchid3 cornsilk3
- SteelBlue1 CadetBlue3 chartreuse1 DarkGoldenrod3 salmon1
- HotPink3 DarkOrchid1 ivory1 SteelBlue3 turquoise1 chartreuse3
- RosyBrown1 salmon3 pink1 DarkOrchid3 ivory3 DeepSkyBlue1
- turquoise3 OliveDrab1 RosyBrown3 LightSalmon1 pink3 purple1
- honeydew1 DeepSkyBlue3 cyan1 OliveDrab3 IndianRed1
- LightSalmon3 LightPink1 purple3 honeydew2 DeepSkyBlue4 cyan2
- OliveDrab4 IndianRed2 LightSalmon4 LightPink2 purple4 snow2
- honeydew4 SkyBlue2 cyan4 DarkOliveGreen2 IndianRed4 orange2
- LightPink4 MediumPurple2 snow4 LavenderBlush2 SkyBlue4
- DarkSlateGray2 DarkOliveGreen4 sienna2 orange4 PaleVioletRed2
- MediumPurple4 seashell2 LavenderBlush4 LightSkyBlue2
- DarkSlateGray4 khaki2 sienna4 DarkOrange2 PaleVioletRed4
- thistle2 seashell4 MistyRose2 LightSkyBlue4 aquamarine2 khaki4
- burlywood2 DarkOrange4 maroon2 thistle4 AntiqueWhite2
- MistyRose4 SlateGray2 aquamarine4 LightGoldenrod2 burlywood4
- coral2 maroon4 AntiqueWhite4 azure2 SlateGray4 DarkSeaGreen2
- LightGoldenrod4 wheat2 coral4 VioletRed2 bisque2 azure4
- LightSteelBlue2 DarkSeaGreen4 LightYellow2 wheat4 tomato2
- VioletRed4 bisque4 SlateBlue2 LightSteelBlue4 SeaGreen2
- LightYellow4 tan2 tomato4 magenta2 PeachPuff2 SlateBlue4
- LightBlue2 SeaGreen4 yellow2 tan4 OrangeRed2 magenta4
- PeachPuff4 RoyalBlue2 LightBlue4 PaleGreen2 yellow4 chocolate2
- OrangeRed4 orchid2 NavajoWhite2 RoyalBlue4 LightCyan2
- PaleGreen4 gold2 chocolate4 red2 orchid4 NavajoWhite4 blue2
- LightCyan4 SpringGreen2 gold4 firebrick2 red4 plum2
- LemonChiffon2 blue4 PaleTurquoise2 SpringGreen4 goldenrod2
- firebrick4 DeepPink2 plum4 LemonChiffon4 DodgerBlue2
- PaleTurquoise4 green2 goldenrod4 brown2 DeepPink4
- MediumOrchid2 cornsilk2 DodgerBlue4 CadetBlue2 green4
- DarkGoldenrod2 brown4 HotPink2 MediumOrchid4 cornsilk4
- SteelBlue2 CadetBlue4 chartreuse2 DarkGoldenrod4 salmon2
- HotPink4 DarkOrchid2 ivory2 SteelBlue4 turquoise2 chartreuse4
- RosyBrown2 salmon4 pink2 DarkOrchid4 ivory4 DeepSkyBlue2
- turquoise4 OliveDrab2 RosyBrown4 LightSalmon2 pink4 purple2)
+ MediumPurple3 seashell1 LavenderBlush3 LightSkyBlue1)
),
};
@@ -1163,8 +1068,7 @@ sub _copy_data
# and collect some basic info about it\n
# Not logical data is 'carp'ed.\n
# @return status of check
-sub _check_data
-{
+sub _check_data {
my $self = shift;
my $length = 0;
@@ -1239,8 +1143,7 @@ sub _check_data
# @see _plot
#
# @return status
-sub _draw
-{
+sub _draw {
my $self = shift;
# leave the appropriate border on the png
@@ -1269,430 +1172,10 @@ sub _draw
return 1;
}
-## @var Hash named_colors RGB values of named colors
-#
-# see URL http://en.wikipedia.org/wiki/Web_colors#X11_color_names
-our %named_colors = (
- 'white' => [ 255, 255, 255 ],
- 'black' => [ 0, 0, 0 ],
- 'red' => [ 200, 0, 0 ],
- 'green' => [ 0, 175, 0 ],
- 'blue' => [ 0, 0, 200 ],
- 'orange' => [ 250, 125, 0 ],
- 'orange2' => [ 238, 154, 0 ],
- 'orange3' => [ 205, 133, 0 ],
- 'orange4' => [ 139, 90, 0 ],
- 'yellow' => [ 225, 225, 0 ],
- 'purple' => [ 200, 0, 200 ],
- 'light_blue' => [ 0, 125, 250 ],
- 'light_green' => [ 125, 250, 0 ],
- 'light_purple' => [ 145, 0, 250 ],
- 'pink' => [ 250, 0, 125 ],
- 'peach' => [ 250, 125, 125 ],
- 'olive' => [ 125, 125, 0 ],
- 'plum' => [ 125, 0, 125 ],
- 'turquoise' => [ 0, 125, 125 ],
- 'mauve' => [ 200, 125, 125 ],
- 'brown' => [ 160, 80, 0 ],
- 'grey' => [ 225, 225, 225 ],
- 'HotPink' => [ 255, 105, 180 ],
- 'PaleGreen1' => [ 154, 255, 154 ],
- 'PaleGreen2' => [ 144, 238, 144 ],
- 'PaleGreen3' => [ 124, 205, 124 ],
- 'PaleGreen4' => [ 84, 138, 84 ],
- 'DarkBlue' => [ 0, 0, 139 ],
- 'BlueViolet' => [ 138, 43, 226 ],
- 'PeachPuff' => [ 255, 218, 185 ],
- 'PeachPuff1' => [ 255, 218, 185 ],
- 'PeachPuff2' => [ 238, 203, 173 ],
- 'PeachPuff3' => [ 205, 175, 149 ],
- 'PeachPuff4' => [ 139, 119, 101 ],
- 'chocolate1' => [ 255, 127, 36 ],
- 'chocolate2' => [ 238, 118, 33 ],
- 'chocolate3' => [ 205, 102, 29 ],
- 'chocolate4' => [ 139, 69, 19 ],
- 'LightGreen' => [ 144, 238, 144 ],
- 'lavender' => [ 230, 230, 250 ],
- 'MediumPurple' => [ 147, 112, 219 ],
- 'DarkOrange' => [ 255, 127, 0 ],
- 'DarkOrange2' => [ 238, 118, 0 ],
- 'DarkOrange3' => [ 205, 102, 0 ],
- 'DarkOrange4' => [ 139, 69, 0 ],
- 'SlateBlue' => [ 106, 90, 205 ],
- 'BlueViolet' => [ 138, 43, 226 ],
- 'RoyalBlue' => [ 65, 105, 225 ],
- 'AntiqueWhite' => [ 250, 235, 215 ],
- 'AntiqueWhite1' => [ 255, 239, 219 ],
- 'AntiqueWhite2' => [ 238, 223, 204 ],
- 'AntiqueWhite3' => [ 205, 192, 176 ],
- 'AntiqueWhite4' => [ 139, 131, 120 ],
- 'CadetBlue' => [ 95, 158, 160 ],
- 'CadetBlue1' => [ 152, 245, 255 ],
- 'CadetBlue2' => [ 142, 229, 238 ],
- 'CadetBlue3' => [ 122, 197, 205 ],
- 'CadetBlue4' => [ 83, 134, 139 ],
- 'DarkGoldenrod' => [ 184, 134, 11 ],
- 'DarkGoldenrod1' => [ 255, 185, 15 ],
- 'DarkGoldenrod2' => [ 238, 173, 14 ],
- 'DarkGoldenrod3' => [ 205, 149, 12 ],
- 'DarkGoldenrod4' => [ 139, 101, 8 ],
- 'DarkOliveGreen' => [ 85, 107, 47 ],
- 'DarkOliveGreen1' => [ 202, 255, 112 ],
- 'DarkOliveGreen2' => [ 188, 238, 104 ],
- 'DarkOliveGreen3' => [ 162, 205, 90 ],
- 'DarkOliveGreen4' => [ 110, 139, 61 ],
- 'DarkOrange1' => [ 255, 127, 0 ],
- 'DarkOrchid' => [ 153, 50, 204 ],
- 'DarkOrchid1' => [ 191, 62, 255 ],
- 'DarkOrchid2' => [ 178, 58, 238 ],
- 'DarkOrchid3' => [ 154, 50, 205 ],
- 'DarkOrchid4' => [ 104, 34, 139 ],
- 'DarkSeaGreen' => [ 143, 188, 143 ],
- 'DarkSeaGreen1' => [ 193, 255, 193 ],
- 'DarkSeaGreen2' => [ 180, 238, 180 ],
- 'DarkSeaGreen3' => [ 155, 205, 155 ],
- 'DarkSeaGreen4' => [ 105, 139, 105 ],
- 'DarkSlateGray' => [ 47, 79, 79 ],
- 'DarkSlateGray1' => [ 151, 255, 255 ],
- 'DarkSlateGray2' => [ 141, 238, 238 ],
- 'DarkSlateGray3' => [ 121, 205, 205 ],
- 'DarkSlateGray4' => [ 82, 139, 139 ],
- 'DeepPink' => [ 255, 20, 147 ],
- 'DeepPink1' => [ 255, 20, 147 ],
- 'DeepPink2' => [ 238, 18, 137 ],
- 'DeepPink3' => [ 205, 16, 118 ],
- 'DeepPink4' => [ 139, 10, 80 ],
- 'DeepSkyBlue' => [ 0, 191, 255 ],
- 'DeepSkyBlue1' => [ 0, 191, 255 ],
- 'DeepSkyBlue2' => [ 0, 178, 238 ],
- 'DeepSkyBlue3' => [ 0, 154, 205 ],
- 'DeepSkyBlue4' => [ 0, 104, 139 ],
- 'DodgerBlue' => [ 30, 144, 255 ],
- 'DodgerBlue1' => [ 30, 144, 255 ],
- 'DodgerBlue2' => [ 28, 134, 238 ],
- 'DodgerBlue3' => [ 24, 116, 205 ],
- 'DodgerBlue4' => [ 16, 78, 139 ],
- 'HotPink1' => [ 255, 110, 180 ],
- 'HotPink2' => [ 238, 106, 167 ],
- 'HotPink3' => [ 205, 96, 144 ],
- 'HotPink4' => [ 139, 58, 98 ],
- 'IndianRed' => [ 205, 92, 92 ],
- 'IndianRed1' => [ 255, 106, 106 ],
- 'IndianRed2' => [ 238, 99, 99 ],
- 'IndianRed3' => [ 205, 85, 85 ],
- 'IndianRed4' => [ 139, 58, 58 ],
- 'LavenderBlush' => [ 255, 240, 245 ],
- 'LavenderBlush1' => [ 255, 240, 245 ],
- 'LavenderBlush2' => [ 238, 224, 229 ],
- 'LavenderBlush3' => [ 205, 193, 197 ],
- 'LavenderBlush4' => [ 139, 131, 134 ],
- 'LemonChiffon' => [ 255, 250, 205 ],
- 'LemonChiffon1' => [ 255, 250, 205 ],
- 'LemonChiffon2' => [ 238, 233, 191 ],
- 'LemonChiffon3' => [ 205, 201, 165 ],
- 'LemonChiffon4' => [ 139, 137, 112 ],
- 'LightBlue' => [ 173, 216, 230 ],
- 'LightBlue1' => [ 191, 239, 255 ],
- 'LightBlue2' => [ 178, 223, 238 ],
- 'LightBlue3' => [ 154, 192, 205 ],
- 'LightBlue4' => [ 104, 131, 139 ],
- 'LightCyan' => [ 224, 255, 255 ],
- 'LightCyan1' => [ 224, 255, 255 ],
- 'LightCyan2' => [ 209, 238, 238 ],
- 'LightCyan3' => [ 180, 205, 205 ],
- 'LightCyan4' => [ 122, 139, 139 ],
- 'LightGoldenrod' => [ 238, 221, 130 ],
- 'LightGoldenrod1' => [ 255, 236, 139 ],
- 'LightGoldenrod2' => [ 238, 220, 130 ],
- 'LightGoldenrod3' => [ 205, 190, 112 ],
- 'LightGoldenrod4' => [ 139, 129, 76 ],
- 'LightPink' => [ 255, 182, 193 ],
- 'LightPink1' => [ 255, 174, 185 ],
- 'LightPink2' => [ 238, 162, 173 ],
- 'LightPink3' => [ 205, 140, 149 ],
- 'LightPink4' => [ 139, 95, 101 ],
- 'LightSalmon' => [ 255, 160, 122 ],
- 'LightSalmon1' => [ 255, 160, 122 ],
- 'LightSalmon2' => [ 238, 149, 114 ],
- 'LightSalmon3' => [ 205, 129, 98 ],
- 'LightSalmon4' => [ 139, 87, 66 ],
- 'LightSkyBlue' => [ 135, 206, 250 ],
- 'LightSkyBlue1' => [ 176, 226, 255 ],
- 'LightSkyBlue2' => [ 164, 211, 238 ],
- 'LightSkyBlue3' => [ 141, 182, 205 ],
- 'LightSkyBlue4' => [ 96, 123, 139 ],
- 'LightSteelBlue' => [ 176, 196, 222 ],
- 'LightSteelBlue1' => [ 202, 225, 255 ],
- 'LightSteelBlue2' => [ 188, 210, 238 ],
- 'LightSteelBlue3' => [ 162, 181, 205 ],
- 'LightSteelBlue4' => [ 110, 123, 139 ],
- 'LightYellow' => [ 255, 255, 224 ],
- 'LightYellow1' => [ 255, 255, 224 ],
- 'LightYellow2' => [ 238, 238, 209 ],
- 'LightYellow3' => [ 205, 205, 180 ],
- 'LightYellow4' => [ 139, 139, 122 ],
- 'MediumOrchid' => [ 186, 85, 211 ],
- 'MediumOrchid1' => [ 224, 102, 255 ],
- 'MediumOrchid2' => [ 209, 95, 238 ],
- 'MediumOrchid3' => [ 180, 82, 205 ],
- 'MediumOrchid4' => [ 122, 55, 139 ],
- 'MediumPurple1' => [ 171, 130, 255 ],
- 'MediumPurple2' => [ 159, 121, 238 ],
- 'MediumPurple3' => [ 137, 104, 205 ],
- 'MediumPurple4' => [ 93, 71, 139 ],
- 'MistyRose' => [ 255, 228, 225 ],
- 'MistyRose1' => [ 255, 228, 225 ],
- 'MistyRose2' => [ 238, 213, 210 ],
- 'MistyRose3' => [ 205, 183, 181 ],
- 'MistyRose4' => [ 139, 125, 123 ],
- 'NavajoWhite' => [ 255, 222, 173 ],
- 'NavajoWhite1' => [ 255, 222, 173 ],
- 'NavajoWhite2' => [ 238, 207, 161 ],
- 'NavajoWhite3' => [ 205, 179, 139 ],
- 'NavajoWhite4' => [ 139, 121, 94 ],
- 'OliveDrab' => [ 107, 142, 35 ],
- 'OliveDrab1' => [ 192, 255, 62 ],
- 'OliveDrab2' => [ 179, 238, 58 ],
- 'OliveDrab3' => [ 154, 205, 50 ],
- 'OliveDrab4' => [ 105, 139, 34 ],
- 'OrangeRed' => [ 255, 69, 0 ],
- 'OrangeRed1' => [ 255, 69, 0 ],
- 'OrangeRed2' => [ 238, 64, 0 ],
- 'OrangeRed3' => [ 205, 55, 0 ],
- 'OrangeRed4' => [ 139, 37, 0 ],
- 'PaleGreen' => [ 152, 251, 152 ],
- 'PaleTurquoise' => [ 175, 238, 238 ],
- 'PaleTurquoise1' => [ 187, 255, 255 ],
- 'PaleTurquoise2' => [ 174, 238, 238 ],
- 'PaleTurquoise3' => [ 150, 205, 205 ],
- 'PaleTurquoise4' => [ 102, 139, 139 ],
- 'PaleVioletRed' => [ 219, 112, 147 ],
- 'PaleVioletRed1' => [ 255, 130, 171 ],
- 'PaleVioletRed2' => [ 238, 121, 159 ],
- 'PaleVioletRed3' => [ 205, 104, 137 ],
- 'PaleVioletRed4' => [ 139, 71, 93 ],
- 'RosyBrown' => [ 188, 143, 143 ],
- 'RosyBrown1' => [ 255, 193, 193 ],
- 'RosyBrown2' => [ 238, 180, 180 ],
- 'RosyBrown3' => [ 205, 155, 155 ],
- 'RosyBrown4' => [ 139, 105, 105 ],
- 'RoyalBlue1' => [ 72, 118, 255 ],
- 'RoyalBlue2' => [ 67, 110, 238 ],
- 'RoyalBlue3' => [ 58, 95, 205 ],
- 'RoyalBlue4' => [ 39, 64, 139 ],
- 'SeaGreen' => [ 46, 139, 87 ],
- 'SeaGreen1' => [ 84, 255, 159 ],
- 'SeaGreen2' => [ 78, 238, 148 ],
- 'SeaGreen3' => [ 67, 205, 128 ],
- 'SeaGreen4' => [ 46, 139, 87 ],
- 'SkyBlue' => [ 135, 206, 235 ],
- 'SkyBlue1' => [ 135, 206, 255 ],
- 'SkyBlue2' => [ 126, 192, 238 ],
- 'SkyBlue3' => [ 108, 166, 205 ],
- 'SkyBlue4' => [ 74, 112, 139 ],
- 'SlateBlue1' => [ 131, 111, 255 ],
- 'SlateBlue2' => [ 122, 103, 238 ],
- 'SlateBlue3' => [ 105, 89, 205 ],
- 'SlateBlue4' => [ 71, 60, 139 ],
- 'SlateGray' => [ 112, 128, 144 ],
- 'SlateGray1' => [ 198, 226, 255 ],
- 'SlateGray2' => [ 185, 211, 238 ],
- 'SlateGray3' => [ 159, 182, 205 ],
- 'SlateGray4' => [ 108, 123, 139 ],
- 'SpringGreen' => [ 0, 255, 127 ],
- 'SpringGreen1' => [ 0, 255, 127 ],
- 'SpringGreen2' => [ 0, 238, 118 ],
- 'SpringGreen3' => [ 0, 205, 102 ],
- 'SpringGreen4' => [ 0, 139, 69 ],
- 'SteelBlue' => [ 70, 130, 180 ],
- 'SteelBlue1' => [ 99, 184, 255 ],
- 'SteelBlue2' => [ 92, 172, 238 ],
- 'SteelBlue3' => [ 79, 148, 205 ],
- 'SteelBlue4' => [ 54, 100, 139 ],
- 'VioletRed' => [ 208, 32, 144 ],
- 'VioletRed1' => [ 255, 62, 150 ],
- 'VioletRed2' => [ 238, 58, 140 ],
- 'VioletRed3' => [ 205, 50, 120 ],
- 'VioletRed4' => [ 139, 34, 82 ],
- 'aquamarine' => [ 127, 255, 212 ],
- 'aquamarine1' => [ 127, 255, 212 ],
- 'aquamarine2' => [ 118, 238, 198 ],
- 'aquamarine3' => [ 102, 205, 170 ],
- 'aquamarine4' => [ 69, 139, 116 ],
- 'azure' => [ 240, 255, 255 ],
- 'azure1' => [ 240, 255, 255 ],
- 'azure2' => [ 224, 238, 238 ],
- 'azure3' => [ 193, 205, 205 ],
- 'azure4' => [ 131, 139, 139 ],
- 'bisque' => [ 255, 228, 196 ],
- 'bisque1' => [ 255, 228, 196 ],
- 'bisque2' => [ 238, 213, 183 ],
- 'bisque3' => [ 205, 183, 158 ],
- 'bisque4' => [ 139, 125, 107 ],
- 'blue1' => [ 0, 0, 255 ],
- 'blue2' => [ 0, 0, 238 ],
- 'blue3' => [ 0, 0, 205 ],
- 'blue4' => [ 0, 0, 139 ],
- 'brown1' => [ 255, 64, 64 ],
- 'brown2' => [ 238, 59, 59 ],
- 'brown3' => [ 205, 51, 51 ],
- 'brown4' => [ 139, 35, 35 ],
- 'burlywood' => [ 222, 184, 135 ],
- 'burlywood1' => [ 255, 211, 155 ],
- 'burlywood2' => [ 238, 197, 145 ],
- 'burlywood3' => [ 205, 170, 125 ],
- 'burlywood4' => [ 139, 115, 85 ],
- 'chartreuse' => [ 127, 255, 0 ],
- 'chartreuse1' => [ 127, 255, 0 ],
- 'chartreuse2' => [ 118, 238, 0 ],
- 'chartreuse3' => [ 102, 205, 0 ],
- 'chartreuse4' => [ 69, 139, 0 ],
- 'chocolate' => [ 210, 105, 30 ],
- 'coral' => [ 255, 127, 80 ],
- 'coral1' => [ 255, 114, 86 ],
- 'coral2' => [ 238, 106, 80 ],
- 'coral3' => [ 205, 91, 69 ],
- 'coral4' => [ 139, 62, 47 ],
- 'cornsilk' => [ 255, 248, 220 ],
- 'cornsilk1' => [ 255, 248, 220 ],
- 'cornsilk2' => [ 238, 232, 205 ],
- 'cornsilk3' => [ 205, 200, 177 ],
- 'cornsilk4' => [ 139, 136, 120 ],
- 'cyan' => [ 0, 255, 255 ],
- 'cyan1' => [ 0, 255, 255 ],
- 'cyan2' => [ 0, 238, 238 ],
- 'cyan3' => [ 0, 205, 205 ],
- 'cyan4' => [ 0, 139, 139 ],
- 'firebrick' => [ 178, 34, 34 ],
- 'firebrick1' => [ 255, 48, 48 ],
- 'firebrick2' => [ 238, 44, 44 ],
- 'firebrick3' => [ 205, 38, 38 ],
- 'firebrick4' => [ 139, 26, 26 ],
- 'gold' => [ 255, 215, 0 ],
- 'gold1' => [ 255, 215, 0 ],
- 'gold2' => [ 238, 201, 0 ],
- 'gold3' => [ 205, 173, 0 ],
- 'gold4' => [ 139, 117, 0 ],
- 'goldenrod' => [ 218, 165, 32 ],
- 'goldenrod1' => [ 255, 193, 37 ],
- 'goldenrod2' => [ 238, 180, 34 ],
- 'goldenrod3' => [ 205, 155, 29 ],
- 'goldenrod4' => [ 139, 105, 20 ],
- 'gray' => [ 190, 190, 190 ],
- 'gray1' => [ 3, 3, 3 ],
- 'gray2' => [ 5, 5, 5 ],
- 'gray3' => [ 8, 8, 8 ],
- 'gray4' => [ 10, 10, 10 ],
- 'green1' => [ 0, 255, 0 ],
- 'green2' => [ 0, 238, 0 ],
- 'green3' => [ 0, 205, 0 ],
- 'green4' => [ 0, 139, 0 ],
- 'grey1' => [ 3, 3, 3 ],
- 'grey2' => [ 5, 5, 5 ],
- 'grey3' => [ 8, 8, 8 ],
- 'grey4' => [ 10, 10, 10 ],
- 'honeydew' => [ 240, 255, 240 ],
- 'honeydew1' => [ 240, 255, 240 ],
- 'honeydew2' => [ 224, 238, 224 ],
- 'honeydew3' => [ 193, 205, 193 ],
- 'honeydew4' => [ 131, 139, 131 ],
- 'ivory' => [ 255, 255, 240 ],
- 'ivory1' => [ 255, 255, 240 ],
- 'ivory2' => [ 238, 238, 224 ],
- 'ivory3' => [ 205, 205, 193 ],
- 'ivory4' => [ 139, 139, 131 ],
- 'khaki' => [ 240, 230, 140 ],
- 'khaki1' => [ 255, 246, 143 ],
- 'khaki2' => [ 238, 230, 133 ],
- 'khaki3' => [ 205, 198, 115 ],
- 'khaki4' => [ 139, 134, 78 ],
- 'magenta' => [ 255, 0, 255 ],
- 'magenta1' => [ 255, 0, 255 ],
- 'magenta2' => [ 238, 0, 238 ],
- 'magenta3' => [ 205, 0, 205 ],
- 'magenta4' => [ 139, 0, 139 ],
- 'maroon' => [ 176, 48, 96 ],
- 'maroon1' => [ 255, 52, 179 ],
- 'maroon2' => [ 238, 48, 167 ],
- 'maroon3' => [ 205, 41, 144 ],
- 'maroon4' => [ 139, 28, 98 ],
- 'orange1' => [ 255, 165, 0 ],
- 'orchid' => [ 218, 112, 214 ],
- 'orchid1' => [ 255, 131, 250 ],
- 'orchid2' => [ 238, 122, 233 ],
- 'orchid3' => [ 205, 105, 201 ],
- 'orchid4' => [ 139, 71, 137 ],
- 'pink1' => [ 255, 181, 197 ],
- 'pink2' => [ 238, 169, 184 ],
- 'pink3' => [ 205, 145, 158 ],
- 'pink4' => [ 139, 99, 108 ],
- 'plum1' => [ 255, 187, 255 ],
- 'plum2' => [ 238, 174, 238 ],
- 'plum3' => [ 205, 150, 205 ],
- 'plum4' => [ 139, 102, 139 ],
- 'purple1' => [ 155, 48, 255 ],
- 'purple2' => [ 145, 44, 238 ],
- 'purple3' => [ 125, 38, 205 ],
- 'purple4' => [ 85, 26, 139 ],
- 'red1' => [ 255, 0, 0 ],
- 'red2' => [ 238, 0, 0 ],
- 'red3' => [ 205, 0, 0 ],
- 'red4' => [ 139, 0, 0 ],
- 'salmon' => [ 250, 128, 114 ],
- 'salmon1' => [ 255, 140, 105 ],
- 'salmon2' => [ 238, 130, 98 ],
- 'salmon3' => [ 205, 112, 84 ],
- 'salmon4' => [ 139, 76, 57 ],
- 'seashell' => [ 255, 245, 238 ],
- 'seashell1' => [ 255, 245, 238 ],
- 'seashell2' => [ 238, 229, 222 ],
- 'seashell3' => [ 205, 197, 191 ],
- 'seashell4' => [ 139, 134, 130 ],
- 'sienna' => [ 160, 82, 45 ],
- 'sienna1' => [ 255, 130, 71 ],
- 'sienna2' => [ 238, 121, 66 ],
- 'sienna3' => [ 205, 104, 57 ],
- 'sienna4' => [ 139, 71, 38 ],
- 'snow' => [ 255, 250, 250 ],
- 'snow1' => [ 255, 250, 250 ],
- 'snow2' => [ 238, 233, 233 ],
- 'snow3' => [ 205, 201, 201 ],
- 'snow4' => [ 139, 137, 137 ],
- 'tan' => [ 210, 180, 140 ],
- 'tan1' => [ 255, 165, 79 ],
- 'tan2' => [ 238, 154, 73 ],
- 'tan3' => [ 205, 133, 63 ],
- 'tan4' => [ 139, 90, 43 ],
- 'thistle' => [ 216, 191, 216 ],
- 'thistle1' => [ 255, 225, 255 ],
- 'thistle2' => [ 238, 210, 238 ],
- 'thistle3' => [ 205, 181, 205 ],
- 'thistle4' => [ 139, 123, 139 ],
- 'tomato' => [ 255, 99, 71 ],
- 'tomato1' => [ 255, 99, 71 ],
- 'tomato2' => [ 238, 92, 66 ],
- 'tomato3' => [ 205, 79, 57 ],
- 'tomato4' => [ 139, 54, 38 ],
- 'turquoise1' => [ 0, 245, 255 ],
- 'turquoise2' => [ 0, 229, 238 ],
- 'turquoise3' => [ 0, 197, 205 ],
- 'turquoise4' => [ 0, 134, 139 ],
- 'wheat' => [ 245, 222, 179 ],
- 'wheat1' => [ 255, 231, 186 ],
- 'wheat2' => [ 238, 216, 174 ],
- 'wheat3' => [ 205, 186, 150 ],
- 'wheat4' => [ 139, 126, 102 ],
- 'yellow1' => [ 255, 255, 0 ],
- 'yellow2' => [ 238, 238, 0 ],
- 'yellow3' => [ 205, 205, 0 ],
- 'yellow4' => [ 139, 139, 0 ],
-);
-
## @fn private int _set_colors
# specify my colors
# @return status
-sub _set_colors
-{
+sub _set_colors {
my $self = shift;
my $index = $self->_color_role_to_index('background'); # allocate GD color
@@ -1720,9 +1203,7 @@ sub _set_colors
# @li undef: If your subroutine has been called in void context
#
# @return a (list of) color index(es) corresponding to the (list of) role(s) in \\\@_.
-#
-sub _color_role_to_index
-{
+sub _color_role_to_index {
my $self = shift;
# Return a (list of) color index(es) corresponding to the (list of) role(s) in @_.
@@ -1730,24 +1211,17 @@ sub _color_role_to_index
my $role = $_;
my $index = $self->{'color_table'}->{$role};
- #print STDERR "Role = $_\n";
-
- unless ( defined $index )
- {
+ unless ( defined $index ) {
my $spec =
$self->{'colors'}->{$role}
|| $self->{'colors_default_spec'}->{$role}
|| $self->{'colors_default_spec'}->{ $self->{'colors_default_role'}->{$role} };
-
my @rgb = $self->_color_spec_to_rgb( $role, $spec );
- #print STDERR "spec = $spec\n";
-
my $string = sprintf " RGB(%d,%d,%d)", map { $_ + 0 } @rgb;
$index = $self->{'color_table'}->{$string};
- unless ( defined $index )
- {
+ unless ( defined $index ) {
$index = $self->{'gd_obj'}->colorAllocate(@rgb);
$self->{'color_table'}->{$string} = $index;
}
@@ -1757,41 +1231,14 @@ sub _color_role_to_index
$index;
} @_;
- #print STDERR "Result= ".$result[0]."\n";
( wantarray && @_ > 1 ? @result : $result[0] );
}
-## @fn private array _color_spec_to_rgb($role,$spec)
-# Return an array (list of) rgb values for spec
-# @param[in] role name of a role
-# @param[in] spec [r,g,b] or name
-# @return array of rgb values as a list (i.e., \\\@rgb)
-#
-sub _color_spec_to_rgb
-{
- my $self = shift;
- my $role = shift; # for error messages
- my $spec = shift; # [r,g,b] or name
-
- my @rgb; # result
- if ( ref($spec) eq 'ARRAY' )
- {
- @rgb = @{$spec};
- croak "Invalid color RGB array (" . join( ',', @rgb ) . ") for $role\n"
-
- unless @rgb == 3 && grep( !m/^\d+$/ || $_ > 255, @rgb ) == 0;
- }
- elsif ( !ref($spec) )
- {
- croak "Unknown named color ($spec) for $role\n"
- unless $named_colors{$spec};
- @rgb = @{ $named_colors{$spec} };
- }
- else
- {
- croak "Unrecognized color for $role\n";
- }
- @rgb;
+sub _color_spec_to_rgb {
+ my ($self, $role, $spec) = @_; # color role name (from set) for error msg
+ my $color = Chart::Color->new( $spec );
+ return croak "Unrecognized color for $role\n" unless ref $color;
+ $color->rgb;
}
## @fn private int _brushStyles_of_roles
@@ -1800,23 +1247,9 @@ sub _color_spec_to_rgb
# @param list_of_roles List of roles (\\\@list_of_roles)
# @return (list of) brushStyle(s) corresponding to the (list of) role(s) in \\\@_.
#
-sub _brushStyles_of_roles
-{
+sub _brushStyles_of_roles {
my $self = shift;
- my @roles = @_;
-
- my @results = ();
- foreach my $role (@roles)
- {
- my $brushStyle = $self->{'brushStyles'}->{$role};
-
- if ( !defined($brushStyle) )
- {
- $brushStyle = $self->{'brushStyle'};
- }
- push( @results, $brushStyle );
- }
- @results;
+ map {exists $self->{'brushStyles'}{$_} ? $self->{'brushStyles'}{$_} : $self->{'brushStyle'}} @_;
}
## @fn private int _draw_title
@@ -1829,28 +1262,26 @@ sub _brushStyles_of_roles
# based on 'title' or 'text'\n
# @see _color_role_to_index
# @return status
-sub _draw_title
-{
+sub draw_text {
+ my ($self, $text, $font, $color) = @_;
+ # !!!
+ 1;
+}
+
+sub _draw_title {
my $self = shift;
my $font = $self->{'title_font'};
my $color;
my ( $h, $w, @lines, $x, $y );
#get the right color
- if ( defined $self->{'colors'}{'title'} )
- {
- $color = $self->_color_role_to_index('title');
- }
- else
- {
- $color = $self->_color_role_to_index('text');
- }
+ $color = ( defined $self->{'colors'}{'title'} )
+ ? $self->_color_role_to_index('title')
+ : $self->_color_role_to_index('text');
# make sure we're actually using a real font
- unless ( ( ref $font ) eq 'GD::Font' )
- {
- croak "The title font you specified isn\'t a GD Font object";
- }
+ croak "The title font you specified isn\'t a GD Font object" unless ref $font eq 'GD::Font'
+ or ref $font eq 'Chart::Font';
# get the height and width of the font
( $h, $w ) = ( $font->height, $font->width );
@@ -1913,8 +1344,7 @@ sub _draw_title
# by writing more than one line as the title.
# Both use decreased width and height of the font by one.
# @return status
-sub _draw_sub_title
-{
+sub _draw_sub_title {
my $self = shift;
my $font = $self->{'sub_title_font'};
@@ -1961,8 +1391,7 @@ sub _draw_sub_title
## @fn private int _sort_data()
# sort the data nicely (mostly for the pareto charts and xy-plots)
# @return status
-sub _sort_data
-{
+sub _sort_data {
my $self = shift;
my $data_ref = $self->{'dataref'};
my @data = @{ $self->{'dataref'} };
@@ -1984,8 +1413,7 @@ sub _sort_data
# For a xy-plot do the same for the x values, as '_find_y_scale' does for the y values!
# @see _find_y_scale
# @return status
-sub _find_x_scale
-{
+sub _find_x_scale {
my $self = shift;
my @data = @{ $self->{'dataref'} };
my ( $i, $j );
@@ -2785,11 +2213,9 @@ sub _plot
# 'legend' to 'top', 'bottom', 'left', 'right' or 'none'.
# The legend is positioned at the defined place, respectively.
# @return status
-sub _draw_legend
-{
+sub _draw_legend {
my $self = shift;
my $length;
-
# check to see if legend type is none..
if ( $self->{'legend'} =~ /^none$/ || length( $self->{'legend'} ) == 0 )
{
@@ -2840,6 +2266,7 @@ sub _draw_legend
elsif ( $self->{'legend'} eq 'top' )
{
$self->_draw_top_legend;
+
}
elsif ( $self->{'legend'} eq 'none' || length( $self->{'legend'} ) == 0 )
{
@@ -2857,8 +2284,8 @@ sub _draw_legend
## @fn private int _draw_bottom_legend()
# put the legend on the bottom of the chart
# @return status
-sub _draw_bottom_legend
-{
+sub _draw_bottom_legend {
+
my $self = shift;
my @labels = @{ $self->{'legend_labels'} };
@@ -2936,6 +2363,8 @@ sub _draw_bottom_legend
$y1 += $self->{'legend_space'} + $self->{'text_space'};
$y2 -= $self->{'legend_space'} + $self->{'text_space'};
+ my $text_color = $self->_color_role_to_index( 'text' );
+
# draw in the actual legend
for $r ( 0 .. $rows - 1 )
{
@@ -2968,11 +2397,10 @@ sub _draw_bottom_legend
$y = $y1 + ( $row_height * $r );
# now draw the label
- $self->{'gd_obj'}->string( $font, $x, $y, $labels[$index], $color );
+ $self->{'gd_obj'}->string( $font, $x, $y, $labels[$index], $text_color );
}
}
}
-
# mark off the space used
$self->{'curr_y_max'} -= $rows * $row_height + 2 * $self->{'text_space'} + 2 * $self->{'legend_space'};
@@ -2983,8 +2411,7 @@ sub _draw_bottom_legend
## @fn private int _draw_right_legend()
# put the legend on the right of the chart
# @return status
-sub _draw_right_legend
-{
+sub _draw_right_legend {
my $self = shift;
my @labels = @{ $self->{'legend_labels'} };
my ( $x1, $x2, $x3, $y1, $y2, $width, $color, $misccolor, $w, $h, $brush );
@@ -3071,8 +2498,7 @@ sub _draw_right_legend
## @fn private int _draw_top_legend()
# put the legend on top of the chart
# @return status
-sub _draw_top_legend
-{
+sub _draw_top_legend {
my $self = shift;
my @labels = @{ $self->{'legend_labels'} };
my ( $x1, $y1, $x2, $x3, $y2, $empty_width, $max_label_width );
@@ -3274,8 +2700,7 @@ sub _draw_left_legend
# Just return in this case. This routine may be overwritten by
# subclasses.
# @return 1
-sub _draw_none_legend
-{
+sub _draw_none_legend {
my $self = shift;
my $status = 1;
@@ -3689,8 +3114,7 @@ sub _draw_x_number_ticks
## @fn private int _draw_x_ticks()
# draw the x-ticks and their labels
# @return status
-sub _draw_x_ticks
-{
+sub _draw_x_ticks {
my $self = shift;
my $data = $self->{'dataref'};
my $font = $self->{'tick_label_font'};
@@ -4003,8 +3427,7 @@ sub _draw_x_ticks
## @fn private int _draw_y_ticks()
# draw the y-ticks and their labels
# @return status
-sub _draw_y_ticks
-{
+sub _draw_y_ticks {
my $self = shift;
my $side = shift || 'left';
my $data = $self->{'dataref'};
@@ -4078,16 +3501,12 @@ sub _draw_y_ticks
$y1 -= $h / 2;
# now draw the labels
- for ( 0 .. $#labels )
- {
+ for ( 0 .. $#labels ) {
$y2 = $y1 - ( $delta * $_ );
$self->{'gd_obj'}->string( $font, $x1, $y2, $self->{'y_tick_labels'}[$_], $textcolor );
}
- }
- elsif ( $side eq 'both' )
- { # put the ticks on the both sides
- ## left side first
-
+ } elsif ( $side eq 'both' ) {
+ # put the ticks on the both sides, left side first
# get the base x-y values
$x1 = $self->{'curr_x_min'} + $self->{'text_space'};
$y1 = $self->{'curr_y_max'} - $h / 2;
@@ -4095,8 +3514,7 @@ sub _draw_y_ticks
# now draw the labels
$height = $self->{'curr_y_max'} - $self->{'curr_y_min'};
$delta = $height / ( $self->{'y_ticks'} - 1 );
- for ( 0 .. $#labels )
- {
+ for ( 0 .. $#labels ) {
$label = $self->{'y_tick_labels'}[$_];
$y2 = $y1 - ( $delta * $_ );
$x2 = $x1 + ( $w * $self->{'y_tick_label_length'} ) - ( $w * length($label) );
@@ -4110,13 +3528,11 @@ sub _draw_y_ticks
$x1 = $self->{'curr_x_min'};
$x2 = $self->{'curr_x_min'} + $self->{'tick_len'};
$y1 += $h / 2;
- for ( $s .. $f )
- {
+ for ( $s .. $f ) {
$y2 = $y1 - ( $delta * $_ );
$self->{'gd_obj'}->line( $x1, $y2, $x2, $y2, $misccolor );
if ( $self->true( $self->{grid_lines} )
- or $self->true( $self->{'y_grid_lines'} ) )
- {
+ or $self->true( $self->{'y_grid_lines'} ) ) {
$self->{'grid_data'}->{'y'}->[$_] = $y2;
}
}
@@ -4138,13 +3554,11 @@ sub _draw_y_ticks
# now draw the ticks (skipping the one at zero);
$x2 = $x1 + $self->{'tick_len'};
- for ( $s .. $f )
- {
+ for ( $s .. $f ) {
$y2 = $y1 - ( $delta * $_ );
$self->{'gd_obj'}->line( $x1, $y2, $x2, $y2, $misccolor ); # draw tick_line
if ( $self->true( $self->{grid_lines} )
- or $self->true( $self->{'y2_grid_lines'} ) )
- {
+ or $self->true( $self->{'y2_grid_lines'} ) ) {
$self->{'grid_data'}->{'y2'}->[$_] = $y2;
}
}
@@ -4154,15 +3568,12 @@ sub _draw_y_ticks
$y1 -= $h / 2;
# now draw the labels
- for ( 0 .. $#labels )
- {
+ for ( 0 .. $#labels ) {
$y2 = $y1 - ( $delta * $_ );
$self->{'gd_obj'}->string( $font, $x1, $y2, $self->{'y_tick_labels'}[$_], $textcolor );
}
- }
- else
- { # just the left side
- # get the base x-y values
+ } else { # just the left side
+ # get the base x-y values
$x1 = $self->{'curr_x_min'} + $self->{'text_space'};
$y1 = $self->{'curr_y_max'} - $h / 2;
@@ -4170,8 +3581,7 @@ sub _draw_y_ticks
$height = $self->{'curr_y_max'} - $self->{'curr_y_min'};
$self->{'y_ticks'} = 2 if $self->{'y_ticks'} < 2;
$delta = $height / ( $self->{'y_ticks'} - 1 );
- for ( 0 .. $#labels )
- {
+ for ( 0 .. $#labels ) {
$label = $self->{'y_tick_labels'}[$_];
$y2 = $y1 - ( $delta * $_ );
$x2 = $x1 + ( $w * $self->{'y_tick_label_length'} ) - ( $w * length($label) );
@@ -4185,13 +3595,11 @@ sub _draw_y_ticks
$x1 = $self->{'curr_x_min'};
$x2 = $self->{'curr_x_min'} + $self->{'tick_len'};
$y1 += $h / 2;
- for ( $s .. $f )
- {
+ for ( $s .. $f ) {
$y2 = $y1 - ( $delta * $_ );
$self->{'gd_obj'}->line( $x1, $y2, $x2, $y2, $misccolor );
if ( $self->true( $self->{'grid_lines'} )
- or $self->true( $self->{'y_grid_lines'} ) )
- {
+ or $self->true( $self->{'y_grid_lines'} ) ) {
$self->{'grid_data'}->{'y'}->[$_] = $y2;
}
}
@@ -4207,10 +3615,8 @@ sub _draw_y_ticks
## @fn private int _grey_background()
# put a grey background on the plot of the data itself
# @return status
-sub _grey_background
-{
+sub _grey_background {
my $self = shift;
-
# draw it
$self->{'gd_obj'}
->filledRectangle( $self->{'curr_x_min'}, $self->{'curr_y_min'}, $self->{'curr_x_max'}, $self->{'curr_y_max'},
@@ -4223,8 +3629,7 @@ sub _grey_background
## @fn private int _draw_grid_lines()
# draw grid_lines
# @return status
-sub _draw_grid_lines
-{
+sub _draw_grid_lines {
my $self = shift;
$self->_draw_x_grid_lines();
$self->_draw_y_grid_lines();
@@ -4235,17 +3640,14 @@ sub _draw_grid_lines
## @fn private int _draw_x_grid_lines()
# draw grid_lines for x
# @return status
-sub _draw_x_grid_lines
-{
+sub _draw_x_grid_lines {
my $self = shift;
my $grid_role = shift || 'x_grid_lines';
my $gridcolor = $self->_color_role_to_index($grid_role);
my ( $x, $y, $i );
- foreach $x ( @{ $self->{grid_data}->{'x'} } )
- {
- if ( defined $x )
- {
+ foreach $x ( @{ $self->{grid_data}->{'x'} } ) {
+ if ( defined $x ) {
$self->{gd_obj}->line( ( $x, $self->{'curr_y_min'} + 1 ), $x, ( $self->{'curr_y_max'} - 1 ), $gridcolor );
}
}
@@ -4255,24 +3657,20 @@ sub _draw_x_grid_lines
## @fn private int _draw_y_grid_lines()
# draw grid_lines for y
# @return status
-sub _draw_y_grid_lines
-{
+sub _draw_y_grid_lines {
my $self = shift;
my $grid_role = shift || 'y_grid_lines';
my $gridcolor = $self->_color_role_to_index($grid_role);
my ( $x, $y, $i );
#Look if I'm an HorizontalBars object
- if ( $self->isa('Chart::HorizontalBars') )
- {
+ if ( $self->isa('Chart::HorizontalBars') ) {
for ( $i = 0 ; $i < ( $#{ $self->{grid_data}->{'y'} } ) + 1 ; $i++ )
{
$y = $self->{grid_data}->{'y'}->[$i];
$self->{gd_obj}->line( ( $self->{'curr_x_min'} + 1 ), $y, ( $self->{'curr_x_max'} - 1 ), $y, $gridcolor );
}
- }
- else
- {
+ } else {
# loop for y values is a little different. This is to discard the first
# and last values we were given - the top/bottom of the chart area.
@@ -4288,29 +3686,23 @@ sub _draw_y_grid_lines
## @fn private int _draw_y2_grid_lines()
# draw grid_lines for y
# @return status
-sub _draw_y2_grid_lines
-{
+sub _draw_y2_grid_lines {
my $self = shift;
my $grid_role = shift || 'y2_grid_lines';
my $gridcolor = $self->_color_role_to_index($grid_role);
my ( $x, $y, $i );
#Look if I'm an HorizontalBars object
- if ( $self->isa('Chart::HorizontalBars') )
- {
- for ( $i = 0 ; $i < ( $#{ $self->{grid_data}->{'y'} } ) + 1 ; $i++ )
- {
+ if ( $self->isa('Chart::HorizontalBars') ) {
+ for ( $i = 0 ; $i < ( $#{ $self->{grid_data}->{'y'} } ) + 1 ; $i++ ) {
$y = $self->{grid_data}->{'y'}->[$i];
$self->{gd_obj}->line( ( $self->{'curr_x_min'} + 1 ), $y, ( $self->{'curr_x_max'} - 1 ), $y, $gridcolor );
}
- }
- else
- {
+ } else {
# loop for y2 values is a little different. This is to discard the first
# and last values we were given - the top/bottom of the chart area.
- for ( $i = 1 ; $i < $#{ $self->{grid_data}->{'y2'} } ; $i++ )
- {
+ for ( $i = 1 ; $i < $#{ $self->{grid_data}->{'y2'} } ; $i++ ) {
$y = $self->{grid_data}->{'y2'}->[$i];
$self->{gd_obj}->line( ( $self->{'curr_x_min'} + 1 ), $y, ( $self->{'curr_x_max'} - 1 ), $y, $gridcolor );
}
@@ -4332,16 +3724,14 @@ sub _draw_y2_grid_lines
# @param role
#
# @return status
-sub _prepare_brush
-{
+sub _prepare_brush {
my $self = shift;
my $color = shift;
my $type = shift;
my $role = shift || 'default';
my $brushStyle = $self->{'brushStyle'};
- if ( defined $role )
- {
+ if ( defined $role ) {
my (@brushStyles) = $self->_brushStyles_of_roles($role);
$brushStyle = $brushStyles[0];
}
@@ -4355,8 +3745,7 @@ sub _prepare_brush
if ( !defined($type) ) { $type = 'point'; }
if ( ( !length($type) )
- || ( !grep { $type eq $_ } ( 'line', 'point' ) ) )
- {
+ || ( !grep { $type eq $_ } ( 'line', 'point' ) ) ) {
$brushStyle = $self->{'brushStyle'};
$type = 'line' if ref $self eq 'Chart::Lines';
$type = 'point' if ref $self eq 'Chart::Points';
@@ -4368,12 +3757,9 @@ sub _prepare_brush
@rgb = $self->{'gd_obj'}->rgb($color);
# get the appropriate brush size
- if ( $type eq 'line' )
- {
+ if ( $type eq 'line' ) {
$radius = $self->{'brush_size'} / 2;
- }
- elsif ( $type eq 'point' )
- {
+ } elsif ( $type eq 'point' ) {
$radius = $self->{'pt_size'} / 2;
}
@@ -4386,8 +3772,7 @@ sub _prepare_brush
$brush->transparent($white);
# draw the circle
- if ( $type eq 'line' )
- {
+ if ( $type eq 'line' ) {
$brush->arc( $radius - 1, $radius - 1, $radius, $radius, 0, 360, $newcolor );
$brush->fill( $radius - 1, $radius - 1, $newcolor );
@@ -4402,8 +3787,7 @@ sub _prepare_brush
}
- if ( $type eq 'point' )
- {
+ if ( $type eq 'point' ) {
$brushStyle = $self->{'brushStyle'}
unless grep { $brushStyle eq $_ } (
'FilledCircle', 'circle', 'donut', 'OpenCircle',
@@ -4414,8 +3798,7 @@ sub _prepare_brush
my ( $xc, $yc ) = ( $radius, $radius );
- if ( grep { $brushStyle eq $_ } ( 'default', 'circle', 'donut', 'OpenCircle', 'FilledCircle' ) )
- {
+ if ( grep { $brushStyle eq $_ } ( 'default', 'circle', 'donut', 'OpenCircle', 'FilledCircle' ) ) {
$brush->arc( $xc, $yc, $radius, $radius, 0, 360, $newcolor );
$brush->fill( $xc, $yc, $newcolor );
@@ -4429,8 +3812,7 @@ sub _prepare_brush
}
}
- if ( grep { $brushStyle eq $_ } ( 'triangle', 'upsidedownTriangle' ) )
- {
+ if ( grep { $brushStyle eq $_ } ( 'triangle', 'upsidedownTriangle' ) ) {
my $poly = new GD::Polygon;
my $sign = ( $brushStyle eq 'triangle' ) ? 1 : (-1);
my $z = int( 0.8 * $radius ); # scaling factor
@@ -4444,8 +3826,7 @@ sub _prepare_brush
$brush->filledPolygon( $poly, $newcolor );
}
- if ( $brushStyle eq 'fatPlus' )
- {
+ if ( $brushStyle eq 'fatPlus' ) {
my $poly = new GD::Polygon;
my $z = int( 0.3 * $radius );
@@ -4467,8 +3848,7 @@ sub _prepare_brush
$brush->filledPolygon( $poly, $newcolor );
}
- if ( $brushStyle eq 'Star' || $brushStyle eq 'OpenStar' )
- {
+ if ( $brushStyle eq 'Star' || $brushStyle eq 'OpenStar' ) {
my $poly = new GD::Polygon;
my $z = int($radius);
@@ -4522,19 +3902,15 @@ sub _prepare_brush
if ( grep { $brushStyle eq $_ } ( 'square', 'hollowSquare', 'OpenRectangle' ) )
{
my $z = int( 0.5 * $radius );
-
$brush->filledRectangle( $xc - $z, $yc - $z, $xc + $z, $yc + $z, $newcolor );
- if ( $brushStyle eq 'hollowSquare' || $brushStyle eq 'OpenRectangle' )
- {
+ if ( $brushStyle eq 'hollowSquare' || $brushStyle eq 'OpenRectangle' ) {
$z = int( $z / 2 );
-
$brush->filledRectangle( $xc - $z, $yc - $z, $xc + $z, $yc + $z, $white );
}
}
- if ( grep { $brushStyle eq $_ } ( 'FilledDiamond', 'OpenDiamond' ) )
- {
+ if ( grep { $brushStyle eq $_ } ( 'FilledDiamond', 'OpenDiamond' ) ) {
my $z = int( 0.75 * $radius );
$brush->line( $xc + $z, $yc, $xc, $yc + $z, $newcolor );
@@ -4542,9 +3918,7 @@ sub _prepare_brush
$brush->line( $xc - $z, $yc, $xc, $yc - $z, $newcolor );
$brush->line( $xc, $yc - $z, $xc + $z, $yc, $newcolor );
- if ( $brushStyle eq 'FilledDiamond' )
- {
-
+ if ( $brushStyle eq 'FilledDiamond' ) {
# and fill it
$brush->fill( $radius - 1, $radius - 1, $newcolor );
}
@@ -4561,10 +3935,9 @@ sub _prepare_brush
# if the user does not provide another function
#
# @return status
-sub _default_f_tick
-{
+sub _default_f_tick {
my $label = shift;
-
+
return $label;
}
@@ -4572,8 +3945,7 @@ sub _default_f_tick
# Get ratio width_x/width_y
#
# @return ratio width_x and width_y
-sub _xyRatio
-{
+sub _xyRatio {
my $self = shift;
my $width_x = $self->{'curr_x_max'} - $self->{'curr_x_min'} + 1;
my $width_y = $self->{'curr_y_max'} - $self->{'curr_y_min'} + 1;
@@ -4586,8 +3958,7 @@ sub _xyRatio
#
# @return width(interval) of reality in x direction
#
-sub _xPixelInReal
-{
+sub _xPixelInReal {
my $self = shift;
my $width_x = $self->{'curr_x_max'} - $self->{'curr_x_min'} + 1;
my ( $min, $max ) = $self->_find_x_range();
@@ -4601,8 +3972,7 @@ sub _xPixelInReal
#
# @return width(interval) of reality in y direction
#
-sub _yPixelInReal
-{
+sub _yPixelInReal {
my $self = shift;
my $width_y = $self->{'curr_y_max'} - $self->{'curr_y_min'} + 1;
my ( $min, $max, $flag_all_integers ) = $self->_find_y_range();
@@ -4611,6 +3981,4 @@ sub _yPixelInReal
return $yRealWidth / $width_y;
}
-
1; # be a good module and return positive
-
diff --git a/lib/Chart/BrushStyles.pm b/lib/Chart/BrushStyles.pm
index 9b0128d..e6c74a0 100644
--- a/lib/Chart/BrushStyles.pm
+++ b/lib/Chart/BrushStyles.pm
@@ -4,8 +4,7 @@
use v5.12;
package Chart::BrushStyles;
-our $VERSION = 2.400.5;
-
+our $VERSION = 'v2.403.2';
use Carp;
use GD;
diff --git a/lib/Chart/Color.pm b/lib/Chart/Color.pm
index 3d8c0be..775dd7d 100644
--- a/lib/Chart/Color.pm
+++ b/lib/Chart/Color.pm
@@ -1,60 +1,525 @@
-# Chart::Color: color object with basic color space method and conversion
+# Chart::Color: read only color holding object
+# with methods for relation, mixing and transitions
use v5.12;
package Chart::Color;
+our $VERSION = 'v2.403.2';
-use Chart::Color::Named;
-use Chart::Color::Scheme;
+use Carp;
+use Chart::Color::Constant;
+my $new_help = 'constructor of Chart::Color object needs either:'.
+ ' 1. RGB or HSL hash or ref: ->new(r => 255, g => 0, b => 0), ->new({ h => 0, s => 100, l => 50 })'.
+ ' 2. RGB array or ref: ->new( [255, 0, 0 ]) or >new( 255, 0, 0 )'.
+ ' 3. hex form "#FF0000" or "#f00" 4. a name: "red" or "SVG:red".';
+## constructor #########################################################
+
sub new {
- my ($pkg) = shift;
- return "need 3 arguments in hash form e.g. (r => 1, g => 2, b => 3)" unless @_ == 6;
- my $hash = {lc($_[0]) => $_[1], lc($_[2]) => $_[3], lc($_[4]) => $_[5] };
- my ($self, $rest);
- if (exists $hash->{'r'} and exists $hash->{'g'} and exists $hash->{'b'}) {
- $rest = rgb_to_hsl( $hash->{'r'}, $hash->{'g'}, $hash->{'b'} );
- return "RGB values are out of range" unless ref $rest eq 'ARRAY';
- $self = [$hash->{'r'}, $hash->{'g'}, $hash->{'b'}, @$rest];
- } elsif (exists $hash->{'h'} and exists $hash->{'s'} and exists $hash->{'l'}) {
- $rest = hsl_to_rgb( $hash->{'h'}, $hash->{'s'}, $hash->{'l'} );
- return "HSL values are out of range" unless ref $rest eq 'ARRAY';
- $self = [@$rest, $hash->{'h'}, $hash->{'s'}, $hash->{'l'}];
- } else { return "need argument keys to be r, g, b or h, s, l" }
- bless $self;
+ my ($pkg, @args) = @_;
+ @args = ([@args]) if @args == 3;
+ @args = ({ $args[0] => $args[1], $args[2] => $args[3], $args[4] => $args[5] }) if @args == 6;
+ return carp $new_help unless @args == 1;
+ _new_from_scalar($args[0]);
}
+sub _new_from_scalar {
+ my ($arg) = shift;
+ my $name;
+ if (not ref $arg){ # resolve 'color_name' or '#RRGGBB' -> ($r, $g, $b)
+ my @rgb = _rgb_from_name_or_hex($arg);
+ return unless @rgb == 3;
+ $name = $arg if index( $arg, ':') > -1;
+ $arg = { r => $rgb[0], g => $rgb[1], b => $rgb[2] };
+ } elsif (ref $arg eq 'ARRAY'){
+ return carp "need exactly 3 RGB numbers!" unless @$arg == 3;
+ $arg = { r => $arg->[0], g => $arg->[1], b => $arg->[2] };
+ }
+ return carp $new_help unless ref $arg eq 'HASH' and keys %$arg == 3;
+ my %named_arg = map { _shrink_key($_) => $arg->{$_} } keys %$arg; # reduce keys to lc first char
+ my (@rgb, @hsl);
+ if (exists $named_arg{'r'} and exists $named_arg{'g'} and exists $named_arg{'b'}) {
+ @rgb = Chart::Color::Value::trim_rgb(@named_arg{qw/r g b/});
+ @hsl = Chart::Color::Value::hsl_from_rgb( @rgb );
+ } elsif (exists $named_arg{'h'} and exists $named_arg{'s'} and exists $named_arg{'l'}) {
+ @hsl = Chart::Color::Value::trim_hsl( @named_arg{qw/h s l/});
+ @rgb = Chart::Color::Value::rgb_from_hsl( @hsl );
+ } else { return carp "argument keys need to be r, g and b or h, s and l (long names and upper case work too!)" }
+ $name = Chart::Color::Constant::name_from_rgb( @rgb ) unless defined $name;
+ bless [$name, @rgb, @hsl];
+}
+sub _rgb_from_name_or_hex {
+ my $arg = shift;
+ my $i = index( $arg, ':');
+ if (substr($arg, 0, 1) eq '#'){ # resolve #RRGGBB -> ($r, $g, $b)
+ return Chart::Color::Value::rgb_from_hex( $arg );
+ } elsif ($i > -1 ){ # resolve pallet:name -> ($r, $g, $b)
+ my $pallet_name = substr $arg, 0, $i-1;
+ my $color_name = substr $arg, $i+1;
+
+ my $module_base = 'Graphics::ColorNames';
+ eval "use $module_base";
+ return carp "$module_base is not installed, but it's needed to load external colors" if $@;
+
+ my $module = $module_base.'::'.$pallet_name;
+ eval "use $module";
+ return carp "$module is not installed, to load color '$color_name'" if $@;
+
+ my $pal = Graphics::ColorNames->new( $pallet_name );
+ my @rgb = $pal->rgb( $color_name );
+ return carp "color '$color_name' was not found, propably not part of $module" unless @rgb == 3;
+ @rgb;
+ } else { # resolve name -> ($r, $g, $b)
+ my @rgb = Chart::Color::Constant::rgb_from_name( $arg );
+ carp "'$arg' is an unknown color name, please check Chart::Color::Constant::all_names()." unless @rgb == 3;
+ @rgb;
+ }
+}
-sub rgb { @{$_[0]}[0 .. 2] }
-sub hsl { @{$_[0]}[3 .. 5] }
-sub hex { sprintf "%x%x%x", @{$_[0]}[0 .. 2]}
+## getter ##############################################################
-sub rgb_to_hsl{
- my ($r, $g, $b) = @_;
-}
+sub name { $_[0][0] }
+sub red { $_[0][1] }
+sub green { $_[0][2] }
+sub blue { $_[0][3] }
+sub hue { $_[0][4] }
+sub saturation { $_[0][5] }
+sub lightness { $_[0][6] }
+sub string { $_[0][0] ? $_[0][0] : "[ $_[0][1], $_[0][2], $_[0][3] ]" }
-sub hsl_to_rgb {
- my ($h, $s, $l) = @_;
-}
+sub hsl { @{$_[0]}[4 .. 6] }
+sub rgb { @{$_[0]}[1 .. 3] }
+sub rgb_hex { Chart::Color::Value::hex_from_rgb( $_[0]->rgb() ) }
+## methods ##############################################################
+
+sub distance_to {
+ my ($self, $c2, $metric) = @_;
+ return croak "missing argument: color object or scalar color definition" unless defined $c2;
+ $c2 = (ref $c2 eq __PACKAGE__) ? $c2 : Chart::Color->new( $c2 );
+ return unless ref $c2 eq __PACKAGE__;
+
+ return Chart::Color::Value::distance_hsl( [$self->hsl], [$c2->hsl] ) unless defined $metric;
+ $metric = lc $metric;
+ return Chart::Color::Value::distance_hsl( [$self->hsl], [$c2->hsl] ) if $metric eq 'hsl';
+ return Chart::Color::Value::distance_rgb( [$self->rgb], [$c2->rgb] ) if $metric eq 'rgb';
+ my @delta_rgb = Chart::Color::Value::difference_rgb( [$self->rgb], [$c2->rgb] );
+ my @delta_hsl = Chart::Color::Value::difference_hsl( [$self->hsl], [$c2->hsl] );
+ my $help = "unknown distance metric: $metric. try r, g, b, rg, rb, gb, rgb, h, s, l, hs, hl, sl, hsl (default).";
+ if (length $metric == 2){
+ if ($metric eq 'hs' or $metric eq 'sh') {return sqrt( $delta_hsl[0] ** 2 + $delta_hsl[1] ** 2 )}
+ elsif ($metric eq 'hl' or $metric eq 'lh') {return sqrt( $delta_hsl[0] ** 2 + $delta_hsl[2] ** 2 )}
+ elsif ($metric eq 'sl' or $metric eq 'ls') {return sqrt( $delta_hsl[1] ** 2 + $delta_hsl[2] ** 2 )}
+ elsif ($metric eq 'rg' or $metric eq 'gr') {return sqrt( $delta_rgb[0] ** 2 + $delta_rgb[1] ** 2 )}
+ elsif ($metric eq 'rb' or $metric eq 'br') {return sqrt( $delta_rgb[0] ** 2 + $delta_rgb[2] ** 2 )}
+ elsif ($metric eq 'gb' or $metric eq 'bg') {return sqrt( $delta_rgb[1] ** 2 + $delta_rgb[2] ** 2 )}
+ }
+ $metric = substr $metric, 0, 1;
+ $metric eq 'h' ? $delta_hsl[0] :
+ $metric eq 's' ? $delta_hsl[1] :
+ $metric eq 'l' ? $delta_hsl[2] :
+ $metric eq 'r' ? $delta_rgb[0] :
+ $metric eq 'g' ? $delta_rgb[1] :
+ $metric eq 'b' ? $delta_rgb[2] : croak $help;
+}
sub add {
- my ($self) = shift;
+ my ($self, @args) = @_;
+ my $add_help = 'Chart::Color->add argument options: 1. a color object with optional factor as second arg, '.
+ '2. a color name as string, 3. a color hex definition as in "#FF0000"'.
+ '4. a list of thre values (RGB) (also in an array ref)'.
+ '5. a hash with RGB and HSL keys (as in new, but can be mixed) (also in an hash ref).';
+ if ((@args == 1 or @args == 2) and ref $args[0] ne 'HASH'){
+ my @add_rgb;
+ if (ref $args[0] eq __PACKAGE__){
+ @add_rgb = $args[0]->rgb;
+ } elsif (ref $args[0] eq 'ARRAY'){
+ @add_rgb = @{$args[0]};
+ return carp "array ref argument needs to have 3 numerical values (RGB) in it." unless @add_rgb == 3;
+ } elsif (not ref $args[0] and not $args[0] =~ /^\d/){
+ @add_rgb = _rgb_from_name_or_hex($args[0]);
+ return unless @add_rgb > 1;
+ } else { return carp $add_help }
+ @add_rgb = ($add_rgb[0] * $args[1], $add_rgb[1] * $args[1], $add_rgb[2] * $args[1]) if defined $args[1];
+ @args = @add_rgb;
+ }
+ my @rgb = $self->rgb;
+ if (@args == 3) {
+ @rgb = Chart::Color::Value::trim_rgb( $rgb[0] + $args[0], $rgb[1] + $args[1], $rgb[2] + $args[2]);
+ return Chart::Color->new( @rgb );
+ }
+ return carp $add_help unless @args and ((@args % 2 == 0) or (ref $args[0] eq 'HASH'));
+ my %arg = ref $args[0] eq 'HASH' ? %{$args[0]} : @args;
+ my %named_arg = map {_shrink_key($_) => $arg{$_}} keys %arg; # clean keys
+ $rgb[0] += delete $named_arg{'r'} // 0;
+ $rgb[1] += delete $named_arg{'g'} // 0;
+ $rgb[2] += delete $named_arg{'b'} // 0;
+ return Chart::Color->new( Chart::Color::Value::trim_rgb( @rgb ) ) unless %named_arg;
+ my @hsl = Chart::Color::Value::_hsl_from_rgb( @rgb );
+ $hsl[0] += delete $named_arg{'h'} // 0;
+ $hsl[1] += delete $named_arg{'s'} // 0;
+ $hsl[2] += delete $named_arg{'l'} // 0;
+ if (%named_arg) {
+ my @nrkey = grep {/^\d+$/} keys %named_arg;
+ return carp "wrong number of numerical arguments (only 3 needed)" if @nrkey;
+ carp "got unknown hash key starting with", map {' '.$_} keys %named_arg;
+ }
+ @hsl = Chart::Color::Value::trim_hsl( @hsl );
+ Chart::Color->new({ H => $hsl[0], S => $hsl[1], L => $hsl[2] });
}
-sub distance {
- my ($self) = shift;
+sub blend_with {
+ my ($self, $c2, $pos) = @_;
+ return carp "need color object or definition as first argument" unless defined $c2;
+ $c2 = (ref $c2 eq __PACKAGE__) ? $c2 : _new_from_scalar( $c2 );
+ return unless ref $c2 eq __PACKAGE__;
+ $pos //= 0.5;
+ my $delta_hue = $c2->hue - $self->hue;
+ $delta_hue -= 360 if $delta_hue > 180;
+ $delta_hue += 360 if $delta_hue < -180;
+ my @hsl = ( $self->hue + ($pos * $delta_hue),
+ $self->saturation + ($pos * ($c2->saturation - $self->saturation)),
+ $self->lightness + ($pos * ($c2->lightness - $self->lightness))
+ );
+ @hsl = Chart::Color::Value::trim_hsl( @hsl );
+ Chart::Color->new({ H => $hsl[0], S => $hsl[1], L => $hsl[2] });
+}
+
+
+sub gradient_to {
+ my ($self, $c2, $steps, $power) = @_;
+ return carp "need color object or definition as first argument" unless defined $c2;
+ $c2 = (ref $c2 eq __PACKAGE__) ? $c2 : _new_from_scalar( $c2 );
+ return unless ref $c2 eq __PACKAGE__;
+ $steps //= 3;
+ $power //= 1;
+ return carp "third argument (dynamics), has to be positive (>= 0)" if $power <= 0;
+ return $self if $steps == 1;
+ my @colors = ();
+ my @delta_hsl = ($c2->hue - $self->hue, $c2->saturation - $self->saturation,
+ $c2->lightness - $self->lightness );
+ $delta_hsl[0] -= 360 if $delta_hsl[0] > 180;
+ $delta_hsl[0] += 360 if $delta_hsl[0] < -180;
+ for my $i (1 .. $steps-2){
+ my $pos = ($i / ($steps-1)) ** $power;
+ my @hsl = ( $self->hue + ($pos * $delta_hsl[0]),
+ $self->saturation + ($pos * $delta_hsl[1]),
+ $self->lightness + ($pos * $delta_hsl[2]));
+ @hsl = Chart::Color::Value::trim_hsl( @hsl );
+ push @colors, Chart::Color->new({ H => $hsl[0], S => $hsl[1], L => $hsl[2] });
+ }
+ $self, @colors, $c2;
}
-sub gradient {
+sub complementary {
my ($self) = shift;
+ my ($count) = int ((shift // 1) + 0.5);
+ my ($saturation_change) = shift // 0;
+ my ($lightness_change) = shift // 0;
+ my @hsl2 = my @hsl_l = my @hsl_r = $self->hsl;
+ $hsl2[0] += 180;
+ $hsl2[1] += $saturation_change;
+ $hsl2[2] += $lightness_change;
+ @hsl2 = Chart::Color::Value::trim_hsl( @hsl2 ); # HSL of C2
+ my $c2 = Chart::Color->new({ h => $hsl2[0], s => $hsl2[1], l => $hsl2[2] });
+ return $c2 if $count < 2;
+ my (@colors_r, @colors_l);
+ my @delta = (360 / $count, (($hsl2[1] - $hsl_r[1]) * 2 / $count), (($hsl2[2] - $hsl_r[2]) * 2 / $count) );
+ for (1 .. ($count - 1) / 2){
+ $hsl_r[$_] += $delta[$_] for 0..2;
+ $hsl_l[0] -= $delta[0];
+ $hsl_l[$_] = $hsl_r[$_] for 1,2;
+ $hsl_l[0] += 360 if $hsl_l[0] < 0;
+ $hsl_r[0] -= 360 if $hsl_l[0] >= 360;
+ push @colors_r, Chart::Color->new({ H => $hsl_r[0], S => $hsl_r[1], L => $hsl_r[2] });
+ unshift @colors_l, Chart::Color->new({ H => $hsl_l[0], S => $hsl_l[1], L => $hsl_l[2] });
+ }
+ push @colors_r, $c2 unless $count % 2;
+ $self, @colors_r, @colors_l;
}
+sub _shrink_key { lc substr( $_[0], 0, 1 ) }
1;
__END__
+=pod
+
+=head1 NAME
+
+Chart::Color - read only single color holding objects
+
+=head1 SYNOPSIS
+
+ my $red = Chart::Color->new('red');
+ say $red->add('blue')->name; # magenta, mixed in RGB space
+ Chart::Color->new( 0, 0, 255)->hsl # 240, 100, 50 = blue
+ $blue->blend_with({H=> 0, S=> 0, L=> 80}, 0.1);# mix blue with a little grey
+ $red->gradient( '#0000FF', 10); # 10 colors from red to blue
+ $red->complementary( 3 ); # get fitting red green and blue
+
+=head1 DESCRIPTION
+
+This module is designed for internal usage. It handles also all color
+definitions done by users with method "$chart->set(color => {...})".
+To see which formats are allowed there, read the next section and please
+note that ->set() handles only scalar values.
+
+=head1 CONSTRUCTOR
+
+There are many options to create a color objects. In short you can
+either use the name of a predefined constant or provide values in RGB
+or HSL color space.
+
+=head2 new( 'name' )
+
+Get a color by providing a name from the X11 or HTML (SVG) standard or
+a Pantone report. Upper/Camel case will be treated as lower case and
+inserted underscore letters ('_') will be ignored as perl does in
+numbers (1_000 == 1000) (see more under L<Chart::Color::Constant>).
+
+ my $color = Chart::Color->new('Emerald');
+ my @names = Chart::Color::Constant::all_names(); # select from these
+
+=head2 new( 'standard:color' )
+
+Get a color by name from a specific standard as provided by an external
+module L<Graphics::ColorNames>::* , which has to be installed separately.
+* is a placeholder for the pallet name, which might be: Crayola, CSS,
+EmergyC, GrayScale, HTML, IE, SVG, Werner, WWW or X. In ladder case
+Graphics::ColorNames::X has to be installed.
+
+ my $color = Chart::Color->new('SVG:green');
+ my @s = Graphics::ColorNames::all_schemes(); # installed pallets
+
+=head2 new( '#rgb' )
+
+Color definitions in hexadecimal format as widely used in the web, are
+also acceptable.
+
+ my $color = Chart::Color->new('#FF0000');
+ my $color = Chart::Color->new('#f00'); # works too
+
+
+=head2 new( [$r, $g, $b] )
+
+Triplet of integer RGB values (L</red>, L</green> and L</blue> : 0 .. 255).
+Out of range values will be corrected to the closest value in range.
+
+
+ my $red = Chart::Color->new( 255, 0, 0 );
+ my $red = Chart::Color->new([255, 0, 0]); # does the same
+
+
+=head2 new( {r => $r, g => $g, b => $b} )
+
+Hash with the keys 'r', 'g' and 'b' does the same as previous paragraph,
+only more declarative. Casing of the keys will be normalised and only
+the first letter of each key is significant.
+
+ my $red = Chart::Color->new( r => 255, g => 0, b => 0 );
+ my $red = Chart::Color->new({r => 255, g => 0, b => 0}); # works too
+ ... Color->new( Red => 255, Green => 0, Blue => 0); # also fine
+
+=head2 new( {h => $h, s => $s, l => $l} )
+
+To define a color in HSL space, with values for L</hue>, L</saturation> and
+L</lightness>, use the following keys, which will be normalized as decribed
+in previous paragraph. Out of range values will be corrected to the
+closest value in range. Since L</hue> is a polar coordinate,
+it will be rotated into range, e.g. 361 = 1.
+
+ my $red = Chart::Color->new( h => 0, s => 100, b => 50 );
+ my $red = Chart::Color->new({h => 0, s => 100, b => 50}); # good too
+ ... ->new( Hue => 0, Saturation => 100, Lightness => 50 ); # also fine
+
+
+=head1 GETTER / ATTRIBUTES
+
+are all read only methods - giving access to different parts of the
+objects data.
+
+=head2 name
+
+Name of the color in the X11 or HTML (SVG) standard or the Pantone report.
+The name will be found and filled in, even when the object is created
+with RGB or HSL values. If the color is not found in any of the mentioned
+standards, it returns an empty string.
+
+=head2 string
+
+String to reproduce color object by: Chart::Color->new (eval $string).
+It is either the name (if color has one) or the stringified triplet:
+"[ $red, $green, $blue ]".
+
+=head2 red
+
+Integer between 0 .. 255 describing the red portion in RGB space.
+
+=head2 green
+
+Integer between 0 .. 255 describing the green portion in RGB space.
+
+=head2 blue
+
+Integer between 0 .. 255 describing the blue portion in RGB space.
+
+=head2 rgb
+
+Three values of red, green and blue (see above).
+
+=head2 rgb_hex
+
+String starting with '#', followed by six hexadecimal figures.
+Two digits for each of red, green and blue value - the format used in CSS.
+
+=head2 hue
+
+Integer between 0 .. 359 describing the angle (in degrees) of the
+circular dimension in HSL space named hue.
+0 approximates red, 30 - orange, 60 - yellow, 120 - green, 180 - cyan,
+240 - blue, 270 - violet, 300 - magenta, 330 - pink.
+0 and 360 point to the same coordinate, but this module only deals with 0.
+
+=head2 saturation
+
+Integer between 0 .. 100 describing percentage of saturation in HSL space.
+0 is grey and 100 the most colorful (except when lightness is 0 or 100).
+
+=head2 lightness
+
+Integer between 0 .. 100 describing percentage of lightness in HSL space.
+0 is always black, 100 is always white and 50 the most colorful
+(depending on hue value) (or grey - if saturation = 0).
+
+=head2 hsl
+
+Three values of hue, saturation and lightness (see above).
+
+=head1 METHODS
+
+create new, related color (objects) or compute similarity of colors
+
+=head2 distance_to
+
+A number that measures the distance (difference) between two colors:
+1. the calling object (C1) and 2. a provided first argument C2 -
+color object or scalar data that is acceptable by new method :
+name or #hex or [$r, $g, $b] or {...} (see chapter L<CONSTRUCTOR>).
+
+If no second argument is provided, than the difference is the Euclidean
+distance in cylindric HSL space. If second argument is 'rgb' or 'RGB',
+then its the Euclidean distance in RGB space. But als subspaces of both
+are possible, as r, g, b, rg, rb, gb, h, s, l, hs, hl, and sl.
+
+ my $d = $blue->distance_to( 'lapisblue' ); # how close to lapis color?
+ # how different is my blue value to airy_blue
+ $d = $blue->distance_to( 'airyblue', 'Blue'); # same amount of blue?
+ $d = $color->distance_to( $c2, 'Hue' ); # same hue ?
+ $d = $color->distance_to( [10, 32, 112 ], 'rgb' );
+ $d = $color->distance_to( { Hue => 222, Sat => 23, Light => 12 } );
+
+=head2 add
+
+Create a Chart::Color object, by adding any RGB or HSL values to current
+color. (Same rules apply for key names as in new - values can be negative.)
+RGB and HSL can be combined, but please note that RGB are applied first.
+
+If the first argument is a Chart::Color object, than RGB values will be added.
+In that case an optional second argument is a factor (default = 1),
+by which the RGB values will be multiplied before being added. Negative
+values of that factor lead to darkening of result colors, but its not
+subtractive color mixing, since this module does not support CMY color
+space. All RGB operations follow the logic of additive mixing, and the
+result will be rounded (trimmed), to keep it inside the defined RGB space.
+
+ my $blue = Chart::Color->new('blue');
+ my $darkblue = $blue->add( Lightness => -25 );
+ my $blue2 = $blue->add( blue => 10 );
+ $blue->distance( $blue2 ); # == 0, can't get bluer than blue
+ my $color = $blue->add( $c2, -1.2 ); # subtract color c2 with factor 1.2
+
+=head2 blend_with
+
+Create Chart::Color object, that is the average of two colors in HSL space:
+1. the calling object (C1) and 2. a provided argument C2 (object or a
+refrence to data that is acceptable definition).
+
+The second argument is the blend ratio, which defaults to 0.5 ( 1:1 ).
+0 represents here C1 and 1 C2. Numbers below 0 and above 1 are possible,
+and will be applied, as long the result is inside the finite HSL space.
+There is a slight overlap with the add method which mostly operates in
+RGB (unless told so), while this method always operates in HSL space.
+
+ my $c = $color->blend_with( Chart::Color->new('silver') );
+ $color->blend_with( 'silver' ); # same thing
+ $color->blend_with( [192, 192, 192] ); # still same
+ my $difference = $color->blend_with( $c2, -1 );
+
+
+=head2 gradient_to
+
+Creates a gradient (a list of colors that build a transition) between
+current (C1) and a second, given color (C2).
+
+The first argument is C2. Either as an Chart::Color object or a
+scalar (name, hex or reference), which is acceptable to the method new.
+
+Second argument is the number $n of colors, which make up the gradient
+(including C1 and C2). It defaults to 3. These 3 colors C1, C2 and a
+color in between, which is the same as the result of method blend_with.
+
+Third argument is also a positive number $p, which defaults to one.
+It defines the dynamics of the transition between the two colors.
+If $p == 1 you get a linear transition - meaning the distance in HSL
+space (distance_hsl) is equal from one color to the next. If $p != 1,
+the formula $n ** $p starts to create a parabola function, which defines
+a none linear mapping. For values $n > 1 the transition starts by sticking
+to C1 and slowly getting faster and faster toward C2. Values $n < 1 do
+the opposite: starting by moving fastest from C1 to C2 (big distances)
+and becoming slower and slower.
+
+ my @colors = $c->gradient_to( $grey, 5 ); # we turn to grey
+ @colors = $c1->gradient_to( [14,10,222], 10, 3 ); # none linear gradient
+
+=head2 complementary
+
+Creates a set of complementary colors.
+It accepts 3 numerical arguments: n, delta_S and delta_L.
+
+Imagine an horizontal circle in HSL space, whith a center in the (grey)
+center column. The saturation and lightness of all colors on that
+circle is the same, they differ only in hue. The color of the current
+color object ($self a.k.a C1) lies on that circle as well as C2,
+which is 180 degrees (half the circumference) apposed to C1.
+
+This circle will be divided in $n (first argument) equal partitions,
+creating $n equally distanced colors. All of them will be returned,
+as objects, starting with C1. However, when $n is set to 1 (default),
+the result is only C2, which is THE complementary color to C1.
+
+The second argument moves C2 along the S axis (both directions),
+so that the center of the circle is no longer in the HSL middle column
+and the complementary colors differ in saturation. (C1 stays unmoved. )
+
+The third argument moves C2 along the L axis (vertical), which gives the
+circle a tilt, so that the complementary colors will differ in lightness.
+
+ my @colors = $c->complementary( 3, +20, -10 );
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright 2022 Herbert Breunung.
+
+This program is free software; you can redistribute it and/or modify it
+under same terms as Perl itself.
+
+=head1 AUTHOR
+
+Herbert Breunung, <lichtkind@cpan.org>
+
+=cut
diff --git a/lib/Chart/Color/Constant.pm b/lib/Chart/Color/Constant.pm
new file mode 100644
index 0000000..8abc217
--- /dev/null
+++ b/lib/Chart/Color/Constant.pm
@@ -0,0 +1,1136 @@
+use v5.12;
+
+# named colors from X11, HTML (SVG) standard and Pantone report
+
+package Chart::Color::Constant;
+our $VERSION = 'v2.403.2';
+use Carp;
+use Chart::Color::Value;
+
+our %rgbhsl_from_name = ( # 2.6 MB
+# http://en.wikipedia.org/wiki/Web_colors#X11_color_names
+ 'white' => [ 255, 255, 255, 0, 0, 100 ],
+ 'black' => [ 0, 0, 0, 0, 0, 0 ],
+ 'red' => [ 255, 0, 0, 0, 100, 50 ],
+ 'green' => [ 0, 128, 0, 120, 100, 25 ],
+ 'blue' => [ 0, 0, 255, 240, 100, 50 ],
+ 'yellow' => [ 255, 255, 0, 60, 100, 50 ],
+ 'purple' => [ 128, 0, 128, 300, 100, 25 ],
+ 'pink' => [ 255, 192, 203, 350, 100, 88 ],
+ 'peach' => [ 250, 125, 125, 0, 93, 74 ],
+ 'plum' => [ 221, 160, 221, 300, 47, 75 ],
+ 'mauve' => [ 200, 125, 125, 0, 41, 64 ],
+ 'brown' => [ 165, 42, 42, 0, 59, 41 ],
+ 'grey' => [ 225, 225, 225, 0, 0, 88 ],
+ 'aliceblue' => [ 240, 248, 255, 208, 100, 97 ],
+ 'antiquewhite' => [ 250, 235, 215, 34, 78, 91 ],
+ 'antiquewhite1' => [ 255, 239, 219, 33, 100, 93 ],
+ 'antiquewhite2' => [ 238, 223, 204, 34, 50, 87 ],
+ 'antiquewhite3' => [ 205, 192, 176, 33, 22, 75 ],
+ 'antiquewhite4' => [ 139, 131, 120, 35, 8, 51 ],
+ 'aqua' => [ 0, 255, 255, 180, 100, 50 ],
+ 'aquamarine' => [ 127, 255, 212, 160, 100, 75 ],
+ 'aquamarine1' => [ 127, 255, 212, 160, 100, 75 ],
+ 'aquamarine2' => [ 118, 238, 198, 160, 78, 70 ],
+ 'aquamarine3' => [ 102, 205, 170, 160, 51, 60 ], # not in X11
+ 'aquamarine4' => [ 69, 139, 116, 160, 34, 41 ],
+ 'azure' => [ 240, 255, 255, 180, 100, 97 ],
+ 'azure1' => [ 240, 255, 255, 180, 100, 97 ],
+ 'azure2' => [ 224, 238, 238, 180, 29, 91 ],
+ 'azure3' => [ 193, 205, 205, 180, 11, 78 ],
+ 'azure4' => [ 131, 139, 139, 180, 3, 53 ],
+ 'beige' => [ 245, 245, 220, 60, 56, 91 ],
+ 'bisque' => [ 255, 228, 196, 33, 100, 88 ],
+ 'bisque1' => [ 255, 228, 196, 33, 100, 88 ],
+ 'bisque2' => [ 238, 213, 183, 33, 62, 83 ],
+ 'bisque3' => [ 205, 183, 158, 32, 32, 71 ],
+ 'bisque4' => [ 139, 125, 107, 34, 13, 48 ],
+ 'blanchedalmond' => [ 255, 235, 205, 36, 100, 90 ],
+ 'blue1' => [ 0, 0, 255, 240, 100, 50 ],
+ 'blue2' => [ 0, 0, 238, 240, 100, 47 ],
+ 'blue3' => [ 0, 0, 205, 240, 100, 40 ],
+ 'blue4' => [ 0, 0, 139, 240, 100, 27 ],
+ 'blueviolet' => [ 138, 43, 226, 271, 76, 53 ],
+ 'brown1' => [ 255, 64, 64, 0, 100, 63 ],
+ 'brown2' => [ 238, 59, 59, 0, 84, 58 ],
+ 'brown3' => [ 205, 51, 51, 0, 61, 50 ],
+ 'brown4' => [ 139, 35, 35, 0, 60, 34 ],
+ 'burlywood' => [ 222, 184, 135, 34, 57, 70 ],
+ 'burlywood1' => [ 255, 211, 155, 34, 100, 80 ],
+ 'burlywood2' => [ 238, 197, 145, 34, 73, 75 ],
+ 'burlywood3' => [ 205, 170, 125, 34, 44, 65 ],
+ 'burlywood4' => [ 139, 115, 85, 33, 24, 44 ],
+ 'cadetblue' => [ 95, 158, 160, 182, 25, 50 ],
+ 'cadetblue1' => [ 152, 245, 255, 186, 100, 80 ],
+ 'cadetblue2' => [ 142, 229, 238, 186, 74, 75 ],
+ 'cadetblue3' => [ 122, 197, 205, 186, 45, 64 ],
+ 'cadetblue4' => [ 83, 134, 139, 185, 25, 44 ],
+ 'chartreuse' => [ 127, 255, 0, 90, 100, 50 ],
+ 'chartreuse1' => [ 127, 255, 0, 90, 100, 50 ],
+ 'chartreuse2' => [ 118, 238, 0, 90, 100, 47 ],
+ 'chartreuse3' => [ 102, 205, 0, 90, 100, 40 ],
+ 'chartreuse4' => [ 69, 139, 0, 90, 100, 27 ],
+ 'chocolate' => [ 210, 105, 30, 25, 75, 47 ],
+ 'chocolate1' => [ 255, 127, 36, 25, 100, 57 ],
+ 'chocolate2' => [ 238, 118, 33, 25, 86, 53 ],
+ 'chocolate3' => [ 205, 102, 29, 25, 75, 46 ],
+ 'chocolate4' => [ 139, 69, 19, 25, 76, 31 ],
+ 'coral' => [ 255, 127, 80, 16, 100, 66 ],
+ 'coral1' => [ 255, 114, 86, 10, 100, 67 ],
+ 'coral2' => [ 238, 106, 80, 10, 82, 62 ],
+ 'coral3' => [ 205, 91, 69, 10, 58, 54 ],
+ 'coral4' => [ 139, 62, 47, 10, 49, 36 ],
+ 'cornflowerblue' => [ 100, 149, 237, 219, 79, 66 ],
+ 'cornsilk' => [ 255, 248, 220, 48, 100, 93 ],
+ 'cornsilk1' => [ 255, 248, 220, 48, 100, 93 ],
+ 'cornsilk2' => [ 238, 232, 205, 49, 49, 87 ],
+ 'cornsilk3' => [ 205, 200, 177, 49, 22, 75 ],
+ 'cornsilk4' => [ 139, 136, 120, 51, 8, 51 ],
+ 'crimson' => [ 220, 20, 60, 348, 83, 47 ],
+ 'cyan' => [ 0, 255, 255, 180, 100, 50 ],
+ 'cyan1' => [ 0, 255, 255, 180, 100, 50 ],
+ 'cyan2' => [ 0, 238, 238, 180, 100, 47 ],
+ 'cyan3' => [ 0, 205, 205, 180, 100, 40 ],
+ 'cyan4' => [ 0, 139, 139, 180, 100, 27 ],
+ 'darkblue' => [ 0, 0, 139, 240, 100, 27 ],
+ 'darkcyan' => [ 0, 139, 139, 180, 100, 27 ],
+ 'darkgoldenrod' => [ 184, 134, 11, 43, 89, 38 ],
+ 'darkgoldenrod1' => [ 255, 185, 15, 43, 100, 53 ],
+ 'darkgoldenrod2' => [ 238, 173, 14, 43, 89, 49 ],
+ 'darkgoldenrod3' => [ 205, 149, 12, 43, 89, 43 ],
+ 'darkgoldenrod4' => [ 139, 101, 8, 43, 89, 29 ],
+ 'darkgray' => [ 169, 169, 169, 0, 0, 66 ],
+ 'darkgreen' => [ 0, 100, 0, 120, 100, 20 ],
+ 'darkkhaki' => [ 189, 183, 107, 56, 38, 58 ],
+ 'darkmagenta' => [ 139, 0, 139, 300, 100, 27 ],
+ 'darkolivegreen' => [ 85, 107, 47, 82, 39, 30 ],
+ 'darkolivegreen1' => [ 202, 255, 112, 82, 100, 72 ],
+ 'darkolivegreen2' => [ 188, 238, 104, 82, 80, 67 ],
+ 'darkolivegreen3' => [ 162, 205, 90, 82, 53, 58 ],
+ 'darkolivegreen4' => [ 110, 139, 61, 82, 39, 39 ],
+ 'darkorange' => [ 255, 140, 0, 33, 100, 50 ],
+ 'darkorange1' => [ 255, 127, 0, 30, 100, 50 ],
+ 'darkorange2' => [ 238, 118, 0, 30, 100, 47 ],
+ 'darkorange3' => [ 205, 102, 0, 30, 100, 40 ],
+ 'darkorange4' => [ 139, 69, 0, 30, 100, 27 ],
+ 'darkorchid' => [ 153, 50, 204, 280, 61, 50 ],
+ 'darkorchid1' => [ 191, 62, 255, 280, 100, 62 ],
+ 'darkorchid2' => [ 178, 58, 238, 280, 84, 58 ],
+ 'darkorchid3' => [ 154, 50, 205, 280, 61, 50 ],
+ 'darkorchid4' => [ 104, 34, 139, 280, 61, 34 ],
+ 'darkred' => [ 139, 0, 0, 0, 100, 27 ],
+ 'darksalmon' => [ 233, 150, 122, 15, 72, 70 ],
+ 'darkseagreen' => [ 143, 188, 143, 120, 25, 65 ],
+ 'darkseagreen1' => [ 193, 255, 193, 120, 100, 88 ],
+ 'darkseagreen2' => [ 180, 238, 180, 120, 63, 82 ],
+ 'darkseagreen3' => [ 155, 205, 155, 120, 33, 71 ],
+ 'darkseagreen4' => [ 105, 139, 105, 120, 14, 48 ],
+ 'darkslateblue' => [ 72, 61, 139, 248, 39, 39 ],
+ 'darkslategray' => [ 47, 79, 79, 180, 25, 25 ],
+ 'darkslategray1' => [ 151, 255, 255, 180, 100, 80 ],
+ 'darkslategray2' => [ 141, 238, 238, 180, 74, 74 ],
+ 'darkslategray3' => [ 121, 205, 205, 180, 46, 64 ],
+ 'darkslategray4' => [ 82, 139, 139, 180, 26, 43 ],
+ 'darkturquoise' => [ 0, 206, 209, 181, 100, 41 ],
+ 'darkviolet' => [ 148, 0, 211, 282, 100, 41 ],
+ 'deeppink' => [ 255, 20, 147, 328, 100, 54 ],
+ 'deeppink1' => [ 255, 20, 147, 328, 100, 54 ],
+ 'deeppink2' => [ 238, 18, 137, 328, 87, 50 ],
+ 'deeppink3' => [ 205, 16, 118, 328, 86, 43 ],
+ 'deeppink4' => [ 139, 10, 80, 327, 87, 29 ],
+ 'deepskyblue' => [ 0, 191, 255, 195, 100, 50 ],
+ 'deepskyblue1' => [ 0, 191, 255, 195, 100, 50 ],
+ 'deepskyblue2' => [ 0, 178, 238, 195, 100, 47 ],
+ 'deepskyblue3' => [ 0, 154, 205, 195, 100, 40 ],
+ 'deepskyblue4' => [ 0, 104, 139, 195, 100, 27 ],
+ 'dimgray' => [ 105, 105, 105, 0, 0, 41 ],
+ 'dodgerblue' => [ 30, 144, 255, 210, 100, 56 ],
+ 'dodgerblue1' => [ 30, 144, 255, 210, 100, 56 ],
+ 'dodgerblue2' => [ 28, 134, 238, 210, 86, 52 ],
+ 'dodgerblue3' => [ 24, 116, 205, 210, 79, 45 ],
+ 'dodgerblue4' => [ 16, 78, 139, 210, 79, 30 ],
+ 'firebrick' => [ 178, 34, 34, 0, 68, 42 ],
+ 'firebrick1' => [ 255, 48, 48, 0, 100, 59 ],
+ 'firebrick2' => [ 238, 44, 44, 0, 85, 55 ],
+ 'firebrick3' => [ 205, 38, 38, 0, 69, 48 ],
+ 'firebrick4' => [ 139, 26, 26, 0, 68, 32 ],
+ 'floralwhite' => [ 255, 250, 240, 40, 100, 97 ],
+ 'forestgreen' => [ 34, 139, 34, 120, 61, 34 ],
+ 'fuchsia' => [ 255, 0, 255, 300, 100, 50 ],
+ 'gainsboro' => [ 220, 220, 220, 0, 0, 86 ],
+ 'ghostwhite' => [ 248, 248, 255, 240, 100, 99 ],
+ 'gold' => [ 255, 215, 0, 51, 100, 50 ],
+ 'gold1' => [ 255, 215, 0, 51, 100, 50 ],
+ 'gold2' => [ 238, 201, 0, 51, 100, 47 ],
+ 'gold3' => [ 205, 173, 0, 51, 100, 40 ],
+ 'gold4' => [ 139, 117, 0, 51, 100, 27 ],
+ 'goldenrod' => [ 218, 165, 32, 43, 74, 49 ],
+ 'goldenrod1' => [ 255, 193, 37, 43, 100, 57 ],
+ 'goldenrod2' => [ 238, 180, 34, 43, 86, 53 ],
+ 'goldenrod3' => [ 205, 155, 29, 43, 75, 46 ],
+ 'goldenrod4' => [ 139, 105, 20, 43, 75, 31 ],
+ 'gray' => [ 128, 128, 128, 0, 0, 50 ],
+ 'gray1' => [ 3, 3, 3, 0, 0, 1 ],
+ 'gray2' => [ 5, 5, 5, 0, 0, 2 ],
+ 'gray3' => [ 8, 8, 8, 0, 0, 3 ],
+ 'gray4' => [ 10, 10, 10, 0, 0, 4 ],
+ 'gray5' => [ 13, 13, 13, 0, 0, 5 ],
+ 'gray6' => [ 15, 15, 15, 0, 0, 6 ],
+ 'gray7' => [ 18, 18, 18, 0, 0, 7 ],
+ 'gray8' => [ 20, 20, 20, 0, 0, 8 ],
+ 'gray9' => [ 23, 23, 23, 0, 0, 9 ],
+ 'gray10' => [ 26, 26, 26, 0, 0, 10 ],
+ 'gray11' => [ 28, 28, 28, 0, 0, 11 ],
+ 'gray12' => [ 31, 31, 31, 0, 0, 12 ],
+ 'gray13' => [ 33, 33, 33, 0, 0, 13 ],
+ 'gray14' => [ 36, 36, 36, 0, 0, 14 ],
+ 'gray15' => [ 38, 38, 38, 0, 0, 15 ],
+ 'gray16' => [ 41, 41, 41, 0, 0, 16 ],
+ 'gray17' => [ 43, 43, 43, 0, 0, 17 ],
+ 'gray18' => [ 46, 46, 46, 0, 0, 18 ],
+ 'gray19' => [ 48, 48, 48, 0, 0, 19 ],
+ 'gray20' => [ 51, 51, 51, 0, 0, 20 ],
+ 'gray21' => [ 54, 54, 54, 0, 0, 21 ],
+ 'gray22' => [ 56, 56, 56, 0, 0, 22 ],
+ 'gray23' => [ 59, 59, 59, 0, 0, 23 ],
+ 'gray24' => [ 61, 61, 61, 0, 0, 24 ],
+ 'gray25' => [ 64, 64, 64, 0, 0, 25 ],
+ 'gray26' => [ 66, 66, 66, 0, 0, 26 ],
+ 'gray27' => [ 69, 69, 69, 0, 0, 27 ],
+ 'gray28' => [ 71, 71, 71, 0, 0, 28 ],
+ 'gray29' => [ 74, 74, 74, 0, 0, 29 ],
+ 'gray30' => [ 77, 77, 77, 0, 0, 30 ],
+ 'gray31' => [ 79, 79, 79, 0, 0, 31 ],
+ 'gray32' => [ 82, 82, 82, 0, 0, 32 ],
+ 'gray33' => [ 84, 84, 84, 0, 0, 33 ],
+ 'gray34' => [ 87, 87, 87, 0, 0, 34 ],
+ 'gray35' => [ 89, 89, 89, 0, 0, 35 ],
+ 'gray36' => [ 92, 92, 92, 0, 0, 36 ],
+ 'gray37' => [ 94, 94, 94, 0, 0, 37 ],
+ 'gray38' => [ 97, 97, 97, 0, 0, 38 ],
+ 'gray39' => [ 99, 99, 99, 0, 0, 39 ],
+ 'gray40' => [ 102, 102, 102, 0, 0, 40 ],
+ 'gray41' => [ 105, 105, 105, 0, 0, 41 ],
+ 'gray42' => [ 107, 107, 107, 0, 0, 42 ],
+ 'gray43' => [ 110, 110, 110, 0, 0, 43 ],
+ 'gray44' => [ 112, 112, 112, 0, 0, 44 ],
+ 'gray45' => [ 115, 115, 115, 0, 0, 45 ],
+ 'gray46' => [ 117, 117, 117, 0, 0, 46 ],
+ 'gray47' => [ 120, 120, 120, 0, 0, 47 ],
+ 'gray48' => [ 122, 122, 122, 0, 0, 48 ],
+ 'gray49' => [ 125, 125, 125, 0, 0, 49 ],
+ 'gray50' => [ 127, 127, 127, 0, 0, 50 ],
+ 'gray51' => [ 130, 130, 130, 0, 0, 51 ],
+ 'gray52' => [ 133, 133, 133, 0, 0, 52 ],
+ 'gray53' => [ 135, 135, 135, 0, 0, 53 ],
+ 'gray54' => [ 138, 138, 138, 0, 0, 54 ],
+ 'gray55' => [ 140, 140, 140, 0, 0, 55 ],
+ 'gray56' => [ 143, 143, 143, 0, 0, 56 ],
+ 'gray57' => [ 145, 145, 145, 0, 0, 57 ],
+ 'gray58' => [ 148, 148, 148, 0, 0, 58 ],
+ 'gray59' => [ 150, 150, 150, 0, 0, 59 ],
+ 'gray60' => [ 153, 153, 153, 0, 0, 60 ],
+ 'gray61' => [ 156, 156, 156, 0, 0, 61 ],
+ 'gray62' => [ 158, 158, 158, 0, 0, 62 ],
+ 'gray63' => [ 161, 161, 161, 0, 0, 63 ],
+ 'gray64' => [ 163, 163, 163, 0, 0, 64 ],
+ 'gray65' => [ 166, 166, 166, 0, 0, 65 ],
+ 'gray66' => [ 168, 168, 168, 0, 0, 66 ],
+ 'gray67' => [ 171, 171, 171, 0, 0, 67 ],
+ 'gray68' => [ 173, 173, 173, 0, 0, 68 ],
+ 'gray69' => [ 176, 176, 176, 0, 0, 69 ],
+ 'gray70' => [ 179, 179, 179, 0, 0, 70 ],
+ 'gray71' => [ 181, 181, 181, 0, 0, 71 ],
+ 'gray72' => [ 184, 184, 184, 0, 0, 72 ],
+ 'gray73' => [ 186, 186, 186, 0, 0, 73 ],
+ 'gray74' => [ 189, 189, 189, 0, 0, 74 ],
+ 'gray75' => [ 191, 191, 191, 0, 0, 75 ],
+ 'gray76' => [ 194, 194, 194, 0, 0, 76 ],
+ 'gray77' => [ 196, 196, 196, 0, 0, 77 ],
+ 'gray78' => [ 199, 199, 199, 0, 0, 78 ],
+ 'gray79' => [ 201, 201, 201, 0, 0, 79 ],
+ 'gray80' => [ 204, 204, 204, 0, 0, 80 ],
+ 'gray81' => [ 207, 207, 207, 0, 0, 81 ],
+ 'gray82' => [ 209, 209, 209, 0, 0, 82 ],
+ 'gray83' => [ 212, 212, 212, 0, 0, 83 ],
+ 'gray84' => [ 214, 214, 214, 0, 0, 84 ],
+ 'gray85' => [ 217, 217, 217, 0, 0, 85 ],
+ 'gray86' => [ 219, 219, 219, 0, 0, 86 ],
+ 'gray87' => [ 222, 222, 222, 0, 0, 87 ],
+ 'gray88' => [ 224, 224, 224, 0, 0, 88 ],
+ 'gray89' => [ 227, 227, 227, 0, 0, 89 ],
+ 'gray90' => [ 229, 229, 229, 0, 0, 90 ],
+ 'gray91' => [ 232, 232, 232, 0, 0, 91 ],
+ 'gray92' => [ 235, 235, 235, 0, 0, 92 ],
+ 'gray93' => [ 237, 237, 237, 0, 0, 93 ],
+ 'gray94' => [ 240, 240, 240, 0, 0, 94 ],
+ 'gray95' => [ 242, 242, 242, 0, 0, 95 ],
+ 'gray97' => [ 247, 247, 247, 0, 0, 97 ],
+ 'gray98' => [ 250, 250, 250, 0, 0, 98 ],
+ 'gray99' => [ 252, 252, 252, 0, 0, 99 ],
+ 'green1' => [ 0, 255, 0, 120, 100, 50 ],
+ 'green2' => [ 0, 238, 0, 120, 100, 47 ],
+ 'green3' => [ 0, 205, 0, 120, 100, 40 ],
+ 'green4' => [ 0, 139, 0, 120, 100, 27 ],
+ 'greenyellow' => [ 173, 255, 47, 84, 100, 59 ],
+ 'grey1' => [ 3, 3, 3, 0, 0, 1 ],
+ 'grey2' => [ 5, 5, 5, 0, 0, 2 ],
+ 'grey3' => [ 8, 8, 8, 0, 0, 3 ],
+ 'grey4' => [ 10, 10, 10, 0, 0, 4 ],
+ 'honeydew' => [ 240, 255, 240, 120, 100, 97 ],
+ 'honeydew1' => [ 240, 255, 240, 120, 100, 97 ],
+ 'honeydew2' => [ 224, 238, 224, 120, 29, 91 ],
+ 'honeydew3' => [ 193, 205, 193, 120, 11, 78 ],
+ 'honeydew4' => [ 131, 139, 131, 120, 3, 53 ],
+ 'hotpink' => [ 255, 105, 180, 330, 100, 71 ],
+ 'hotpink1' => [ 255, 110, 180, 331, 100, 72 ],
+ 'hotpink2' => [ 238, 106, 167, 332, 80, 67 ],
+ 'hotpink3' => [ 205, 96, 144, 334, 52, 59 ],
+ 'hotpink4' => [ 139, 58, 98, 330, 41, 39 ],
+ 'indianred' => [ 205, 92, 92, 0, 53, 58 ],
+ 'indianred1' => [ 255, 106, 106, 0, 100, 71 ],
+ 'indianred2' => [ 238, 99, 99, 0, 80, 66 ],
+ 'indianred3' => [ 205, 85, 85, 0, 55, 57 ],
+ 'indianred4' => [ 139, 58, 58, 0, 41, 39 ],
+ 'indigo' => [ 75, 0, 130, 275, 100, 25 ],
+ 'ivory' => [ 255, 255, 240, 60, 100, 97 ],
+ 'ivory1' => [ 255, 255, 240, 60, 100, 97 ],
+ 'ivory2' => [ 238, 238, 224, 60, 29, 91 ],
+ 'ivory3' => [ 205, 205, 193, 60, 11, 78 ],
+ 'ivory4' => [ 139, 139, 131, 60, 3, 53 ],
+ 'khaki' => [ 240, 230, 140, 54, 77, 75 ],
+ 'khaki1' => [ 255, 246, 143, 55, 100, 78 ],
+ 'khaki2' => [ 238, 230, 133, 55, 76, 73 ],
+ 'khaki3' => [ 205, 198, 115, 55, 47, 63 ],
+ 'khaki4' => [ 139, 134, 78, 55, 28, 43 ],
+ 'lavender' => [ 230, 230, 250, 240, 67, 94 ],
+ 'lavenderblush' => [ 255, 240, 245, 340, 100, 97 ],
+ 'lavenderblush1' => [ 255, 240, 245, 340, 100, 97 ],
+ 'lavenderblush2' => [ 238, 224, 229, 339, 29, 91 ],
+ 'lavenderblush3' => [ 205, 193, 197, 340, 11, 78 ],
+ 'lavenderblush4' => [ 139, 131, 134, 338, 3, 53 ],
+ 'lawngreen' => [ 124, 252, 0, 90, 100, 49 ],
+ 'lemonchiffon' => [ 255, 250, 205, 54, 100, 90 ],
+ 'lemonchiffon1' => [ 255, 250, 205, 54, 100, 90 ],
+ 'lemonchiffon2' => [ 238, 233, 191, 54, 58, 84 ],
+ 'lemonchiffon3' => [ 205, 201, 165, 54, 29, 73 ],
+ 'lemonchiffon4' => [ 139, 137, 112, 56, 11, 49 ],
+ 'light' => [ 238, 221, 130, 51, 76, 72 ],
+ 'lightblue' => [ 173, 216, 230, 195, 53, 79 ],
+ 'lightblue1' => [ 191, 239, 255, 195, 100, 87 ],
+ 'lightblue2' => [ 178, 223, 238, 195, 64, 82 ],
+ 'lightblue3' => [ 154, 192, 205, 195, 34, 70 ],
+ 'lightblue4' => [ 104, 131, 139, 194, 14, 48 ],
+ 'lightcoral' => [ 240, 128, 128, 0, 79, 72 ],
+ 'lightcyan' => [ 224, 255, 255, 180, 100, 94 ],
+ 'lightcyan1' => [ 224, 255, 255, 180, 100, 94 ],
+ 'lightcyan2' => [ 209, 238, 238, 180, 46, 88 ],
+ 'lightcyan3' => [ 180, 205, 205, 180, 20, 75 ],
+ 'lightcyan4' => [ 122, 139, 139, 180, 7, 51 ],
+ 'lightgoldenrod' => [ 238, 221, 130, 51, 76, 72 ],
+ 'lightgoldenrod1' => [ 255, 236, 139, 50, 100, 77 ],
+ 'lightgoldenrod2' => [ 238, 220, 130, 50, 76, 72 ],
+ 'lightgoldenrod3' => [ 205, 190, 112, 50, 48, 62 ],
+ 'lightgoldenrod4' => [ 139, 129, 76, 50, 29, 42 ],
+ 'lightgray' => [ 211, 211, 211, 0, 0, 83 ],
+ 'lightgreen' => [ 144, 238, 144, 120, 73, 75 ],
+ 'lightpink' => [ 255, 182, 193, 351, 100, 86 ],
+ 'lightpink1' => [ 255, 174, 185, 352, 100, 84 ],
+ 'lightpink2' => [ 238, 162, 173, 351, 69, 78 ],
+ 'lightpink3' => [ 205, 140, 149, 352, 39, 68 ],
+ 'lightpink4' => [ 139, 95, 101, 352, 19, 46 ],
+ 'lightpurple' => [ 145, 0, 250, 275, 100, 49 ], # not in X11
+ 'lightsalmon' => [ 255, 160, 122, 17, 100, 74 ],
+ 'lightsalmon1' => [ 255, 160, 122, 17, 100, 74 ],
+ 'lightsalmon2' => [ 238, 149, 114, 17, 78, 69 ],
+ 'lightsalmon3' => [ 205, 129, 98, 17, 52, 59 ],
+ 'lightsalmon4' => [ 139, 87, 66, 17, 36, 40 ],
+ 'lightseagreen' => [ 32, 178, 170, 177, 70, 41 ],
+ 'lightskyblue' => [ 135, 206, 250, 203, 92, 75 ],
+ 'lightskyblue1' => [ 176, 226, 255, 202, 100, 85 ],
+ 'lightskyblue2' => [ 164, 211, 238, 202, 69, 79 ],
+ 'lightskyblue3' => [ 141, 182, 205, 202, 39, 68 ],
+ 'lightskyblue4' => [ 96, 123, 139, 202, 18, 46 ],
+ 'lightslateblue' => [ 132, 112, 255, 248, 100, 72 ],
+ 'lightslategray' => [ 119, 136, 153, 210, 14, 53 ],
+ 'lightsteelblue' => [ 176, 196, 222, 214, 41, 78 ],
+ 'lightsteelblue1' => [ 202, 225, 255, 214, 100, 90 ],
+ 'lightsteelblue2' => [ 188, 210, 238, 214, 60, 84 ],
+ 'lightsteelblue3' => [ 162, 181, 205, 213, 30, 72 ],
+ 'lightsteelblue4' => [ 110, 123, 139, 213, 12, 49 ],
+ 'lightyellow' => [ 255, 255, 224, 60, 100, 94 ],
+ 'lightyellow1' => [ 255, 255, 224, 60, 100, 94 ],
+ 'lightyellow2' => [ 238, 238, 209, 60, 46, 88 ],
+ 'lightyellow3' => [ 205, 205, 180, 60, 20, 75 ],
+ 'lightyellow4' => [ 139, 139, 122, 60, 7, 51 ],
+ 'lime' => [ 0, 255, 0, 120, 100, 50 ],
+ 'limegreen' => [ 50, 205, 50, 120, 61, 50 ],
+ 'linen' => [ 250, 240, 230, 30, 67, 94 ],
+ 'magenta' => [ 255, 0, 255, 300, 100, 50 ],
+ 'magenta1' => [ 255, 0, 255, 300, 100, 50 ],
+ 'magenta2' => [ 238, 0, 238, 300, 100, 47 ],
+ 'magenta3' => [ 205, 0, 205, 300, 100, 40 ],
+ 'magenta4' => [ 139, 0, 139, 300, 100, 27 ],
+ 'maroon' => [ 128, 0, 0, 0, 100, 25 ],
+ 'maroon1' => [ 255, 52, 179, 322, 100, 60 ],
+ 'maroon2' => [ 238, 48, 167, 322, 85, 56 ],
+ 'maroon3' => [ 205, 41, 144, 322, 67, 48 ],
+ 'maroon4' => [ 139, 28, 98, 322, 66, 33 ],
+ 'medium' => [ 102, 205, 170, 160, 51, 60 ],
+ 'mediumaquamarine' => [ 102, 205, 170, 160, 51, 60 ],
+ 'mediumblue' => [ 0, 0, 205, 240, 100, 40 ],
+ 'mediumorchid' => [ 186, 85, 211, 288, 59, 58 ],
+ 'mediumorchid1' => [ 224, 102, 255, 288, 100, 70 ],
+ 'mediumorchid2' => [ 209, 95, 238, 288, 81, 65 ],
+ 'mediumorchid3' => [ 180, 82, 205, 288, 55, 56 ],
+ 'mediumorchid4' => [ 122, 55, 139, 288, 43, 38 ],
+ 'mediumpurple' => [ 147, 112, 219, 260, 60, 65 ],
+ 'mediumpurple1' => [ 171, 130, 255, 260, 100, 75 ],
+ 'mediumpurple2' => [ 159, 121, 238, 259, 77, 70 ],
+ 'mediumpurple3' => [ 137, 104, 205, 260, 50, 61 ],
+ 'mediumpurple4' => [ 93, 71, 139, 259, 32, 41 ],
+ 'mediumseagreen' => [ 60, 179, 113, 147, 50, 47 ],
+ 'mediumslateblue' => [ 123, 104, 238, 249, 80, 67 ],
+ 'mediumspringgreen' => [ 0, 250, 154, 157, 100, 49 ],
+ 'mediumturquoise' => [ 72, 209, 204, 178, 60, 55 ],
+ 'mediumvioletred' => [ 199, 21, 133, 322, 81, 43 ],
+ 'midnightblue' => [ 25, 25, 112, 240, 64, 27 ],
+ 'mintcream' => [ 245, 255, 250, 150, 100, 98 ],
+ 'mistyrose' => [ 255, 228, 225, 6, 100, 94 ],
+ 'mistyrose1' => [ 255, 228, 225, 6, 100, 94 ],
+ 'mistyrose2' => [ 238, 213, 210, 6, 45, 88 ],
+ 'mistyrose3' => [ 205, 183, 181, 5, 19, 76 ],
+ 'mistyrose4' => [ 139, 125, 123, 8, 6, 51 ],
+ 'moccasin' => [ 255, 228, 181, 38, 100, 85 ],
+ 'navajowhite' => [ 255, 222, 173, 36, 100, 84 ],
+ 'navajowhite1' => [ 255, 222, 173, 36, 100, 84 ],
+ 'navajowhite2' => [ 238, 207, 161, 36, 69, 78 ],
+ 'navajowhite3' => [ 205, 179, 139, 36, 40, 67 ],
+ 'navajowhite4' => [ 139, 121, 94, 36, 19, 46 ],
+ 'navy' => [ 0, 0, 128, 240, 100, 25 ],
+ 'navyblue' => [ 0, 0, 128, 240, 100, 25 ],
+ 'oldlace' => [ 253, 245, 230, 39, 85, 95 ],
+ 'olive' => [ 128, 128, 0, 60, 100, 25 ],
+ 'olivedrab' => [ 107, 142, 35, 80, 60, 35 ],
+ 'olivedrab1' => [ 192, 255, 62, 80, 100, 62 ],
+ 'olivedrab2' => [ 179, 238, 58, 80, 84, 58 ],
+ 'olivedrab3' => [ 154, 205, 50, 80, 61, 50 ],
+ 'olivedrab4' => [ 105, 139, 34, 79, 61, 34 ],
+ 'orange' => [ 255, 165, 0, 39, 100, 50 ],
+ 'orange1' => [ 255, 165, 0, 39, 100, 50 ],
+ 'orange2' => [ 238, 154, 0, 39, 100, 47 ],
+ 'orange3' => [ 205, 133, 0, 39, 100, 40 ],
+ 'orange4' => [ 139, 90, 0, 39, 100, 27 ],
+ 'orangered' => [ 255, 69, 0, 16, 100, 50 ],
+ 'orangered1' => [ 255, 69, 0, 16, 100, 50 ],
+ 'orangered2' => [ 238, 64, 0, 16, 100, 47 ],
+ 'orangered3' => [ 205, 55, 0, 16, 100, 40 ],
+ 'orangered4' => [ 139, 37, 0, 16, 100, 27 ],
+ 'orchid' => [ 218, 112, 214, 302, 59, 65 ],
+ 'orchid1' => [ 255, 131, 250, 302, 100, 76 ],
+ 'orchid2' => [ 238, 122, 233, 303, 77, 71 ],
+ 'orchid3' => [ 205, 105, 201, 302, 50, 61 ],
+ 'orchid4' => [ 139, 71, 137, 302, 32, 41 ],
+ 'pale' => [ 219, 112, 147, 340, 60, 65 ],
+ 'palegoldenrod' => [ 238, 232, 170, 55, 67, 80 ],
+ 'palegreen' => [ 152, 251, 152, 120, 93, 79 ],
+ 'palegreen1' => [ 154, 255, 154, 120, 100, 80 ],
+ 'palegreen2' => [ 144, 238, 144, 120, 73, 75 ],
+ 'palegreen3' => [ 124, 205, 124, 120, 45, 65 ],
+ 'palegreen4' => [ 84, 139, 84, 120, 25, 44 ],
+ 'paleturquoise' => [ 175, 238, 238, 180, 65, 81 ],
+ 'paleturquoise1' => [ 187, 255, 255, 180, 100, 87 ],
+ 'paleturquoise2' => [ 174, 238, 238, 180, 65, 81 ],
+ 'paleturquoise3' => [ 150, 205, 205, 180, 35, 70 ],
+ 'paleturquoise4' => [ 102, 139, 139, 180, 15, 47 ],
+ 'palevioletred' => [ 219, 112, 147, 340, 60, 65 ],
+ 'palevioletred1' => [ 255, 130, 171, 340, 100, 75 ],
+ 'palevioletred2' => [ 238, 121, 159, 341, 77, 70 ],
+ 'palevioletred3' => [ 205, 104, 137, 340, 50, 61 ],
+ 'palevioletred4' => [ 139, 71, 93, 341, 32, 41 ],
+ 'papayawhip' => [ 255, 239, 213, 37, 100, 92 ],
+ 'peachpuff' => [ 255, 218, 185, 28, 100, 86 ],
+ 'peachpuff1' => [ 255, 218, 185, 28, 100, 86 ],
+ 'peachpuff2' => [ 238, 203, 173, 28, 66, 81 ],
+ 'peachpuff3' => [ 205, 175, 149, 28, 36, 69 ],
+ 'peachpuff4' => [ 139, 119, 101, 28, 16, 47 ],
+ 'peru' => [ 205, 133, 63, 30, 59, 53 ],
+ 'pink1' => [ 255, 181, 197, 347, 100, 85 ],
+ 'pink2' => [ 238, 169, 184, 347, 67, 80 ],
+ 'pink3' => [ 205, 145, 158, 347, 38, 69 ],
+ 'pink4' => [ 139, 99, 108, 347, 17, 47 ],
+ 'plum1' => [ 255, 187, 255, 300, 100, 87 ],
+ 'plum2' => [ 238, 174, 238, 300, 65, 81 ],
+ 'plum3' => [ 205, 150, 205, 300, 35, 70 ],
+ 'plum4' => [ 139, 102, 139, 300, 15, 47 ],
+ 'powderblue' => [ 176, 224, 230, 187, 52, 80 ],
+ 'purple1' => [ 155, 48, 255, 271, 100, 59 ],
+ 'purple2' => [ 145, 44, 238, 271, 85, 55 ],
+ 'purple3' => [ 125, 38, 205, 271, 69, 48 ],
+ 'purple4' => [ 85, 26, 139, 271, 68, 32 ],
+ 'rebeccapurple' => [ 102, 51, 153, 270, 50, 40 ],
+ 'red1' => [ 255, 0, 0, 0, 100, 50 ],
+ 'red2' => [ 238, 0, 0, 0, 100, 47 ],
+ 'red3' => [ 205, 0, 0, 0, 100, 40 ],
+ 'red4' => [ 139, 0, 0, 0, 100, 27 ],
+ 'rosybrown' => [ 188, 143, 143, 0, 25, 65 ],
+ 'rosybrown1' => [ 255, 193, 193, 0, 100, 88 ],
+ 'rosybrown2' => [ 238, 180, 180, 0, 63, 82 ],
+ 'rosybrown3' => [ 205, 155, 155, 0, 33, 71 ],
+ 'rosybrown4' => [ 139, 105, 105, 0, 14, 48 ],
+ 'royalblue' => [ 65, 105, 225, 225, 73, 57 ],
+ 'royalblue1' => [ 72, 118, 255, 225, 100, 64 ],
+ 'royalblue2' => [ 67, 110, 238, 225, 83, 60 ],
+ 'royalblue3' => [ 58, 95, 205, 225, 60, 52 ],
+ 'royalblue4' => [ 39, 64, 139, 225, 56, 35 ],
+ 'saddlebrown' => [ 139, 69, 19, 25, 76, 31 ],
+ 'salmon' => [ 250, 128, 114, 6, 93, 71 ],
+ 'salmon1' => [ 255, 140, 105, 14, 100, 71 ],
+ 'salmon2' => [ 238, 130, 98, 14, 80, 66 ],
+ 'salmon3' => [ 205, 112, 84, 14, 55, 57 ],
+ 'salmon4' => [ 139, 76, 57, 14, 42, 38 ],
+ 'sandybrown' => [ 244, 164, 96, 28, 87, 67 ],
+ 'seagreen' => [ 46, 139, 87, 146, 50, 36 ],
+ 'seagreen1' => [ 84, 255, 159, 146, 100, 66 ],
+ 'seagreen2' => [ 78, 238, 148, 146, 82, 62 ],
+ 'seagreen3' => [ 67, 205, 128, 147, 58, 53 ],
+ 'seagreen4' => [ 46, 139, 87, 146, 50, 36 ],
+ 'seashell' => [ 255, 245, 238, 25, 100, 97 ],
+ 'seashell1' => [ 255, 245, 238, 25, 100, 97 ],
+ 'seashell2' => [ 238, 229, 222, 26, 32, 90 ],
+ 'seashell3' => [ 205, 197, 191, 26, 12, 78 ],
+ 'seashell4' => [ 139, 134, 130, 27, 4, 53 ],
+ 'sienna' => [ 160, 82, 45, 19, 56, 40 ],
+ 'sienna1' => [ 255, 130, 71, 19, 100, 64 ],
+ 'sienna2' => [ 238, 121, 66, 19, 83, 60 ],
+ 'sienna3' => [ 205, 104, 57, 19, 60, 51 ],
+ 'sienna4' => [ 139, 71, 38, 20, 57, 35 ],
+ 'silver' => [ 192, 192, 192, 0, 0, 75 ],
+ 'skyblue' => [ 135, 206, 235, 197, 71, 73 ],
+ 'skyblue1' => [ 135, 206, 255, 205, 100, 76 ],
+ 'skyblue2' => [ 126, 192, 238, 205, 77, 71 ],
+ 'skyblue3' => [ 108, 166, 205, 204, 49, 61 ],
+ 'skyblue4' => [ 74, 112, 139, 205, 31, 42 ],
+ 'slateblue' => [ 106, 90, 205, 248, 53, 58 ],
+ 'slateblue1' => [ 131, 111, 255, 248, 100, 72 ],
+ 'slateblue2' => [ 122, 103, 238, 248, 80, 67 ],
+ 'slateblue3' => [ 105, 89, 205, 248, 54, 58 ],
+ 'slateblue4' => [ 71, 60, 139, 248, 40, 39 ],
+ 'slategray' => [ 112, 128, 144, 210, 13, 50 ],
+ 'slategray1' => [ 198, 226, 255, 211, 100, 89 ],
+ 'slategray2' => [ 185, 211, 238, 211, 61, 83 ],
+ 'slategray3' => [ 159, 182, 205, 210, 32, 71 ],
+ 'slategray4' => [ 108, 123, 139, 211, 13, 48 ],
+ 'snow' => [ 255, 250, 250, 0, 100, 99 ],
+ 'snow1' => [ 255, 250, 250, 0, 100, 99 ],
+ 'snow2' => [ 238, 233, 233, 0, 13, 92 ],
+ 'snow3' => [ 205, 201, 201, 0, 4, 80 ],
+ 'snow4' => [ 139, 137, 137, 0, 1, 54 ],
+ 'springgreen' => [ 0, 255, 127, 150, 100, 50 ],
+ 'springgreen1' => [ 0, 255, 127, 150, 100, 50 ],
+ 'springgreen2' => [ 0, 238, 118, 150, 100, 47 ],
+ 'springgreen3' => [ 0, 205, 102, 150, 100, 40 ],
+ 'springgreen4' => [ 0, 139, 69, 150, 100, 27 ],
+ 'steelblue' => [ 70, 130, 180, 207, 44, 49 ],
+ 'steelblue1' => [ 99, 184, 255, 207, 100, 69 ],
+ 'steelblue2' => [ 92, 172, 238, 207, 81, 65 ],
+ 'steelblue3' => [ 79, 148, 205, 207, 56, 56 ],
+ 'steelblue4' => [ 54, 100, 139, 208, 44, 38 ],
+ 'tan' => [ 210, 180, 140, 34, 44, 69 ],
+ 'tan1' => [ 255, 165, 79, 29, 100, 65 ],
+ 'tan2' => [ 238, 154, 73, 29, 83, 61 ],
+ 'tan3' => [ 205, 133, 63, 30, 59, 53 ],
+ 'tan4' => [ 139, 90, 43, 29, 53, 36 ],
+ 'teal' => [ 0, 128, 128, 180, 100, 25 ],
+ 'thistle' => [ 216, 191, 216, 300, 24, 80 ],
+ 'thistle1' => [ 255, 225, 255, 300, 100, 94 ],
+ 'thistle2' => [ 238, 210, 238, 300, 45, 88 ],
+ 'thistle3' => [ 205, 181, 205, 300, 19, 76 ],
+ 'thistle4' => [ 139, 123, 139, 300, 6, 51 ],
+ 'tomato' => [ 255, 99, 71, 9, 100, 64 ],
+ 'tomato1' => [ 255, 99, 71, 9, 100, 64 ],
+ 'tomato2' => [ 238, 92, 66, 9, 83, 60 ],
+ 'tomato3' => [ 205, 79, 57, 9, 60, 51 ],
+ 'tomato4' => [ 139, 54, 38, 10, 57, 35 ],
+ 'turquoise' => [ 69, 184, 172, 174, 45, 50 ],
+ 'turquoise1' => [ 0, 245, 255, 182, 100, 50 ],
+ 'turquoise2' => [ 0, 229, 238, 182, 100, 47 ],
+ 'turquoise3' => [ 0, 197, 205, 182, 100, 40 ],
+ 'turquoise4' => [ 0, 134, 139, 182, 100, 27 ],
+ 'violet' => [ 238, 130, 238, 300, 76, 72 ],
+ 'violetred' => [ 208, 32, 144, 322, 73, 47 ],
+ 'violetred1' => [ 255, 62, 150, 333, 100, 62 ],
+ 'violetred2' => [ 238, 58, 140, 333, 84, 58 ],
+ 'violetred3' => [ 205, 50, 120, 333, 61, 50 ],
+ 'violetred4' => [ 139, 34, 82, 333, 61, 34 ],
+ 'wheat' => [ 245, 222, 179, 39, 77, 83 ],
+ 'wheat1' => [ 255, 231, 186, 39, 100, 86 ],
+ 'wheat2' => [ 238, 216, 174, 39, 65, 81 ],
+ 'wheat3' => [ 205, 186, 150, 39, 35, 70 ],
+ 'wheat4' => [ 139, 126, 102, 39, 15, 47 ],
+ 'whitesmoke' => [ 245, 245, 245, 0, 0, 96 ],
+ 'yellow1' => [ 255, 255, 0, 60, 100, 50 ],
+ 'yellow2' => [ 238, 238, 0, 60, 100, 47 ],
+ 'yellow3' => [ 205, 205, 0, 60, 100, 40 ],
+ 'yellow4' => [ 139, 139, 0, 60, 100, 27 ],
+ 'yellowgreen' => [ 154, 205, 50, 80, 61, 50 ],
+# https://www.w3schools.com/colors/colors_trends.asp
+ 'marsala' => [ 149, 82, 81, 1, 30, 45 ], # best 2015-2000
+ 'radiandorchid' => [ 181, 101, 167, 311, 35, 55 ],
+ 'emerald' => [ 0, 155, 119, 166, 100, 30 ],
+ 'tangerinetango' => [ 221, 65, 36, 9, 73, 50 ],
+ 'honeysucle' => [ 214, 80, 118, 343, 62, 58 ],
+ 'turquoise' => [ 69, 184, 172, 174, 45, 50 ],
+ 'mimosa' => [ 239, 192, 80, 42, 83, 63 ],
+ 'blueizis' => [ 91, 94, 166, 238, 30, 50 ],
+ 'chilipepper' => [ 155, 27, 48, 350, 70, 36 ],
+ 'sanddollar' => [ 223, 207, 190, 31, 34, 81 ],
+ 'blueturquoise' => [ 85, 180, 176, 177, 39, 52 ],
+ 'tigerlily' => [ 225, 93, 68, 10, 72, 57 ],
+ 'aquasky' => [ 127, 205, 205, 180, 44, 65 ],
+ 'truered' => [ 188, 36, 60, 351, 68, 44 ],
+ 'fuchsiarose' => [ 195, 68, 122, 334, 51, 52 ],
+ 'ceruleanblue' => [ 152, 180, 212, 212, 41, 71 ],
+ 'rosequartz' => [ 247, 202, 201, 1, 74, 88 ], # 2016 Spring
+ 'peachecho' => [ 247, 120, 107, 6, 90, 69 ],
+ 'serenity' => [ 145, 168, 208, 218, 40, 69 ],
+ 'snorkelblue' => [ 3, 79, 132, 205, 96, 26 ],
+ 'limpetshell' => [ 152, 221, 222, 181, 51, 73 ],
+ 'lilacgrey' => [ 152, 221, 222, 181, 51, 73 ],
+ 'icedcoffee' => [ 177, 143, 106, 31, 31, 55 ],
+ 'fiesta' => [ 221, 65, 50, 5, 72, 53 ],
+ 'buttercup' => [ 221, 65, 50, 5, 72, 53 ],
+ 'greenflash' => [ 250, 224, 60, 52, 95, 61 ],
+ 'riverside' => [ 76, 106, 146, 214, 32, 44 ], # Fall
+ 'airyblue' => [ 146, 182, 213, 208, 44, 70 ],
+ 'sharkskin' => [ 131, 132, 135, 225, 2, 52 ],
+ 'aurorared' => [ 185, 58, 50, 4, 57, 46 ],
+ 'warmtaupe' => [ 175, 148, 131, 23, 22, 60 ],
+ 'dustycedar' => [ 173, 93, 93, 0, 33, 52 ],
+ 'lushmeadow' => [ 0, 110, 81, 164, 100, 22 ],
+ 'spicymustard' => [ 216, 174, 71, 43, 65, 56 ],
+ 'pottersclay' => [ 158, 70, 36, 17, 63, 38 ], # Potter's Clay
+ 'bodacious' => [ 183, 107, 163, 316, 35, 57 ],
+ 'greenery' => [ 146, 181, 88, 83, 39, 53 ], # 2017
+ 'niagara' => [ 87, 140, 169, 201, 32, 50 ],
+ 'primroseyellow' => [ 246, 209, 85, 46, 90, 65 ],
+ 'lapisblue' => [ 0, 75, 141, 208, 100, 28 ],
+ 'flame' => [ 242, 85, 44, 12, 88, 56 ],
+ 'islandparadise' => [ 149, 222, 227, 184, 58, 74 ],
+ 'paledogwood' => [ 237, 205, 194, 15, 54, 85 ],
+ 'pinkyarrow' => [ 206, 49, 117, 334, 62, 50 ],
+ 'kale' => [ 90, 114, 71, 93, 23, 36 ],
+ 'hazelnut' => [ 207, 176, 149, 28, 38, 70 ],
+ 'grenadine' => [ 220, 76, 70, 2, 68, 57 ],
+ 'balletslipper' => [ 243, 214, 228, 331, 55, 90 ],
+ 'butterum' => [ 196, 143, 101, 27, 45, 58 ],
+ 'navypeony' => [ 34, 58, 94, 216, 47, 25 ],
+ 'neutralgray' => [ 137, 142, 140, 156, 2, 55 ],
+ 'shadedspruce' => [ 0, 89, 96, 184, 100, 19 ],
+ 'goldenlime' => [ 156, 154, 64, 59, 42, 43 ],
+ 'marina' => [ 79, 132, 196, 213, 50, 54 ],
+ 'autumnmaple' => [ 210, 105, 30, 25, 75, 47 ],
+ 'meadowlark' => [ 236, 219, 84, 53, 80, 63 ], # 2018
+ 'cherrytomato' => [ 233, 75, 60, 5, 80, 57 ],
+ 'littleboyblue' => [ 111, 159, 216, 213, 57, 64 ],
+ 'chilioil' => [ 148, 71, 67, 3, 38, 42 ],
+ 'pinklavender' => [ 219, 177, 205, 320, 37, 78 ],
+ 'bloomingdahlia' => [ 236, 151, 135, 10, 73, 73 ],
+ 'arcadia' => [ 0, 165, 145, 173, 100, 32 ],
+ 'ultraviolet' => [ 107, 91, 149, 257, 24, 47 ],
+ 'emperador' => [ 108, 79, 61, 23, 28, 33 ],
+ 'almostmauve' => [ 234, 222, 219, 12, 26, 89 ],
+ 'springcrocus' => [ 188, 112, 164, 319, 36, 59 ],
+ 'sailorblue' => [ 46, 74, 98, 208, 36, 28 ],
+ 'harbormist' => [ 180, 183, 186, 210, 4, 72 ],
+ 'warmsand' => [ 192, 171, 142, 35, 28, 65 ],
+ 'coconutmilk' => [ 240, 237, 229, 44, 27, 92 ],
+ 'redpear' => [ 127, 65, 69, 356, 32, 38 ],
+ 'valiantpoppy' => [ 189, 61, 58, 1, 53, 48 ],
+ 'nebulasblue' => [ 63, 105, 170, 216, 46, 46 ],
+ 'ceylonyellow' => [ 213, 174, 65, 44, 64, 55 ],
+ 'martiniolive' => [ 118, 111, 87, 46, 15, 40 ],
+ 'russetorange' => [ 228, 122, 46, 25, 77, 54 ],
+ 'crocuspetal' => [ 190, 158, 201, 285, 28, 70 ],
+ 'limelight' => [ 241, 234, 127, 56, 80, 72 ],
+ 'quetzalgreen' => [ 0, 110, 109, 179, 100, 22 ],
+ 'sargassosea' => [ 72, 81, 103, 223, 18, 34 ],
+ 'tofu' => [ 234, 230, 218, 45, 28, 89 ],
+ 'almondbuff' => [ 209, 184, 148, 35, 40, 70 ],
+ 'quietgray' => [ 188, 188, 190, 240, 2, 74 ],
+ 'meerkat' => [ 169, 117, 79, 25, 36, 49 ],
+ 'fiesta' => [ 221, 65, 50, 5, 72, 53 ], # 2019
+ 'jesterred' => [ 158, 16, 48, 346, 82, 34 ],
+ 'turmeric' => [ 254, 132, 14, 30, 99, 53 ],
+ 'livingcoral' => [ 255, 111, 97, 5, 100, 69 ],
+ 'pinkpeacock' => [ 198, 33, 104, 334, 71, 45 ],
+ 'pepperstem' => [ 141, 148, 64, 65, 40, 42 ],
+ 'aspengold' => [ 255, 214, 98, 44, 100, 69 ],
+ 'princessblue' => [ 0, 83, 156, 208, 100, 31 ],
+ 'toffee' => [ 117, 81, 57, 24, 34, 34 ],
+ 'mangomojito' => [ 214, 156, 47, 39, 67, 51 ],
+ 'terrariummoss' => [ 97, 98, 71, 62, 16, 33 ],
+ 'sweetlilac' => [ 232, 181, 206, 331, 53, 81 ],
+ 'soybean' => [ 210, 194, 157, 42, 37, 72 ],
+ 'eclipse' => [ 52, 49, 72, 248, 19, 24 ],
+ 'sweetcorn' => [ 240, 234, 214, 46, 46, 89 ],
+ 'browngranite' => [ 97, 85, 80, 18, 10, 35 ],
+ 'chilipepper' => [ 155, 27, 48, 350, 70, 36 ],
+ 'bikingred' => [ 119, 33, 46, 351, 57, 30 ],
+ 'peachpink' => [ 250, 154, 133, 11, 92, 75 ],
+ 'rockyroad' => [ 90, 62, 54, 13, 25, 28 ],
+ 'fruitdove' => [ 206, 91, 120, 345, 54, 58 ],
+ 'sugaralmond' => [ 147, 85, 41, 25, 56, 37 ],
+ 'darkcheddar' => [ 224, 129, 25, 31, 80, 49 ],
+ 'galaxyblue' => [ 42, 75, 124, 216, 49, 33 ],
+ 'bluestone' => [ 87, 114, 132, 204, 21, 43 ],
+ 'orangetiger' => [ 249, 103, 20, 22, 95, 53 ],
+ 'eden' => [ 38, 78, 54, 144, 34, 23 ],
+ 'vanillacustard' => [ 243, 224, 190, 38, 69, 85 ],
+ 'eveningblue' => [ 42, 41, 62, 243, 20, 20 ],
+ 'paloma' => [ 159, 156, 153, 30, 3, 61 ],
+ 'guacamole' => [ 121, 123, 58, 62, 36, 35 ],
+ 'flamescarlet' => [ 205, 33, 42, 357, 72, 47 ], # 2020
+ 'saffron' => [ 255, 165, 0, 39, 100, 50 ],
+ 'biscaygreen' => [ 86, 198, 169, 164, 50, 56 ],
+ 'chive' => [ 75, 83, 53, 76, 22, 27 ],
+ 'fadeddenim' => [ 121, 142, 164, 211, 19, 56 ],
+ 'orangepeel' => [ 250, 122, 53, 21, 95, 59 ],
+ 'mosaicblue' => [ 0, 117, 143, 191, 100, 28 ],
+ 'sunlight' => [ 237, 213, 158, 42, 69, 77 ],
+ 'coralpink' => [ 232, 167, 152, 11, 63, 75 ],
+ 'grapecompote' => [ 107, 88, 118, 278, 15, 40 ],
+ 'lark' => [ 184, 155, 114, 35, 33, 58 ],
+ 'navyblazer' => [ 40, 45, 60, 225, 20, 20 ],
+ 'brilliantwhite' => [ 237, 241, 255, 227, 100, 96 ],
+ 'ash' => [ 160, 153, 152, 8, 4, 61 ],
+ 'amberglow' => [ 220, 121, 62, 22, 69, 55 ],
+ 'samba' => [ 162, 36, 47, 355, 64, 39 ],
+ 'sandstone' => [ 196, 138, 105, 22, 44, 59 ],
+ 'classicblue' => [ 52, 86, 139, 217, 46, 37 ],
+ 'greensheen' => [ 217, 206, 82, 55, 64, 59 ],
+ 'rosetan' => [ 209, 156, 151, 5, 39, 71 ],
+ 'ultramarinegreen' => [ 0, 107, 84, 167, 100, 21 ],
+ 'firedbrick' => [ 106, 46, 42, 4, 43, 29 ],
+ 'peachnougat' => [ 230, 175, 145, 21, 63, 74 ],
+ 'magentapurple' => [ 108, 36, 76, 327, 50, 28 ],
+ 'marigold' => [ 253, 172, 83, 31, 98, 66 ], # 2021
+ 'cerulean' => [ 155, 183, 212, 211, 40, 72 ],
+ 'rust' => [ 181, 90, 48, 19, 58, 45 ],
+ 'illuminating' => [ 245, 223, 77, 52, 89, 63 ],
+ 'frenchblue' => [ 0, 114, 181, 202, 100, 35 ],
+ 'greenash' => [ 160, 218, 169, 129, 44, 74 ],
+ 'burntcoral' => [ 233, 137, 126, 6, 71, 70 ],
+ 'mint' => [ 0, 161, 112, 162, 100, 32 ],
+ 'amethystorchid' => [ 146, 106, 166, 280, 25, 53 ],
+ 'raspberrysorbet' => [ 210, 56, 108, 340, 63, 52 ],
+ 'inkwell' => [ 54, 57, 69, 228, 12, 24 ],
+ 'ultimategray' => [ 147, 149, 151, 210, 2, 58 ],
+ 'buttercream' => [ 239, 225, 206, 35, 51, 87 ],
+ 'desertmist' => [ 224, 181, 137, 30, 58, 71 ],
+ 'willow' => [ 154, 139, 79, 48, 32, 46 ],
+);
+
+our (@name_from_rgb, @name_from_hsl); # fill them through:
+
+_add_color_to_reverse_search( $_, @{$rgbhsl_from_name{$_}} ) for all_names();
+
+
+sub all_names { sort keys %rgbhsl_from_name }
+sub name_taken { exists $rgbhsl_from_name{ _clean_name($_[0]) }}
+
+sub rgb_from_name {
+ my $name = _clean_name(shift);
+ @{$rgbhsl_from_name{$name}}[0..2] if name_taken( $name );
+}
+
+sub hsl_from_name {
+ my $name = _clean_name(shift);
+ @{$rgbhsl_from_name{$name}}[3..5] if name_taken( $name );
+}
+
+sub name_from_rgb {
+ my (@rgb) = @_;
+ @rgb = @{$rgb[0]} if (ref $rgb[0] eq 'ARRAY');
+ Chart::Color::Value::check_rgb( @rgb ) and return; # return if sub did carp
+ my @names = _names_from_rgb( @rgb );
+ wantarray ? @names : $names[0];
+}
+
+sub name_from_hsl {
+ my (@hsl) = @_;
+ @hsl = @{$hsl[0]} if (ref $hsl[0] eq 'ARRAY');
+ Chart::Color::Value::check_hsl( @hsl ) and return;
+ my @names = _names_from_hsl( @hsl );
+ wantarray ? @names : $names[0];
+}
+
+sub names_in_hsl_range { # @center, (@d | $d) --> @names
+ my $help = 'need two arguments: 1. array with h s l values '.
+ '2. radius (real number) or array with tolerances in h s l direction';
+ return carp $help if @_ != 2;
+ my ($hsl_center, $radius) = @_;
+ return carp 'first argument has to be an array ref with thre number ([$h, $s, $l])'
+ if ref $hsl_center ne 'ARRAY' or @$hsl_center != 3;
+ return carp 'second argument has to be a integer < 180 or array ref with 3 integer'
+ unless (ref $radius eq 'ARRAY' and @$radius == 3) or (defined $radius and not ref $radius);
+ Chart::Color::Value::check_hsl( @$hsl_center ) and return;
+
+ my @hsl_delta = ref $radius ? @$radius : ($radius, $radius, $radius);
+ $hsl_delta[$_] = int abs $hsl_delta[$_] for 0 ..2;
+ $hsl_delta[0] = 180 if $hsl_delta[0] > 180; # enough to search complete HSL space (prevent double results)
+
+ my (@min, @max, @names, $minhrange, $maxhrange);
+ $min[$_] = $hsl_center->[$_] - $hsl_delta[$_] for 0..2;
+ $max[$_] = $hsl_center->[$_] + $hsl_delta[$_] for 0..2;
+ $min[1] = 0 if $min[1] < 0;
+ $min[2] = 0 if $min[2] < 0;
+ $max[1] = 100 if $max[1] > 100;
+ $max[2] = 100 if $max[2] > 100;
+ my @hrange = ($min[0] < 0 ? 0 : $min[0]) .. ($max[0] > 359 ? 359 : $max[0]);
+ push @hrange, (360 + $min[0]) .. 359 if $min[0] < 0;
+ push @hrange, 0 .. ($max[0] - 360) if $max[0] > 359;
+ for my $h (@hrange){
+ next unless defined $name_from_hsl[ $h ];
+ for my $s ($min[1] .. $max[1]){
+ next unless defined $name_from_hsl[ $h ][ $s ];
+ for my $l ($min[2] .. $max[2]){
+ my $name = $name_from_hsl[ $h ][ $s ][ $l ];
+ next unless defined $name;
+ push @names, (ref $name ? $name->[0] : $name);
+ }
+ }
+ }
+ @names = grep {Chart::Color::Value::distance_hsl( $hsl_center ,[hsl_from_name($_)] ) <= $radius} @names if not ref $radius;
+ @names;
+}
+
+sub add_rgb {
+ my ($name, @rgb) = @_;
+ @rgb = @{$rgb[0]} if (ref $rgb[0] eq 'ARRAY');
+ return carp "missing first argument: color name" unless defined $name and $name;
+ Chart::Color::Value::check_rgb( @rgb ) and return;
+ _add_color( $name, @rgb, Chart::Color::Value::hsl_from_rgb( @rgb ) );
+}
+
+sub add_hsl {
+ my ($name, @hsl) = @_;
+ @hsl = @{$hsl[0]} if (ref $hsl[0] eq 'ARRAY');
+ return carp "missing first argument: color name" unless defined $name and $name;
+ Chart::Color::Value::check_hsl( @hsl ) and return;
+ _add_color( $name, Chart::Color::Value::rgb_from_hsl( @hsl ), @hsl );
+}
+
+sub _add_color {
+ my ($name, @rgb, @hsl) = @_;
+ $name = _clean_name( $name );
+ return carp "there is already a color named '$name' in store of ".__PACKAGE__ if name_taken( $name );
+ _add_color_to_reverse_search( $name, @rgb, @hsl);
+ my $ret = $rgbhsl_from_name{$name} = [@rgb, @hsl]; # add to foreward search
+ (ref $ret) ? [@$ret] : ''; # make returned ref not transparent
+}
+
+sub _clean_name {
+ my $name = shift;
+ $name =~ tr/_//d;
+ lc $name;
+}
+
+sub _names_from_rgb { # each of AoAoA cells (if exists) contains name or array with names (shortes first)
+ return '' unless exists $name_from_rgb[ $_[0] ]
+ and exists $name_from_rgb[ $_[0] ][ $_[1] ] and exists $name_from_rgb[ $_[0] ][ $_[1] ][ $_[2] ];
+ my $cell = $name_from_rgb[ $_[0] ][ $_[1] ][ $_[2] ];
+ ref $cell ? @$cell : $cell;
+}
+
+sub _names_from_hsl {
+ return '' unless exists $name_from_hsl[ $_[0] ]
+ and exists $name_from_hsl[ $_[0] ][ $_[1] ] and exists $name_from_hsl[ $_[0] ][ $_[1] ][ $_[2] ];
+ my $cell = $name_from_hsl[ $_[0] ][ $_[1] ][ $_[2] ];
+ ref $cell ? @$cell : $cell;
+}
+
+sub _add_color_to_reverse_search { # my ($name, @rgb, @hsl) = @_;
+ my $name = $_[0];
+ my $cell = $name_from_rgb[ $_[1] ][ $_[2] ][ $_[3] ];
+ if (defined $cell) {
+ if (ref $cell) {
+ if (length $name < length $cell->[0] ) { unshift @$cell, $name }
+ else { push @$cell, $name }
+ } else {
+ $name_from_rgb[ $_[1] ][ $_[2] ][ $_[3] ] =
+ (length $name < length $cell) ? [ $name, $cell ]
+ : [ $cell, $name ] ;
+ }
+ } else { $name_from_rgb[ $_[1] ][ $_[2] ][ $_[3] ] = $name }
+
+ $cell = $name_from_hsl[ $_[4] ][ $_[5] ][ $_[6] ];
+ if (defined $cell) {
+ if (ref $cell) {
+ if (length $name < length $cell->[0] ) { unshift @$cell, $name }
+ else { push @$cell, $name }
+ } else {
+ $name_from_hsl[ $_[4] ][ $_[5] ][ $_[6] ] =
+ (length $name < length $cell) ? [ $name, $cell ]
+ : [ $cell, $name ] ;
+ }
+ } else { $name_from_hsl[ $_[4] ][ $_[5] ][ $_[6] ] = $name }
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+Chart::Color::Constant - access values of color constants
+
+=head1 SYNOPSIS
+
+ my @names = Chart::Color::Constant::all_names();
+ my @rgb = Chart::Color::Constant::rgb_from_name('darkblue');
+ my @hsl = Chart::Color::Constant::hsl_from_name('darkblue');
+
+ Chart::Color::Value::add_rgb('lucky', [0, 100, 50]);
+
+=head1 DESCRIPTION
+
+RGB and HSL values of named colors from the X11 and HTML standard
+and Pantone report. Allows also reverse search, storage and conversion
+of color values.
+
+This module is supposed to be used by Chart::Color and not directly
+by the user (for the most part). It converts a stored color name into
+its values (rgb, hsl or both) and back. One color can have multiple names.
+Also nearby (similar) colors can be searched. Own colors can be
+(none permanently) stored for later reference by name. For this a name
+has to be chosen, that is not already taken. Independently of that
+can any color be converted from rgb to hsl and back.
+
+=head1 ROUTINES
+
+=head2 rgb_from_name
+
+Red, Green and Blue value of the named color.
+These values are integer in 0 .. 255.
+
+ my @rgb = Chart::Color::Constant::rgb_from_name('darkblue');
+ @rgb = Chart::Color::Constant::rgb_from_name('dark_blue'); # same result
+ @rgb = Chart::Color::Constant::rgb_from_name('DarkBlue'); # still same
+
+=head2 hsl_from_name
+
+Hue, saturation and lightness of the named color.
+These are integer between 0 .. 359 (hue) or 100 (sat. & light.).
+A hue of 360 and 0 (degree in a cylindrical coordinate system) is
+considered to be the same, this modul deals only with the ladder.
+
+ my @hsl = Chart::Color::Constant::hsl_from_name('darkblue');
+
+=head2 name_from_rgb
+
+Returns name of color with given rgb value triplet.
+Returns empty string if color is not stored. When several names define
+given color, the shortest name will be selected in scalar context.
+In array context all names are given.
+
+ say Chart::Color::Constant::name_from_rgb( 15, 10, 121 ); # 'darkblue'
+ say Chart::Color::Constant::name_from_rgb([15, 10, 121]); # works too
+
+=head2 name_from_hsl
+
+Returns name of color with given hsl value triplet.
+Returns empty string if color is not stored. When several names define
+given color, the shortest name will be selected in scalar context.
+In array context all names are given.
+
+ say scalar Chart::Color::Constant::name_from_hsl( 0, 100, 50 ); # 'red'
+ scalar Chart::Color::Constant::name_from_hsl([0, 100, 50]); # works too
+ say for Chart::Color::Constant::name_from_hsl( 0, 100, 50 ); # 'red', 'red1'
+
+=head2 names_in_hsl_range
+
+Color names in selected neighbourhood of hsl color space, that look similar.
+It requires two arguments. The first one is an array containing three
+values (hue, saturation and lightness), that define the center of the
+neighbourhood (searched area).
+
+The second argument can either be a number or again an array with
+three values (h,s and l). If its just a number, it will be the radius r
+of a ball, that defines the neighbourhood. From all colors inside that
+ball, that are equal distanced or nearer to the center than r, one
+name will returned.
+
+If the second argument is an array, it has to contain the tolerance
+(allowed distance) in h, s and l direction. Please note the h dimension
+is circular: the distance from 355 to 0 is 5. The s and l dimensions are
+linear, so that a center value of 90 and a tolerance of 15 will result
+in a search of in the range 75 .. 100.
+
+The results contains only one name per color (the shortest).
+
+ # all bright red'ish clors
+ my @names = Chart::Color::Constant::names_in_hsl_range([0, 90, 50], 5);
+ # approximates to :
+ my @names = Chart::Color::Constant::names_in_hsl_range([0, 90, 50],[ 3, 3, 3]);
+
+
+=head2 all_names
+
+A sorted list of all stored color names.
+
+=head2 name_taken
+
+A perlish pseudo boolean tells if the color name is already in use.
+
+=head2 add_rgb
+
+Adding a color to the store under an not taken (not already used) name.
+Arguments are name, red, green and blue value (integer < 256, see rgb).
+
+ Chart::Color::Constant::add_rgb('nightblue', 15, 10, 121 );
+ Chart::Color::Constant::add_rgb('nightblue', [15, 10, 121]);
+
+=head2 add_hsl
+
+Adding a color to the store under an not taken (not already used) name.
+Arguments are name, hue, saturation and lightness value (see hsl).
+
+ Chart::Color::Constant::add_rgb('lucky', 0, 100, 50 );
+ Chart::Color::Constant::add_rgb('lucky', [0, 100, 50]);
+
+=head2 NAMES
+
+white, black, red, green, blue, yellow, purple, pink, peach, plum, mauve, brown, grey
+
+aliceblue, antiquewhite, antiquewhite1, antiquewhite2, antiquewhite3,
+antiquewhite4, aqua, aquamarine, aquamarine1, aquamarine2, aquamarine3,
+aquamarine4, azure, azure1, azure2, azure3, azure4, beige, bisque, bisque1,
+bisque2, bisque3, bisque4, blanchedalmond, blue1, blue2, blue3, blue4,
+blueviolet, brown1, brown2, brown3, brown4, burlywood, burlywood1,
+burlywood2, burlywood3, burlywood4, cadetblue, cadetblue1, cadetblue2,
+cadetblue3, cadetblue4, chartreuse, chartreuse1, chartreuse2, chartreuse3,
+chartreuse4, chocolate, chocolate1, chocolate2, chocolate3, chocolate4,
+coral, coral1, coral2, coral3, coral4, cornflowerblue, cornsilk, cornsilk1,
+cornsilk2, cornsilk3, cornsilk4, crimson, cyan, cyan1, cyan2, cyan3, cyan4,
+darkblue, darkcyan, darkgoldenrod, darkgoldenrod1, darkgoldenrod2,
+darkgoldenrod3, darkgoldenrod4, darkgray, darkgreen, darkkhaki, darkmagenta,
+darkolivegreen, darkolivegreen1, darkolivegreen2, darkolivegreen3,
+darkolivegreen4, darkorange, darkorange1, darkorange2, darkorange3,
+darkorange4, darkorchid, darkorchid1, darkorchid2, darkorchid3,
+darkorchid4, darkred, darksalmon, darkseagreen, darkseagreen1,
+darkseagreen2, darkseagreen3, darkseagreen4, darkslateblue, darkslategray,
+darkslategray1, darkslategray2, darkslategray3, darkslategray4,
+darkturquoise, darkviolet, deeppink, deeppink1, deeppink2, deeppink3,
+deeppink4, deepskyblue, deepskyblue1, deepskyblue2, deepskyblue3,
+deepskyblue4, dimgray, dodgerblue, dodgerblue1, dodgerblue2, dodgerblue3,
+dodgerblue4, firebrick, firebrick1, firebrick2, firebrick3, firebrick4,
+floralwhite, forestgreen, fuchsia, gainsboro, ghostwhite, gold, gold1,
+gold2, gold3, gold4, goldenrod, goldenrod1, goldenrod2, goldenrod3,
+goldenrod4, gray, gray1, gray2, gray3, gray4, gray5, gray6, gray7, gray8,
+gray9, gray10, gray11, gray12, gray13, gray14, gray15, gray16, gray17,
+gray18, gray19, gray20, gray21, gray22, gray23, gray24, gray25, gray26,
+gray27, gray28, gray29, gray30, gray31, gray32, gray33, gray34, gray35,
+gray36, gray37, gray38, gray39, gray40, gray41, gray42, gray43, gray44,
+gray45, gray46, gray47, gray48, gray49, gray50, gray51, gray52, gray53,
+gray54, gray55, gray56, gray57, gray58, gray59, gray60, gray61, gray62,
+gray63, gray64, gray65, gray66, gray67, gay68, gray69, gray70, gray71,
+gray72, gray73, gray74, gray75, gray76, gray77, gray78, gray79, gray80,
+gray81, gray82, gray83, gray84, gray85, gray86, gray87, gray88, gray89,
+gray90, gray91, gray92, gray93, gray94, gray95, gray97, gray98, gray99,
+green1, green2, green3, green4, greenyellow, grey1, grey2, grey3, grey4,
+honeydew, honeydew1, honeydew2, honeydew3, honeydew4, hotpink, hotpink1,
+hotpink2, hotpink3, hotpink4, indianred, indianred1, indianred2, indianred3,
+indianred4, indigo, ivory, ivory1, ivory2, ivory3, ivory4, khaki, khaki1,
+khaki2, khaki3, khaki4, lavender, lavenderblush, lavenderblush1,
+lavenderblush2, lavenderblush3, lavenderblush4, lawngreen, lemonchiffon,
+lemonchiffon1, lemonchiffon2, lemonchiffon3, lemonchiffon4, light,
+lightblue, lightblue1, lightblue2, lightblue3,lightblue4, lightcoral,
+lightcyan, lightcyan1, lightcyan2, lightcyan3, lightcyan4, lightgoldenrod,
+lightgoldenrod1, lightgoldenrod2, lightgoldenrod3, lightgoldenrod4,
+lightgray, lightgreen, lightpink, lightpink1, lightpink2, lightpink3,
+lightpink4, lightpurple, lightsalmon, lightsalmon1, lightsalmon2,
+lightsalmon3, lightsalmon4, lightseagreen, lightskyblue, lightskyblue1,
+lightskyblue2, lightskyblue3, lightskyblue4, lightslateblue, lightslategray,
+lightsteelblue, lightsteelblue1, lightsteelblue2, lightsteelblue3,
+lightsteelblue4, lightyellow, lightyellow1, lightyellow2, lightyellow3,
+lightyellow4, lime, limegreen, linen, magenta, magenta1, magenta2, magenta3,
+magenta4, maroon, maroon1, maroon2, maroon3, maroon4, medium,
+mediumaquamarine, mediumblue, mediumorchid, mediumorchid1, mediumorchid2,
+mediumorchid3, mediumorchid4, mediumpurple, mediumpurple1, mediumpurple2,
+mediumpurple3, mediumpurple4, mediumseagreen, mediumslateblue,
+mediumspringgreen, mediumturquoise, mediumvioletred, midnightblue,
+mintcream, mistyrose, mistyrose1, mistyrose2, mistyrose3, mistyrose4,
+moccasin, navajowhite, navajowhite1, navajowhite2, navajowhite3,
+navajowhite4, navy, navyblue, oldlace, olive, olivedrab, olivedrab1,
+olivedrab2, olivedrab3, olivedrab4, orange, orange1, orange2, orange3,
+orange4, orangered, orangered1, orangered2, orangered3, orangered4,
+orchid, orchid1, orchid2, orchid3, orchid4, pale, palegoldenrod, palegreen,
+palegreen1, palegreen2, palegreen3, palegreen4, paleturquoise,
+paleturquoise1, paleturquoise2, paleturquoise3, paleturquoise4,
+palevioletred, palevioletred1, palevioletred2, palevioletred3,
+palevioletred4, papayawhip, peachpuff, peachpuff1, peachpuff2, peachpuff3,
+peachpuff4, peru, pink1, pink2, pink3, pink4, plum1, plum2, plum3, plum4,
+powderblue, purple1, purple2, purple3, purple4, rebeccapurple, red1, red2,
+red3, red4, rosybrown, rosybrown1, rosybrown2, rosybrown3, rosybrown4,
+royalblue, royalblue1, royalblue2, royalblue3, royalblue4, saddlebrown,
+salmon, salmon1, salmon2, salmon3, salmon4, sandybrown, seagreen,
+seagreen1, seagreen2, seagreen3, seagreen4, seashell, seashell1, seashell2,
+seashell3, seashell4, sienna, sienna1, sienna2, sienna3, sienna4, silver,
+skyblue, skyblue1, skyblue2, skyblue3, skyblue4, slateblue, slateblue1,
+slateblue2, slateblue3, slateblue4, slategray, slategray1, slategray2,
+slategray3, slategray4, snow, snow1, snow2, snow3, snow4, springgreen,
+springgreen1, springgreen2, springgreen3, springgreen4, steelblue,
+steelblue1, steelblue2, steelblue3, steelblue4, tan, tan1, tan2, tan3,
+tan4, teal, thistle, thistle1, thistle2, thistle3, thistle4, tomato,
+tomato1, tomato2, tomato3, tomato4, turquoise, turquoise1, turquoise2,
+turquoise3, turquoise4, violet, violetred, violetred1, violetred2,
+violetred3, violetred4, wheat, wheat1, wheat2, wheat3, wheat4, whitesmoke,
+yellow1, yellow2, yellow3, yellow4, yellowgreen
+
+marsala, radiandorchid, emerald, tangerinetango, honeysucle, turquoise,
+mimosa, blueizis, chilipepper, sanddollar, blueturquoise, tigerlily,
+aquasky, truered, fuchsiarose, ceruleanblue, rosequartz, peachecho,
+serenity, snorkelblue, limpetshell, lilacgrey, icedcoffee, fiesta,
+buttercup, greenflash, riverside, airyblue, sharkskin, aurorared,
+warmtaupe, dustycedar, lushmeadow, spicymustard, pottersclay, bodacious,
+greenery, niagara, primroseyellow, lapisblue, flame, islandparadise,
+paledogwood, pinkyarrow, kale, hazelnut, grenadine, balletslipper,
+butterum, navypeony, neutralgray, shadedspruce, goldenlime, marina,
+autumnmaple, meadowlark, cherrytomato, littleboyblue, chilioil,
+pinklavender, bloomingdahlia, arcadia, ultraviolet, emperador,
+almostmauve, springcrocus, sailorblue, harbormist, warmsand, coconutmilk,
+redpear, valiantpoppy, nebulasblue, ceylonyellow, martiniolive,
+russetorange, crocuspetal, limelight, quetzalgreen, sargassosea, tofu,
+almondbuff, quietgray, meerkat, fiesta, jesterred, turmeric, livingcoral,
+pinkpeacock, pepperstem, aspengold, princessblue, toffee, mangomojito,
+terrariummoss, sweetlilac, soybean, eclipse, sweetcorn, browngranite,
+chilipepper, bikingred, peachpink, rockyroad, fruitdove, sugaralmond,
+darkcheddar, galaxyblue, bluestone, orangetiger, eden, vanillacustard,
+eveningblue, paloma, guacamole, flamescarlet, saffron, biscaygreen, chive,
+fadeddenim, orangepeel, mosaicblue, sunlight, coralpink, grapecompote,
+lark, navyblazer, brilliantwhite, ash, amberglow, samba, sandstone,
+classicblue, greensheen, rosetan, ultramarinegreen, firedbrick,
+peachnougat, magentapurple, marigold, cerulean, rust, illuminating,
+frenchblue, greenash, burntcoral, mint, amethystorchid, raspberrysorbet,
+inkwell, ultimategray, buttercream, desertmist, willow
+
+=for HTML <p>
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/function/color/table/color_table0.png" alt="color table 1">
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/function/color/table/color_table1.png" alt="color table 2">
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/function/color/table/color_table2.png" alt="color table 3">
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/function/color/table/color_table3.png" alt="color table 4">
+</p>
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright 2022 Herbert Breunung.
+
+This program is free software; you can redistribute it and/or modify it
+under same terms as Perl itself.
+
+=head1 AUTHOR
+
+Herbert Breunung, <lichtkind@cpan.org>
diff --git a/lib/Chart/Color/Named.pm b/lib/Chart/Color/Named.pm
deleted file mode 100644
index 19ad9d9..0000000
--- a/lib/Chart/Color/Named.pm
+++ /dev/null
@@ -1,502 +0,0 @@
-
-# Chart::Color::Named : expandable store of all predefined color names
-
-use v5.12;
-
-package Chart::Color::Named;
-
-our %store = ( # http://en.wikipedia.org/wiki/Web_colors#X11_color_names
- 'white' => [ 255, 255, 255 ],
- 'black' => [ 0, 0, 0 ],
- 'red' => [ 200, 0, 0 ],
- 'green' => [ 0, 175, 0 ],
- 'blue' => [ 0, 0, 200 ],
- 'orange' => [ 250, 125, 0 ],
- 'orange2' => [ 238, 154, 0 ],
- 'orange3' => [ 205, 133, 0 ],
- 'orange4' => [ 139, 90, 0 ],
- 'yellow' => [ 225, 225, 0 ],
- 'purple' => [ 200, 0, 200 ],
- 'light_blue' => [ 0, 125, 250 ],
- 'light_green' => [ 125, 250, 0 ],
- 'light_purple' => [ 145, 0, 250 ],
- 'pink' => [ 250, 0, 125 ],
- 'peach' => [ 250, 125, 125 ],
- 'olive' => [ 125, 125, 0 ],
- 'plum' => [ 125, 0, 125 ],
- 'turquoise' => [ 0, 125, 125 ],
- 'mauve' => [ 200, 125, 125 ],
- 'brown' => [ 160, 80, 0 ],
- 'grey' => [ 225, 225, 225 ],
- 'HotPink' => [ 255, 105, 180 ],
- 'PaleGreen1' => [ 154, 255, 154 ],
- 'PaleGreen2' => [ 144, 238, 144 ],
- 'PaleGreen3' => [ 124, 205, 124 ],
- 'PaleGreen4' => [ 84, 138, 84 ],
- 'DarkBlue' => [ 0, 0, 139 ],
- 'BlueViolet' => [ 138, 43, 226 ],
- 'PeachPuff' => [ 255, 218, 185 ],
- 'PeachPuff1' => [ 255, 218, 185 ],
- 'PeachPuff2' => [ 238, 203, 173 ],
- 'PeachPuff3' => [ 205, 175, 149 ],
- 'PeachPuff4' => [ 139, 119, 101 ],
- 'chocolate1' => [ 255, 127, 36 ],
- 'chocolate2' => [ 238, 118, 33 ],
- 'chocolate3' => [ 205, 102, 29 ],
- 'chocolate4' => [ 139, 69, 19 ],
- 'LightGreen' => [ 144, 238, 144 ],
- 'lavender' => [ 230, 230, 250 ],
- 'MediumPurple' => [ 147, 112, 219 ],
- 'DarkOrange' => [ 255, 127, 0 ],
- 'DarkOrange2' => [ 238, 118, 0 ],
- 'DarkOrange3' => [ 205, 102, 0 ],
- 'DarkOrange4' => [ 139, 69, 0 ],
- 'SlateBlue' => [ 106, 90, 205 ],
- 'BlueViolet' => [ 138, 43, 226 ],
- 'RoyalBlue' => [ 65, 105, 225 ],
- 'AntiqueWhite' => [ 250, 235, 215 ],
- 'AntiqueWhite1' => [ 255, 239, 219 ],
- 'AntiqueWhite2' => [ 238, 223, 204 ],
- 'AntiqueWhite3' => [ 205, 192, 176 ],
- 'AntiqueWhite4' => [ 139, 131, 120 ],
- 'CadetBlue' => [ 95, 158, 160 ],
- 'CadetBlue1' => [ 152, 245, 255 ],
- 'CadetBlue2' => [ 142, 229, 238 ],
- 'CadetBlue3' => [ 122, 197, 205 ],
- 'CadetBlue4' => [ 83, 134, 139 ],
- 'DarkGoldenrod' => [ 184, 134, 11 ],
- 'DarkGoldenrod1' => [ 255, 185, 15 ],
- 'DarkGoldenrod2' => [ 238, 173, 14 ],
- 'DarkGoldenrod3' => [ 205, 149, 12 ],
- 'DarkGoldenrod4' => [ 139, 101, 8 ],
- 'DarkOliveGreen' => [ 85, 107, 47 ],
- 'DarkOliveGreen1' => [ 202, 255, 112 ],
- 'DarkOliveGreen2' => [ 188, 238, 104 ],
- 'DarkOliveGreen3' => [ 162, 205, 90 ],
- 'DarkOliveGreen4' => [ 110, 139, 61 ],
- 'DarkOrange1' => [ 255, 127, 0 ],
- 'DarkOrchid' => [ 153, 50, 204 ],
- 'DarkOrchid1' => [ 191, 62, 255 ],
- 'DarkOrchid2' => [ 178, 58, 238 ],
- 'DarkOrchid3' => [ 154, 50, 205 ],
- 'DarkOrchid4' => [ 104, 34, 139 ],
- 'DarkSeaGreen' => [ 143, 188, 143 ],
- 'DarkSeaGreen1' => [ 193, 255, 193 ],
- 'DarkSeaGreen2' => [ 180, 238, 180 ],
- 'DarkSeaGreen3' => [ 155, 205, 155 ],
- 'DarkSeaGreen4' => [ 105, 139, 105 ],
- 'DarkSlateGray' => [ 47, 79, 79 ],
- 'DarkSlateGray1' => [ 151, 255, 255 ],
- 'DarkSlateGray2' => [ 141, 238, 238 ],
- 'DarkSlateGray3' => [ 121, 205, 205 ],
- 'DarkSlateGray4' => [ 82, 139, 139 ],
- 'DeepPink' => [ 255, 20, 147 ],
- 'DeepPink1' => [ 255, 20, 147 ],
- 'DeepPink2' => [ 238, 18, 137 ],
- 'DeepPink3' => [ 205, 16, 118 ],
- 'DeepPink4' => [ 139, 10, 80 ],
- 'DeepSkyBlue' => [ 0, 191, 255 ],
- 'DeepSkyBlue1' => [ 0, 191, 255 ],
- 'DeepSkyBlue2' => [ 0, 178, 238 ],
- 'DeepSkyBlue3' => [ 0, 154, 205 ],
- 'DeepSkyBlue4' => [ 0, 104, 139 ],
- 'DodgerBlue' => [ 30, 144, 255 ],
- 'DodgerBlue1' => [ 30, 144, 255 ],
- 'DodgerBlue2' => [ 28, 134, 238 ],
- 'DodgerBlue3' => [ 24, 116, 205 ],
- 'DodgerBlue4' => [ 16, 78, 139 ],
- 'HotPink1' => [ 255, 110, 180 ],
- 'HotPink2' => [ 238, 106, 167 ],
- 'HotPink3' => [ 205, 96, 144 ],
- 'HotPink4' => [ 139, 58, 98 ],
- 'IndianRed' => [ 205, 92, 92 ],
- 'IndianRed1' => [ 255, 106, 106 ],
- 'IndianRed2' => [ 238, 99, 99 ],
- 'IndianRed3' => [ 205, 85, 85 ],
- 'IndianRed4' => [ 139, 58, 58 ],
- 'LavenderBlush' => [ 255, 240, 245 ],
- 'LavenderBlush1' => [ 255, 240, 245 ],
- 'LavenderBlush2' => [ 238, 224, 229 ],
- 'LavenderBlush3' => [ 205, 193, 197 ],
- 'LavenderBlush4' => [ 139, 131, 134 ],
- 'LemonChiffon' => [ 255, 250, 205 ],
- 'LemonChiffon1' => [ 255, 250, 205 ],
- 'LemonChiffon2' => [ 238, 233, 191 ],
- 'LemonChiffon3' => [ 205, 201, 165 ],
- 'LemonChiffon4' => [ 139, 137, 112 ],
- 'LightBlue' => [ 173, 216, 230 ],
- 'LightBlue1' => [ 191, 239, 255 ],
- 'LightBlue2' => [ 178, 223, 238 ],
- 'LightBlue3' => [ 154, 192, 205 ],
- 'LightBlue4' => [ 104, 131, 139 ],
- 'LightCyan' => [ 224, 255, 255 ],
- 'LightCyan1' => [ 224, 255, 255 ],
- 'LightCyan2' => [ 209, 238, 238 ],
- 'LightCyan3' => [ 180, 205, 205 ],
- 'LightCyan4' => [ 122, 139, 139 ],
- 'LightGoldenrod' => [ 238, 221, 130 ],
- 'LightGoldenrod1' => [ 255, 236, 139 ],
- 'LightGoldenrod2' => [ 238, 220, 130 ],
- 'LightGoldenrod3' => [ 205, 190, 112 ],
- 'LightGoldenrod4' => [ 139, 129, 76 ],
- 'LightPink' => [ 255, 182, 193 ],
- 'LightPink1' => [ 255, 174, 185 ],
- 'LightPink2' => [ 238, 162, 173 ],
- 'LightPink3' => [ 205, 140, 149 ],
- 'LightPink4' => [ 139, 95, 101 ],
- 'LightSalmon' => [ 255, 160, 122 ],
- 'LightSalmon1' => [ 255, 160, 122 ],
- 'LightSalmon2' => [ 238, 149, 114 ],
- 'LightSalmon3' => [ 205, 129, 98 ],
- 'LightSalmon4' => [ 139, 87, 66 ],
- 'LightSkyBlue' => [ 135, 206, 250 ],
- 'LightSkyBlue1' => [ 176, 226, 255 ],
- 'LightSkyBlue2' => [ 164, 211, 238 ],
- 'LightSkyBlue3' => [ 141, 182, 205 ],
- 'LightSkyBlue4' => [ 96, 123, 139 ],
- 'LightSteelBlue' => [ 176, 196, 222 ],
- 'LightSteelBlue1' => [ 202, 225, 255 ],
- 'LightSteelBlue2' => [ 188, 210, 238 ],
- 'LightSteelBlue3' => [ 162, 181, 205 ],
- 'LightSteelBlue4' => [ 110, 123, 139 ],
- 'LightYellow' => [ 255, 255, 224 ],
- 'LightYellow1' => [ 255, 255, 224 ],
- 'LightYellow2' => [ 238, 238, 209 ],
- 'LightYellow3' => [ 205, 205, 180 ],
- 'LightYellow4' => [ 139, 139, 122 ],
- 'MediumOrchid' => [ 186, 85, 211 ],
- 'MediumOrchid1' => [ 224, 102, 255 ],
- 'MediumOrchid2' => [ 209, 95, 238 ],
- 'MediumOrchid3' => [ 180, 82, 205 ],
- 'MediumOrchid4' => [ 122, 55, 139 ],
- 'MediumPurple1' => [ 171, 130, 255 ],
- 'MediumPurple2' => [ 159, 121, 238 ],
- 'MediumPurple3' => [ 137, 104, 205 ],
- 'MediumPurple4' => [ 93, 71, 139 ],
- 'MistyRose' => [ 255, 228, 225 ],
- 'MistyRose1' => [ 255, 228, 225 ],
- 'MistyRose2' => [ 238, 213, 210 ],
- 'MistyRose3' => [ 205, 183, 181 ],
- 'MistyRose4' => [ 139, 125, 123 ],
- 'NavajoWhite' => [ 255, 222, 173 ],
- 'NavajoWhite1' => [ 255, 222, 173 ],
- 'NavajoWhite2' => [ 238, 207, 161 ],
- 'NavajoWhite3' => [ 205, 179, 139 ],
- 'NavajoWhite4' => [ 139, 121, 94 ],
- 'OliveDrab' => [ 107, 142, 35 ],
- 'OliveDrab1' => [ 192, 255, 62 ],
- 'OliveDrab2' => [ 179, 238, 58 ],
- 'OliveDrab3' => [ 154, 205, 50 ],
- 'OliveDrab4' => [ 105, 139, 34 ],
- 'OrangeRed' => [ 255, 69, 0 ],
- 'OrangeRed1' => [ 255, 69, 0 ],
- 'OrangeRed2' => [ 238, 64, 0 ],
- 'OrangeRed3' => [ 205, 55, 0 ],
- 'OrangeRed4' => [ 139, 37, 0 ],
- 'PaleGreen' => [ 152, 251, 152 ],
- 'PaleTurquoise' => [ 175, 238, 238 ],
- 'PaleTurquoise1' => [ 187, 255, 255 ],
- 'PaleTurquoise2' => [ 174, 238, 238 ],
- 'PaleTurquoise3' => [ 150, 205, 205 ],
- 'PaleTurquoise4' => [ 102, 139, 139 ],
- 'PaleVioletRed' => [ 219, 112, 147 ],
- 'PaleVioletRed1' => [ 255, 130, 171 ],
- 'PaleVioletRed2' => [ 238, 121, 159 ],
- 'PaleVioletRed3' => [ 205, 104, 137 ],
- 'PaleVioletRed4' => [ 139, 71, 93 ],
- 'RosyBrown' => [ 188, 143, 143 ],
- 'RosyBrown1' => [ 255, 193, 193 ],
- 'RosyBrown2' => [ 238, 180, 180 ],
- 'RosyBrown3' => [ 205, 155, 155 ],
- 'RosyBrown4' => [ 139, 105, 105 ],
- 'RoyalBlue1' => [ 72, 118, 255 ],
- 'RoyalBlue2' => [ 67, 110, 238 ],
- 'RoyalBlue3' => [ 58, 95, 205 ],
- 'RoyalBlue4' => [ 39, 64, 139 ],
- 'SeaGreen' => [ 46, 139, 87 ],
- 'SeaGreen1' => [ 84, 255, 159 ],
- 'SeaGreen2' => [ 78, 238, 148 ],
- 'SeaGreen3' => [ 67, 205, 128 ],
- 'SeaGreen4' => [ 46, 139, 87 ],
- 'SkyBlue' => [ 135, 206, 235 ],
- 'SkyBlue1' => [ 135, 206, 255 ],
- 'SkyBlue2' => [ 126, 192, 238 ],
- 'SkyBlue3' => [ 108, 166, 205 ],
- 'SkyBlue4' => [ 74, 112, 139 ],
- 'SlateBlue1' => [ 131, 111, 255 ],
- 'SlateBlue2' => [ 122, 103, 238 ],
- 'SlateBlue3' => [ 105, 89, 205 ],
- 'SlateBlue4' => [ 71, 60, 139 ],
- 'SlateGray' => [ 112, 128, 144 ],
- 'SlateGray1' => [ 198, 226, 255 ],
- 'SlateGray2' => [ 185, 211, 238 ],
- 'SlateGray3' => [ 159, 182, 205 ],
- 'SlateGray4' => [ 108, 123, 139 ],
- 'SpringGreen' => [ 0, 255, 127 ],
- 'SpringGreen1' => [ 0, 255, 127 ],
- 'SpringGreen2' => [ 0, 238, 118 ],
- 'SpringGreen3' => [ 0, 205, 102 ],
- 'SpringGreen4' => [ 0, 139, 69 ],
- 'SteelBlue' => [ 70, 130, 180 ],
- 'SteelBlue1' => [ 99, 184, 255 ],
- 'SteelBlue2' => [ 92, 172, 238 ],
- 'SteelBlue3' => [ 79, 148, 205 ],
- 'SteelBlue4' => [ 54, 100, 139 ],
- 'VioletRed' => [ 208, 32, 144 ],
- 'VioletRed1' => [ 255, 62, 150 ],
- 'VioletRed2' => [ 238, 58, 140 ],
- 'VioletRed3' => [ 205, 50, 120 ],
- 'VioletRed4' => [ 139, 34, 82 ],
- 'aquamarine' => [ 127, 255, 212 ],
- 'aquamarine1' => [ 127, 255, 212 ],
- 'aquamarine2' => [ 118, 238, 198 ],
- 'aquamarine3' => [ 102, 205, 170 ],
- 'aquamarine4' => [ 69, 139, 116 ],
- 'azure' => [ 240, 255, 255 ],
- 'azure1' => [ 240, 255, 255 ],
- 'azure2' => [ 224, 238, 238 ],
- 'azure3' => [ 193, 205, 205 ],
- 'azure4' => [ 131, 139, 139 ],
- 'bisque' => [ 255, 228, 196 ],
- 'bisque1' => [ 255, 228, 196 ],
- 'bisque2' => [ 238, 213, 183 ],
- 'bisque3' => [ 205, 183, 158 ],
- 'bisque4' => [ 139, 125, 107 ],
- 'blue1' => [ 0, 0, 255 ],
- 'blue2' => [ 0, 0, 238 ],
- 'blue3' => [ 0, 0, 205 ],
- 'blue4' => [ 0, 0, 139 ],
- 'brown1' => [ 255, 64, 64 ],
- 'brown2' => [ 238, 59, 59 ],
- 'brown3' => [ 205, 51, 51 ],
- 'brown4' => [ 139, 35, 35 ],
- 'burlywood' => [ 222, 184, 135 ],
- 'burlywood1' => [ 255, 211, 155 ],
- 'burlywood2' => [ 238, 197, 145 ],
- 'burlywood3' => [ 205, 170, 125 ],
- 'burlywood4' => [ 139, 115, 85 ],
- 'chartreuse' => [ 127, 255, 0 ],
- 'chartreuse1' => [ 127, 255, 0 ],
- 'chartreuse2' => [ 118, 238, 0 ],
- 'chartreuse3' => [ 102, 205, 0 ],
- 'chartreuse4' => [ 69, 139, 0 ],
- 'chocolate' => [ 210, 105, 30 ],
- 'coral' => [ 255, 127, 80 ],
- 'coral1' => [ 255, 114, 86 ],
- 'coral2' => [ 238, 106, 80 ],
- 'coral3' => [ 205, 91, 69 ],
- 'coral4' => [ 139, 62, 47 ],
- 'cornsilk' => [ 255, 248, 220 ],
- 'cornsilk1' => [ 255, 248, 220 ],
- 'cornsilk2' => [ 238, 232, 205 ],
- 'cornsilk3' => [ 205, 200, 177 ],
- 'cornsilk4' => [ 139, 136, 120 ],
- 'cyan' => [ 0, 255, 255 ],
- 'cyan1' => [ 0, 255, 255 ],
- 'cyan2' => [ 0, 238, 238 ],
- 'cyan3' => [ 0, 205, 205 ],
- 'cyan4' => [ 0, 139, 139 ],
- 'firebrick' => [ 178, 34, 34 ],
- 'firebrick1' => [ 255, 48, 48 ],
- 'firebrick2' => [ 238, 44, 44 ],
- 'firebrick3' => [ 205, 38, 38 ],
- 'firebrick4' => [ 139, 26, 26 ],
- 'gold' => [ 255, 215, 0 ],
- 'gold1' => [ 255, 215, 0 ],
- 'gold2' => [ 238, 201, 0 ],
- 'gold3' => [ 205, 173, 0 ],
- 'gold4' => [ 139, 117, 0 ],
- 'goldenrod' => [ 218, 165, 32 ],
- 'goldenrod1' => [ 255, 193, 37 ],
- 'goldenrod2' => [ 238, 180, 34 ],
- 'goldenrod3' => [ 205, 155, 29 ],
- 'goldenrod4' => [ 139, 105, 20 ],
- 'gray' => [ 190, 190, 190 ],
- 'gray1' => [ 3, 3, 3 ],
- 'gray2' => [ 5, 5, 5 ],
- 'gray3' => [ 8, 8, 8 ],
- 'gray4' => [ 10, 10, 10 ],
- 'green1' => [ 0, 255, 0 ],
- 'green2' => [ 0, 238, 0 ],
- 'green3' => [ 0, 205, 0 ],
- 'green4' => [ 0, 139, 0 ],
- 'grey1' => [ 3, 3, 3 ],
- 'grey2' => [ 5, 5, 5 ],
- 'grey3' => [ 8, 8, 8 ],
- 'grey4' => [ 10, 10, 10 ],
- 'honeydew' => [ 240, 255, 240 ],
- 'honeydew1' => [ 240, 255, 240 ],
- 'honeydew2' => [ 224, 238, 224 ],
- 'honeydew3' => [ 193, 205, 193 ],
- 'honeydew4' => [ 131, 139, 131 ],
- 'ivory' => [ 255, 255, 240 ],
- 'ivory1' => [ 255, 255, 240 ],
- 'ivory2' => [ 238, 238, 224 ],
- 'ivory3' => [ 205, 205, 193 ],
- 'ivory4' => [ 139, 139, 131 ],
- 'khaki' => [ 240, 230, 140 ],
- 'khaki1' => [ 255, 246, 143 ],
- 'khaki2' => [ 238, 230, 133 ],
- 'khaki3' => [ 205, 198, 115 ],
- 'khaki4' => [ 139, 134, 78 ],
- 'magenta' => [ 255, 0, 255 ],
- 'magenta1' => [ 255, 0, 255 ],
- 'magenta2' => [ 238, 0, 238 ],
- 'magenta3' => [ 205, 0, 205 ],
- 'magenta4' => [ 139, 0, 139 ],
- 'maroon' => [ 176, 48, 96 ],
- 'maroon1' => [ 255, 52, 179 ],
- 'maroon2' => [ 238, 48, 167 ],
- 'maroon3' => [ 205, 41, 144 ],
- 'maroon4' => [ 139, 28, 98 ],
- 'orange1' => [ 255, 165, 0 ],
- 'orchid' => [ 218, 112, 214 ],
- 'orchid1' => [ 255, 131, 250 ],
- 'orchid2' => [ 238, 122, 233 ],
- 'orchid3' => [ 205, 105, 201 ],
- 'orchid4' => [ 139, 71, 137 ],
- 'pink1' => [ 255, 181, 197 ],
- 'pink2' => [ 238, 169, 184 ],
- 'pink3' => [ 205, 145, 158 ],
- 'pink4' => [ 139, 99, 108 ],
- 'plum1' => [ 255, 187, 255 ],
- 'plum2' => [ 238, 174, 238 ],
- 'plum3' => [ 205, 150, 205 ],
- 'plum4' => [ 139, 102, 139 ],
- 'purple1' => [ 155, 48, 255 ],
- 'purple2' => [ 145, 44, 238 ],
- 'purple3' => [ 125, 38, 205 ],
- 'purple4' => [ 85, 26, 139 ],
- 'red1' => [ 255, 0, 0 ],
- 'red2' => [ 238, 0, 0 ],
- 'red3' => [ 205, 0, 0 ],
- 'red4' => [ 139, 0, 0 ],
- 'salmon' => [ 250, 128, 114 ],
- 'salmon1' => [ 255, 140, 105 ],
- 'salmon2' => [ 238, 130, 98 ],
- 'salmon3' => [ 205, 112, 84 ],
- 'salmon4' => [ 139, 76, 57 ],
- 'seashell' => [ 255, 245, 238 ],
- 'seashell1' => [ 255, 245, 238 ],
- 'seashell2' => [ 238, 229, 222 ],
- 'seashell3' => [ 205, 197, 191 ],
- 'seashell4' => [ 139, 134, 130 ],
- 'sienna' => [ 160, 82, 45 ],
- 'sienna1' => [ 255, 130, 71 ],
- 'sienna2' => [ 238, 121, 66 ],
- 'sienna3' => [ 205, 104, 57 ],
- 'sienna4' => [ 139, 71, 38 ],
- 'snow' => [ 255, 250, 250 ],
- 'snow1' => [ 255, 250, 250 ],
- 'snow2' => [ 238, 233, 233 ],
- 'snow3' => [ 205, 201, 201 ],
- 'snow4' => [ 139, 137, 137 ],
- 'tan' => [ 210, 180, 140 ],
- 'tan1' => [ 255, 165, 79 ],
- 'tan2' => [ 238, 154, 73 ],
- 'tan3' => [ 205, 133, 63 ],
- 'tan4' => [ 139, 90, 43 ],
- 'thistle' => [ 216, 191, 216 ],
- 'thistle1' => [ 255, 225, 255 ],
- 'thistle2' => [ 238, 210, 238 ],
- 'thistle3' => [ 205, 181, 205 ],
- 'thistle4' => [ 139, 123, 139 ],
- 'tomato' => [ 255, 99, 71 ],
- 'tomato1' => [ 255, 99, 71 ],
- 'tomato2' => [ 238, 92, 66 ],
- 'tomato3' => [ 205, 79, 57 ],
- 'tomato4' => [ 139, 54, 38 ],
- 'turquoise1' => [ 0, 245, 255 ],
- 'turquoise2' => [ 0, 229, 238 ],
- 'turquoise3' => [ 0, 197, 205 ],
- 'turquoise4' => [ 0, 134, 139 ],
- 'wheat' => [ 245, 222, 179 ],
- 'wheat1' => [ 255, 231, 186 ],
- 'wheat2' => [ 238, 216, 174 ],
- 'wheat3' => [ 205, 186, 150 ],
- 'wheat4' => [ 139, 126, 102 ],
- 'yellow1' => [ 255, 255, 0 ],
- 'yellow2' => [ 238, 238, 0 ],
- 'yellow3' => [ 205, 205, 0 ],
- 'yellow4' => [ 139, 139, 0 ],
- 'RoseQuartz' => [ 247, 202, 201 ], # https://www.w3schools.com/colors/colors_trends.asp
- 'PeachEcho' => [ 247, 120, 107 ], # 2016
- 'Serenity' => [ 145, 168, 208 ], # Spring
- 'SnorkelBlue' => [ 3, 79, 132 ],
- 'LimpetShell' => [ 152, 221, 222 ],
- 'LilacGrey' => [ 152, 221, 222 ],
- 'IcedCoffee' => [ 177, 143, 106 ],
- 'Fiesta' => [ 221, 65, 50 ],
- 'Buttercup' => [ 221, 65, 50 ],
- 'GreenFlash' => [ 250, 224, 60 ],
- 'Riverside' => [ 76, 106, 146 ], # Fall
- 'AiryBlue' => [ 146, 182, 213 ],
- 'Sharkskin' => [ 131, 132, 135 ],
- 'AuroraRed' => [ 185, 58, 50 ],
- 'WarmTaupe' => [ 175, 148, 131 ],
- 'DustyCedar' => [ 173, 93, 93 ],
- 'LushMeadow' => [ 0, 110, 81 ],
- 'SpicyMustard' => [ 216, 174, 71 ],
- "Potter'sClay" => [ 158, 70, 36 ],
- 'Bodacious' => [ 183, 107, 163 ],
-
-
-
-);
-
-
-sub all_names { keys %store }
-sub name_taken { exists $store{$_[0]}}
-
-sub add {
- my $name = shift;
- my $val = shift;
- return "Color name missing" unless defined $name and $name;
- return "Color already exists" if exists $store{$name};
- return "Need a Color value (ArrayRef to 3 Int < 256)" if ref $val ne 'ARRAY' or @$val != 3;
- my $ret = Color->new(@$val);
- return $ret unless ref $ret;
- $store{$name} = $ret;
-}
-
-sub get {
- my $name = shift;
- @{$store{$name}}[0..2] if exists $store{$name}
-}
-
-
-1;
-
-__END__
-
-my %RGB = (
- white => [0xFF,0xFF,0xFF],
- lgray => [0xBF,0xBF,0xBF],
- gray => [0x7F,0x7F,0x7F],
- dgray => [0x3F,0x3F,0x3F],
- black => [0x00,0x00,0x00],
- lblue => [0x00,0x00,0xFF],
- blue => [0x00,0x00,0xBF],
- dblue => [0x00,0x00,0x7F],
- gold => [0xFF,0xD7,0x00],
- lyellow => [0xFF,0xFF,0x00],
- yellow => [0xBF,0xBF,0x00],
- dyellow => [0x7F,0x7F,0x00],
- lgreen => [0x00,0xFF,0x00],
- green => [0x00,0xBF,0x00],
- dgreen => [0x00,0x7F,0x00],
- lred => [0xFF,0x00,0x00],
- red => [0xBF,0x00,0x00],
- dred => [0x7F,0x00,0x00],
- lpurple => [0xFF,0x00,0xFF],
- purple => [0xBF,0x00,0xBF],
- dpurple => [0x7F,0x00,0x7F],
- lorange => [0xFF,0xB7,0x00],
- orange => [0xFF,0x7F,0x00],
- pink => [0xFF,0xB7,0xC1],
- dpink => [0xFF,0x69,0xB4],
- marine => [0x7F,0x7F,0xFF],
- cyan => [0x00,0xFF,0xFF],
- lbrown => [0xD2,0xB4,0x8C],
- dbrown => [0xA5,0x2A,0x2A],
-);
diff --git a/lib/Chart/Color/Scheme.pm b/lib/Chart/Color/Scheme.pm
deleted file mode 100644
index 00e7cd9..0000000
--- a/lib/Chart/Color/Scheme.pm
+++ /dev/null
@@ -1,105 +0,0 @@
-
-# Chart::Color::Store : expandable store of color sets
-
-use v5.12;
-
-package Chart::Color::Scheme;
-
-use use Chart::Color::Named;
-
-my %keys = ( background => '',
- misc => '',
- text => '',
- x_label => '',
- x_label2 => '',
- y_label => '',
- y_label2 => '',
- x_grid_lines => '',
- y_grid_lines => '',
- dataset => []);
-
-my %scheme = (
- 'default' => {
- background => 'white',
- misc => 'black',
- text => 'black',
- x_label => 'black',
- x_label2 => 'black',
- y_label => 'black',
- y_label2 => 'black',
- x_grid_lines => 'black',
- y_grid_lines => 'black',
- dataset => [ qw (red green blue purple peach orange mauve olive pink light_purple light_blue
- plum yellow turquoise light_green brown HotPink PaleGreen1 DarkBlue BlueViolet orange2
- chocolate1 LightGreen pink light_purple light_blue plum yellow turquoise light_green brown pink
- PaleGreen2 MediumPurple PeachPuff1 orange3 chocolate2 olive pink light_purple light_blue plum
- yellow turquoise light_green brown DarkOrange PaleGreen3 SlateBlue BlueViolet PeachPuff2 orange4
- chocolate3 LightGreen pink light_purple light_blue plum yellow turquoise light_green brown snow1
- honeydew3 SkyBlue1 cyan3 DarkOliveGreen1 IndianRed3 orange1 LightPink3 MediumPurple1 snow3
- LavenderBlush1 SkyBlue3 DarkSlateGray1 DarkOliveGreen3 sienna1 orange3 PaleVioletRed1 MediumPurple3
- seashell1 LavenderBlush3 LightSkyBlue1 DarkSlateGray3 khaki1 sienna3 DarkOrange1 PaleVioletRed3
- thistle1 seashell3 MistyRose1 LightSkyBlue3 aquamarine1 khaki3 burlywood1 DarkOrange3 maroon1
- thistle3 AntiqueWhite1 MistyRose3 SlateGray1 aquamarine3 LightGoldenrod1 burlywood3 coral1 maroon3
- AntiqueWhite3 azure1 SlateGray3 DarkSeaGreen1 LightGoldenrod3 wheat1 coral3 VioletRed1 bisque1
- azure3 LightSteelBlue1 DarkSeaGreen3 LightYellow1 wheat3 tomato1 VioletRed3 bisque3 SlateBlue1
- LightSteelBlue3 SeaGreen1 LightYellow3 tan1 tomato3 magenta1 PeachPuff1 SlateBlue3 LightBlue1
- SeaGreen3 yellow1 tan3 OrangeRed1 magenta3 PeachPuff3 RoyalBlue1 LightBlue3 PaleGreen1 yellow3
- chocolate1 OrangeRed3 orchid1 NavajoWhite1 RoyalBlue3 LightCyan1 PaleGreen3 gold1 chocolate3
- red1 orchid3 NavajoWhite3 blue1 LightCyan3 SpringGreen1 gold3 firebrick1 red3 plum1 LemonChiffon1
- blue3 PaleTurquoise1 SpringGreen3 goldenrod1 firebrick3 DeepPink1 plum3 LemonChiffon3 DodgerBlue1
- PaleTurquoise3 green1 goldenrod3 brown1 DeepPink3 MediumOrchid1 cornsilk1 DodgerBlue3 CadetBlue1
- green3 DarkGoldenrod1 brown3 HotPink1 MediumOrchid3 cornsilk3 SteelBlue1 CadetBlue3 chartreuse1
- DarkGoldenrod3 salmon1 HotPink3 DarkOrchid1 ivory1 SteelBlue3 turquoise1 chartreuse3 RosyBrown1
- salmon3 pink1 DarkOrchid3 ivory3 DeepSkyBlue1 turquoise3 OliveDrab1 RosyBrown3 LightSalmon1 pink3
- purple1 honeydew1 DeepSkyBlue3 cyan1 OliveDrab3 IndianRed1 LightSalmon3 LightPink1 purple3 honeydew2
- DeepSkyBlue4 cyan2 OliveDrab4 IndianRed2 LightSalmon4 LightPink2 purple4 snow2 honeydew4 SkyBlue2
- cyan4 DarkOliveGreen2 IndianRed4 orange2 LightPink4 MediumPurple2 snow4 LavenderBlush2 SkyBlue4
- DarkSlateGray2 DarkOliveGreen4 sienna2 orange4 PaleVioletRed2 MediumPurple4 seashell2 LavenderBlush4
- LightSkyBlue2 DarkSlateGray4 khaki2 sienna4 DarkOrange2 PaleVioletRed4 thistle2 seashell4 MistyRose2
- LightSkyBlue4 aquamarine2 khaki4 burlywood2 DarkOrange4 maroon2 thistle4 AntiqueWhite2 MistyRose4
- SlateGray2 aquamarine4 LightGoldenrod2 burlywood4 coral2 maroon4 AntiqueWhite4 azure2 SlateGray4
- DarkSeaGreen2 LightGoldenrod4 wheat2 coral4 VioletRed2 bisque2 azure4 LightSteelBlue2 DarkSeaGreen4
- LightYellow2 wheat4 tomato2 VioletRed4 bisque4 SlateBlue2 LightSteelBlue4 SeaGreen2 LightYellow4 tan2
- tomato4 magenta2 PeachPuff2 SlateBlue4 LightBlue2 SeaGreen4 yellow2 tan4 OrangeRed2 magenta4 PeachPuff4
- RoyalBlue2 LightBlue4 PaleGreen2 yellow4 chocolate2 OrangeRed4 orchid2 NavajoWhite2 RoyalBlue4
- LightCyan2 PaleGreen4 gold2 chocolate4 red2 orchid4 NavajoWhite4 blue2 LightCyan4 SpringGreen2 gold4
- firebrick2 red4 plum2 LemonChiffon2 blue4 PaleTurquoise2 SpringGreen4 goldenrod2 firebrick4 DeepPink2
- plum4 LemonChiffon4 DodgerBlue2 PaleTurquoise4 green2 goldenrod4 brown2 DeepPink4 MediumOrchid2
- cornsilk2 DodgerBlue4 CadetBlue2 green4 DarkGoldenrod2 brown4 HotPink2 MediumOrchid4 cornsilk4
- SteelBlue2 CadetBlue4 chartreuse2 DarkGoldenrod4 salmon2 HotPink4 DarkOrchid2 ivory2 SteelBlue4
- turquoise2 chartreuse4 RosyBrown2 salmon4 pink2 DarkOrchid4 ivory4 DeepSkyBlue2 turquoise4 OliveDrab2
- RosyBrown4 LightSalmon2 pink4 purple2)] },
-);
-
-
-
-
-sub all_names { keys %set }
-sub name_taken { exists %set{$_[0]} }
-
-sub add {
- my $name = shift;
- my $my_scheme = shift;
- return "Color scheme name missing" unless defined $name and $name;
- return "Color scheme already exists" if exists $scheme{$name};
- return "Color scheme has to be a Hash" if ref $val ne 'HASH';
- for my $k (keys %$val){
- return "$k is not a valid key of an color set" unless exists $scheme{'default'}{$k}
- }
- for my $k (keys %{$scheme{'default'}}){
- $my_set->{$k} = $scheme{'default'}{$k} unless exists $my_scheme->{$k};
- }
-
-## check all color, whole data set
-# return "Need a Color value (ArrayRef to 3 Int < 256)" if ref $val ne 'ARRAY' or @$val != 3;
- my $ret = Color->new(@$val);
- return $ret unless ref $ret;
- $scheme{$name} = $my_set;
-}
-
-sub get { $scheme{$_[0]} if exists $scheme{$_[0]} }
-
-
-1;
-
-
diff --git a/lib/Chart/Color/Value.pm b/lib/Chart/Color/Value.pm
new file mode 100644
index 0000000..bb6bf31
--- /dev/null
+++ b/lib/Chart/Color/Value.pm
@@ -0,0 +1,262 @@
+use v5.12;
+
+# check, convert and measure color values
+
+package Chart::Color::Value;
+our $VERSION = 'v2.403.2';
+use Carp;
+
+sub check_rgb { # carp returns 1
+ my (@rgb) = @_;
+ my $help = 'has to be an integer between 0 and 255';
+ return carp "need exactly 3 positive integer values 0 <= n < 256 for rgb input" unless @rgb == 3;
+ return carp "red value $rgb[0] ".$help unless int $rgb[0] == $rgb[0] and $rgb[0] >= 0 and $rgb[0] < 256;
+ return carp "green value $rgb[1] ".$help unless int $rgb[1] == $rgb[1] and $rgb[1] >= 0 and $rgb[1] < 256;
+ return carp "blue value $rgb[2] ".$help unless int $rgb[2] == $rgb[2] and $rgb[2] >= 0 and $rgb[2] < 256;
+ 0;
+}
+
+sub check_hsl {
+ my (@hsl) = @_;
+ my $help = 'has to be an integer between 0 and';
+ return carp "need exactly 3 positive integer between 0 and 359 or 99 for hsl input" unless @hsl == 3;
+ return carp "hue value $hsl[0] $help 359" unless int $hsl[0] == $hsl[0] and $hsl[0] >= 0 and $hsl[0] < 360;
+ return carp "saturation value $hsl[1] $help 100" unless int $hsl[1] == $hsl[1] and $hsl[1] >= 0 and $hsl[1] < 101;
+ return carp "lightness value $hsl[2] $help 100" unless int $hsl[2] == $hsl[2] and $hsl[2] >= 0 and $hsl[2] < 101;
+ 0;
+}
+
+sub trim_rgb { # cut values into the domain of definition of 0 .. 255
+ my (@rgb) = @_;
+ return (0,0,0) unless @rgb == 3;
+ for (0..2){
+ $rgb[$_] = 0 if $rgb[$_] < 0;
+ $rgb[$_] = 255 if $rgb[$_] > 255;
+ }
+ $rgb[$_] = round($rgb[$_]) for 0..2;
+ @rgb;
+}
+
+sub trim_hsl { # cut values into 0 ..359, 0 .. 100, 0 .. 100
+ my (@hsl) = @_;
+ return (0,0,0) unless @hsl == 3;
+ $hsl[0] += 360 while $hsl[0] < 0;
+ $hsl[0] -= 360 while $hsl[0] >= 360;
+ for (1..2){
+ $hsl[$_] = 0 if $hsl[$_] < 0;
+ $hsl[$_] = 100 if $hsl[$_] > 100;
+ }
+ $hsl[$_] = round($hsl[$_]) for 0..2;
+ @hsl;
+}
+
+sub difference_rgb { # \@rgb, \@rgb --> @rgb distance as vector
+ my ($rgb, $rgb2) = @_;
+ return carp "need two triplets of rgb values in 2 arrays to compute rgb differences"
+ unless ref $rgb eq 'ARRAY' and @$rgb == 3 and ref $rgb2 eq 'ARRAY' and @$rgb2 == 3;
+ check_rgb(@$rgb) and return;
+ check_rgb(@$rgb2) and return;
+ (abs($rgb->[0] - $rgb2->[0]), abs($rgb->[1] - $rgb2->[1]), abs($rgb->[2] - $rgb2->[2]) );
+}
+
+sub difference_hsl { # \@hsl, \@hsl --> $d
+ my ($hsl, $hsl2) = @_;
+ return carp "need two triplets of hsl values in 2 arrays to compute hsl differences"
+ unless ref $hsl eq 'ARRAY' and @$hsl == 3 and ref $hsl2 eq 'ARRAY' and @$hsl2 == 3;
+ check_hsl(@$hsl) and return;
+ check_hsl(@$hsl2) and return;
+ my $delta_h = abs($hsl->[0] - $hsl2->[0]);
+ $delta_h = 360 - $delta_h if $delta_h > 180;
+ ($delta_h, abs($hsl->[1] - $hsl2->[1]), abs($hsl->[2] - $hsl2->[2]) );
+}
+
+sub distance_rgb { # \@rgb, \@rgb --> $d
+ return carp "need two triplets of rgb values in 2 arrays to compute rgb distance " if @_ != 2;
+ my @delta_rgb = difference_rgb( $_[0], $_[1] );
+ return unless @delta_rgb == 3;
+ sqrt($delta_rgb[0] ** 2 + $delta_rgb[1] ** 2 + $delta_rgb[2] ** 2);
+}
+
+sub distance_hsl { # \@hsl, \@hsl --> $d
+ return carp "need two triplets of hsl values in 2 arrays to compute hsl distance " if @_ != 2;
+ my @delta_hsl = difference_hsl( $_[0], $_[1] );
+ return unless @delta_hsl == 3;
+ sqrt($delta_hsl[0] ** 2 + $delta_hsl[1] ** 2 + $delta_hsl[2] ** 2);
+}
+
+sub hsl_from_rgb { # convert color value triplet (int --> int), (real --> real) if $real
+ my (@rgb) = @_;
+ my $real = '';
+ if (ref $rgb[0] eq 'ARRAY'){
+ @rgb = @{$rgb[0]};
+ $real = $rgb[1] // $real;
+ }
+ check_rgb( @rgb ) and return unless $real;
+ my @hsl = _hsl_from_rgb( @rgb );
+ return @hsl if $real;
+ ( round( $hsl[0] ), round( $hsl[1] ), round( $hsl[2] ) );
+}
+
+sub rgb_from_hsl { # convert color value triplet (int > int), (real > real) if $real
+ my (@hsl) = @_;
+ my $real = '';
+ if (ref $hsl[0] eq 'ARRAY'){
+ @hsl = @{$hsl[0]};
+ $real = $hsl[1] // $real;
+ }
+ check_hsl( @hsl ) and return unless $real;
+ my @rgb = _rgb_from_hsl( @hsl );
+ return @rgb if $real;
+ ( round( $rgb[0] ), round( $rgb[1] ), round( $rgb[2] ) );
+}
+
+sub hex_from_rgb { return unless @_ == 3; sprintf "#%02x%02x%02x", @_ }
+sub rgb_from_hex { # translate #000000 and #000 --> r, g, b
+ my $hex = shift;
+ return carp "hex color definition has to start with # followed by 3 or 6 hex characters (0-9,a-f)"
+ unless defined $hex and (length($hex) == 4 or length($hex) == 7) and $hex =~ /^#[\da-f]+$/i;
+ $hex = substr $hex, 1;
+ (length $hex == 3) ? (map { hex($_.$_) } unpack( "a1 a1 a1", $hex))
+ : (map { hex($_ ) } unpack( "a2 a2 a2", $hex));
+}
+
+sub _hsl_from_rgb { # float conversion
+ my (@rgb) = @_;
+ my ($maxi, $mini) = (0 , 1); # index of max and min value in @rgb
+ if ($rgb[1] > $rgb[0]) { ($maxi, $mini ) = ($mini, $maxi ) }
+ if ($rgb[2] > $rgb[$maxi]) { $maxi = 2 }
+ elsif ($rgb[2] < $rgb[$mini]) { $mini = 2 }
+ my $delta = $rgb[$maxi] - $rgb[$mini];
+ my $avg = ($rgb[$maxi] + $rgb[$mini]) / 2;
+ my $H = !$delta ? 0 : (2 * $maxi + (($rgb[($maxi+1) % 3] - $rgb[($maxi+2) % 3]) / $delta)) * 60;
+ $H += 360 if $H < 0;
+ my $S = ($avg == 0) ? 0 : ($avg == 255) ? 0 : $delta / (255 - abs((2 * $avg) - 255));
+ ($H, $S * 100, $avg * 0.392156863 );
+}
+
+sub _rgb_from_hsl { # float conversion
+ my (@hsl) = @_;
+ $hsl[0] /= 60;
+ my $C = $hsl[1] * (100 - abs($hsl[2] * 2 - 100)) * 0.0255;
+ my $X = $C * (1 - abs($hsl[0] % 2 - 1 + ($hsl[0] - int $hsl[0])));
+ my $m = ($hsl[2] * 2.55) - ($C / 2);
+ return ($hsl[0] < 1) ? ($C + $m, $X + $m, $m)
+ : ($hsl[0] < 2) ? ($X + $m, $C + $m, $m)
+ : ($hsl[0] < 3) ? ( $m, $C + $m, $X + $m)
+ : ($hsl[0] < 4) ? ( $m, $X + $m, $C + $m)
+ : ($hsl[0] < 5) ? ($X + $m, $m, $C + $m)
+ : ($C + $m, $m, $X + $m);
+}
+
+my $half = 0.50000000000008;
+
+sub round {
+ $_[0] >= 0 ? int ($_[0] + $half)
+ : int ($_[0] - $half)
+}
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+Chart::Color::Value - check, convert and measure color values
+
+=head1 SYNOPSIS
+
+ my @names = Chart::Color::Value::all_names();
+ my @rgb = Chart::Color::Value::rgb_from_name('darkblue');
+ my @hsl = Chart::Color::Value::hsl_from_name('darkblue');
+ my @hsl2 = Chart::Color::Value::hsl_from_rgb( 5 ,10, 100);
+ my $d = Chart::Color::Value::distance_hsl( \@hsl, \@hsl2);
+
+ Chart::Color::Value::add_rgb('lucky', [0, 100, 50]);
+
+
+=head1 DESCRIPTION
+
+RGB and HSL values of named colors from the X11 and HTML standard
+and Pantone report. Allows also reverse search, storage and conversion
+of color values.
+
+This module is supposed to be used by Chart::Color and not directly
+by the user (for the most part). It converts a stored color name into
+its values (rgb, hsl or both) and back. One color can have multiple names.
+Also nearby (similar) colors can be searched. Own colors can be
+(none permanently) stored for later reference by name. For this a name
+has to be chosen, that is not already taken. Independently of that
+can any color be converted from rgb to hsl and back.
+
+
+=head1 ROUTINES
+
+=head2 check_rgb
+
+Return error message if RGB value triplet is not valid (in range).
+
+=head2 check_hsl
+
+Return error message if HSL value triplet is not valid (in range).
+
+
+=head2 trim_rgb
+
+Change RGB triplet to the nearest valid values.
+
+=head2 trim_hsl
+
+Change HSL triplet to the nearest valid values.
+
+
+=head2 hsl_from_rgb
+
+Converting an rgb value triplet into the corresponding hsl
+
+Red, Green and Blue are integer in 0 .. 255.
+Hue is an integer between 0 .. 359 (hue)
+and saturation and lightness are 0 .. 100 (percentage).
+A hue of 360 and 0 (degree in a cylindrical coordinate system) is
+considered to be the same, this modul deals only with the ladder.
+
+=head2 rgb_from_hsl
+
+Converting an hsl value triplet into the corresponding rgb
+(see rgb_from_name and hsl_from_name). Please not that back and forth
+conversion can lead to drifting results due to rounding.
+
+ my @rgb = Chart::Color::Value::rgb_from_hsl(0, 90, 50);
+ my @rgb = Chart::Color::Value::rgb_from_hsl([0, 90, 50]); # works too
+ # for real (none integer results), any none zero value works as second arg
+ my @rgb = Chart::Color::Value::rgb_from_hsl([0, 90, 50], 'real');
+
+=head2 distance_rgb
+
+Distance in (linear) rgb color space between two coordinates.
+
+
+ my $d = Chart::Color::Value::distance_rgb([1,1,1], [2,2,2]); # approx 1.7
+
+
+=head2 distance_hsl
+
+Distance in (cylindrical) hsl color space between two coordinates.
+
+ my $d = Chart::Color::Value::distance_rgb([1,1,1], [356, 3, 2]); # approx 6
+
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright 2022 Herbert Breunung.
+
+This program is free software; you can redistribute it and/or modify it
+under same terms as Perl itself.
+
+=head1 AUTHOR
+
+Herbert Breunung, <lichtkind@cpan.org>
+
+=cut
diff --git a/lib/Chart/Composite.pm b/lib/Chart/Composite.pm
index 8b68e12..542f92a 100644
--- a/lib/Chart/Composite.pm
+++ b/lib/Chart/Composite.pm
@@ -4,7 +4,7 @@ use v5.12;
package Chart::Composite;
our @ISA = qw(Chart::Base);
-our $VERSION = 2.400.5;
+our $VERSION = 'v2.403.2';
use Chart::Base;
use GD;
@@ -61,8 +61,7 @@ sub set
# had to override it to reassemble the \@data array correctly
#
# @return Reference to an array of the image
-sub imagemap_dump
-{
+sub imagemap_dump {
my $self = shift;
my ( $i, $j );
my @map;
@@ -202,63 +201,26 @@ sub _split_data
$self->{'sub_0'} = ( "Chart::" . $types[0] )->new();
$self->{'sub_1'} = ( "Chart::" . $types[1] )->new();
- # set the options (set the min_val, max_val, brush_size, y_ticks,
- #
- # options intelligently so that the sub-objects don't get
- # confused)
+ # forward options to sub-objects (set the min_val, max_val, brush_size, y_ticks,
+
$self->{'sub_0'}->set( %{ $self->{'opts'} } );
$self->{'sub_1'}->set( %{ $self->{'opts'} } );
- if ( defined( $self->{'opts'}{'min_val1'} ) )
- {
- $self->{'sub_0'}->set( 'min_val' => $self->{'opts'}{'min_val1'} );
- }
- if ( defined( $self->{'opts'}{'max_val1'} ) )
- {
- $self->{'sub_0'}->set( 'max_val' => $self->{'opts'}{'max_val1'} );
- }
- if ( defined( $self->{'opts'}{'min_val2'} ) )
- {
- $self->{'sub_1'}->set( 'min_val' => $self->{'opts'}{'min_val2'} );
- }
- if ( defined( $self->{'opts'}{'max_val2'} ) )
- {
- $self->{'sub_1'}->set( 'max_val' => $self->{'opts'}{'max_val2'} );
- }
- if ( $self->{'opts'}{'y_ticks1'} )
- {
- $self->{'sub_0'}->set( 'y_ticks' => $self->{'opts'}{'y_ticks1'} );
- }
- if ( $self->{'opts'}{'y_ticks2'} )
- {
- $self->{'sub_1'}->set( 'y_ticks' => $self->{'opts'}{'y_ticks2'} );
- }
- if ( $self->{'opts'}{'brush_size1'} )
- {
- $self->{'sub_0'}->set( 'brush_size' => $self->{'opts'}{'brush_size1'} );
- }
- if ( $self->{'opts'}{'brush_size2'} )
- {
- $self->{'sub_1'}->set( 'brush_size' => $self->{'opts'}{'brush_size2'} );
- }
-
- if ( $self->{'opts'}{'brushStyle1'} )
- {
- $self->{'sub_0'}->set( 'brushStyle' => $self->{'opts'}{'brushStyle1'} );
- }
- if ( $self->{'opts'}{'brushStyle2'} )
- {
- $self->{'sub_1'}->set( 'brushStyle' => $self->{'opts'}{'brushStyle2'} );
- }
-
+
+ $self->{'sub_0'}->set( 'min_val' => $self->{'opts'}{'min_val1'} ) if defined $self->{'opts'}{'min_val1'};
+ $self->{'sub_0'}->set( 'max_val' => $self->{'opts'}{'max_val1'} ) if defined $self->{'opts'}{'max_val1'};
+ $self->{'sub_1'}->set( 'min_val' => $self->{'opts'}{'min_val2'} ) if defined $self->{'opts'}{'min_val2'};
+ $self->{'sub_1'}->set( 'max_val' => $self->{'opts'}{'max_val2'} ) if defined $self->{'opts'}{'max_val2'};
+ $self->{'sub_0'}->set( 'y_ticks' => $self->{'opts'}{'y_ticks1'} ) if $self->{'opts'}{'y_ticks1'};
+ $self->{'sub_1'}->set( 'y_ticks' => $self->{'opts'}{'y_ticks2'} ) if $self->{'opts'}{'y_ticks2'};
+ $self->{'sub_0'}->set( 'brush_size' => $self->{'opts'}{'brush_size1'} ) if $self->{'opts'}{'brush_size1'};
+ $self->{'sub_1'}->set( 'brush_size' => $self->{'opts'}{'brush_size2'} ) if $self->{'opts'}{'brush_size2'};
+ $self->{'sub_0'}->set( 'brushStyle' => $self->{'opts'}{'brushStyle1'} ) if $self->{'opts'}{'brushStyle1'};
+ $self->{'sub_0'}->set( 'brushStyle' => $self->{'opts'}{'brushStyle1'} ) if $self->{'opts'}{'brush_style1'};
+ $self->{'sub_1'}->set( 'brushStyle' => $self->{'opts'}{'brushStyle2'} ) if $self->{'opts'}{'brushStyle2'};
+ $self->{'sub_1'}->set( 'brushStyle' => $self->{'opts'}{'brushStyle2'} ) if $self->{'opts'}{'brush_style2'};
# f_y_tick for left and right axis
- if ( defined( $self->{'opts'}{'f_y_tick1'} ) )
- {
- $self->{'sub_0'}->set( 'f_y_tick' => $self->{'opts'}{'f_y_tick1'} );
- }
- if ( defined( $self->{'opts'}{'f_y_tick2'} ) )
- {
- $self->{'sub_1'}->set( 'f_y_tick' => $self->{'opts'}{'f_y_tick2'} );
- }
+ $self->{'sub_0'}->set( 'f_y_tick' => $self->{'opts'}{'f_y_tick1'} ) if defined $self->{'opts'}{'f_y_tick1'};
+ $self->{'sub_1'}->set( 'f_y_tick' => $self->{'opts'}{'f_y_tick2'} ) if defined $self->{'opts'}{'f_y_tick2'};
# replace the gd_obj fields
$self->{'sub_0'}->{'gd_obj'} = $self->{'gd_obj'};
diff --git a/lib/Chart/Constants.pm b/lib/Chart/Constants.pm
index e7085d6..94bb494 100644
--- a/lib/Chart/Constants.pm
+++ b/lib/Chart/Constants.pm
@@ -4,7 +4,7 @@
use v5.12;
package Chart::Constants;
-our $VERSION = 2.400.5;
+our $VERSION = 'v2.403.2';
use constant PI => 4 * atan2( 1, 1 );
diff --git a/lib/Chart/Direction.pm b/lib/Chart/Direction.pm
index c9fde69..73906e8 100644
--- a/lib/Chart/Direction.pm
+++ b/lib/Chart/Direction.pm
@@ -5,7 +5,7 @@ use v5.12;
package Chart::Direction;
our @ISA = qw(Chart::Base);
-our $VERSION = 2.400.5;
+our $VERSION = 'v2.403.2';
use Chart::Base;
use GD;
diff --git a/lib/Chart/ErrorBars.pm b/lib/Chart/ErrorBars.pm
index f0be52a..4293938 100644
--- a/lib/Chart/ErrorBars.pm
+++ b/lib/Chart/ErrorBars.pm
@@ -6,7 +6,7 @@ use v5.12;
package Chart::ErrorBars;
our @ISA = qw(Chart::Base);
-our $VERSION = '2.400.5';
+our $VERSION = 'v2.403.2';
use Chart::Base;
use GD;
diff --git a/lib/Chart/Font.pm b/lib/Chart/Font.pm
new file mode 100644
index 0000000..c705837
--- /dev/null
+++ b/lib/Chart/Font.pm
@@ -0,0 +1,90 @@
+
+#
+
+use v5.12;
+
+package Chart::Font;
+our $VERSION = 'v2.403.2';
+
+use Carp;
+
+## constructor #########################################################
+
+sub new {
+ my $pkg = shift;
+ my $def = shift;
+ return unless ref $def eq 'HASH';
+ bless {};
+}
+
+## getter ##############################################################
+
+sub name {
+
+}
+
+sub bold {
+
+}
+
+sub size {
+
+}
+
+sub unicode {
+}
+
+sub truetype {
+
+}
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+Chart::Font - read only single font holding objects
+
+=head1 SYNOPSIS
+
+ my $red = Chart::Color->new('red');
+ say $red->add('blue')->name; # magenta, mixed in RGB space
+ Chart::Color->new( 0, 0, 255)->hsl # 240, 100, 50 = blue
+ $blue->blend_with({H=> 0, S=> 0, L=> 80}, 0.1);# mix blue with a little grey
+ $red->gradient( '#0000FF', 10); # 10 colors from red to blue
+ $red->complementary( 3 ); # get fitting red green and blue
+
+=head1 DESCRIPTION
+
+
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright 2022 Herbert Breunung.
+
+This program is free software; you can redistribute it and/or modify it
+under same terms as Perl itself.
+
+=head1 AUTHOR
+
+Herbert Breunung, <lichtkind@cpan.org>
+
+=cut
+
+
+__END__
+$im->string( GD::Font->Tiny , 20, 20, 'Tiny', 2);
+$im->string( GD::Font->Small , 20, 50, 'Small', 1);
+$im->string( GD::Font->MediumBold , 20, 80, 'MediumBold', 2);
+$im->string( GD::Font->Large , 20, 110, 'Large', 1);
+$im->string( GD::Font->Giant , 20, 140, 'Giant', 2);
+
+gdTinyFont
+gdSmallFont
+gdMediumBoldFont
+gdLargeFont
+gdGiantFont
diff --git a/lib/Chart/HorizontalBars.pm b/lib/Chart/HorizontalBars.pm
index 1566c40..6913513 100644
--- a/lib/Chart/HorizontalBars.pm
+++ b/lib/Chart/HorizontalBars.pm
@@ -3,7 +3,7 @@ use v5.12;
package Chart::HorizontalBars;
our @ISA = qw(Chart::Base);
-our $VERSION = '2.400.5';
+our $VERSION = 'v2.403.2';
use Chart::Base;
use GD;
diff --git a/lib/Chart/Lines.pm b/lib/Chart/Lines.pm
index 59f19bc..b3b019d 100644
--- a/lib/Chart/Lines.pm
+++ b/lib/Chart/Lines.pm
@@ -5,7 +5,7 @@ use v5.12;
package Chart::Lines;
our @ISA = qw(Chart::Base);
-our $VERSION = 2.400.5;
+our $VERSION = 'v2.403.2';
use Chart::Base;
use GD;
diff --git a/lib/Chart/LinesPoints.pm b/lib/Chart/LinesPoints.pm
index 279077b..a242f44 100644
--- a/lib/Chart/LinesPoints.pm
+++ b/lib/Chart/LinesPoints.pm
@@ -8,7 +8,7 @@ use v5.12;
package Chart::LinesPoints;
our @ISA = qw(Chart::Base);
-our $VERSION = 2.400.5;
+our $VERSION = 'v2.403.2';
use Chart::Base;
use GD;
diff --git a/lib/Chart/Manual.pod b/lib/Chart/Manual.pod
new file mode 100644
index 0000000..b6e4025
--- /dev/null
+++ b/lib/Chart/Manual.pod
@@ -0,0 +1,56 @@
+
+=encoding UTF-8
+
+=head1 NAME
+
+Chart::Manual - Chart user manual
+
+=head1 SYNOPSIS
+
+Chart is a collection of modules for visualizing numerical data.
+Its design goals are feature richness, maximal flexibility, and minimal
+dependencies. It writes PNG and JPG images into files or STDOUT
+(for web usage).
+
+The early API is mostly borrowed from Martien Verbruggen's L<GIFgraph> module.
+
+
+=head1 TYPES
+
+Example programs with output for each chart type: L<Chart::Manual::Types>
+
+
+=head1 WORKFLOWS
+
+Ways to use Chart, broadly described: L<Chart::Manual::Workflows>
+
+
+=head1 METHODS
+
+Descriptions of all methods geared toward the user: L<Chart::Manual::Methods>
+
+
+=head1 PROPERTIES
+
+The method C<set> allows to directly change particular chart properties.
+All of these explained in detail with their acceptable and default values
+are sorted there by name or topic or type:
+
+L<Chart::Manual::Properties>
+
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright 2022 David Bonner, Herbert Breunung.
+
+This program is free software; you can redistribute it and/or modify it
+under same terms as Perl itself.
+
+=head1 AUTHOR
+
+David Bonner, <chartgrp@web.de>
+
+Herbert Breunung, <lichtkind@cpan.org>
+
+
+=cut
diff --git a/lib/Chart/Manual/Methods.pod b/lib/Chart/Manual/Methods.pod
new file mode 100644
index 0000000..c76c824
--- /dev/null
+++ b/lib/Chart/Manual/Methods.pod
@@ -0,0 +1,68 @@
+
+=encoding UTF-8
+
+=head1 NAME
+
+Chart::Manual::Methods - user API descriotion
+
+=head1 OVERVIEW
+
+=head1 SORTED ALPHABETICALLY
+
+
+=head2 add_datafile
+
+=head2 add_dataset
+
+=head2 add_pt
+
+=head2 cgi_jpeg
+
+=head2 cgi_png
+
+=head2 clear_data
+
+=head2 get_data
+
+=head2 imagemap_dump
+
+=head2 jpeg
+
+=head2 new
+
+=head2 png
+
+=head2 scalar_jpeg
+
+=head2 scalar_png
+
+=head2 set
+
+L<Chart::Manual::Properties>
+
+
+=head1 SORTED THEMATICALLY
+
+=head2 Data
+
+=head2 Output
+
+=head2 Properties
+
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright 2022 David Bonner, Herbert Breunung.
+
+This program is free software; you can redistribute it and/or modify it
+under same terms as Perl itself.
+
+=head1 AUTHOR
+
+David Bonner, <chartgrp@web.de>
+
+Herbert Breunung, <lichtkind@cpan.org>
+
+
+
+=cut
diff --git a/lib/Chart/Manual/Properties.pod b/lib/Chart/Manual/Properties.pod
new file mode 100644
index 0000000..18fe787
--- /dev/null
+++ b/lib/Chart/Manual/Properties.pod
@@ -0,0 +1,805 @@
+
+=encoding UTF-8
+
+=head1 NAME
+
+Chart::Manual::Properties - Complete Guide to Chart's changeable Properties
+
+=head1 INTRO
+
+Individual properties of a chart can be changed via method C<set>:
+
+ $chart->set( %properties);
+ $chart->set( key => 'value', ... );
+
+This page documents all viable keys and values for this operation.
+After detailing the data types, all keys are
+
+
+=head1 DATA TYPES
+
+Every key expects values of a certain data type. The more often occurring
+types are sorted, enumerated and decibed in this section.
+
+=head2 boolean
+
+Yes or no decisions you can answer with the perlish C<0> or C<1> as well
+as with C<'true'> or C<'false'>, which might be shortened to C<'f'>, C<'F'>,
+C<'t'> or C<'T'>. C<'none'> as an alias of C<'false'> is also an option.
+
+=head2 code
+
+Anonymous subroutines that usually takes the first argument and returns
+a transformed result:
+
+ sub { $_[0] + 1 }
+
+
+=head2 color
+
+The usual options are:
+
+ names: 'blue'
+ RGB triplets: [0,255,255]
+ HSL hashes: { hue => 240, saturation => 100, lightness => 50 }
+
+Detailed explanation and even more options you find under L<Chart::Color>.
+All names are listed under L<Chart::Color::Constant/NAMES>
+
+=head2 font
+
+There are a handful GD built in font object, than can be referenced:
+
+ GD::Font->Tiny
+ GD::Font->Small
+ GD::Font->MediumBold
+ GD::Font->Large
+ GD::Font->Giant
+
+
+=head2 integer
+
+Whole numbers to set position, size and alike
+
+=head2 positive integer
+
+Integers greater or equal zero.
+
+=head2 string
+
+Text for title, subtitle and labels on axis, tics and legend.
+
+
+=head1 SORTED BY CHART TYPE
+
+Summary of all properties, grouped by chart type where there applicable.
+Sections are named after the Chart type in question, except B<All> and B<NoPie>.
+
+The format is: name, L<type|/"DATA TYPES">, description, default value
+Click on name for a longer explanation.
+
+
+=head2 All
+
+Properties available in all chart types:
+
+L<colors-background|/colors> .. L</color> of whole image background ; C<'white'>
+
+L<colors-datasetx|/colors> ........ L</color> of points/lines/bars of dataset number x = 0..64
+
+L<colors-grid_lines|/colors> ..... L</color> of vertical and horizontal grid lines in the plot background; C<'black'>
+
+L<colors-x_grid_lines|/colors> L</color> of vertical grid lines; C<'black'>
+
+L<colors-y_grid_lines|/colors> L</color> of horizontal grid lines; C<'black'>
+
+L<colors-text|/colors> .............. L</color> of all text ; C<'black'>
+
+L<colors-title|/colors> .............. L</color> of text above the graph ; C<'black'>
+
+L<colors-x_label|/colors> ........ L</color> of x-axis label text; C<'black'>
+
+L<colors-y_label|/colors> ........ L</color> of y-axis (left side) label text; C<'black'>
+
+L<colors-y_label2|/colors> ...... L</color> of y-axis (right side) label text; C<'black'>
+
+L<colors-misc|/colors> ............ L</color> of boxes, ticks, axis and alike; C<'black'>
+
+L</f_x_tick> .................. L</code> that transforms "would have" into actual tick label on left x-axis; C<undef>
+
+L</f_y_tick> .................. L</code> that transforms "would have" into actual tick label on right y-axis; C<undef>
+
+L</graph_border> ..... space between graph and title + legend in pixel; C<10>
+
+L</grey_background> . L<bool|/boolean>: sets plot background to grey; C<'true'>
+
+L</imagemap> ............ L<bool|/boolean>: enable imagemap_dump(); C<'false'>
+
+L</label_font> ............. L</font> of axis labels; GD::Font->MediumBold
+
+L</legend> .................. qw[left right top bottom none]: placement of the legend; C<'right'>
+
+L</legend_font> ..... L</font> of the text in the legend; GD::Font->Small.
+
+L</legend_labels> ... (array ref): labels of colors in legend; C<undef>
+
+L</png_border> ...... L<pos_int|/"positive integer">: space between graph parts and image edge in pixel; C<10>
+
+L</sub_title> .......... L</string>: text below the L</title> in smaller letters; C<''>
+
+L</text_space> ...... L<pos_int|/"positive integer">: extra space around any text; C<2>
+
+L</title> ................... L</string>: text on top of a chart; C<''>
+
+L</title_font> ........ L</font> of the title text; GD::Font->Large
+
+L</transparent> ..... L<bool|/boolean>: full image background transparency; C<'false'>
+
+L</x_label> ............. L</string>: x-axis label text; C<''>
+
+L</y_label> ............. L</string>:label on the standard, left y-axis; C<''>
+
+L</y_label2> .......... L</string>:label on right y-axis, if different; C<''>
+
+
+=head2 NoPie
+
+Properties available in all chart types of kinda xy-plot, not L</Pie>:
+
+L</custom_x_ticks> .. (array ref): [0,3,4] displays 0th, 3rd, and 4th x-tick; C<undef>
+
+L</grid_lines> ...... L<bool|/boolean>: draw vertical and horizontal grid lines; C<'false'>
+
+L</include_zero> .... L<bool|/boolean>: forces y-axis to include zero; C<'false'>
+
+L</integer_ticks_only> L<bool|/boolean>: draw x-axis ticks with label only on whole values; C<'false'>
+
+L</max_val> ......... L<pos_int|/"positive integer">: maximum value on y-axis; C<undef>
+
+L</max_x_ticks> ..... L<pos_int|/"positive integer">: maximum of ticks and labels to draw on x-axis; C<100>
+
+L</max_y_ticks> ..... L<pos_int|/"positive integer">: maximum of ticks and labels to draw on y-axis; C<100>
+
+L</min_val> ......... L<pos_int|/"positive integer">: maximum value on y-axis; C<undef>
+
+L</min_x_ticks> ..... L<pos_int|/"positive integer">: minimum of ticks and labels to draw on x-axis; C<6> (min 2)
+
+L</min_y_ticks> ..... L<pos_int|/"positive integer">: minimum of ticks and labels to draw on y-axis; C<6> (min 2)
+
+L</precision> ....... L<pos_int|/"positive integer">: nr. of numerals after the decimal point in axis labels; C<3>
+
+L</skip_int_ticks> .. L<pos_int|/"positive integer">: draw only n'th tick on whole x-value; C<1> (if L</integer_ticks_only>)
+
+L</skip_x_ticks> .... L<pos_int|/"positive integer">: draw only every n'th tick with label; C<1>
+
+L</sort> ................ L<bool|/boolean>: sort data in ascending order; C<'false'>
+
+L</tick_label_font> . L</font> of tick labels; GD::Font->Small
+
+L</tick_len> ........ L<pos_int|/"positive integer">: length of the x- and y-ticks in pixels; C<4>
+
+L</x_grid_lines> .... L<bool|/boolean>: vertical grid lines matching x ticks; C<'false'>
+
+L</x_ticks> ........... qw[normal staggered vertical]: style of x-axis labels; C<'normal'>
+
+L</xy_plot> .......... L<bool|/boolean>: forces x-y-graph, with numeric x-axis; C<'false'>
+
+L</y_axes> ........... (C<'left'>, C<'right'>, C<'both'>): position of y-axis;C<'left'>
+
+L</y_grid_lines> ..... L<bool|/boolean>: horizontal grid lines matching y ticks; C<'false'>
+
+
+=head2 Bars
+
+This includes Bars StackedBars and HorizontalBars.
+
+L</spaced_bars> .... L<bool|/boolean>: leave space between the groups of bars; C<'true'>
+
+
+=head2 HorizontalBars
+
+L</skip_y_ticks> .... L<pos_int|/"positive integer">: draw every n'th tick with label on y-axis; C<1>
+
+
+=head2 Composite
+
+L</brush_style1> ... brush style of points associated with left y-axis; C<undef>
+
+L</brush_style2> ... brush style of points associated with right y-axis; C<undef>
+
+L</composite_info> .. (array of arrays) which data sets produce which chart types; C<undef>
+
+L</f_y_tick1> ....... L</code> that transforms "would have" into actual label on left y-axis; C<undef>
+
+L</f_y_tick2> ....... L</code> that transforms "would have" into actual label on right y-axis; C<undef>
+
+L</legend_example_size> . Length of the color example line in legend in pixel; C<20>
+
+L</max_val1> ........ L</code> maximum y value on the left axis; C<undef>
+
+L</max_val2> ........ L</code> maximum y value on the right axis; C<undef>
+
+L</min_val1> ........ L</code> minimum y value on the left axis; C<undef>
+
+L</min_val2> ........ L</code> minimum y value on the right axis; C<undef>
+
+L</same_y_axes> ..... L</code> both y-axis have same min and max; C<undef>
+
+L</y_ticks1> ........ L<pos_int|/"positive integer">: number of y ticks on left y-axis; C<undef>
+
+L</y_ticks2> ........ L<pos_int|/"positive integer">: number of y ticks on right y-axis; C<undef>
+
+
+=head2 Direction
+
+L</angle_interval> . L<pos_int|/"positive integer">: angle between radial lines; C<30>
+
+L</arrow> ............ L<bool|/boolean>: paint points as arrows; C<'false'>
+
+L</line> ................ L<bool|/boolean>: connected points with lines; C<'false'>
+
+L</max_circles> .... L<pos_int|/"positive integer">: max nr. of coordinate grid circles; C<100>
+
+L</min_circles> ..... L<pos_int|/"positive integer">: min nr. of coordinate grid circles; C<4> (min. 2)
+
+L</pair> ............... L<bool|/boolean>: use odd numbered data sets to build pairs with the next; C<false>
+
+L</point> ............ L<bool|/boolean>: paint points at all (or only lines); C<false>
+
+L</polar> ............ L<bool|/boolean>: reverse x axis; C<false>
+
+
+=head2 ErrorBars
+
+L</same_error> ....... L<bool|/boolean>: same values for upper and lower error bounds; C<'false'>
+
+
+=head2 Lines
+
+including chart type LinesPoints
+
+L</brush_size> ....... L<pos_int|/"positive integer">: width of the lines in pixels; C<6>
+
+
+=head2 Points
+
+including chart type LinesPoints
+
+L</brushStyle> ........ shape of the points; C<'FilledCircle'>
+
+L</pt_size> ............ L<pos_int|/"positive integer">: radius of points in pixels; C<18>
+
+
+=head2 Pie
+
+L</label_values> ..... qw[percent value both none]: label content on pie slice label; C<'percent'>
+
+L</legend_label_values> . qw[percent value both none]: label content in the legend; C<'value'>
+
+L</legend_lines> .... L<bool|/boolean>: draw lines connecting pie slices and label; C<'false'>
+
+L</ring> ...................... L</real>: percentage of visible radius; C<1> (full pie)
+
+
+=head2 Split
+
+L</interval> .......... L<pos_int|/"positive integer">: interval of a plot segment; C<'undef'>
+
+L</interval_ticks> .. L<pos_int|/"positive integer">: number of ticks on x-axis; C<5>
+
+L</scale> ............... L</integer>: factor for y-values; C<1>
+
+L</start> ............... L</integer>: start value of the first interval; C<'undef'>
+
+
+=head1 SORTED ALPHABETICALLY
+
+=head2 angle_interval
+
+L</Direction> only: how many radial lines should be drawn.
+The default value is 30, which means that a line will be drawn every
+30 degrees. Valid Values are: 0, 5, 10, 15, 20, 30, 45 and 60.
+If you choose 0, direction will draw no line.
+
+=head2 arrow
+
+L</Direction> only: L<Bool|/boolean> that if C<'true'>, chart will draw a
+arrow from the center to the point. Defaults to C<'false'>.
+
+=head2 brush_size
+
+L</Lines> only: Integer sets the width of the lines in pixels. Default is 6.
+
+=head2 background
+
+see L</colors>
+
+=head2 brushStyle
+
+Sets the shape of points for Chart::Points, Chart::LinesPoints.
+
+Possible values are: 'FilledCircle', 'circle', 'donut', 'OpenCircle',
+'fatPlus', 'triangle', 'upsidedownTriangle', 'square', 'hollowSquare',
+'OpenRectangle', 'FilledDiamond', 'OpenDiamond', 'Star', 'OpenStar'.
+Default: 'FilledCircle'
+
+=head2 brush_style1
+
+L</Composite> only: brush style of points associated with left y-axis.
+
+=head2 brush_style2
+
+L</Composite> only: brush style of points associated with right y-axis.
+
+=head2 colors
+
+The key C<colors> is special, because there are a lot of things that
+need to be colored. Thats why its value is a hash with sub - keys within,
+which reflect what exactly you need to color. Their value has to be a L<color>
+(follow link to learn how colors are defined). Example:
+
+ $obj->set('colors' => {'background' => [255,255,255]});
+
+sets the background color to white (which is the default).
+Valid sub-keys are:
+
+ 'background' (background color for the image)
+ 'title' (color of the title)
+ 'text' (all the text in the chart)
+ 'x_label' (color of the x-axis label)
+ 'y_label' (color of the first y axis label)
+ 'y_label2' (color of the second y axis label)
+ 'grid_lines' (color of the grid lines)
+ 'x_grid_lines' (color of the x grid lines - for x axis ticks)
+ 'y_grid_lines' (color of the y grid lines - for to left y axis ticks)
+ 'y2_grid_lines' (color of the y2 grid lines - for right y axis ticks)
+ 'dataset0'..'dataset63' (the different datasets)
+ 'misc' (everything else, ie. axis, ticks, box around the legend)
+
+NB. For composite charts, there is a limit of 8 datasets per component.
+The colors for 'dataset8' through 'dataset15' become the colors
+for 'dataset0' through 'dataset7' for the second component chart.
+
+=head2 composite_info
+
+This option is only used for composite charts. It contains the
+information about which types to use for the two component charts,
+and which datasets belong to which component chart. It should be
+a reference to an array of array references, containing information
+like the following
+
+ $obj->set ('composite_info' => [ ['Bars', [1,2]],
+ ['Lines', [3,4] ] ]);
+
+This example would set the two component charts to be a bar chart and
+a line chart. It would use the first two data sets for the bar
+chart (note that the numbering starts at 1, not zero like most of
+the other numbered things in Chart), and the second two data sets
+for the line chart. The default is undef.
+
+NB. Chart::Composite can only do two component charts.
+
+=head2 custom_x_ticks
+
+Used in points, lines, linespoints, errorbars and bars charts, this option
+allows you to you to specify exactly which x-ticks and x-tick labels should
+be drawn. It should be assigned a reference to an array of desired
+ticks. Just remember that I'm counting from the 0th element of the
+array. (ie., if 'custom_x_ticks' is assigned [0,3,4], then the 0th,
+3rd, and 4th x-ticks will be displayed)
+
+=head2 datasetx
+
+see L</color>
+
+=head2 f_x_tick
+
+Needs a reference to a function which uses the x-tick labels generated by
+the '@data[0]' as the argument. The result of this function can reformat
+the labels. For instance
+
+ $obj -> set ('f_x_tick' => \&formatter );
+
+An example for the function formatter: x labels are seconds since an event.
+The referenced function can transform this seconds to hour, minutes and seconds.
+
+=head2 f_y_tick
+
+The same situation as for 'f_x_tick' but now used for y labels.
+
+=head2 f_y_tick1
+
+L</Composite> only: L</code> ref to a function which has one argument
+and has to return a string which labels the first resp. second y axis.
+Both default to undef.
+
+=head2 f_y_tick2
+
+L</Composite> only: L</code> ref to a function which has one argument
+and has to return a string which labels the first resp. second y axis.
+Both default to undef.
+
+=head2 graph_border
+
+L</Pie> only: Sets the number of pixels used as a border between the
+title/labels and the actual graph within the image. Defaults to 10.
+
+=head2 grey_background
+
+Puts a nice soft grey background on the data plot area when set to 'true'.
+Default is 'true'.
+
+=head2 grid_lines
+
+L<bool|/boolean>: draw grid lines matching up to x and y ticks.
+Default is C<'false'>.
+
+=head2 imagemap
+
+Lets Chart know you're going to ask for information about the placement
+of the data for use in creating an image map from the png. This information
+can be retrieved using the imagemap_dump() method. NB. that the
+imagemap_dump() method cannot be called until after the Chart has been
+generated (ie. using the png() or cgi_png() methods).
+
+=head2 include_zero
+
+If 'true', forces the y-axis to include zero if it is not in the dataset
+range. Default is C<'false'>.
+
+In general, it is better to use this, than to set the 'min_val' if that
+is all you want to achieve.
+
+=head2 integer_ticks_only
+
+L<bool|/boolean> specifies to draw the x- and y-ticks at floating point
+values (as normal) or when set to 'true' only at integer values.
+Default: 'false'
+
+=head2 interval
+
+L</Split> only: Sets the interval of one partition of plot. Defaults 'undef'.
+
+=head2 interval_ticks
+
+L</Split> only: Number of ticks for the x-axis. Defaults to 5.
+
+=head2 label_font
+
+This option changes the L</font> of the axis labels.
+Default is GD::Font->MediumBold.
+
+=head2 label_values
+
+L</Pie> only: What kind of value labels to show alongside the pie.
+Valid values are 'percent', 'value', 'both' and 'none'. Defaults to
+C<'percent'>.
+
+=head2 legend
+
+Specifies the placement of the legend. Valid values are 'left', 'right',
+'top', 'bottom'. Setting this to 'none' tells chart not to draw a
+legend. Default is 'right'.
+
+=head2 legend_example_size
+
+L</Composite> only: Length of the example line in the legend in pixels.
+Defaults to 20.
+
+=head2 legend_font
+
+This option changes the L</font> of the text in the legend.
+Default is GD::Font->Small.
+
+=head2 legend_labels
+
+Array reference containing texts, which are the labels assigned to each
+color in the legend. Amount has to correspond to the amount of data sets.
+
+ @labels = ('foo', 'bar');
+ $obj->set ('legend_labels' => \@labels);
+
+Default is empty, in which case 'Dataset 1', 'Dataset 2', etc. are
+used as the labels.
+
+=head2 legend_label_values
+
+L</Pie> only: What labels to draw in the legend. Valid values are
+'percent', 'value', 'both' and 'none'. Defaults to 'value'.
+
+=head2 legend_lines
+
+L</Pie> only: L<bool|/boolean> to decide if lines connecting pie slices
+and label are drawn. Default is C<'false'>.
+
+=head2 label_values
+
+L</Pie> only: Labels to draw beside the pie slices. Valid values are
+'percent', 'value', 'both' and 'none'. Defaults to 'percent'.
+
+=head2 line
+
+L</Direction> only: If you turn this option to 'true', then point will
+be connected with lines. Defaults to 'false'.
+
+=head2 max_circles
+
+L</Direction> only: Sets the maximum number of circles in the coordinate system.
+Default is 100. This limit is used to avoid plotting an unreasonable
+large number of ticks if non-round values are used for the min_val and max_val.
+
+=head2 max_val
+
+Sets the maximum y-value on the graph, overriding the normal auto-scaling.
+Default is undef.
+
+=head2 max_val1
+
+L</Composite> only: Maximum y-value for the first (left y-axis) components.
+Default to undef.
+
+=head2 max_val2
+
+L</Composite> only: Maximum y-value for the second (right y-axis) components.
+Default to undef.
+
+=head2 max_x_ticks
+
+Work similar as 'max_y_ticks' and 'min_y_ticks'. Of course, only for a
+xy_plot.
+
+=head2 max_y_ticks
+
+Sets the maximum number of y_ticks to draw when generating a scale.
+Default is 100. This limit is used to avoid plotting an unreasonable
+large number of ticks if non-round values are used for the min_val
+and max_val.
+
+The value for 'max_y_ticks' should be at least 5 times larger than
+'min_y_ticks'.
+
+=head2 min_circles
+
+L</Direction> only: Sets the minimum number of circles when generating
+a scale for direction. Default is 4, minimum is 2.
+
+=head2 min_val
+
+Sets the minimum y-value on the graph, overriding the normal auto-scaling.
+Default is undef.
+
+Caution should be used when setting 'max_val' and 'min_val' to floating
+point or non-round numbers. This is because the scale must start & end
+on a tick, ticks must have round-number intervals, and include round
+numbers.
+
+Example: Suppose your data set has a range of 35-114 units. If you specify
+them as the 'min_val' & 'max_val', the y_axis will be plotted with 80 ticks
+every 1 unit.. If no 'min_val' & 'max_val', the system will auto scale the
+range to 30-120 with 10 ticks every 10 units.
+
+If the 'min_val' & 'max_val' are specified to excessive precision, they may
+be overridden by the system, plotting a maximum 'max_y_ticks' ticks.
+
+=head2 min_val1
+
+L</Composite> only: Minimum y-value for the first (left y-axis) component.
+Default to undef.
+
+=head2 min_val2
+
+L</Composite> only: Minimum y-value for the second (right y-axis) component.
+Default to undef.
+
+=head2 min_x_ticks
+
+Work similar as 'max_y_ticks' and 'min_y_ticks'. Of course, only for a
+xy_plot.
+
+=head2 min_y_ticks
+
+Sets the minimum number of y_ticks to draw when generating a scale.
+Default is 6, The minimum is 2.
+
+=head2 no_cache
+
+Adds Pragma: no-cache to the http header while output for CGI.
+Be careful with this one, as Netscape 4.5 is unfriendly with POST
+using this method.
+
+=head2 pairs
+
+L<Direction> only: L<bool|/boolean> if C<'true'>, Chart uses the first
+dataset as a set of degrees and the second dataset as a set of values.
+Then, the third set is a set of degrees and the fourth a set of values ...
+If 'pairs' is set to 'false', Chart uses the first dataset as a set of angels
+and all following datasets as sets of values. Defaults to 'false'.
+
+=head2 png_border
+
+Sets the number of pixels used as a border between the graph
+and the edges of the image. Defaults to 10.
+
+=head2 point
+
+Indicates to draw points in a direction chart. 'true' or 'false' possible.
+Defaults to 'true'.
+
+=head2 polar
+
+L</Direction> only: If set C<true>, the maximum x value is in the center
+of the coordinate system. Defaults to 'false'.
+
+=head2 precision
+
+Sets the number of numerals after the decimal point. Affects in most
+cases the y-axis. But also the x-axis if 'xy_plot' was set and also
+the labels in a pie chart. Defaults to 3.
+
+=head2 pt_size
+
+L</Points> and L</LinesPoints> only: Sets the radius of the points
+in pixels. Default is 18.
+
+=head2 ring
+
+L</Pie> only: sets the "thickness" of the pie, the percentage of
+the radius, which is visible. Defaults to 1 (normal pie chart).
+Good values are between 0.2 and 0.4.
+
+=head2 scale
+
+L</Split> only: Every y-value will be multiplied with that value, but
+the scale won't change. Which means that split allows one to overdraw
+certain rows! Only useful if you want to give prominence to the maximal
+amplitudes of the data. Defaults to 1.
+
+=head2 same_error
+
+L</ErrorBars> only: It tells chart that you want use the same
+error value of a data point if set to 'true'. Look at the documentation
+to see how the module ErrorBars works. Default: 'false'.
+
+=head2 same_y_axes
+
+L</Composite> only: Forces both component charts to use the same maximum
+and minimum y-values if set to 'true'. This helps to keep the composite
+charts from being too confusing. Default is undef.
+
+=head2 skip_int_ticks
+
+If 'true' the labels and ticks will be drawn every nth tick. Of course
+in horizontalBars it affects the x-axis. Default to 1, no skipping.
+
+=head2 skip_x_ticks
+
+Sets the number of x-ticks and x-tick labels to skip. (ie.
+if 'skip_x_ticks' was set to 4, Chart would draw every 4th x-tick
+and x-tick label). Default is undef.
+
+=head2 skip_y_ticks
+
+L</HorizontalBars> only: Draw only every n'th tick with label on y-axis.
+does for other charts. Defaults to 1 (draw all).
+
+=head2 sort
+
+In a xy-plot, the data will be sorted ascending if set to 'true'.
+(Should be set if the data isn't sorted, especially in Lines, Split
+and LinesPoints) In a Pareto Chart the data will be sorted descending.
+Defaults to 'false'.
+
+=head2 spaced_bars
+
+L</Bars> only: Leaves space between the groups of bars at each data point
+when set to 'true'. This just makes it easier to read a bar chart.
+Default is 'true'.
+
+=head2 start
+
+L</Split> only: Sets the start value of the first interval.
+If the x coordinate of the first data point is zero, you should 'set' to
+zero. Default is 'undef'.
+
+=head2 sub_title
+
+Write a sub-title under the L</title> in smaller letters.
+Default is empty.
+
+=head2 text_space
+
+Sets the amount of space left on the sides (lext and right) of text,
+(title, legend, label) to make it more readable. Defaults to 2.
+
+=head2 tick_label_font
+
+This is the font for the tick labels. It also needs
+a GD font object as an argument. Default is GD::Font->Small.
+
+=head2 tick_len
+
+Sets the length of the x- and y-ticks in pixels. Default is 4.
+
+=head2 title
+
+Content of title text. If empty, no title is drawn.
+It recognizes '\n' as a newline, and acts accordingly.
+Remember, if you want to use normal quotation marks instead of single
+quotation marks then you have to quote "\\n". Default is empty.
+
+=head2 title_font
+
+This option changes the L</font> of the title. Default is GD::Font->Large.
+
+=head2 transparent
+
+Makes the background of the whole image transparent if set to 'true'.
+Useful for making web page images. Default is C<'false'>.
+
+=head2 x_grid_lines
+
+Draws vertical grid lines matching up to x ticks if set to 'true'. Default is false.
+
+=head2 x_label
+
+Tells Chart what to use for the x-axis label. If empty, no label
+is drawn. Default is empty.
+
+=head2 x_ticks
+
+Specifies how to draw the x-tick labels. Valid values are 1: 'normal',
+2: 'staggered' (alternating on upper and lower row - for very long labels),
+and 3: 'vertical' (the labels are draw upwards in right angle).
+Default is 'normal'.
+
+=head2 xy_plot
+
+Forces Chart to plot a x-y-graph, which means, that the x-axis is also
+numeric if set to 'true'. Very useful for mathematical graphs.
+Works for Lines, Points, LinesPoints and ErrorBars. Split makes always a
+xy_plot. Defaults to 'false'.
+
+=head2 y_label
+
+Tells Chart what to use for labels on the standard, left y-axis.
+If empty, no label is drawn. Default is empty.
+
+=head2 y_label2
+
+Text of the label on the second, right y-axis (if different from left).
+If empty, no label is drawn. Default is empty.
+
+=head2 y_axes
+
+Tells Chart where to place the y-axis. Has no effect on Composite and Pie.
+Valid values are 'left', 'right' and 'both'. Defaults to 'left'.
+
+=head2 y_grid_lines
+
+Draws horizontal grid lines matching up to y ticks if set to 'true'. Default is false.
+
+=head2 y_ticks1
+
+L<Composite> only: number of y ticks to use on the first and
+second y-axis (y_ticks2). Please note that if you just set the 'y_ticks'
+option, both axes will use that number of y ticks. Both default to undef.
+
+=head2 y_ticks2
+
+see L</y_ticks1>
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright 2022 David Bonner, Herbert Breunung.
+
+This program is free software; you can redistribute it and/or modify it
+under same terms as Perl itself.
+
+=head1 AUTHOR
+
+David Bonner, <chartgrp@web.de>
+
+Herbert Breunung, <lichtkind@cpan.org>
+
+
+=cut
diff --git a/lib/Chart/Manual/Types.pod b/lib/Chart/Manual/Types.pod
new file mode 100644
index 0000000..aa72693
--- /dev/null
+++ b/lib/Chart/Manual/Types.pod
@@ -0,0 +1,251 @@
+
+=encoding UTF-8
+
+=head1 NAME
+
+Chart::Manual::Types - document all supported chart types
+
+=head1 OVERVIEW
+
+This page illustrates all supported chart types, describes their
+special abilities and programming needs. More detailled information will
+be linked whenever available.
+
+Generally, each chart type here is implementd by a class: Chart::* (name),
+which inherits most of its methods from Chart::Base.
+
+Currently available are xycharts with points, lines, mountains,
+bar charts, stacked bars, error bars, pie and ring charts with split and
+polar coordinate systems. Also composite charts are possible.
+
+
+=head2 Bars
+
+=for HTML <p>
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/test/manual/bars.png" alt="dual bar chart">
+</p>
+
+The class Chart::Bars creates a chart made up of a series of vertical bars.
+The length of each bar depicts one value of your second data set.
+The first data set however, defines the domain. In this example the first
+value of the first (domain) data set is 'camel'. So the first value of
+the second set (30000) is positioned after the first tick on the x-axis
+labeled 'camel'. Right beside it is a differently colored first value
+of the third data set (80000). Since the option L<spaced_bars|Chart::Manual::Properties/spaced_bars>
+is set to C<'true'> on default both bars are not crammed together.
+In this example it also makes also sense to activate the horizontal
+L<y_grid line|Chart::Manual::Properties/y_grid line>s and give them
+a subtle color. Further important was it to set the property L<min_val|Chart::Manual::Properties/min_val>
+to zero, so that the bars could be seen in full length and not from
+the min value of the data sets (30000) on upwards. L<precision|Chart::Manual::Properties/precision>
+set to zero just drops the decimals on the tick label so the chart looks
+a little cleaner.
+
+ use Chart::Bars;
+
+ my $g = Chart::Bars->new( 600, 600 );
+ $g->add_dataset( qw/ camel cat dog bear shell/ );
+ $g->add_dataset( 30000, 40000, 80000, 50000, 90000 );
+ $g->add_dataset( 80000, 60000, 30000, 30000, 40000 );
+ $g->set(
+ title => 'Bars !',
+ x_label => 'Group',
+ y_label => 'Value',
+ y_grid_lines => 'true',
+ colors => {
+ y_grid_lines => [180, 180, 180],
+ },
+ min_val => 0,
+ precision => 0,
+ # spaced_bars => 'false',
+ );
+ $g->png("bars.png");
+
+
+=head2 Composite
+
+The class Chart::Composite creates a two component chart with two
+types of charts which are layered one above each other. Just set
+the option composite info. For example, you can create a two
+component chart with bars and lines. A composite chart does not
+make sense with all combinations of chart types, but it works pretty
+good with Lines, Points, LinesPoints and Bars. Note that two similar
+chart types may come into visual conflict. Chart::Composite can do
+only composite charts made up of two components.
+
+=for HTML <p>
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/test/samples/composite_f.png" alt="composite chart">
+</p>
+
+
+=head2 Direction
+
+The class Chart::Direction creates a diagram based on polar coordi-
+nates. This type of diagram is occasionally referred to as a radial or
+as a radar chart. Chart::Direction plots data specified by angle (e. g.,
+wind direction) and absolute value (e. g., wind strength). The first
+dataset to add is always the set of angles in degrees. The second
+set contains the absolute values. How additional datasets should
+be entered depends on the option pairs (cf. below). By default,
+Chart::Direction will draw a point chart. You can also get a lines
+chart by setting the option point to 'false' and the option line to
+'true'. If you want a lines and point chart, then set both point and
+line to 'true'. In addition, Chart::Direction plots arrows from the
+center to the point or to the end of the line if the option arrow is
+set to 'true'.
+
+=for HTML <p>
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/test/samples/direction_4.png" alt="polar chart">
+</p>
+
+
+
+
+=head2 ErrorBars
+
+The class Chart::ErrorBars creates a point chart with error bars. This
+class expects the error values within the data array. By use of the
+add dataset() method the error values are the next two sets after
+the y values. The first set after the y values has to be the set of values
+for the upper error bounds. The next set is the array of the lower
+error bounds. Note that the error values are not specified absolutely
+but rather as offsets from the y value: the upper error values will be
+added to the y values, the lower error values will be subtracted.
+If you want to use the same value for the upper and lower error, you
+can set the same error option to 'true'. In this case only the set
+after the y values is interpreted as a set of errors.
+Of course, it is also possible to use the add pt() method in the
+appropriate way to achieve the same results.
+
+=for HTML <p>
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/test/samples/error_1.png" alt="error bar chart">
+</p>
+
+
+=head2 HorizontalBars
+
+The class Chart::HorizontalBars creates a chart of horizontally ori-
+ented bars.
+
+=for HTML <p>
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/test/samples/hbars_2.png" alt="horizontal bar chart">
+</p>
+
+=head2 Lines
+
+The class Chart::Lines creates a lines chart. (If you want the data
+points marked with symbols, check Chart::LinesPoints on page 35.)
+
+
+=for HTML <p>
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/test/samples/lines_4.png" alt="line chart">
+</p>
+
+
+=head2 LinesPoints
+
+The class Chart::LinesPoints creates a lines chart where addition-
+ally the individual data points are marked with a symbol. (If you
+want just lines without additional symbols, check Chart::Lines on
+page 32. If you want just symbols for the data points but no lines,
+check Chart::Points on page 47.)
+
+
+=for HTML <p>
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/test/samples/linespoints_3.png" alt="line point chart">
+</p>
+
+
+=head2 Mountain
+
+The class Chart::Mountain creates a mountain chart, i. e., the individ-
+ual data sets are stacked and the areas under the curves are colour
+filled. The first data set will be shown at the top of the stack, the
+last at the bottom.
+
+=for HTML <p>
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/test/samples/mountain-2.png" alt="mountain chart">
+</p>
+
+
+=head2 Pareto
+
+The class Chart::Pareto creates a Pareto chart, i. e., a set of absolute
+values overlaid with a line chart of the accumulated values. (This
+latter curve is also known as an empirical cumulative distribution
+function or as a Lorenz curve.) This representation usually makes
+sense only if the values are sorted (either in ascending or in de-
+scending order). Chart::Pareto plots only one data set and its labels.
+
+
+=for HTML <p>
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/test/samples/pareto_1.png" alt="pareto chart">
+</p>
+
+
+=head2 Pie
+
+The class Chart::Pie creates a pie chart. The first added set must
+contain the labels, the second set the values.
+
+=for HTML <p>
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/test/samples/pie_8.png" alt="pie chart">
+</p>
+
+
+=head2 Points
+
+The class Chart::Points creates a point chart (also called scatter-
+gram) where the individual data points are marked with a symbol.
+(If you want lines in addition, check Chart::LinesPoints on page 35.)
+
+=for HTML <p>
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/test/samples/points.png" alt="point chart">
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/test/samples/points_5.png" alt="point chart">
+</p>
+
+
+=head2 Split
+
+The class Chart::Split creates a lines chart where both x and y axes
+are assumed to be numeric. Split charts are mainly intended for cases
+where many data points are spread over a wide x range while at the
+same time the y range is limited. Typical examples are weather or
+seismic data. The x axis will be split into several intervals of the
+same length (specified with the mandatory option interval). The
+intervals will be displayed in a stacked fashion. The start of the
+top interval is set with the mandatory option start. Chart::Split will
+draw only positive x coordinates. The y axis will not be labelled with
+the y values. Rather, the axis will show only the sequence numbers
+of the intervals.
+
+=for HTML <p>
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/test/samples/split_2.png" alt="multi chart">
+</p>
+
+
+=head2 StackedBars
+
+The class Chart::StackedBars creates a chart made up of stacked ver-
+tical bars. The first data set will be shown at the bottom of the stack,
+the last at the top. Chart::StackedBars is a subclass of Chart::Base.
+
+=for HTML <p>
+<img src="https://raw.githubusercontent.com/lichtkind/Chart/main/dev/test/samples/stackedbars.png" alt="stacked bars chart">
+</p>
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright 2022 David Bonner, Herbert Breunung.
+
+This program is free software; you can redistribute it and/or modify it
+under same terms as Perl itself.
+
+=head1 AUTHOR
+
+David Bonner, <chartgrp@web.de>
+
+Herbert Breunung, <lichtkind@cpan.org>
+
+
+=cut
diff --git a/lib/Chart/Manual/Workflows.pod b/lib/Chart/Manual/Workflows.pod
new file mode 100644
index 0000000..258d66f
--- /dev/null
+++ b/lib/Chart/Manual/Workflows.pod
@@ -0,0 +1,25 @@
+
+=encoding UTF-8
+
+=head1 NAME
+
+Chart::Manual::Workflows - document the ways to create charts
+
+=head1 OVERVIEW
+
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright 2022 David Bonner, Herbert Breunung.
+
+This program is free software; you can redistribute it and/or modify it
+under same terms as Perl itself.
+
+=head1 AUTHOR
+
+David Bonner, <chartgrp@web.de>
+
+Herbert Breunung, <lichtkind@cpan.org>
+
+
+=cut
diff --git a/lib/Chart/Mountain.pm b/lib/Chart/Mountain.pm
index 8be6a61..b4154e4 100644
--- a/lib/Chart/Mountain.pm
+++ b/lib/Chart/Mountain.pm
@@ -24,7 +24,7 @@ use v5.12;
package Chart::Mountain;
our @ISA = qw(Chart::Base);
-our $VERSION = 2.400.5;
+our $VERSION = 'v2.403.2';
use Chart::Base;
use GD;
diff --git a/lib/Chart/Pareto.pm b/lib/Chart/Pareto.pm
index b95d30d..35bf0a3 100644
--- a/lib/Chart/Pareto.pm
+++ b/lib/Chart/Pareto.pm
@@ -2,7 +2,7 @@ use v5.12;
package Chart::Pareto;
our @ISA = qw(Chart::Base);
-our $VERSION = 2.400.5;
+our $VERSION = 'v2.403.2';
use Chart::Base;
use GD;
diff --git a/lib/Chart/Pie.pm b/lib/Chart/Pie.pm
index 06008c7..08a4e37 100644
--- a/lib/Chart/Pie.pm
+++ b/lib/Chart/Pie.pm
@@ -5,7 +5,7 @@ use v5.12;
package Chart::Pie;
our @ISA = qw(Chart::Base);
-our $VERSION = '2.400.5';
+our $VERSION = 'v2.403.2';
use Carp;
use GD;
@@ -167,7 +167,6 @@ sub _draw_data
# into account the angles where the labels will be plotted
my $labeldistance = 2 * $self->maximum( $fontW, $fontH );
-
$start_degrees = 0;
$end_degrees = 0;
my $max_radius = $self->minimum( $width, $height ) / 2;
@@ -354,7 +353,6 @@ sub _draw_data
}
$diameter = $radius * 2 - 2 * $labeldistance;
-
$text_diameter = $diameter + $labeldistance;
$self->{'gd_obj'}->arc( $centerX, $centerY, $diameter, $diameter, 0, 360, $misccolor );
@@ -866,6 +864,7 @@ sub _draw_bottom_legend
my $l2 = 0;
my ( $dataset_sum, $j );
my $label;
+ my $text_color = $self->_color_role_to_index( 'text' );
# make sure we're using a real font
unless ( ( ref($font) ) eq 'GD::Font' )
@@ -969,7 +968,7 @@ sub _draw_bottom_legend
$x2 -= $self->{'legend_space'};
$y1 += $self->{'legend_space'} + $self->{'text_space'};
$y2 -= $self->{'legend_space'} + $self->{'text_space'};
-
+
# draw in the actual legend
for $r ( 0 .. $rows - 1 )
{
@@ -1004,7 +1003,7 @@ sub _draw_bottom_legend
# now draw the label
if ( $self->{'legend_label_values'} =~ /^value$/i )
{
- $self->{'gd_obj'}->string( $font, $x, $y, $labels[$index] . ' ' . $data->[1][$index], $color );
+ $self->{'gd_obj'}->string( $font, $x, $y, $labels[$index] . ' ' . $data->[1][$index], $text_color );
#$self->{'gd_obj'}->stringTTF($color, FONT, 10, 0, $x, $y+10, $labels[$index].' '.$data->[1][$index]); ############
}
@@ -1029,13 +1028,13 @@ sub _draw_bottom_legend
$data->[1][$index] / ( $dataset_sum || 1 ) * 100,
$data->[1][$index] );
}
- $self->{'gd_obj'}->string( $font, $x, $y, $label, $color ); ###
+ $self->{'gd_obj'}->string( $font, $x, $y, $label, $text_color ); ###
# $self->{'gd_obj'}->stringTTF($color, FONT, 10, 0, $x, $y, $label);
}
else
{
- $self->{'gd_obj'}->string( $font, $x, $y, $labels[$index], $color );
+ $self->{'gd_obj'}->string( $font, $x, $y, $labels[$index], $text_color );
}
}
}
diff --git a/lib/Chart/Points.pm b/lib/Chart/Points.pm
index cddc5fe..ab4cd34 100644
--- a/lib/Chart/Points.pm
+++ b/lib/Chart/Points.pm
@@ -5,7 +5,7 @@ use v5.12;
package Chart::Points;
our @ISA = qw(Chart::Base);
-our $VERSION = '2.400.5';
+our $VERSION = 'v2.403.2';
use Carp;
use GD;
diff --git a/lib/Chart/Property.pm b/lib/Chart/Property.pm
new file mode 100644
index 0000000..39edee0
--- /dev/null
+++ b/lib/Chart/Property.pm
@@ -0,0 +1,34 @@
+
+#
+
+use v5.12;
+
+package Chart::Property;
+our $VERSION = 'v2.403.2';
+
+use Carp;
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+Chart::Property - managing properties of a chart
+
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright 2022 Herbert Breunung.
+
+This program is free software; you can redistribute it and/or modify it
+under same terms as Perl itself.
+
+=head1 AUTHOR
+
+Herbert Breunung, <lichtkind@cpan.org>
+
+=cut
+
diff --git a/lib/Chart/Split.pm b/lib/Chart/Split.pm
index f13f940..4de0c30 100644
--- a/lib/Chart/Split.pm
+++ b/lib/Chart/Split.pm
@@ -18,7 +18,7 @@ use v5.12;
package Chart::Split;
our @ISA = qw(Chart::Base);
-our $VERSION = '2.400.5';
+our $VERSION = 'v2.403.2';
use Chart::Base;
use GD;
diff --git a/lib/Chart/StackedBars.pm b/lib/Chart/StackedBars.pm
index eee6eb3..bf66981 100644
--- a/lib/Chart/StackedBars.pm
+++ b/lib/Chart/StackedBars.pm
@@ -2,7 +2,7 @@ use v5.12;
package Chart::StackedBars;
our @ISA = qw(Chart::Base);
-our $VERSION = 2.400.5;
+our $VERSION = 'v2.403.2';
use Chart::Base;
use GD;
@@ -247,7 +247,7 @@ sub _find_y_range
# if ($self->{'integer_ticks_only'} =~ /^true$/i && ! $self->{'y_tick_labels'}) {
# unless (($range % $y_ticks) == 0) {
# while (($range % $y_ticks) != 0) {
-# $y_ticks++;
+# $y_ticks++;
# }
# $self->{'y_ticks'} = $y_ticks + 1;
# }
diff --git a/t/001_color_value.t b/t/001_color_value.t
new file mode 100644
index 0000000..273b104
--- /dev/null
+++ b/t/001_color_value.t
@@ -0,0 +1,169 @@
+#!/usr/bin/perl
+
+use v5.12;
+use warnings;
+use Test::More tests => 108;
+use Test::Warn;
+
+BEGIN { unshift @INC, 'lib', '../lib'}
+my $module = 'Chart::Color::Value';
+
+eval "use $module";
+is( not($@), 1, 'could load the module');
+
+my $chk_rgb = \&Chart::Color::Value::check_rgb;
+my $chk_hsl = \&Chart::Color::Value::check_hsl;
+my $tr_rgb = \&Chart::Color::Value::trim_rgb;
+my $tr_hsl = \&Chart::Color::Value::trim_hsl;
+my $d_rgb = \&Chart::Color::Value::distance_rgb;
+my $d_hsl = \&Chart::Color::Value::distance_hsl;
+my $rgb2h = \&Chart::Color::Value::hex_from_rgb;
+
+
+ok( !$chk_rgb->(0,0,0), 'check rgb values works on lower bound values');
+ok( !$chk_rgb->(255,255,255), 'check rgb values works on upper bound values');
+warning_like {$chk_rgb->(0,0)} {carped => qr/exactly 3/}, "check rgb got too few values";
+warning_like {$chk_rgb->(0,0,0,0)} {carped => qr/exactly 3/}, "check rgb got too many values";
+warning_like {$chk_rgb->(-1, 0,0)} {carped => qr/red value/}, "red value is too small";
+warning_like {$chk_rgb->(0.5, 0,0)} {carped => qr/red value/}, "red value is not integer";
+warning_like {$chk_rgb->(256, 0,0)} {carped => qr/red value/}, "red value is too big";
+warning_like {$chk_rgb->(0, -1, 0)} {carped => qr/green value/}, "green value is too small";
+warning_like {$chk_rgb->(0, 0.5, 0)} {carped => qr/green value/}, "green value is not integer";
+warning_like {$chk_rgb->(0, 256,0)} {carped => qr/green value/}, "green value is too big";
+warning_like {$chk_rgb->(0,0, -1 )} {carped => qr/blue value/}, "blue value is too small";
+warning_like {$chk_rgb->(0,0, 0.5 )} {carped => qr/blue value/}, "blue value is not integer";
+warning_like {$chk_rgb->(0,0, 256)} {carped => qr/blue value/}, "blue value is too big";
+
+ok( !$chk_hsl->(0,0,0), 'check hsl values works on lower bound values');
+ok( !$chk_hsl->(359,100,100), 'check hsl values works on upper bound values');
+warning_like {$chk_hsl->(0,0)} {carped => qr/exactly 3/}, "check rgb got too few values";
+warning_like {$chk_hsl->(0,0,0,0)} {carped => qr/exactly 3/}, "check rgb got too many values";
+warning_like {$chk_hsl->(-1, 0,0)} {carped => qr/hue value/}, "hue value is too small";
+warning_like {$chk_hsl->(0.5, 0,0)} {carped => qr/hue value/}, "hue value is not integer";
+warning_like {$chk_hsl->(360, 0,0)} {carped => qr/hue value/}, "hue value is too big";
+warning_like {$chk_hsl->(0, -1, 0)} {carped => qr/saturation value/}, "saturation value is too small";
+warning_like {$chk_hsl->(0, 0.5, 0)} {carped => qr/saturation value/}, "saturation value is not integer";
+warning_like {$chk_hsl->(0, 101,0)} {carped => qr/saturation value/}, "saturation value is too big";
+warning_like {$chk_hsl->(0,0, -1 )} {carped => qr/lightness value/}, "lightness value is too small";
+warning_like {$chk_hsl->(0,0, 0.5 )} {carped => qr/lightness value/}, "lightness value is not integer";
+warning_like {$chk_hsl->(0,0, 101)} {carped => qr/lightness value/}, "lightness value is too big";
+
+
+
+my @rgb = $tr_rgb->();
+is( int @rgb, 3, 'default color is set');
+is( $rgb[0], 0, 'default color is black (R) no args');
+is( $rgb[1], 0, 'default color is black (G) no args');
+is( $rgb[2], 0, 'default color is black (B) no args');
+@rgb = $tr_rgb->(1,2);
+is( $rgb[0], 0, 'default color is black (R) too few args');
+is( $rgb[1], 0, 'default color is black (G) too few args');
+is( $rgb[2], 0, 'default color is black (B) too few args');
+@rgb = $tr_rgb->(1,2,3,4);
+is( $rgb[0], 0, 'default color is black (R) too many args');
+is( $rgb[1], 0, 'default color is black (G) too many args');
+is( $rgb[2], 0, 'default color is black (B) too many args');
+@rgb = $tr_rgb->(-1,-1,-1);
+is( int @rgb, 3, 'color is trimmed up');
+is( $rgb[0], 0, 'too low red value is trimmed up');
+is( $rgb[1], 0, 'too low green value is trimmed up');
+is( $rgb[2], 0, 'too low blue value is trimmed up');
+@rgb = $tr_rgb->(256, 256, 256);
+is( int @rgb, 3, 'color is trimmed up');
+is( $rgb[0], 255, 'too high red value is trimmed down');
+is( $rgb[1], 255, 'too high green value is trimmed down');
+is( $rgb[2], 255, 'too high blue value is trimmed down');
+
+my @hsl = $tr_hsl->();
+is( int @hsl, 3, 'default color is set');
+is( $hsl[0], 0, 'default color is black (H) no args');
+is( $hsl[1], 0, 'default color is black (S) no args');
+is( $hsl[2], 0, 'default color is black (L) no args');
+@hsl = $tr_hsl->(1,2);
+is( $hsl[0], 0, 'default color is black (H) too few args');
+is( $hsl[1], 0, 'default color is black (S) too few args');
+is( $hsl[2], 0, 'default color is black (L) too few args');
+@hsl = $tr_hsl->(1,2,3,4);
+is( $hsl[0], 0, 'default color is black (H) too many args');
+is( $hsl[1], 0, 'default color is black (S) too many args');
+is( $hsl[2], 0, 'default color is black (L) too many args');;
+@hsl = $tr_hsl->(-1,-1,-1);
+is( int @rgb, 3, 'color is trimmed up');
+is( $hsl[0], 359, 'too low hue value is rotated up');
+is( $hsl[1], 0, 'too low green value is trimmed up');
+is( $hsl[2], 0, 'too low blue value is trimmed up');
+@hsl = $tr_hsl->(360, 101, 101);
+is( int @rgb, 3, 'color is trimmed up');
+is( $hsl[0], 0, 'too high hue value is rotated down');
+is( $hsl[1], 100, 'too high saturation value is trimmed down');
+is( $hsl[2], 100, 'too high lightness value is trimmed down');
+
+
+warning_like {Chart::Color::Value::hsl_from_rgb(1,1,1,1)} {carped => qr/3 positive integer/},
+ "need 3 values rgb to convert color from rgb to hsl";
+warning_like {Chart::Color::Value::hsl_from_rgb(1,1)} {carped => qr/3 positive integer/},
+ "need 3 values rgb to convert color from rgb to hsl";
+warning_like {Chart::Color::Value::hsl_from_rgb(1,1,-1)} {carped => qr/blue value/},
+ "blue value is too small for conversion";
+warning_like {Chart::Color::Value::hsl_from_rgb(256,1,0)} {carped => qr/red value/},
+ "red value is too large for conversion";
+warning_like {Chart::Color::Value::rgb_from_hsl(1,1)} {carped => qr/3 positive integer/},
+ "need 3 values rgb to convert color from rgb to hsl";
+
+@hsl = Chart::Color::Value::hsl_from_rgb(127, 127, 127);
+is( int @hsl, 3, 'converted color grey has hsl values');
+is( $hsl[0], 0, 'converted color grey has computed right hue value');
+is( $hsl[1], 0, 'converted color grey has computed right saturation');
+is( $hsl[2], 50, 'converted color grey has computed right lightness');
+
+@rgb = Chart::Color::Value::rgb_from_hsl(0, 0, 50);
+is( int @rgb, 3, 'converted back color grey has rgb values');
+is( $rgb[0], 128, 'converted back color grey has right red value');
+is( $rgb[1], 128, 'converted back color grey has right green value');
+is( $rgb[2], 128, 'converted back color grey has right blue value');
+
+warning_like {$d_rgb->()} {carped => qr/two triplets/},"can't get distance without rgb values";
+warning_like {$d_rgb->( [1,1,1],[1,1,1],[1,1,1])} {carped => qr/two triplets/},'too many array arg';
+warning_like {$d_rgb->( [1,2],[1,2,3])} {carped => qr/two triplets/},'first color is missing a value';
+warning_like {$d_rgb->( [1,2,3],[2,3])} {carped => qr/two triplets/},'second color is missing a value';
+warning_like {$d_rgb->( [-1,2,3],[1,2,3])} {carped => qr/red value/}, 'first red value is too small';
+warning_like {$d_rgb->( [1,2,3],[2,256,3])} {carped => qr/green value/}, 'second green value is too large';
+warning_like {$d_rgb->( [1,2,-3],[2,25,3])} {carped => qr/blue value/}, 'first blue value is too large';
+warning_like {$d_hsl->( []) } {carped => qr/two triplets/},"can't get distance without hsl values";
+warning_like {$d_hsl->( [1,1,1],[1,1,1],[1,1,1])} {carped => qr/two triplets/},'too many array arg';
+warning_like {$d_hsl->( [1,2],[1,2,3])} {carped => qr/two triplets/},'first color is missing a value';
+warning_like {$d_hsl->( [1,2,3],[2,3])} {carped => qr/two triplets/},'second color is missing a value';
+warning_like {$d_hsl->( [-1,2,3],[1,2,3])} {carped => qr/hue value/}, 'first hue value is too small';
+warning_like {$d_hsl->( [1,2,3],[360,2,3])} {carped => qr/hue value/}, 'second hue value is too large';
+warning_like {$d_hsl->( [1,-1,3],[2,10,3])} {carped => qr/saturation value/},'first saturation value is too small';
+warning_like {$d_hsl->( [1,2,3],[2,101,3])} {carped => qr/saturation value/},'second saturation value is too large';
+warning_like {$d_hsl->( [1,1,-1],[2,10,3])} {carped => qr/lightness value/}, 'first lightness value is too small';
+warning_like {$d_hsl->( [1,2,3],[2,1,101])} {carped => qr/lightness value/}, 'second lightness value is too large';
+
+is( Chart::Color::Value::distance_rgb([1, 2, 3], [ 2, 6, 11]), 9, 'compute rgb distance');
+is( Chart::Color::Value::distance_hsl([1, 2, 3], [ 2, 6, 11]), 9, 'compute hsl distance');
+is( Chart::Color::Value::distance_hsl([0, 2, 3], [359, 6, 11]), 9, 'compute hsl distance (test circular property of hsl)');
+
+
+is( $rgb2h->(0,0,0), '#000000', 'converted black from rgb to hex');
+is( uc $rgb2h->(255,255,255), '#FFFFFF', 'converted white from rgb to hex');
+is( uc $rgb2h->( 10, 20, 30), '#0A141E', 'converted random color from rgb to hex');
+
+@rgb = Chart::Color::Value::rgb_from_hex('#000000');
+is( $rgb[0], 0, 'converted black from hex to RGB red is correct');
+is( $rgb[1], 0, 'converted black from hex to RGB green is correct');
+is( $rgb[2], 0, 'converted black from hex to RGB blue is correct');
+
+@rgb = Chart::Color::Value::rgb_from_hex('#FFF');
+is( $rgb[0], 255, 'converted white (short form) from hex to RGB red is correct');
+is( $rgb[1], 255, 'converted white (short form) from hex to RGB green is correct');
+is( $rgb[2], 255, 'converted white (short form) from hex to RGB blue is correct');
+
+@rgb = Chart::Color::Value::rgb_from_hex('#0a141e');
+is( $rgb[0], 10, 'converted random color (lower case) from hex to RGB red is correct');
+is( $rgb[1], 20, 'converted random color (lower case) from hex to RGB green is correct');
+is( $rgb[2], 30, 'converted random color (lower case) from hex to RGB blue is correct');
+
+
+
+exit 0;
diff --git a/t/002_color_constant.t b/t/002_color_constant.t
new file mode 100644
index 0000000..a2ea086
--- /dev/null
+++ b/t/002_color_constant.t
@@ -0,0 +1,125 @@
+#!/usr/bin/perl
+
+use v5.12;
+use warnings;
+use Test::More tests => 57;
+use Test::Warn;
+
+BEGIN { unshift @INC, 'lib', '../lib'}
+my $module = 'Chart::Color::Constant';
+
+eval "use $module";
+is( not($@), 1, 'could load the module');
+
+my @names = Chart::Color::Constant::all_names();
+is( @names > 700, 1, 'get a large list of names, all_names seems to working');
+
+my $add_rgb = \&Chart::Color::Constant::add_rgb;
+my $add_hsl = \&Chart::Color::Constant::add_hsl;
+my $taken = \&Chart::Color::Constant::name_taken;
+my $get_name_rgb = \&Chart::Color::Constant::name_from_rgb;
+my $get_name_hsl = \&Chart::Color::Constant::name_from_hsl;
+my $get_name_range = \&Chart::Color::Constant::names_in_hsl_range;
+
+warning_like {$add_rgb->()} {carped => qr/missing first arg/}, "can't get color without name";
+warning_like {$add_rgb->( 'one',1,1)} {carped => qr/need exactly 3/},'not enough args to add color';
+warning_like {$add_rgb->( 'one', 0, -1, 25)} {carped => qr/green/}, 'too small green value got cought';
+warning_like {$add_rgb->( 'one', 0, 1, 256)} {carped => qr/blue/}, 'too large blue value got cought';
+warning_like {$add_rgb->( 'white', 0, 3, 22 )} {carped => qr/already/}, 'got cought overwriting white';
+
+is( $taken->('one'), '', 'there is not color named "one"' );
+is( ref $add_rgb->('one', 1, 2, 3 ), 'ARRAY', 'could add color to store');
+is( $get_name_rgb->( 1, 2, 3 ), 'one', 'retrieve added color' );
+is( $taken->('one'), 1, 'there is now a color named "one"' );
+is( $taken->('One'), 1, 'even there with different spelling');
+is( ref $add_hsl->('lucky', 0,100, 50),'ARRAY', 'added red under different name');
+is( ref $add_hsl->('blob', 14, 10, 50),'ARRAY', 'added color by hsl definition');
+
+is( $get_name_rgb->( 255 ,255, 255 ), 'white', 'could get a color def');
+is( scalar $get_name_rgb->( 255, 215, 0 ), 'gold', 'selects shorter name: gold instead of gold1');
+is( scalar $get_name_rgb->( [255, 215, 0]),'gold', 'array ref arg format works too');
+is( scalar $get_name_rgb->( 255, 0, 0 ), 'red', 'selects shorter name red instead of inserted lucky');
+is( $get_name_hsl->( 0, 100, 50 ), 'red', 'found red by hsl');
+is( $get_name_hsl->( 14, 10, 50 ), 'blob', 'found inserted color by hsl');
+
+my @rgb = Chart::Color::Constant::rgb_from_name('white');
+my @hsl = Chart::Color::Constant::hsl_from_name('white');
+is( int @rgb, 3, 'white has 3 rgb values');
+is( $rgb[0], 255, 'white has full red value');
+is( $rgb[1], 255, 'white has full green value');
+is( $rgb[2], 255, 'white has full blue value');
+is( int @hsl, 3, 'white has 3 hsl values');
+is( $hsl[0], 0, 'white has zero hue value');
+is( $hsl[1], 0, 'white has zero sat value');
+is( $hsl[2], 100, 'white has full light value');
+
+@rgb = Chart::Color::Constant::rgb_from_name('one');
+@hsl = Chart::Color::Constant::hsl_from_name('one');
+is( int @rgb, 3, 'self defined color has rgb values');
+is( $rgb[0], 1, 'self defined color has defined red value');
+is( $rgb[1], 2, 'self defined color has defined full green value');
+is( $rgb[2], 3, 'self defined color has defined full blue value');
+is( int @hsl, 3, 'self defined color has hsl values');
+is( $hsl[0], 210, 'self defined color has computed hue value');
+is( $hsl[1], 50, 'self defined color has computed saturation');
+is( $hsl[2], 1, 'self defined color has computed lightness');
+
+@rgb = Chart::Color::Constant::rgb_from_name('One');
+is( int @rgb, 3, 'upper case gets cleaned from color name');
+@rgb = Chart::Color::Constant::rgb_from_name('O_ne');
+is( int @rgb, 3, 'under score gets cleaned from color name');
+
+warning_like{ $get_name_range->( []) } {carped => qr/two arguments/},"can't get names in range without hsl values";
+warning_like{ $get_name_range->( [1,1,1],[1,1,1],[1,1,1])} {carped => qr/two arguments/},'too many array arg';
+warning_like{ $get_name_range->( [1,2],[1,2,3])} {carped => qr/first argument/},'range center is missing a value';
+warning_like{ $get_name_range->( [1,2,3],[2,3])} {carped => qr/second argument/}, 'tolerances are missing a value';
+warning_like{ $get_name_range->( [-1,2,3],[1,2,3])} {carped => qr/hue value/}, 'first value of search center is too small';
+warning_like{ $get_name_range->( [360,2,3],[1,2,3])} {carped => qr/hue value/}, 'first value of search center is too large';
+warning_like{ $get_name_range->( [1,-1,3],[2,10,3])} {carped => qr/saturation value/}, 'saturation center value is too small';
+warning_like{ $get_name_range->( [1,101,3],[2,1,3])} {carped => qr/saturation value/}, 'saturation center value is too large';
+warning_like{ $get_name_range->( [1,1,-1],[2,10,3])} {carped => qr/lightness value/}, 'first lightness value is too small';
+warning_like{ $get_name_range->( [1,2,101],[2,1,1])} {carped => qr/lightness value/}, 'second lightness value is too large';
+
+@names = $get_name_range->( [0, 0, 100], 0);
+is( int @names, 1, 'only one color has distance of 0 to white');
+is( $names[0], 'white', 'only white has distance of 0 to white');
+
+@names = sort $get_name_range->( [0, 0, 100], 5);
+is( int @names, 6, '6 colors are in short distance to white');
+@names = grep { /whitesmoke/ } @names;
+is( int @names, 1, 'whitesmoke is near to white');
+
+my @morenames = sort $get_name_range->( [0, 0, 100], 10);
+is( @names < @morenames, 1, 'bigger radius has to catch more colors');
+
+@names = sort $get_name_range->( [240, 100, 50], [10, 20, 30]);
+@names = grep { /navy/ } @names;
+is( int @names, 1, 'navy is a shade of blue');
+
+@names = sort $get_name_range->( [240, 100, 50], [100, 5, 5]);
+@names = grep { /aqua/ } @names;
+is( int @names, 1, 'aqua is a bluish color with high saturation and medium lightness');
+
+@names = sort $get_name_range->( [ 0, 100, 50], [100, 5, 5]);
+@names = grep { /lightpurple/ } @names;
+is( int @names, 1, 'purple is near red because hue is circular');
+
+@names = sort $get_name_range->( [ 359, 100, 50], [100, 5, 5]);
+@names = grep { /chartreuse/ } @names;
+is( @names > 0, 1, 'chartreuse is near purple because hue is circular');
+
+#say for @names;
+#say scalar $get_name_hsl->(240, 100, 50);
+
+exit 0;
+
+__END__
+
+use Memory::Usage;
+my $mu = Memory::Usage->new();
+$mu->record('starting work');
+eval "use $module";
+$mu->record('after ');
+eval "use GD;";
+$mu->record('GD ');
+$mu->dump();
diff --git a/t/003_color.t b/t/003_color.t
new file mode 100644
index 0000000..641f6f6
--- /dev/null
+++ b/t/003_color.t
@@ -0,0 +1,372 @@
+#!/usr/bin/perl
+#
+use v5.12;
+use warnings;
+use Test::More tests => 303;
+use Test::Warn;
+
+BEGIN { unshift @INC, 'lib', '../lib'}
+my $module = 'Chart::Color';
+eval "use $module";
+is( not( $@), 1, 'could load the module');
+
+
+warning_like {Chart::Color->new()} {carped => qr/constructor of/}, "need argument to create object";
+warning_like {Chart::Color->new('weirdcolorname')} {carped => qr/unknown color/}, "accept only known color names";
+warning_like {Chart::Color->new('CHIMNEY:red')} {carped => qr/ not installed/}, "accept only known palletes";
+warning_like {Chart::Color->new('#23232') } {carped => qr/hex color definition/}, "hex definition too short";
+warning_like {Chart::Color->new('#232321f') } {carped => qr/hex color definition/}, "hex definition too long";
+warning_like {Chart::Color->new('#23232g') } {carped => qr/hex color definition/}, "hex definition has forbidden chars";
+warning_like {Chart::Color->new('#2322%E') } {carped => qr/hex color definition/}, "hex definition has forbidden chars";
+warning_like {Chart::Color->new(1,1)} {carped => qr/constructor of/}, "too few positional args";
+warning_like {Chart::Color->new(1,1,1,1,1)} {carped => qr/constructor of/}, "too many positional args";
+warning_like {Chart::Color->new([1,1])} {carped => qr/need exactly 3/}, "too few positional args in ref";
+warning_like {Chart::Color->new([1,1,1,1])} {carped => qr/need exactly 3/}, "too many positional args in ref";
+warning_like {Chart::Color->new({ r=>1, g=>1})} {carped => qr/constructor of/}, "too few named args in ref";
+warning_like {Chart::Color->new({r=>1,g=>1,b=>1,h=>1,})} {carped => qr/constructor of/},"too many name args in ref";
+warning_like {Chart::Color->new( r=>1)} {carped => qr/constructor of/}, "too few named args";
+warning_like {Chart::Color->new(r=>1,g=>1,b=>1,h=>1,a=>1)} {carped => qr/constructor of/}, "too many name args";
+warning_like {Chart::Color->new(r=>1,g=>1,h=>1)} {carped => qr/argument keys/}, "don't mix named args";
+warning_like {Chart::Color->new(r=>1,g=>1,t=>1)} {carped => qr/argument keys/}, "don't invent named args";
+
+my $red = Chart::Color->new('red');
+is( ref $red, $module, 'could create object by name');
+is( $red->red, 255, 'named red has correct red component value');
+is( $red->green, 0, 'named red has correct green component value');
+is( $red->blue, 0, 'named red has correct blue component value');
+is( $red->hue, 0, 'named red has correct hue component value');
+is( $red->saturation, 100, 'named red has correct saturation component value');
+is( $red->lightness, 50, 'named red has correct lightness component value');
+is( $red->name, 'red', 'named red has correct name');
+is( $red->rgb_hex, '#ff0000', 'named red has correct hex value');
+is(($red->rgb)[0], 255, 'named red has correct rgb red component value');
+is(($red->rgb)[1], 0, 'named red has correct rgb green component value');
+is(($red->rgb)[2], 0, 'named red has correct rgb blue component value');
+is(($red->hsl)[0], 0, 'named red has correct hsl hue component value');
+is(($red->hsl)[1], 100, 'named red has correct hsl saturation component value');
+is(($red->hsl)[2], 50, 'named red has correct hsl lightness component value');
+is( $red->string, 'red', 'named red does stringify correctly');
+is( Chart::Color->new(15,12,13)->string, '[ 15, 12, 13 ]', 'random color does stringify correctly');
+
+
+$red = Chart::Color->new('#FF0000');
+is( ref $red, $module, 'could create object by hex value');
+is( $red->red, 255, 'hex red has correct red component value');
+is( $red->green, 0, 'hex red has correct green component value');
+is( $red->blue, 0, 'hex red has correct blue component value');
+is( $red->hue, 0, 'hex red has correct hue component value');
+is( $red->saturation, 100, 'hex red has correct saturation component value');
+is( $red->lightness, 50, 'hex red has correct lightness component value');
+is( $red->name, 'red', 'hex red has correct name');
+is( $red->rgb_hex, '#ff0000', 'hex red has correct hex value');
+is(($red->rgb)[0], 255, 'hex red has correct rgb red component value');
+is(($red->rgb)[1], 0, 'hex red has correct rgb green component value');
+is(($red->rgb)[2], 0, 'hex red has correct rgb blue component value');
+is(($red->hsl)[0], 0, 'hex red has correct hsl hue component value');
+is(($red->hsl)[1], 100, 'hex red has correct hsl saturation component value');
+is(($red->hsl)[2], 50, 'hex red has correct hsl lightness component value');
+
+$red = Chart::Color->new('#f00');
+is( ref $red, $module, 'could create object by short hex value');
+is( $red->name, 'red', 'short hex red has correct name');
+
+$red = Chart::Color->new(255, 0, 0);
+is( ref $red, $module, 'could create object by positional RGB');
+is( $red->red, 255, 'positional red has correct red component value');
+is( $red->green, 0, 'positional red has correct green component value');
+is( $red->blue, 0, 'positional red has correct blue component value');
+is( $red->hue, 0, 'positional red has correct hue component value');
+is( $red->saturation, 100, 'positional red has correct saturation component value');
+is( $red->lightness, 50, 'positional red has correct lightness component value');
+is( $red->name, 'red', 'positional red has correct name');
+is( $red->rgb_hex, '#ff0000', 'positional red has correct hex value');
+is(($red->rgb)[0], 255, 'positional red has correct rgb red component value');
+is(($red->rgb)[1], 0, 'positional red has correct rgb green component value');
+is(($red->rgb)[2], 0, 'positional red has correct rgb blue component value');
+is(($red->hsl)[0], 0, 'positional red has correct hsl hue component value');
+is(($red->hsl)[1], 100, 'positional red has correct hsl saturation component value');
+is(($red->hsl)[2], 50, 'positional red has correct hsl lightness component value');
+
+$red = Chart::Color->new([255, 0, 0]);
+is( ref $red, $module, 'could create object by RGB array ref');
+is( $red->red, 255, 'array ref red has correct red component value');
+is( $red->green, 0, 'array ref red has correct green component value');
+is( $red->blue, 0, 'array ref red has correct blue component value');
+is( $red->hue, 0, 'array ref red has correct hue component value');
+is( $red->saturation, 100, 'array ref red has correct saturation component value');
+is( $red->lightness, 50, 'array ref red has correct lightness component value');
+is( $red->name, 'red', 'array ref red has correct name');
+is( $red->rgb_hex, '#ff0000', 'array ref red has correct hex value');
+is(($red->rgb)[0], 255, 'array ref red has correct rgb red component value');
+is(($red->rgb)[1], 0, 'array ref red has correct rgb green component value');
+is(($red->rgb)[2], 0, 'array ref red has correct rgb blue component value');
+is(($red->hsl)[0], 0, 'array ref red has correct hsl hue component value');
+is(($red->hsl)[1], 100, 'array ref red has correct hsl saturation component value');
+is(($red->hsl)[2], 50, 'array ref red has correct hsl lightness component value');
+
+$red = Chart::Color->new(r => 255, g => 0, b => 0);
+is( ref $red, $module, 'could create object by RGB named args');
+is( $red->red, 255, 'named arg red has correct red component value');
+is( $red->green, 0, 'named arg red has correct green component value');
+is( $red->blue, 0, 'named arg red has correct blue component value');
+is( $red->hue, 0, 'named arg red has correct hue component value');
+is( $red->saturation, 100, 'named arg red has correct saturation component value');
+is( $red->lightness, 50, 'named arg red has correct lightness component value');
+is( $red->name, 'red', 'named arg red has correct name');
+is( $red->rgb_hex, '#ff0000', 'named arg red has correct hex value');
+is(($red->rgb)[0], 255, 'named arg red has correct rgb red component value');
+is(($red->rgb)[1], 0, 'named arg red has correct rgb green component value');
+is(($red->rgb)[2], 0, 'named arg red has correct rgb blue component value');
+is(($red->hsl)[0], 0, 'named arg red has correct hsl hue component value');
+is(($red->hsl)[1], 100, 'named arg red has correct hsl saturation component value');
+is(($red->hsl)[2], 50, 'named arg red has correct hsl lightness component value');
+
+$red = Chart::Color->new({Red => 255, Green => 0, Blue => 0 });
+is( ref $red, $module, 'could create object by RGB hash ref');
+is( $red->red, 255, 'hash ref red has correct red component value');
+is( $red->green, 0, 'hash ref red has correct green component value');
+is( $red->blue, 0, 'hash ref red has correct blue component value');
+is( $red->hue, 0, 'hash ref red has correct hue component value');
+is( $red->saturation, 100, 'hash ref red has correct saturation component value');
+is( $red->lightness, 50, 'hash ref red has correct lightness component value');
+is( $red->name, 'red', 'hash ref red has correct name');
+is( $red->rgb_hex, '#ff0000', 'hash ref red has correct hex value');
+is(($red->rgb)[0], 255, 'hash ref red has correct rgb red component value');
+is(($red->rgb)[1], 0, 'hash ref red has correct rgb green component value');
+is(($red->rgb)[2], 0, 'hash ref red has correct rgb blue component value');
+is(($red->hsl)[0], 0, 'hash ref red has correct hsl hue component value');
+is(($red->hsl)[1], 100, 'hash ref red has correct hsl saturation component value');
+is(($red->hsl)[2], 50, 'hash ref red has correct hsl lightness component value');
+
+$red = Chart::Color->new({h => 0, s => 100, l => 50 });
+is( ref $red, $module, 'could create object by HSL hash ref');
+is( $red->red, 255, 'hash ref red has correct red component value');
+is( $red->green, 0, 'hash ref red has correct green component value');
+is( $red->blue, 0, 'hash ref red has correct blue component value');
+is( $red->hue, 0, 'hash ref red has correct hue component value');
+is( $red->saturation, 100, 'hash ref red has correct saturation component value');
+is( $red->lightness, 50, 'hash ref red has correct lightness component value');
+is( $red->name, 'red', 'hash ref red has correct name');
+is( $red->rgb_hex, '#ff0000', 'hash ref red has correct hex value');
+is(($red->rgb)[0], 255, 'hash ref red has correct rgb red component value');
+is(($red->rgb)[1], 0, 'hash ref red has correct rgb green component value');
+is(($red->rgb)[2], 0, 'hash ref red has correct rgb blue component value');
+is(($red->hsl)[0], 0, 'hash ref red has correct hsl hue component value');
+is(($red->hsl)[1], 100, 'hash ref red has correct hsl saturation component value');
+is(($red->hsl)[2], 50, 'hash ref red has correct hsl lightness component value');
+
+$red = Chart::Color->new( Hue => 0, Sat => 100, Light => 50 );
+is( ref $red, $module, 'could create object by HSL named args');
+is( $red->red, 255, 'hash ref red has correct red component value');
+is( $red->green, 0, 'hash ref red has correct green component value');
+is( $red->blue, 0, 'hash ref red has correct blue component value');
+is( $red->hue, 0, 'hash ref red has correct hue component value');
+is( $red->saturation, 100, 'hash ref red has correct saturation component value');
+is( $red->lightness, 50, 'hash ref red has correct lightness component value');
+is( $red->name, 'red', 'hash ref red has correct name');
+is( $red->rgb_hex, '#ff0000', 'hash ref red has correct hex value');
+is(($red->rgb)[0], 255, 'hash ref red has correct rgb red component value');
+is(($red->rgb)[1], 0, 'hash ref red has correct rgb green component value');
+is(($red->rgb)[2], 0, 'hash ref red has correct rgb blue component value');
+is(($red->hsl)[0], 0, 'hash ref red has correct hsl hue component value');
+is(($red->hsl)[1], 100, 'hash ref red has correct hsl saturation component value');
+is(($red->hsl)[2], 50, 'hash ref red has correct hsl lightness component value');
+
+
+my $c = Chart::Color->new( 1,2,3 );
+is( ref $red, $module, 'could create object by random unnamed color');
+is( $c->red, 1, 'random color has correct red component value');
+is( $c->green, 2, 'random color has correct green component value');
+is( $c->blue, 3, 'random color has correct blue component value');
+is( $c->name, '', 'random color has no name');
+
+my $blue = Chart::Color->new( 'blue' );
+is( $blue->red, 0, 'blue has correct red component value');
+is( $blue->green, 0, 'blue has correct green component value');
+is( $blue->blue, 255, 'blue has correct blue component value');
+is( $blue->hue, 240, 'blue has correct hue component value');
+is( $blue->saturation,100,'blue has correct saturation component value');
+is( $blue->lightness, 50,'blue has correct lightness component value');
+is( $blue->name, 'blue', 'blue color has correct name');
+
+is( $blue->distance_to($red), 120, 'correct default hsl distance between red and blue');
+is( $blue->distance_to($red, 'HSL'), 120, 'correct hsl distance between red and blue');
+is( $blue->distance_to($red, 'Hue'), 120, 'correct hue distance between red and blue, long name');
+is( $blue->distance_to($red, 'h'), 120, 'correct hue distance between red and blue');
+is( $blue->distance_to($red, 's'), 0, 'correct sturation distance between red and blue');
+is( $blue->distance_to($red, 'Sat'), 0, 'correct sturation distance between red and blue, long name');
+is( $blue->distance_to($red, 'l'), 0, 'correct lightness distance between red and blue');
+is( $blue->distance_to($red, 'Light'), 0, 'correct lightness distance between red and blue, long name');
+is( $blue->distance_to($red, 'hs'), 120, 'correct hs distance between red and blue');
+is( $blue->distance_to($red, 'hl'), 120, 'correct hl distance between red and blue');
+is( $blue->distance_to($red, 'sl'), 0, 'correct sl distance between red and blue');
+is( int $blue->distance_to($red, 'rgb'), 360, 'correct rgb distance between red and blue');
+is( $blue->distance_to($red, 'Red'), 255, 'correct red distance between red and blue, long name');
+is( $blue->distance_to($red, 'r'), 255, 'correct red distance between red and blue');
+is( $blue->distance_to($red, 'Green'), 0, 'correct green distance between red and blue, long name');
+is( $blue->distance_to($red, 'g'), 0, 'correct green distance between red and blue');
+is( $blue->distance_to($red, 'Blue'), 255, 'correct blue distance between red and blue, long name');
+is( $blue->distance_to($red, 'b'), 255, 'correct blue distance between red and blue');
+is( $blue->distance_to($red, 'rg'), 255, 'correct rg distance between red and blue');
+is( int $blue->distance_to($red, 'rb'), 360, 'correct rb distance between red and blue');
+is( $blue->distance_to($red, 'gb'), 255, 'correct gb distance between red and blue');
+
+is( int $blue->distance_to([10, 10, 245], ), 8, 'correct default hsl distance between own rgb blue and blue');
+is( int $blue->distance_to([10, 10, 245], 'HSL'), 8, 'correct hsl distance between own rgb blue and blue');
+is( $blue->distance_to([10, 10, 245], 'Hue'), 0, 'correct hue distance between own rgb blue and blue, long name');
+is( $blue->distance_to([10, 10, 245], 'h'), 0, 'correct hue distance between own rgb blue and blue');
+is( int $blue->distance_to([10, 10, 245], 's'), 8, 'correct sturation distance between own rgb blue and blue');
+is( int $blue->distance_to([10, 10, 245], 'Sat'), 8, 'correct sturation distance between own rgb blue and blue, long name');
+is( int $blue->distance_to([10, 10, 245], 'l'), 0, 'correct lightness distance between own rgb blue and blue');
+is( int $blue->distance_to([10, 10, 245], 'Light'), 0, 'correct lightness distance between own rgb blue and blue, long name');
+is( int $blue->distance_to([10, 10, 245], 'hs'), 8, 'correct hs distance between own rgb blue and blue');
+is( int $blue->distance_to([10, 10, 245], 'hl'), 0, 'correct hl distance between own rgb blue and blue');
+is( int $blue->distance_to([10, 10, 245], 'sl'), 8, 'correct sl distance between own rgb blue and blue');
+is( int $blue->distance_to([10, 10, 245], 'rgb'), 17, 'correct rgb distance between own rgb blue and blue');
+is( $blue->distance_to([10, 10, 245], 'Red'), 10, 'correct red distance between own rgb blue and blue, long name');
+is( $blue->distance_to([10, 10, 245], 'r'), 10, 'correct red distance between own rgb blue and blue');
+is( $blue->distance_to([10, 10, 245], 'Green'),10, 'correct green distance between own rgb blue and blue, long name');
+is( $blue->distance_to([10, 10, 245], 'g'), 10, 'correct green distance between own rgb blue and blue');
+is( $blue->distance_to([10, 10, 245], 'Blue'), 10, 'correct blue distance between own rgb blue and blue, long name');
+is( $blue->distance_to([10, 10, 245], 'b'), 10, 'correct blue distance between own rgb blue and blue');
+is( int $blue->distance_to([10, 10, 245], 'rg'), 14, 'correct rg distance between own rgb blue and blue');
+is( int $blue->distance_to([10, 10, 245], 'rb'), 14, 'correct rb distance between own rgb blue and blue');
+is( int $blue->distance_to([10, 10, 245], 'gb'), 14, 'correct gb distance between own rgb blue and blue');
+
+is( int $blue->distance_to({h =>230, s => 90, l=>40}), 17, 'correct default hsl distance between own hsl blue and blue');
+is( int $blue->distance_to({h =>230, s => 90, l=>40}, 'HSL'), 17, 'correct hsl distance between own hsl blue and blue');
+is( $blue->distance_to({h =>230, s => 90, l=>40}, 'Hue'), 10, 'correct hue distance between own hsl blue and blue, long name');
+is( $blue->distance_to({h =>230, s => 90, l=>40}, 'h'), 10, 'correct hue distance between own hsl blue and blue');
+is( $blue->distance_to({h =>230, s => 90, l=>40}, 's'), 10, 'correct sturation distance between own hsl blue and blue');
+is( $blue->distance_to({h =>230, s => 90, l=>40}, 'Sat'), 10, 'correct sturation distance between own hsl blue and blue, long name');
+is( $blue->distance_to({h =>230, s => 90, l=>40}, 'l'), 10, 'correct lightness distance between own hsl blue and blue');
+is( $blue->distance_to({h =>230, s => 90, l=>40}, 'Light'),10, 'correct lightness distance between own hsl blue and blue, long name');
+is( int $blue->distance_to({h =>230, s => 90, l=>40}, 'hs'), 14, 'correct hs distance between own hsl blue and blue');
+is( int $blue->distance_to({h =>230, s => 90, l=>40}, 'hl'), 14, 'correct hl distance between own hsl blue and blue');
+is( int $blue->distance_to({h =>230, s => 90, l=>40}, 'sl'), 14, 'correct sl distance between own hsl blue and blue');
+is( int $blue->distance_to({h =>230, s => 90, l=>40}, 'rgb'), 74, 'correct rgb distance between own hsl blue and blue');
+is( int $blue->distance_to({h =>230, s => 90, l=>40}, 'Red'), 10, 'correct red distance between own hsl blue and blue, long name');
+is( int $blue->distance_to({h =>230, s => 90, l=>40}, 'r'), 10, 'correct red distance between own hsl blue and blue');
+is( int $blue->distance_to({h =>230, s => 90, l=>40}, 'Green'),41, 'correct green distance between own hsl blue and blue, long name');
+is( int $blue->distance_to({h =>230, s => 90, l=>40}, 'g'), 41, 'correct green distance between own hsl blue and blue');
+is( int $blue->distance_to({h =>230, s => 90, l=>40}, 'Blue'), 61, 'correct blue distance between own hsl blue and blue, long name');
+is( int $blue->distance_to({h =>230, s => 90, l=>40}, 'b'), 61, 'correct blue distance between own hsl blue and blue');
+is( int $blue->distance_to({h =>230, s => 90, l=>40}, 'rg'), 42, 'correct rg distance between own hsl blue and blue');
+is( int $blue->distance_to({h =>230, s => 90, l=>40}, 'rb'), 61, 'correct rb distance between own hsl blue and blue');
+is( int $blue->distance_to({h =>230, s => 90, l=>40}, 'gb'), 73, 'correct gb distance between own hsl blue and blue');
+
+$red = Chart::Color->new('#FF0000');
+warning_like {$red->add()} {carped => qr/argument options/}, "need argument to add to color object";
+warning_like {$red->add('weirdcolorname')} {carped => qr/unknown color/}, "accept only known color names";
+warning_like {$red->add('#23232') } {carped => qr/hex color definition/}, "hex definition too short";
+warning_like {$red->add('#232321f') } {carped => qr/hex color definition/}, "hex definition too long";
+warning_like {$red->add(1,1)} {carped => qr/argument options/}, "too few positional args";
+warning_like {$red->add(1,1,1,1)} {carped => qr/wrong number/}, "too many positional args";
+warning_like {$red->add([1,1])} {carped => qr/ 3 numerical values/}, "too few positional args in ref";
+warning_like {$red->add([1,1,1,1])} {carped => qr/ 3 numerical values/}, "too many positional args in ref";
+warning_like {$red->add(r=>1,g=>1,t=>1)} {carped => qr/unknown hash key/}, "don't invent named args";
+warning_like {$red->add({r=>1,g=>1,t=>1})} {carped => qr/unknown hash key/}, "don't invent named args, in ref";
+
+my $white = Chart::Color->new('white');
+my $black = Chart::Color->new('black');
+
+is( $white->add( 255, 255, 255 )->name, 'white', "it can't get whiter than white with additive color adding");
+is( $white->add( {Hue => 10} )->name, 'white', "hue doesnt change when were on level white");
+is( $white->add( {Red => 10} )->name, 'white', "hue doesnt change when adding red on white");
+is( $white->add( $white )->name, 'white', "adding white on white is still white");
+is( $red->add( $black )->name, 'red', "red + black = red");
+is( $red->add( $black, -1 )->name, 'red', "red - black = red");
+is( $white->add( $red, -1 )->name, 'aqua', "white - red = aqua");
+is( $white->add( $white, -0.5 )->name, 'gray', "white - 0.5 white = grey");
+is( Chart::Color->new(1,2,3)->add( 2,1,0)->name, 'gray1', "adding positional args"); # = 3, 3, 3
+is( $red->add( {Saturation => -10} )->red, 242, "paling red 10%, red value");
+is( $red->add( {Saturation => -10} )->blue, 13, "paling red 10%, blue value");
+is( $white->add( {Lightness => -12} )->name, 'gray88', "dimming white 12%");
+is( $black->add( {Red => 255} )->name, 'red', "creating pure red from black");
+is( $black->add( {Green => 255} )->name, 'lime', "creating pure green from black");
+is( $black->add( { b => 255} )->name, 'blue', "creating pure blue from black with short name");
+
+
+warning_like {$red->blend_with()} {carped => qr/color object/}, "need argument to blend to color object";
+warning_like {$red->blend_with('weirdcolorname')} {carped => qr/unknown color/}, "accept only known color names";
+warning_like {$red->blend_with('#23232') } {carped => qr/hex color definition/}, "hex definition too short";
+warning_like {$red->blend_with('#232321f') } {carped => qr/hex color definition/}, "hex definition too long";
+warning_like {$red->blend_with([1,1])} {carped => qr/need exactly 3/}, "too few positional args in ref";
+warning_like {$red->blend_with([1,1,1,1])} {carped => qr/need exactly 3/}, "too many positional args in ref";
+warning_like {$red->blend_with({r=>1,g=>1,t=>1})} {carped => qr/argument keys/}, "don't mix named args, in hash ref color def";
+warning_like {$red->blend_with({r=>1,g=>1,l=>1})} {carped => qr/argument keys/}, "don't invent named args, in hash ref color def";
+
+is( $black->blend_with( $white )->name, 'gray', "blend black + white = gray");
+is( $black->blend_with( $white, 0 )->name, 'black', "blend nothing, keep color");
+is( $black->blend_with( $white, 1 )->name, 'white', "blend nothing, take c2");
+is( $black->blend_with( $white, 2 )->name, 'white', "RGB limits kept");
+is( $red->blend_with( 'blue')->name, 'fuchsia', "blending with name");
+is( $red->blend_with( '#0000ff')->name, 'fuchsia', "blending with hex def");
+is( $red->blend_with( [0,0,255])->name, 'fuchsia', "blending with array ref color def");
+is( $red->blend_with({R=> 0, G=> 0, B=>255})->name, 'fuchsia', "blending with RGB hash ref color def");
+is( $red->blend_with({H=> 240, S=> 100, L=>50})->name,'fuchsia', "blending with HSL hash ref color def");
+
+is( $black->gradient_to( $white, 1 )->name, 'black', 'shortest gradient is $self');
+my @g = $black->gradient_to( $white, 2 );
+is( int @g, 2, 'gradient with length 2 has only boundary cases');
+is( $g[0]->name, 'black', 'gradient with length 2 starts on left boundary');
+is( $g[1]->name, 'white', 'gradient with length 2 ends on right boundary');
+@g = $black->gradient_to( $white, 6 );
+is( int @g, 6, 'gradient has right length = 6');
+is( $g[1]->name, 'gray20', 'grey20 is between black and white');
+is( $g[2]->name, 'gray40', 'grey40 is between black and white');
+@g = $black->gradient_to( $white, 3, 2 );
+is( int @g, 3, 'gradient has right length = 3');
+is( $g[1]->name, 'gray25', 'grey25 is between black and white in none linear gradient');
+@g = $black->gradient_to( $white, 3, .41 );
+is( $g[1]->name, 'gray75', 'grey75 is between black and white in none linear gradient');
+@g = $red->gradient_to( '#0000FF', 3 );
+is( $g[1]->name, 'fuchsia', 'fuchsia is between red and blue in linear gradient');
+
+@g = $black->complementary();
+is( int @g, 1, "default is one complementary color");
+is( $black->complementary()->name, 'black', "black has no complementary color");
+is( $white->complementary()->name, 'white', "white has no complementary color");
+is( $red->complementary()->name, 'aqua', "aqua is complementary to red");
+
+@g = $red->complementary(3);
+is( int @g, 3, "requested amount of complementary colors");
+is( $g[0]->saturation, $g[1]->saturation, "saturation is equal on complementary circle");
+is( $g[1]->saturation, $g[2]->saturation, "saturation is equal on complementary circle 2");
+is( $g[0]->lightness, $g[1]->lightness, "lightness is equal on complementary circle");
+is( $g[1]->lightness, $g[2]->lightness, "lightness is equal on complementary circle 2");
+is( $g[0]->name, 'red', "complementary circle starts with C1");
+is( $g[1]->name, 'lime', "complementary gos on to green");
+is( $g[2]->name, 'blue', "complementary circle ends with blue");
+
+@g = Chart::Color->new(15,12,13)->complementary(3);
+is( $g[0]->saturation, $g[1]->saturation, "saturation is equal on complementary circle of random color");
+is( $g[1]->saturation, $g[2]->saturation, "saturation is equal on complementary circle 2");
+is( $g[0]->lightness, $g[1]->lightness, "lightness is equal on complementary circle of random color");
+is( $g[1]->lightness, $g[2]->lightness, "lightness is equal on complementary circle 2");
+
+@g = Chart::Color->new(15,12,13)->complementary(4, 12, 20);
+is( int @g, 4, "requested amount of complementary colors");
+is( $g[1]->saturation, $g[3]->saturation, "saturation is equal on opposing sides of skewed circle");
+is( $g[1]->lightness, $g[3]->lightness, "lightness is equal on opposing sides of skewed circle");
+is( $g[1]->saturation-6, $g[0]->saturation, "saturation moves on skewed circle as predicted fore ");
+is( $g[1]->saturation+6, $g[2]->saturation, "saturation moves on skewed circle as predicted back");
+is( $g[1]->lightness-10, $g[0]->lightness, "lightness moves on skewed circle as predicted fore");
+is( $g[1]->lightness+10, $g[2]->lightness, "lightness moves on skewed circle as predicted back");
+
+@g = Chart::Color->new(15,12,13)->complementary(4, 512, 520);
+is( abs($g[0]->saturation-$g[2]->saturation) < 100, 1, "cut too large saturnation skews");
+is( abs($g[0]->lightness-$g[2]->lightness) < 100, 1, "cut too large lightness skews");
+
+@g = Chart::Color->new(15,12,13)->complementary(5, 10, 20);
+is( $g[1]->saturation, $g[4]->saturation, "saturation is equal on opposing sides of odd and skewed circle 1");
+is( $g[2]->saturation, $g[3]->saturation, "saturation is equal on opposing sides of odd and skewed circle 2");
+is( $g[1]->lightness, $g[4]->lightness, "lightness is equal on opposing sides of odd and skewed circle 1");
+is( $g[2]->lightness, $g[3]->lightness, "lightness is equal on opposing sides of odd and skewed circle 2");
+is( $g[1]->saturation-4, $g[0]->saturation, "saturation moves on odd and skewed circle as predicted fore ");
+is( $g[1]->saturation+4, $g[2]->saturation, "saturation moves on odd and skewed circle as predicted back");
+is( $g[1]->lightness -8, $g[0]->lightness, "lightness moves on odd and skewed circle as predicted fore");
+is( $g[1]->lightness +8, $g[2]->lightness, "lightness moves on odd and skewed circle as predicted back");
+
+
+exit 0;
diff --git a/t/bars.t b/t/bars.t
index 1e05be6..326f66d 100644
--- a/t/bars.t
+++ b/t/bars.t
@@ -29,7 +29,6 @@ $g->add_dataset( 50000, 70000, 20200, 80000.8, 40000 );
'tick_len' => '3',
'x_ticks' => 'vertical',
'include_zero' => 'true',
- 'pt_size' => '7',
'skip_x_ticks' => '1',
'grid_lines' => 'true',
'colors' => {
diff --git a/t/hbars_2.t b/t/hbars_2.t
index de37789..a082811 100644
--- a/t/hbars_2.t
+++ b/t/hbars_2.t
@@ -17,7 +17,7 @@ $g->add_dataset( 7, -5, -3, 4, 7 );
%hash = (
'transparent' => 'true',
'y_axes' => 'both',
- 'title' => 'Hirizontal Bars Demo',
+ 'title' => 'Horizontal Bars Demo',
'y_grid_lines' => 'true',
'x_label' => 'x-axis',
'y_label' => 'y-axis',
diff --git a/t/mountain.t b/t/mountain.t
index 82b290c..dc72c4d 100644
--- a/t/mountain.t
+++ b/t/mountain.t
@@ -23,7 +23,7 @@ my @colors = map {
my @patterns = ();
foreach ( 1 .. @data - 1 )
{
- open( PNG, '<' . File::Spec->catfile( File::Spec->curdir, 'patterns', "PATTERN$_.PNG" ) ) || die "Can't load pattern $_";
+ open( PNG, '<' . File::Spec->catfile( File::Spec->curdir, 't', 'patterns', "PATTERN$_.PNG" ) ) || die "Can't load pattern $_";
push( @patterns, GD::Image->newFromPng( \*PNG ) );
close(PNG);
}
diff --git a/t/mountain_2.t b/t/mountain_2.t
index fe92d22..f4a45ac 100644
--- a/t/mountain_2.t
+++ b/t/mountain_2.t
@@ -25,7 +25,7 @@ my @colors = map {
my @patterns = ();
foreach ( 1 .. @data - 1 )
{
- open( PNG, '<' . File::Spec->catfile( File::Spec->curdir, 'patterns', "PATTERN$_.PNG" ) ) || die "Can't load pattern $_";
+ open( PNG, '<' . File::Spec->catfile( File::Spec->curdir, 't', 'patterns', "PATTERN$_.PNG" ) ) || die "Can't load pattern $_";
push( @patterns, GD::Image->newFromPng( \*PNG ) );
close(PNG);
}
diff --git a/patterns/PATTERN0.GIF b/t/patterns/PATTERN0.GIF
index ad6ba91..ad6ba91 100644
--- a/patterns/PATTERN0.GIF
+++ b/t/patterns/PATTERN0.GIF
Binary files differ
diff --git a/patterns/PATTERN0.PNG b/t/patterns/PATTERN0.PNG
index 6962f7c..6962f7c 100644
--- a/patterns/PATTERN0.PNG
+++ b/t/patterns/PATTERN0.PNG
Binary files differ
diff --git a/patterns/PATTERN1.GIF b/t/patterns/PATTERN1.GIF
index 565b325..565b325 100644
--- a/patterns/PATTERN1.GIF
+++ b/t/patterns/PATTERN1.GIF
Binary files differ
diff --git a/patterns/PATTERN1.PNG b/t/patterns/PATTERN1.PNG
index 30ee2b2..30ee2b2 100644
--- a/patterns/PATTERN1.PNG
+++ b/t/patterns/PATTERN1.PNG
Binary files differ
diff --git a/patterns/PATTERN2.GIF b/t/patterns/PATTERN2.GIF
index defe108..defe108 100644
--- a/patterns/PATTERN2.GIF
+++ b/t/patterns/PATTERN2.GIF
Binary files differ
diff --git a/patterns/PATTERN2.PNG b/t/patterns/PATTERN2.PNG
index c03dbc8..c03dbc8 100644
--- a/patterns/PATTERN2.PNG
+++ b/t/patterns/PATTERN2.PNG
Binary files differ
diff --git a/patterns/PATTERN3.GIF b/t/patterns/PATTERN3.GIF
index 0ef43bc..0ef43bc 100644
--- a/patterns/PATTERN3.GIF
+++ b/t/patterns/PATTERN3.GIF
Binary files differ
diff --git a/patterns/PATTERN3.PNG b/t/patterns/PATTERN3.PNG
index e80f4de..e80f4de 100644
--- a/patterns/PATTERN3.PNG
+++ b/t/patterns/PATTERN3.PNG
Binary files differ
diff --git a/patterns/PATTERN4.GIF b/t/patterns/PATTERN4.GIF
index e4d085d..e4d085d 100644
--- a/patterns/PATTERN4.GIF
+++ b/t/patterns/PATTERN4.GIF
Binary files differ
diff --git a/patterns/PATTERN4.PNG b/t/patterns/PATTERN4.PNG
index 9d84eb9..9d84eb9 100644
--- a/patterns/PATTERN4.PNG
+++ b/t/patterns/PATTERN4.PNG
Binary files differ
diff --git a/patterns/PATTERN5.GIF b/t/patterns/PATTERN5.GIF
index d97283f..d97283f 100644
--- a/patterns/PATTERN5.GIF
+++ b/t/patterns/PATTERN5.GIF
Binary files differ
diff --git a/patterns/PATTERN5.PNG b/t/patterns/PATTERN5.PNG
index dc1b7f4..dc1b7f4 100644
--- a/patterns/PATTERN5.PNG
+++ b/t/patterns/PATTERN5.PNG
Binary files differ
diff --git a/t/split_1.t b/t/split_1.t
index 4a00593..2e44088 100644
--- a/t/split_1.t
+++ b/t/split_1.t
@@ -1,8 +1,8 @@
#!/usr/bin/perl -w
+use strict;
BEGIN { unshift @INC, 'lib', '../lib'}
use Chart::Split;
-use strict;
use File::Temp 0.19;
my $samples = File::Temp->newdir();
print "1..1\n";
@@ -10,8 +10,7 @@ print "1..1\n";
my ( $x, $y, @x, @y, %hash );
my $g = Chart::Split->new();
-for ( my $i = 0 ; $i < 60 ; $i += .05 )
-{
+for ( my $i = 0 ; $i < 60 ; $i += .05 ){
$y = sin($i);
$x = $i;
push @x, $x;