-<?php
- session_start();
- require_once ("paths.php");
- require_once ($smarty_path."Smarty.class.php");
- require_once ("bweb.inc.php");
- require_once ("config.inc.php");
-
- $smarty = new Smarty();
- $dbSql = new Bweb();
-
- require("lang.php");
-
- // Smarty configuration
- $smarty->compile_check = true;
- $smarty->debugging = false;
- $smarty->force_compile = true;
-
- $smarty->template_dir = "./templates";
- $smarty->compile_dir = "./templates_c";
- $smarty->config_dir = "./configs";
-
- $backupjob_name = "";
- $days = array();
-
- // Get Backup Job name from GET or POST
- if( isset( $_POST["backupjob_name"] ) )
- $backupjob_name = $_POST["backupjob_name"];
- elseif( isset( $_GET["backupjob_name"] ) )
- $backupjob_name = $_GET["backupjob_name"];
- else
- die( "Please specify a backup job name " );
-
- // Get the last 7 days interval (start and end)
- for( $c = 6 ; $c >= 0 ; $c-- ) {
- $today = ( mktime() - ($c * LAST_DAY) );
- array_push( $days, array( 'start' => date( "Y-m-d 00:00:00", $today ), 'end' => date( "Y-m-d 23:59:00", $today ) ) );
- }
- // Generate Backup Job report period string
- $backupjob_period = "From " . date( "Y-m-d", mktime()-LAST_WEEK ) . " to " . date( "Y-m-d", mktime() );
- // Last 7 days stored Bytes graph
- $graph = new BGraph( "graph2.png" );
-
- $days_stored_bytes = array();
- $backupjob_bytes = 0;
-
- foreach( $days as $day )
- array_push( $days_stored_bytes, $dbSql->GetStoredBytesByJob( $backupjob_name, $day['start'], $day['end'] ) );
-
- // Calculate total bytes for this period
- foreach( $days_stored_bytes as $day )
- $backupjob_bytes += $day[1];
-
- $graph->SetData( $days_stored_bytes, 'bars', 'text-data' );
- $graph->SetGraphSize( 400, 230 );
-
- $graph->Render();
- $smarty->assign('graph_stored_bytes', $graph->Get_Image_file() );
-
- // Getting last 7 days stored files graph
- $graph = new BGraph("graph3.png" );
-
- $days_stored_files = array();
- $backupjob_files = 0;
-
- foreach( $days as $day )
- array_push( $days_stored_files, $dbSql->GetStoredFilesByJob( $backupjob_name, $day['start'], $day['end'] ) );
-
- // Calculate total files for this period
- foreach( $days_stored_files as $day )
- $backupjob_files += $day[1];
-
- $graph->SetData( $days_stored_files, 'bars', 'text-data' );
- $graph->SetGraphSize( 400, 230 );
-
- $graph->Render();
- $smarty->assign('graph_stored_files', $graph->Get_Image_file() );
-
- // Last 10 jobs
- $query = "SELECT JobId, Level, JobFiles, JobBytes, JobStatus, EndTime, Name ";
- $query .= "FROM Job ";
- $query .= "WHERE Name = '$backupjob_name' ";
- $query .= "ORDER BY EndTime DESC ";
- $query .= "LIMIT 10 ";
-
- $jobs = array();
- $joblevel = array( 'I' => 'Incr', 'D' => 'Diff', 'F' => 'Full' );
- $result = $dbSql->db_link->query( $query );
-
- if( ! PEAR::isError( $result ) )
- {
- while( $job = $result->fetchRow( DB_FETCHMODE_ASSOC ) ) {
- $job['Level'] = $joblevel[ $job['Level'] ];
- array_push( $jobs, $job);
- }
-
- }else
- die( "Unable to get last jobs from catalog " . $result->getMessage() );
-
- $smarty->assign('jobs', $jobs );
-
- $smarty->assign('backupjob_name', $backupjob_name );
- $smarty->assign('backupjob_period', $backupjob_period );
- $smarty->assign('backupjob_bytes', $backupjob_bytes );
- $smarty->assign('backupjob_files', $backupjob_files );
-
- // Process and display the template
- $smarty->display('backupjob-report.tpl');
-
-?>
+<?php\r
+ session_start();\r
+ require_once ("paths.php");\r
+ require_once ($smarty_path."Smarty.class.php");\r
+ require_once ("bweb.inc.php");\r
+ require_once ("config.inc.php"); \r
+\r
+ $smarty = new Smarty(); \r
+ $dbSql = new Bweb();\r
+\r
+ require("lang.php");\r
+\r
+ // Smarty configuration\r
+ $smarty->compile_check = true;\r
+ $smarty->debugging = false;\r
+ $smarty->force_compile = true;\r
+\r
+ $smarty->template_dir = "./templates";\r
+ $smarty->compile_dir = "./templates_c";\r
+ $smarty->config_dir = "./configs";\r
+\r
+ $backupjob_name = "";\r
+ $days = array();\r
+\r
+ // Get Backup Job name from GET or POST\r
+ if( isset( $_POST["backupjob_name"] ) )\r
+ $backupjob_name = $_POST["backupjob_name"];\r
+ elseif( isset( $_GET["backupjob_name"] ) )\r
+ $backupjob_name = $_GET["backupjob_name"];\r
+ else\r
+ die( "Please specify a backup job name " );\r
+\r
+ // Get the last 7 days interval (start and end)\r
+ for( $c = 6 ; $c >= 0 ; $c-- ) {\r
+ $today = ( mktime() - ($c * LAST_DAY) );\r
+ array_push( $days, array( 'start' => date( "Y-m-d 00:00:00", $today ), 'end' => date( "Y-m-d 23:59:00", $today ) ) );\r
+ }\r
+ // Generate Backup Job report period string\r
+ $backupjob_period = "From " . date( "Y-m-d", mktime()-LAST_WEEK ) . " to " . date( "Y-m-d", mktime() );\r
+ // Last 7 days stored Bytes graph\r
+ $graph = new BGraph( "graph2.png" );\r
+\r
+ $days_stored_bytes = array();\r
+ $backupjob_bytes = 0;\r
+\r
+ foreach( $days as $day )\r
+ array_push( $days_stored_bytes, $dbSql->GetStoredBytesByJob( $backupjob_name, $day['start'], $day['end'] ) );\r
+ \r
+ // Calculate total bytes for this period\r
+ foreach( $days_stored_bytes as $day )\r
+ $backupjob_bytes += $day[1];\r
+ \r
+ $graph->SetData( $days_stored_bytes, 'bars', 'text-data' );\r
+ $graph->SetGraphSize( 400, 230 );\r
+\r
+ $graph->Render();\r
+ $smarty->assign('graph_stored_bytes', $graph->Get_Image_file() ); \r
+ \r
+ // Getting last 7 days stored files graph\r
+ $graph = new BGraph("graph3.png" );\r
+ \r
+ $days_stored_files = array();\r
+ $backupjob_files = 0;\r
+ \r
+ foreach( $days as $day )\r
+ array_push( $days_stored_files, $dbSql->GetStoredFilesByJob( $backupjob_name, $day['start'], $day['end'] ) );\r
+\r
+ // Calculate total files for this period \r
+ foreach( $days_stored_files as $day )\r
+ $backupjob_files += $day[1];\r
+ \r
+ $graph->SetData( $days_stored_files, 'bars', 'text-data' );\r
+ $graph->SetGraphSize( 400, 230 );\r
+\r
+ $graph->Render();\r
+ $smarty->assign('graph_stored_files', $graph->Get_Image_file() );\r
+\r
+ // Last 10 jobs\r
+ $query = "SELECT JobId, Level, JobFiles, JobBytes, JobStatus, EndTime, Name "; \r
+ $query .= "FROM Job ";\r
+ $query .= "WHERE Name = '$backupjob_name' ";\r
+ $query .= "ORDER BY EndTime DESC ";\r
+ $query .= "LIMIT 10 ";\r
+ \r
+ $jobs = array();\r
+ $joblevel = array( 'I' => 'Incr', 'D' => 'Diff', 'F' => 'Full' );\r
+ $result = $dbSql->db_link->query( $query );\r
+ \r
+ if( ! PEAR::isError( $result ) )\r
+ {\r
+ while( $job = $result->fetchRow( DB_FETCHMODE_ASSOC ) ) {\r
+ $job['Level'] = $joblevel[ $job['Level'] ];\r
+ array_push( $jobs, $job);\r
+ }\r
+ \r
+ }else\r
+ die( "Unable to get last jobs from catalog " . $result->getMessage() );\r
+ \r
+ $smarty->assign('jobs', $jobs );\r
+ \r
+ $smarty->assign('backupjob_name', $backupjob_name );\r
+ $smarty->assign('backupjob_period', $backupjob_period );\r
+ $smarty->assign('backupjob_bytes', $backupjob_bytes );\r
+ $smarty->assign('backupjob_files', $backupjob_files );\r
+ \r
+ // Process and display the template \r
+ $smarty->display('backupjob-report.tpl'); \r
+ \r
+?>\r
$start_date = date( "Y-m-d H:i:s", $start_date );
$end_date = date( "Y-m-d H:i:s", $end_date );
+ $interval_where = "(EndTime BETWEEN '$start_date' AND '$end_date') AND ";
+
// Job status
switch( $type )
{
case 'completed':
- $where = "AND JobStatus = 'T' ";
+ $where = $interval_where . "JobStatus = 'T' ";
$label = "Completed";
break;
case 'terminated_errors':
$label = "Terminated with errors";
break;
case 'failed':
- $where = "AND JobStatus = 'f' ";
+ $where = $interval_where . "JobStatus = 'f' ";
$label = "Failed";
break;
case 'waiting':
- $where = "AND JobStatus IN ('F','S','M','m','s','j','c','d','t') ";
+ $where = "JobStatus IN ('F','S','M','m','s','j','c','d','t') ";
$label = "Waiting";
break;
case 'created':
- $where = "AND JobStatus = 'C' ";
+ $where = "JobStatus = 'C' ";
$label = "Created but not running";
break;
case 'running':
- $where = "AND JobStatus = 'R' ";
+ $where = "JobStatus = 'R' ";
$label = "Running";
break;
case 'error':
- $where = "AND JobStatus IN ('e','f') ";
+ $where = $interval_where . "JobStatus IN ('e','f') ";
$label = "Errors";
break;
}
$query = 'SELECT COUNT(JobId) AS ' . $type . ' ';
$query .= 'FROM Job ';
- $query .= "WHERE EndTime BETWEEN '$start_date' AND '$end_date' ";
- $query .= $where;
+ $query .= "WHERE $where ";
+ //echo 'query = ' . $query . '<br />';
+
$jobs = $this->db_link->query( $query );
if (PEAR::isError( $jobs ) ) {
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-\f
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-\f
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- 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.
-\f
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-\f
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-\f
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-\f
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-\f
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser 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 Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-\f
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-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
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "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
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. 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 LIBRARY 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
-LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-\f
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. 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 library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; 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.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
+ GNU LESSER GENERAL PUBLIC LICENSE\r
+ Version 2.1, February 1999\r
+\r
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.\r
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\r
+ Everyone is permitted to copy and distribute verbatim copies\r
+ of this license document, but changing it is not allowed.\r
+\r
+[This is the first released version of the Lesser GPL. It also counts\r
+ as the successor of the GNU Library Public License, version 2, hence\r
+ the version number 2.1.]\r
+\r
+ Preamble\r
+\r
+ The licenses for most software are designed to take away your\r
+freedom to share and change it. By contrast, the GNU General Public\r
+Licenses are intended to guarantee your freedom to share and change\r
+free software--to make sure the software is free for all its users.\r
+\r
+ This license, the Lesser General Public License, applies to some\r
+specially designated software packages--typically libraries--of the\r
+Free Software Foundation and other authors who decide to use it. You\r
+can use it too, but we suggest you first think carefully about whether\r
+this license or the ordinary General Public License is the better\r
+strategy to use in any particular case, based on the explanations below.\r
+\r
+ When we speak of free software, we are referring to freedom of use,\r
+not price. Our General Public Licenses are designed to make sure that\r
+you have the freedom to distribute copies of free software (and charge\r
+for this service if you wish); that you receive source code or can get\r
+it if you want it; that you can change the software and use pieces of\r
+it in new free programs; and that you are informed that you can do\r
+these things.\r
+\r
+ To protect your rights, we need to make restrictions that forbid\r
+distributors to deny you these rights or to ask you to surrender these\r
+rights. These restrictions translate to certain responsibilities for\r
+you if you distribute copies of the library or if you modify it.\r
+\r
+ For example, if you distribute copies of the library, whether gratis\r
+or for a fee, you must give the recipients all the rights that we gave\r
+you. You must make sure that they, too, receive or can get the source\r
+code. If you link other code with the library, you must provide\r
+complete object files to the recipients, so that they can relink them\r
+with the library after making changes to the library and recompiling\r
+it. And you must show them these terms so they know their rights.\r
+\r
+ We protect your rights with a two-step method: (1) we copyright the\r
+library, and (2) we offer you this license, which gives you legal\r
+permission to copy, distribute and/or modify the library.\r
+\r
+ To protect each distributor, we want to make it very clear that\r
+there is no warranty for the free library. Also, if the library is\r
+modified by someone else and passed on, the recipients should know\r
+that what they have is not the original version, so that the original\r
+author's reputation will not be affected by problems that might be\r
+introduced by others.\r
+\f\r
+ Finally, software patents pose a constant threat to the existence of\r
+any free program. We wish to make sure that a company cannot\r
+effectively restrict the users of a free program by obtaining a\r
+restrictive license from a patent holder. Therefore, we insist that\r
+any patent license obtained for a version of the library must be\r
+consistent with the full freedom of use specified in this license.\r
+\r
+ Most GNU software, including some libraries, is covered by the\r
+ordinary GNU General Public License. This license, the GNU Lesser\r
+General Public License, applies to certain designated libraries, and\r
+is quite different from the ordinary General Public License. We use\r
+this license for certain libraries in order to permit linking those\r
+libraries into non-free programs.\r
+\r
+ When a program is linked with a library, whether statically or using\r
+a shared library, the combination of the two is legally speaking a\r
+combined work, a derivative of the original library. The ordinary\r
+General Public License therefore permits such linking only if the\r
+entire combination fits its criteria of freedom. The Lesser General\r
+Public License permits more lax criteria for linking other code with\r
+the library.\r
+\r
+ We call this license the "Lesser" General Public License because it\r
+does Less to protect the user's freedom than the ordinary General\r
+Public License. It also provides other free software developers Less\r
+of an advantage over competing non-free programs. These disadvantages\r
+are the reason we use the ordinary General Public License for many\r
+libraries. However, the Lesser license provides advantages in certain\r
+special circumstances.\r
+\r
+ For example, on rare occasions, there may be a special need to\r
+encourage the widest possible use of a certain library, so that it becomes\r
+a de-facto standard. To achieve this, non-free programs must be\r
+allowed to use the library. A more frequent case is that a free\r
+library does the same job as widely used non-free libraries. In this\r
+case, there is little to gain by limiting the free library to free\r
+software only, so we use the Lesser General Public License.\r
+\r
+ In other cases, permission to use a particular library in non-free\r
+programs enables a greater number of people to use a large body of\r
+free software. For example, permission to use the GNU C Library in\r
+non-free programs enables many more people to use the whole GNU\r
+operating system, as well as its variant, the GNU/Linux operating\r
+system.\r
+\r
+ Although the Lesser General Public License is Less protective of the\r
+users' freedom, it does ensure that the user of a program that is\r
+linked with the Library has the freedom and the wherewithal to run\r
+that program using a modified version of the Library.\r
+\r
+ The precise terms and conditions for copying, distribution and\r
+modification follow. Pay close attention to the difference between a\r
+"work based on the library" and a "work that uses the library". The\r
+former contains code derived from the library, whereas the latter must\r
+be combined with the library in order to run.\r
+\f\r
+ GNU LESSER GENERAL PUBLIC LICENSE\r
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\r
+\r
+ 0. This License Agreement applies to any software library or other\r
+program which contains a notice placed by the copyright holder or\r
+other authorized party saying it may be distributed under the terms of\r
+this Lesser General Public License (also called "this License").\r
+Each licensee is addressed as "you".\r
+\r
+ A "library" means a collection of software functions and/or data\r
+prepared so as to be conveniently linked with application programs\r
+(which use some of those functions and data) to form executables.\r
+\r
+ The "Library", below, refers to any such software library or work\r
+which has been distributed under these terms. A "work based on the\r
+Library" means either the Library or any derivative work under\r
+copyright law: that is to say, a work containing the Library or a\r
+portion of it, either verbatim or with modifications and/or translated\r
+straightforwardly into another language. (Hereinafter, translation is\r
+included without limitation in the term "modification".)\r
+\r
+ "Source code" for a work means the preferred form of the work for\r
+making modifications to it. For a library, complete source code means\r
+all the source code for all modules it contains, plus any associated\r
+interface definition files, plus the scripts used to control compilation\r
+and installation of the library.\r
+\r
+ Activities other than copying, distribution and modification are not\r
+covered by this License; they are outside its scope. The act of\r
+running a program using the Library is not restricted, and output from\r
+such a program is covered only if its contents constitute a work based\r
+on the Library (independent of the use of the Library in a tool for\r
+writing it). Whether that is true depends on what the Library does\r
+and what the program that uses the Library does.\r
+\r
+ 1. You may copy and distribute verbatim copies of the Library's\r
+complete source code as you receive it, in any medium, provided that\r
+you conspicuously and appropriately publish on each copy an\r
+appropriate copyright notice and disclaimer of warranty; keep intact\r
+all the notices that refer to this License and to the absence of any\r
+warranty; and distribute a copy of this License along with the\r
+Library.\r
+\r
+ You may charge a fee for the physical act of transferring a copy,\r
+and you may at your option offer warranty protection in exchange for a\r
+fee.\r
+\f\r
+ 2. You may modify your copy or copies of the Library or any portion\r
+of it, thus forming a work based on the Library, and copy and\r
+distribute such modifications or work under the terms of Section 1\r
+above, provided that you also meet all of these conditions:\r
+\r
+ a) The modified work must itself be a software library.\r
+\r
+ b) You must cause the files modified to carry prominent notices\r
+ stating that you changed the files and the date of any change.\r
+\r
+ c) You must cause the whole of the work to be licensed at no\r
+ charge to all third parties under the terms of this License.\r
+\r
+ d) If a facility in the modified Library refers to a function or a\r
+ table of data to be supplied by an application program that uses\r
+ the facility, other than as an argument passed when the facility\r
+ is invoked, then you must make a good faith effort to ensure that,\r
+ in the event an application does not supply such function or\r
+ table, the facility still operates, and performs whatever part of\r
+ its purpose remains meaningful.\r
+\r
+ (For example, a function in a library to compute square roots has\r
+ a purpose that is entirely well-defined independent of the\r
+ application. Therefore, Subsection 2d requires that any\r
+ application-supplied function or table used by this function must\r
+ be optional: if the application does not supply it, the square\r
+ root function must still compute square roots.)\r
+\r
+These requirements apply to the modified work as a whole. If\r
+identifiable sections of that work are not derived from the Library,\r
+and can be reasonably considered independent and separate works in\r
+themselves, then this License, and its terms, do not apply to those\r
+sections when you distribute them as separate works. But when you\r
+distribute the same sections as part of a whole which is a work based\r
+on the Library, the distribution of the whole must be on the terms of\r
+this License, whose permissions for other licensees extend to the\r
+entire whole, and thus to each and every part regardless of who wrote\r
+it.\r
+\r
+Thus, it is not the intent of this section to claim rights or contest\r
+your rights to work written entirely by you; rather, the intent is to\r
+exercise the right to control the distribution of derivative or\r
+collective works based on the Library.\r
+\r
+In addition, mere aggregation of another work not based on the Library\r
+with the Library (or with a work based on the Library) on a volume of\r
+a storage or distribution medium does not bring the other work under\r
+the scope of this License.\r
+\r
+ 3. You may opt to apply the terms of the ordinary GNU General Public\r
+License instead of this License to a given copy of the Library. To do\r
+this, you must alter all the notices that refer to this License, so\r
+that they refer to the ordinary GNU General Public License, version 2,\r
+instead of to this License. (If a newer version than version 2 of the\r
+ordinary GNU General Public License has appeared, then you can specify\r
+that version instead if you wish.) Do not make any other change in\r
+these notices.\r
+\f\r
+ Once this change is made in a given copy, it is irreversible for\r
+that copy, so the ordinary GNU General Public License applies to all\r
+subsequent copies and derivative works made from that copy.\r
+\r
+ This option is useful when you wish to copy part of the code of\r
+the Library into a program that is not a library.\r
+\r
+ 4. You may copy and distribute the Library (or a portion or\r
+derivative of it, under Section 2) in object code or executable form\r
+under the terms of Sections 1 and 2 above provided that you accompany\r
+it with the complete corresponding machine-readable source code, which\r
+must be distributed under the terms of Sections 1 and 2 above on a\r
+medium customarily used for software interchange.\r
+\r
+ If distribution of object code is made by offering access to copy\r
+from a designated place, then offering equivalent access to copy the\r
+source code from the same place satisfies the requirement to\r
+distribute the source code, even though third parties are not\r
+compelled to copy the source along with the object code.\r
+\r
+ 5. A program that contains no derivative of any portion of the\r
+Library, but is designed to work with the Library by being compiled or\r
+linked with it, is called a "work that uses the Library". Such a\r
+work, in isolation, is not a derivative work of the Library, and\r
+therefore falls outside the scope of this License.\r
+\r
+ However, linking a "work that uses the Library" with the Library\r
+creates an executable that is a derivative of the Library (because it\r
+contains portions of the Library), rather than a "work that uses the\r
+library". The executable is therefore covered by this License.\r
+Section 6 states terms for distribution of such executables.\r
+\r
+ When a "work that uses the Library" uses material from a header file\r
+that is part of the Library, the object code for the work may be a\r
+derivative work of the Library even though the source code is not.\r
+Whether this is true is especially significant if the work can be\r
+linked without the Library, or if the work is itself a library. The\r
+threshold for this to be true is not precisely defined by law.\r
+\r
+ If such an object file uses only numerical parameters, data\r
+structure layouts and accessors, and small macros and small inline\r
+functions (ten lines or less in length), then the use of the object\r
+file is unrestricted, regardless of whether it is legally a derivative\r
+work. (Executables containing this object code plus portions of the\r
+Library will still fall under Section 6.)\r
+\r
+ Otherwise, if the work is a derivative of the Library, you may\r
+distribute the object code for the work under the terms of Section 6.\r
+Any executables containing that work also fall under Section 6,\r
+whether or not they are linked directly with the Library itself.\r
+\f\r
+ 6. As an exception to the Sections above, you may also combine or\r
+link a "work that uses the Library" with the Library to produce a\r
+work containing portions of the Library, and distribute that work\r
+under terms of your choice, provided that the terms permit\r
+modification of the work for the customer's own use and reverse\r
+engineering for debugging such modifications.\r
+\r
+ You must give prominent notice with each copy of the work that the\r
+Library is used in it and that the Library and its use are covered by\r
+this License. You must supply a copy of this License. If the work\r
+during execution displays copyright notices, you must include the\r
+copyright notice for the Library among them, as well as a reference\r
+directing the user to the copy of this License. Also, you must do one\r
+of these things:\r
+\r
+ a) Accompany the work with the complete corresponding\r
+ machine-readable source code for the Library including whatever\r
+ changes were used in the work (which must be distributed under\r
+ Sections 1 and 2 above); and, if the work is an executable linked\r
+ with the Library, with the complete machine-readable "work that\r
+ uses the Library", as object code and/or source code, so that the\r
+ user can modify the Library and then relink to produce a modified\r
+ executable containing the modified Library. (It is understood\r
+ that the user who changes the contents of definitions files in the\r
+ Library will not necessarily be able to recompile the application\r
+ to use the modified definitions.)\r
+\r
+ b) Use a suitable shared library mechanism for linking with the\r
+ Library. A suitable mechanism is one that (1) uses at run time a\r
+ copy of the library already present on the user's computer system,\r
+ rather than copying library functions into the executable, and (2)\r
+ will operate properly with a modified version of the library, if\r
+ the user installs one, as long as the modified version is\r
+ interface-compatible with the version that the work was made with.\r
+\r
+ c) Accompany the work with a written offer, valid for at\r
+ least three years, to give the same user the materials\r
+ specified in Subsection 6a, above, for a charge no more\r
+ than the cost of performing this distribution.\r
+\r
+ d) If distribution of the work is made by offering access to copy\r
+ from a designated place, offer equivalent access to copy the above\r
+ specified materials from the same place.\r
+\r
+ e) Verify that the user has already received a copy of these\r
+ materials or that you have already sent this user a copy.\r
+\r
+ For an executable, the required form of the "work that uses the\r
+Library" must include any data and utility programs needed for\r
+reproducing the executable from it. However, as a special exception,\r
+the materials to be distributed need not include anything that is\r
+normally distributed (in either source or binary form) with the major\r
+components (compiler, kernel, and so on) of the operating system on\r
+which the executable runs, unless that component itself accompanies\r
+the executable.\r
+\r
+ It may happen that this requirement contradicts the license\r
+restrictions of other proprietary libraries that do not normally\r
+accompany the operating system. Such a contradiction means you cannot\r
+use both them and the Library together in an executable that you\r
+distribute.\r
+\f\r
+ 7. You may place library facilities that are a work based on the\r
+Library side-by-side in a single library together with other library\r
+facilities not covered by this License, and distribute such a combined\r
+library, provided that the separate distribution of the work based on\r
+the Library and of the other library facilities is otherwise\r
+permitted, and provided that you do these two things:\r
+\r
+ a) Accompany the combined library with a copy of the same work\r
+ based on the Library, uncombined with any other library\r
+ facilities. This must be distributed under the terms of the\r
+ Sections above.\r
+\r
+ b) Give prominent notice with the combined library of the fact\r
+ that part of it is a work based on the Library, and explaining\r
+ where to find the accompanying uncombined form of the same work.\r
+\r
+ 8. You may not copy, modify, sublicense, link with, or distribute\r
+the Library except as expressly provided under this License. Any\r
+attempt otherwise to copy, modify, sublicense, link with, or\r
+distribute the Library is void, and will automatically terminate your\r
+rights under this License. However, parties who have received copies,\r
+or rights, from you under this License will not have their licenses\r
+terminated so long as such parties remain in full compliance.\r
+\r
+ 9. You are not required to accept this License, since you have not\r
+signed it. However, nothing else grants you permission to modify or\r
+distribute the Library or its derivative works. These actions are\r
+prohibited by law if you do not accept this License. Therefore, by\r
+modifying or distributing the Library (or any work based on the\r
+Library), you indicate your acceptance of this License to do so, and\r
+all its terms and conditions for copying, distributing or modifying\r
+the Library or works based on it.\r
+\r
+ 10. Each time you redistribute the Library (or any work based on the\r
+Library), the recipient automatically receives a license from the\r
+original licensor to copy, distribute, link with or modify the Library\r
+subject to these terms and conditions. You may not impose any further\r
+restrictions on the recipients' exercise of the rights granted herein.\r
+You are not responsible for enforcing compliance by third parties with\r
+this License.\r
+\f\r
+ 11. If, as a consequence of a court judgment or allegation of patent\r
+infringement or for any other reason (not limited to patent issues),\r
+conditions are imposed on you (whether by court order, agreement or\r
+otherwise) that contradict the conditions of this License, they do not\r
+excuse you from the conditions of this License. If you cannot\r
+distribute so as to satisfy simultaneously your obligations under this\r
+License and any other pertinent obligations, then as a consequence you\r
+may not distribute the Library at all. For example, if a patent\r
+license would not permit royalty-free redistribution of the Library by\r
+all those who receive copies directly or indirectly through you, then\r
+the only way you could satisfy both it and this License would be to\r
+refrain entirely from distribution of the Library.\r
+\r
+If any portion of this section is held invalid or unenforceable under any\r
+particular circumstance, the balance of the section is intended to apply,\r
+and the section as a whole is intended to apply in other circumstances.\r
+\r
+It is not the purpose of this section to induce you to infringe any\r
+patents or other property right claims or to contest validity of any\r
+such claims; this section has the sole purpose of protecting the\r
+integrity of the free software distribution system which is\r
+implemented by public license practices. Many people have made\r
+generous contributions to the wide range of software distributed\r
+through that system in reliance on consistent application of that\r
+system; it is up to the author/donor to decide if he or she is willing\r
+to distribute software through any other system and a licensee cannot\r
+impose that choice.\r
+\r
+This section is intended to make thoroughly clear what is believed to\r
+be a consequence of the rest of this License.\r
+\r
+ 12. If the distribution and/or use of the Library is restricted in\r
+certain countries either by patents or by copyrighted interfaces, the\r
+original copyright holder who places the Library under this License may add\r
+an explicit geographical distribution limitation excluding those countries,\r
+so that distribution is permitted only in or among countries not thus\r
+excluded. In such case, this License incorporates the limitation as if\r
+written in the body of this License.\r
+\r
+ 13. The Free Software Foundation may publish revised and/or new\r
+versions of the Lesser General Public License from time to time.\r
+Such new versions will be similar in spirit to the present version,\r
+but may differ in detail to address new problems or concerns.\r
+\r
+Each version is given a distinguishing version number. If the Library\r
+specifies a version number of this License which applies to it and\r
+"any later version", you have the option of following the terms and\r
+conditions either of that version or of any later version published by\r
+the Free Software Foundation. If the Library does not specify a\r
+license version number, you may choose any version ever published by\r
+the Free Software Foundation.\r
+\f\r
+ 14. If you wish to incorporate parts of the Library into other free\r
+programs whose distribution conditions are incompatible with these,\r
+write to the author to ask for permission. For software which is\r
+copyrighted by the Free Software Foundation, write to the Free\r
+Software Foundation; we sometimes make exceptions for this. Our\r
+decision will be guided by the two goals of preserving the free status\r
+of all derivatives of our free software and of promoting the sharing\r
+and reuse of software generally.\r
+\r
+ NO WARRANTY\r
+\r
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\r
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\r
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\r
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY\r
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\r
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\r
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\r
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\r
+\r
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\r
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\r
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\r
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\r
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\r
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\r
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\r
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\r
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\r
+DAMAGES.\r
+\r
+ END OF TERMS AND CONDITIONS\r
+\f\r
+ How to Apply These Terms to Your New Libraries\r
+\r
+ If you develop a new library, and you want it to be of the greatest\r
+possible use to the public, we recommend making it free software that\r
+everyone can redistribute and change. You can do so by permitting\r
+redistribution under these terms (or, alternatively, under the terms of the\r
+ordinary General Public License).\r
+\r
+ To apply these terms, attach the following notices to the library. It is\r
+safest to attach them to the start of each source file to most effectively\r
+convey the exclusion of warranty; and each file should have at least the\r
+"copyright" line and a pointer to where the full notice is found.\r
+\r
+ <one line to give the library's name and a brief idea of what it does.>\r
+ Copyright (C) <year> <name of author>\r
+\r
+ This library is free software; you can redistribute it and/or\r
+ modify it under the terms of the GNU Lesser General Public\r
+ License as published by the Free Software Foundation; either\r
+ version 2.1 of the License, or (at your option) any later version.\r
+\r
+ This library is distributed in the hope that it will be useful,\r
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ Lesser General Public License for more details.\r
+\r
+ You should have received a copy of the GNU Lesser General Public\r
+ License along with this library; if not, write to the Free Software\r
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\r
+\r
+Also add information on how to contact you by electronic and paper mail.\r
+\r
+You should also get your employer (if you work as a programmer) or your\r
+school, if any, to sign a "copyright disclaimer" for the library, if\r
+necessary. Here is a sample; alter the names:\r
+\r
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the\r
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.\r
+\r
+ <signature of Ty Coon>, 1 April 1990\r
+ Ty Coon, President of Vice\r
+\r
+That's all there is to it!\r
+\r
+\r
-This is the Change Log for PHPlot.
-The project home page is http://sourceforge.net/projects/phplot/
------------------------------------------------------------------------------
-
-2011-01-15 (lbayuk) ===== Released as 5.3.1 =====
- * phplot.php: Updated version
- * README.txt: Updated for new release
- * NEWS.txt: Add text for new release
-
-2011-01-09
- * Fixed some style / indent errors, and 1 redundant test.
-
-2011-01-03
- * For bug 3143586 "Multiple plots per image - fixes & docs":
- Make sure there is a documented way to reset PHPlot feature
- settings, especially those for which the default settings result
- in automatic calculated values. Where possible, calling a Set*()
- function with no arguments should reset the feature to defaults.
-
- + Changed SetLegendPixels() arguments to be optional with default
- NULL meaning reset to automatic positioning.
-
- + Fixed SetXAxisPosition() and SetYAxisPosition() to accept empty
- string '' to mean reset to default automatic positioning.
- Make arguments optional, defaulting to empty string.
-
- + Changed SetNumXTicks() and SetNumYTicks() arguments to be
- optional with default empty string '' meaning reset to
- of automatic calculation.
-
- * Changed SetPointShapes() to use CheckOptionArray(). This
- simplifies the function with no change in operation.
-
- * Extend copyright years to 2011.
-
-2010-12-30
- * Fix for bug 3147397 "Data colors missing with multiple plots":
- + Do not truncate the data_colors and related arrays, so the full
- set of colors will be available for subsequent plots on the image.
- (Color indexes are still allocated in the image only as needed.)
- + New internal functions GetColorIndexArray() and
- GetDarkColorIndexArray(), replacing previous use of array_map().
- + Removed internal function truncate_array() - no longer used.
- + Changed SetColorIndexes(), NeedDataDarkColors(), and
- NeedErrorBarColors() to only allocate the color indexes that will
- be needed (instead of allocating all colors in the truncated color
- descriptor arrays).
-
-2010-12-28
- * Instead of throwing an error, SetLegend(NULL) now clears the legend
- array. This can be useful with multiple plots on an image. Before
- this change, only SetLegend(array()) did that (possibly by accident).
-
-2010-12-27
- * Do not have SetDefaultStyles() call deprecated SetLabelColor().
-
- * Fixes for bug 3143586 "Multiple plots per image - fixes & docs":
- + Fix DrawLegend so it doesn't forget that the legend position
- was specified in world coordinates. This fixes the legend
- position for plots after the first.
- + Don't draw the image border more than once (although this would
- probably have no impact on the resulting image). This parallels
- the behavior for the main plot title and the image background.
- Replaced member variables background_done and title_done with a new
- member array done[] which will track when these elements were done.
-
-2010-12-06
- * Fix comments above CalcPlotAreaWorld(). Deleted incorrect information
- from before data-data-yx existed, and before DecodeDataType rewrite.
-
-2010-12-04 (lbayuk) ===== Released as 5.3.0 =====
- * phplot.php: Updated version
- * README.txt: Updated for new release
- * NEWS.txt: Add text for new release
-
-2010-12-03
- * Feature request 3127005 "Ability to suppress X/Y axis lines":
- Added SetDrawXAxis() and SetDrawYAxis() to control flags which
- will suppress drawing the X or Y axis lines. (These lines were
- probably the only PHPlot elements that could not be turned off.)
- Changed DrawXAxis() and DrawYAxis() to conditionally draw the
- axis lines.
-
-2010-11-28
- * Feature request 3117873 "Data value labels in more plot types":
- Implemented Data Value Labels for plot types points, lines,
- linepoints, and squared. Added 2 class variables which can be
- set to control the distance and angle of the labels from points.
- New internal function CheckDataValueLabels() calculates position
- and text alignment for these labels.
-
- * Updated comments for Set[XY]DataLabelPos to match the text in
- the manual, which was rewritten to clarify label types.
-
-2010-11-23
- * Code cleanup. Moved some functions around to group "plot drawing
- helpers" separately from "plot drawing". No changes to operation.
-
-2010-11-21
- * Feature request 3111166 "Control legend colorbox width":
- Added a class variable legend_colorbox_width which can be changed
- to make the colorboxes wider or narrower.
-
-2010-11-16
- * Feature request 3093483 "Investing support chart types":
- Added 3 new plot types: Basic OHLC (Open/High/Low/Close), Candlesticks,
- and Filled Candlesticks. Implemented with one new function to handle the
- 3 new plot types: ohlc, candlesticks, and candlesticks2.
-
-2010-11-11
- * Moved information about plot types into a new static member array
- plots[]. (This is an internal change with no impact on usage, but will
- make it easier to add new plot types.) SetPlotType() no longer needs a
- list of plot types to check, FindDataLimits() does not need to check for
- specific plot types to to process the data array, and DrawGraph() uses
- data from the array rather than knowing about all the plot types.
-
-2010-10-31
- * Changed internal CalcBarWidths() to take two arguments which indicate
- how it should calculate bar widths, rather than having it check the
- plot_type directly. (Taken from another, experimental change. This
- minimizes places where plot_type is directly used.)
-
-2010-10-03 (lbayuk) ===== Released as 5.2.0 =====
- * phplot.php: Updated version
- * README.txt: Updated for new release
- * NEWS.txt: Add text for new release
- * Makefile: Removed HorizontalBars.txt from release. This is now all
- documented in the reference manual.
-
-2010-10-01
- * Rewrite color handling. Default and specified colors are now validated,
- converted to RGBA arrays, and saved. The colors indexes are not
- allocated until graph drawing time. Unneeded colors are not allocated.
-
- Fix bug 3045131 "SetTransparentColor problems": Transparency setup is
- deferred to graph drawing time, after most other colors are allocated.
- Fixes SetTransparentColor order dependency, and works with data colors.
-
- Fix bug 3049726 "Optimize color allocation": Colors allocation is
- deferred to graph drawing time, and colors for most elements are only
- allocated if needed. In particular, the data colors and dark colors,
- which used 32 slots, now only get defined as needed.
-
- Feature request (partial) 3077554 "Finer control over plot element
- colors": The colors of the main, X, and Y titles can now be controlled
- separately.
-
- Change details:
- New internal functions:
- GetColorIndex(), GetDarkColorIndex()
- Allocate pre-parsed colors for elements.
- SetColorIndexes()
- Does the deferred color allocation and defaults.
- NeedDataDarkColors(), NeedErrorBarColors()
- Called by graph drawing functions if those colors are needed.
- GetDataColor(), GetDataErrorColors(), GetBarColors()
- Custom or standard data color assignment for most plot types.
- truncate_array()
- Shorten an array. Used to limit data color allocation.
-
- Removed internal functions:
- SetIndexColor(), SetIndexDarkColor()
- Unneeded. Color handling is now in two separate phases.
-
- Removed internal member variable:
- data_colors_alpha
- PHPlot no longer calls SetDataColors before plotting, so this
- variable is not needed to preserve the default alpha.
-
- New internal member variables:
- transparent_color
- Saves color value from SetTransparentColor. For bug 3045131.
- x_title_color, y_title_color, ndx_x_title_color, ndx_y_title_color
- For title colors. DrawXTitle and DrawYTitle use them now.
-
- Changed internal member variables:
- i_border, plot_bg_color, bg_color, label_color, text_color, etc.
- All variables for colors now always hold a parsed 4-component
- (RGBA) color specification as an array, and are no longer
- statically initialized to a color name.
-
- New public functions:
- SetXTitleColor(), SetYTitleColor()
- These can be used to make the 3 titles have different colors.
-
-2010-09-26
- * Don't let SetXDataLabelPos() accept 'xaxis' or 'all' as valid.
- Don't let SetXTickLabelPos(), SetYTickLabelPos() accept 'all' as valid.
- These were never implemented and never documented.
-
-
- * Feature request #3073679 "Stacked bar plots with negative values":
- Allow stacked bar plots (vertical and horizontal) to work with negative
- values. Changed FindDataLimits() to not take abs() values for
- stackedbar when calculating the data range. Changed DrawStackedBars()
- and DrawHorizStackedBars() to handle negative values, including proper
- label positions. The first non-zero value in a row sets the direction
- of the bar. Mixing positive and negative values within a row works but
- the results are not useful.
-
- * New internal DrawBar() moves common code from 4 bars and stackedbars
- drawing functions and makes it easier to deal with shading vs bar
- direction.
-
-2010-09-24
- * Fix bug 3074402 "Fix Y axis default for horizontal plots":
- Make the default axis positions symmetrical for vertical plots
- (X and Y) and horizontal plots (Y and X). This fixes the problem
- with horizontal bar/thinbarline plots that have negative data,
- where the Y axis stayed on the left and the bars went rightward.
-
-2010-09-01
- * Fix bug 3056991 "Internal methods should be 'protected'":
- Changed CheckDataArray(), number_format(), FindDataLimits(), and
- DrawBackground() to be 'protected'. The test suite no longer calls
- these directly. For SetIndexColor(), SetRGBColor(), DrawText(),
- SizeText(), xtr(), and ytr(), left these as public with a comment
- indicating they should be treated as protected.
-
- * Fix bug 3057000 "Review 'deprecated' methods":
- + Changed deprecated method SetNewPlotAreaPixels() to just call
- SetPlotAreaPixels(). It was suspicious as coded, and was found
- to be equivalent to SetPlotAreaPixels().
- + Removed SetColor(), which didn't do anything. It was calling
- SetRGBColor and discarding the result. After reviewing the
- history of this in all CVS versions, it does not seem to have
- ever been coded correctly, so there is no harm in removing it.
- + All other deprecated methods seem OK and are left as is.
-
-2010-08-30 (lbayuk) ===== Released as 5.1.3 =====
- * phplot.php: Updated version
- * README.txt: Updated for new release
- * NEWS.txt: Add text for new release
-
-2010-08-27
- * Fix bug 3051832 "Let PHP/GD find the font file":
- Instead of checking for file existence, PHPlot now uses a non-drawing GD
- operation to validate a TrueType font in SetFontTTF(). This allows GD to
- use its internal search path, making it likely that fonts can be found
- without needing a platform-dependent path in your script. Full paths
- will still work, so there is no compatibility issue.
-
- * Fix bug 3051906 "Better choice for default TT font":
- Removed "benjamingothic.ttf" as the default TT font setting. This has
- not been included in PHPlot since 2004. Changed SetFontTTF() to call
- new GetDefaultFontTTF(), which will try a number of sans-serif font
- names the first time it needs a default TT font. Considering the above
- fix to finding fonts, this has a good chance of finding a working
- font. It is known to work on Windows and some Linux distributions.
-
-2010-08-19
- * Makefile: Removed phplot_data.php from list of files to release.
- Reference bug report 3048267. This file has not been maintained or
- tested, and has bugs. It will remain in CVS, but not be included
- in PHPlot releases.
-
-2010-08-17
- * Change new DrawLinePoints(). It does not have to check and
- handle error bar plots, as DrawDots and DrawLines will do that.
-
-2010-08-16
- * Rewrote DecodeDataType(). Previous implementation was hard to
- extend and inefficient. Now it uses new class variables (not a
- returned array) and is only called once, by DrawGraph. Changed all
- users of data_type to use the new variables.
-
- In CheckDataArray(), calculate data_columns properly for
- text-data-single data type (pie chart) too. Simplify DrawPie
- to use this, and merge 2 of the 3 cases.
-
- Have a single function handle each plot type, so it can properly
- check the data type and report a correct error message showing
- all supported types. For example, DrawBars is now the entry point
- for both bars and horizontal bars; DrawGraph does not directly
- call DrawHorizBars. Similar for DrawStackedBars and
- DrawHorizStackedBars. Lines, Points, and Linepoints also now
- have a single function each, dispatching to others as needed.
- (These changes were split off from an upcoming, larger change.)
-
-2010-08-14
- * Fixes to SetDataValues: need to clear out the 2 arrays before
- setting values in a loop, else if the function is used more than
- once then old values will remain.
- Move records_per_group calculation outside the loop.
- (These were split off from upcoming, larger changes.)
-
- * Part 4 of horizontal plots: implement horizontal thinbarline plots.
- Added new data type 'data-data-yx' (label, Y, X1, X2, ...).
- DrawThinBarLines() now draws either vertical or horizontal plots, and
- supports data types text-data, data-data, text-data-yx, data-data-yx.
-
- Fixed DecodeDataType() to handle text-data-single too, for completeness.
-
- * Fix for over-padding style and color arrays. These were padded to
- records_per_group, but that is the maximum data array row size.
- The number of actual data sets is less, and depends on the data type.
- Calculate the correct number as data_columns at the top of DrawGraph,
- and use that to pad the arrays. Also moved early error checking in
- DrawGraph() into new CheckDataArray().
-
-2010-08-09
- * Code cleanup. This is a large change to unify the comment and
- coding stye used in PHPlot. The PEAR style guide is being used
- as a reference, but PHPlot will never be 100% compliant.
- This patch introduces no functional changes at all.
- - Limit line length to 110.
- - Remove obsolete, partially implemented Doxygen comments.
- - Add descriptive comment above functions where missing.
- - Use consistent comment markers and control structure spacing.
- - Remove ctags-confusing end of function comments.
- - Rewrote a few if/else blocks for cleaner logic.
- - Re-order some functions for consistency (X, then Y).
-
-2010-08-04
- * Implemented horizontal stacked bar plots:
- Use the same data type introduced for horizontal bars, 'text-data-yx',
- and the same plot type 'stackedbars', to make a horizontal stacked bar
- plot. Data value labels, both at the ends of the bars and within the
- bars ('plotstack' labels) are available with horizontal stacked bars.
-
- * Internal function DrawDataLabel() is replaced by DrawDataValueLabel(),
- with different usage. The new function can also check to see if a label
- fits in the allocated space.
-
- * Fixed the text size check in stacked bar plots for data value labels
- within the bars. The check only worked correctly for 0 degree labels. It
- now works with any text angle. It suppresses the label if it is too high
- (for vertical stacked bar plots) or too wide (for horizontal stacked bar
- plots) to fit in the bar segment to which it belongs. Note that it only
- checks in the bar direction. If the text is too wide (for vertical bars),
- or too high (for horizontal bars), it will still be plotted, but will
- cross the sides of the bar.
-
-2010-07-28
- * Allow callbacks to return a value (to support new data_color callback).
- * Feature request 3034164 "Extended control of data colors":
- Define new callback 'data_color' for picking the data color.
- Changed internal plot drawing functions DrawDots, DrawLines, DrawSquared,
- DrawBars, DrawStackedBars, DrawDotsError, DrawThinBarLines,
- DrawLinesError, and DrawHorizBars to use the data_color callback
- (if defined) to select the data colors.
- * SetRGBArray code cleanup (no functional changes).
-
-2010-07-27
- * Fixes for error bars:
- Code cleanup in DrawYErrorBar(), with no functional change.
- Suppress duplicate drawing of error bars with 'linepoints' error plots.
- This was already fixed for data labels. Now error bars will only be
- drawn by the 'points' part, not the 'lines' part. There should be no
- visible changes to plots. (This is needed for a future change).
-
-2010-07-26
- * Horizontal bar charts (still an experimental feature) can now have data
- value labels.
- * HorizontalBars.txt: Fix incorrect description of bar direction. Add
- text explaining the new data value labels.
-
-2010-06-29 (lbayuk) ===== Released as 5.1.2 =====
- * phplot.php: Updated version
- * README.txt: Updated for new release
- * NEWS.txt: Add text for new release
-
-2010-06-26
- * Feature request 2885930 "Horizontal Bars":
- Horizontal bar charts are implemented, as an experimental feature.
- A new data type 'text-data-yx' was added, which works with
- 'bars' plot type to produce a horizontal bar chart from a data
- array with X values for each Y value. Changes were made to
- FindDataLimits, CalcMargins, CalcPlotAreaWorld, CalcBarWidths,
- and CalcMaxDataLabelSize to handle the new data type. Other
- changes were made to handle label position defaults and grid
- defaults. New drawing functions were added for horizontal bars.
-
- * HorizontalBars.txt: new documentation file for experimental feature.
- * Makefile: List new documentation file.
-
-2010-06-25
- * Each plot-type drawing function now checks that it is getting a data
- type that it knows how to handle. A new internal function unifies the
- checking and error message. (This is associated with an upcoming,
- bigger change.)
-
- Compatibility: If you were using an invalid data type for a plot type
- whose function did not check, will now get an error.
-
- * Removed some dubious code from DrawLines() and DrawSquared() and
- rewrote comments there. The code initialized lastx[0] and lasty[0],
- but lasty was mapped using the X (rather than Y) function. This was
- obviously wrong, but closer inspection showed that the values were
- never, used so the code was removed.
-
-2010-06-13
- * Truecolor.txt: removed
- * Makefile, README.txt: Removed reference to Truecolor.txt. Full
- documentation for truecolor images is now in the Reference Manual.
-
-2010-06-02
- * Fix bug 3010116 "Bad rendering of title in multi-plot image
- when using TTF":
- Make sure the main title is drawn only once. (If drawn multiple
- times with TrueType font text, the anti-aliasing effects result
- in poor quality text.)
-
-2010-05-31
- * Improvements to truecolor support (from feature request 2947679):
- Truecolor support is now better integrated. The derived class only
- has the constructor now, and the base class itself provides the alpha
- color component support through the internal functions SetIndexColor(),
- SetIndexDarkColor(), and SetRGBColor(). This means alpha channel
- works with palette images too (in so far as GD supports this).
-
- * Truecolor.txt: Updated per changes to truecolor support.
-
- * Image tiling with mode 'scale' in tile_img(), used with image and
- plot area backgrounds, now uses imagecopyresampled() rather than
- imagecopyresized(). They are the same with palette images, but the
- resampled copy gets better results with truecolor images.
-
-2010-05-29
- * Feature request 3002606 "Add to plot and image border options":
- Added options 'right', 'top', and 'bottom' to SetPlotBorderType()
- (existing options are 'left', 'sides', 'none', and 'full'). This
- now also accepts an array of the above options, giving complete
- control over which sides to draw.
- Added option 'solid' to SetImageBorderType() to use the actual
- color set with SetImageBorderColor(), rather than the darker
- shade as type 'plain' does (for some reason).
- New function SetImageBorderWidth() sets the width of the image
- border. The image border width is now accounted for in margin
- calculations, although existing plots will not change.
-
-2010-04-04 (lbayuk) ===== Released as 5.1.1 =====
- * phplot.php: Updated version
- * README.txt: Updated for new release
- * NEWS.txt: Add text for new release
-
-2010-04-01
- * Remove & from argument in SetDataValues(). The data array is not
- modified and does not need to be passed by reference. (There is
- no performance advantage, either.)
-
-2010-03-29
- * Feature request 2947679 "Support for alpha blending/Truecolor":
- Implemented truecolor image support with a new class
- PHPlot_truecolor, extended color specifications to allow
- specification of an alpha value, and added a new optional parameter
- to SetDataColors for a default alpha value for all data colors.
- This feature is *EXPERIMENTAL* (see next item).
-
- * Truecolor.txt: New file, documentation for the new truecolor capability.
- (The Truecolor feature is experimental, which means it is subject to
- change in incompatible ways and the documentation has not yet been
- incorporated into the PHPlot Reference Manual.)
-
- * Makefile: Include new documentation file in release.
-
-2010-03-26
- Fixed bug 2976735 "Improvements and fixes for 'area' plots":
- Rewrote DrawArea() function which handles 'area' plot.
- Part 1: This is related to feature request 2947679, Truecolor support
- with transparency. The area plot function was filling each area from the X
- axis up to the Y value, resulting in area overlaps. This wasn't a problem
- with opaque colors, but with transparency, the overlapping areas resulted
- in changed colors. The rewritten function fills the area between each line
- instead of from each line down to the X axis. Plots with opaque colors
- will not change.
- Part 2: Area plots now work when the X axis is moved up with
- SetXAxisPosition().
- Part 3: Fixed FindDataLimits() for area (and stackedbars too) to
- take absolute values of Y values. The drawing function was doing this,
- but not FindDataLimits, resulting in incorrect limits if any Y<0.
- Part 4: The rewritten DrawArea() also handles a new plot type
- 'stackedarea'. This is an area plot where the Y values are stacked,
- similar to 'stackedbars'.
- Note: As part of the changes, it is now an error to try an area plot
- with an unequal number of Y points for each X.
-
-2010-03-23
- * Feature request 2973995 "Add y-Data to Stackedbars":
- Implemented Y Data Labels for Stacked Bar charts (stackedbars).
- The labels are enabled with SetYDataLabelPos, same as with bar charts.
- There are two types of labels: above the stack with the total, and
- within the bars at each segment. 'plotin' turns on the upper ones, and
- 'plotstack' turns both on.
-
- * Other changes:
- + Removed unimplemented second argument to SetYDataLabelPos.
- + Fixed questionable logic in SetYDataLabelPos when given an argument
- that belongs with SetYTickLabelPos.
- + Fix comments at top of plot-type Draw functions.
-
- * Fix for bug 2974639 "Stacked bars plot breaks with X axis != 0":
- Stacked bar plots with non-zero X axis position no longer break apart
- into segments with gaps. The bars are drawn up from the X axis, and
- any segments or partial segments below the X axis are not drawn.
-
-2010-03-22
- * Change related to feature request 2947679 - Fix 'dot' point shape:
- Use imagefilledellipse(), not imagefilledarc(), when drawing the 'dot'
- point shape. The fix was needed for future support of truecolor images
- with transparency, but filled dots from imagefilledellipse() look
- better (rounder) with regular images and opaque colors.
- Credit to mvaldez for identifying the problem and providing the fix.
-
-2010-03-04
- * Fix for bug 2963757 "point_counts undefined error in 5.1.0":
- Fixed CheckPointParams so it sets point_counts even when the point shape
- and point size arrays are already the same size and do not need padding.
-
-2010-01-26
- * Fix for bug 2938219 "Bars go in wrong direction":
- Fixed CalcAxisPositions() to be consistent in positioning the X axis.
- When all Y values are <0 and the Y=0 line is not part of the plot range,
- PHPlot will now default the X axis to the top of the plot, not the
- bottom. This fixes the problem with bars to negative Y values being
- drawn downward if Y=0 is visible, but upward if Y=0 is not visible.
- This also affects thinbarline plots.
- Credit to lauryn1298 for finding the bug.
-
-2009-12-24 (lbayuk) ===== Released as 5.1.0 =====
-
-2009-12-18
- * Change for bug 1795971 "Fix default data colors":
- The default Data Color and Error Bar Color arrays now have 16
- different colors, no duplicates, and nothing so light that it
- is invisible.
- Using '' or False as the argument to SetDataColors, SetErrorBarColors,
- and SetDataBorderColors now re-initializes the map to the defaults.
- This was previously undocumented, and in some cases set the map to
- something different from the default.
-
-2009-12-15
- * Cleanup: Remove DrawAxisLegend() - empty function marked TODO,
- not really clear what it was meant to do.
-
-2009-12-14
- * Fix for bug 2914403 "Pie + X/Y titles: Undefined property error":
- In DrawGraph(), don't try to draw X or Y titles for pie charts.
-
- * Feature request 2899921: "allow different format for data and tick
- labels"; Bug 2906436: "Fixes for X Tick Labels vs X Data Labels",
- and partial implementation of changes from user 'adoll' regarding
- tick vs data labels:
-
- New public functions:
- + SetXDataLabelType() : Sets formatting for X Data Labels
- + SetYDataLabelType() : Sets formatting for Y Data Labels (bar charts)
- + SetXDataLabelAngle() : Sets text angle for X Data Labels
- + SetYDataLabelAngle() : Sets text angle for Y Data Label (bar charts)
- The defaults for these are set up to be fully backward compatible
- with previous releases of PHPlot (except see the next item).
-
- Re-used function name SetXDataLabelAngle():
- + This has been deprecated and undocumented since 2003-12-07, and
- used to just call SetXLabelAngle(). For new behavior, see above.
-
- Changes to public functions:
- + SetXDataLabelPos() and SetXTickLabelPos() no longer cancel each
- other out (set the other control variable to 'none'). Instead,
- they are both considered before plot drawing.
-
- Changes to internal functions:
- + DrawDataLabel() now uses the font, angle, and color arguments as
- provided, and does not substitute values if they are empty.
- + SetLabelType() now takes mode='xd' and 'yd' for X Data and Y Data
- label formatting; 'x' and 'y' are for tick labels only now.
- + Functions that work on Data labels now call FormatLabel() with the
- new mode parameter value 'xd' or 'yd, and use the new
- data_label_angle variables.
- + New CheckLabels(), used by DrawGraph to process label parameters.
- + CalcMargins() - Rewritten to handle changes to Tick and Data labels.
-
- Changes to internal class variables:
- + New: x_data_label_angle, y_data_label_angle
- + Do not initialize x_tick_label_pos or x_data_label_pos, so that
- CheckLabels() can tell if they were set or not and apply defaults.
- + Initialize y_data_label_pos to 'none', not 'plotleft'.
- + Add 2 more indexes to label_format[] array: 'xd' and 'yd'.
-
- * Cleanup:
- + Delete unused internal class variable: draw_y_data_label_lines
- + Delete unused function SetDrawYDataLabelLines()
-
-2009-12-07
- * Fix bug 1795972 "Fix default point shapes":
- + Added 10 new point shapes to the existing 10 shapes.
- + Changed the default point shape from all 'diamond' to a
- selection of up to 10 different shapes.
- + Fixed bug in the code that tried to set the point shapes
- and sizes arrays to be the same size. This was not working,
- resulting in unexpected point sizes.
- + Changed default point size to 6 for all shapes. It was trying
- to be "5, 5, 3" but due to several bugs this was not working.
- + Do not adjust shape sizes to even numbers (was done for only two
- shapes). Instead, consistently truncate size/2 when needed.
- NOTE: These may change the look of 'points' and 'linepoints' plots.
-
- * Changed startup initialization code:
- + SetDefaultStyles() was doing some odd things using a variable
- called "session_set", with comments referring to non-existent
- session support code. This has been removed. There should be
- no visible changes from this. PHPlot does not use PHP sessions.
-
-2009-12-04
- * Fix for bug 2908256, errors in pie charts with bad data array:
- (From a Drupal contrib module report by thekevinday.)
- With pie charts only, a data array with no valid Y values resulted
- in PHP error messages. All other plot types handle this by producing
- an image without a graph.
- Fixed DrawPieChart to behave this way too. If there are no valid Y
- values, or if the sum of all Y values is 0, do not error out, but
- don't draw a pie chart either.
- Also, pie charts now ignore non-numeric Y values, like other plot types.
-
-2009-11-20 (lbayuk)
- * Fix for bug 2900914 "Problem with display of 0 on Y axis":
- Changed how X and Y values are stepped by tick intervals, to avoid
- cumulative round-off error. This fixes the problem when Y crosses 0 with
- a tick step such as 0.1 resulting in a long label for a very small but
- non-zero number. Fixed DrawXTicks, DrawYTicks, and CalcMaxTickLabelSize.
- (Originally reported by cncnet)
-
-2009-11-19 (lbayuk)
- * Improve support for using callbacks to annotate plots:
- Added new callback 'draw_all', called after all drawing.
- Supply plot_area[] as argument to some drawing callbacks.
- Added new method GetDeviceXY() to translate from world coordinates.
- Allow NULL or '' for $font in DrawText() internal method, meaning to
- use the generic font. If callbacks want to use DrawText, this
- avoids them having to reference the internal fonts[] array.
-
-2009-11-01 (lbayuk)
- * Address bug report 2886365 "Declare all functions and variables in
- PHP5 style"
- PHP5 deprecates the use of 'var' to declare a class member variable.
- All initialized class member variables are now declared 'public'.
- (It was tempting to make most or all 'protected' or 'private', but
- that would likely break too much, including the PHPlot Test Suite.)
-
- Most class member functions which are meant for internal use only are
- now declared 'protected', so they cannot be called from scripts
- (except in child classes). (Note PHP5 does not deprecate the use of
- just 'function' to mean public, so public functions were not changed.)
- Internal functions are those documented in the manual under Developer's
- Guide, Internal Functions. If your code breaks because you are using
- a method which is now protected, please post the details on the help
- forum.
-
- Some member variables which were set in the constructor are now
- initialized with the class instead. (No impact.)
-
- Removed commented-out, FIXME-noted code for interim labels.
-
-2009-10-12 (lbayuk)
- * Bug report 2839547, allow SetImageBorderType('none') to reset the image
- border type. Also checked for other cases where there is no reset;
- found one that exists (Set[XY]LabelType) but needs to be documented.
-
-2009-07-09 (lbayuk)
- * Added a hook $plot->locale_override which can be set to True to prevent
- PHPlot from loading locale settings from the environment with
- setlocale(LC_ALL, ''). This is necessary for testing PHPlot on Windows,
- where you cannot force a locale with an environment variable. It might
- also be needed for people who want PHPlot's locale to differ from the
- web server's locale.
-
-2009-06-12 (lbayuk) ===== Released as 5.0.7 =====
-
-2009-06-11 (lbayuk)
- * Change PHPlot license to LGPL, per Afan.
- phplot.php, phplot_data.php - Change license notice.
- rgb.inc.php - Change top comments and remove bottom marker.
- COPYING - new file, text of LGPL.
- LICENSE.* - removed files - old licenses.
- Makefile - change list of distributed files.
-
- * Fix for bug 2803900: SetRGBArray('large') does not work. The include
- file defined a different array name than the main script expected.
- (This bug seems to have happened over 8 years ago.) Fixed the array
- names to match. Also removed the ./ prefix from the included filename
- so it will be found if on the include path but not in the script
- directory. Also added error check if the rgb.inc.php include file
- is needed and not found.
-
-2009-05-25 (lbayuk)
- * Added new feature to allow partial margin or plot area specification.
- You can omit, or specify as NULL, any of the 4 arguments to
- SetMarginsPixels() or SetPlotAreaPixels(), and this means PHPlot
- should use the automatically calculated margin on that side.
- Credit to adoll for this feature.
-
-2009-05-17 (lbayuk)
- * Fix for bug 2791502 "Error plots treat missing Y values as 0":
- Plots with data type data-data-error now support missing Y values,
- instead of treating them as 0. This works with lines, points,
- and linepoints plot types, and also honors SetDrawBrokenLines.
-
-
- * Fix for bug 2792860 "Wrong DataLabelLines with missing Y":
- Do not draw X Data Label Lines at points with missing Y values.
-
-
- * Fix for bug 2786350 "Missing Y data results in bad auto-range":
- Rewrote FindDataLimits to ignore missing Y values, rather than
- treating them as if 0, for calculating range.
- Bug report and analysis by mrten.
-
- * Fix for bug 2786354 "Incorrect auto-range for data-data-error":
- For data-data-error data type, apply the positive and negative error
- amounts for each Y point to that point only, rather than applying the
- largest errors to the overall minimum and maximum Y value for the row.
-
- Note: The two fixes above can change existing plots which rely on
- automatic Y range calculation. The first fix affects plots with
- missing Y values and min(Y)>0. The second fix can affect plots using
- data-data-error data type and different error values for different
- points. In both cases the new Y range can be smaller than before.
-
-2009-01-20 (lbayuk) ===== Released as 5.0.6 =====
-
-2009-01-18 (lbayuk)
- * Fix for bug 1891636 "Misaligned TTF X Labels":
- PHPlot was using the actual bounding box of each line of text
- to allocate space and set the text positioning, but was ignoring the
- fact that the text baseline is not the same as the bottom of the
- bounding box. This resulted in uneven alignment of the X labels if
- they had different heights (for example, month names Jul and Aug).
-
- PHPlot now calculates the size of text for allocation (SizeText) using
- the descenders on the last line, and calculates the size for drawing
- (DrawText) only to the baseline. PHPlot also now uses a fixed line
- spacing for each line of text in a font, rather than the actual text
- height. This allows separately drawn multi-line labels to align.
-
- * Changes to line spacing when using multi-line labels:
- PHPlot was using the class variable line_spacing to mean the
- number of pixels between lines of multi-line labels. This made the
- spacing too small for larger fonts, and it was not possible to adjust
- line spacing for different types of text.
-
- PHPlot now interprets line_spacing as the number of pixels only
- for GD text, and as a scale factor for the font's built-in line
- spacing for TrueType text. In addition, a new optional argument is
- added to SetFont, SetFontGD, and SetFontTTF to set a line spacing
- specific to that type of text.
-
- * Changes had to be made to the legend drawing code to accommodate the
- changes to font handling.
-
- Note: The line spacing change results in slightly looser spacing on
- multi-line TrueType text labels, and slightly taller legends, compared
- to version 5.0.5.
-
-2008-09-21 (lbayuk)
- * Interim fix for bug 1932571 "Data-Data Plot fails with same X values".
- PHPlot will no longer hang when the range of X values is 0 (that is, when
- x_min == x_max). It will arbitrarily set an X range of 1, so the
- calculated tick step is not 0. This is a temporary fix. Work on a smarter
- X and Y range calculation is in progress, which will handle edge cases
- like this better, but it isn't ready and this bug has been open too long.
- Credit to andyl for finding the bug.
-
- * Fix font path: Use DIRECTORY_SEPARATOR constant not '/'.
-
- Extended the label formatting capabilities, adding 'printf' and 'custom'
- types, added a prefix and suffix for 'data' type, and allow format controls
- to be included in SetXLabelType and SetYLabelType.
-
- External changes:
- * Added 'printf' label type. The caller specifies the print format as the
- 2nd argument to SetXLabelType or SetYLabelType (default '%e').
- $plot->SetXLabelType('printf', '%5.2f');
-
- * Added 'custom' label type. The caller supplies a callback (typically a
- function name) and optional pass-through argument as the 2nd and 3rd
- arguments to Set[XY]LabelType. The function is called as $f($value, $arg)
- to return the formatted $value.
- $plot->SetXLabelType('custom', 'myfunction', $arg_value);
-
- * In addition to Set[XY]TimeFormat, the format string for type 'time' can
- now be set as the 2nd argument to Set[XY]LabelType.
- $plot->SetXLabelType('time', '%H:%M');
-
- * In addition to SetPrecision[XY], the precision for type 'data' can now be
- set as the 2nd argument to Set[XY]LabelType. A 3rd and 4th argument
- can supply a prefix and suffix for 'data' formatting. (All optional)
- $plot->SetXLabelType('data', 2, '$', 'US');
-
- Internal changes:
- * Class variables x_precision, y_precision, x_label_type, y_label_type,
- x_time_format, and y_time_format have been removed.
-
- * New class array variable label_format[], with elements 'x' and 'y' which
- are arrays for label formatting. Elements in the sub-arrays are not
- initialized until needed.
-
- * New function SetLabelType, which implements Set[XY]LabelType now.
-
- * FormatLabel() was rewritten to support the new label formatting.
-
- Compatibility:
- * Any code that directly references class variables related to label
- formatting will break, except for data_units_text. Use the documented
- function methods instead. Setting data_units_text as a suffix is
- deprecated but still works.
-
- * The 'data' type precision for 'Y' is still used for pie chart labels.
-
-2008-07-12 (lbayuk)
- Multiple comment spelling error fixes. No functional changes.
-
-2008-07-06 (lbayuk)
- Changes to allow mixing GD fixed-font text and TrueType Font (TTF) text
- on the same plot.
- (This change came from work done trying to fix TTF text positioning,
- where it looks like additional information needs to be stored for TrueType
- fonts. The old font data structure was awkward to extend, and allowing
- mixed GD/TTF text was on the to-do list anyway.)
-
- External changes:
- * SetFontGD(), SetFontTTF(): New functions to set a font, with type.
- * SetFont(): Now calls SetFontGD or SetFontTTF depending on $use_ttf.
- These changes should be fully compatible with existing programs.
-
- Internal changes:
- * Updated comments explaining SetUseTTF() now sets the default type
- (not the only type) of text used.
- * Put all the font data into a class array. (Replaces $this->generic_font
- with $this->fonts['generic'], etc.)
- * ProcessTextGD() and ProcessTextTTF() now take the font array as one
- argument, rather than separate arguments for font path and size.
-
-2008-01-13 (lbayuk) ===== Released as 5.0.5 =====
- * phplot.php: Updated version
- * README.txt: Updated for new release
- * NEWS.txt: Add text for new release
- * Makefile: Remove 'Callbacks' from release target, as this material is
- now in the reference manual.
-
-2008-01-07 (lbayuk)
- Copyright updated to 2008 and PHP4 no longer listed as supported.
-
- Major rewrite of the margin calculation functions to address multiple
- problems. Fixes for bugs 1856207 "Margin error with 'xaxis'/'yaxis'
- position, 1843012 "Make margins, drawing consistent", and 945439
- "x_tick_label_height not set correctly".
-
- Note: These changes are inter-dependent and cannot be split up.
-
- * Defer all calculations to DrawGraph time, to eliminate order dependencies.
- These functions now just store their arguments in the object, and all
- calculations happen later:
- + SetXAxisPosition, SetYAxisPosition
- + SetMarginsPixels
- + SetPlotAreaPixels (Stores margins, not area, now.)
- + SetPlotAreaWorld
- + SetXTickIncrement, SetYTickIncrement
-
- * A new callback 'debug_scale' was added to trace the margin and scale
- calculations.
-
- * CalcMargins was rewritten. Actual sizes of tick and data labels are now
- used, rather than guesses like "use size of biggest Y value". A minimum
- value (3 x safe_margin, or 15 pixels) applies to each margin.
-
- * FindDataLimits no longer needs to find the longest data label, since
- CalcMargins now does that more precisely.
-
- * DrawXTitle and DrawYTitle now use position offsets calculated by
- CalcMargins. Note: These titles are now offset from the plot area,
- not the image area. The titles will move if you had set the plot area
- or margins.
-
- * DrawYTick, DrawXTick rewritten to use pre-calculated offsets, and common
- code moved to new CalcTicks().
-
- * DrawXDataLabel: Use pre-calculated offsets for text.
-
- * DrawGraph: Rewrote top section (before drawing anything) to do the
- calculations in the proper order, unconditionally.
-
- * Class variables removed:
- x_label_inc, y_label_inc, _x_label_cnt : These were never used.
- title_height, x_title_height, y_title_width : Now internal to CalcMargins.
- data_limits_done : No more need to remember if FindDataLimits called.
-
- * New class variables added:
- plot_margins_set : Keeps track of user-set plot area or automatic.
- x_label_top_offset, x_label_bot_offset, x_offset_axis_offset,
- y_label_left_offset, y_label_right_offset, y_label_axis_offset,
- x_title_top_offset, x_title_bot_offset,
- y_title_left_offset, y_title_left_offset : Label offsets
-
- * New internal functions:
- CalcPlotAreaPixels : Deferred calculations taken out of SetPlotAreaPixels
- and SetMarginsPixels.
- CalcPlotAreaWorld : Deferred calculations taken out of SetPlotAreaWorld.
- CalcAxisPositions : Calculate axis positions, moved from CalcTranslation.
- CalcTicks : Calculate X and Y tick interval. This still uses the
- same simple method (basically range/10), but now we could drop in a new
- algorithm much more easily. This is now also used by CalcMargins.
- Code taken out of DrawXTicks and DrawYTicks.
- CalcMaxTickLabelSize : So CalcMargins can use the exact tick label sizes.
- CalcMaxDataLabelSize : So CalcMargins can use the exact data label sizes.
- DrawXTick : Code split out from DrawXTicks for symmetry with DrawYTick.
-
-
-2007-12-13 (lbayuk)
- * Changed ProcessTextTTF() so SizeText() will return integers. It rounds
- the calculated values up, so the bounding box really contains the text.
- This also prevents unneeded float calculations in derived values.
-
-2007-12-09 (lbayuk)
- Major rewrite of the text drawing functions to address multiple problems.
- Note: These changes are inter-dependent and cannot be split up.
-
- * Fixed bug 1813070 "Bad position for multi-line TrueType text":
- TTF text is now drawn line-by-line, not as a block, for proper
- alignment and positioning.
-
- * Fixed bug 1813071 "Wrong title height for multi-line TTF text":
- Corrected miscalculation of overall height of multi-line TTF titles.
- This bug resulted in over-sized margins.
- The height is now computed line-by-line, including the inter-line spacing.
-
- * Fixed bug 1813474 "DrawText alignment arguments wrong":
- Corrected meaning of 'top' vs 'bottom' alignment. PHPlot now follows
- the usual conventions: 'top' alignment means top of text to reference.
- DrawText default for vertical alignment is still 'bottom', but the
- meaning was corrected. All callers of DrawText were fixed.
-
- * Fixed bug 1816844 "Fix order dependency for setting titles":
- Defer processing titles strings until DrawGraph(), so there is no
- more order dependency (no need to set font before setting title strings).
-
- * Fixed bug 1819668 "Horiz. align multi-line text: GD vs TTF":
- The new text routines draw TTF text line-by-line and correctly do
- right-, center-, and left- alignment of each line within a text block.
-
- * Fixed bug 1826513 "FIXME in DrawLegend: Max label length":
- Use actual width of widest legend line to calculate legend box size.
-
- * Partial fix for bug 945439 "x_tick_label_height not set correctly":
- In FindDataLimits(), save the longest data label, not just its length,
- and use the actual rendered size of that string in CalcMargins() for
- the margin calculations.
- Also take into account which of the tick or data labels are visible.
- This is not a complete fix, but is a significant improvement.
-
- The following changes were made related to the above fixes:
-
- + Replaced internal function TTFBBoxSize(), which didn't work right, with
- SizeText(). It returns the orthogonal bounding box of a block of text,
- and works with both GD and TTF text.
-
- + DrawText() and SizeText() call a single function ProcessText(), which is
- the only place GD text and TTF text are distinguished. (So eventually
- we will be able to mix GD and TTF text on a plot.)
-
- + New internal functions ProcessTextGD() and ProcessTextTTF() draw (or size)
- GD and TTF text respectively. These are only called by ProcessText().
- These are re-implementations which properly position and align text.
-
- + Removed class variables title_angle, x_title_angle, and y_title_angle. The
- titles only work at their fixed angles anyway (0, 0, and 90 respectively).
-
- + Line spacing set with SetLineSpacing() now affects TTF text as well as
- GD text. Previously, it only affected GD text. The default line spacing
- happens to be usable for TTF text.
-
- + Added new callback hook 'debug_textbox' for developing, testing, and
- documenting. It provides access to the text area bounding box.
-
- + Removed unneeded class variables x_tick_label_height, y_tick_label_width,
- x_tot_margin, y_tot_margin.
-
-2007-11-25
- * Improve error handling:
- Internal functions PrintError() and DrawError() are now the same. Both
- will draw the error message into the image and output it, and then
- trigger a user-level error. If no error handler has been set, it will
- exit, as before. But now the error message should also get logged, or
- written to the standard error stream, depending on the SAPI in use.
- You can now establish an error handler to catch most PHPlot errors and
- do some cleanup before exit.
-
- This fix also covers bug #1823774 "Default Font Path and Error Message
- Output".
-
- Fixed the return value of most PHPlot functions, to return False on
- error, else True. Since uncaught errors are fatal anyway, this only
- affects code with an error handler that returns, which is not
- recommended and unsupported at this time. These changes are for
- possible future error handling options.
-
-2007-11-22
- * Fix bug 1836528 "Insufficient checking of parameter values":
- Rewrote CheckOption to correctly validate option choices.
- (It previously accepted substrings and other incorrect values.)
- PHPlot methods that use CheckOption now must be called with valid option
- values. Empty strings are also no longer accepted.
-
-2007-11-17 (lbayuk)
- * Change to callbacks to support extra arguments.
- The PHPlot class can now pass extra arguments to a callback function.
- Callback functions now take the following form:
- my_callback($img, $passthru_arg, ...)
- Where '...' is zero or more additional arguments supplied by PHPlot to
- the callback. Each implemented callback reason will define any
- additional arguments it uses. The existing defined callbacks have not
- changed and do not currently pass any extra arguments.
-
-2007-11-10 (lbayuk)
- * Fix bug 1827263 "Spoiled up pie-chart if $val is close to zero":
- Skip pie slices which would result in an integer angle of zero
- degrees, because the GD arc filling function will draw a complete
- circle for that case.
- Credit to Viacheslav <webdeveloper.ua at gmail.com> for finding this.
-
- * Removed 8 of the functions (class methods) marked 'deprecated'. Only
- deprecated functions which seem to have been for internal use have
- been removed. Even old scripts shouldn't be using them, and they are
- becoming a problem to maintain.
- Removed: SetImageArea() DrawDotSeries() DrawLineSeries() CalcXHeights()
- CalcYWidths() DrawLabels() InitImage() DrawDashedLine().
-
-2007-10-20 (lbayuk) ===== Released as 5.0.4 =====
- * phplot.php: Updated copyright, version, and authors comments at top.
- * README.txt: Updated for new release
- * NEWS.txt: Add text for new release
-
-2007-10-18 (lbayuk)
- * Add callbacks - experimental feature:
- New functions SetCallback, GetCallback, RemoveCallback.
- New internal function DoCallback.
- Added callback hooks to DrawGraph.
-
- Re-arranged code in DrawGraph to bring pie chart drawing into the main
- switch on plot type, rather than a special case in its own block. This
- makes it easier to follow and easier to add callback hooks.
-
- * Callbacks: New file, documentation for the new callbacks feature.
- (This won't be in the manual while it is an experimental feature.)
-
-2007-10-15 (lbayuk)
- * Fix for bug 1813021: Miss-positioned right-justified vertical GD text.
- Fixed DrawText() to correctly position 90 degree right-justified text
- drawn in a fixed GD font. This could be seen with 90 degree Y tick
- labels. (Found by accident while working on TrueType text problems.)
- Also some code cleanup in DrawText: use elseif where appropriate.
-
-2007-10-09 (lbayuk)
- * Code cleanup: Simplify SetIndexColor() and SetIndexDarkColor().
- There is no need to first try ImageColorExact, then ImageColorResolve
- if that fails. ImageColorResolve does all that for us.
-
- Code cleanup: Rewrite SetRGBColor(). It now detects if an unrecognized
- color name or color value form is used, and draws an error message.
- Before this it would get a PHP index error and "headers already sent"
- condition.
-
- * Code cleanup: Remove duplicated code for loading image files.
- Added new class-private function GetImage() which loads an image based
- on the image type, and also returns the image size. This replaces
- duplicated code in tile_img() and SetInputFile().
- Also fixed comment at top of SetImageFile which said it was deprecated.
- It isn't - it is used by the constructor. Moved the function out of the
- 'deprecated' area up to below where it is used.
-
- * Code cleanup: PHPlot should not define or affect anything outside its
- own class.
- - Removed the check for __FUNCTION__ (PHP 4.3 and up). This is obsolete.
- - Do not set error_reporting to E_ALL. Although it is recommended that
- scripts do this, it is not the place of loaded classes to do it.
- - Remove unused global constant TOTY.
- - Removed constants MAXY and MINY. Global constants like this are bad.
- These were used as magic index values into data[] to hold min and max Y
- values for the row. Instead, put them in separate arrays which are
- named data_miny[] and data_maxy[]. (This seems to be only used by the
- data line drawing function.)
-
- Comment cleanup: Remove one commented-out partial function DrawPlotLabel,
- and fix another commented-out code fragment in DrawYErrorBar. Both of
- these had unmatched braces in them which caused a balance-braces check
- to fail.
-
- * Code cleanup, array padding: Get rid of functions outside the class
- and remove the interim fix for PHP 5 (which changed the behavior of
- array_merge). Rewrote external function array_pad_array() as a new
- class function pad_array(). It does not need access to the class,
- but I don't think PHPlot should add to the global namespace more
- than necessary. The third argument (array to use for padding) was
- never used, so it was removed. It always pads the array with itself.
- It now only works on 'usual integer indexed' arrays (0-based
- sequential integer index). The was previously required but
- undocumented for some of the arrays (like line_widths); now it is
- required for all style arrays and will be documented. Now we can pad
- the array to the required length, not just N times its previous
- length, and we don't need array_merge. Deleted external function
- array_merge_php4() as it is no longer used.
-
- Deleted PHP end marker ?>. You don't need this and it can cause
- problems with extra whitespace in your output.
-
-2007-09-24 (lbayuk)
- * Code cleanup: Fix ternary operator misuse. This doesn't change
- behavior, but it was annoying me so I fixed it.
- Replaced all cases of code like this: $a = ($a > $b) ? $b : $a
- With just: if ($a > $b) $a = $b
-
- * Fix Makefile 'release' target to set owner/group when creating
- the tar file. This avoids having to run it as root, but it needs
- GNU tar to work.
-
-2007-09-08 (lbayuk)
- * Fix for bug 1790441: Removed the PHPlot quasi-destructor function and
- the register_shutdown_function() call which arranged for it to be used.
- This was preventing release of memory when a PHPlot object was unset,
- because the registered shutdown function held a reference to it.
- So rather than improving memory use, it had the opposite effect.
- Note: It is no longer necessary or recommended to use reference
- assignment ($plot =& new PHPlot) for PHPlot object creation.
- Thanks to annajilly for the thorough analysis, bug report, and fix.
-
-2007-09-05 (lbayuk)
- * Rewrote FormatLabel() to ignore blank label values. Adapted from a
- patch and feature request submitted by Gerhard Reithofer (exgerhardr).
- Blank labels used to produce an error if the LabelType was set to
- 'time', and zero if set to 'data'. Now they are just ignored. This
- provides a simple way to have labels only at selected intervals when
- using time or data formats. For example, you can have a date/time
- label at every 10th data point by setting the labels for the other 9
- to be empty strings. Also: Removed $which_pos values 'plotx' and
- 'ploty'. These were unused by PHPlot and this is an internal-only
- function so there is no compatibility issue. Removed error checking on
- $which_pos for the same reason; the error message used an undefined
- variable anyway so it wouldn't have worked.
-
-2007-08-26 (lbayuk)
- * Allow SetLegendStyle colorbox_align argument to be 'none', to suppress
- the colorboxes in the legend.
-
- Fix comment on $legend_text_align: empty means right, not left.
-
- Rewrote DrawLegend layout code to make it easier to understand. The
- result should be within 1 or 2 pixels of the previous size and position.
-
- * Fixes for bug 1779115: SetLegendWorld() fails on undefined vars
- Store the given coordinates and remember that they need to be converted
- from world to pixel coordinates, but defer trying to actually convert
- them until it is time to draw the legend. This way, there are no
- problems with the scale having to being set up first (which is nearly
- impossible to do). Made the following changes:
-
- Changed legend class variables to be uninitialized, and unset (rather
- than empty string) means use the defaults. Added a new variable:
- $legend_xy_world. If it is set, (legend_x_pos, legend_y_pos) need to
- be converted to pixel coords. If it is unset, they are already pixel
- coords (or undefined, meaning defaults).
-
- Changed usage of internal function DrawLegend(): removed all arguments.
- X and Y were always the class variables anyway, and now it needs to
- also use the new flag to tell it if X and Y are world or pixel coords.
- The third argument was unused.
-
- Removed third, unused, default NULL argument from SetLegendPixels and
- SetLegendWorld.
-
- Changes to DrawLegend to convert x, y coords to pixel coordinates
- if they came from SetLegendWorld. Also account for new usage of
- the class variables: Test for unset to mean use default.
-
-2007-08-04 (lbayuk)
- * New feature: control legend text and color box alignment.
- Adds a new function SetLegendStyle to adjust the alignment of the
- text and the color boxes inside the legend.
- Based on part of bug 1208054, contributed by David Hernández Sanz.
-
-2006-12-02 (lbayuk)
- * Fixes for bug 1605555: Y Data Labels use wrong font and not formatted.
- Use y_label_font (not x_label_font) for Y Data Labels.
- Use the formatted value for the label, not the original text.
- (This applies to bar charts only, with the new Y data labels.)
-
- * One fix for bug 1208054: Localization of number format.
- If number formatting is enabled with 'data' format type, PHPlot previously
- used dot for decimal point and comma for thousands separator, and there
- was no way to change it.
-
- This fix adds a new function:
- SetNumberFormat($decimal_point, $thousands_separator)
- to set the separators. In addition, if that function is not used,
- PHPlot will now try to use locale-dependent separators. If locale
- information is not available, it will fall back to the old defaults
- of dot and comma.
-
- Note: This change may have some negative effects. 1) If your locale is
- "C" or "Posix", you might not get a thousands separator now by default.
- You should be using a more specific locale. 2) If your PHP script is
- forcing a specific locale with setlocale(), PHPlot will probably undo
- that because it uses setlocale(LC_ALL, '') to import locale information
- from the environment. We have to do that, or a locale set through
- the environment is ignored. But it will override a manually set locale.
-
- * Fix for bug 937944: X/Y Tick Counts
- PHPlot could draw one too few Y tick marks, and one too many X tick marks.
-
- Changed the code to stop drawing X (Y) tick marks when the current X (Y)
- value exceeds the maximum X (Y) value plus a small fudge factor. The fudge
- factor accounts for cumulative error when repeatedly adding a delta to
- the X (Y) value.
-
- Notes: The bug report was writing about Y tick counts only, but X tick
- counts can also be wrong. The proposed fix in the bug report does not
- work in all cases.
-
- This fix changes the appearance of many plots which were missing the
- top-most Y tick mark. The extra X-tick mark problem is less common.
-
-===== Released as 5.0rc3 =====
-
-2006-11-13 (lbayuk)
- * Fix for bug 1437912: x-axis label misalignment [bar charts]
- The calculations were redone from scratch.
- New control variable 'bar_extra_space', which works in addition to
- 'group_frac_width' to control how much extra space is around the bars.
- Made bar widths match for 'stackedbars' and 1-bar-per-group 'bars'.
-
- NOTE: This changes the appearance of charts. bars in 'stackedbars'
- will now be thinner, and bars in 'bars' graphs will be thicker. I
- saw no reason for them being different before.
-
- This fix required fixing the positioning on the new bar data labels,
- which was off before. The bar data labels will now be centered.
- Additional fixes to bar chart data labels:
- For negative values, the label will center under the bar.
- Fixed X-adjustment to account for shading.
- Fixed to not suppress the data label if the value is 0.
-
-
-2006-11-10 (lbayuk)
- * Fix for bug 1594457: DrawError text wrap and background fix
- Do error image white background correctly, and word-wrap the text.
-
- * Fix for bug 1594458: Suppress lines or points in 'linepoints'
- Don't draw X data labels twice for 'linepoints'.
- Allow SetPointShapes value 'none' to suppress points, and allow
- SetLineStyles value 'none' to suppress lines. This allows a 'linepoints'
- graph to mix lines only, points only, and both on the same graph.
-
-
-2006-11-09 (lbayuk)
- * Fixes for bug 1446523:
- + Wrong variable name in deprecated SetAxisFontSize()
- + Fails to properly handle error if SetDataValues() was never
- called, or not called with a data array.
-
- * Fix for bug 1117122: Pie Chart ignores SetPlotAreaPixels
- Don't let DrawGraph recalculate the plot area for pie charts if the
- user already set it with SetPlotAreaPixels.
-
- NOTE: This fix may slightly change the appearance of some pie charts,
- whether or not they use SetPlotAreaPixels.
-
- * Fix for bug 1103992: Wrong max Y calculated for stackedbars
- Changes FindDataLimits to calculate max Y correctly. It was counting
- the first Y value in each record twice, which is always wrong but
- only affected stackedbars because the Y values are summed.
-
- * Fix for bug 1096199: Wrong error bar colors in DrawDotsError.
- Rewrites DrawDotsError to make it work like DrawLinesError to
- correctly increment the record and color indexes.
- Also fixes uninitialized x_now_pixels.
-
- * Fix for bug 1096197: No borders on unshaded Draw[Stacked]Bars
- Unshaded Bars and StackedBars covered the border with the rectangle.
- The fix is to draw the rectangle, then the border.
-
- NOTE: This fix changes chart appearance. Bars and Stacked Bars
- will now get a black border around each bar by default, if you
- turn off the 3D-shading. If you want borderless, unshaded bars
- you need to use SetDataBorderColors to set the data border colors
- to be the same as the data colors.
-
- * Fix for bug 1333164: Negative data values, if string variables, result
- in unfilled bars. The problem was a string-to-string compare of a
- negative number with the empty string x_axis_position. Fixed by
- initializing x_axis_y_pixels to 0 if SetXAxisPosition was not used.
-
-
-2005-04-17 (afan)
- * Fix for bug [ 1161072 ] SetInputFile warning, background overwrite
-
- * Bug 1182672 fixed
-
-2005-04-15 (afan)
- * fix for bug: [ 1182666 ] Y Auto-scale rounds in wrong direction
-
- * Fix for bugs 1144644 TrueType font path problems and 1106328 TTF
- path/filename inconsistency
-
- * Fix Bug: [ 1117120 ] X Title sizing uses Y Title font height
-
-2005-04-13 (afan)
- * Error in SetLineStyles() - does not accept an array argument
-
-
-2005-03-29 (afan)
- * Small typo fixed in SetYDataLabelPos
-
- * Update SetDataLabelPos: For past compatibility we accept plotleft,
- ...but pass it to SetTickLabelPos
-
-2005-03-26 (afan)
- * Change to line 3802: data lables now work with multiple bars with *$idx
-
-2005-03-25 (afan)
- * Added Function DrawDataLabels to put data labels in world coords,
- added call from DrawBars and modified SetYDataLabelPos to flag
- whether or not to call DrawDataLabels.
-
-2005-01-20 (migueldb)
- * Many bugfixes reported and solved by L. J. Bayuk. Thanks!
- + fixed bug #1096190
- + FindDataLimits(): fixed bug #1096192
- + CalcTranslation(): fixed bug #1101317
- + DrawImageBorder(): fixed bug 1096200
- + DrawXDataLabel(): fixed bug 1099879
- + DrawDots(): fixed bug #1096194
-
-===== Released as 5.0rc2 =====
-
-2004-10-24 (migueldb)
- * array_merge_php4(): added to cope with the bug introduced by
- the change in array_merge() from PHP4 to PHP5 (I haven't verified this)
- * Fixed some divisions by zero, thanks to an old bug report.
-
-2004-09-09 (migueldb)
- * SetPointSize(): deprecated
- * SetPointSizes(): added as replacement for SetPointSize().
- Now able to set point sizes on a per line basis.
- * SetPointShape(): deprecated.
- * SetPointShapes(): added as replacement for SetPointShape().
- Now able to set point shape on a per line basis.
- * DrawDot(): now needs record number to decide which dot shape and
- size to draw.
- * CalcMargins(): dirty fix for x data label placing.
- * tile_img(): fixed tile placement.
-
-2004-06-14 (migueldb)
- * SetXTickLabelPos() and others: more on the bug reported by Jo Demol.
- * Fixed bug reported by Jo Demol.
-
-2004-05-11 (migueldb)
- * SetBgImage(): added.
- * SetPlotAreaBgImage(): added.
- * SetInputFile(): deprecated.
- * DrawBackground(): now accepts images as backgrounds.
- * DrawPlotAreaBackground(): now accepts images as backgrounds.
- * tile_img(): internal method added.
-
-..........
-Editor's Note: For older changes to PHPlot, please see the CVS logs.
+This is the Change Log for PHPlot.\r
+The project home page is http://sourceforge.net/projects/phplot/\r
+-----------------------------------------------------------------------------\r
+\r
+2011-01-15 (lbayuk) ===== Released as 5.3.1 =====\r
+ * phplot.php: Updated version\r
+ * README.txt: Updated for new release\r
+ * NEWS.txt: Add text for new release\r
+\r
+2011-01-09\r
+ * Fixed some style / indent errors, and 1 redundant test.\r
+\r
+2011-01-03\r
+ * For bug 3143586 "Multiple plots per image - fixes & docs":\r
+ Make sure there is a documented way to reset PHPlot feature\r
+ settings, especially those for which the default settings result\r
+ in automatic calculated values. Where possible, calling a Set*()\r
+ function with no arguments should reset the feature to defaults.\r
+\r
+ + Changed SetLegendPixels() arguments to be optional with default\r
+ NULL meaning reset to automatic positioning.\r
+\r
+ + Fixed SetXAxisPosition() and SetYAxisPosition() to accept empty\r
+ string '' to mean reset to default automatic positioning.\r
+ Make arguments optional, defaulting to empty string.\r
+\r
+ + Changed SetNumXTicks() and SetNumYTicks() arguments to be\r
+ optional with default empty string '' meaning reset to\r
+ of automatic calculation.\r
+\r
+ * Changed SetPointShapes() to use CheckOptionArray(). This\r
+ simplifies the function with no change in operation.\r
+\r
+ * Extend copyright years to 2011.\r
+\r
+2010-12-30\r
+ * Fix for bug 3147397 "Data colors missing with multiple plots":\r
+ + Do not truncate the data_colors and related arrays, so the full\r
+ set of colors will be available for subsequent plots on the image.\r
+ (Color indexes are still allocated in the image only as needed.)\r
+ + New internal functions GetColorIndexArray() and\r
+ GetDarkColorIndexArray(), replacing previous use of array_map().\r
+ + Removed internal function truncate_array() - no longer used.\r
+ + Changed SetColorIndexes(), NeedDataDarkColors(), and\r
+ NeedErrorBarColors() to only allocate the color indexes that will\r
+ be needed (instead of allocating all colors in the truncated color\r
+ descriptor arrays).\r
+\r
+2010-12-28\r
+ * Instead of throwing an error, SetLegend(NULL) now clears the legend\r
+ array. This can be useful with multiple plots on an image. Before\r
+ this change, only SetLegend(array()) did that (possibly by accident).\r
+\r
+2010-12-27\r
+ * Do not have SetDefaultStyles() call deprecated SetLabelColor().\r
+\r
+ * Fixes for bug 3143586 "Multiple plots per image - fixes & docs":\r
+ + Fix DrawLegend so it doesn't forget that the legend position\r
+ was specified in world coordinates. This fixes the legend\r
+ position for plots after the first.\r
+ + Don't draw the image border more than once (although this would\r
+ probably have no impact on the resulting image). This parallels\r
+ the behavior for the main plot title and the image background.\r
+ Replaced member variables background_done and title_done with a new\r
+ member array done[] which will track when these elements were done.\r
+\r
+2010-12-06\r
+ * Fix comments above CalcPlotAreaWorld(). Deleted incorrect information\r
+ from before data-data-yx existed, and before DecodeDataType rewrite.\r
+\r
+2010-12-04 (lbayuk) ===== Released as 5.3.0 =====\r
+ * phplot.php: Updated version\r
+ * README.txt: Updated for new release\r
+ * NEWS.txt: Add text for new release\r
+\r
+2010-12-03\r
+ * Feature request 3127005 "Ability to suppress X/Y axis lines":\r
+ Added SetDrawXAxis() and SetDrawYAxis() to control flags which\r
+ will suppress drawing the X or Y axis lines. (These lines were\r
+ probably the only PHPlot elements that could not be turned off.)\r
+ Changed DrawXAxis() and DrawYAxis() to conditionally draw the\r
+ axis lines.\r
+\r
+2010-11-28\r
+ * Feature request 3117873 "Data value labels in more plot types":\r
+ Implemented Data Value Labels for plot types points, lines,\r
+ linepoints, and squared. Added 2 class variables which can be\r
+ set to control the distance and angle of the labels from points.\r
+ New internal function CheckDataValueLabels() calculates position\r
+ and text alignment for these labels.\r
+\r
+ * Updated comments for Set[XY]DataLabelPos to match the text in\r
+ the manual, which was rewritten to clarify label types.\r
+\r
+2010-11-23\r
+ * Code cleanup. Moved some functions around to group "plot drawing\r
+ helpers" separately from "plot drawing". No changes to operation.\r
+\r
+2010-11-21\r
+ * Feature request 3111166 "Control legend colorbox width":\r
+ Added a class variable legend_colorbox_width which can be changed\r
+ to make the colorboxes wider or narrower.\r
+\r
+2010-11-16\r
+ * Feature request 3093483 "Investing support chart types":\r
+ Added 3 new plot types: Basic OHLC (Open/High/Low/Close), Candlesticks,\r
+ and Filled Candlesticks. Implemented with one new function to handle the\r
+ 3 new plot types: ohlc, candlesticks, and candlesticks2.\r
+\r
+2010-11-11\r
+ * Moved information about plot types into a new static member array\r
+ plots[]. (This is an internal change with no impact on usage, but will\r
+ make it easier to add new plot types.) SetPlotType() no longer needs a\r
+ list of plot types to check, FindDataLimits() does not need to check for\r
+ specific plot types to to process the data array, and DrawGraph() uses\r
+ data from the array rather than knowing about all the plot types.\r
+\r
+2010-10-31\r
+ * Changed internal CalcBarWidths() to take two arguments which indicate\r
+ how it should calculate bar widths, rather than having it check the\r
+ plot_type directly. (Taken from another, experimental change. This\r
+ minimizes places where plot_type is directly used.)\r
+\r
+2010-10-03 (lbayuk) ===== Released as 5.2.0 =====\r
+ * phplot.php: Updated version\r
+ * README.txt: Updated for new release\r
+ * NEWS.txt: Add text for new release\r
+ * Makefile: Removed HorizontalBars.txt from release. This is now all\r
+ documented in the reference manual.\r
+\r
+2010-10-01\r
+ * Rewrite color handling. Default and specified colors are now validated,\r
+ converted to RGBA arrays, and saved. The colors indexes are not\r
+ allocated until graph drawing time. Unneeded colors are not allocated.\r
+\r
+ Fix bug 3045131 "SetTransparentColor problems": Transparency setup is\r
+ deferred to graph drawing time, after most other colors are allocated.\r
+ Fixes SetTransparentColor order dependency, and works with data colors.\r
+\r
+ Fix bug 3049726 "Optimize color allocation": Colors allocation is\r
+ deferred to graph drawing time, and colors for most elements are only\r
+ allocated if needed. In particular, the data colors and dark colors,\r
+ which used 32 slots, now only get defined as needed.\r
+\r
+ Feature request (partial) 3077554 "Finer control over plot element\r
+ colors": The colors of the main, X, and Y titles can now be controlled\r
+ separately.\r
+\r
+ Change details:\r
+ New internal functions:\r
+ GetColorIndex(), GetDarkColorIndex()\r
+ Allocate pre-parsed colors for elements.\r
+ SetColorIndexes()\r
+ Does the deferred color allocation and defaults.\r
+ NeedDataDarkColors(), NeedErrorBarColors()\r
+ Called by graph drawing functions if those colors are needed.\r
+ GetDataColor(), GetDataErrorColors(), GetBarColors()\r
+ Custom or standard data color assignment for most plot types.\r
+ truncate_array()\r
+ Shorten an array. Used to limit data color allocation.\r
+\r
+ Removed internal functions:\r
+ SetIndexColor(), SetIndexDarkColor()\r
+ Unneeded. Color handling is now in two separate phases.\r
+\r
+ Removed internal member variable:\r
+ data_colors_alpha\r
+ PHPlot no longer calls SetDataColors before plotting, so this\r
+ variable is not needed to preserve the default alpha.\r
+\r
+ New internal member variables:\r
+ transparent_color\r
+ Saves color value from SetTransparentColor. For bug 3045131.\r
+ x_title_color, y_title_color, ndx_x_title_color, ndx_y_title_color\r
+ For title colors. DrawXTitle and DrawYTitle use them now.\r
+\r
+ Changed internal member variables:\r
+ i_border, plot_bg_color, bg_color, label_color, text_color, etc.\r
+ All variables for colors now always hold a parsed 4-component\r
+ (RGBA) color specification as an array, and are no longer\r
+ statically initialized to a color name.\r
+\r
+ New public functions:\r
+ SetXTitleColor(), SetYTitleColor()\r
+ These can be used to make the 3 titles have different colors.\r
+\r
+2010-09-26\r
+ * Don't let SetXDataLabelPos() accept 'xaxis' or 'all' as valid.\r
+ Don't let SetXTickLabelPos(), SetYTickLabelPos() accept 'all' as valid.\r
+ These were never implemented and never documented.\r
+\r
+\r
+ * Feature request #3073679 "Stacked bar plots with negative values":\r
+ Allow stacked bar plots (vertical and horizontal) to work with negative\r
+ values. Changed FindDataLimits() to not take abs() values for\r
+ stackedbar when calculating the data range. Changed DrawStackedBars()\r
+ and DrawHorizStackedBars() to handle negative values, including proper\r
+ label positions. The first non-zero value in a row sets the direction\r
+ of the bar. Mixing positive and negative values within a row works but\r
+ the results are not useful.\r
+\r
+ * New internal DrawBar() moves common code from 4 bars and stackedbars\r
+ drawing functions and makes it easier to deal with shading vs bar\r
+ direction.\r
+\r
+2010-09-24\r
+ * Fix bug 3074402 "Fix Y axis default for horizontal plots":\r
+ Make the default axis positions symmetrical for vertical plots\r
+ (X and Y) and horizontal plots (Y and X). This fixes the problem\r
+ with horizontal bar/thinbarline plots that have negative data,\r
+ where the Y axis stayed on the left and the bars went rightward.\r
+\r
+2010-09-01\r
+ * Fix bug 3056991 "Internal methods should be 'protected'":\r
+ Changed CheckDataArray(), number_format(), FindDataLimits(), and\r
+ DrawBackground() to be 'protected'. The test suite no longer calls\r
+ these directly. For SetIndexColor(), SetRGBColor(), DrawText(),\r
+ SizeText(), xtr(), and ytr(), left these as public with a comment\r
+ indicating they should be treated as protected.\r
+\r
+ * Fix bug 3057000 "Review 'deprecated' methods":\r
+ + Changed deprecated method SetNewPlotAreaPixels() to just call\r
+ SetPlotAreaPixels(). It was suspicious as coded, and was found\r
+ to be equivalent to SetPlotAreaPixels().\r
+ + Removed SetColor(), which didn't do anything. It was calling\r
+ SetRGBColor and discarding the result. After reviewing the\r
+ history of this in all CVS versions, it does not seem to have\r
+ ever been coded correctly, so there is no harm in removing it.\r
+ + All other deprecated methods seem OK and are left as is.\r
+\r
+2010-08-30 (lbayuk) ===== Released as 5.1.3 =====\r
+ * phplot.php: Updated version\r
+ * README.txt: Updated for new release\r
+ * NEWS.txt: Add text for new release\r
+\r
+2010-08-27\r
+ * Fix bug 3051832 "Let PHP/GD find the font file":\r
+ Instead of checking for file existence, PHPlot now uses a non-drawing GD\r
+ operation to validate a TrueType font in SetFontTTF(). This allows GD to\r
+ use its internal search path, making it likely that fonts can be found\r
+ without needing a platform-dependent path in your script. Full paths\r
+ will still work, so there is no compatibility issue.\r
+\r
+ * Fix bug 3051906 "Better choice for default TT font":\r
+ Removed "benjamingothic.ttf" as the default TT font setting. This has\r
+ not been included in PHPlot since 2004. Changed SetFontTTF() to call\r
+ new GetDefaultFontTTF(), which will try a number of sans-serif font\r
+ names the first time it needs a default TT font. Considering the above\r
+ fix to finding fonts, this has a good chance of finding a working\r
+ font. It is known to work on Windows and some Linux distributions.\r
+\r
+2010-08-19\r
+ * Makefile: Removed phplot_data.php from list of files to release.\r
+ Reference bug report 3048267. This file has not been maintained or\r
+ tested, and has bugs. It will remain in CVS, but not be included\r
+ in PHPlot releases.\r
+\r
+2010-08-17\r
+ * Change new DrawLinePoints(). It does not have to check and\r
+ handle error bar plots, as DrawDots and DrawLines will do that.\r
+\r
+2010-08-16\r
+ * Rewrote DecodeDataType(). Previous implementation was hard to\r
+ extend and inefficient. Now it uses new class variables (not a\r
+ returned array) and is only called once, by DrawGraph. Changed all\r
+ users of data_type to use the new variables.\r
+\r
+ In CheckDataArray(), calculate data_columns properly for\r
+ text-data-single data type (pie chart) too. Simplify DrawPie\r
+ to use this, and merge 2 of the 3 cases.\r
+\r
+ Have a single function handle each plot type, so it can properly\r
+ check the data type and report a correct error message showing\r
+ all supported types. For example, DrawBars is now the entry point\r
+ for both bars and horizontal bars; DrawGraph does not directly\r
+ call DrawHorizBars. Similar for DrawStackedBars and\r
+ DrawHorizStackedBars. Lines, Points, and Linepoints also now\r
+ have a single function each, dispatching to others as needed.\r
+ (These changes were split off from an upcoming, larger change.)\r
+\r
+2010-08-14\r
+ * Fixes to SetDataValues: need to clear out the 2 arrays before\r
+ setting values in a loop, else if the function is used more than\r
+ once then old values will remain.\r
+ Move records_per_group calculation outside the loop.\r
+ (These were split off from upcoming, larger changes.)\r
+\r
+ * Part 4 of horizontal plots: implement horizontal thinbarline plots.\r
+ Added new data type 'data-data-yx' (label, Y, X1, X2, ...).\r
+ DrawThinBarLines() now draws either vertical or horizontal plots, and\r
+ supports data types text-data, data-data, text-data-yx, data-data-yx.\r
+\r
+ Fixed DecodeDataType() to handle text-data-single too, for completeness.\r
+\r
+ * Fix for over-padding style and color arrays. These were padded to\r
+ records_per_group, but that is the maximum data array row size.\r
+ The number of actual data sets is less, and depends on the data type.\r
+ Calculate the correct number as data_columns at the top of DrawGraph,\r
+ and use that to pad the arrays. Also moved early error checking in\r
+ DrawGraph() into new CheckDataArray().\r
+\r
+2010-08-09\r
+ * Code cleanup. This is a large change to unify the comment and\r
+ coding stye used in PHPlot. The PEAR style guide is being used\r
+ as a reference, but PHPlot will never be 100% compliant.\r
+ This patch introduces no functional changes at all.\r
+ - Limit line length to 110.\r
+ - Remove obsolete, partially implemented Doxygen comments.\r
+ - Add descriptive comment above functions where missing.\r
+ - Use consistent comment markers and control structure spacing.\r
+ - Remove ctags-confusing end of function comments.\r
+ - Rewrote a few if/else blocks for cleaner logic.\r
+ - Re-order some functions for consistency (X, then Y).\r
+\r
+2010-08-04\r
+ * Implemented horizontal stacked bar plots:\r
+ Use the same data type introduced for horizontal bars, 'text-data-yx',\r
+ and the same plot type 'stackedbars', to make a horizontal stacked bar\r
+ plot. Data value labels, both at the ends of the bars and within the\r
+ bars ('plotstack' labels) are available with horizontal stacked bars.\r
+\r
+ * Internal function DrawDataLabel() is replaced by DrawDataValueLabel(),\r
+ with different usage. The new function can also check to see if a label\r
+ fits in the allocated space.\r
+\r
+ * Fixed the text size check in stacked bar plots for data value labels\r
+ within the bars. The check only worked correctly for 0 degree labels. It\r
+ now works with any text angle. It suppresses the label if it is too high\r
+ (for vertical stacked bar plots) or too wide (for horizontal stacked bar\r
+ plots) to fit in the bar segment to which it belongs. Note that it only\r
+ checks in the bar direction. If the text is too wide (for vertical bars),\r
+ or too high (for horizontal bars), it will still be plotted, but will\r
+ cross the sides of the bar.\r
+\r
+2010-07-28\r
+ * Allow callbacks to return a value (to support new data_color callback).\r
+ * Feature request 3034164 "Extended control of data colors":\r
+ Define new callback 'data_color' for picking the data color.\r
+ Changed internal plot drawing functions DrawDots, DrawLines, DrawSquared,\r
+ DrawBars, DrawStackedBars, DrawDotsError, DrawThinBarLines,\r
+ DrawLinesError, and DrawHorizBars to use the data_color callback\r
+ (if defined) to select the data colors.\r
+ * SetRGBArray code cleanup (no functional changes).\r
+\r
+2010-07-27\r
+ * Fixes for error bars:\r
+ Code cleanup in DrawYErrorBar(), with no functional change.\r
+ Suppress duplicate drawing of error bars with 'linepoints' error plots.\r
+ This was already fixed for data labels. Now error bars will only be\r
+ drawn by the 'points' part, not the 'lines' part. There should be no\r
+ visible changes to plots. (This is needed for a future change).\r
+\r
+2010-07-26\r
+ * Horizontal bar charts (still an experimental feature) can now have data\r
+ value labels.\r
+ * HorizontalBars.txt: Fix incorrect description of bar direction. Add\r
+ text explaining the new data value labels.\r
+\r
+2010-06-29 (lbayuk) ===== Released as 5.1.2 =====\r
+ * phplot.php: Updated version\r
+ * README.txt: Updated for new release\r
+ * NEWS.txt: Add text for new release\r
+\r
+2010-06-26\r
+ * Feature request 2885930 "Horizontal Bars":\r
+ Horizontal bar charts are implemented, as an experimental feature.\r
+ A new data type 'text-data-yx' was added, which works with\r
+ 'bars' plot type to produce a horizontal bar chart from a data\r
+ array with X values for each Y value. Changes were made to\r
+ FindDataLimits, CalcMargins, CalcPlotAreaWorld, CalcBarWidths,\r
+ and CalcMaxDataLabelSize to handle the new data type. Other\r
+ changes were made to handle label position defaults and grid\r
+ defaults. New drawing functions were added for horizontal bars.\r
+\r
+ * HorizontalBars.txt: new documentation file for experimental feature.\r
+ * Makefile: List new documentation file.\r
+\r
+2010-06-25\r
+ * Each plot-type drawing function now checks that it is getting a data\r
+ type that it knows how to handle. A new internal function unifies the\r
+ checking and error message. (This is associated with an upcoming,\r
+ bigger change.)\r
+\r
+ Compatibility: If you were using an invalid data type for a plot type\r
+ whose function did not check, will now get an error.\r
+ \r
+ * Removed some dubious code from DrawLines() and DrawSquared() and\r
+ rewrote comments there. The code initialized lastx[0] and lasty[0],\r
+ but lasty was mapped using the X (rather than Y) function. This was\r
+ obviously wrong, but closer inspection showed that the values were\r
+ never, used so the code was removed.\r
+\r
+2010-06-13\r
+ * Truecolor.txt: removed\r
+ * Makefile, README.txt: Removed reference to Truecolor.txt. Full\r
+ documentation for truecolor images is now in the Reference Manual.\r
+ \r
+2010-06-02\r
+ * Fix bug 3010116 "Bad rendering of title in multi-plot image\r
+ when using TTF":\r
+ Make sure the main title is drawn only once. (If drawn multiple\r
+ times with TrueType font text, the anti-aliasing effects result\r
+ in poor quality text.)\r
+\r
+2010-05-31\r
+ * Improvements to truecolor support (from feature request 2947679):\r
+ Truecolor support is now better integrated. The derived class only\r
+ has the constructor now, and the base class itself provides the alpha\r
+ color component support through the internal functions SetIndexColor(),\r
+ SetIndexDarkColor(), and SetRGBColor(). This means alpha channel\r
+ works with palette images too (in so far as GD supports this).\r
+\r
+ * Truecolor.txt: Updated per changes to truecolor support.\r
+\r
+ * Image tiling with mode 'scale' in tile_img(), used with image and\r
+ plot area backgrounds, now uses imagecopyresampled() rather than\r
+ imagecopyresized(). They are the same with palette images, but the\r
+ resampled copy gets better results with truecolor images.\r
+\r
+2010-05-29\r
+ * Feature request 3002606 "Add to plot and image border options":\r
+ Added options 'right', 'top', and 'bottom' to SetPlotBorderType()\r
+ (existing options are 'left', 'sides', 'none', and 'full'). This\r
+ now also accepts an array of the above options, giving complete\r
+ control over which sides to draw.\r
+ Added option 'solid' to SetImageBorderType() to use the actual\r
+ color set with SetImageBorderColor(), rather than the darker\r
+ shade as type 'plain' does (for some reason).\r
+ New function SetImageBorderWidth() sets the width of the image\r
+ border. The image border width is now accounted for in margin\r
+ calculations, although existing plots will not change.\r
+\r
+2010-04-04 (lbayuk) ===== Released as 5.1.1 =====\r
+ * phplot.php: Updated version\r
+ * README.txt: Updated for new release\r
+ * NEWS.txt: Add text for new release\r
+\r
+2010-04-01\r
+ * Remove & from argument in SetDataValues(). The data array is not\r
+ modified and does not need to be passed by reference. (There is\r
+ no performance advantage, either.)\r
+\r
+2010-03-29\r
+ * Feature request 2947679 "Support for alpha blending/Truecolor":\r
+ Implemented truecolor image support with a new class\r
+ PHPlot_truecolor, extended color specifications to allow\r
+ specification of an alpha value, and added a new optional parameter\r
+ to SetDataColors for a default alpha value for all data colors.\r
+ This feature is *EXPERIMENTAL* (see next item).\r
+\r
+ * Truecolor.txt: New file, documentation for the new truecolor capability.\r
+ (The Truecolor feature is experimental, which means it is subject to\r
+ change in incompatible ways and the documentation has not yet been\r
+ incorporated into the PHPlot Reference Manual.)\r
+\r
+ * Makefile: Include new documentation file in release.\r
+\r
+2010-03-26\r
+ Fixed bug 2976735 "Improvements and fixes for 'area' plots":\r
+ Rewrote DrawArea() function which handles 'area' plot.\r
+ Part 1: This is related to feature request 2947679, Truecolor support\r
+ with transparency. The area plot function was filling each area from the X\r
+ axis up to the Y value, resulting in area overlaps. This wasn't a problem\r
+ with opaque colors, but with transparency, the overlapping areas resulted\r
+ in changed colors. The rewritten function fills the area between each line\r
+ instead of from each line down to the X axis. Plots with opaque colors\r
+ will not change.\r
+ Part 2: Area plots now work when the X axis is moved up with\r
+ SetXAxisPosition().\r
+ Part 3: Fixed FindDataLimits() for area (and stackedbars too) to\r
+ take absolute values of Y values. The drawing function was doing this,\r
+ but not FindDataLimits, resulting in incorrect limits if any Y<0.\r
+ Part 4: The rewritten DrawArea() also handles a new plot type\r
+ 'stackedarea'. This is an area plot where the Y values are stacked,\r
+ similar to 'stackedbars'.\r
+ Note: As part of the changes, it is now an error to try an area plot\r
+ with an unequal number of Y points for each X.\r
+\r
+2010-03-23\r
+ * Feature request 2973995 "Add y-Data to Stackedbars":\r
+ Implemented Y Data Labels for Stacked Bar charts (stackedbars).\r
+ The labels are enabled with SetYDataLabelPos, same as with bar charts.\r
+ There are two types of labels: above the stack with the total, and\r
+ within the bars at each segment. 'plotin' turns on the upper ones, and\r
+ 'plotstack' turns both on.\r
+\r
+ * Other changes:\r
+ + Removed unimplemented second argument to SetYDataLabelPos.\r
+ + Fixed questionable logic in SetYDataLabelPos when given an argument\r
+ that belongs with SetYTickLabelPos.\r
+ + Fix comments at top of plot-type Draw functions.\r
+\r
+ * Fix for bug 2974639 "Stacked bars plot breaks with X axis != 0":\r
+ Stacked bar plots with non-zero X axis position no longer break apart\r
+ into segments with gaps. The bars are drawn up from the X axis, and\r
+ any segments or partial segments below the X axis are not drawn.\r
+\r
+2010-03-22\r
+ * Change related to feature request 2947679 - Fix 'dot' point shape:\r
+ Use imagefilledellipse(), not imagefilledarc(), when drawing the 'dot'\r
+ point shape. The fix was needed for future support of truecolor images\r
+ with transparency, but filled dots from imagefilledellipse() look\r
+ better (rounder) with regular images and opaque colors.\r
+ Credit to mvaldez for identifying the problem and providing the fix.\r
+\r
+2010-03-04\r
+ * Fix for bug 2963757 "point_counts undefined error in 5.1.0":\r
+ Fixed CheckPointParams so it sets point_counts even when the point shape\r
+ and point size arrays are already the same size and do not need padding.\r
+\r
+2010-01-26\r
+ * Fix for bug 2938219 "Bars go in wrong direction":\r
+ Fixed CalcAxisPositions() to be consistent in positioning the X axis.\r
+ When all Y values are <0 and the Y=0 line is not part of the plot range,\r
+ PHPlot will now default the X axis to the top of the plot, not the\r
+ bottom. This fixes the problem with bars to negative Y values being\r
+ drawn downward if Y=0 is visible, but upward if Y=0 is not visible.\r
+ This also affects thinbarline plots.\r
+ Credit to lauryn1298 for finding the bug.\r
+\r
+2009-12-24 (lbayuk) ===== Released as 5.1.0 =====\r
+\r
+2009-12-18\r
+ * Change for bug 1795971 "Fix default data colors":\r
+ The default Data Color and Error Bar Color arrays now have 16\r
+ different colors, no duplicates, and nothing so light that it\r
+ is invisible.\r
+ Using '' or False as the argument to SetDataColors, SetErrorBarColors,\r
+ and SetDataBorderColors now re-initializes the map to the defaults.\r
+ This was previously undocumented, and in some cases set the map to\r
+ something different from the default.\r
+\r
+2009-12-15\r
+ * Cleanup: Remove DrawAxisLegend() - empty function marked TODO,\r
+ not really clear what it was meant to do.\r
+\r
+2009-12-14\r
+ * Fix for bug 2914403 "Pie + X/Y titles: Undefined property error":\r
+ In DrawGraph(), don't try to draw X or Y titles for pie charts.\r
+\r
+ * Feature request 2899921: "allow different format for data and tick\r
+ labels"; Bug 2906436: "Fixes for X Tick Labels vs X Data Labels",\r
+ and partial implementation of changes from user 'adoll' regarding\r
+ tick vs data labels:\r
+\r
+ New public functions:\r
+ + SetXDataLabelType() : Sets formatting for X Data Labels\r
+ + SetYDataLabelType() : Sets formatting for Y Data Labels (bar charts)\r
+ + SetXDataLabelAngle() : Sets text angle for X Data Labels\r
+ + SetYDataLabelAngle() : Sets text angle for Y Data Label (bar charts)\r
+ The defaults for these are set up to be fully backward compatible\r
+ with previous releases of PHPlot (except see the next item).\r
+\r
+ Re-used function name SetXDataLabelAngle():\r
+ + This has been deprecated and undocumented since 2003-12-07, and\r
+ used to just call SetXLabelAngle(). For new behavior, see above.\r
+\r
+ Changes to public functions:\r
+ + SetXDataLabelPos() and SetXTickLabelPos() no longer cancel each\r
+ other out (set the other control variable to 'none'). Instead,\r
+ they are both considered before plot drawing.\r
+\r
+ Changes to internal functions:\r
+ + DrawDataLabel() now uses the font, angle, and color arguments as\r
+ provided, and does not substitute values if they are empty.\r
+ + SetLabelType() now takes mode='xd' and 'yd' for X Data and Y Data\r
+ label formatting; 'x' and 'y' are for tick labels only now.\r
+ + Functions that work on Data labels now call FormatLabel() with the\r
+ new mode parameter value 'xd' or 'yd, and use the new\r
+ data_label_angle variables.\r
+ + New CheckLabels(), used by DrawGraph to process label parameters.\r
+ + CalcMargins() - Rewritten to handle changes to Tick and Data labels.\r
+\r
+ Changes to internal class variables:\r
+ + New: x_data_label_angle, y_data_label_angle\r
+ + Do not initialize x_tick_label_pos or x_data_label_pos, so that\r
+ CheckLabels() can tell if they were set or not and apply defaults.\r
+ + Initialize y_data_label_pos to 'none', not 'plotleft'.\r
+ + Add 2 more indexes to label_format[] array: 'xd' and 'yd'.\r
+\r
+ * Cleanup:\r
+ + Delete unused internal class variable: draw_y_data_label_lines\r
+ + Delete unused function SetDrawYDataLabelLines()\r
+\r
+2009-12-07\r
+ * Fix bug 1795972 "Fix default point shapes":\r
+ + Added 10 new point shapes to the existing 10 shapes.\r
+ + Changed the default point shape from all 'diamond' to a\r
+ selection of up to 10 different shapes.\r
+ + Fixed bug in the code that tried to set the point shapes\r
+ and sizes arrays to be the same size. This was not working,\r
+ resulting in unexpected point sizes.\r
+ + Changed default point size to 6 for all shapes. It was trying\r
+ to be "5, 5, 3" but due to several bugs this was not working.\r
+ + Do not adjust shape sizes to even numbers (was done for only two\r
+ shapes). Instead, consistently truncate size/2 when needed.\r
+ NOTE: These may change the look of 'points' and 'linepoints' plots.\r
+\r
+ * Changed startup initialization code:\r
+ + SetDefaultStyles() was doing some odd things using a variable\r
+ called "session_set", with comments referring to non-existent\r
+ session support code. This has been removed. There should be\r
+ no visible changes from this. PHPlot does not use PHP sessions.\r
+\r
+2009-12-04\r
+ * Fix for bug 2908256, errors in pie charts with bad data array:\r
+ (From a Drupal contrib module report by thekevinday.)\r
+ With pie charts only, a data array with no valid Y values resulted\r
+ in PHP error messages. All other plot types handle this by producing\r
+ an image without a graph.\r
+ Fixed DrawPieChart to behave this way too. If there are no valid Y\r
+ values, or if the sum of all Y values is 0, do not error out, but\r
+ don't draw a pie chart either.\r
+ Also, pie charts now ignore non-numeric Y values, like other plot types.\r
+\r
+2009-11-20 (lbayuk)\r
+ * Fix for bug 2900914 "Problem with display of 0 on Y axis":\r
+ Changed how X and Y values are stepped by tick intervals, to avoid\r
+ cumulative round-off error. This fixes the problem when Y crosses 0 with\r
+ a tick step such as 0.1 resulting in a long label for a very small but\r
+ non-zero number. Fixed DrawXTicks, DrawYTicks, and CalcMaxTickLabelSize.\r
+ (Originally reported by cncnet)\r
+\r
+2009-11-19 (lbayuk)\r
+ * Improve support for using callbacks to annotate plots:\r
+ Added new callback 'draw_all', called after all drawing.\r
+ Supply plot_area[] as argument to some drawing callbacks.\r
+ Added new method GetDeviceXY() to translate from world coordinates.\r
+ Allow NULL or '' for $font in DrawText() internal method, meaning to\r
+ use the generic font. If callbacks want to use DrawText, this\r
+ avoids them having to reference the internal fonts[] array.\r
+\r
+2009-11-01 (lbayuk)\r
+ * Address bug report 2886365 "Declare all functions and variables in\r
+ PHP5 style"\r
+ PHP5 deprecates the use of 'var' to declare a class member variable.\r
+ All initialized class member variables are now declared 'public'.\r
+ (It was tempting to make most or all 'protected' or 'private', but\r
+ that would likely break too much, including the PHPlot Test Suite.)\r
+\r
+ Most class member functions which are meant for internal use only are\r
+ now declared 'protected', so they cannot be called from scripts\r
+ (except in child classes). (Note PHP5 does not deprecate the use of\r
+ just 'function' to mean public, so public functions were not changed.)\r
+ Internal functions are those documented in the manual under Developer's\r
+ Guide, Internal Functions. If your code breaks because you are using\r
+ a method which is now protected, please post the details on the help\r
+ forum.\r
+\r
+ Some member variables which were set in the constructor are now\r
+ initialized with the class instead. (No impact.)\r
+\r
+ Removed commented-out, FIXME-noted code for interim labels.\r
+\r
+2009-10-12 (lbayuk)\r
+ * Bug report 2839547, allow SetImageBorderType('none') to reset the image\r
+ border type. Also checked for other cases where there is no reset;\r
+ found one that exists (Set[XY]LabelType) but needs to be documented.\r
+\r
+2009-07-09 (lbayuk)\r
+ * Added a hook $plot->locale_override which can be set to True to prevent\r
+ PHPlot from loading locale settings from the environment with\r
+ setlocale(LC_ALL, ''). This is necessary for testing PHPlot on Windows,\r
+ where you cannot force a locale with an environment variable. It might\r
+ also be needed for people who want PHPlot's locale to differ from the\r
+ web server's locale.\r
+\r
+2009-06-12 (lbayuk) ===== Released as 5.0.7 =====\r
+\r
+2009-06-11 (lbayuk)\r
+ * Change PHPlot license to LGPL, per Afan.\r
+ phplot.php, phplot_data.php - Change license notice.\r
+ rgb.inc.php - Change top comments and remove bottom marker.\r
+ COPYING - new file, text of LGPL.\r
+ LICENSE.* - removed files - old licenses.\r
+ Makefile - change list of distributed files.\r
+\r
+ * Fix for bug 2803900: SetRGBArray('large') does not work. The include\r
+ file defined a different array name than the main script expected.\r
+ (This bug seems to have happened over 8 years ago.) Fixed the array\r
+ names to match. Also removed the ./ prefix from the included filename\r
+ so it will be found if on the include path but not in the script\r
+ directory. Also added error check if the rgb.inc.php include file\r
+ is needed and not found.\r
+\r
+2009-05-25 (lbayuk)\r
+ * Added new feature to allow partial margin or plot area specification.\r
+ You can omit, or specify as NULL, any of the 4 arguments to\r
+ SetMarginsPixels() or SetPlotAreaPixels(), and this means PHPlot\r
+ should use the automatically calculated margin on that side.\r
+ Credit to adoll for this feature.\r
+\r
+2009-05-17 (lbayuk)\r
+ * Fix for bug 2791502 "Error plots treat missing Y values as 0":\r
+ Plots with data type data-data-error now support missing Y values,\r
+ instead of treating them as 0. This works with lines, points,\r
+ and linepoints plot types, and also honors SetDrawBrokenLines.\r
+\r
+\r
+ * Fix for bug 2792860 "Wrong DataLabelLines with missing Y":\r
+ Do not draw X Data Label Lines at points with missing Y values.\r
+\r
+\r
+ * Fix for bug 2786350 "Missing Y data results in bad auto-range":\r
+ Rewrote FindDataLimits to ignore missing Y values, rather than\r
+ treating them as if 0, for calculating range.\r
+ Bug report and analysis by mrten.\r
+\r
+ * Fix for bug 2786354 "Incorrect auto-range for data-data-error":\r
+ For data-data-error data type, apply the positive and negative error\r
+ amounts for each Y point to that point only, rather than applying the\r
+ largest errors to the overall minimum and maximum Y value for the row.\r
+\r
+ Note: The two fixes above can change existing plots which rely on\r
+ automatic Y range calculation. The first fix affects plots with\r
+ missing Y values and min(Y)>0. The second fix can affect plots using\r
+ data-data-error data type and different error values for different\r
+ points. In both cases the new Y range can be smaller than before.\r
+\r
+2009-01-20 (lbayuk) ===== Released as 5.0.6 =====\r
+\r
+2009-01-18 (lbayuk)\r
+ * Fix for bug 1891636 "Misaligned TTF X Labels":\r
+ PHPlot was using the actual bounding box of each line of text\r
+ to allocate space and set the text positioning, but was ignoring the\r
+ fact that the text baseline is not the same as the bottom of the\r
+ bounding box. This resulted in uneven alignment of the X labels if\r
+ they had different heights (for example, month names Jul and Aug).\r
+\r
+ PHPlot now calculates the size of text for allocation (SizeText) using\r
+ the descenders on the last line, and calculates the size for drawing\r
+ (DrawText) only to the baseline. PHPlot also now uses a fixed line\r
+ spacing for each line of text in a font, rather than the actual text\r
+ height. This allows separately drawn multi-line labels to align.\r
+\r
+ * Changes to line spacing when using multi-line labels:\r
+ PHPlot was using the class variable line_spacing to mean the\r
+ number of pixels between lines of multi-line labels. This made the\r
+ spacing too small for larger fonts, and it was not possible to adjust\r
+ line spacing for different types of text.\r
+\r
+ PHPlot now interprets line_spacing as the number of pixels only\r
+ for GD text, and as a scale factor for the font's built-in line\r
+ spacing for TrueType text. In addition, a new optional argument is\r
+ added to SetFont, SetFontGD, and SetFontTTF to set a line spacing\r
+ specific to that type of text.\r
+\r
+ * Changes had to be made to the legend drawing code to accommodate the\r
+ changes to font handling.\r
+\r
+ Note: The line spacing change results in slightly looser spacing on\r
+ multi-line TrueType text labels, and slightly taller legends, compared\r
+ to version 5.0.5.\r
+\r
+2008-09-21 (lbayuk)\r
+ * Interim fix for bug 1932571 "Data-Data Plot fails with same X values".\r
+ PHPlot will no longer hang when the range of X values is 0 (that is, when\r
+ x_min == x_max). It will arbitrarily set an X range of 1, so the\r
+ calculated tick step is not 0. This is a temporary fix. Work on a smarter\r
+ X and Y range calculation is in progress, which will handle edge cases\r
+ like this better, but it isn't ready and this bug has been open too long.\r
+ Credit to andyl for finding the bug.\r
+\r
+ * Fix font path: Use DIRECTORY_SEPARATOR constant not '/'.\r
+\r
+ Extended the label formatting capabilities, adding 'printf' and 'custom'\r
+ types, added a prefix and suffix for 'data' type, and allow format controls\r
+ to be included in SetXLabelType and SetYLabelType.\r
+\r
+ External changes:\r
+ * Added 'printf' label type. The caller specifies the print format as the\r
+ 2nd argument to SetXLabelType or SetYLabelType (default '%e').\r
+ $plot->SetXLabelType('printf', '%5.2f');\r
+\r
+ * Added 'custom' label type. The caller supplies a callback (typically a\r
+ function name) and optional pass-through argument as the 2nd and 3rd\r
+ arguments to Set[XY]LabelType. The function is called as $f($value, $arg)\r
+ to return the formatted $value.\r
+ $plot->SetXLabelType('custom', 'myfunction', $arg_value);\r
+\r
+ * In addition to Set[XY]TimeFormat, the format string for type 'time' can\r
+ now be set as the 2nd argument to Set[XY]LabelType.\r
+ $plot->SetXLabelType('time', '%H:%M');\r
+\r
+ * In addition to SetPrecision[XY], the precision for type 'data' can now be\r
+ set as the 2nd argument to Set[XY]LabelType. A 3rd and 4th argument\r
+ can supply a prefix and suffix for 'data' formatting. (All optional)\r
+ $plot->SetXLabelType('data', 2, '$', 'US');\r
+\r
+ Internal changes:\r
+ * Class variables x_precision, y_precision, x_label_type, y_label_type,\r
+ x_time_format, and y_time_format have been removed.\r
+\r
+ * New class array variable label_format[], with elements 'x' and 'y' which\r
+ are arrays for label formatting. Elements in the sub-arrays are not\r
+ initialized until needed.\r
+\r
+ * New function SetLabelType, which implements Set[XY]LabelType now.\r
+\r
+ * FormatLabel() was rewritten to support the new label formatting.\r
+\r
+ Compatibility:\r
+ * Any code that directly references class variables related to label\r
+ formatting will break, except for data_units_text. Use the documented\r
+ function methods instead. Setting data_units_text as a suffix is\r
+ deprecated but still works.\r
+\r
+ * The 'data' type precision for 'Y' is still used for pie chart labels.\r
+\r
+2008-07-12 (lbayuk)\r
+ Multiple comment spelling error fixes. No functional changes.\r
+\r
+2008-07-06 (lbayuk)\r
+ Changes to allow mixing GD fixed-font text and TrueType Font (TTF) text\r
+ on the same plot.\r
+ (This change came from work done trying to fix TTF text positioning,\r
+ where it looks like additional information needs to be stored for TrueType\r
+ fonts. The old font data structure was awkward to extend, and allowing\r
+ mixed GD/TTF text was on the to-do list anyway.)\r
+\r
+ External changes:\r
+ * SetFontGD(), SetFontTTF(): New functions to set a font, with type.\r
+ * SetFont(): Now calls SetFontGD or SetFontTTF depending on $use_ttf.\r
+ These changes should be fully compatible with existing programs.\r
+\r
+ Internal changes:\r
+ * Updated comments explaining SetUseTTF() now sets the default type\r
+ (not the only type) of text used.\r
+ * Put all the font data into a class array. (Replaces $this->generic_font\r
+ with $this->fonts['generic'], etc.)\r
+ * ProcessTextGD() and ProcessTextTTF() now take the font array as one\r
+ argument, rather than separate arguments for font path and size.\r
+\r
+2008-01-13 (lbayuk) ===== Released as 5.0.5 =====\r
+ * phplot.php: Updated version\r
+ * README.txt: Updated for new release\r
+ * NEWS.txt: Add text for new release\r
+ * Makefile: Remove 'Callbacks' from release target, as this material is\r
+ now in the reference manual.\r
+\r
+2008-01-07 (lbayuk)\r
+ Copyright updated to 2008 and PHP4 no longer listed as supported.\r
+\r
+ Major rewrite of the margin calculation functions to address multiple\r
+ problems. Fixes for bugs 1856207 "Margin error with 'xaxis'/'yaxis'\r
+ position, 1843012 "Make margins, drawing consistent", and 945439\r
+ "x_tick_label_height not set correctly".\r
+\r
+ Note: These changes are inter-dependent and cannot be split up.\r
+\r
+ * Defer all calculations to DrawGraph time, to eliminate order dependencies.\r
+ These functions now just store their arguments in the object, and all\r
+ calculations happen later:\r
+ + SetXAxisPosition, SetYAxisPosition\r
+ + SetMarginsPixels\r
+ + SetPlotAreaPixels (Stores margins, not area, now.)\r
+ + SetPlotAreaWorld\r
+ + SetXTickIncrement, SetYTickIncrement\r
+\r
+ * A new callback 'debug_scale' was added to trace the margin and scale\r
+ calculations.\r
+\r
+ * CalcMargins was rewritten. Actual sizes of tick and data labels are now\r
+ used, rather than guesses like "use size of biggest Y value". A minimum\r
+ value (3 x safe_margin, or 15 pixels) applies to each margin.\r
+\r
+ * FindDataLimits no longer needs to find the longest data label, since\r
+ CalcMargins now does that more precisely.\r
+\r
+ * DrawXTitle and DrawYTitle now use position offsets calculated by\r
+ CalcMargins. Note: These titles are now offset from the plot area,\r
+ not the image area. The titles will move if you had set the plot area\r
+ or margins.\r
+\r
+ * DrawYTick, DrawXTick rewritten to use pre-calculated offsets, and common\r
+ code moved to new CalcTicks().\r
+\r
+ * DrawXDataLabel: Use pre-calculated offsets for text.\r
+\r
+ * DrawGraph: Rewrote top section (before drawing anything) to do the\r
+ calculations in the proper order, unconditionally.\r
+\r
+ * Class variables removed:\r
+ x_label_inc, y_label_inc, _x_label_cnt : These were never used.\r
+ title_height, x_title_height, y_title_width : Now internal to CalcMargins.\r
+ data_limits_done : No more need to remember if FindDataLimits called.\r
+\r
+ * New class variables added:\r
+ plot_margins_set : Keeps track of user-set plot area or automatic.\r
+ x_label_top_offset, x_label_bot_offset, x_offset_axis_offset,\r
+ y_label_left_offset, y_label_right_offset, y_label_axis_offset,\r
+ x_title_top_offset, x_title_bot_offset,\r
+ y_title_left_offset, y_title_left_offset : Label offsets\r
+ \r
+ * New internal functions:\r
+ CalcPlotAreaPixels : Deferred calculations taken out of SetPlotAreaPixels\r
+ and SetMarginsPixels.\r
+ CalcPlotAreaWorld : Deferred calculations taken out of SetPlotAreaWorld.\r
+ CalcAxisPositions : Calculate axis positions, moved from CalcTranslation.\r
+ CalcTicks : Calculate X and Y tick interval. This still uses the\r
+ same simple method (basically range/10), but now we could drop in a new\r
+ algorithm much more easily. This is now also used by CalcMargins.\r
+ Code taken out of DrawXTicks and DrawYTicks.\r
+ CalcMaxTickLabelSize : So CalcMargins can use the exact tick label sizes.\r
+ CalcMaxDataLabelSize : So CalcMargins can use the exact data label sizes.\r
+ DrawXTick : Code split out from DrawXTicks for symmetry with DrawYTick.\r
+\r
+\r
+2007-12-13 (lbayuk)\r
+ * Changed ProcessTextTTF() so SizeText() will return integers. It rounds\r
+ the calculated values up, so the bounding box really contains the text.\r
+ This also prevents unneeded float calculations in derived values.\r
+\r
+2007-12-09 (lbayuk)\r
+ Major rewrite of the text drawing functions to address multiple problems.\r
+ Note: These changes are inter-dependent and cannot be split up.\r
+\r
+ * Fixed bug 1813070 "Bad position for multi-line TrueType text":\r
+ TTF text is now drawn line-by-line, not as a block, for proper\r
+ alignment and positioning.\r
+\r
+ * Fixed bug 1813071 "Wrong title height for multi-line TTF text":\r
+ Corrected miscalculation of overall height of multi-line TTF titles.\r
+ This bug resulted in over-sized margins.\r
+ The height is now computed line-by-line, including the inter-line spacing.\r
+\r
+ * Fixed bug 1813474 "DrawText alignment arguments wrong":\r
+ Corrected meaning of 'top' vs 'bottom' alignment. PHPlot now follows\r
+ the usual conventions: 'top' alignment means top of text to reference.\r
+ DrawText default for vertical alignment is still 'bottom', but the\r
+ meaning was corrected. All callers of DrawText were fixed.\r
+\r
+ * Fixed bug 1816844 "Fix order dependency for setting titles":\r
+ Defer processing titles strings until DrawGraph(), so there is no\r
+ more order dependency (no need to set font before setting title strings).\r
+\r
+ * Fixed bug 1819668 "Horiz. align multi-line text: GD vs TTF":\r
+ The new text routines draw TTF text line-by-line and correctly do\r
+ right-, center-, and left- alignment of each line within a text block.\r
+\r
+ * Fixed bug 1826513 "FIXME in DrawLegend: Max label length":\r
+ Use actual width of widest legend line to calculate legend box size.\r
+\r
+ * Partial fix for bug 945439 "x_tick_label_height not set correctly":\r
+ In FindDataLimits(), save the longest data label, not just its length,\r
+ and use the actual rendered size of that string in CalcMargins() for\r
+ the margin calculations.\r
+ Also take into account which of the tick or data labels are visible.\r
+ This is not a complete fix, but is a significant improvement.\r
+\r
+ The following changes were made related to the above fixes:\r
+\r
+ + Replaced internal function TTFBBoxSize(), which didn't work right, with\r
+ SizeText(). It returns the orthogonal bounding box of a block of text,\r
+ and works with both GD and TTF text.\r
+\r
+ + DrawText() and SizeText() call a single function ProcessText(), which is\r
+ the only place GD text and TTF text are distinguished. (So eventually\r
+ we will be able to mix GD and TTF text on a plot.)\r
+\r
+ + New internal functions ProcessTextGD() and ProcessTextTTF() draw (or size)\r
+ GD and TTF text respectively. These are only called by ProcessText().\r
+ These are re-implementations which properly position and align text.\r
+\r
+ + Removed class variables title_angle, x_title_angle, and y_title_angle. The\r
+ titles only work at their fixed angles anyway (0, 0, and 90 respectively).\r
+\r
+ + Line spacing set with SetLineSpacing() now affects TTF text as well as\r
+ GD text. Previously, it only affected GD text. The default line spacing\r
+ happens to be usable for TTF text.\r
+\r
+ + Added new callback hook 'debug_textbox' for developing, testing, and\r
+ documenting. It provides access to the text area bounding box.\r
+\r
+ + Removed unneeded class variables x_tick_label_height, y_tick_label_width,\r
+ x_tot_margin, y_tot_margin.\r
+\r
+2007-11-25\r
+ * Improve error handling:\r
+ Internal functions PrintError() and DrawError() are now the same. Both\r
+ will draw the error message into the image and output it, and then\r
+ trigger a user-level error. If no error handler has been set, it will\r
+ exit, as before. But now the error message should also get logged, or\r
+ written to the standard error stream, depending on the SAPI in use.\r
+ You can now establish an error handler to catch most PHPlot errors and\r
+ do some cleanup before exit.\r
+\r
+ This fix also covers bug #1823774 "Default Font Path and Error Message\r
+ Output".\r
+\r
+ Fixed the return value of most PHPlot functions, to return False on\r
+ error, else True. Since uncaught errors are fatal anyway, this only\r
+ affects code with an error handler that returns, which is not\r
+ recommended and unsupported at this time. These changes are for\r
+ possible future error handling options.\r
+\r
+2007-11-22\r
+ * Fix bug 1836528 "Insufficient checking of parameter values":\r
+ Rewrote CheckOption to correctly validate option choices.\r
+ (It previously accepted substrings and other incorrect values.)\r
+ PHPlot methods that use CheckOption now must be called with valid option\r
+ values. Empty strings are also no longer accepted.\r
+\r
+2007-11-17 (lbayuk)\r
+ * Change to callbacks to support extra arguments.\r
+ The PHPlot class can now pass extra arguments to a callback function.\r
+ Callback functions now take the following form:\r
+ my_callback($img, $passthru_arg, ...)\r
+ Where '...' is zero or more additional arguments supplied by PHPlot to\r
+ the callback. Each implemented callback reason will define any\r
+ additional arguments it uses. The existing defined callbacks have not\r
+ changed and do not currently pass any extra arguments.\r
+\r
+2007-11-10 (lbayuk)\r
+ * Fix bug 1827263 "Spoiled up pie-chart if $val is close to zero":\r
+ Skip pie slices which would result in an integer angle of zero\r
+ degrees, because the GD arc filling function will draw a complete\r
+ circle for that case.\r
+ Credit to Viacheslav <webdeveloper.ua at gmail.com> for finding this.\r
+\r
+ * Removed 8 of the functions (class methods) marked 'deprecated'. Only\r
+ deprecated functions which seem to have been for internal use have\r
+ been removed. Even old scripts shouldn't be using them, and they are\r
+ becoming a problem to maintain.\r
+ Removed: SetImageArea() DrawDotSeries() DrawLineSeries() CalcXHeights()\r
+ CalcYWidths() DrawLabels() InitImage() DrawDashedLine().\r
+\r
+2007-10-20 (lbayuk) ===== Released as 5.0.4 =====\r
+ * phplot.php: Updated copyright, version, and authors comments at top.\r
+ * README.txt: Updated for new release\r
+ * NEWS.txt: Add text for new release\r
+\r
+2007-10-18 (lbayuk)\r
+ * Add callbacks - experimental feature:\r
+ New functions SetCallback, GetCallback, RemoveCallback.\r
+ New internal function DoCallback.\r
+ Added callback hooks to DrawGraph.\r
+\r
+ Re-arranged code in DrawGraph to bring pie chart drawing into the main\r
+ switch on plot type, rather than a special case in its own block. This\r
+ makes it easier to follow and easier to add callback hooks.\r
+\r
+ * Callbacks: New file, documentation for the new callbacks feature.\r
+ (This won't be in the manual while it is an experimental feature.)\r
+\r
+2007-10-15 (lbayuk)\r
+ * Fix for bug 1813021: Miss-positioned right-justified vertical GD text.\r
+ Fixed DrawText() to correctly position 90 degree right-justified text\r
+ drawn in a fixed GD font. This could be seen with 90 degree Y tick\r
+ labels. (Found by accident while working on TrueType text problems.)\r
+ Also some code cleanup in DrawText: use elseif where appropriate.\r
+\r
+2007-10-09 (lbayuk)\r
+ * Code cleanup: Simplify SetIndexColor() and SetIndexDarkColor().\r
+ There is no need to first try ImageColorExact, then ImageColorResolve\r
+ if that fails. ImageColorResolve does all that for us.\r
+\r
+ Code cleanup: Rewrite SetRGBColor(). It now detects if an unrecognized\r
+ color name or color value form is used, and draws an error message.\r
+ Before this it would get a PHP index error and "headers already sent"\r
+ condition.\r
+\r
+ * Code cleanup: Remove duplicated code for loading image files.\r
+ Added new class-private function GetImage() which loads an image based\r
+ on the image type, and also returns the image size. This replaces\r
+ duplicated code in tile_img() and SetInputFile().\r
+ Also fixed comment at top of SetImageFile which said it was deprecated.\r
+ It isn't - it is used by the constructor. Moved the function out of the\r
+ 'deprecated' area up to below where it is used.\r
+\r
+ * Code cleanup: PHPlot should not define or affect anything outside its\r
+ own class.\r
+ - Removed the check for __FUNCTION__ (PHP 4.3 and up). This is obsolete.\r
+ - Do not set error_reporting to E_ALL. Although it is recommended that\r
+ scripts do this, it is not the place of loaded classes to do it.\r
+ - Remove unused global constant TOTY.\r
+ - Removed constants MAXY and MINY. Global constants like this are bad.\r
+ These were used as magic index values into data[] to hold min and max Y\r
+ values for the row. Instead, put them in separate arrays which are\r
+ named data_miny[] and data_maxy[]. (This seems to be only used by the\r
+ data line drawing function.)\r
+\r
+ Comment cleanup: Remove one commented-out partial function DrawPlotLabel,\r
+ and fix another commented-out code fragment in DrawYErrorBar. Both of\r
+ these had unmatched braces in them which caused a balance-braces check\r
+ to fail.\r
+\r
+ * Code cleanup, array padding: Get rid of functions outside the class\r
+ and remove the interim fix for PHP 5 (which changed the behavior of\r
+ array_merge). Rewrote external function array_pad_array() as a new\r
+ class function pad_array(). It does not need access to the class,\r
+ but I don't think PHPlot should add to the global namespace more\r
+ than necessary. The third argument (array to use for padding) was\r
+ never used, so it was removed. It always pads the array with itself.\r
+ It now only works on 'usual integer indexed' arrays (0-based\r
+ sequential integer index). The was previously required but\r
+ undocumented for some of the arrays (like line_widths); now it is\r
+ required for all style arrays and will be documented. Now we can pad\r
+ the array to the required length, not just N times its previous\r
+ length, and we don't need array_merge. Deleted external function\r
+ array_merge_php4() as it is no longer used.\r
+\r
+ Deleted PHP end marker ?>. You don't need this and it can cause\r
+ problems with extra whitespace in your output.\r
+\r
+2007-09-24 (lbayuk)\r
+ * Code cleanup: Fix ternary operator misuse. This doesn't change\r
+ behavior, but it was annoying me so I fixed it.\r
+ Replaced all cases of code like this: $a = ($a > $b) ? $b : $a\r
+ With just: if ($a > $b) $a = $b\r
+\r
+ * Fix Makefile 'release' target to set owner/group when creating\r
+ the tar file. This avoids having to run it as root, but it needs\r
+ GNU tar to work.\r
+\r
+2007-09-08 (lbayuk)\r
+ * Fix for bug 1790441: Removed the PHPlot quasi-destructor function and\r
+ the register_shutdown_function() call which arranged for it to be used.\r
+ This was preventing release of memory when a PHPlot object was unset,\r
+ because the registered shutdown function held a reference to it.\r
+ So rather than improving memory use, it had the opposite effect.\r
+ Note: It is no longer necessary or recommended to use reference\r
+ assignment ($plot =& new PHPlot) for PHPlot object creation.\r
+ Thanks to annajilly for the thorough analysis, bug report, and fix.\r
+\r
+2007-09-05 (lbayuk)\r
+ * Rewrote FormatLabel() to ignore blank label values. Adapted from a\r
+ patch and feature request submitted by Gerhard Reithofer (exgerhardr).\r
+ Blank labels used to produce an error if the LabelType was set to\r
+ 'time', and zero if set to 'data'. Now they are just ignored. This\r
+ provides a simple way to have labels only at selected intervals when\r
+ using time or data formats. For example, you can have a date/time\r
+ label at every 10th data point by setting the labels for the other 9\r
+ to be empty strings. Also: Removed $which_pos values 'plotx' and\r
+ 'ploty'. These were unused by PHPlot and this is an internal-only\r
+ function so there is no compatibility issue. Removed error checking on\r
+ $which_pos for the same reason; the error message used an undefined\r
+ variable anyway so it wouldn't have worked.\r
+\r
+2007-08-26 (lbayuk)\r
+ * Allow SetLegendStyle colorbox_align argument to be 'none', to suppress\r
+ the colorboxes in the legend.\r
+\r
+ Fix comment on $legend_text_align: empty means right, not left.\r
+\r
+ Rewrote DrawLegend layout code to make it easier to understand. The\r
+ result should be within 1 or 2 pixels of the previous size and position.\r
+\r
+ * Fixes for bug 1779115: SetLegendWorld() fails on undefined vars\r
+ Store the given coordinates and remember that they need to be converted\r
+ from world to pixel coordinates, but defer trying to actually convert\r
+ them until it is time to draw the legend. This way, there are no\r
+ problems with the scale having to being set up first (which is nearly\r
+ impossible to do). Made the following changes:\r
+\r
+ Changed legend class variables to be uninitialized, and unset (rather\r
+ than empty string) means use the defaults. Added a new variable:\r
+ $legend_xy_world. If it is set, (legend_x_pos, legend_y_pos) need to\r
+ be converted to pixel coords. If it is unset, they are already pixel\r
+ coords (or undefined, meaning defaults).\r
+\r
+ Changed usage of internal function DrawLegend(): removed all arguments.\r
+ X and Y were always the class variables anyway, and now it needs to\r
+ also use the new flag to tell it if X and Y are world or pixel coords.\r
+ The third argument was unused.\r
+\r
+ Removed third, unused, default NULL argument from SetLegendPixels and\r
+ SetLegendWorld.\r
+ \r
+ Changes to DrawLegend to convert x, y coords to pixel coordinates\r
+ if they came from SetLegendWorld. Also account for new usage of\r
+ the class variables: Test for unset to mean use default.\r
+\r
+2007-08-04 (lbayuk)\r
+ * New feature: control legend text and color box alignment.\r
+ Adds a new function SetLegendStyle to adjust the alignment of the\r
+ text and the color boxes inside the legend.\r
+ Based on part of bug 1208054, contributed by David Hernández Sanz.\r
+\r
+2006-12-02 (lbayuk)\r
+ * Fixes for bug 1605555: Y Data Labels use wrong font and not formatted.\r
+ Use y_label_font (not x_label_font) for Y Data Labels.\r
+ Use the formatted value for the label, not the original text.\r
+ (This applies to bar charts only, with the new Y data labels.)\r
+\r
+ * One fix for bug 1208054: Localization of number format.\r
+ If number formatting is enabled with 'data' format type, PHPlot previously\r
+ used dot for decimal point and comma for thousands separator, and there\r
+ was no way to change it.\r
+ \r
+ This fix adds a new function:\r
+ SetNumberFormat($decimal_point, $thousands_separator)\r
+ to set the separators. In addition, if that function is not used,\r
+ PHPlot will now try to use locale-dependent separators. If locale\r
+ information is not available, it will fall back to the old defaults\r
+ of dot and comma.\r
+\r
+ Note: This change may have some negative effects. 1) If your locale is\r
+ "C" or "Posix", you might not get a thousands separator now by default.\r
+ You should be using a more specific locale. 2) If your PHP script is\r
+ forcing a specific locale with setlocale(), PHPlot will probably undo\r
+ that because it uses setlocale(LC_ALL, '') to import locale information\r
+ from the environment. We have to do that, or a locale set through\r
+ the environment is ignored. But it will override a manually set locale.\r
+\r
+ * Fix for bug 937944: X/Y Tick Counts\r
+ PHPlot could draw one too few Y tick marks, and one too many X tick marks.\r
+\r
+ Changed the code to stop drawing X (Y) tick marks when the current X (Y)\r
+ value exceeds the maximum X (Y) value plus a small fudge factor. The fudge\r
+ factor accounts for cumulative error when repeatedly adding a delta to\r
+ the X (Y) value.\r
+\r
+ Notes: The bug report was writing about Y tick counts only, but X tick\r
+ counts can also be wrong. The proposed fix in the bug report does not\r
+ work in all cases.\r
+\r
+ This fix changes the appearance of many plots which were missing the\r
+ top-most Y tick mark. The extra X-tick mark problem is less common.\r
+\r
+===== Released as 5.0rc3 =====\r
+\r
+2006-11-13 (lbayuk)\r
+ * Fix for bug 1437912: x-axis label misalignment [bar charts]\r
+ The calculations were redone from scratch.\r
+ New control variable 'bar_extra_space', which works in addition to\r
+ 'group_frac_width' to control how much extra space is around the bars.\r
+ Made bar widths match for 'stackedbars' and 1-bar-per-group 'bars'.\r
+\r
+ NOTE: This changes the appearance of charts. bars in 'stackedbars'\r
+ will now be thinner, and bars in 'bars' graphs will be thicker. I\r
+ saw no reason for them being different before.\r
+\r
+ This fix required fixing the positioning on the new bar data labels,\r
+ which was off before. The bar data labels will now be centered.\r
+ Additional fixes to bar chart data labels:\r
+ For negative values, the label will center under the bar.\r
+ Fixed X-adjustment to account for shading.\r
+ Fixed to not suppress the data label if the value is 0.\r
+\r
+\r
+2006-11-10 (lbayuk)\r
+ * Fix for bug 1594457: DrawError text wrap and background fix\r
+ Do error image white background correctly, and word-wrap the text.\r
+\r
+ * Fix for bug 1594458: Suppress lines or points in 'linepoints' \r
+ Don't draw X data labels twice for 'linepoints'.\r
+ Allow SetPointShapes value 'none' to suppress points, and allow\r
+ SetLineStyles value 'none' to suppress lines. This allows a 'linepoints'\r
+ graph to mix lines only, points only, and both on the same graph.\r
+\r
+\r
+2006-11-09 (lbayuk)\r
+ * Fixes for bug 1446523:\r
+ + Wrong variable name in deprecated SetAxisFontSize()\r
+ + Fails to properly handle error if SetDataValues() was never\r
+ called, or not called with a data array.\r
+\r
+ * Fix for bug 1117122: Pie Chart ignores SetPlotAreaPixels\r
+ Don't let DrawGraph recalculate the plot area for pie charts if the\r
+ user already set it with SetPlotAreaPixels.\r
+\r
+ NOTE: This fix may slightly change the appearance of some pie charts,\r
+ whether or not they use SetPlotAreaPixels.\r
+\r
+ * Fix for bug 1103992: Wrong max Y calculated for stackedbars\r
+ Changes FindDataLimits to calculate max Y correctly. It was counting\r
+ the first Y value in each record twice, which is always wrong but\r
+ only affected stackedbars because the Y values are summed.\r
+\r
+ * Fix for bug 1096199: Wrong error bar colors in DrawDotsError.\r
+ Rewrites DrawDotsError to make it work like DrawLinesError to\r
+ correctly increment the record and color indexes.\r
+ Also fixes uninitialized x_now_pixels.\r
+\r
+ * Fix for bug 1096197: No borders on unshaded Draw[Stacked]Bars\r
+ Unshaded Bars and StackedBars covered the border with the rectangle.\r
+ The fix is to draw the rectangle, then the border.\r
+\r
+ NOTE: This fix changes chart appearance. Bars and Stacked Bars\r
+ will now get a black border around each bar by default, if you\r
+ turn off the 3D-shading. If you want borderless, unshaded bars\r
+ you need to use SetDataBorderColors to set the data border colors\r
+ to be the same as the data colors.\r
+\r
+ * Fix for bug 1333164: Negative data values, if string variables, result\r
+ in unfilled bars. The problem was a string-to-string compare of a\r
+ negative number with the empty string x_axis_position. Fixed by\r
+ initializing x_axis_y_pixels to 0 if SetXAxisPosition was not used.\r
+\r
+\r
+2005-04-17 (afan)\r
+ * Fix for bug [ 1161072 ] SetInputFile warning, background overwrite\r
+\r
+ * Bug 1182672 fixed\r
+\r
+2005-04-15 (afan)\r
+ * fix for bug: [ 1182666 ] Y Auto-scale rounds in wrong direction\r
+\r
+ * Fix for bugs 1144644 TrueType font path problems and 1106328 TTF\r
+ path/filename inconsistency\r
+\r
+ * Fix Bug: [ 1117120 ] X Title sizing uses Y Title font height\r
+\r
+2005-04-13 (afan)\r
+ * Error in SetLineStyles() - does not accept an array argument\r
+\r
+\r
+2005-03-29 (afan)\r
+ * Small typo fixed in SetYDataLabelPos\r
+\r
+ * Update SetDataLabelPos: For past compatibility we accept plotleft,\r
+ ...but pass it to SetTickLabelPos\r
+\r
+2005-03-26 (afan)\r
+ * Change to line 3802: data lables now work with multiple bars with *$idx\r
+\r
+2005-03-25 (afan)\r
+ * Added Function DrawDataLabels to put data labels in world coords,\r
+ added call from DrawBars and modified SetYDataLabelPos to flag\r
+ whether or not to call DrawDataLabels.\r
+\r
+2005-01-20 (migueldb)\r
+ * Many bugfixes reported and solved by L. J. Bayuk. Thanks!\r
+ + fixed bug #1096190\r
+ + FindDataLimits(): fixed bug #1096192\r
+ + CalcTranslation(): fixed bug #1101317\r
+ + DrawImageBorder(): fixed bug 1096200\r
+ + DrawXDataLabel(): fixed bug 1099879\r
+ + DrawDots(): fixed bug #1096194\r
+\r
+===== Released as 5.0rc2 =====\r
+\r
+2004-10-24 (migueldb)\r
+ * array_merge_php4(): added to cope with the bug introduced by\r
+ the change in array_merge() from PHP4 to PHP5 (I haven't verified this)\r
+ * Fixed some divisions by zero, thanks to an old bug report.\r
+\r
+2004-09-09 (migueldb)\r
+ * SetPointSize(): deprecated\r
+ * SetPointSizes(): added as replacement for SetPointSize().\r
+ Now able to set point sizes on a per line basis.\r
+ * SetPointShape(): deprecated.\r
+ * SetPointShapes(): added as replacement for SetPointShape().\r
+ Now able to set point shape on a per line basis.\r
+ * DrawDot(): now needs record number to decide which dot shape and\r
+ size to draw.\r
+ * CalcMargins(): dirty fix for x data label placing.\r
+ * tile_img(): fixed tile placement.\r
+\r
+2004-06-14 (migueldb)\r
+ * SetXTickLabelPos() and others: more on the bug reported by Jo Demol.\r
+ * Fixed bug reported by Jo Demol.\r
+\r
+2004-05-11 (migueldb)\r
+ * SetBgImage(): added.\r
+ * SetPlotAreaBgImage(): added.\r
+ * SetInputFile(): deprecated.\r
+ * DrawBackground(): now accepts images as backgrounds.\r
+ * DrawPlotAreaBackground(): now accepts images as backgrounds.\r
+ * tile_img(): internal method added.\r
+\r
+..........\r
+Editor's Note: For older changes to PHPlot, please see the CVS logs.\r
-This is the NEWS file for PHPlot, with release documentation.
-The project web site is http://sourceforge.net/projects/phplot/
-The project home page is http://phplot.sourceforge.net/
-Refer the the ChangeLog file for detailed source changes.
------------------------------------------------------------------------------
-
-2011-01-15 Release 5.3.1
-
-Overview:
-
-This is the current stable release of PHPlot. This release focuses on
-providing better support and documentation for creating multiple plots on a
-single image.
-
-The PHPlot reference manual has been updated to match this release. Some
-new material has been added, including a new section on multiple plots per
-image, and a new example of overlay plots.
-
-
-Bugs Fixed in 5.3.1:
-
-#3143586 "Multiple plots per image - fixes & docs":
- The reference manual now contains a section on multiple plots, and a
- new example. A bug was fixed with SetLegendWorld and multiple plots.
- Image border will now be drawn at most once. It is now possible to
- restore the default 'automatic' behavior for axis positioning. Other
- functions were changed to make arguments optional, so when called with
- no arguments they reset to the default. The reference manual has been
- updated with these changes too.
-
-#3147397 "Data colors missing with multiple plots":
- The fix for bug #3049726 "Optimize color allocation" caused a problem
- with multiple plots. This has been fixed. PHPlot will no longer truncate
- the data color table at each plot. It will still only allocate data colors
- as needed, but all of the pre-set or configured data colors will be
- available for each plot.
-
-
------------------------------------------------------------------------------
-
-2010-12-04 Release 5.3.0
-
-Overview:
-
-This is the current stable release of PHPlot. This release includes new
-plot types and some new features.
-
-The PHPlot reference manual has been updated to match this release. Some of
-the sections have been moved, there are new examples for the new plot types,
-and a new section on tunable parameters has been added.
-
-
-New features in 5.3.0:
-
-#3093483 "Investing support chart types":
- Added 3 new plot types: Basic OHLC (Open/High/Low/Close), Candlesticks,
- and Filled Candlesticks. These are variations of plots that show the
- performance of a stock or other financial security.
-
-#3111166 "Control legend colorbox width":
- It is now possible to control the width of the color boxes in the
- legend, using a class variable which is documented in the manual.
-
-#3117873 "Data value labels in more plot types":
- Data value labels, which show the dependent variable values near the
- data points, are now available for more plot types: lines, linepoints,
- points, and squared. (These were previously available only for bars and
- stackedbars plots.)
-
-#3127005 "Ability to suppress X/Y axis lines":
- New functions SetDrawXAxis() and SetDrawYAxis() were added to control
- display of the X and Y axis lines. (These lines were probably the only
- PHPlot elements that could not be turned off.) In special cases, these
- can be used to produce a "bare" plot image.
-
-
------------------------------------------------------------------------------
-
-2010-10-03 Release 5.2.0
-
-Overview:
-
-This is the current stable release of PHPlot. This release includes some
-bug fixes and new features, described below, and a reimplementation of
-internal processing of colors.
-
-The PHPlot reference manual has been updated to match this release.
-Horizontal plots are now documented in the manual, and the interim
-documentation in the source release (HorizontalBars.txt) has been removed.
-The manual is available in HTML format as a separate download from
-Sourceforge. The manual is also available for on-line viewing from the
-project home page. Starting with this release, the manual is also
-available in PDF format from the project home page.
-
-
-Cautions, Important Notes, and Compatibility Issues:
-
-Due to changes in color allocation (see bug #3049726 below), image files
-produced with PHPlot-5.2.0 will differ when compared byte-for-byte with
-those created by earlier releases, even when the images are identical (as
-they nearly always are).
-
-If you are creating a horizontal plot with any negative X values, and not
-setting the Y axis position, your plot will change (see bug #3074402 below)
-because PHPlot no longer leaves the Y axis on the left for horizontal plots.
-
-Some internal methods that used to have 'public' visibility are now protected.
-This will generally prevent you from using them. The list of changed functions
-can be found in the release ChangeLog. Avoid using any internal methods.
-
-If you are making a stackedbar plot with any negative values, PHPlot-5.1.3
-and earlier took the absolute value of each data value (which was not
-documented), but PHPlot-5.2.0 does not. See Feature Request #3073679 below.
-
-If your plot fills the 256 available color map slots in a palette image,
-your image may look different with PHPlot-5.2.0 due to changes in color
-allocation order. This was seen on two of the tests in the PHPlot test
-suite. These tests tiled a JPEG image into the plot area or image
-background. Being a truecolor image, the JPEG had a huge number of colors,
-which filled all available slots in the color map. Additional colors for
-plot elements had to be approximated, and different colors resulted with
-PHPlot-5.2.0 versus previous releases. To avoid this problem, either use a
-truecolor PHPlot object (PHPlot_truecolor constructor), or reduce the
-number of colors in the background image and convert it to PNG or GIF.
-
-This release contains significant changes to PHPlot internals. In particular,
-variables and functions related to element colors and color handling have
-changed. Refer to the PHPlot release ChangeLog for more details. Remember,
-if you rely on accessing any member variable, or on using any non-public
-function or any function not documented in the reference section of the manual,
-your code is at risk of breaking with each new release.
-
-
-New features in 5.2.0:
-
-#3077554 "Finer control over plot element colors" (partial):
- The X, Y, and main titles can now have different colors. See the PHPlot
- Reference Manual entries for SetXTitleColor and SetYTitleColor.
-
-#3073679 "Stacked bar plots with negative values":
- A stacked bar plot can now include negative values, and stacks of negative
- values will be drawn downwards (or leftwards). See the PHPlot Reference
- Manual under "Plot Type: stackedbars" for details.
-
-
-Bugs Fixed in 5.2.0:
-
-#3045131 "SetTransparentColor problems":
- Setting a transparent color now works whether before or after setting
- the background color (for example), and also now works with a data color.
-
-#3049726 "Optimize color allocation"
- PHPlot now defers allocating colors until drawing time, and tries to allocate
- only the colors which are actually needed. For palette images, this results
- in use of fewer color slots and slightly smaller image files.
-
-#3074402 "Fix Y axis default for horizontal plots":
- When horizontal plots were introduced, an asymmetry with the X and Y axis
- position defaults was known but left. This behavior was later determined
- to be unhelpful. So now the Y axis on horizontal plots will default to X=0,
- or the X value closest to zero within the plot area range. This is the same
- behavior as for the X axis in vertical plots.
-
-#3056991 "Internal methods should be 'protected'":
- More of the internal PHPlot functions were changed to 'protected' visibility,
- as the test suite was fixed to not call them directly.
-
-#3057000 "Review 'deprecated' methods":
- One broken deprecated method (SetColor) was removed and one changed.
- Note that deprecated methods are not documented and not tested.
-
------------------------------------------------------------------------------
-
-2010-08-30 Release 5.1.3
-
-Overview:
-
-This is the current stable release of PHPlot. Additional horizontal plot
-types and features have been added, however horizontal plots are still
-considered 'experimental'. A new callback has been added which allows
-greater control over the data colors. An improved method for accessing
-TrueType Font (TTF) files means that on many systems TTF text can be used
-without specifying font paths.
-
-
-Cautions and Important Notes:
-
-Since the previous PHPlot release, PHP-5.3.3 and PHP-5.2.14 have been
-released, and these include a fix for the TrueType Font (TTF) rendering
-problem. Use of these releases is now recommended.
-
-There has been extensive cleanup of the PHPlot code. If you have a
-customized version of PHPlot, you may find it difficult to update.
-
-The "additional data support" script phplot_data.php has been removed from
-this release. The script has not been developed or tested in a long time,
-and was found to have numerous problems. The script can still be found in
-the CVS repository.
-
-The changes in this release (horizontal plots, custom data color callback,
-and TrueType Font handling) should not result in any compatibility issues.
-
-
-New features in 5.1.3:
-
-#3049703 "Additional horizontal plots and features":
- + Implemented data values labels in horizontal bar charts.
- Use: SetXDataLabelPos('plotin').
- + Add horizontal stacked bar charts, with data value labels.
- + Add horizontal thinbarline plots.
- Horizontal plots are still considered 'experimental', and documentation is
- in the HorizontalBars.txt text file rather than the PHPlot Reference Manual.
-
-#3034164 "Extended control of data colors":
- New callback 'data_color' can be used to customize selection of the color
- of each bar, line segment, point marker, etc. This is documented in the
- PHPlot Reference Manual section "Custom Data Color Selection", with new
- examples in the Examples chapter.
-
-
-Bugs Fixed in 5.1.3:
-
-#3051906 "Better choice for default TT font":
- Rather than always using the unlikely 'benjamingothic.ttf' as its default
- TrueType font name, PHPlot now has a short list of sans-serif fonts, and
- tries to find one that works if a default TT font is needed. On many
- systems, this will provide a high-quality default font without help.
-
-#3051832 "Let PHP/GD find the font file":
- Instead of using file existence to validate a TT font file, PHPlot now
- just tries to use the font. This allows PHP/GD to use its own rules to
- try to find the font, without needing a pathname. This works on Windows
- and at least some Linux systems.
-
-#3048267 "phplot_data add-on is still broken"
- Not fixed. phplot_data.php has been removed from the release.
-
------------------------------------------------------------------------------
-
-2010-06-29 Release 5.1.2
-
-Overview:
-
-This is the current stable release of PHPlot. Truecolor image support is no
-longer considered 'experimental', and is now documented in the reference
-manual. There is a new experimental feature for horizontal bar charts. This
-release also contains a bug fix and new feature.
-
-
-Cautions and Important Notes:
-
-The advisory against using PHP-5.3.2 or PHP-5.2.13 with PHPlot if you use
-TrueType fonts (TTF) continues. See the item below for PHPlot-5.1.1. The
-good news is that this has been fixed by the PHP Team and will be in the
-next releases.
-
-Compatibility of data type and plot type are now checked completely. If
-you used an incorrect data type with certain plot types, your script may no
-longer work until you fix the data type. Specifically, the area, squared,
-and thinbarline plot types failed to check the data type they received, and
-treated anything other than 'data-data' as 'text-data'. If you have a
-squared plot with data type 'data-data-error', for example (which is not
-supposed to work), it did produce a plot, but will now result in an error.
-
-The addition of horizontal bar charts should not impact any existing plot,
-with one small exception. The function SetYDataLabelPos() used to accept
-some additional, undocumented options (plotleft, plotright, both, yaxis)
-and pass these through to SetYTickLabelPos() "for compatibility". It no
-longer does so, as some of those are now used for horizontal bar chart
-labels. To position Y tick labels, use only SetYTickLabelPos().
-
-
-New features in 5.1.2:
-
-#3002606 "Add to plot and image border options":
- SetPlotBorderType() now accepts 'right', 'top', and 'bottom', as well
- as an array of options. So you can now control exactly which of the 4
- border sides will be drawn.
- SetImageBorderType() now accepts 'solid' as a choice. This will use the
- actual color set with SetImageBorderColor(), rather than the darker
- shade as type 'plain' does (which may have been a bug).
- SetImageBorderWidth() is a new function that sets the width of the image
- border. The defaults are the same as the fixed values used before: 1
- pixel for plain, 2 pixels for raised. The image border width is now
- accounted for in margin calculations, if it is greater than 2 (to make
- sure existing plots will not change).
-
-#2885930 "Horizontal Bars":
- Horizontal bar charts are implemented, as an experimental feature.
- 'Experimental' means they are not yet documented in the reference manual,
- and subject to change or removal.
- Refer to the text file HorizontalBars.txt for details.
-
-#2947679 (follow-up) "Support for alpha blending/Truecolor":
- Truecolor support is now documented in the Reference Manual. The interim
- documentation file Truecolor.txt has been removed. Alpha channel
- specification now works with both constructors and both image types. This
- fixes an issue if the base constructor was used with a truecolor background
- image. (In PHPlot-5.1.1, the result would be a truecolor image, but the
- alpha channel features were not available.)
-
-
-Bug Fixed in 5.1.2:
-
-#3010116 "Bad rendering of title in multi-plot image when using TTF":
- Make sure the main title is drawn only once, to avoid bad rendering of
- TTF titles with multiple plots due to anti-aliasing.
-
------------------------------------------------------------------------------
-
-2010-04-04 Release 5.1.1
-
-Overview:
-
-This is the current stable release of PHPlot. This release adds truecolor
-image support as an experimental feature, fixes a number of bugs and adds
-a few new features.
-
-The PHPlot reference manual has been updated to match this release. The
-manual is available as a separate download from Sourceforge. The manual is
-also available for on-line viewing from the project home page.
-
-See the ChangeLog file in the release for more about changes and bug fixes.
-
-
-Cautions and Important Notes:
-
-Avoid using PHP-5.3.2 or PHP-5.2.13 with PHPlot if you use TrueType fonts
-(TTF). Some new bugs were introduced in those releases that adversely
-affects accurate positioning and rendering of TrueType font text.
-
-
-New features in 5.1.1:
-
-#2947679 "Support for alpha blending/Truecolor":
- PHPlot can now produce truecolor images, with alpha blending of colors and
- other effects. This is considered an experimental feature, meaning it is
- not yet documented in the PHPlot Reference Manual, and subject to change.
- Refer to the text file Truecolor.txt included in the PHPlot release for
- information on using truecolor.
- Two drawing changes were made to improve plot appearance with Truecolor:
- + Filled dots (in points & linepoints plots) are now drawn better. This
- also makes them look rounder with regular (non-Truecolor) plots.
- + Area plots have the areas filled without overlapping each area down to
- the Y axis. This was needed to fix problems with alpha blending, and
- should have no effect on non-Truecolor plots.
-
-#2973995 "Add y-Data to Stackedbars":
- You can now have Y Data Labels with 'stackedbars' plots. These label the Y
- values (incremental and total) for each bar. Refer to the reference manual
- page for SetYDataLabelPos().
-
-
-Bug Fixes in 5.1.1:
-
-#2976735 "Improvements and fixes for 'area' plots":
- Moving X axis works; handle Y<0 better; new 'stackedarea' plot type is a
- variation on 'area' with the data represented differently.
-
-#2974639 "Stacked bars plot breaks with X axis != 0":
- Moving X axis works.
-
-#2963757 "point_counts undefined error in 5.1.0":
- Fixed an error introduced in PHPlot-5.1.0 when point size and shape arrays
- were set to the same size.
-
-#2938219 "Bars go in wrong direction":
- For bar charts with all Y<0, bars will still be drawn down even if Y=0 is
- not in range.
-
------------------------------------------------------------------------------
-
-2009-12-24 Release 5.1.0
-
-Overview:
-
-This is the current stable release of PHPlot. This release fixes a number of
-bugs and adds some new features. Some of the changes in this release can
-alter the appearance of plots, so be sure to review the information in this
-NEWS file and test this release with your application.
-
-The PHPlot reference manual has been updated to match this release. The
-manual is available as a separate download from Sourceforge. The manual is
-also available for on-line viewing from the project home page.
-
-See the ChangeLog file in the release for more about changes and bug fixes.
-
-
-New features in 5.1.0:
-
-+ A new "contrib" directory has been added for useful add-ons.
- This currently contains:
- * prune_labels : Control data label density on X axis.
- * color_range : Define a gradient map for data colors.
-
-+ Feature Request 2899921 "Allow different format for data and tick labels"
- Text angle and format can now be controlled separately for data labels.
-
-+ Locale loading override
- New variable locale_override stops PHPlot from getting locale from system.
-
-+ Translating Coordinates
- New function GetDeviceXY() to translate world to device coordinates.
-
-+ New drawing callback
- New callback 'draw_all', called after all drawing is done.
- The manual now contains an example of using this new callback and
- the new GetDeviceXY() function to annotate a plot.
-
-
-Bug Fixes in 5.1.0:
-
-#2914403 "Pie + X/Y titles: Undefined property error"
- X/Y titles are now properly ignored for pie charts.
-
-#2908256 "Error: array_sum() should be an array" (drupal)
-#2916864 "Should at least print legend on pie charts with empty data"
- Pie charts with invalid data (no Y values > 0) now make an empty plot.
-
-#2906436 "Fixes for X Tick Labels vs X Data Labels"
- Smarter determination of whether to do Tick labels, Data labels, or both.
-
-#2900914 "Problem with display of 0 on Y axis"
- Fixed rounding error that could produce something like Y=8.12345E-16.
-
-#2886365 "PHP 5 patch" (Declare all functions and variables in PHP5 style)
- Most internal PHPlot member functions now have "protected" visibility.
-
-#2839547 "SetImageBorderType('none')
- You can use SetImageBorderType('none') to turn the image border back off.
-
-#1795972 "Fix default point shapes"
- We now have 20 (vs 10) point shapes, with 10 (vs 1) used by default.
-
-#1795971 "Fix default data colors"
- We now have 16 (vs 8) default data colors, no duplicates, all visible.
-
-
-Visible Changes and Possible Incompatibilities:
-
-+ PHP5 visibility changes (Bug #2886365)
-Details: Most internal PHPlot member functions now have visibility
- 'protected', rather than all being public. All member variables are
- still 'public'.
-
-Reason for the change: Use the recommended PHP5 syntax, better OO style.
-
-Compatibility: If you were calling a PHPlot internal function that got
- changed to 'protected', this will break. Please report this.
-
-
-+ Fix default point shapes (Bug 1795972)
-Details: We now have 20 (vs 10) point shapes available, and by default we
- have 10 (vs 1) different shapes in use. The default size is now 6 pixels
- for all point shapes.
-
-Reason for the changes: Using different shapes helps distinguish the data
- sets. The existing 10 defined shapes were not enough, since some of them
- are not centered over the points, too small, or otherwise hard to see.
- The code to synchronize the point shape and size arrays was broken, and
- some dubious code to adjust sizes to even numbers needed to be fixed.
-
-Compatibility (1): If you have a points or linepoints plot with more than
- one dataset, and you did not use SetPointShapes() to configure the
- shapes, them your plot will change from using a diamond for all data
- sets to using different shapes for up to 10 data sets.
-
-Compatibility (2): Fixing the point size/point shape array size bug may
- slightly change the size of some shapes, but it now works the way it
- was documented and supposed to work.
-
-+ Fix default data colors (Bug 1795971)
-Details: Defined a new set of 16 default data colors. The colors are
- different and contrast well against the default white background.
- The first 4 colors were not changed.
-
-Reason for the change: The default 8 data colors included two instances
- of orange, and one color which was invisible on a white background.
-
-Compatibility: Colors will change on any plot with more than 4 data sets
- where you did not use SetDataColors() to set your own data colors.
-
-+ Re-used old function SetXDataLabelAngle()
-Details: SetXDataLabelAngle() now does something different.
-
-Reason for the change: This name was needed for a new function, to set the
- angle for the X Data Labels. The old use of this function was not
- documented, and marked "deprecated" in the code since around 2003-12-07.
-
-Compatibility: If you are still using SetXDataLabelAngle() to set both Tick
- and Data label angles, you need to use SetXLabelAngle() instead.
-
-+ Separate controls for tick and data labels (Feature Request 2899921)
-Details: New functions SetXDataLabelAngle(), SetYDataLabelAngle(),
- SetXDataLabelType(), and SetYDataLabelType() to allow separate control
- over the angle and format of data labels, versus tick labels.
-
-Reason for the change: Allow Data Labels to use different formatting and
- angle compared to Tick Labels.
-
-Compatibility: The default behavior has been set up such that there should
- be no compatibility issues. For example:
- Old behavior: SetXLabelType() sets the type for both tick and data labels.
- New behavior: SetXLabelType() sets the type for tick labels and the
- default type for data labels. SetXDataLabelType() sets the type for
- data labels (overrides SetXLabelType).
-
-+ X Tick Labels vs X Data Labels (Bug 2906436)
-Details: Regarding SetXTickLabelPos() and SetXDataLabelPos(): If only one
- of them is called, the behavior is unchanged (only that label type will
- be displayed). If both are called: Do exactly what was requested. If
- neither was called: display only data labels if any data labels are
- non-empty, else display only tick labels.
-
-Reason for the change: 1) Fix the long-standing problem behavior that by
- default PHPlot overlays tick and data labels below the X axis. 2) Fix
- order dependency between setting the position of tick and data labels.
- 3) Prepare for future extension of data labels, and allow both tick
- and data labels to be on if the programmer enables both.
-
-Compatibility: There are some cases where your plot will change.
- (a) Calls neither SetXDataLabelPos() nor SetXTickLabelPos():
- Old behavior: Both tick and data labels displayed, possibly overlaid.
- New behavior: If there are any non-blank data labels, then show only
- the data labels, not the tick labels. Otherwise, show tick labels.
-
- (b) Calls both SetXDataLabelPos() and SetXTickLabelPos(), with other than
- 'none' for each position:
- Old behavior: The latter call was effective; earlier one ignored.
- New behavior: Independent of order, both calls are effective.
-
------------------------------------------------------------------------------
-
-2009-06-14 Release 5.0.7
-
-Overview:
-
-This is the current stable release of PHPlot. The release adds one new
-feature, fixes a few bugs, and changes the license under which PHPlot
-is released.
-
-The PHPlot reference manual has been updated to match this release. The
-manual is available as a separate download from Sourceforge. The manual is
-also now available for on-line viewing at http://phplot.sourceforge.net
-
-See the ChangeLog file for more about changes and bug fixes.
-
-
-Licensing:
-
-PHPlot is now released on the terms of the GNU Lesser General Public
-License, version 2.1. (Previous versions of PHPlot were released under
-a dual "PHP/GPL" license.) The licensing change was authorized by the
-original author and copyright holder of PHPlot.
-
-
-New feature in 5.0.7:
-
-+ Plot area margins can now be partially specified, using either
- SetMarginsPixels or SetPlotAreaPixels. In previous releases of
- PHPlot you had to either specify all 4 margins or none.
- Credit to adoll for this feature.
-
-
-Visible Changes and Possible Incompatibilities:
-
-+ Y data range can change:
- As a result of the bug fixes in this release, automatically-calculated
- Y data ranges can change. If you have missing Y values in your data,
- and you let PHPlot calculate the Y data range (that is, you do not
- call SetPlotAreaWorld with a Ymin value), then the lower limit for Y
- can change. If you have a plot with data-data-error data type, different
- error values for different points, and let PHPlot calculate the Y data
- range, then either Y limit can change.
-
-
-Bug Fixes in 5.0.7:
-
-
-+ Fix for bug 2803900: SetRGBArray('large') does not work:
- Corrected an array name usage problem. You can now select the large
- color map. Also PHPlot no longer overrides use of the PHP include
- path when loading the large color map, and now reports an error if the
- file is needed and not found.
-
-+ Fix for bug 2791502 "Error plots treat missing Y values as 0":
- Missing Y values now with with data-data-error plots.
-
-+ Fix for bug 2792860 "Wrong DataLabelLines with missing Y":
- Data label lines are now suppressed at missing Y values.
-
-+ Fix for bug 2786350 "Missing Y data results in bad auto-range":
- Missing Y values are now ignored when calculating the Y data range.
- Bug report and analysis by mrten.
-
-+ Fix for bug 2786354 "Incorrect auto-range for data-data-error":
- The Y data range is now correctly calculated for data-data-error plots
- when the error values differ from point to point.
-
-
------------------------------------------------------------------------------
-
-2009-01-20 Release 5.0.6
-
-Overview:
-
-This is the current stable release of PHPlot. The purpose of this release
-is to fix additional problems with text spacing and positioning, and
-introduce some minor new features.
-
-The PHPlot reference manual has been updated to match this release. The
-manual is available as a separate download from Sourceforge. The manual is
-also now available for on-line viewing at http://phplot.sourceforge.net
-
-
-New features in 5.0.6:
-
-+ Allow mixing GD and TrueType font text on the same plot
- You can use the new method functions SetFontGD() and SetFontTTF() to
- select a font and font type for text element (labels, titles, etc.) For
- example, you can have TrueType plot titles, and GD-fixed font labels.
- SetUseTTF() now sets the default text type, TTF or GD. This is fully
- backward compatible.
-
-+ Extended label formatting
- See the reference manual for more information on these.
-
- New label formatting types are added: 'printf' (using a user-defined
- format), and 'custom' (using a callback function).
-
- For 'data' type formatting, a prefix and suffix can be added. (PHPlot
- previously had an undocumented suffix for 'data' type, which still
- works.)
-
- For 'time' formatting, the format can now be specified in the same function
- call rather than using SetXTimeFormat and SetYTimeFormat.
-
- For 'data' formatting, the precision can now be specified in the same
- function call, rather than using SetPrecisionX and SetPrecisionY.
-
-+ Better control over line spacing in multi-line labels
-
- Line spacing can now be set separately for each text element using an
- additional argument to SetFont, SetFontGD, and SetFontTTF. The overall
- SetLineSpacing() value is the default for each text element that does not
- have a specific line spacing set.
-
- PHPlot now interprets the value set for line spacing as the number of
- pixels only for GD text. For TrueType text, it is a scale factor for the
- font's built-in line spacing for TrueType text. The equation used is:
- interline_spacing = line_spacing * font_natural_spacing / 6
- where line_spacing is either the global value set with SetLineSpacing
- or a more specific value set with SetFont(), and font_natural_spacing
- is the amount of space between lines built-in to the TrueType font. The
- factor 6 should really be 4 (since PHPlot always used 4 as the default
- line_spacing, this would give the natural font spacing by default). But
- the text is too widely spaced with this value, and 6 was chosen to be
- more compatible for typical font sizes.
-
-Visible Changes and Possible Incompatibilities:
-
-+ Line spacing
- Multi-line TrueType titles and labels will have different inter-line
- spacing. Since the text size affects the margin and plot area sizes,
- this results in slightly different sized features on any plot with
- multi-line TrueType text.
- Previous versions of PHPlot used a default 4 pixels for inter-line
- spacing of multi-line TrueType text, regardless of the font size.
- PHPlot now uses the 'natural' font inter-line spacing, adjusted by a line
- spacing parameter (per text type, with a global default).
-
- The same change can also increase the size of the legend box slightly.
-
-+ Internal changes were made to the way font information is stored. Anything
- that directly references PHPlot internals regarding fonts will break. Usage
- also changed for the internal functions to size and draw text (ProcessText*,
- SizeText*) due to font data storage changes.
-
-+ Changes were made to internal class variables used to store label
- formatting information. Anything relying on these internals may break.
-
-
-Bug Fixes in 5.0.6:
-
-#1932571: Data-Data Plot fails with same X values
- PHPlot will no longer hang if all X values are the same. But this is
- interim fix to force the X range to 1 to prevent the hang. Eventually,
- smarter automatic range code will handle this better.
- Credit to andyl for finding this.
-
-#1891636: Misaligned TTF X Labels
- PHPlot will now correctly line-up TrueType labels along the X axis. There
- were small but very noticeable errors before, when the text had descenders
- or lines with all short letters.
-
-
------------------------------------------------------------------------------
-
-2008-01-13 Released 5.0.5
-
-Overview:
-
-This is the current stable release of PHPlot. The emphasis of this release
-is to improve text positioning, margin calculation, and error handling.
-
-Although this is considered a stable release, it has a large amount
-of changed code compared to the previous release 5.0.4. Two of the more
-complex components of PHPlot - text and margin calculations - were mostly
-re-written in this release. You are advised to carefully test your own
-applications with PHPlot-5.0.5 to see how your plots look. Refer to the
-README.txt file included in the release for information on reporting problems.
-
-Starting with this release, PHPlot no longer supports PHP4, since the PHP
-group officially declared end-of-life for PHP4 as of 31 December 2007.
-PHPlot-5.0.5 was tested only with PHP-5.2.5 and we are unlikely to address
-any issues using PHPlot with older versions of PHP.
-
-The PHPlot reference manual has been updated to match this release. The
-manual is available as a separate download from Sourceforge. The manual is
-now also now available for on-line viewing at http://phplot.sourceforge.net
-
-The callback feature added in 5.0.4 is now documented in the reference
-manual. It is still considered experimental and subject to change, however.
-
-
-
-Visible Changes and Possible Incompatibilities:
-
-+ Dropped support for PHP4.
-
-+ Eliminated remaining order-dependent behavior related to margins and
-text. PHPlot should now do nothing at all, except record parameters, until
-you draw the graph with DrawGraph. I believe this was always the intended
-behavior of PHPlot, but over time perhaps various pre-calculations and
-dependencies crept in. Fixing this simplifies processing and should lead to
-more consistent behavior.
-
-+ The rewritten margin calculation code now uses actual sizes of all tick
-and data labels and tick marks, rather than guesses. Margins collapse to
-remove unused elements, but a minimum margin (currently fixed at 15 pixels)
-is applied so the plot edges don't get to close to the image edges. The
-result is that most graphs with auto-calculated margins will change in
-appearance. It most cases, the margins get slightly smaller. In other
-cases, earlier releases mis-calculated the margins, so this release will
-produce much neater margins.
-
-+ The X and Y titles are now offset out from the plot area, not in from the
-image area. For auto-calculated margins this should not make any
-difference, but if you use SetMarginsPixels or SetPlotAreaPixels to set
-larger margins, the axis titles will move in closer to the plot with this
-release.
-
-+ Changes were made to PHPlot internals, including removal of some class
-variables and functions, and addition of new variables and functions.
-These are documented in the ChangeLog. Relying on any internal variables
-or functions in an application using PHPlot is unwise. The following
-internal functions were removed:
- SetImageArea() DrawDotSeries() DrawLineSeries() CalcXHeights()
- CalcYWidths() DrawLabels() InitImage() DrawDashedLine()
- These were marked 'deprecated', were undocumented and unmaintained.
- TTFBBoxSize()
- This was replaced with SizeText().
-
-+ Line spacing set with SetLineSpacing() now affects TTF text as well as
-GD text. Previously, it only affected GD text. The default line spacing
-happens to be usable for TTF text.
-
-+ Changes were made to error handling. PHPlot will now trigger a user-level
-error after producing an error image, instead of exiting. If no error
-handler has been set, it will exit, as before. But now the error message
-should also get logged, or written to the standard error stream, depending
-on the SAPI in use. You can now establish an error handler to catch most
-PHPlot errors and do some cleanup before exit.
-
-+ PHPlot no longer accepts some invalid option values (such as a substring
-of a valid value, or empty strings) passed to functions. If your
-application aborts in CheckOption with PHPlot-5.0.5 but 'worked' with
-previous releases, them you were probably using an invalid option value.
-
-
-
-Bug Fixes in 5.0.5:
-
-#945439: x_tick_label_height not set correctly
- Exact sizes of labels are now used to calculate margins.
-
-#1813070: Bad position for multi-line TrueType text
- Fixed as part of text functions rewrite. Use correct basepoint
- (lower left of each line) when positioning text lines.
-
-#1813071: Wrong title height for multi-line TTF text
- Fixed as part of text functions rewrite: calculate height of
- multi-line text correctly. Also now uses the line-spacing setting.
-
-#1813474: DrawText alignment arguments wrong
- Fixed so 'top' and 'bottom' now have the usual meaning: top means
- align top of text with reference, bottom means align bottom of text.
- This was switched before. Changed every internal caller to compensate.
-
-#1816844: Fix order dependency for setting titles
- Defer processing of title strings until DrawGraph(),
- so it doesn't matter if fonts, etc. are set before or after.
-
-#1819668: Horiz. align multi-line text: GD vs TTF
- The text functions were rewritten to draw TTF text line-by-line,
- like GD text, and correctly align each line.
-
-#1823774: Default Font Path and Error Message
- Error handling has been improved to make sure a message is logged, in
- addition to the error image, and use error_trigger rather than exit.
-
-#1826513: FIXME in DrawLegend: Max label length
- The actual size needed for legend text is now used.
-
-#1827263: Spoiled up pie-chart if $val is close to zero
- Fixed by skipping over any segment that rounds to 0 degrees of
- arc. (The GD function uses integer angles only, and 0 degrees
- means draw a complete circle.)
-
-#1836528: Insufficient checking of parameter values
- Rewrote validator function to reject improper parameter values.
-
-#1843012: Make margins, drawing consistent
- Margin code logic was rewritten and checked for consistency.
-
-#1856207: Margin error with 'xaxis'/'yaxis' position
- Margin space is now allocated for ticks and labels if their position
- is 'xaxis' or 'yaxis' and the axis is at the plot edge. This is not
- a perfect fix (the axis could be close but not at the edge).
-
-
------------------------------------------------------------------------------
-
-2007-10-20 Released 5.0.4
-
-Overview:
-
-This is the latest stable release of PHPlot. We are abandoning the 'rc'
-version naming style, because we don't consider these last releases
-'release candidate' versions. As we continue to make changes to PHPlot,
-we are not converging toward a final "5.0" release, however we do consider
-these releases stable and complete enough for production use.
-
-This release fixes a number of problems and introduces a few new features.
-
-The PHPlot reference manual has also been updated to match this release.
-New material has been added documenting some of the PHPlot internals.
-The manual is available as a separate download from Sourceforge.
-
-
-Code Cleanup:
-
-Some code cleanup is going in to this release. It is hoped that these
-changes will not impact any existing scripts using PHPlot, but will make
-the PHPlot code itself easier to understand and maintain.
-
-PHPlot now avoids making changes outside its own class definition. There
-are no longer any functions defined outside the class, nor any constants.
-Three constants (MINY MAXY TOTY) were removed, and 2 functions were removed
-(see Visible Changes below). Also PHPlot no longer sets the PHP error
-reporting level to E_ALL. Although we highly recommend setting error
-reporting to E_ALL in your php.ini file or scripts, it is not right for
-PHPlot to assume that you want it.
-
-
-Visible Changes and Possible Incompatibilities:
-
-Arrays containing color and style information are used with several PHPlot
-functions to control the plot style array. These functions are:
- SetPointShapes, SetPointSizes, SetLineWidths, SetLineStyles,
- SetDataColors, SetDataBorderColors, and SetErrorBarColors.
-The arrays passed to these functions MUST used sequential integer 0-based
-indexes. This is what the PHP manual calls "Usual integer indices (starting
-from zero, increasing by one)". This is the type of array you get in PHP by
-default if you use array() without specifying key values, or use the
-empty-bracket assignment operator to add values onto an array. In previous
-versions of PHPlot, some of these functions would also work with
-string-indexed or non-sequentially-indexed arrays, but this was not clearly
-defined. Starting with PHPlot-5.0.4, only arrays with "usual integer
-indices" work, and other array indexes will cause errors.
-
-Some internal-use-only functions have had their usage changed or been removed.
-If you are using functions that are not documented in the PHPlot Function
-Reference in the manual, your code may have to be changed.
-
-As part of the code cleanup, two functions which were defined outside the
-PHPlot class were removed: array_pad_array(), and array_merge_php4().
-If your code used these, you need to fix your code.
-
-The routines which accept a color name, value, or array now check for a valid
-color name. If you specify a color name which is not in your current color
-table, PHPlot will draw an error and exit. Previously, PHP would report an
-index error, continue, and get a 'headers already sent' message.
-
-
-Bug Fixes in 5.0.4:
-
-#1813021: Miss-positioned right-justified vertical GD text.
- Fixed DrawText() to correctly position 90 degree right-justified text
- drawn in a fixed GD font. This could be seen with 90 degree Y tick labels.
-
-#1790441 Removed destructor/shutdown function, and no longer recommend
- using reference assignment when creating a PHPlot object. This was
- interfering with memory usage.
- Credit to annajilly for analysis.
-
-#1779115 SetLegendWorld() failed because of undefined variables. The
- required order dependency was too hard to meet. This is now fixed.
- You can now use SetLegendWorld anywhere before DrawGraph.
-
-#1726810 (feature request, but actually a bug fix) Ignore empty strings
- as data labels when doing time or data label formatting. These would
- previously produce errors or bad formatting. Now you can omit labels
- as needed even with time and data formatting.
- Credit to exgerhardr for finding this.
-
-#1605555 Y data labels used wrong font and not formatted (bar charts only).
-
-#1208054 Localization of number formatting in 'data' format type. PHPlot
- will attempt to format the numbers in a way appropriate to your locale.
- You can also force the formatting with the new function SetNumberFormat.
- Credit to David Hernández Sanz.
-
-#937944 X/Y Tick counts: PHPlot could draw one two few Y tick counts, and
- one too many X tick counts. This is not a perfect fix, and more work is
- needed here, but this fixes an error case in both X and Y values.
-
-
-New Features in 5.0.4:
-
-New function SetLegendStyle allows control of the alignment of text and
- color boxes within the legend. Also allows removing the color boxes.
- Based on bug #1208054.
- Credit to David Hernández Sanz.
-
-New function SetNumberFormat. See bug report #1208054 above.
-
-Callbacks are added. PHPlot can call back your functions while generating the
- plot. This is experimental, and documented only in the file "Callbacks".
- Credit to annajilly for the idea and design.
-
------------------------------------------------------------------------------
-
-2006-11-13 Released 5.0rc3
-
-Overview:
-
-This is an interim release. It has been a long time since the previous
-release 5.0rc2, and there have been a lot of changes. There are still more
-changes likely to go in before we have "5.0", but there are enough for now.
-
-The PHPlot Reference Manual has also been released, and is available as a
-separate download from Sourceforge. PHPlot users and developers are
-strongly encouraged to read the manual.
-
-This release does not include the "doc/" and "examples/" directories of
-previous releases. The Reference Manual contains more complete and
-up-to-date information and examples, and I am unable to maintain the doc/
-and examples/ files while also maintaining the Reference Manual. If you
-need those files, they can be accessed with the Sourceforge web CVS
-browser.
-
-
-New Features:
-
-The emphasis for this release is bug fixing, so there are few new features.
-
-+ You can now suppress lines or points on individual plots in a linepoints
- graph. This feature was added because I needed a graph with several
- linepoints lines, but also with a solid line showing an "80% goal".
- Use SetPointShapes with the value 'none' in the array to suppress the
- point markers for that plot (and only draw the line).
- Use SetLineStyles with the value 'none' in the array to suppress the
- line for that plot (and only draw the point markers).
- [Bug # 1594458]
-
-+ Bar charts can have data labels above the bar with the value. Turn
- these on with SetYDataLabelPos('plotin'). This is somewhat experimental,
- since there isn't a lot of room for labels on top of the bars and you
- may find the results are not useful.
-
-
-Visible Changes:
-
-Here are the more significant changes in this release. These are changes
-which may affect existing scripts and output from PHPlot. See the
-ChangeLog file for information about all changes and bug fixes.
-
-+ A bug fix on bar chart bar borders results in black borders around the
- bars if shading is turned off. The border was previously covered up,
- but was supposed to be there. If you need borderless, unshaded bars,
- you need to use SetDataBorderColors to make the borders the same colors
- as the bars. [Bug # 1096197]
-
-+ TrueType font pathname handling was fixed. You no longer need to use
- SetUseTTF(True). You can either use full paths to the font files with
- SetDefaultTTFont() and SetFont(), or you can call SetTTFPath() to point
- to a directory of font files, and then use simple font filenames without
- paths in SetDefaultTTFont() and SetFont().
- [Bug # 1144644 plus several others]
-
-+ There have been several fixes regarding automatically calculated ranges
- and scales. The result is that you may see less extra space and fewer
- tick marks in some cases.
-
-+ A fix was made to bar and stackedbar graph bar widths in order to get
- the X axis labels to properly center. As part of the fix, the bar widths
- now match between the two graph types. (Before this fix, the bars were
- narrower in bar graphs compared to the same data plotted as a stacked
- bar.) As a result, bar graph bars will now be drawn with wider bars, and
- stackedbar graph bars will be narrower. You can adjust this with the new
- class variable bar_extra_space. [Bug # 1437912]
-
-+ Dot shapes and sizes were off by 1 or 2 slots in the array of shapes or
- sizes. After the fix, you may get different dot shapes or sizes per
- plot line. [Bug # 1096194]
-
-
-Testing:
-
-Since its output is visual (graphics), and it has so many interconnected
-modes and options, PHPlot is difficult to test. But at least we are now
-trying. I have a collection of PHPlot scripts (currently about 60) and a
-script to run through them. The script automatically checks that:
- 1) Nothing was written to the standard error stream;
- 2) An image file of size greater than 0 was written;
- 3) Neither the test script nor PHPlot did exit(). This catches cases
- where PHPlot aborts with DrawError().
-
-The automated test is an easy way to check for serious regression, but you
-really need to inspect the output files to validate PHPlot. This takes a
-little time, and it is easy to overlook problems.
-
-The real issue is test coverage. Just as we can be sure that future
-PHPlot releases will pass the test collection, we can also be sure that
-future bug reports will be written against untested cases.
-
---------------------
-
-2006-11-08 PHPlot on Sourceforge has a new maintainer: lbayuk
-
---------------------
-
-2004-10-24 Released 5.0rc2
-
---------------------
-
+This is the NEWS file for PHPlot, with release documentation.\r
+The project web site is http://sourceforge.net/projects/phplot/\r
+The project home page is http://phplot.sourceforge.net/\r
+Refer the the ChangeLog file for detailed source changes.\r
+-----------------------------------------------------------------------------\r
+\r
+2011-01-15 Release 5.3.1\r
+\r
+Overview:\r
+\r
+This is the current stable release of PHPlot. This release focuses on\r
+providing better support and documentation for creating multiple plots on a\r
+single image.\r
+\r
+The PHPlot reference manual has been updated to match this release. Some\r
+new material has been added, including a new section on multiple plots per\r
+image, and a new example of overlay plots.\r
+\r
+\r
+Bugs Fixed in 5.3.1:\r
+\r
+#3143586 "Multiple plots per image - fixes & docs":\r
+ The reference manual now contains a section on multiple plots, and a\r
+ new example. A bug was fixed with SetLegendWorld and multiple plots.\r
+ Image border will now be drawn at most once. It is now possible to\r
+ restore the default 'automatic' behavior for axis positioning. Other\r
+ functions were changed to make arguments optional, so when called with\r
+ no arguments they reset to the default. The reference manual has been\r
+ updated with these changes too.\r
+\r
+#3147397 "Data colors missing with multiple plots":\r
+ The fix for bug #3049726 "Optimize color allocation" caused a problem\r
+ with multiple plots. This has been fixed. PHPlot will no longer truncate\r
+ the data color table at each plot. It will still only allocate data colors\r
+ as needed, but all of the pre-set or configured data colors will be\r
+ available for each plot.\r
+\r
+\r
+-----------------------------------------------------------------------------\r
+\r
+2010-12-04 Release 5.3.0\r
+\r
+Overview:\r
+\r
+This is the current stable release of PHPlot. This release includes new\r
+plot types and some new features.\r
+\r
+The PHPlot reference manual has been updated to match this release. Some of\r
+the sections have been moved, there are new examples for the new plot types,\r
+and a new section on tunable parameters has been added.\r
+\r
+\r
+New features in 5.3.0:\r
+\r
+#3093483 "Investing support chart types":\r
+ Added 3 new plot types: Basic OHLC (Open/High/Low/Close), Candlesticks,\r
+ and Filled Candlesticks. These are variations of plots that show the\r
+ performance of a stock or other financial security.\r
+\r
+#3111166 "Control legend colorbox width":\r
+ It is now possible to control the width of the color boxes in the\r
+ legend, using a class variable which is documented in the manual.\r
+\r
+#3117873 "Data value labels in more plot types":\r
+ Data value labels, which show the dependent variable values near the\r
+ data points, are now available for more plot types: lines, linepoints,\r
+ points, and squared. (These were previously available only for bars and\r
+ stackedbars plots.)\r
+\r
+#3127005 "Ability to suppress X/Y axis lines":\r
+ New functions SetDrawXAxis() and SetDrawYAxis() were added to control\r
+ display of the X and Y axis lines. (These lines were probably the only\r
+ PHPlot elements that could not be turned off.) In special cases, these\r
+ can be used to produce a "bare" plot image.\r
+\r
+\r
+-----------------------------------------------------------------------------\r
+\r
+2010-10-03 Release 5.2.0\r
+\r
+Overview:\r
+\r
+This is the current stable release of PHPlot. This release includes some\r
+bug fixes and new features, described below, and a reimplementation of\r
+internal processing of colors.\r
+\r
+The PHPlot reference manual has been updated to match this release.\r
+Horizontal plots are now documented in the manual, and the interim\r
+documentation in the source release (HorizontalBars.txt) has been removed.\r
+The manual is available in HTML format as a separate download from\r
+Sourceforge. The manual is also available for on-line viewing from the\r
+project home page. Starting with this release, the manual is also\r
+available in PDF format from the project home page.\r
+\r
+\r
+Cautions, Important Notes, and Compatibility Issues:\r
+\r
+Due to changes in color allocation (see bug #3049726 below), image files\r
+produced with PHPlot-5.2.0 will differ when compared byte-for-byte with\r
+those created by earlier releases, even when the images are identical (as\r
+they nearly always are).\r
+\r
+If you are creating a horizontal plot with any negative X values, and not\r
+setting the Y axis position, your plot will change (see bug #3074402 below)\r
+because PHPlot no longer leaves the Y axis on the left for horizontal plots.\r
+\r
+Some internal methods that used to have 'public' visibility are now protected.\r
+This will generally prevent you from using them. The list of changed functions\r
+can be found in the release ChangeLog. Avoid using any internal methods.\r
+\r
+If you are making a stackedbar plot with any negative values, PHPlot-5.1.3\r
+and earlier took the absolute value of each data value (which was not\r
+documented), but PHPlot-5.2.0 does not. See Feature Request #3073679 below.\r
+\r
+If your plot fills the 256 available color map slots in a palette image,\r
+your image may look different with PHPlot-5.2.0 due to changes in color\r
+allocation order. This was seen on two of the tests in the PHPlot test\r
+suite. These tests tiled a JPEG image into the plot area or image\r
+background. Being a truecolor image, the JPEG had a huge number of colors,\r
+which filled all available slots in the color map. Additional colors for\r
+plot elements had to be approximated, and different colors resulted with\r
+PHPlot-5.2.0 versus previous releases. To avoid this problem, either use a\r
+truecolor PHPlot object (PHPlot_truecolor constructor), or reduce the\r
+number of colors in the background image and convert it to PNG or GIF.\r
+\r
+This release contains significant changes to PHPlot internals. In particular,\r
+variables and functions related to element colors and color handling have\r
+changed. Refer to the PHPlot release ChangeLog for more details. Remember,\r
+if you rely on accessing any member variable, or on using any non-public\r
+function or any function not documented in the reference section of the manual,\r
+your code is at risk of breaking with each new release.\r
+\r
+\r
+New features in 5.2.0:\r
+\r
+#3077554 "Finer control over plot element colors" (partial):\r
+ The X, Y, and main titles can now have different colors. See the PHPlot\r
+ Reference Manual entries for SetXTitleColor and SetYTitleColor.\r
+\r
+#3073679 "Stacked bar plots with negative values":\r
+ A stacked bar plot can now include negative values, and stacks of negative\r
+ values will be drawn downwards (or leftwards). See the PHPlot Reference\r
+ Manual under "Plot Type: stackedbars" for details.\r
+\r
+\r
+Bugs Fixed in 5.2.0:\r
+\r
+#3045131 "SetTransparentColor problems":\r
+ Setting a transparent color now works whether before or after setting\r
+ the background color (for example), and also now works with a data color.\r
+\r
+#3049726 "Optimize color allocation"\r
+ PHPlot now defers allocating colors until drawing time, and tries to allocate\r
+ only the colors which are actually needed. For palette images, this results\r
+ in use of fewer color slots and slightly smaller image files.\r
+\r
+#3074402 "Fix Y axis default for horizontal plots":\r
+ When horizontal plots were introduced, an asymmetry with the X and Y axis\r
+ position defaults was known but left. This behavior was later determined\r
+ to be unhelpful. So now the Y axis on horizontal plots will default to X=0,\r
+ or the X value closest to zero within the plot area range. This is the same\r
+ behavior as for the X axis in vertical plots.\r
+\r
+#3056991 "Internal methods should be 'protected'":\r
+ More of the internal PHPlot functions were changed to 'protected' visibility,\r
+ as the test suite was fixed to not call them directly.\r
+\r
+#3057000 "Review 'deprecated' methods":\r
+ One broken deprecated method (SetColor) was removed and one changed.\r
+ Note that deprecated methods are not documented and not tested.\r
+\r
+-----------------------------------------------------------------------------\r
+\r
+2010-08-30 Release 5.1.3\r
+\r
+Overview:\r
+\r
+This is the current stable release of PHPlot. Additional horizontal plot\r
+types and features have been added, however horizontal plots are still\r
+considered 'experimental'. A new callback has been added which allows\r
+greater control over the data colors. An improved method for accessing\r
+TrueType Font (TTF) files means that on many systems TTF text can be used\r
+without specifying font paths.\r
+\r
+\r
+Cautions and Important Notes:\r
+\r
+Since the previous PHPlot release, PHP-5.3.3 and PHP-5.2.14 have been\r
+released, and these include a fix for the TrueType Font (TTF) rendering\r
+problem. Use of these releases is now recommended.\r
+\r
+There has been extensive cleanup of the PHPlot code. If you have a\r
+customized version of PHPlot, you may find it difficult to update.\r
+\r
+The "additional data support" script phplot_data.php has been removed from\r
+this release. The script has not been developed or tested in a long time,\r
+and was found to have numerous problems. The script can still be found in\r
+the CVS repository.\r
+\r
+The changes in this release (horizontal plots, custom data color callback,\r
+and TrueType Font handling) should not result in any compatibility issues.\r
+\r
+\r
+New features in 5.1.3:\r
+\r
+#3049703 "Additional horizontal plots and features":\r
+ + Implemented data values labels in horizontal bar charts.\r
+ Use: SetXDataLabelPos('plotin').\r
+ + Add horizontal stacked bar charts, with data value labels.\r
+ + Add horizontal thinbarline plots.\r
+ Horizontal plots are still considered 'experimental', and documentation is\r
+ in the HorizontalBars.txt text file rather than the PHPlot Reference Manual.\r
+\r
+#3034164 "Extended control of data colors":\r
+ New callback 'data_color' can be used to customize selection of the color\r
+ of each bar, line segment, point marker, etc. This is documented in the\r
+ PHPlot Reference Manual section "Custom Data Color Selection", with new\r
+ examples in the Examples chapter.\r
+\r
+\r
+Bugs Fixed in 5.1.3:\r
+\r
+#3051906 "Better choice for default TT font":\r
+ Rather than always using the unlikely 'benjamingothic.ttf' as its default\r
+ TrueType font name, PHPlot now has a short list of sans-serif fonts, and\r
+ tries to find one that works if a default TT font is needed. On many\r
+ systems, this will provide a high-quality default font without help.\r
+\r
+#3051832 "Let PHP/GD find the font file":\r
+ Instead of using file existence to validate a TT font file, PHPlot now\r
+ just tries to use the font. This allows PHP/GD to use its own rules to\r
+ try to find the font, without needing a pathname. This works on Windows\r
+ and at least some Linux systems.\r
+\r
+#3048267 "phplot_data add-on is still broken"\r
+ Not fixed. phplot_data.php has been removed from the release.\r
+\r
+-----------------------------------------------------------------------------\r
+\r
+2010-06-29 Release 5.1.2\r
+\r
+Overview:\r
+\r
+This is the current stable release of PHPlot. Truecolor image support is no\r
+longer considered 'experimental', and is now documented in the reference\r
+manual. There is a new experimental feature for horizontal bar charts. This\r
+release also contains a bug fix and new feature.\r
+\r
+\r
+Cautions and Important Notes:\r
+\r
+The advisory against using PHP-5.3.2 or PHP-5.2.13 with PHPlot if you use\r
+TrueType fonts (TTF) continues. See the item below for PHPlot-5.1.1. The\r
+good news is that this has been fixed by the PHP Team and will be in the\r
+next releases.\r
+\r
+Compatibility of data type and plot type are now checked completely. If\r
+you used an incorrect data type with certain plot types, your script may no\r
+longer work until you fix the data type. Specifically, the area, squared,\r
+and thinbarline plot types failed to check the data type they received, and\r
+treated anything other than 'data-data' as 'text-data'. If you have a\r
+squared plot with data type 'data-data-error', for example (which is not\r
+supposed to work), it did produce a plot, but will now result in an error.\r
+\r
+The addition of horizontal bar charts should not impact any existing plot,\r
+with one small exception. The function SetYDataLabelPos() used to accept\r
+some additional, undocumented options (plotleft, plotright, both, yaxis)\r
+and pass these through to SetYTickLabelPos() "for compatibility". It no\r
+longer does so, as some of those are now used for horizontal bar chart\r
+labels. To position Y tick labels, use only SetYTickLabelPos().\r
+\r
+\r
+New features in 5.1.2:\r
+\r
+#3002606 "Add to plot and image border options":\r
+ SetPlotBorderType() now accepts 'right', 'top', and 'bottom', as well\r
+ as an array of options. So you can now control exactly which of the 4\r
+ border sides will be drawn.\r
+ SetImageBorderType() now accepts 'solid' as a choice. This will use the\r
+ actual color set with SetImageBorderColor(), rather than the darker\r
+ shade as type 'plain' does (which may have been a bug).\r
+ SetImageBorderWidth() is a new function that sets the width of the image\r
+ border. The defaults are the same as the fixed values used before: 1\r
+ pixel for plain, 2 pixels for raised. The image border width is now\r
+ accounted for in margin calculations, if it is greater than 2 (to make\r
+ sure existing plots will not change).\r
+\r
+#2885930 "Horizontal Bars":\r
+ Horizontal bar charts are implemented, as an experimental feature.\r
+ 'Experimental' means they are not yet documented in the reference manual,\r
+ and subject to change or removal.\r
+ Refer to the text file HorizontalBars.txt for details.\r
+\r
+#2947679 (follow-up) "Support for alpha blending/Truecolor":\r
+ Truecolor support is now documented in the Reference Manual. The interim\r
+ documentation file Truecolor.txt has been removed. Alpha channel\r
+ specification now works with both constructors and both image types. This\r
+ fixes an issue if the base constructor was used with a truecolor background\r
+ image. (In PHPlot-5.1.1, the result would be a truecolor image, but the\r
+ alpha channel features were not available.)\r
+\r
+\r
+Bug Fixed in 5.1.2:\r
+\r
+#3010116 "Bad rendering of title in multi-plot image when using TTF":\r
+ Make sure the main title is drawn only once, to avoid bad rendering of\r
+ TTF titles with multiple plots due to anti-aliasing.\r
+\r
+-----------------------------------------------------------------------------\r
+\r
+2010-04-04 Release 5.1.1\r
+\r
+Overview:\r
+\r
+This is the current stable release of PHPlot. This release adds truecolor\r
+image support as an experimental feature, fixes a number of bugs and adds\r
+a few new features.\r
+\r
+The PHPlot reference manual has been updated to match this release. The\r
+manual is available as a separate download from Sourceforge. The manual is\r
+also available for on-line viewing from the project home page.\r
+\r
+See the ChangeLog file in the release for more about changes and bug fixes.\r
+\r
+\r
+Cautions and Important Notes:\r
+\r
+Avoid using PHP-5.3.2 or PHP-5.2.13 with PHPlot if you use TrueType fonts\r
+(TTF). Some new bugs were introduced in those releases that adversely\r
+affects accurate positioning and rendering of TrueType font text.\r
+\r
+\r
+New features in 5.1.1:\r
+\r
+#2947679 "Support for alpha blending/Truecolor":\r
+ PHPlot can now produce truecolor images, with alpha blending of colors and\r
+ other effects. This is considered an experimental feature, meaning it is\r
+ not yet documented in the PHPlot Reference Manual, and subject to change.\r
+ Refer to the text file Truecolor.txt included in the PHPlot release for\r
+ information on using truecolor.\r
+ Two drawing changes were made to improve plot appearance with Truecolor:\r
+ + Filled dots (in points & linepoints plots) are now drawn better. This\r
+ also makes them look rounder with regular (non-Truecolor) plots.\r
+ + Area plots have the areas filled without overlapping each area down to\r
+ the Y axis. This was needed to fix problems with alpha blending, and\r
+ should have no effect on non-Truecolor plots.\r
+\r
+#2973995 "Add y-Data to Stackedbars":\r
+ You can now have Y Data Labels with 'stackedbars' plots. These label the Y\r
+ values (incremental and total) for each bar. Refer to the reference manual\r
+ page for SetYDataLabelPos().\r
+\r
+\r
+Bug Fixes in 5.1.1:\r
+\r
+#2976735 "Improvements and fixes for 'area' plots":\r
+ Moving X axis works; handle Y<0 better; new 'stackedarea' plot type is a\r
+ variation on 'area' with the data represented differently.\r
+\r
+#2974639 "Stacked bars plot breaks with X axis != 0":\r
+ Moving X axis works.\r
+\r
+#2963757 "point_counts undefined error in 5.1.0":\r
+ Fixed an error introduced in PHPlot-5.1.0 when point size and shape arrays\r
+ were set to the same size.\r
+\r
+#2938219 "Bars go in wrong direction":\r
+ For bar charts with all Y<0, bars will still be drawn down even if Y=0 is\r
+ not in range.\r
+\r
+-----------------------------------------------------------------------------\r
+\r
+2009-12-24 Release 5.1.0\r
+\r
+Overview:\r
+\r
+This is the current stable release of PHPlot. This release fixes a number of\r
+bugs and adds some new features. Some of the changes in this release can\r
+alter the appearance of plots, so be sure to review the information in this\r
+NEWS file and test this release with your application.\r
+\r
+The PHPlot reference manual has been updated to match this release. The\r
+manual is available as a separate download from Sourceforge. The manual is\r
+also available for on-line viewing from the project home page.\r
+\r
+See the ChangeLog file in the release for more about changes and bug fixes.\r
+\r
+\r
+New features in 5.1.0:\r
+\r
++ A new "contrib" directory has been added for useful add-ons.\r
+ This currently contains:\r
+ * prune_labels : Control data label density on X axis.\r
+ * color_range : Define a gradient map for data colors.\r
+\r
++ Feature Request 2899921 "Allow different format for data and tick labels"\r
+ Text angle and format can now be controlled separately for data labels.\r
+\r
++ Locale loading override\r
+ New variable locale_override stops PHPlot from getting locale from system.\r
+\r
++ Translating Coordinates\r
+ New function GetDeviceXY() to translate world to device coordinates.\r
+\r
++ New drawing callback\r
+ New callback 'draw_all', called after all drawing is done.\r
+ The manual now contains an example of using this new callback and\r
+ the new GetDeviceXY() function to annotate a plot.\r
+\r
+\r
+Bug Fixes in 5.1.0:\r
+\r
+#2914403 "Pie + X/Y titles: Undefined property error"\r
+ X/Y titles are now properly ignored for pie charts.\r
+\r
+#2908256 "Error: array_sum() should be an array" (drupal)\r
+#2916864 "Should at least print legend on pie charts with empty data"\r
+ Pie charts with invalid data (no Y values > 0) now make an empty plot.\r
+\r
+#2906436 "Fixes for X Tick Labels vs X Data Labels"\r
+ Smarter determination of whether to do Tick labels, Data labels, or both.\r
+\r
+#2900914 "Problem with display of 0 on Y axis"\r
+ Fixed rounding error that could produce something like Y=8.12345E-16.\r
+\r
+#2886365 "PHP 5 patch" (Declare all functions and variables in PHP5 style)\r
+ Most internal PHPlot member functions now have "protected" visibility.\r
+\r
+#2839547 "SetImageBorderType('none')\r
+ You can use SetImageBorderType('none') to turn the image border back off.\r
+\r
+#1795972 "Fix default point shapes"\r
+ We now have 20 (vs 10) point shapes, with 10 (vs 1) used by default.\r
+\r
+#1795971 "Fix default data colors"\r
+ We now have 16 (vs 8) default data colors, no duplicates, all visible.\r
+\r
+\r
+Visible Changes and Possible Incompatibilities:\r
+\r
++ PHP5 visibility changes (Bug #2886365)\r
+Details: Most internal PHPlot member functions now have visibility\r
+ 'protected', rather than all being public. All member variables are\r
+ still 'public'.\r
+\r
+Reason for the change: Use the recommended PHP5 syntax, better OO style.\r
+\r
+Compatibility: If you were calling a PHPlot internal function that got\r
+ changed to 'protected', this will break. Please report this.\r
+\r
+\r
++ Fix default point shapes (Bug 1795972)\r
+Details: We now have 20 (vs 10) point shapes available, and by default we\r
+ have 10 (vs 1) different shapes in use. The default size is now 6 pixels\r
+ for all point shapes.\r
+\r
+Reason for the changes: Using different shapes helps distinguish the data\r
+ sets. The existing 10 defined shapes were not enough, since some of them\r
+ are not centered over the points, too small, or otherwise hard to see.\r
+ The code to synchronize the point shape and size arrays was broken, and\r
+ some dubious code to adjust sizes to even numbers needed to be fixed.\r
+\r
+Compatibility (1): If you have a points or linepoints plot with more than\r
+ one dataset, and you did not use SetPointShapes() to configure the\r
+ shapes, them your plot will change from using a diamond for all data\r
+ sets to using different shapes for up to 10 data sets.\r
+\r
+Compatibility (2): Fixing the point size/point shape array size bug may\r
+ slightly change the size of some shapes, but it now works the way it\r
+ was documented and supposed to work.\r
+\r
++ Fix default data colors (Bug 1795971)\r
+Details: Defined a new set of 16 default data colors. The colors are\r
+ different and contrast well against the default white background.\r
+ The first 4 colors were not changed.\r
+\r
+Reason for the change: The default 8 data colors included two instances\r
+ of orange, and one color which was invisible on a white background.\r
+\r
+Compatibility: Colors will change on any plot with more than 4 data sets\r
+ where you did not use SetDataColors() to set your own data colors.\r
+\r
++ Re-used old function SetXDataLabelAngle()\r
+Details: SetXDataLabelAngle() now does something different.\r
+\r
+Reason for the change: This name was needed for a new function, to set the\r
+ angle for the X Data Labels. The old use of this function was not\r
+ documented, and marked "deprecated" in the code since around 2003-12-07.\r
+\r
+Compatibility: If you are still using SetXDataLabelAngle() to set both Tick\r
+ and Data label angles, you need to use SetXLabelAngle() instead.\r
+\r
++ Separate controls for tick and data labels (Feature Request 2899921)\r
+Details: New functions SetXDataLabelAngle(), SetYDataLabelAngle(),\r
+ SetXDataLabelType(), and SetYDataLabelType() to allow separate control\r
+ over the angle and format of data labels, versus tick labels.\r
+\r
+Reason for the change: Allow Data Labels to use different formatting and\r
+ angle compared to Tick Labels.\r
+\r
+Compatibility: The default behavior has been set up such that there should\r
+ be no compatibility issues. For example:\r
+ Old behavior: SetXLabelType() sets the type for both tick and data labels.\r
+ New behavior: SetXLabelType() sets the type for tick labels and the\r
+ default type for data labels. SetXDataLabelType() sets the type for\r
+ data labels (overrides SetXLabelType).\r
+\r
++ X Tick Labels vs X Data Labels (Bug 2906436)\r
+Details: Regarding SetXTickLabelPos() and SetXDataLabelPos(): If only one\r
+ of them is called, the behavior is unchanged (only that label type will\r
+ be displayed). If both are called: Do exactly what was requested. If\r
+ neither was called: display only data labels if any data labels are\r
+ non-empty, else display only tick labels.\r
+\r
+Reason for the change: 1) Fix the long-standing problem behavior that by\r
+ default PHPlot overlays tick and data labels below the X axis. 2) Fix\r
+ order dependency between setting the position of tick and data labels.\r
+ 3) Prepare for future extension of data labels, and allow both tick\r
+ and data labels to be on if the programmer enables both.\r
+\r
+Compatibility: There are some cases where your plot will change.\r
+ (a) Calls neither SetXDataLabelPos() nor SetXTickLabelPos():\r
+ Old behavior: Both tick and data labels displayed, possibly overlaid.\r
+ New behavior: If there are any non-blank data labels, then show only\r
+ the data labels, not the tick labels. Otherwise, show tick labels.\r
+\r
+ (b) Calls both SetXDataLabelPos() and SetXTickLabelPos(), with other than\r
+ 'none' for each position:\r
+ Old behavior: The latter call was effective; earlier one ignored.\r
+ New behavior: Independent of order, both calls are effective.\r
+\r
+-----------------------------------------------------------------------------\r
+\r
+2009-06-14 Release 5.0.7\r
+\r
+Overview:\r
+\r
+This is the current stable release of PHPlot. The release adds one new\r
+feature, fixes a few bugs, and changes the license under which PHPlot\r
+is released.\r
+\r
+The PHPlot reference manual has been updated to match this release. The\r
+manual is available as a separate download from Sourceforge. The manual is\r
+also now available for on-line viewing at http://phplot.sourceforge.net\r
+\r
+See the ChangeLog file for more about changes and bug fixes.\r
+\r
+\r
+Licensing:\r
+\r
+PHPlot is now released on the terms of the GNU Lesser General Public\r
+License, version 2.1. (Previous versions of PHPlot were released under\r
+a dual "PHP/GPL" license.) The licensing change was authorized by the\r
+original author and copyright holder of PHPlot.\r
+\r
+\r
+New feature in 5.0.7:\r
+\r
++ Plot area margins can now be partially specified, using either\r
+ SetMarginsPixels or SetPlotAreaPixels. In previous releases of\r
+ PHPlot you had to either specify all 4 margins or none.\r
+ Credit to adoll for this feature.\r
+\r
+\r
+Visible Changes and Possible Incompatibilities:\r
+\r
++ Y data range can change:\r
+ As a result of the bug fixes in this release, automatically-calculated\r
+ Y data ranges can change. If you have missing Y values in your data,\r
+ and you let PHPlot calculate the Y data range (that is, you do not\r
+ call SetPlotAreaWorld with a Ymin value), then the lower limit for Y\r
+ can change. If you have a plot with data-data-error data type, different\r
+ error values for different points, and let PHPlot calculate the Y data\r
+ range, then either Y limit can change.\r
+\r
+\r
+Bug Fixes in 5.0.7:\r
+\r
+\r
++ Fix for bug 2803900: SetRGBArray('large') does not work:\r
+ Corrected an array name usage problem. You can now select the large\r
+ color map. Also PHPlot no longer overrides use of the PHP include\r
+ path when loading the large color map, and now reports an error if the\r
+ file is needed and not found.\r
+\r
++ Fix for bug 2791502 "Error plots treat missing Y values as 0":\r
+ Missing Y values now with with data-data-error plots.\r
+\r
++ Fix for bug 2792860 "Wrong DataLabelLines with missing Y":\r
+ Data label lines are now suppressed at missing Y values.\r
+\r
++ Fix for bug 2786350 "Missing Y data results in bad auto-range":\r
+ Missing Y values are now ignored when calculating the Y data range.\r
+ Bug report and analysis by mrten.\r
+\r
++ Fix for bug 2786354 "Incorrect auto-range for data-data-error":\r
+ The Y data range is now correctly calculated for data-data-error plots\r
+ when the error values differ from point to point.\r
+\r
+\r
+-----------------------------------------------------------------------------\r
+\r
+2009-01-20 Release 5.0.6\r
+\r
+Overview:\r
+\r
+This is the current stable release of PHPlot. The purpose of this release\r
+is to fix additional problems with text spacing and positioning, and\r
+introduce some minor new features.\r
+\r
+The PHPlot reference manual has been updated to match this release. The\r
+manual is available as a separate download from Sourceforge. The manual is\r
+also now available for on-line viewing at http://phplot.sourceforge.net\r
+\r
+\r
+New features in 5.0.6:\r
+\r
++ Allow mixing GD and TrueType font text on the same plot\r
+ You can use the new method functions SetFontGD() and SetFontTTF() to\r
+ select a font and font type for text element (labels, titles, etc.) For\r
+ example, you can have TrueType plot titles, and GD-fixed font labels.\r
+ SetUseTTF() now sets the default text type, TTF or GD. This is fully\r
+ backward compatible.\r
+\r
++ Extended label formatting\r
+ See the reference manual for more information on these.\r
+\r
+ New label formatting types are added: 'printf' (using a user-defined\r
+ format), and 'custom' (using a callback function).\r
+\r
+ For 'data' type formatting, a prefix and suffix can be added. (PHPlot\r
+ previously had an undocumented suffix for 'data' type, which still\r
+ works.)\r
+\r
+ For 'time' formatting, the format can now be specified in the same function\r
+ call rather than using SetXTimeFormat and SetYTimeFormat.\r
+\r
+ For 'data' formatting, the precision can now be specified in the same\r
+ function call, rather than using SetPrecisionX and SetPrecisionY.\r
+\r
++ Better control over line spacing in multi-line labels\r
+\r
+ Line spacing can now be set separately for each text element using an\r
+ additional argument to SetFont, SetFontGD, and SetFontTTF. The overall\r
+ SetLineSpacing() value is the default for each text element that does not\r
+ have a specific line spacing set.\r
+\r
+ PHPlot now interprets the value set for line spacing as the number of\r
+ pixels only for GD text. For TrueType text, it is a scale factor for the\r
+ font's built-in line spacing for TrueType text. The equation used is:\r
+ interline_spacing = line_spacing * font_natural_spacing / 6\r
+ where line_spacing is either the global value set with SetLineSpacing\r
+ or a more specific value set with SetFont(), and font_natural_spacing\r
+ is the amount of space between lines built-in to the TrueType font. The\r
+ factor 6 should really be 4 (since PHPlot always used 4 as the default\r
+ line_spacing, this would give the natural font spacing by default). But\r
+ the text is too widely spaced with this value, and 6 was chosen to be\r
+ more compatible for typical font sizes.\r
+\r
+Visible Changes and Possible Incompatibilities:\r
+\r
++ Line spacing\r
+ Multi-line TrueType titles and labels will have different inter-line\r
+ spacing. Since the text size affects the margin and plot area sizes,\r
+ this results in slightly different sized features on any plot with\r
+ multi-line TrueType text.\r
+ Previous versions of PHPlot used a default 4 pixels for inter-line\r
+ spacing of multi-line TrueType text, regardless of the font size.\r
+ PHPlot now uses the 'natural' font inter-line spacing, adjusted by a line\r
+ spacing parameter (per text type, with a global default).\r
+\r
+ The same change can also increase the size of the legend box slightly.\r
+\r
++ Internal changes were made to the way font information is stored. Anything\r
+ that directly references PHPlot internals regarding fonts will break. Usage\r
+ also changed for the internal functions to size and draw text (ProcessText*,\r
+ SizeText*) due to font data storage changes.\r
+\r
++ Changes were made to internal class variables used to store label\r
+ formatting information. Anything relying on these internals may break.\r
+\r
+\r
+Bug Fixes in 5.0.6:\r
+\r
+#1932571: Data-Data Plot fails with same X values\r
+ PHPlot will no longer hang if all X values are the same. But this is\r
+ interim fix to force the X range to 1 to prevent the hang. Eventually,\r
+ smarter automatic range code will handle this better.\r
+ Credit to andyl for finding this.\r
+\r
+#1891636: Misaligned TTF X Labels\r
+ PHPlot will now correctly line-up TrueType labels along the X axis. There\r
+ were small but very noticeable errors before, when the text had descenders\r
+ or lines with all short letters.\r
+\r
+\r
+-----------------------------------------------------------------------------\r
+\r
+2008-01-13 Released 5.0.5\r
+\r
+Overview:\r
+\r
+This is the current stable release of PHPlot. The emphasis of this release\r
+is to improve text positioning, margin calculation, and error handling.\r
+\r
+Although this is considered a stable release, it has a large amount\r
+of changed code compared to the previous release 5.0.4. Two of the more\r
+complex components of PHPlot - text and margin calculations - were mostly\r
+re-written in this release. You are advised to carefully test your own\r
+applications with PHPlot-5.0.5 to see how your plots look. Refer to the\r
+README.txt file included in the release for information on reporting problems.\r
+\r
+Starting with this release, PHPlot no longer supports PHP4, since the PHP\r
+group officially declared end-of-life for PHP4 as of 31 December 2007.\r
+PHPlot-5.0.5 was tested only with PHP-5.2.5 and we are unlikely to address\r
+any issues using PHPlot with older versions of PHP.\r
+\r
+The PHPlot reference manual has been updated to match this release. The\r
+manual is available as a separate download from Sourceforge. The manual is\r
+now also now available for on-line viewing at http://phplot.sourceforge.net\r
+\r
+The callback feature added in 5.0.4 is now documented in the reference\r
+manual. It is still considered experimental and subject to change, however.\r
+\r
+\r
+\r
+Visible Changes and Possible Incompatibilities:\r
+\r
++ Dropped support for PHP4.\r
+\r
++ Eliminated remaining order-dependent behavior related to margins and\r
+text. PHPlot should now do nothing at all, except record parameters, until\r
+you draw the graph with DrawGraph. I believe this was always the intended\r
+behavior of PHPlot, but over time perhaps various pre-calculations and\r
+dependencies crept in. Fixing this simplifies processing and should lead to\r
+more consistent behavior.\r
+\r
++ The rewritten margin calculation code now uses actual sizes of all tick\r
+and data labels and tick marks, rather than guesses. Margins collapse to\r
+remove unused elements, but a minimum margin (currently fixed at 15 pixels)\r
+is applied so the plot edges don't get to close to the image edges. The\r
+result is that most graphs with auto-calculated margins will change in\r
+appearance. It most cases, the margins get slightly smaller. In other\r
+cases, earlier releases mis-calculated the margins, so this release will\r
+produce much neater margins.\r
+\r
++ The X and Y titles are now offset out from the plot area, not in from the\r
+image area. For auto-calculated margins this should not make any\r
+difference, but if you use SetMarginsPixels or SetPlotAreaPixels to set\r
+larger margins, the axis titles will move in closer to the plot with this\r
+release.\r
+\r
++ Changes were made to PHPlot internals, including removal of some class\r
+variables and functions, and addition of new variables and functions.\r
+These are documented in the ChangeLog. Relying on any internal variables\r
+or functions in an application using PHPlot is unwise. The following\r
+internal functions were removed:\r
+ SetImageArea() DrawDotSeries() DrawLineSeries() CalcXHeights()\r
+ CalcYWidths() DrawLabels() InitImage() DrawDashedLine()\r
+ These were marked 'deprecated', were undocumented and unmaintained.\r
+ TTFBBoxSize()\r
+ This was replaced with SizeText().\r
+\r
++ Line spacing set with SetLineSpacing() now affects TTF text as well as\r
+GD text. Previously, it only affected GD text. The default line spacing\r
+happens to be usable for TTF text.\r
+\r
++ Changes were made to error handling. PHPlot will now trigger a user-level\r
+error after producing an error image, instead of exiting. If no error\r
+handler has been set, it will exit, as before. But now the error message\r
+should also get logged, or written to the standard error stream, depending\r
+on the SAPI in use. You can now establish an error handler to catch most\r
+PHPlot errors and do some cleanup before exit.\r
+\r
++ PHPlot no longer accepts some invalid option values (such as a substring\r
+of a valid value, or empty strings) passed to functions. If your\r
+application aborts in CheckOption with PHPlot-5.0.5 but 'worked' with\r
+previous releases, them you were probably using an invalid option value.\r
+\r
+\r
+\r
+Bug Fixes in 5.0.5:\r
+\r
+#945439: x_tick_label_height not set correctly\r
+ Exact sizes of labels are now used to calculate margins.\r
+\r
+#1813070: Bad position for multi-line TrueType text\r
+ Fixed as part of text functions rewrite. Use correct basepoint\r
+ (lower left of each line) when positioning text lines.\r
+\r
+#1813071: Wrong title height for multi-line TTF text\r
+ Fixed as part of text functions rewrite: calculate height of\r
+ multi-line text correctly. Also now uses the line-spacing setting.\r
+\r
+#1813474: DrawText alignment arguments wrong\r
+ Fixed so 'top' and 'bottom' now have the usual meaning: top means\r
+ align top of text with reference, bottom means align bottom of text.\r
+ This was switched before. Changed every internal caller to compensate.\r
+\r
+#1816844: Fix order dependency for setting titles\r
+ Defer processing of title strings until DrawGraph(),\r
+ so it doesn't matter if fonts, etc. are set before or after.\r
+\r
+#1819668: Horiz. align multi-line text: GD vs TTF\r
+ The text functions were rewritten to draw TTF text line-by-line,\r
+ like GD text, and correctly align each line.\r
+\r
+#1823774: Default Font Path and Error Message\r
+ Error handling has been improved to make sure a message is logged, in\r
+ addition to the error image, and use error_trigger rather than exit.\r
+\r
+#1826513: FIXME in DrawLegend: Max label length\r
+ The actual size needed for legend text is now used.\r
+\r
+#1827263: Spoiled up pie-chart if $val is close to zero\r
+ Fixed by skipping over any segment that rounds to 0 degrees of\r
+ arc. (The GD function uses integer angles only, and 0 degrees\r
+ means draw a complete circle.)\r
+\r
+#1836528: Insufficient checking of parameter values\r
+ Rewrote validator function to reject improper parameter values.\r
+\r
+#1843012: Make margins, drawing consistent\r
+ Margin code logic was rewritten and checked for consistency.\r
+\r
+#1856207: Margin error with 'xaxis'/'yaxis' position\r
+ Margin space is now allocated for ticks and labels if their position\r
+ is 'xaxis' or 'yaxis' and the axis is at the plot edge. This is not\r
+ a perfect fix (the axis could be close but not at the edge).\r
+\r
+\r
+-----------------------------------------------------------------------------\r
+\r
+2007-10-20 Released 5.0.4\r
+\r
+Overview:\r
+\r
+This is the latest stable release of PHPlot. We are abandoning the 'rc'\r
+version naming style, because we don't consider these last releases\r
+'release candidate' versions. As we continue to make changes to PHPlot,\r
+we are not converging toward a final "5.0" release, however we do consider\r
+these releases stable and complete enough for production use.\r
+\r
+This release fixes a number of problems and introduces a few new features.\r
+\r
+The PHPlot reference manual has also been updated to match this release.\r
+New material has been added documenting some of the PHPlot internals.\r
+The manual is available as a separate download from Sourceforge.\r
+\r
+\r
+Code Cleanup:\r
+\r
+Some code cleanup is going in to this release. It is hoped that these\r
+changes will not impact any existing scripts using PHPlot, but will make\r
+the PHPlot code itself easier to understand and maintain.\r
+\r
+PHPlot now avoids making changes outside its own class definition. There\r
+are no longer any functions defined outside the class, nor any constants.\r
+Three constants (MINY MAXY TOTY) were removed, and 2 functions were removed\r
+(see Visible Changes below). Also PHPlot no longer sets the PHP error\r
+reporting level to E_ALL. Although we highly recommend setting error\r
+reporting to E_ALL in your php.ini file or scripts, it is not right for\r
+PHPlot to assume that you want it.\r
+\r
+\r
+Visible Changes and Possible Incompatibilities:\r
+\r
+Arrays containing color and style information are used with several PHPlot\r
+functions to control the plot style array. These functions are:\r
+ SetPointShapes, SetPointSizes, SetLineWidths, SetLineStyles,\r
+ SetDataColors, SetDataBorderColors, and SetErrorBarColors.\r
+The arrays passed to these functions MUST used sequential integer 0-based\r
+indexes. This is what the PHP manual calls "Usual integer indices (starting\r
+from zero, increasing by one)". This is the type of array you get in PHP by\r
+default if you use array() without specifying key values, or use the\r
+empty-bracket assignment operator to add values onto an array. In previous\r
+versions of PHPlot, some of these functions would also work with\r
+string-indexed or non-sequentially-indexed arrays, but this was not clearly\r
+defined. Starting with PHPlot-5.0.4, only arrays with "usual integer\r
+indices" work, and other array indexes will cause errors.\r
+\r
+Some internal-use-only functions have had their usage changed or been removed.\r
+If you are using functions that are not documented in the PHPlot Function\r
+Reference in the manual, your code may have to be changed.\r
+\r
+As part of the code cleanup, two functions which were defined outside the\r
+PHPlot class were removed: array_pad_array(), and array_merge_php4().\r
+If your code used these, you need to fix your code.\r
+\r
+The routines which accept a color name, value, or array now check for a valid\r
+color name. If you specify a color name which is not in your current color\r
+table, PHPlot will draw an error and exit. Previously, PHP would report an\r
+index error, continue, and get a 'headers already sent' message.\r
+\r
+\r
+Bug Fixes in 5.0.4:\r
+\r
+#1813021: Miss-positioned right-justified vertical GD text.\r
+ Fixed DrawText() to correctly position 90 degree right-justified text\r
+ drawn in a fixed GD font. This could be seen with 90 degree Y tick labels.\r
+\r
+#1790441 Removed destructor/shutdown function, and no longer recommend\r
+ using reference assignment when creating a PHPlot object. This was\r
+ interfering with memory usage.\r
+ Credit to annajilly for analysis.\r
+\r
+#1779115 SetLegendWorld() failed because of undefined variables. The\r
+ required order dependency was too hard to meet. This is now fixed.\r
+ You can now use SetLegendWorld anywhere before DrawGraph.\r
+\r
+#1726810 (feature request, but actually a bug fix) Ignore empty strings\r
+ as data labels when doing time or data label formatting. These would\r
+ previously produce errors or bad formatting. Now you can omit labels\r
+ as needed even with time and data formatting.\r
+ Credit to exgerhardr for finding this.\r
+\r
+#1605555 Y data labels used wrong font and not formatted (bar charts only).\r
+\r
+#1208054 Localization of number formatting in 'data' format type. PHPlot\r
+ will attempt to format the numbers in a way appropriate to your locale.\r
+ You can also force the formatting with the new function SetNumberFormat.\r
+ Credit to David Hernández Sanz.\r
+\r
+#937944 X/Y Tick counts: PHPlot could draw one two few Y tick counts, and\r
+ one too many X tick counts. This is not a perfect fix, and more work is\r
+ needed here, but this fixes an error case in both X and Y values.\r
+\r
+\r
+New Features in 5.0.4:\r
+\r
+New function SetLegendStyle allows control of the alignment of text and\r
+ color boxes within the legend. Also allows removing the color boxes.\r
+ Based on bug #1208054.\r
+ Credit to David Hernández Sanz.\r
+\r
+New function SetNumberFormat. See bug report #1208054 above.\r
+\r
+Callbacks are added. PHPlot can call back your functions while generating the\r
+ plot. This is experimental, and documented only in the file "Callbacks".\r
+ Credit to annajilly for the idea and design.\r
+\r
+-----------------------------------------------------------------------------\r
+\r
+2006-11-13 Released 5.0rc3\r
+\r
+Overview:\r
+\r
+This is an interim release. It has been a long time since the previous\r
+release 5.0rc2, and there have been a lot of changes. There are still more\r
+changes likely to go in before we have "5.0", but there are enough for now.\r
+\r
+The PHPlot Reference Manual has also been released, and is available as a\r
+separate download from Sourceforge. PHPlot users and developers are\r
+strongly encouraged to read the manual.\r
+\r
+This release does not include the "doc/" and "examples/" directories of\r
+previous releases. The Reference Manual contains more complete and\r
+up-to-date information and examples, and I am unable to maintain the doc/\r
+and examples/ files while also maintaining the Reference Manual. If you\r
+need those files, they can be accessed with the Sourceforge web CVS\r
+browser.\r
+\r
+\r
+New Features:\r
+\r
+The emphasis for this release is bug fixing, so there are few new features.\r
+\r
++ You can now suppress lines or points on individual plots in a linepoints\r
+ graph. This feature was added because I needed a graph with several\r
+ linepoints lines, but also with a solid line showing an "80% goal".\r
+ Use SetPointShapes with the value 'none' in the array to suppress the\r
+ point markers for that plot (and only draw the line).\r
+ Use SetLineStyles with the value 'none' in the array to suppress the\r
+ line for that plot (and only draw the point markers).\r
+ [Bug # 1594458]\r
+\r
++ Bar charts can have data labels above the bar with the value. Turn\r
+ these on with SetYDataLabelPos('plotin'). This is somewhat experimental,\r
+ since there isn't a lot of room for labels on top of the bars and you\r
+ may find the results are not useful.\r
+\r
+\r
+Visible Changes:\r
+\r
+Here are the more significant changes in this release. These are changes\r
+which may affect existing scripts and output from PHPlot. See the\r
+ChangeLog file for information about all changes and bug fixes.\r
+\r
++ A bug fix on bar chart bar borders results in black borders around the\r
+ bars if shading is turned off. The border was previously covered up,\r
+ but was supposed to be there. If you need borderless, unshaded bars,\r
+ you need to use SetDataBorderColors to make the borders the same colors\r
+ as the bars. [Bug # 1096197]\r
+\r
++ TrueType font pathname handling was fixed. You no longer need to use\r
+ SetUseTTF(True). You can either use full paths to the font files with\r
+ SetDefaultTTFont() and SetFont(), or you can call SetTTFPath() to point\r
+ to a directory of font files, and then use simple font filenames without\r
+ paths in SetDefaultTTFont() and SetFont().\r
+ [Bug # 1144644 plus several others]\r
+\r
++ There have been several fixes regarding automatically calculated ranges\r
+ and scales. The result is that you may see less extra space and fewer\r
+ tick marks in some cases.\r
+\r
++ A fix was made to bar and stackedbar graph bar widths in order to get\r
+ the X axis labels to properly center. As part of the fix, the bar widths\r
+ now match between the two graph types. (Before this fix, the bars were\r
+ narrower in bar graphs compared to the same data plotted as a stacked\r
+ bar.) As a result, bar graph bars will now be drawn with wider bars, and\r
+ stackedbar graph bars will be narrower. You can adjust this with the new\r
+ class variable bar_extra_space. [Bug # 1437912]\r
+\r
++ Dot shapes and sizes were off by 1 or 2 slots in the array of shapes or\r
+ sizes. After the fix, you may get different dot shapes or sizes per\r
+ plot line. [Bug # 1096194]\r
+\r
+\r
+Testing:\r
+ \r
+Since its output is visual (graphics), and it has so many interconnected\r
+modes and options, PHPlot is difficult to test. But at least we are now\r
+trying. I have a collection of PHPlot scripts (currently about 60) and a\r
+script to run through them. The script automatically checks that:\r
+ 1) Nothing was written to the standard error stream;\r
+ 2) An image file of size greater than 0 was written;\r
+ 3) Neither the test script nor PHPlot did exit(). This catches cases\r
+ where PHPlot aborts with DrawError().\r
+\r
+The automated test is an easy way to check for serious regression, but you\r
+really need to inspect the output files to validate PHPlot. This takes a\r
+little time, and it is easy to overlook problems.\r
+\r
+The real issue is test coverage. Just as we can be sure that future\r
+PHPlot releases will pass the test collection, we can also be sure that\r
+future bug reports will be written against untested cases.\r
+\r
+--------------------\r
+\r
+2006-11-08 PHPlot on Sourceforge has a new maintainer: lbayuk\r
+\r
+--------------------\r
+\r
+2004-10-24 Released 5.0rc2\r
+\r
+--------------------\r
+\r
-This is the README file for PHPlot
-Last updated for PHPlot-5.3.1 on 2011-01-15
-The project web site is http://sourceforge.net/projects/phplot/
-The project home page is http://phplot.sourceforge.net/
------------------------------------------------------------------------------
-
-OVERVIEW:
-
-PHPlot is a PHP class for creating scientific and business charts.
-
-The release documentation contains only summary information. For more
-complete information, download the PHPlot Reference Manual from the
-Sourceforge project web site. You can also view the manual online at
-http://phplot.sourceforge.net
-
-For information about changes in this release, including any possible
-incompatibilities, see the NEWS.txt file.
-
-
-CONTENTS:
-
- COPYING . . . . . . . . . . . . LGPL 2.1 License file
- ChangeLog . . . . . . . . . . . Lists changes to the sources
- NEWS.txt . . . . . . . . . . . . Highlights changes in releases
- README.txt . . . . . . . . . . This file
- contrib . . . . . . . . . . . . "Contributed" directory, add-ons
- phplot.php . . . . . . . . . . The main PHPlot source file
- rgb.inc.php . . . . . . . . . . Optional extended color table
-
-
-REQUIREMENTS:
-
-You need a recent version of PHP5, and you are advised to use the latest
-stable release. This version of PHPlot has been tested with PHP-5.3.5 and
-PHP-5.2.17 on Linux, and with PHP-5.3.5 on Windows XP.
-
-Use of PHP-5.3.2 or PHP-5.2.13 is not recommended, if you are using
-TrueType Font (TTF) text. A bug with TTF rendering in those versions
-affects PHPlot images. This was fixed in PHP-5.3.3 and PHP-5.2.14.
-
-You need the GD extension to PHP either built in to PHP or loaded as a
-module. Refer to the PHP documentation for more information - see the
-Image Functions chapter in the PHP Manual. We test PHPlot only with the
-PHP-supported, bundled GD library.
-
-If you want to display PHPlot charts on a web site, you need a PHP-enabled
-web server. You can also use the PHP CLI interface without a web server.
-
-PHPlot supports TrueType fonts, but does not include any TrueType font
-files. If you want to use TrueType fonts on your charts, you need to have
-TrueType support in GD, and some TrueType font files. By default, PHPlot
-uses a simple font which is built in to the GD library.
-
-
-INSTALLATION:
-
-Unpack the distribution. (If you are reading this file, you have probably
-already done that.)
-
-Installation of PHPlot simply involves copying two script files somewhere
-your PHP application scripts will be able to find them. The scripts are:
- phplot.php - The main script file
- rgb.inc.php - Optional large color table
-Make sure the permissions on these files allow the web server to read them.
-
-The ideal place is a directory outside your web server document area,
-and on your PHP include path. You can add to the include path in the PHP
-configuration file; consult the PHP manual for details.
-
-
-KNOWN ISSUES:
-
-Here are some of the problems we know about in PHPlot. See the bug tracker
-on the PHPlot project web site for more information.
-
-#3142124 Clip plot elements to plot area
- Plot elements are not currently clipped to the plot area, and may extend
- beyond. PHP does not currently support the GD clipping control.
-
-#1795969 The automatic range calculation for Y values needs to be rewritten.
- This is especially a problem with small offset ranges (e.g. Y=[999:1001]).
- You can use SetPlotAreaWorld to set a specific range instead.
-
-#1605558 Wide/Custom dashed lines don't work well
- This is partially a GD issue, partially PHPlot's fault.
-
-#2919086 Improve tick interval calculations
- Tick interval calculations should try for intervals of 1, 2, or 5 times
- a power of 10.
-
-PHP Issues:
-
- PHP has many build-time and configuration options, and these can affect
-the operation of PHPlot (as well as any other application or library). Here
-are some known issues:
- + Slackware Linux includes a version of PHP built with --enable-gd-jis-conv
-(JIS-mapped Japanese font support). This prevents the usual UTF-8 encoding
-of characters from working in TrueType Font (TTF) text strings.
- + The Ubuntu Linux PHP GD package (php5-gd) was built to use the external
-shared GD library, not the one bundled with PHP. This can result in small
-differences in images, and some unsupported features (such as advanced
-truecolor image operations). Also, although this Ubuntu GD library was
-built with fontconfig support, PHP does not use it, so you still need to
-specify TrueType fonts with their actual file names.
- + Some PHP installations may have a memory limit set too low to support
-large images, especially truecolor images.
-
-
-If you think you found a problem with PHPlot, or want to ask questions or
-provide feedback, please use the Help and Discussion forum at
- http://sourceforge.net/projects/phplot/
-If you are sure you have found a bug, you can report it on the Bug tracker
-at the same web site. There is also a Features Request tracker.
-
-
-TESTING:
-
-You can test your installation by creating the following two files somewhere
-in your web document area. First, the HTML file:
-
------------- simpleplot.html ----------------------------
-<html>
-<head>
-<title>Hello, PHPlot!</title>
-</head>
-<body>
-<h1>PHPlot Test</h1>
-<img src="simpleplot.php">
-</body>
-</html>
----------------------------------------------------------
-
-Second, in the same directory, the image file producing PHP script file.
-Depending on where you installed phplot.php, you may need to specify a path
-in the 'require' line below.
-
------------- simpleplot.php -----------------------------
-<?php
-require 'phplot.php';
-$plot = new PHPlot();
-$data = array(array('', 0, 0), array('', 1, 9));
-$plot->SetDataValues($data);
-$plot->SetDataType('data-data');
-$plot->DrawGraph();
----------------------------------------------------------
-
-Access the URL to 'simpleplot.html' in your web browser. If you see a
-simple graph, you have successfully installed PHPlot. If you see no
-graph, check your web server error log for more information.
-
-
-COPYRIGHT and LICENSE:
-
-PHPlot is Copyright (C) 1998-2011 Afan Ottenheimer
-
-This is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation;
-version 2.1 of the License.
-
-This software 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
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this software; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+This is the README file for PHPlot\r
+Last updated for PHPlot-5.3.1 on 2011-01-15\r
+The project web site is http://sourceforge.net/projects/phplot/\r
+The project home page is http://phplot.sourceforge.net/\r
+-----------------------------------------------------------------------------\r
+\r
+OVERVIEW:\r
+\r
+PHPlot is a PHP class for creating scientific and business charts.\r
+\r
+The release documentation contains only summary information. For more\r
+complete information, download the PHPlot Reference Manual from the\r
+Sourceforge project web site. You can also view the manual online at\r
+http://phplot.sourceforge.net\r
+\r
+For information about changes in this release, including any possible\r
+incompatibilities, see the NEWS.txt file.\r
+\r
+\r
+CONTENTS:\r
+\r
+ COPYING . . . . . . . . . . . . LGPL 2.1 License file\r
+ ChangeLog . . . . . . . . . . . Lists changes to the sources\r
+ NEWS.txt . . . . . . . . . . . . Highlights changes in releases\r
+ README.txt . . . . . . . . . . This file\r
+ contrib . . . . . . . . . . . . "Contributed" directory, add-ons\r
+ phplot.php . . . . . . . . . . The main PHPlot source file\r
+ rgb.inc.php . . . . . . . . . . Optional extended color table\r
+\r
+\r
+REQUIREMENTS:\r
+\r
+You need a recent version of PHP5, and you are advised to use the latest\r
+stable release. This version of PHPlot has been tested with PHP-5.3.5 and\r
+PHP-5.2.17 on Linux, and with PHP-5.3.5 on Windows XP.\r
+\r
+Use of PHP-5.3.2 or PHP-5.2.13 is not recommended, if you are using\r
+TrueType Font (TTF) text. A bug with TTF rendering in those versions\r
+affects PHPlot images. This was fixed in PHP-5.3.3 and PHP-5.2.14.\r
+\r
+You need the GD extension to PHP either built in to PHP or loaded as a\r
+module. Refer to the PHP documentation for more information - see the\r
+Image Functions chapter in the PHP Manual. We test PHPlot only with the\r
+PHP-supported, bundled GD library.\r
+\r
+If you want to display PHPlot charts on a web site, you need a PHP-enabled\r
+web server. You can also use the PHP CLI interface without a web server.\r
+\r
+PHPlot supports TrueType fonts, but does not include any TrueType font\r
+files. If you want to use TrueType fonts on your charts, you need to have\r
+TrueType support in GD, and some TrueType font files. By default, PHPlot\r
+uses a simple font which is built in to the GD library.\r
+\r
+\r
+INSTALLATION:\r
+\r
+Unpack the distribution. (If you are reading this file, you have probably\r
+already done that.)\r
+\r
+Installation of PHPlot simply involves copying two script files somewhere\r
+your PHP application scripts will be able to find them. The scripts are:\r
+ phplot.php - The main script file\r
+ rgb.inc.php - Optional large color table\r
+Make sure the permissions on these files allow the web server to read them.\r
+\r
+The ideal place is a directory outside your web server document area,\r
+and on your PHP include path. You can add to the include path in the PHP\r
+configuration file; consult the PHP manual for details.\r
+\r
+\r
+KNOWN ISSUES:\r
+\r
+Here are some of the problems we know about in PHPlot. See the bug tracker\r
+on the PHPlot project web site for more information.\r
+\r
+#3142124 Clip plot elements to plot area\r
+ Plot elements are not currently clipped to the plot area, and may extend\r
+ beyond. PHP does not currently support the GD clipping control.\r
+\r
+#1795969 The automatic range calculation for Y values needs to be rewritten. \r
+ This is especially a problem with small offset ranges (e.g. Y=[999:1001]).\r
+ You can use SetPlotAreaWorld to set a specific range instead.\r
+\r
+#1605558 Wide/Custom dashed lines don't work well\r
+ This is partially a GD issue, partially PHPlot's fault.\r
+\r
+#2919086 Improve tick interval calculations\r
+ Tick interval calculations should try for intervals of 1, 2, or 5 times\r
+ a power of 10.\r
+\r
+PHP Issues:\r
+\r
+ PHP has many build-time and configuration options, and these can affect\r
+the operation of PHPlot (as well as any other application or library). Here\r
+are some known issues:\r
+ + Slackware Linux includes a version of PHP built with --enable-gd-jis-conv\r
+(JIS-mapped Japanese font support). This prevents the usual UTF-8 encoding\r
+of characters from working in TrueType Font (TTF) text strings.\r
+ + The Ubuntu Linux PHP GD package (php5-gd) was built to use the external\r
+shared GD library, not the one bundled with PHP. This can result in small\r
+differences in images, and some unsupported features (such as advanced\r
+truecolor image operations). Also, although this Ubuntu GD library was\r
+built with fontconfig support, PHP does not use it, so you still need to\r
+specify TrueType fonts with their actual file names.\r
+ + Some PHP installations may have a memory limit set too low to support\r
+large images, especially truecolor images.\r
+\r
+\r
+If you think you found a problem with PHPlot, or want to ask questions or\r
+provide feedback, please use the Help and Discussion forum at\r
+ http://sourceforge.net/projects/phplot/\r
+If you are sure you have found a bug, you can report it on the Bug tracker\r
+at the same web site. There is also a Features Request tracker.\r
+\r
+\r
+TESTING:\r
+\r
+You can test your installation by creating the following two files somewhere\r
+in your web document area. First, the HTML file:\r
+\r
+------------ simpleplot.html ----------------------------\r
+<html>\r
+<head>\r
+<title>Hello, PHPlot!</title>\r
+</head>\r
+<body>\r
+<h1>PHPlot Test</h1>\r
+<img src="simpleplot.php">\r
+</body>\r
+</html>\r
+---------------------------------------------------------\r
+\r
+Second, in the same directory, the image file producing PHP script file.\r
+Depending on where you installed phplot.php, you may need to specify a path\r
+in the 'require' line below.\r
+\r
+------------ simpleplot.php -----------------------------\r
+<?php\r
+require 'phplot.php';\r
+$plot = new PHPlot();\r
+$data = array(array('', 0, 0), array('', 1, 9));\r
+$plot->SetDataValues($data);\r
+$plot->SetDataType('data-data');\r
+$plot->DrawGraph();\r
+---------------------------------------------------------\r
+\r
+Access the URL to 'simpleplot.html' in your web browser. If you see a\r
+simple graph, you have successfully installed PHPlot. If you see no\r
+graph, check your web server error log for more information.\r
+\r
+\r
+COPYRIGHT and LICENSE:\r
+\r
+PHPlot is Copyright (C) 1998-2011 Afan Ottenheimer\r
+\r
+This is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU Lesser General Public\r
+License as published by the Free Software Foundation;\r
+version 2.1 of the License.\r
+\r
+This software is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+Lesser General Public License for more details.\r
+\r
+You should have received a copy of the GNU Lesser General Public\r
+License along with this software; if not, write to the Free Software\r
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\r
-This is the README for PHPlot Contributed Code
-The project web site is http://sourceforge.net/projects/phplot/
-Last updated on 2009-12-08
------------------------------------------------------------------------------
-
-The PHPlot Contributed Code directory contains code you might find useful
-with PHPlot, but that doesn't quite belong as part of PHPlot itself.
-
-You will have to read the comments in the code files, and see the example
-files, to determine what these do and if they are useful to you. None of
-these functions is documented in the PHPlot Reference Manual.
-
-You may include or paste these functions into your own scripts. Check the
-files for details, but some of these are considered "public domain" with no
-usage or license restrictions.
-
------------------------------------------------------------------------------
-Contents:
-
-prune_labels: Reduce the number of labels along the X axis
- prune_labels.php . . . . . . . . . . . . Code
- prune_labels.example.php . . . . . . . . Example
- prune_labels.test.php . . . . . . . . . Test
-
-color_range: Create a gradient color map for data colors
- color_range.php . . . . . . . . . . . . Code
- color_range.example.php . . . . . . . . Example
- color_range.test1.php . . . . . . . . . Image creation test
- color_range.test2.php . . . . . . . . . Unit test
-
------------------------------------------------------------------------------
+This is the README for PHPlot Contributed Code\r
+The project web site is http://sourceforge.net/projects/phplot/\r
+Last updated on 2009-12-08\r
+-----------------------------------------------------------------------------\r
+\r
+The PHPlot Contributed Code directory contains code you might find useful\r
+with PHPlot, but that doesn't quite belong as part of PHPlot itself.\r
+\r
+You will have to read the comments in the code files, and see the example\r
+files, to determine what these do and if they are useful to you. None of\r
+these functions is documented in the PHPlot Reference Manual.\r
+\r
+You may include or paste these functions into your own scripts. Check the\r
+files for details, but some of these are considered "public domain" with no\r
+usage or license restrictions.\r
+\r
+-----------------------------------------------------------------------------\r
+Contents:\r
+\r
+prune_labels: Reduce the number of labels along the X axis\r
+ prune_labels.php . . . . . . . . . . . . Code\r
+ prune_labels.example.php . . . . . . . . Example\r
+ prune_labels.test.php . . . . . . . . . Test\r
+\r
+color_range: Create a gradient color map for data colors\r
+ color_range.php . . . . . . . . . . . . Code\r
+ color_range.example.php . . . . . . . . Example\r
+ color_range.test1.php . . . . . . . . . Image creation test\r
+ color_range.test2.php . . . . . . . . . Unit test\r
+\r
+-----------------------------------------------------------------------------\r
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html lang="en">
-<head>
-<title>bacula-web</title>
-<link rel="stylesheet" type="text/css" href="style/default.css">
-{literal}
-<script type="text/javascript">
- function OpenWin(URL,wid,hei) {
- window.open(URL,"window1","width="+wid+",height="+hei+",scrollbars=yes,menubar=no,location=no,resizable=no")
- }
-</script>
-{/literal}
-
-</head>
-<body>
-{popup_init src='./external_packages/js/overlib.js'}
-{include file=header.tpl}
-
- <div id="nav">
- <a href="index.php" title="Back to the dashboard">Dashboard</a> > Backup Job Report
- </div>
-
- <div id="main_center">
-
- <div class="box">
- <p class="title">Backup Job Report</p>
-
- <table>
- <tr>
- <td width="150">Backup Job name:</td>
- <td>{$backupjob_name}</td>
- </tr>
- <tr>
- <td>Period:</td>
- <td>{$backupjob_period}</td>
- </tr>
- <tr>
- <td>Transfered Bytes</td>
- <td>{$backupjob_bytes} GB</td>
- </tr>
- <tr>
- <td>Transfered Files</td>
- <td>{$backupjob_files}</td>
- </tr>
-
- </table>
- </div> <!-- end div class=box -->
-
- <!-- Last jobs list -->
- <div class="box">
- <p class="title">Last jobs</p>
-
- <table>
- <tr>
- <td class="tbl_header">Job Id</td>
- <td class="tbl_header">Level</td>
- <td class="tbl_header">Files</td>
- <td class="tbl_header">Bytes</td>
- <td class="tbl_header">End time</td>
- </tr>
- {foreach from=$jobs item=job}
- <tr>
- <td>{$job.JobId}</td>
- <td>{$job.Level}</td>
- <td>{$job.JobFiles}</td>
- <td>{$job.JobBytes}</td>
- <td>{$job.EndTime}</td>
- </tr>
- {/foreach}
- </table>
- </div> <!-- end div class=box -->
-
- <!-- Transfered Bytes graph -->
- <div class="box">
- <p class="title">Transfered Bytes (last week in GB)</p>
- <img src="{$graph_stored_bytes}" alt="" />
- </div> <!-- end div class=box -->
-
- <!-- Transfered Files graph -->
- <div class="box">
- <p class="title">Transfered Files (last week)</p>
- <img src="{$graph_stored_files}" alt="" />
- </div> <!-- end div class=box -->
-
- </div> <!-- end div id=main_center -->
-
-{include file="footer.tpl"}
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" \r
+ "http://www.w3.org/TR/html4/loose.dtd">\r
+<html lang="en">\r
+<head>\r
+<title>bacula-web</title>\r
+<link rel="stylesheet" type="text/css" href="style/default.css">\r
+{literal}\r
+<script type="text/javascript">\r
+ function OpenWin(URL,wid,hei) {\r
+ window.open(URL,"window1","width="+wid+",height="+hei+",scrollbars=yes,menubar=no,location=no,resizable=no")\r
+ }\r
+</script>\r
+{/literal}\r
+\r
+</head>\r
+<body>\r
+{popup_init src='./external_packages/js/overlib.js'}\r
+{include file=header.tpl}\r
+\r
+ <div id="nav">\r
+ <a href="index.php" title="Back to the dashboard">Dashboard</a> > Backup Job Report\r
+ </div>\r
+\r
+ <div id="main_center">\r
+ \r
+ <div class="box">\r
+ <p class="title">Backup Job Report</p>\r
+ \r
+ <table>\r
+ <tr>\r
+ <td width="150">Backup Job name:</td>\r
+ <td>{$backupjob_name}</td>\r
+ </tr>\r
+ <tr>\r
+ <td>Period:</td>\r
+ <td>{$backupjob_period}</td>\r
+ </tr>\r
+ <tr>\r
+ <td>Transfered Bytes</td>\r
+ <td>{$backupjob_bytes} GB</td>\r
+ </tr>\r
+ <tr>\r
+ <td>Transfered Files</td>\r
+ <td>{$backupjob_files}</td>\r
+ </tr>\r
+\r
+ </table>\r
+ </div> <!-- end div class=box -->\r
+ \r
+ <!-- Last jobs list -->\r
+ <div class="box">\r
+ <p class="title">Last jobs</p>\r
+ \r
+ <table>\r
+ <tr>\r
+ <td class="tbl_header">Job Id</td>\r
+ <td class="tbl_header">Level</td>\r
+ <td class="tbl_header">Files</td>\r
+ <td class="tbl_header">Bytes</td>\r
+ <td class="tbl_header">End time</td>\r
+ </tr>\r
+ {foreach from=$jobs item=job}\r
+ <tr>\r
+ <td>{$job.JobId}</td>\r
+ <td>{$job.Level}</td>\r
+ <td>{$job.JobFiles}</td>\r
+ <td>{$job.JobBytes}</td>\r
+ <td>{$job.EndTime}</td>\r
+ </tr>\r
+ {/foreach}\r
+ </table>\r
+ </div> <!-- end div class=box -->\r
+ \r
+ <!-- Transfered Bytes graph -->\r
+ <div class="box">\r
+ <p class="title">Transfered Bytes (last week in GB)</p>\r
+ <img src="{$graph_stored_bytes}" alt="" />\r
+ </div> <!-- end div class=box -->\r
+\r
+ <!-- Transfered Files graph -->\r
+ <div class="box">\r
+ <p class="title">Transfered Files (last week)</p>\r
+ <img src="{$graph_stored_files}" alt="" />\r
+ </div> <!-- end div class=box -->\r
+ \r
+ </div> <!-- end div id=main_center -->\r
+\r
+{include file="footer.tpl"}\r