add piwik installation
This commit is contained in:
parent
90aa4ef157
commit
8c5d4f0c31
3197 changed files with 563902 additions and 0 deletions
23
www/analytics/libs/sparkline/CHANGES
Normal file
23
www/analytics/libs/sparkline/CHANGES
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
#
|
||||
# Sparkline PHP Graphing Library
|
||||
# Copyright 2004 James Byers <jbyers@gmail.com>
|
||||
# http://sparkline.org
|
||||
#
|
||||
# Dual-licensed under the BSD (LICENSE-BSD.txt) and GPL (LICENSE-GPL.txt)
|
||||
# licenses.
|
||||
#
|
||||
# $Id: CHANGES,v 1.3 2008/03/11 19:12:49 jbyers Exp $
|
||||
#
|
||||
|
||||
2005-06-02 James Byers <jbyers@users.sf.net>
|
||||
|
||||
* Version 0.2 released
|
||||
* Corrected line chart behavior for small data sets [1096890]
|
||||
* Library will create log file if possible [1163412]
|
||||
* Fixed error message on bad log file [1096895]
|
||||
* Corrected bitmask on DEBUG_ALL
|
||||
* Revised structure of SetFeature
|
||||
|
||||
2004-11-08 James Byers <jbyers@users.sf.net>
|
||||
|
||||
* Version 0.1 released
|
||||
28
www/analytics/libs/sparkline/DESIGN
Normal file
28
www/analytics/libs/sparkline/DESIGN
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
#
|
||||
# Sparkline PHP Graphing Library
|
||||
# Copyright 2004 James Byers <jbyers@gmail.com>
|
||||
# http://sparkline.org
|
||||
#
|
||||
# Dual-licensed under the BSD (LICENSE-BSD.txt) and GPL (LICENSE-GPL.txt)
|
||||
# licenses.
|
||||
#
|
||||
# $Id: DESIGN,v 1.4 2008/03/11 19:12:49 jbyers Exp $
|
||||
#
|
||||
|
||||
Not much to see. It's 0.1, after all.
|
||||
|
||||
Flow
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
Instantiate appropriate Sparkline subclass
|
||||
Load data, set parameters, all Set* calls
|
||||
Render
|
||||
convert coordinates
|
||||
calculate image size
|
||||
create image handle
|
||||
set colors
|
||||
fill background
|
||||
draw graph
|
||||
draw features
|
||||
Optionally call Draw* functions
|
||||
Output / OutputFile
|
||||
29
www/analytics/libs/sparkline/LICENSE-BSD.txt
Normal file
29
www/analytics/libs/sparkline/LICENSE-BSD.txt
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
Copyright (c) 2004 James Byers <jbyers@gmail.com>
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of James Byers nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this
|
||||
software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
46
www/analytics/libs/sparkline/README
Normal file
46
www/analytics/libs/sparkline/README
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
#
|
||||
# Sparkline PHP Graphing Library
|
||||
# Copyright 2004 James Byers <jbyers@gmail.com>
|
||||
# http://sparkline.org
|
||||
#
|
||||
# Dual-licensed under the BSD (LICENSE-BSD.txt) and GPL (LICENSE-GPL.txt)
|
||||
# licenses.
|
||||
#
|
||||
# $Id: README,v 1.3 2008/03/11 19:12:49 jbyers Exp $
|
||||
#
|
||||
|
||||
Installation:
|
||||
-------------
|
||||
|
||||
Sparkline does not have any installation requirements. See the
|
||||
samples directory for usage ideas.
|
||||
|
||||
Requirements:
|
||||
-------------
|
||||
|
||||
Sparkline requires PHP 4.0.6 or newer and GD 2.0 built as a PHP
|
||||
module.
|
||||
|
||||
Troubleshooting and Support:
|
||||
----------------------------
|
||||
|
||||
See http://sparkline.org for troubleshooting advice and support.
|
||||
|
||||
Bugs, Features:
|
||||
---------------
|
||||
|
||||
Please submit bugs to the bug tracker:
|
||||
|
||||
http://sourceforge.net/tracker/?group_id=122936&atid=694962
|
||||
|
||||
Please submit feature requests to the RFE tracker:
|
||||
|
||||
http://sourceforge.net/tracker/?group_id=122936&atid=694965
|
||||
|
||||
License:
|
||||
--------
|
||||
|
||||
The library is dual-licensed under the BSD and GPL licenses. You
|
||||
may use this library under the terms of either license. See
|
||||
LICENSE-BSD.txt and LICENSE-GPL.txt.
|
||||
|
||||
339
www/analytics/libs/sparkline/gpl-2.0.txt
Normal file
339
www/analytics/libs/sparkline/gpl-2.0.txt
Normal file
|
|
@ -0,0 +1,339 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 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.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
||||
159
www/analytics/libs/sparkline/lib/Object.php
Normal file
159
www/analytics/libs/sparkline/lib/Object.php
Normal file
|
|
@ -0,0 +1,159 @@
|
|||
<?php
|
||||
/*
|
||||
* Sparkline PHP Graphing Library
|
||||
* Copyright 2004 James Byers <jbyers@gmail.com>
|
||||
* http://sparkline.org
|
||||
*
|
||||
* Dual-licensed under the BSD (LICENSE-BSD.txt) and GPL (LICENSE-GPL.txt)
|
||||
* licenses.
|
||||
*
|
||||
* $Id: Object.php,v 1.9 2008/03/11 19:12:49 jbyers Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
define('DEBUG_NONE', 0); // nothing
|
||||
define('DEBUG_ERROR', 1); // major errors
|
||||
define('DEBUG_WARNING', 2); // warnings
|
||||
define('DEBUG_STATS', 4); // dataset, rendering statistics
|
||||
define('DEBUG_CALLS', 8); // major function calls
|
||||
define('DEBUG_SET', 16); // all Set methods
|
||||
define('DEBUG_DRAW', 32); // all Draw methods
|
||||
define('DEBUG_ALL', 2047); // everything
|
||||
|
||||
function error_handler($errno, $errstr, $errfile, $errline) {
|
||||
switch ($errno) {
|
||||
case E_ERROR:
|
||||
$message = "ERROR: ";
|
||||
break;
|
||||
case E_WARNING:
|
||||
$message = "WARNING: ";
|
||||
break;
|
||||
case E_PARSE:
|
||||
$message = "PARSE: ";
|
||||
break;
|
||||
case E_NOTICE:
|
||||
$message = "NOTICE: ";
|
||||
break;
|
||||
case E_USER_ERROR:
|
||||
$message = "UERROR: ";
|
||||
break;
|
||||
case E_USER_WARNING:
|
||||
$message = "UWARNING: ";
|
||||
break;
|
||||
case E_USER_NOTICE:
|
||||
$message = "UNOTICE: ";
|
||||
break;
|
||||
default:
|
||||
$message = "UNKNOWN: ";
|
||||
break;
|
||||
} // switch
|
||||
|
||||
$message .= "$errstr in $errfile at line $errline\n";
|
||||
|
||||
if (($errno != E_NOTICE) && // suppress notices
|
||||
(error_reporting() != 0)) { // respect supressed errors (@)
|
||||
log_write($message, 'PHP');
|
||||
}
|
||||
} // function error_handler
|
||||
|
||||
function log_write($string, $type = '', $date = false) {
|
||||
global $LOGFILE;
|
||||
|
||||
if (isset($LOGFILE)) {
|
||||
if ($date == false) {
|
||||
$date = time();
|
||||
}
|
||||
|
||||
$message = date('d/m/Y:H:i:s', $date) . " $type: $string \n";
|
||||
error_log($message, 3, $LOGFILE);
|
||||
}
|
||||
} // function log_write
|
||||
|
||||
class Object {
|
||||
|
||||
var $isError;
|
||||
var $logFile;
|
||||
var $errorList;
|
||||
var $debugList;
|
||||
var $debugLevel;
|
||||
var $startTime;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// constructor
|
||||
//
|
||||
function Object($catch_errors = true) {
|
||||
$this->isError = false;
|
||||
$this->logFile = null;
|
||||
$this->logDate = '';
|
||||
$this->errorList = array();
|
||||
$this->debugList = array();
|
||||
$this->debugLevel = DEBUG_NONE;
|
||||
$this->startTime = $this->microTimer();
|
||||
|
||||
// if ($catch_errors) {
|
||||
set_error_handler('error_handler');
|
||||
//}
|
||||
} // function Object
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// utility
|
||||
//
|
||||
function microTimer() {
|
||||
list($usec, $sec) = explode(" ", microtime());
|
||||
return ((float)$usec + (float)$sec);
|
||||
} // function microTimer
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// error handling
|
||||
//
|
||||
function SetDebugLevel($level, $file = null) {
|
||||
global $LOGFILE;
|
||||
|
||||
if ($level >= DEBUG_NONE &&
|
||||
$level <= DEBUG_ALL) {
|
||||
$this->debugLevel = $level;
|
||||
}
|
||||
|
||||
if ($file != null) {
|
||||
if ((!file_exists($file) && !touch($file)) ||
|
||||
!is_writable($file)) {
|
||||
die("error log file '$file' is not writable to the web server user");
|
||||
} else {
|
||||
$this->logFile = $file;
|
||||
$LOGFILE = $file;
|
||||
}
|
||||
}
|
||||
} // function SetDebugLevel
|
||||
|
||||
function Debug($string, $level = DEBUG_WARNING) {
|
||||
$this->debugList[] = $string;
|
||||
if ($this->debugLevel & $level &&
|
||||
$this->logFile != null) {
|
||||
log_write($string, 'DEBUG');
|
||||
}
|
||||
} // function Debug
|
||||
|
||||
function Error($string) {
|
||||
$this->isError = true;
|
||||
$this->errorList[] = $string;
|
||||
if ($this->debugLevel & DEBUG_ERROR &&
|
||||
$this->logFile != null) {
|
||||
log_write($string, 'ERROR');
|
||||
}
|
||||
} // function Error
|
||||
|
||||
function GetDebug() {
|
||||
return $this->debugList;
|
||||
} // function GetDebug
|
||||
|
||||
function GetError() {
|
||||
return $this->errorList;
|
||||
} // function GetError
|
||||
|
||||
function IsError() {
|
||||
return $this->isError;
|
||||
} // function IsError
|
||||
|
||||
} // class Object
|
||||
|
||||
?>
|
||||
494
www/analytics/libs/sparkline/lib/Sparkline.php
Normal file
494
www/analytics/libs/sparkline/lib/Sparkline.php
Normal file
|
|
@ -0,0 +1,494 @@
|
|||
<?php
|
||||
/*
|
||||
* Sparkline PHP Graphing Library
|
||||
* Copyright 2004 James Byers <jbyers@gmail.com>
|
||||
* http://sparkline.org
|
||||
*
|
||||
* Dual-licensed under the BSD (LICENSE-BSD.txt) and GPL (LICENSE-GPL.txt)
|
||||
* licenses.
|
||||
*
|
||||
* $Id: Sparkline.php,v 1.10 2008/03/11 19:12:49 jbyers Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
define('TEXT_TOP', 1);
|
||||
define('TEXT_RIGHT', 2);
|
||||
define('TEXT_BOTTOM', 3);
|
||||
define('TEXT_LEFT', 4);
|
||||
|
||||
define('FONT_1', 1);
|
||||
define('FONT_2', 2);
|
||||
define('FONT_3', 3);
|
||||
define('FONT_4', 4);
|
||||
define('FONT_5', 5);
|
||||
|
||||
require_once dirname(__FILE__).'/Object.php';
|
||||
|
||||
class Sparkline extends Object {
|
||||
|
||||
var $imageX;
|
||||
var $imageY;
|
||||
var $imageHandle;
|
||||
var $graphAreaPx;
|
||||
var $graphAreaPt;
|
||||
var $colorList;
|
||||
var $colorBackground;
|
||||
var $lineSize;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// constructor
|
||||
//
|
||||
function Sparkline($catch_errors = true) {
|
||||
parent::Object($catch_errors);
|
||||
|
||||
$this->colorList = array();
|
||||
$this->colorBackground = 'white';
|
||||
$this->lineSize = 1;
|
||||
$this->graphAreaPx = array(array(0, 0), array(0, 0)); // px(L, B), px(R, T)
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// init
|
||||
//
|
||||
function Init($x, $y) {
|
||||
$this->Debug("Sparkline :: Init($x, $y)", DEBUG_CALLS);
|
||||
|
||||
$this->imageX = $x;
|
||||
$this->imageY = $y;
|
||||
|
||||
// Set functions may have already set graphAreaPx offsets; add image dimensions
|
||||
//
|
||||
$this->graphAreaPx = array(array($this->graphAreaPx[0][0],
|
||||
$this->graphAreaPx[0][1]),
|
||||
array($this->graphAreaPx[1][0] + $x - 1,
|
||||
$this->graphAreaPx[1][1] + $y - 1));
|
||||
|
||||
$this->imageHandle = $this->CreateImageHandle($x, $y);
|
||||
|
||||
// load default colors; set all color handles
|
||||
//
|
||||
$this->SetColorDefaults();
|
||||
while (list($k, $v) = each($this->colorList)) {
|
||||
$this->SetColorHandle($k, $this->DrawColorAllocate($k));
|
||||
}
|
||||
reset($this->colorList);
|
||||
|
||||
return !$this->IsError();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// color, drawing setup functions
|
||||
//
|
||||
function SetColor($name, $r, $g, $b) {
|
||||
$this->Debug("Sparkline :: SetColor('$name', $r, $g, $b)", DEBUG_SET);
|
||||
$name = strtolower($name);
|
||||
$this->colorList[$name] = array('rgb' => array($r, $g, $b));
|
||||
}
|
||||
|
||||
function SetColorHandle($name, $handle) {
|
||||
$this->Debug("Sparkline :: SetColorHandle('$name', $handle)", DEBUG_SET);
|
||||
$name = strtolower($name);
|
||||
if (array_key_exists($name, $this->colorList)) {
|
||||
$this->colorList[$name]['handle'] = $handle;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function SetColorHex($name, $r, $g, $b) {
|
||||
$this->Debug("Sparkline :: SetColorHex('$name', $r, $g, $b)", DEBUG_SET);
|
||||
$this->SetColor($name, hexdec($r), hexdec($g), hexdec($b));
|
||||
}
|
||||
|
||||
function SetColorHtml($name, $rgb) {
|
||||
$this->Debug("Sparkline :: SetColorHtml('$name', '$rgb')", DEBUG_SET);
|
||||
$rgb = trim($rgb, '#');
|
||||
$this->SetColor($name, hexdec(substr($rgb, 0, 2)), hexdec(substr($rgb, 2, 2)), hexdec(substr($rgb, 4, 2)));
|
||||
}
|
||||
|
||||
function SetColorBackground($name) {
|
||||
$this->Debug("Sparkline :: SetColorBackground('$name')", DEBUG_SET);
|
||||
$this->colorBackground = $name;
|
||||
}
|
||||
|
||||
function GetColor($name) {
|
||||
$name = strtolower($name);
|
||||
if (array_key_exists($name, $this->colorList)) {
|
||||
return $this->colorList[$name]['rgb'];
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function GetColorHandle($name) {
|
||||
$name = strtolower($name);
|
||||
if (array_key_exists($name, $this->colorList)) {
|
||||
return $this->colorList[$name]['handle'];
|
||||
} else {
|
||||
$this->Debug("Sparkline :: GetColorHandle color '$name' not set", DEBUG_WARNING);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function SetColorDefaults() {
|
||||
$this->Debug("Sparkline :: SetColorDefaults()", DEBUG_SET);
|
||||
$colorDefaults = array(array('aqua', '#00FFFF'),
|
||||
array('black', '#010101'), // TODO failure if 000000?
|
||||
array('blue', '#0000FF'),
|
||||
array('fuscia', '#FF00FF'),
|
||||
array('gray', '#808080'),
|
||||
array('grey', '#808080'),
|
||||
array('green', '#008000'),
|
||||
array('lime', '#00FF00'),
|
||||
array('maroon', '#800000'),
|
||||
array('navy', '#000080'),
|
||||
array('olive', '#808000'),
|
||||
array('purple', '#800080'),
|
||||
array('red', '#FF0000'),
|
||||
array('silver', '#C0C0C0'),
|
||||
array('teal', '#008080'),
|
||||
array('white', '#FFFFFF'),
|
||||
array('yellow', '#FFFF00'));
|
||||
while (list(, $v) = each($colorDefaults)) {
|
||||
if (!array_key_exists($v[0], $this->colorList)) {
|
||||
$this->SetColorHtml($v[0], $v[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function SetLineSize($size) {
|
||||
$this->Debug("Sparkline :: SetLineSize($size)", DEBUG_CALLS);
|
||||
$this->lineSize = $size;
|
||||
}
|
||||
|
||||
function GetLineSize() {
|
||||
return($this->lineSize);
|
||||
}
|
||||
|
||||
function SetPadding($T, $R = null, $B = null, $L = null) {
|
||||
$this->Debug("Sparkline :: SetPadding($T, $R, $B, $L)", DEBUG_CALLS);
|
||||
if (null == $R &&
|
||||
null == $B &&
|
||||
null == $L) {
|
||||
$this->graphAreaPx = array(array($this->graphAreaPx[0][0] + $T,
|
||||
$this->graphAreaPx[0][1] + $T),
|
||||
array($this->graphAreaPx[1][0] - $T,
|
||||
$this->graphAreaPx[1][1] - $T));
|
||||
} else {
|
||||
$this->graphAreaPx = array(array($this->graphAreaPx[0][0] + $L,
|
||||
$this->graphAreaPx[0][1] + $B),
|
||||
array($this->graphAreaPx[1][0] - $R,
|
||||
$this->graphAreaPx[1][1] - $T));
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// canvas setup
|
||||
//
|
||||
function CreateImageHandle($x, $y) {
|
||||
$this->Debug("Sparkline :: CreateImageHandle($x, $y)", DEBUG_CALLS);
|
||||
|
||||
$handle = @imagecreatetruecolor($x, $y);
|
||||
if (!is_resource($handle)) {
|
||||
$handle = @imagecreate($x, $y);
|
||||
$this->Debug('imagecreatetruecolor unavailable', DEBUG_WARNING);
|
||||
}
|
||||
|
||||
if (!is_resource($handle)) {
|
||||
$this->Debug('imagecreate unavailable', DEBUG_WARNING);
|
||||
$this->Error('could not create image; GD imagecreate functions unavailable');
|
||||
}
|
||||
|
||||
return $handle;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// drawing primitives
|
||||
//
|
||||
// NB: all drawing primitives use the coordinate system where (0,0)
|
||||
// corresponds to the bottom left of the image, unlike y-inverted
|
||||
// PHP gd functions
|
||||
//
|
||||
function DrawBackground($handle = false) {
|
||||
$this->Debug("Sparkline :: DrawBackground()", DEBUG_DRAW);
|
||||
|
||||
if (!$this->IsError()) {
|
||||
if ($handle === false) $handle = $this->imageHandle;
|
||||
return $this->DrawRectangleFilled(0,
|
||||
0,
|
||||
imagesx($handle) - 1,
|
||||
imagesy($handle) - 1,
|
||||
$this->colorBackground,
|
||||
$handle);
|
||||
}
|
||||
}
|
||||
|
||||
function DrawColorAllocate($color, $handle = false) {
|
||||
$this->Debug("Sparkline :: DrawColorAllocate('$color')", DEBUG_DRAW);
|
||||
if (!$this->IsError() &&
|
||||
$colorRGB = $this->GetColor($color)) {
|
||||
if ($handle === false) $handle = $this->imageHandle;
|
||||
return imagecolorallocate($handle,
|
||||
$colorRGB[0],
|
||||
$colorRGB[1],
|
||||
$colorRGB[2]);
|
||||
}
|
||||
}
|
||||
|
||||
function DrawFill($x, $y, $color, $handle = false) {
|
||||
$this->Debug("Sparkline :: DrawFill($x, $y, '$color')", DEBUG_DRAW);
|
||||
|
||||
if (!$this->IsError() &&
|
||||
$colorHandle = $this->GetColorHandle($color)) {
|
||||
if ($handle === false) $handle = $this->imageHandle;
|
||||
return imagefill($handle,
|
||||
$x,
|
||||
$this->TxGDYToSLY($y, $handle),
|
||||
$colorHandle);
|
||||
}
|
||||
}
|
||||
|
||||
function DrawLine($x1, $y1, $x2, $y2, $color, $thickness = 1, $handle = false) {
|
||||
$this->Debug("Sparkline :: DrawLine($x1, $y1, $x2, $y2, '$color', $thickness)", DEBUG_DRAW);
|
||||
|
||||
if (!$this->IsError() &&
|
||||
$colorHandle = $this->GetColorHandle($color)) {
|
||||
if ($handle === false) $handle = $this->imageHandle;
|
||||
|
||||
imagesetthickness($handle, $thickness);
|
||||
$result = imageline($handle,
|
||||
$x1,
|
||||
$this->TxGDYToSLY($y1, $handle),
|
||||
$x2,
|
||||
$this->TxGDYToSLY($y2, $handle),
|
||||
$colorHandle);
|
||||
imagesetthickness($handle, 1);
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
function DrawPoint($x, $y, $color, $handle = false) {
|
||||
$this->Debug("Sparkline :: DrawPoint($x, $y, '$color')", DEBUG_DRAW);
|
||||
|
||||
if (!$this->IsError() &&
|
||||
$colorHandle = $this->GetColorHandle($color)) {
|
||||
if ($handle === false) $handle = $this->imageHandle;
|
||||
return imagesetpixel($handle,
|
||||
$x,
|
||||
$this->TxGDYToSLY($y, $handle),
|
||||
$colorHandle);
|
||||
}
|
||||
}
|
||||
|
||||
function DrawRectangle($x1, $y1, $x2, $y2, $color, $handle = false) {
|
||||
$this->Debug("Sparkline :: DrawRectangle($x1, $y1, $x2, $y2 '$color')", DEBUG_DRAW);
|
||||
|
||||
if (!$this->IsError() &&
|
||||
$colorHandle = $this->GetColorHandle($color)) {
|
||||
if ($handle === false) $handle = $this->imageHandle;
|
||||
return imagerectangle($handle,
|
||||
$x1,
|
||||
$this->TxGDYToSLY($y1, $handle),
|
||||
$x2,
|
||||
$this->TxGDYToSLY($y2, $handle),
|
||||
$colorHandle);
|
||||
}
|
||||
}
|
||||
|
||||
function DrawRectangleFilled($x1, $y1, $x2, $y2, $color, $handle = false) {
|
||||
$this->Debug("Sparkline :: DrawRectangleFilled($x1, $y1, $x2, $y2 '$color')", DEBUG_DRAW);
|
||||
|
||||
if (!$this->IsError() &&
|
||||
$colorHandle = $this->GetColorHandle($color)) {
|
||||
// NB: switch y1, y2 post conversion
|
||||
//
|
||||
if ($y1 < $y2) {
|
||||
$yt = $y1;
|
||||
$y1 = $y2;
|
||||
$y2 = $yt;
|
||||
}
|
||||
|
||||
if ($handle === false) $handle = $this->imageHandle;
|
||||
return imagefilledrectangle($handle,
|
||||
$x1,
|
||||
$this->TxGDYToSLY($y1, $handle),
|
||||
$x2,
|
||||
$this->TxGDYToSLY($y2, $handle),
|
||||
$colorHandle);
|
||||
}
|
||||
}
|
||||
|
||||
function DrawCircleFilled($x, $y, $diameter, $color, $handle = false) {
|
||||
$this->Debug("Sparkline :: DrawCircleFilled($x, $y, $diameter, '$color')", DEBUG_DRAW);
|
||||
|
||||
if (!$this->IsError() &&
|
||||
$colorHandle = $this->GetColorHandle($color)) {
|
||||
if ($handle === false) $handle = $this->imageHandle;
|
||||
return imagefilledellipse($handle,
|
||||
$x,
|
||||
$this->TxGDYToSLY($y, $handle),
|
||||
$diameter,
|
||||
$diameter,
|
||||
$colorHandle);
|
||||
}
|
||||
}
|
||||
|
||||
function DrawText($string, $x, $y, $color, $font = FONT_1, $handle = false) {
|
||||
$this->Debug("Sparkline :: DrawText('$string', $x, $y, '$color', $font)", DEBUG_DRAW);
|
||||
|
||||
if (!$this->IsError() &&
|
||||
$colorHandle = $this->GetColorHandle($color)) {
|
||||
// adjust for font height so x,y corresponds to bottom left of font
|
||||
//
|
||||
if ($handle === false) $handle = $this->imageHandle;
|
||||
return imagestring($handle,
|
||||
$font,
|
||||
$x,
|
||||
$this->TxGDYToSLY($y + imagefontheight($font), $handle),
|
||||
$string,
|
||||
$colorHandle);
|
||||
}
|
||||
}
|
||||
|
||||
function DrawTextRelative($string, $x, $y, $color, $position, $padding = 2, $font = FONT_1, $handle = false) {
|
||||
$this->Debug("Sparkline :: DrawTextRelative('$string', $x, $y, '$color', $position, $font, $padding)", DEBUG_DRAW);
|
||||
|
||||
if (!empty($string) && !$this->IsError() &&
|
||||
$colorHandle = $this->GetColorHandle($color)) {
|
||||
if ($handle === false) $handle = $this->imageHandle;
|
||||
|
||||
// rendered text width, height
|
||||
//
|
||||
$textHeight = imagefontheight($font);
|
||||
$textWidth = imagefontwidth($font) * strlen($string);
|
||||
|
||||
// set (pxX, pxY) based on position and point
|
||||
//
|
||||
switch($position) {
|
||||
case TEXT_TOP:
|
||||
$x = $x - round($textWidth / 2);
|
||||
$y = $y + $padding;
|
||||
break;
|
||||
|
||||
case TEXT_RIGHT:
|
||||
$x = $x + $padding;
|
||||
$y = $y - round($textHeight / 2);
|
||||
break;
|
||||
|
||||
case TEXT_BOTTOM:
|
||||
$x = $x - round($textWidth / 2);
|
||||
$y = $y - $padding - $textHeight;
|
||||
break;
|
||||
|
||||
case TEXT_LEFT:
|
||||
default:
|
||||
$x = $x - $padding - $textWidth;
|
||||
$y = $y - round($textHeight / 2);
|
||||
break;
|
||||
}
|
||||
|
||||
// truncate bounds based on string size in pixels, image bounds
|
||||
// order: TRBL
|
||||
//
|
||||
$y = min($y, $this->GetImageHeight() - $textHeight);
|
||||
$x = min($x, $this->GetImageWidth() - $textWidth);
|
||||
$y = max($y, 0);
|
||||
$x = max($x, 0);
|
||||
|
||||
return $this->DrawText($string,
|
||||
$x,
|
||||
$y,
|
||||
$color,
|
||||
$font,
|
||||
$handle);
|
||||
}
|
||||
}
|
||||
|
||||
function DrawImageCopyResampled($dhandle, $shandle, $dx, $dy, $sx, $sy, $dw, $dh, $sw, $sh) {
|
||||
$this->Debug("Sparkline :: DrawImageCopyResampled($dhhandle, $shandle, $dx, $dy, $sx, $sy, $dw, $dh, $sw, $sh)", DEBUG_DRAW);
|
||||
if (!$this->IsError()) {
|
||||
return imagecopyresampled($dhandle, // dest handle
|
||||
$shandle, // src handle
|
||||
$dx, $dy, // dest x, y
|
||||
$sx, $sy, // src x, y
|
||||
$dw, $dh, // dest w, h
|
||||
$sw, $sh); // src w, h
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// coordinate system functions
|
||||
// world coordinates are referenced as points or pt
|
||||
// graph coordinates are referenced as pixels or px
|
||||
// sparkline inverts GD Y pixel coordinates; the bottom left of the
|
||||
// image rendering area is px(0,0)
|
||||
// all coordinate transformation functions are prefixed with Tx
|
||||
// all coordinate transformation functions depend on a valid image handle
|
||||
// and will only return valid results after all Set* calls are performed
|
||||
//
|
||||
function TxGDYToSLY($gdY, $handle) {
|
||||
return imagesy($handle) - 1 - $gdY;
|
||||
}
|
||||
|
||||
function TxPxToPt($pxX, $pxY, $handle) {
|
||||
// TODO; must occur after data series conversion
|
||||
}
|
||||
|
||||
function TxPtToPx($ptX, $ptY, $handle) {
|
||||
// TODO; must occur after data series conversion
|
||||
}
|
||||
|
||||
function GetGraphWidth() {
|
||||
return $this->graphAreaPx[1][0] - $this->graphAreaPx[0][0];
|
||||
}
|
||||
|
||||
function GetGraphHeight() {
|
||||
return $this->graphAreaPx[1][1] - $this->graphAreaPx[0][1];
|
||||
}
|
||||
|
||||
function GetImageWidth() {
|
||||
return $this->imageX;
|
||||
}
|
||||
|
||||
function GetImageHeight() {
|
||||
return $this->imageY;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// image output
|
||||
//
|
||||
function Output($file = '') {
|
||||
$this->Debug("Sparkline :: Output($file)", DEBUG_CALLS);
|
||||
|
||||
if ($this->IsError()) {
|
||||
$colorError = imagecolorallocate($this->imageHandle, 0xFF, 0x00, 0x00);
|
||||
imagestring($this->imageHandle,
|
||||
1,
|
||||
($this->imageX / 2) - (5 * imagefontwidth(1) / 2),
|
||||
($this->imageY / 2) - (imagefontheight(1) / 2),
|
||||
"ERROR",
|
||||
$colorError);
|
||||
}
|
||||
|
||||
if ($file == '') {
|
||||
header('Content-type: image/png');
|
||||
imagepng($this->imageHandle);
|
||||
} else {
|
||||
imagepng($this->imageHandle, $file);
|
||||
}
|
||||
|
||||
$this->Debug('Sparkline :: Output - total execution time: ' . round($this->microTimer() - $this->startTime, 4) . ' seconds', DEBUG_STATS);
|
||||
}
|
||||
|
||||
function OutputToFile($file) {
|
||||
$this->Output($file);
|
||||
}
|
||||
|
||||
function OutputToDataURI() {
|
||||
ob_start(null, 4096);
|
||||
$this->Output();
|
||||
return "data:image/png;base64,".base64_encode(ob_get_clean());
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
196
www/analytics/libs/sparkline/lib/Sparkline_Bar.php
Normal file
196
www/analytics/libs/sparkline/lib/Sparkline_Bar.php
Normal file
|
|
@ -0,0 +1,196 @@
|
|||
<?php
|
||||
/*
|
||||
* Sparkline PHP Graphing Library
|
||||
* Copyright 2004 James Byers <jbyers@gmail.com>
|
||||
* http://sparkline.org
|
||||
*
|
||||
* Dual-licensed under the BSD (LICENSE-BSD.txt) and GPL (LICENSE-GPL.txt)
|
||||
* licenses.
|
||||
*
|
||||
* $Id: Sparkline_Bar.php,v 1.3 2008/03/11 19:12:49 jbyers Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
require_once dirname(__FILE__).'/Sparkline.php';
|
||||
|
||||
class Sparkline_Bar extends Sparkline {
|
||||
|
||||
var $dataSeries;
|
||||
var $dataSeriesStats;
|
||||
var $dataSeriesConverted;
|
||||
var $yMin;
|
||||
var $yMax;
|
||||
var $barWidth;
|
||||
var $barSpacing;
|
||||
var $barColorDefault;
|
||||
var $barColorUnderscoreDefault;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// constructor
|
||||
//
|
||||
function Sparkline_Bar($catch_errors = true) {
|
||||
parent::Sparkline($catch_errors);
|
||||
|
||||
$this->dataSeries = array();
|
||||
$this->dataSeriesStats = array();
|
||||
$this->dataSeriesConverted = array();
|
||||
$this->barWidth = 1;
|
||||
$this->barSpacing = 1;
|
||||
$this->barColorDefault = 'black';
|
||||
$this->barColorUnderscoreDefault = 'black';
|
||||
} // function Sparkline
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// color, image property setting
|
||||
//
|
||||
function SetBarWidth($value) {
|
||||
$this->Debug("Sparkline_Bar :: SetBarWidth($value)", DEBUG_SET);
|
||||
$this->barWidth = $value;
|
||||
} // function SetBarWidth
|
||||
|
||||
function SetBarSpacing($value) {
|
||||
$this->Debug("Sparkline_Bar :: SetBarSpacing($value)", DEBUG_SET);
|
||||
$this->barSpacing = $value;
|
||||
} // function SetBarSpacing
|
||||
|
||||
function SetBarColorDefault($value) {
|
||||
$this->Debug("Sparkline_Bar :: SetBarColorDefault($value)", DEBUG_SET);
|
||||
$this->barColorDefault = $value;
|
||||
} // function SetBarColorDefault
|
||||
|
||||
function SetBarColorUnderscoreDefault($value) {
|
||||
$this->Debug("Sparkline_Bar :: SetBarColorUnderscoreDefault($value)", DEBUG_SET);
|
||||
$this->barColorUnderscoreDefault = $value;
|
||||
} // function SetBarColorUnderscoreDefault
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// data setting
|
||||
//
|
||||
function SetData($x, $y, $color = null, $underscore = false, $series = 1) {
|
||||
if(!is_numeric($x)) {
|
||||
$x = trim($x);
|
||||
}
|
||||
if(!is_numeric($y)) {
|
||||
$y = trim($y);
|
||||
}
|
||||
|
||||
$this->Debug("Sparkline_Bar :: SetData($x, $y, $series)", DEBUG_SET);
|
||||
|
||||
if (!is_numeric($x) ||
|
||||
!is_numeric($y)) {
|
||||
$this->Debug("Sparkline_Bar :: SetData rejected values($x, $y) in series $series", DEBUG_WARNING);
|
||||
return false;
|
||||
} // if
|
||||
|
||||
if ($color == null) {
|
||||
$color = $this->barColorDefault;
|
||||
}
|
||||
|
||||
$this->dataSeries[$series][$x] = array('value' => $y,
|
||||
'color' => $color,
|
||||
'underscore' => $underscore);
|
||||
|
||||
if (!isset($this->dataSeriesStats[$series]['min']) ||
|
||||
$y < $this->dataSeriesStats[$series]['min']) {
|
||||
$this->dataSeriesStats[$series]['min'] = $y;
|
||||
}
|
||||
|
||||
if (!isset($this->dataSeriesStats[$series]['max']) ||
|
||||
abs($y) > $this->dataSeriesStats[$series]['max']) {
|
||||
$this->dataSeriesStats[$series]['max'] = abs($y);
|
||||
}
|
||||
} // function SetData
|
||||
|
||||
function SetYMin($value) {
|
||||
$this->Debug("Sparkline_Bar :: SetYMin($value)", DEBUG_SET);
|
||||
$this->yMin = $value;
|
||||
}
|
||||
|
||||
function SetYMax($value) {
|
||||
$this->Debug("Sparkline_Bar :: SetYMax($value)", DEBUG_SET);
|
||||
$this->yMax = $value;
|
||||
}
|
||||
|
||||
function ConvertDataSeries($series, $xBound, $yBound) {
|
||||
$this->Debug("Sparkline_Bar :: ConvertDataSeries($series, $xBound, $yBound)", DEBUG_CALLS);
|
||||
|
||||
if (!isset($this->yMin)) {
|
||||
$this->yMin = $this->dataSeriesStats[$series]['min'];
|
||||
}
|
||||
|
||||
if (!isset($this->yMax)) {
|
||||
$this->yMax = $this->dataSeriesStats[$series]['max'];
|
||||
}
|
||||
|
||||
while (list(, $v) = each($this->dataSeries[$series])) {
|
||||
$y = floor($v['value'] * ($yBound / (abs($this->yMax) + abs($this->yMin))));
|
||||
$this->dataSeriesConverted[$series][] = array('value' => $y,
|
||||
'color' => $v['color'],
|
||||
'underscore' => $v['underscore']);
|
||||
|
||||
if (!isset($this->dataSeriesStats[$series]['min_converted']) ||
|
||||
$y < $this->dataSeriesStats[$series]['min_converted']) {
|
||||
$this->dataSeriesStats[$series]['min_converted'] = $y;
|
||||
}
|
||||
|
||||
if (!isset($this->dataSeriesStats[$series]['max_converted']) ||
|
||||
abs($y) > $this->dataSeriesStats[$series]['max_converted']) {
|
||||
$this->dataSeriesStats[$series]['max_converted'] = abs($y);
|
||||
}
|
||||
}
|
||||
reset($this->dataSeries[$series]);
|
||||
|
||||
} // function ConvertDataSeries
|
||||
|
||||
function CalculateImageWidth() {
|
||||
$this->Debug("Sparkline_Bar :: CalculateImageWidth()", DEBUG_CALLS);
|
||||
|
||||
$count = sizeof($this->dataSeries[1]);
|
||||
return (($count - 1) * $this->barSpacing) + ($count * $this->barWidth);
|
||||
} // function CalculateImageWidth
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// rendering
|
||||
//
|
||||
function Render($y) {
|
||||
$this->Debug("Sparkline_Bar :: Render($y)", DEBUG_CALLS);
|
||||
|
||||
// calculate size based on sets for init
|
||||
//
|
||||
if (!parent::Init($this->CalculateImageWidth(), $y)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// convert based on actual canvas size
|
||||
//
|
||||
$this->ConvertDataSeries(1, $this->GetGraphWidth(), $this->GetGraphHeight());
|
||||
|
||||
// stats debugging
|
||||
//
|
||||
$this->Debug('Sparkline_Bar :: Draw' .
|
||||
' series: 1 min: ' . $this->dataSeriesStats[1]['min'] .
|
||||
' max: ' . $this->dataSeriesStats[1]['max'] .
|
||||
' height: ' . $this->GetGraphHeight() .
|
||||
' yfactor: ' . ($this->GetGraphHeight() / (abs($this->dataSeriesStats[1]['max']) + abs($this->dataSeriesStats[1]['min']))));
|
||||
|
||||
$this->DrawBackground();
|
||||
|
||||
$yAxis = abs(min($this->dataSeriesStats[1]['min_converted'], 0));
|
||||
for ($i = 0; $i < sizeof($this->dataSeriesConverted[1]); $i++) {
|
||||
$this->DrawRectangleFilled($i * ($this->barWidth + $this->barSpacing),
|
||||
$yAxis,
|
||||
$i * ($this->barWidth + $this->barSpacing) + $this->barWidth - 1,
|
||||
$yAxis + $this->dataSeriesConverted[1][$i]['value'],
|
||||
$this->dataSeriesConverted[1][$i]['color']);
|
||||
if ($this->dataSeriesConverted[1][$i]['underscore']) {
|
||||
$this->DrawLine(max(0, $i * ($this->barWidth + $this->barSpacing) - ($this->barSpacing / 2)),
|
||||
$yAxis,
|
||||
min($this->GetGraphWidth(), $i * ($this->barWidth + $this->barSpacing) + ($this->barSpacing / 2)),
|
||||
$yAxis,
|
||||
$this->barColorUnderscoreDefault);
|
||||
}
|
||||
}
|
||||
} // function Render
|
||||
} // class Sparkline_Bar
|
||||
|
||||
?>
|
||||
286
www/analytics/libs/sparkline/lib/Sparkline_Line.php
Normal file
286
www/analytics/libs/sparkline/lib/Sparkline_Line.php
Normal file
|
|
@ -0,0 +1,286 @@
|
|||
<?php
|
||||
/*
|
||||
* Sparkline PHP Graphing Library
|
||||
* Copyright 2004 James Byers <jbyers@gmail.com>
|
||||
* http://sparkline.org
|
||||
*
|
||||
* Dual-licensed under the BSD (LICENSE-BSD.txt) and GPL (LICENSE-GPL.txt)
|
||||
* licenses.
|
||||
*
|
||||
* $Id: Sparkline_Line.php,v 1.10 2008/03/11 19:12:49 jbyers Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
require_once dirname(__FILE__).'/Sparkline.php';
|
||||
|
||||
class Sparkline_Line extends Sparkline {
|
||||
|
||||
var $dataSeries;
|
||||
var $dataSeriesStats;
|
||||
var $dataSeriesConverted;
|
||||
var $yMin;
|
||||
var $yMax;
|
||||
var $featurePoint;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// constructor
|
||||
//
|
||||
function Sparkline_Line($catch_errors = true) {
|
||||
parent::Sparkline($catch_errors);
|
||||
|
||||
$this->dataSeries = array();
|
||||
$this->dataSeriesStats = array();
|
||||
$this->dataSeriesConverted = array();
|
||||
$this->colorBackground = 'backgroundColor';
|
||||
$this->featurePoint = array();
|
||||
} // function Sparkline
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// data setting
|
||||
//
|
||||
function SetData($x, $y, $series = 1) {
|
||||
if(!is_numeric($x)) {
|
||||
$x = trim($x);
|
||||
}
|
||||
if(!is_numeric($y)) {
|
||||
$y = trim($y);
|
||||
}
|
||||
|
||||
$this->Debug("Sparkline_Line :: SetData($x, $y, $series)", DEBUG_SET);
|
||||
|
||||
if (!is_numeric($x) ||
|
||||
!is_numeric($y)) {
|
||||
$this->Debug("Sparkline_Line :: SetData rejected values($x, $y) in series $series", DEBUG_WARNING);
|
||||
return false;
|
||||
} // if
|
||||
|
||||
$this->dataSeries[$series][$x] = $y;
|
||||
|
||||
if (!isset($this->dataSeriesStats[$series]['yMin']) ||
|
||||
$y < $this->dataSeriesStats[$series]['yMin']) {
|
||||
$this->dataSeriesStats[$series]['yMin'] = $y;
|
||||
}
|
||||
|
||||
if (!isset($this->dataSeriesStats[$series]['xMin']) ||
|
||||
$x < $this->dataSeriesStats[$series]['xMin']) {
|
||||
$this->dataSeriesStats[$series]['xMin'] = $x;
|
||||
}
|
||||
|
||||
if (!isset($this->dataSeriesStats[$series]['yMax']) ||
|
||||
$y > $this->dataSeriesStats[$series]['yMax']) {
|
||||
$this->dataSeriesStats[$series]['yMax'] = $y;
|
||||
}
|
||||
|
||||
if (!isset($this->dataSeriesStats[$series]['xMax']) ||
|
||||
$x > $this->dataSeriesStats[$series]['xMax']) {
|
||||
$this->dataSeriesStats[$series]['xMax'] = $x;
|
||||
}
|
||||
} // function SetData
|
||||
|
||||
function SetYMin($value) {
|
||||
$this->Debug("Sparkline_Line :: SetYMin($value)", DEBUG_SET);
|
||||
$this->yMin = $value;
|
||||
} // function SetYMin
|
||||
|
||||
function SetYMax($value) {
|
||||
$this->Debug("Sparkline_Line :: SetYMax($value)", DEBUG_SET);
|
||||
$this->yMax = $value;
|
||||
} // function SetYMin
|
||||
|
||||
function ConvertDataSeries($series, $xBound, $yBound) {
|
||||
$this->Debug("Sparkline_Line :: ConvertDataSeries($series, $xBound, $yBound)", DEBUG_CALLS);
|
||||
|
||||
if (!isset($this->yMin)) {
|
||||
$this->yMin = $this->dataSeriesStats[$series]['yMin'];
|
||||
}
|
||||
|
||||
if (!isset($this->xMin)) {
|
||||
$this->xMin = $this->dataSeriesStats[$series]['XMin'];
|
||||
}
|
||||
|
||||
if (!isset($this->yMax)) {
|
||||
$this->yMax = $this->dataSeriesStats[$series]['yMax'];
|
||||
}
|
||||
|
||||
if (!isset($this->xMax)) {
|
||||
$this->xMax = $this->dataSeriesStats[$series]['xMax'];
|
||||
}
|
||||
|
||||
$this->yRange = $this->yMax + ($this->yMin * -1);
|
||||
|
||||
for ($i = 0; $i < sizeof($this->dataSeries[$series]); $i++) {
|
||||
$y = round(($this->dataSeries[$series][$i] + ($this->yMin * -1)) * (($yBound-1) / $this->yRange));
|
||||
$x = round($i * $xBound / (sizeof($this->dataSeries[$series])));
|
||||
$this->dataSeriesConverted[$series][] = array($x, $y);
|
||||
$this->Debug("Sparkline :: ConvertDataSeries series $series value $i ($x, $y)", DEBUG_SET);
|
||||
}
|
||||
} // function ConvertDataSeries
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// features
|
||||
//
|
||||
function SetFeaturePoint($x, $y, $color, $diameter, $text = '', $position = TEXT_TOP, $font = FONT_1) {
|
||||
$this->Debug("Sparkline_Line :: SetFeaturePoint($x, $y, '$color', $diameter, '$text')", DEBUG_CALLS);
|
||||
|
||||
$this->featurePoint[] = array('ptX' => $x,
|
||||
'ptY' => $y,
|
||||
'color' => $color,
|
||||
'diameter' => $diameter,
|
||||
'text' => $text,
|
||||
'textpos' => $position,
|
||||
'font' => $font);
|
||||
} // function SetFeaturePoint
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// low quality rendering
|
||||
//
|
||||
function Render($x, $y) {
|
||||
$this->Debug("Sparkline_Line :: Render($x, $y)", DEBUG_CALLS);
|
||||
|
||||
if (!parent::Init($x, $y)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// convert based on graphAreaPx bounds
|
||||
//
|
||||
$this->ConvertDataSeries(1, $this->GetGraphWidth(), $this->GetGraphHeight());
|
||||
|
||||
// stats debugging
|
||||
//
|
||||
$this->Debug('Sparkline_Line :: Draw' .
|
||||
' series: 1 min: ' . $this->dataSeriesStats[1]['yMin'] .
|
||||
' max: ' . $this->dataSeriesStats[1]['yMax'] .
|
||||
' offset: ' . ($this->dataSeriesStats[1]['yMin'] * -1) .
|
||||
' height: ' . $this->GetGraphHeight() + 1 .
|
||||
' yfactor: ' . ($this->GetGraphHeight() / ($this->dataSeriesStats[1]['yMax'] + ($this->dataSeriesStats[1]['yMin'] * -1))));
|
||||
$this->Debug('Sparkline_Line :: Draw' .
|
||||
' drawing area:' .
|
||||
' (' . $this->graphAreaPx[0][0] . ',' . $this->graphAreaPx[0][1] . '), ' .
|
||||
' (' . $this->graphAreaPx[1][0] . ',' . $this->graphAreaPx[1][1] . ')');
|
||||
|
||||
$this->DrawBackground();
|
||||
|
||||
// draw graph
|
||||
//
|
||||
for ($i = 0; $i < sizeof($this->dataSeriesConverted[1]) - 1; $i++) {
|
||||
$this->DrawLine($this->dataSeriesConverted[1][$i][0] + $this->graphAreaPx[0][0],
|
||||
$this->dataSeriesConverted[1][$i][1] + $this->graphAreaPx[0][1],
|
||||
$this->dataSeriesConverted[1][$i+1][0] + $this->graphAreaPx[0][0],
|
||||
$this->dataSeriesConverted[1][$i+1][1] + $this->graphAreaPx[0][1],
|
||||
'lineColor');
|
||||
}
|
||||
|
||||
// draw features
|
||||
//
|
||||
while (list(, $v) = each($this->featurePoint)) {
|
||||
$pxY = round(($v['ptY'] + ($this->yMin * -1)) * ($this->GetGraphHeight() / $this->yRange));
|
||||
$pxX = round($v['ptX'] * $this->GetGraphWidth() / sizeof($this->dataSeries[1]));
|
||||
|
||||
$this->DrawCircleFilled($pxX + $this->graphAreaPx[0][0],
|
||||
$pxY + $this->graphAreaPx[0][1],
|
||||
$v['diameter'],
|
||||
$v['color'],
|
||||
$this->imageHandle);
|
||||
$this->DrawTextRelative($v['text'],
|
||||
$pxX + $this->graphAreaPx[0][0],
|
||||
$pxY + $this->graphAreaPx[0][1],
|
||||
$v['color'],
|
||||
$v['textpos'],
|
||||
round($v['diameter'] / 2),
|
||||
$v['font'],
|
||||
$this->imageHandle);
|
||||
}
|
||||
} // function Render
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// high quality rendering
|
||||
//
|
||||
function RenderResampled($x, $y) {
|
||||
$this->Debug("Sparkline_Line :: RenderResampled($x, $y)", DEBUG_CALLS);
|
||||
|
||||
if (!parent::Init($x, $y)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// draw background on standard image in case of resample blit miss
|
||||
//
|
||||
$this->DrawBackground($this->imageHandle);
|
||||
|
||||
// convert based on virtual canvas: x based on size of dataset, y scaled proportionately
|
||||
// if size of data set is small, default to 4X target canvas size
|
||||
//
|
||||
$xVC = max(sizeof($this->dataSeries[1]), 4 * $x);
|
||||
$yVC = floor($xVC * ($this->GetGraphHeight() / $this->GetGraphWidth()));
|
||||
$this->ConvertDataSeries(1, $xVC, $yVC);
|
||||
|
||||
// stats debugging
|
||||
//
|
||||
$this->Debug('Sparkline_Line :: DrawResampled' .
|
||||
' series: 1 min: ' . $this->dataSeriesStats[1]['yMin'] .
|
||||
' max: ' . $this->dataSeriesStats[1]['yMax'] .
|
||||
' offset: ' . ($this->dataSeriesStats[1]['yMin'] * -1) .
|
||||
' height: ' . $this->GetGraphHeight() .
|
||||
' yfactor: ' . ($this->GetGraphHeight() / ($this->dataSeriesStats[1]['yMax'] + ($this->dataSeriesStats[1]['yMin'] * -1))), DEBUG_STATS);
|
||||
$this->Debug('Sparkline_Line :: DrawResampled' .
|
||||
' drawing area:' .
|
||||
' (' . $this->graphAreaPx[0][0] . ',' . $this->graphAreaPx[0][1] . '), ' .
|
||||
' (' . $this->graphAreaPx[1][0] . ',' . $this->graphAreaPx[1][1] . ')');
|
||||
|
||||
// create virtual image
|
||||
// allocate colors
|
||||
// draw background, graph
|
||||
// resample and blit onto original graph
|
||||
//
|
||||
$imageVCHandle = $this->CreateImageHandle($xVC, $yVC);
|
||||
|
||||
while (list($k, $v) = each($this->colorList)) {
|
||||
$this->SetColorHandle($k, $this->DrawColorAllocate($k, $imageVCHandle));
|
||||
}
|
||||
reset($this->colorList);
|
||||
|
||||
$this->DrawBackground($imageVCHandle);
|
||||
|
||||
for ($i = 0; $i < sizeof($this->dataSeriesConverted[1]) - 1; $i++) {
|
||||
$this->DrawLine($this->dataSeriesConverted[1][$i][0],
|
||||
$this->dataSeriesConverted[1][$i][1],
|
||||
$this->dataSeriesConverted[1][$i+1][0],
|
||||
$this->dataSeriesConverted[1][$i+1][1],
|
||||
'lineColor',
|
||||
$this->GetLineSize(),
|
||||
$imageVCHandle);
|
||||
}
|
||||
|
||||
$this->DrawImageCopyResampled($this->imageHandle,
|
||||
$imageVCHandle,
|
||||
$this->graphAreaPx[0][0], // dest x
|
||||
$this->GetImageHeight() - $this->graphAreaPx[1][1], // dest y
|
||||
0, 0, // src x, y
|
||||
$this->GetGraphWidth(), // dest width
|
||||
$this->GetGraphHeight(), // dest height
|
||||
$xVC, // src width
|
||||
$yVC); // src height
|
||||
|
||||
// draw features
|
||||
//
|
||||
while (list(, $v) = each($this->featurePoint)) {
|
||||
$pxY = round(($v['ptY'] + ($this->yMin * -1)) * ($this->GetGraphHeight() / $this->yRange));
|
||||
$pxX = round($v['ptX'] * $this->GetGraphWidth() / sizeof($this->dataSeries[1]));
|
||||
|
||||
$this->DrawCircleFilled($pxX + $this->graphAreaPx[0][0],
|
||||
$pxY + $this->graphAreaPx[0][1],
|
||||
$v['diameter'],
|
||||
$v['color'],
|
||||
$this->imageHandle);
|
||||
$this->DrawTextRelative($v['text'],
|
||||
$pxX + $this->graphAreaPx[0][0],
|
||||
$pxY + $this->graphAreaPx[0][1],
|
||||
$v['color'],
|
||||
$v['textpos'],
|
||||
round($v['diameter'] / 2),
|
||||
$v['font'],
|
||||
$this->imageHandle);
|
||||
}
|
||||
} // function RenderResampled
|
||||
} // class Sparkline_Line
|
||||
|
||||
?>
|
||||
Loading…
Add table
Add a link
Reference in a new issue