diff options
author | gregor herrmann <gregoa@debian.org> | 2022-07-14 11:24:08 +0200 |
---|---|---|
committer | gregor herrmann <gregoa@debian.org> | 2022-07-14 11:24:08 +0200 |
commit | 4422e134b05bebc2dd147dca5d3816db893bfda9 (patch) | |
tree | 8853f2e8f2f405adb9e5c5c554543de47213ad0e | |
parent | 28c1e3b461463116dbb2146d97dae9656498ad1f (diff) |
New upstream version 2.403.2
-rw-r--r-- | Changes | 84 | ||||
-rw-r--r-- | LICENSE | 556 | ||||
-rw-r--r-- | MANIFEST | 312 | ||||
-rw-r--r-- | META.json | 109 | ||||
-rw-r--r-- | META.yml | 76 | ||||
-rw-r--r-- | Makefile.PL | 16 | ||||
-rw-r--r-- | README | 430 | ||||
-rw-r--r-- | Readme.md | 50 | ||||
-rw-r--r-- | TODO | 16 | ||||
-rw-r--r-- | cpanfile | 5 | ||||
-rw-r--r-- | dist.ini | 59 | ||||
-rw-r--r-- | doc/LaTeX/Appendix.tex | 14 | ||||
-rw-r--r-- | doc/LaTeX/AppendixRGB.tex | 879 | ||||
-rw-r--r-- | doc/LaTeX/Aufbau.png | bin | 6175 -> 0 bytes | |||
-rw-r--r-- | doc/LaTeX/Bars.tex | 84 | ||||
-rw-r--r-- | doc/LaTeX/Base.tex | 497 | ||||
-rw-r--r-- | doc/LaTeX/Composite.tex | 136 | ||||
-rw-r--r-- | doc/LaTeX/Direction.tex | 125 | ||||
-rw-r--r-- | doc/LaTeX/Documentation.pdf | bin | 389668 -> 0 bytes | |||
-rw-r--r-- | doc/LaTeX/Documentation.tex | 81 | ||||
-rw-r--r-- | doc/LaTeX/Elemente.png | bin | 6656 -> 0 bytes | |||
-rw-r--r-- | doc/LaTeX/ErrorBars.tex | 119 | ||||
-rw-r--r-- | doc/LaTeX/HorizontalBars.tex | 58 | ||||
-rw-r--r-- | doc/LaTeX/Lines.tex | 102 | ||||
-rw-r--r-- | doc/LaTeX/LinesPoints.tex | 153 | ||||
-rw-r--r-- | doc/LaTeX/Mountain.tex | 47 | ||||
-rw-r--r-- | doc/LaTeX/Pareto.tex | 73 | ||||
-rw-r--r-- | doc/LaTeX/Pie.tex | 78 | ||||
-rw-r--r-- | doc/LaTeX/Points.tex | 122 | ||||
-rw-r--r-- | doc/LaTeX/Split.tex | 99 | ||||
-rw-r--r-- | doc/LaTeX/Stacked.tex | 53 | ||||
-rw-r--r-- | doc/LaTeX/brushstyles.png | bin | 4326 -> 0 bytes | |||
-rw-r--r-- | doc/LaTeX/composite.png | bin | 2257 -> 0 bytes | |||
-rw-r--r-- | doc/LaTeX/d_bars.png | bin | 4466 -> 0 bytes | |||
-rw-r--r-- | doc/LaTeX/d_hbars4.png | bin | 1452 -> 0 bytes | |||
-rw-r--r-- | doc/LaTeX/d_lines2.png | bin | 3754 -> 0 bytes | |||
-rw-r--r-- | doc/LaTeX/d_linesp2.png | bin | 5733 -> 0 bytes | |||
-rw-r--r-- | doc/LaTeX/d_pareto2.png | bin | 3426 -> 0 bytes | |||
-rw-r--r-- | doc/LaTeX/d_pie3.png | bin | 2924 -> 0 bytes | |||
-rw-r--r-- | doc/LaTeX/definitions.tex | 155 | ||||
-rw-r--r-- | doc/LaTeX/description.tex | 197 | ||||
-rw-r--r-- | doc/LaTeX/direction.png | bin | 7921 -> 0 bytes | |||
-rw-r--r-- | doc/LaTeX/error.png | bin | 1601 -> 0 bytes | |||
-rw-r--r-- | doc/LaTeX/mountain.png | bin | 2258 -> 0 bytes | |||
-rw-r--r-- | doc/LaTeX/points.png | bin | 1330 -> 0 bytes | |||
-rw-r--r-- | doc/LaTeX/rgb.dat | 414 | ||||
-rw-r--r-- | doc/LaTeX/rgb.tex | 416 | ||||
-rw-r--r-- | doc/LaTeX/stackedbars.png | bin | 1712 -> 0 bytes | |||
-rw-r--r-- | doc/LaTeX/stunde.png | bin | 4163 -> 0 bytes | |||
-rw-r--r-- | lib/Chart.pm | 522 | ||||
-rw-r--r-- | lib/Chart/Bars.pm | 2 | ||||
-rw-r--r-- | lib/Chart/Base.pm | 880 | ||||
-rw-r--r-- | lib/Chart/BrushStyles.pm | 3 | ||||
-rw-r--r-- | lib/Chart/Color.pm | 525 | ||||
-rw-r--r-- | lib/Chart/Color/Constant.pm | 1136 | ||||
-rw-r--r-- | lib/Chart/Color/Named.pm | 502 | ||||
-rw-r--r-- | lib/Chart/Color/Scheme.pm | 105 | ||||
-rw-r--r-- | lib/Chart/Color/Value.pm | 262 | ||||
-rw-r--r-- | lib/Chart/Composite.pm | 76 | ||||
-rw-r--r-- | lib/Chart/Constants.pm | 2 | ||||
-rw-r--r-- | lib/Chart/Direction.pm | 2 | ||||
-rw-r--r-- | lib/Chart/ErrorBars.pm | 2 | ||||
-rw-r--r-- | lib/Chart/Font.pm | 90 | ||||
-rw-r--r-- | lib/Chart/HorizontalBars.pm | 2 | ||||
-rw-r--r-- | lib/Chart/Lines.pm | 2 | ||||
-rw-r--r-- | lib/Chart/LinesPoints.pm | 2 | ||||
-rw-r--r-- | lib/Chart/Manual.pod | 56 | ||||
-rw-r--r-- | lib/Chart/Manual/Methods.pod | 68 | ||||
-rw-r--r-- | lib/Chart/Manual/Properties.pod | 805 | ||||
-rw-r--r-- | lib/Chart/Manual/Types.pod | 251 | ||||
-rw-r--r-- | lib/Chart/Manual/Workflows.pod | 25 | ||||
-rw-r--r-- | lib/Chart/Mountain.pm | 2 | ||||
-rw-r--r-- | lib/Chart/Pareto.pm | 2 | ||||
-rw-r--r-- | lib/Chart/Pie.pm | 13 | ||||
-rw-r--r-- | lib/Chart/Points.pm | 2 | ||||
-rw-r--r-- | lib/Chart/Property.pm | 34 | ||||
-rw-r--r-- | lib/Chart/Split.pm | 2 | ||||
-rw-r--r-- | lib/Chart/StackedBars.pm | 4 | ||||
-rw-r--r-- | t/001_color_value.t | 169 | ||||
-rw-r--r-- | t/002_color_constant.t | 125 | ||||
-rw-r--r-- | t/003_color.t | 372 | ||||
-rw-r--r-- | t/bars.t | 1 | ||||
-rw-r--r-- | t/hbars_2.t | 2 | ||||
-rw-r--r-- | t/mountain.t | 2 | ||||
-rw-r--r-- | t/mountain_2.t | 2 | ||||
-rw-r--r-- | t/patterns/PATTERN0.GIF (renamed from patterns/PATTERN0.GIF) | bin | 54 -> 54 bytes | |||
-rw-r--r-- | t/patterns/PATTERN0.PNG (renamed from patterns/PATTERN0.PNG) | bin | 134 -> 134 bytes | |||
-rw-r--r-- | t/patterns/PATTERN1.GIF (renamed from patterns/PATTERN1.GIF) | bin | 55 -> 55 bytes | |||
-rw-r--r-- | t/patterns/PATTERN1.PNG (renamed from patterns/PATTERN1.PNG) | bin | 125 -> 125 bytes | |||
-rw-r--r-- | t/patterns/PATTERN2.GIF (renamed from patterns/PATTERN2.GIF) | bin | 53 -> 53 bytes | |||
-rw-r--r-- | t/patterns/PATTERN2.PNG (renamed from patterns/PATTERN2.PNG) | bin | 129 -> 129 bytes | |||
-rw-r--r-- | t/patterns/PATTERN3.GIF (renamed from patterns/PATTERN3.GIF) | bin | 53 -> 53 bytes | |||
-rw-r--r-- | t/patterns/PATTERN3.PNG (renamed from patterns/PATTERN3.PNG) | bin | 126 -> 126 bytes | |||
-rw-r--r-- | t/patterns/PATTERN4.GIF (renamed from patterns/PATTERN4.GIF) | bin | 55 -> 55 bytes | |||
-rw-r--r-- | t/patterns/PATTERN4.PNG (renamed from patterns/PATTERN4.PNG) | bin | 130 -> 130 bytes | |||
-rw-r--r-- | t/patterns/PATTERN5.GIF (renamed from patterns/PATTERN5.GIF) | bin | 56 -> 56 bytes | |||
-rw-r--r-- | t/patterns/PATTERN5.PNG (renamed from patterns/PATTERN5.PNG) | bin | 128 -> 128 bytes | |||
-rw-r--r-- | t/split_1.t | 5 |
98 files changed, 4844 insertions, 6828 deletions
@@ -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. @@ -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. @@ -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 @@ -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" } @@ -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" ); @@ -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. @@ -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: ------------------ @@ -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 { @@ -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 Binary files differdeleted file mode 100644 index 4fbcbce..0000000 --- a/doc/LaTeX/Aufbau.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index 92fe678..0000000 --- a/doc/LaTeX/Documentation.pdf +++ /dev/null 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 Binary files differdeleted file mode 100644 index 561b113..0000000 --- a/doc/LaTeX/Elemente.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index edb1827..0000000 --- a/doc/LaTeX/brushstyles.png +++ /dev/null diff --git a/doc/LaTeX/composite.png b/doc/LaTeX/composite.png Binary files differdeleted file mode 100644 index 49b3c7e..0000000 --- a/doc/LaTeX/composite.png +++ /dev/null diff --git a/doc/LaTeX/d_bars.png b/doc/LaTeX/d_bars.png Binary files differdeleted file mode 100644 index 8123c21..0000000 --- a/doc/LaTeX/d_bars.png +++ /dev/null diff --git a/doc/LaTeX/d_hbars4.png b/doc/LaTeX/d_hbars4.png Binary files differdeleted file mode 100644 index 7176928..0000000 --- a/doc/LaTeX/d_hbars4.png +++ /dev/null diff --git a/doc/LaTeX/d_lines2.png b/doc/LaTeX/d_lines2.png Binary files differdeleted file mode 100644 index 603b5ce..0000000 --- a/doc/LaTeX/d_lines2.png +++ /dev/null diff --git a/doc/LaTeX/d_linesp2.png b/doc/LaTeX/d_linesp2.png Binary files differdeleted file mode 100644 index 274ad48..0000000 --- a/doc/LaTeX/d_linesp2.png +++ /dev/null diff --git a/doc/LaTeX/d_pareto2.png b/doc/LaTeX/d_pareto2.png Binary files differdeleted file mode 100644 index 97078a3..0000000 --- a/doc/LaTeX/d_pareto2.png +++ /dev/null diff --git a/doc/LaTeX/d_pie3.png b/doc/LaTeX/d_pie3.png Binary files differdeleted file mode 100644 index 7b68179..0000000 --- a/doc/LaTeX/d_pie3.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index fe1de17..0000000 --- a/doc/LaTeX/direction.png +++ /dev/null diff --git a/doc/LaTeX/error.png b/doc/LaTeX/error.png Binary files differdeleted file mode 100644 index 7f0c26c..0000000 --- a/doc/LaTeX/error.png +++ /dev/null diff --git a/doc/LaTeX/mountain.png b/doc/LaTeX/mountain.png Binary files differdeleted file mode 100644 index 9513ec9..0000000 --- a/doc/LaTeX/mountain.png +++ /dev/null diff --git a/doc/LaTeX/points.png b/doc/LaTeX/points.png Binary files differdeleted file mode 100644 index 770096d..0000000 --- a/doc/LaTeX/points.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index f440c26..0000000 --- a/doc/LaTeX/stackedbars.png +++ /dev/null diff --git a/doc/LaTeX/stunde.png b/doc/LaTeX/stunde.png Binary files differdeleted file mode 100644 index b088d02..0000000 --- a/doc/LaTeX/stunde.png +++ /dev/null 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; @@ -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 Binary files differindex ad6ba91..ad6ba91 100644 --- a/patterns/PATTERN0.GIF +++ b/t/patterns/PATTERN0.GIF diff --git a/patterns/PATTERN0.PNG b/t/patterns/PATTERN0.PNG Binary files differindex 6962f7c..6962f7c 100644 --- a/patterns/PATTERN0.PNG +++ b/t/patterns/PATTERN0.PNG diff --git a/patterns/PATTERN1.GIF b/t/patterns/PATTERN1.GIF Binary files differindex 565b325..565b325 100644 --- a/patterns/PATTERN1.GIF +++ b/t/patterns/PATTERN1.GIF diff --git a/patterns/PATTERN1.PNG b/t/patterns/PATTERN1.PNG Binary files differindex 30ee2b2..30ee2b2 100644 --- a/patterns/PATTERN1.PNG +++ b/t/patterns/PATTERN1.PNG diff --git a/patterns/PATTERN2.GIF b/t/patterns/PATTERN2.GIF Binary files differindex defe108..defe108 100644 --- a/patterns/PATTERN2.GIF +++ b/t/patterns/PATTERN2.GIF diff --git a/patterns/PATTERN2.PNG b/t/patterns/PATTERN2.PNG Binary files differindex c03dbc8..c03dbc8 100644 --- a/patterns/PATTERN2.PNG +++ b/t/patterns/PATTERN2.PNG diff --git a/patterns/PATTERN3.GIF b/t/patterns/PATTERN3.GIF Binary files differindex 0ef43bc..0ef43bc 100644 --- a/patterns/PATTERN3.GIF +++ b/t/patterns/PATTERN3.GIF diff --git a/patterns/PATTERN3.PNG b/t/patterns/PATTERN3.PNG Binary files differindex e80f4de..e80f4de 100644 --- a/patterns/PATTERN3.PNG +++ b/t/patterns/PATTERN3.PNG diff --git a/patterns/PATTERN4.GIF b/t/patterns/PATTERN4.GIF Binary files differindex e4d085d..e4d085d 100644 --- a/patterns/PATTERN4.GIF +++ b/t/patterns/PATTERN4.GIF diff --git a/patterns/PATTERN4.PNG b/t/patterns/PATTERN4.PNG Binary files differindex 9d84eb9..9d84eb9 100644 --- a/patterns/PATTERN4.PNG +++ b/t/patterns/PATTERN4.PNG diff --git a/patterns/PATTERN5.GIF b/t/patterns/PATTERN5.GIF Binary files differindex d97283f..d97283f 100644 --- a/patterns/PATTERN5.GIF +++ b/t/patterns/PATTERN5.GIF diff --git a/patterns/PATTERN5.PNG b/t/patterns/PATTERN5.PNG Binary files differindex dc1b7f4..dc1b7f4 100644 --- a/patterns/PATTERN5.PNG +++ b/t/patterns/PATTERN5.PNG 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; |