wmglobe: Update to version 1.3.
From https://github.com/d-torrance/dockapps/pull/6
This commit is contained in:
parent
23019d9278
commit
cb7b362149
|
@ -1,4 +1,27 @@
|
||||||
VMGlobe
|
VMGlobe
|
||||||
|
|
||||||
|
1.3 released 12/08/01
|
||||||
|
- solve bug of custom map loading (now all maps are 3 layers RGB)
|
||||||
|
- default -bord is now 2
|
||||||
|
- accept a night map of different size than the day map
|
||||||
|
- new -defnimap option
|
||||||
|
- a few minor changes
|
||||||
|
|
||||||
|
1.2 released 9/04/2000
|
||||||
|
- WindowMaker 0.62 compliancy
|
||||||
|
|
||||||
|
1.1 not released
|
||||||
|
- another floating point exception bug solved (Alpha)
|
||||||
|
- little optimizations and rewriting in rend.c
|
||||||
|
- -sun option
|
||||||
|
- -moon option
|
||||||
|
- -mk marker option
|
||||||
|
|
||||||
|
1.0 released 30/05/99
|
||||||
|
- option -stable : latitude never change of sign
|
||||||
|
- change email to jerome.dumonteil@linuxfr.org
|
||||||
|
- modify a few typo in doc
|
||||||
|
|
||||||
0.5 released 6/02/99
|
0.5 released 6/02/99
|
||||||
- floating point exception bug solved
|
- floating point exception bug solved
|
||||||
- many minor bugs solved (earth displaying, mouse, time management)
|
- many minor bugs solved (earth displaying, mouse, time management)
|
||||||
|
@ -22,14 +45,14 @@ VMGlobe
|
||||||
- shift+left button : change longitude & latitude
|
- shift+left button : change longitude & latitude
|
||||||
- man page
|
- man page
|
||||||
|
|
||||||
0.3.1 released 5/02/99
|
0.3.1 released 5/01/99
|
||||||
- option -austral
|
- option -austral
|
||||||
- solved bug about colors 24 and 32 bit per pixel
|
- solved bug about colors 24 and 32 bit per pixel
|
||||||
|
|
||||||
0.3 released 3/02/99
|
0.3 released 3/01/99
|
||||||
- right button : screen of digital modification of latitude/long.
|
- right button : screen of digital modification of latitude/long.
|
||||||
|
|
||||||
0.2.1 released 3/02/99
|
0.2.1 released 3/01/99
|
||||||
- change & enhance mouse operations (longitude/latitude/zoom)
|
- change & enhance mouse operations (longitude/latitude/zoom)
|
||||||
- minor bugs, CPU optimization
|
- minor bugs, CPU optimization
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
WMGlobe 0.5 - The Whole Earth spinning on you desktop... as a dockable app
|
WMGlobe 1.3 - The Whole Earth spinning on you desktop... as a dockable app
|
||||||
Copyright (C) 1998,99 Jerome Dumonteil <jerome.dumonteil@capway.com>
|
Copyright (C) 1998,99,2000,01 Jerome Dumonteil <jerome.dumonteil@linuxfr.org>
|
||||||
This program is licensed under the terms of the GNU GPL, see below.
|
This program is licensed under the terms of the GNU GPL, see below.
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,7 +10,6 @@ WMGlobe is a WindowMaker dock.app that displays the earth on an icon. It's
|
||||||
an adaptation of XGlobe to WMaker environnement. WMGlobe uses a map which is
|
an adaptation of XGlobe to WMaker environnement. WMGlobe uses a map which is
|
||||||
rendered on a sphere by raytracing. Yes, for a 64x64 pixel result :-)
|
rendered on a sphere by raytracing. Yes, for a 64x64 pixel result :-)
|
||||||
|
|
||||||
It's still a beta version...
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,10 +18,10 @@ Installation
|
||||||
You need WindowMaker to build WMGlobe. WMGlobe needs libwraster to compile,
|
You need WindowMaker to build WMGlobe. WMGlobe needs libwraster to compile,
|
||||||
this lib is built by WindowMaker. No more need at run time if statically
|
this lib is built by WindowMaker. No more need at run time if statically
|
||||||
linked, but then, you need WindowMaker to get the full magic :-)
|
linked, but then, you need WindowMaker to get the full magic :-)
|
||||||
|
Warning : this version won't work with WindowMaker < 0.62
|
||||||
|
|
||||||
|
tar -xvzf wmglobe-1.3.tar.gz
|
||||||
tar -xvzf wmglobe-0.5.tar.gz
|
cd wmglobe-1.3
|
||||||
cd wmglobe-0.5
|
|
||||||
make
|
make
|
||||||
|
|
||||||
then move wmglobe in /usr/local/bin and man page somewhere or do
|
then move wmglobe in /usr/local/bin and man page somewhere or do
|
||||||
|
@ -34,20 +33,23 @@ If it doesn't work, look for the graphic libraries.
|
||||||
|
|
||||||
The Makefile is quite crude...
|
The Makefile is quite crude...
|
||||||
|
|
||||||
WMGlobe is developped on Linux (WMaker 0.51.0 and linux 2.0.36/ix86).
|
WMGlobe is developped on Linux (WMaker 0.65.1 and linux 2.4.x/ix86).
|
||||||
If you are successful on other platforms, please tell me so.
|
If you are successful on other platforms, please tell me so.
|
||||||
|
|
||||||
|
|
||||||
platforms with successfull built reported :
|
platforms with successfull built reported (wmglobe 1.0 for older WMaker):
|
||||||
|
|
||||||
NetBSD 1.3.2 / SPARC (wmaker 0.20.3) , with Makefile adaptations for libs
|
NetBSD 1.3.2 / SPARC (wmaker 0.20.3) , with Makefile adaptations for libs
|
||||||
Linux 2.0.36 / RedHat 5.1
|
Linux 2.0.36 / RedHat 5.1
|
||||||
Linux 2.0.36 / SuSE 5.3 (wmaker 0.20.3) , -lungif -> -lgif
|
Linux 2.0.36 / SuSE 5.3 (wmaker 0.20.3) , -lungif -> -lgif
|
||||||
|
Linux 2.0.36 / RedHat 5.2 (wmaker 0.53)
|
||||||
Linux 2.2.0-pre4 / Debian :-)
|
Linux 2.2.0-pre4 / Debian :-)
|
||||||
FreeBSD-3.0 with -ltiff -> -ltiff34 and -lungif -> -lgif
|
FreeBSD-3.0 with -ltiff -> -ltiff34 and -lungif -> -lgif
|
||||||
Solaris 2.6 / Sun Sparc (wmaker 0.20.3) , with Makefile adaptations for libs
|
Solaris 2.6 / Sun Sparc (wmaker 0.20.3) , with Makefile adaptations for libs
|
||||||
AIX 4.2.1 / IBM RS/6000-250 (wmaker 0.50.2)
|
AIX 4.2.1 / IBM RS/6000-250 (wmaker 0.50.2)
|
||||||
|
Linux 2.3.14 / Mandrake (wmaker but also blackbox !)
|
||||||
|
LinuxPPC 1999
|
||||||
|
Linux 2.2.10 / Alpha (wmglobe 1.1+)
|
||||||
|
|
||||||
|
|
||||||
RPM & DEBIAN linux packages coming soon. Or you can directly use the binary.
|
RPM & DEBIAN linux packages coming soon. Or you can directly use the binary.
|
||||||
|
@ -62,10 +64,14 @@ and graphics libs, or install a rpm version of wmglobe.
|
||||||
libwraster :
|
libwraster :
|
||||||
WindowMaker 0.20.3 uses a libwraster.a , so if you use it, you can execute
|
WindowMaker 0.20.3 uses a libwraster.a , so if you use it, you can execute
|
||||||
the binary on a computer without WindowMaker on it, and displaying on a
|
the binary on a computer without WindowMaker on it, and displaying on a
|
||||||
remote computer (this one using WindowMaker). WM 0.51.0 creates a dynamic
|
remote computer (this one using WindowMaker). WM > 0.51.0 creates a dynamic
|
||||||
libwraster.so, so it's necessary to have it on the computer running wmglobe
|
libwraster.so, so it's necessary to have it on the computer running wmglobe
|
||||||
if you buit WMGlobe with this one. Both versions of WMGlobe run on WM 0.20.3
|
if you buit WMGlobe with this one. Both versions of WMGlobe run on WM 0.20.3
|
||||||
and 0.51.0
|
and 0.51.0
|
||||||
|
For wmglobe 1.2+, you need WMaker 0.62 or more recent. And wmglobe 1.0 won't
|
||||||
|
run on these recent versions of WindowMaker. You need to have wraster.h
|
||||||
|
in the include path to compile wmglobe.
|
||||||
|
For wmglobe 1.3+, you probably need WMaker 0.64 or more recent.
|
||||||
|
|
||||||
graphic libs :
|
graphic libs :
|
||||||
you can use libgif or libungif. If your version of WindowMaker is built
|
you can use libgif or libungif. If your version of WindowMaker is built
|
||||||
|
@ -81,12 +87,14 @@ make: *** [wmglobe] Error 1
|
||||||
compile time options :
|
compile time options :
|
||||||
You can modify the file wmgoption.h where many options are set up in defines :
|
You can modify the file wmgoption.h where many options are set up in defines :
|
||||||
|
|
||||||
To disable the builtin default map, just comment out the line in wmgoptions.h :
|
To disable the builtin default map, just comment out the line in wmgoptions.h
|
||||||
#define DEFMAPOK
|
#define DEFMAPOK
|
||||||
to supprim the shift+left/left method of rotate earth, uncomment the lines
|
to remove the shift+left/left method of rotate earth, uncomment the lines
|
||||||
#define MOUSE_LAT_FULL
|
#define MOUSE_LAT_FULL
|
||||||
|
|
||||||
you can also suppress some options screen in wmgoption.h
|
you can also suppress some options screen in wmgoption.h (or even suppress
|
||||||
|
new features of wmglobe 1.2)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -101,8 +109,7 @@ You can get maps usable with WMGlobe on the net. See the LINKS chapter.
|
||||||
using custom maps :
|
using custom maps :
|
||||||
- For the image to be mapped correctly, position 0°North 0°West must be in
|
- For the image to be mapped correctly, position 0°North 0°West must be in
|
||||||
the center of the image and the latitude must be linear from 90°N to 90°S.
|
the center of the image and the latitude must be linear from 90°N to 90°S.
|
||||||
- When using a night map, make sure that day and night map have the same
|
- You can safely use a night map of different size than the day map.
|
||||||
dimensions.
|
|
||||||
|
|
||||||
By the way, you can use maps of Mars, Luna ... and text.
|
By the way, you can use maps of Mars, Luna ... and text.
|
||||||
|
|
||||||
|
@ -123,11 +130,16 @@ Configuration is done through command line options.
|
||||||
the sun rotation. Accepted values in the form
|
the sun rotation. Accepted values in the form
|
||||||
45°12'36 or 45.21 or 45:12:36
|
45°12'36 or 45.21 or 45:12:36
|
||||||
Default : the initial position is "under" the sun, and
|
Default : the initial position is "under" the sun, and
|
||||||
the point of view follows the sun
|
the point of view follows the sun.
|
||||||
|
|
||||||
|
-sun The point of view follows the Sun (default).
|
||||||
|
|
||||||
|
-moon The point of view follows the Moon (i.e. you see the
|
||||||
|
Earth as you were on the Moon).
|
||||||
|
|
||||||
-rand New random position at every refresh of screen
|
-rand New random position at every refresh of screen
|
||||||
|
|
||||||
-map map_file Map used for the rendering. Can be JPEG, GIG, XPM
|
-map map_file Map used for the rendering. Can be JPEG, GIF, XPM
|
||||||
PNM, TIFF but none BMP
|
PNM, TIFF but none BMP
|
||||||
Default : use internal map of earth.
|
Default : use internal map of earth.
|
||||||
|
|
||||||
|
@ -135,8 +147,8 @@ Configuration is done through command line options.
|
||||||
the same width x height as the day side map.
|
the same width x height as the day side map.
|
||||||
Default : if the default internal day map is used, use
|
Default : if the default internal day map is used, use
|
||||||
a default internal night file (see -nonimap option).
|
a default internal night file (see -nonimap option).
|
||||||
If a custom day map is provided, and no night map, the
|
|
||||||
dark side is computed via the -light option.
|
-defnimap Use the default night map (with a custom map).
|
||||||
|
|
||||||
-nonimap Don't use the default night map.
|
-nonimap Don't use the default night map.
|
||||||
|
|
||||||
|
@ -183,11 +195,19 @@ Configuration is done through command line options.
|
||||||
Negative values for dates before 1970 accepted.
|
Negative values for dates before 1970 accepted.
|
||||||
Default : not set, use current time.
|
Default : not set, use current time.
|
||||||
|
|
||||||
|
-mk latitude long. Put a fixed marker at latitude/longitude.
|
||||||
|
-mk sun : put a marker under the Sun position.
|
||||||
|
-mk moon : put a marker under the Moon.
|
||||||
|
5 markers can be defined simultaneously, so you can
|
||||||
|
use wmglobe to predict when Moon will meet the Sun :-)
|
||||||
|
|
||||||
-fun dx dy Move the earth image by dx dy pixels in the icon. See
|
-fun dx dy Move the earth image by dx dy pixels in the icon. See
|
||||||
puzzle.sh to understand why.
|
puzzle.sh to understand why.
|
||||||
|
|
||||||
-oz Start in "austral" mode (for "down under" people)
|
-oz Start in "austral" mode (for "down under" people)
|
||||||
|
|
||||||
|
-stable Keep the globe from going over the poles.
|
||||||
|
|
||||||
-d display Select another display
|
-d display Select another display
|
||||||
|
|
||||||
-w -shape Useless, since it is set by default (WMaker dockable
|
-w -shape Useless, since it is set by default (WMaker dockable
|
||||||
|
@ -223,10 +243,10 @@ http://www.bensinclair.com/dockapp/
|
||||||
Links : Where to find maps and similar softs
|
Links : Where to find maps and similar softs
|
||||||
--------------------------------------------
|
--------------------------------------------
|
||||||
where to find the sources of wmglobe :
|
where to find the sources of wmglobe :
|
||||||
http://www.capway.com/dumonte1/wm/wmglobe-0.5.tar.gz
|
http://perso.linuxfr.org/jdumont/wmg/wmglobe-1.0.tar.gz
|
||||||
|
|
||||||
the web page of WMGlobe (made by Sylvestre Taburet) :
|
the web page of WMGlobe (made by Sylvestre Taburet) :
|
||||||
http://www.capway.com/dumonte1/wm/wmg.html
|
http://perso.linuxfr.org/jdumont/wmg/
|
||||||
|
|
||||||
|
|
||||||
where to find maps and similar softs :
|
where to find maps and similar softs :
|
||||||
|
@ -272,9 +292,11 @@ interesting. It also has a rather high resolution.
|
||||||
|
|
||||||
Todo
|
Todo
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
|
- add interface module to allow plugins
|
||||||
- test on different platforms, better makefile
|
- test on different platforms, better makefile
|
||||||
- changing map "on the fly", map generator, clouds generator...
|
- changing map "on the fly", map generator, clouds generator...
|
||||||
- must work on every current WindowMaker platform
|
- must work on every current WindowMaker platform (hug...)
|
||||||
|
- rewrite some ugly things in the code
|
||||||
- see how to minimize CPU load
|
- see how to minimize CPU load
|
||||||
- feature : load a local detailed map of some part of the globe when zooming
|
- feature : load a local detailed map of some part of the globe when zooming
|
||||||
(country maps, city maps)
|
(country maps, city maps)
|
||||||
|
@ -284,6 +306,7 @@ Todo
|
||||||
|
|
||||||
Bugs
|
Bugs
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
|
- Wmglobe depends on WindowMaker version
|
||||||
- The Makefile
|
- The Makefile
|
||||||
- if you use the --enable-single-icon compile time option of WindowMaker,
|
- if you use the --enable-single-icon compile time option of WindowMaker,
|
||||||
you can not display more than one WMGlobe.
|
you can not display more than one WMGlobe.
|
||||||
|
@ -291,22 +314,25 @@ Bugs
|
||||||
and that LONG_MAX +1 = LONG_MIN . This happens with high values of -accel
|
and that LONG_MAX +1 = LONG_MIN . This happens with high values of -accel
|
||||||
when the date go over year 2038. The expected result is wmglobe
|
when the date go over year 2038. The expected result is wmglobe
|
||||||
continuing smoothly from 1901.
|
continuing smoothly from 1901.
|
||||||
|
- Using WMGlobe at high speed through a LAN may induce some load on the net.
|
||||||
|
|
||||||
|
|
||||||
License
|
License
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
WMGlobe is Copyright (C) 1998,99 by Jerome Dumonteil and licensed through
|
WMGlobe is Copyright (C) 1998,99,2000,2001 by Jerome Dumonteil and licensed
|
||||||
the GNU General Public License.
|
through the GNU General Public License.
|
||||||
Read the COPYING file for the complete GNU license.
|
Read the COPYING file for the complete GNU license.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Credits
|
Credits
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
Original idea, tests, logos : Sylvestre Taburet <staburet@consort.fr>
|
Original idea, tests, logos : Sylvestre Taburet <Sylvestre.Taburet@free.fr>
|
||||||
|
|
||||||
|
WindowMaker 0.62 fix : Charles G Waldman <cgw@fnal.gov>
|
||||||
|
|
||||||
The code in 'sunpos.cpp' is taken from Xearth by Kirk Lauritz Johnson.
|
The code in 'sunpos.cpp' is taken from Xearth by Kirk Lauritz Johnson.
|
||||||
|
(Actually, it uses now the 1.1 version of Xearth)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* sunpos.c
|
* sunpos.c
|
||||||
|
@ -343,7 +369,7 @@ Raster graphics library by Alfredo K. Kojima, & stuff of Window Maker
|
||||||
Feedback
|
Feedback
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
For your questions, bugs, remarks, please contact our representative on
|
For your questions, bugs, remarks, please contact our representative on
|
||||||
planet Earth : jerome dumonteil <jerome.dumonteil@capway.com>
|
planet Earth : jerome dumonteil <jerome.dumonteil@linuxfr.org>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -8,10 +8,10 @@ else
|
||||||
WMG="nice wmglobe"
|
WMG="nice wmglobe"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
HOP=" -delay 0.1 -pos -25 10 -dlat 0.5 -dlong -5 -zoom 1.8 -accel 240"
|
HOP=" -bord 0 -delay 0.1 -pos -25 10 -dlat 0.5 -dlong -5 -zoom 1.8 -accel 240 -stable"
|
||||||
|
|
||||||
$WMG $HOP -fun 32 32 &
|
$WMG $HOP -fun 32 32 &
|
||||||
$WMG $HOP -fun -32 32 &
|
$WMG $HOP -fun -32 32 &
|
||||||
$WMG $HOP -fun 32 -32 &
|
$WMG $HOP -fun 32 -32 &
|
||||||
$WMG $HOP -fun -32 -32 &
|
$WMG $HOP -fun -32 -32 &
|
||||||
$WMG -map ./wmgmap.gif -delay 0.05 -dlong 25 -pos 0 0 -accel 10000&
|
[ -f wmgmap.jpeg ] && $WMG -nimap ./wmgmap.jpeg -delay 0.05 -dlat 2 -dlong -20 -pos 0 -20 -accel 21600 -zoom 0.85 -dawn 0 -stable &
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* WMGlobe 0.5 - All the Earth on a WMaker Icon
|
/* WMGlobe 1.3 - All the Earth on a WMaker Icon
|
||||||
* mycontext.c - an adaptation of wrlib for use in wmglobe
|
* mycontext.c - an adaptation of wrlib for use in wmglobe
|
||||||
* initial source taken in WindowMaker-0.20.3/wrlib :
|
* initial source taken in WindowMaker-0.20.3/wrlib :
|
||||||
*/
|
*/
|
||||||
|
@ -42,515 +42,530 @@
|
||||||
* #include "wraster.h"
|
* #include "wraster.h"
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static Bool bestContext(Display * dpy, int screen_number, RContext * context);
|
static Bool bestContext(Display * dpy, int screen_number,
|
||||||
|
RContext * context);
|
||||||
|
|
||||||
static RContextAttributes DEFAULT_CONTEXT_ATTRIBS =
|
static RContextAttributes DEFAULT_CONTEXT_ATTRIBS = {
|
||||||
{
|
RC_DefaultVisual, /* flags */
|
||||||
RC_DefaultVisual, /* flags */
|
0, /* render_mode */
|
||||||
0, /* render_mode */
|
3, /* colors_per_channel */
|
||||||
0, /* colors_per_channel */
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0 /* NO use_shared_memory */
|
||||||
0 /* NO use_shared_memory */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static XColor *
|
static XColor *allocatePseudoColor(RContext * ctx)
|
||||||
allocatePseudoColor(RContext * ctx)
|
|
||||||
{
|
{
|
||||||
XColor *colors;
|
XColor *colors;
|
||||||
XColor avcolors[256];
|
XColor avcolors[256];
|
||||||
int avncolors;
|
int avncolors;
|
||||||
int i, ncolors, r, g, b;
|
int i, ncolors, r, g, b;
|
||||||
int retries;
|
int retries;
|
||||||
int cpc = ctx->attribs->colors_per_channel;
|
int cpc = ctx->attribs->colors_per_channel;
|
||||||
|
|
||||||
|
ncolors = cpc * cpc * cpc;
|
||||||
|
|
||||||
|
if (ncolors > (1 << ctx->depth)) {
|
||||||
|
/* reduce colormap size */
|
||||||
|
cpc = ctx->attribs->colors_per_channel =
|
||||||
|
1 << ((int) ctx->depth / 3);
|
||||||
ncolors = cpc * cpc * cpc;
|
ncolors = cpc * cpc * cpc;
|
||||||
|
}
|
||||||
|
assert(cpc >= 2 && ncolors <= (1 << ctx->depth));
|
||||||
|
|
||||||
|
colors = malloc(sizeof(XColor) * ncolors);
|
||||||
|
if (!colors) {
|
||||||
|
RErrorCode = RERR_NOMEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
if ((ctx->attribs->flags & RC_GammaCorrection)
|
||||||
|
&& ctx->attribs->rgamma > 0 && ctx->attribs->ggamma > 0
|
||||||
|
&& ctx->attribs->bgamma > 0) {
|
||||||
|
double rg, gg, bg;
|
||||||
|
double tmp;
|
||||||
|
|
||||||
|
/* do gamma correction */
|
||||||
|
rg = 1.0 / ctx->attribs->rgamma;
|
||||||
|
gg = 1.0 / ctx->attribs->ggamma;
|
||||||
|
bg = 1.0 / ctx->attribs->bgamma;
|
||||||
|
for (r = 0; r < cpc; r++) {
|
||||||
|
for (g = 0; g < cpc; g++) {
|
||||||
|
for (b = 0; b < cpc; b++) {
|
||||||
|
colors[i].red = (r * 0xffff) / (cpc - 1);
|
||||||
|
colors[i].green = (g * 0xffff) / (cpc - 1);
|
||||||
|
colors[i].blue = (b * 0xffff) / (cpc - 1);
|
||||||
|
colors[i].flags = DoRed | DoGreen | DoBlue;
|
||||||
|
|
||||||
|
tmp = (double) colors[i].red / 65536.0;
|
||||||
|
colors[i].red =
|
||||||
|
(unsigned short) (65536.0 * pow(tmp, rg));
|
||||||
|
|
||||||
|
tmp = (double) colors[i].green / 65536.0;
|
||||||
|
colors[i].green =
|
||||||
|
(unsigned short) (65536.0 * pow(tmp, gg));
|
||||||
|
|
||||||
|
tmp = (double) colors[i].blue / 65536.0;
|
||||||
|
colors[i].blue =
|
||||||
|
(unsigned short) (65536.0 * pow(tmp, bg));
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
for (r = 0; r < cpc; r++) {
|
||||||
|
for (g = 0; g < cpc; g++) {
|
||||||
|
for (b = 0; b < cpc; b++) {
|
||||||
|
colors[i].red = (r * 0xffff) / (cpc - 1);
|
||||||
|
colors[i].green = (g * 0xffff) / (cpc - 1);
|
||||||
|
colors[i].blue = (b * 0xffff) / (cpc - 1);
|
||||||
|
colors[i].flags = DoRed | DoGreen | DoBlue;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* try to allocate the colors */
|
||||||
|
for (i = 0; i < ncolors; i++) {
|
||||||
|
if (!XAllocColor(ctx->dpy, ctx->cmap, &(colors[i]))) {
|
||||||
|
colors[i].flags = 0; /* failed */
|
||||||
|
} else {
|
||||||
|
colors[i].flags = DoRed | DoGreen | DoBlue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* try to allocate close values for the colors that couldn't
|
||||||
|
* be allocated before */
|
||||||
|
avncolors = (1 << ctx->depth > 256 ? 256 : 1 << ctx->depth);
|
||||||
|
for (i = 0; i < avncolors; i++)
|
||||||
|
avcolors[i].pixel = i;
|
||||||
|
|
||||||
|
XQueryColors(ctx->dpy, ctx->cmap, avcolors, avncolors);
|
||||||
|
|
||||||
|
for (i = 0; i < ncolors; i++) {
|
||||||
|
if (colors[i].flags == 0) {
|
||||||
|
int j;
|
||||||
|
unsigned long cdiff = 0xffffffff, diff;
|
||||||
|
unsigned long closest = 0;
|
||||||
|
|
||||||
|
retries = 2;
|
||||||
|
|
||||||
|
while (retries--) {
|
||||||
|
/* find closest color */
|
||||||
|
for (j = 0; j < avncolors; j++) {
|
||||||
|
r = (colors[i].red - avcolors[i].red) >> 8;
|
||||||
|
g = (colors[i].green - avcolors[i].green) >> 8;
|
||||||
|
b = (colors[i].blue - avcolors[i].blue) >> 8;
|
||||||
|
diff = r * r + g * g + b * b;
|
||||||
|
if (diff < cdiff) {
|
||||||
|
cdiff = diff;
|
||||||
|
closest = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* allocate closest color found */
|
||||||
|
colors[i].red = avcolors[closest].red;
|
||||||
|
colors[i].green = avcolors[closest].green;
|
||||||
|
colors[i].blue = avcolors[closest].blue;
|
||||||
|
if (XAllocColor(ctx->dpy, ctx->cmap, &colors[i])) {
|
||||||
|
colors[i].flags = DoRed | DoGreen | DoBlue;
|
||||||
|
break; /* succeeded, don't need to retry */
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("close color allocation failed. Retrying...\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return colors;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static XColor *allocateGrayScale(RContext * ctx)
|
||||||
|
{
|
||||||
|
XColor *colors;
|
||||||
|
XColor avcolors[256];
|
||||||
|
int avncolors;
|
||||||
|
int i, ncolors, r, g, b;
|
||||||
|
int retries;
|
||||||
|
int cpc = ctx->attribs->colors_per_channel;
|
||||||
|
|
||||||
|
ncolors = cpc * cpc * cpc;
|
||||||
|
|
||||||
|
if (ctx->vclass == StaticGray) {
|
||||||
|
/* we might as well use all grays */
|
||||||
|
ncolors = 1 << ctx->depth;
|
||||||
|
} else {
|
||||||
if (ncolors > (1 << ctx->depth)) {
|
if (ncolors > (1 << ctx->depth)) {
|
||||||
/* reduce colormap size */
|
/* reduce colormap size */
|
||||||
cpc = ctx->attribs->colors_per_channel = 1 << ((int) ctx->depth / 3);
|
cpc = ctx->attribs->colors_per_channel =
|
||||||
ncolors = cpc * cpc * cpc;
|
1 << ((int) ctx->depth / 3);
|
||||||
|
ncolors = cpc * cpc * cpc;
|
||||||
}
|
}
|
||||||
assert(cpc >= 2 && ncolors <= (1 << ctx->depth));
|
assert(cpc >= 2 && ncolors <= (1 << ctx->depth));
|
||||||
|
}
|
||||||
|
|
||||||
colors = malloc(sizeof(XColor) * ncolors);
|
if (ncolors >= 256 && ctx->vclass == StaticGray) {
|
||||||
if (!colors) {
|
/* don't need dithering for 256 levels of gray in StaticGray visual */
|
||||||
RErrorCode = RERR_NOMEMORY;
|
ctx->attribs->render_mode = RBestMatchRendering;
|
||||||
return NULL;
|
}
|
||||||
}
|
colors = malloc(sizeof(XColor) * ncolors);
|
||||||
i = 0;
|
if (!colors) {
|
||||||
|
RErrorCode = RERR_NOMEMORY;
|
||||||
if ((ctx->attribs->flags & RC_GammaCorrection) && ctx->attribs->rgamma > 0
|
return False;
|
||||||
&& ctx->attribs->ggamma > 0 && ctx->attribs->bgamma > 0) {
|
}
|
||||||
double rg, gg, bg;
|
for (i = 0; i < ncolors; i++) {
|
||||||
double tmp;
|
colors[i].red = (i * 0xffff) / (ncolors - 1);
|
||||||
|
colors[i].green = (i * 0xffff) / (ncolors - 1);
|
||||||
/* do gamma correction */
|
colors[i].blue = (i * 0xffff) / (ncolors - 1);
|
||||||
rg = 1.0 / ctx->attribs->rgamma;
|
colors[i].flags = DoRed | DoGreen | DoBlue;
|
||||||
gg = 1.0 / ctx->attribs->ggamma;
|
}
|
||||||
bg = 1.0 / ctx->attribs->bgamma;
|
/* try to allocate the colors */
|
||||||
for (r = 0; r < cpc; r++) {
|
for (i = 0; i < ncolors; i++) {
|
||||||
for (g = 0; g < cpc; g++) {
|
|
||||||
for (b = 0; b < cpc; b++) {
|
|
||||||
colors[i].red = (r * 0xffff) / (cpc - 1);
|
|
||||||
colors[i].green = (g * 0xffff) / (cpc - 1);
|
|
||||||
colors[i].blue = (b * 0xffff) / (cpc - 1);
|
|
||||||
colors[i].flags = DoRed | DoGreen | DoBlue;
|
|
||||||
|
|
||||||
tmp = (double) colors[i].red / 65536.0;
|
|
||||||
colors[i].red = (unsigned short) (65536.0 * pow(tmp, rg));
|
|
||||||
|
|
||||||
tmp = (double) colors[i].green / 65536.0;
|
|
||||||
colors[i].green = (unsigned short) (65536.0 * pow(tmp, gg));
|
|
||||||
|
|
||||||
tmp = (double) colors[i].blue / 65536.0;
|
|
||||||
colors[i].blue = (unsigned short) (65536.0 * pow(tmp, bg));
|
|
||||||
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
for (r = 0; r < cpc; r++) {
|
|
||||||
for (g = 0; g < cpc; g++) {
|
|
||||||
for (b = 0; b < cpc; b++) {
|
|
||||||
colors[i].red = (r * 0xffff) / (cpc - 1);
|
|
||||||
colors[i].green = (g * 0xffff) / (cpc - 1);
|
|
||||||
colors[i].blue = (b * 0xffff) / (cpc - 1);
|
|
||||||
colors[i].flags = DoRed | DoGreen | DoBlue;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* try to allocate the colors */
|
|
||||||
for (i = 0; i < ncolors; i++) {
|
|
||||||
if (!XAllocColor(ctx->dpy, ctx->cmap, &(colors[i]))) {
|
|
||||||
colors[i].flags = 0; /* failed */
|
|
||||||
} else {
|
|
||||||
colors[i].flags = DoRed | DoGreen | DoBlue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* try to allocate close values for the colors that couldn't
|
|
||||||
* be allocated before */
|
|
||||||
avncolors = (1 << ctx->depth > 256 ? 256 : 1 << ctx->depth);
|
|
||||||
for (i = 0; i < avncolors; i++)
|
|
||||||
avcolors[i].pixel = i;
|
|
||||||
|
|
||||||
XQueryColors(ctx->dpy, ctx->cmap, avcolors, avncolors);
|
|
||||||
|
|
||||||
for (i = 0; i < ncolors; i++) {
|
|
||||||
if (colors[i].flags == 0) {
|
|
||||||
int j;
|
|
||||||
unsigned long cdiff = 0xffffffff, diff;
|
|
||||||
unsigned long closest = 0;
|
|
||||||
|
|
||||||
retries = 2;
|
|
||||||
|
|
||||||
while (retries--) {
|
|
||||||
/* find closest color */
|
|
||||||
for (j = 0; j < avncolors; j++) {
|
|
||||||
r = (colors[i].red - avcolors[i].red) >> 8;
|
|
||||||
g = (colors[i].green - avcolors[i].green) >> 8;
|
|
||||||
b = (colors[i].blue - avcolors[i].blue) >> 8;
|
|
||||||
diff = r * r + g * g + b * b;
|
|
||||||
if (diff < cdiff) {
|
|
||||||
cdiff = diff;
|
|
||||||
closest = j;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* allocate closest color found */
|
|
||||||
colors[i].red = avcolors[closest].red;
|
|
||||||
colors[i].green = avcolors[closest].green;
|
|
||||||
colors[i].blue = avcolors[closest].blue;
|
|
||||||
if (XAllocColor(ctx->dpy, ctx->cmap, &colors[i])) {
|
|
||||||
colors[i].flags = DoRed | DoGreen | DoBlue;
|
|
||||||
break; /* succeeded, don't need to retry */
|
|
||||||
}
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("close color allocation failed. Retrying...\n");
|
printf("trying:%x,%x,%x\n", colors[i].red, colors[i].green,
|
||||||
|
colors[i].blue);
|
||||||
|
#endif
|
||||||
|
if (!XAllocColor(ctx->dpy, ctx->cmap, &(colors[i]))) {
|
||||||
|
colors[i].flags = 0; /* failed */
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("failed:%x,%x,%x\n", colors[i].red, colors[i].green,
|
||||||
|
colors[i].blue);
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
colors[i].flags = DoRed | DoGreen | DoBlue;
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("success:%x,%x,%x\n", colors[i].red, colors[i].green,
|
||||||
|
colors[i].blue);
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return colors;
|
}
|
||||||
|
/* try to allocate close values for the colors that couldn't
|
||||||
|
* be allocated before */
|
||||||
|
avncolors = (1 << ctx->depth > 256 ? 256 : 1 << ctx->depth);
|
||||||
|
for (i = 0; i < avncolors; i++)
|
||||||
|
avcolors[i].pixel = i;
|
||||||
|
|
||||||
|
XQueryColors(ctx->dpy, ctx->cmap, avcolors, avncolors);
|
||||||
|
|
||||||
|
for (i = 0; i < ncolors; i++) {
|
||||||
|
if (colors[i].flags == 0) {
|
||||||
|
int j;
|
||||||
|
unsigned long cdiff = 0xffffffff, diff;
|
||||||
|
unsigned long closest = 0;
|
||||||
|
|
||||||
|
retries = 2;
|
||||||
|
|
||||||
|
while (retries--) {
|
||||||
|
/* find closest color */
|
||||||
|
for (j = 0; j < avncolors; j++) {
|
||||||
|
r = (colors[i].red - avcolors[i].red) >> 8;
|
||||||
|
g = (colors[i].green - avcolors[i].green) >> 8;
|
||||||
|
b = (colors[i].blue - avcolors[i].blue) >> 8;
|
||||||
|
diff = r * r + g * g + b * b;
|
||||||
|
if (diff < cdiff) {
|
||||||
|
cdiff = diff;
|
||||||
|
closest = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* allocate closest color found */
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("best match:%x,%x,%x => %x,%x,%x\n", colors[i].red,
|
||||||
|
colors[i].green, colors[i].blue,
|
||||||
|
avcolors[closest].red, avcolors[closest].green,
|
||||||
|
avcolors[closest].blue);
|
||||||
|
#endif
|
||||||
|
colors[i].red = avcolors[closest].red;
|
||||||
|
colors[i].green = avcolors[closest].green;
|
||||||
|
colors[i].blue = avcolors[closest].blue;
|
||||||
|
if (XAllocColor(ctx->dpy, ctx->cmap, &colors[i])) {
|
||||||
|
colors[i].flags = DoRed | DoGreen | DoBlue;
|
||||||
|
break; /* succeeded, don't need to retry */
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("close color allocation failed. Retrying...\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return colors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static XColor *
|
static char *mygetenv(char *var, int scr)
|
||||||
allocateGrayScale(RContext * ctx)
|
|
||||||
{
|
{
|
||||||
XColor *colors;
|
char *p;
|
||||||
XColor avcolors[256];
|
char varname[64];
|
||||||
int avncolors;
|
|
||||||
int i, ncolors, r, g, b;
|
|
||||||
int retries;
|
|
||||||
int cpc = ctx->attribs->colors_per_channel;
|
|
||||||
|
|
||||||
ncolors = cpc * cpc * cpc;
|
sprintf(varname, "%s%i", var, scr);
|
||||||
|
p = getenv(varname);
|
||||||
if (ctx->vclass == StaticGray) {
|
if (!p) {
|
||||||
/* we might as well use all grays */
|
p = getenv(var);
|
||||||
ncolors = 1 << ctx->depth;
|
}
|
||||||
} else {
|
return p;
|
||||||
if (ncolors > (1 << ctx->depth)) {
|
|
||||||
/* reduce colormap size */
|
|
||||||
cpc = ctx->attribs->colors_per_channel = 1 << ((int) ctx->depth / 3);
|
|
||||||
ncolors = cpc * cpc * cpc;
|
|
||||||
}
|
|
||||||
assert(cpc >= 2 && ncolors <= (1 << ctx->depth));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ncolors >= 256 && ctx->vclass == StaticGray) {
|
|
||||||
/* don't need dithering for 256 levels of gray in StaticGray visual */
|
|
||||||
ctx->attribs->render_mode = RM_MATCH;
|
|
||||||
}
|
|
||||||
colors = malloc(sizeof(XColor) * ncolors);
|
|
||||||
if (!colors) {
|
|
||||||
RErrorCode = RERR_NOMEMORY;
|
|
||||||
return False;
|
|
||||||
}
|
|
||||||
for (i = 0; i < ncolors; i++) {
|
|
||||||
colors[i].red = (i * 0xffff) / (ncolors - 1);
|
|
||||||
colors[i].green = (i * 0xffff) / (ncolors - 1);
|
|
||||||
colors[i].blue = (i * 0xffff) / (ncolors - 1);
|
|
||||||
colors[i].flags = DoRed | DoGreen | DoBlue;
|
|
||||||
}
|
|
||||||
/* try to allocate the colors */
|
|
||||||
for (i = 0; i < ncolors; i++) {
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("trying:%x,%x,%x\n", colors[i].red, colors[i].green, colors[i].blue);
|
|
||||||
#endif
|
|
||||||
if (!XAllocColor(ctx->dpy, ctx->cmap, &(colors[i]))) {
|
|
||||||
colors[i].flags = 0; /* failed */
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("failed:%x,%x,%x\n", colors[i].red, colors[i].green, colors[i].blue);
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
colors[i].flags = DoRed | DoGreen | DoBlue;
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("success:%x,%x,%x\n", colors[i].red, colors[i].green, colors[i].blue);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* try to allocate close values for the colors that couldn't
|
|
||||||
* be allocated before */
|
|
||||||
avncolors = (1 << ctx->depth > 256 ? 256 : 1 << ctx->depth);
|
|
||||||
for (i = 0; i < avncolors; i++)
|
|
||||||
avcolors[i].pixel = i;
|
|
||||||
|
|
||||||
XQueryColors(ctx->dpy, ctx->cmap, avcolors, avncolors);
|
|
||||||
|
|
||||||
for (i = 0; i < ncolors; i++) {
|
|
||||||
if (colors[i].flags == 0) {
|
|
||||||
int j;
|
|
||||||
unsigned long cdiff = 0xffffffff, diff;
|
|
||||||
unsigned long closest = 0;
|
|
||||||
|
|
||||||
retries = 2;
|
|
||||||
|
|
||||||
while (retries--) {
|
|
||||||
/* find closest color */
|
|
||||||
for (j = 0; j < avncolors; j++) {
|
|
||||||
r = (colors[i].red - avcolors[i].red) >> 8;
|
|
||||||
g = (colors[i].green - avcolors[i].green) >> 8;
|
|
||||||
b = (colors[i].blue - avcolors[i].blue) >> 8;
|
|
||||||
diff = r * r + g * g + b * b;
|
|
||||||
if (diff < cdiff) {
|
|
||||||
cdiff = diff;
|
|
||||||
closest = j;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* allocate closest color found */
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("best match:%x,%x,%x => %x,%x,%x\n", colors[i].red, colors[i].green, colors[i].blue, avcolors[closest].red, avcolors[closest].green, avcolors[closest].blue);
|
|
||||||
#endif
|
|
||||||
colors[i].red = avcolors[closest].red;
|
|
||||||
colors[i].green = avcolors[closest].green;
|
|
||||||
colors[i].blue = avcolors[closest].blue;
|
|
||||||
if (XAllocColor(ctx->dpy, ctx->cmap, &colors[i])) {
|
|
||||||
colors[i].flags = DoRed | DoGreen | DoBlue;
|
|
||||||
break; /* succeeded, don't need to retry */
|
|
||||||
}
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("close color allocation failed. Retrying...\n");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return colors;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static char *
|
|
||||||
mygetenv(char *var, int scr)
|
|
||||||
{
|
|
||||||
char *p;
|
|
||||||
char varname[64];
|
|
||||||
|
|
||||||
sprintf(varname, "%s%i", var, scr);
|
|
||||||
p = getenv(varname);
|
|
||||||
if (!p) {
|
|
||||||
p = getenv(var);
|
|
||||||
}
|
|
||||||
return p;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void gatherconfig(RContext * context, int screen_n)
|
static void gatherconfig(RContext * context, int screen_n)
|
||||||
{
|
{
|
||||||
char *ptr;
|
char *ptr;
|
||||||
|
|
||||||
ptr = mygetenv("WRASTER_GAMMA", screen_n);
|
ptr = mygetenv("WRASTER_GAMMA", screen_n);
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
float g1, g2, g3;
|
float g1, g2, g3;
|
||||||
if (sscanf(ptr, "%f/%f/%f", &g1, &g2, &g3) != 3
|
if (sscanf(ptr, "%f/%f/%f", &g1, &g2, &g3) != 3
|
||||||
|| g1 <= 0.0 || g2 <= 0.0 || g3 <= 0.0) {
|
|| g1 <= 0.0 || g2 <= 0.0 || g3 <= 0.0) {
|
||||||
printf("wrlib: invalid value(s) for gamma correction \"%s\"\n",
|
printf("wrlib: invalid value(s) for gamma correction \"%s\"\n",
|
||||||
ptr);
|
ptr);
|
||||||
} else {
|
} else {
|
||||||
context->attribs->flags |= RC_GammaCorrection;
|
context->attribs->flags |= RC_GammaCorrection;
|
||||||
context->attribs->rgamma = g1;
|
context->attribs->rgamma = g1;
|
||||||
context->attribs->ggamma = g2;
|
context->attribs->ggamma = g2;
|
||||||
context->attribs->bgamma = g3;
|
context->attribs->bgamma = g3;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ptr = mygetenv("WRASTER_COLOR_RESOLUTION", screen_n);
|
}
|
||||||
if (ptr) {
|
ptr = mygetenv("WRASTER_COLOR_RESOLUTION", screen_n);
|
||||||
int i;
|
if (ptr) {
|
||||||
if (sscanf(ptr, "%d", &i) != 1 || i < 2 || i > 6) {
|
int i;
|
||||||
printf("wrlib: invalid value for color resolution \"%s\"\n", ptr);
|
if (sscanf(ptr, "%d", &i) != 1 || i < 2 || i > 6) {
|
||||||
} else {
|
printf("wrlib: invalid value for color resolution \"%s\"\n",
|
||||||
context->attribs->flags |= RC_ColorsPerChannel;
|
ptr);
|
||||||
context->attribs->colors_per_channel = i;
|
} else {
|
||||||
}
|
context->attribs->flags |= RC_ColorsPerChannel;
|
||||||
|
context->attribs->colors_per_channel = i;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void getColormap(RContext * context, int screen_number)
|
static void getColormap(RContext * context, int screen_number)
|
||||||
{
|
{
|
||||||
Colormap cmap = None;
|
Colormap cmap = None;
|
||||||
XStandardColormap *cmaps;
|
XStandardColormap *cmaps;
|
||||||
int ncmaps, i;
|
int ncmaps, i;
|
||||||
|
|
||||||
if (XGetRGBColormaps(context->dpy,
|
if (XGetRGBColormaps(context->dpy,
|
||||||
RootWindow(context->dpy, screen_number),
|
RootWindow(context->dpy, screen_number),
|
||||||
&cmaps, &ncmaps, XA_RGB_DEFAULT_MAP)) {
|
&cmaps, &ncmaps, XA_RGB_DEFAULT_MAP)) {
|
||||||
for (i = 0; i < ncmaps; ++i) {
|
for (i = 0; i < ncmaps; ++i) {
|
||||||
if (cmaps[i].visualid == context->visual->visualid) {
|
if (cmaps[i].visualid == context->visual->visualid) {
|
||||||
puts("ACHOU");
|
puts("ACHOU");
|
||||||
cmap = cmaps[i].colormap;
|
cmap = cmaps[i].colormap;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
XFree(cmaps);
|
|
||||||
}
|
}
|
||||||
if (cmap == None) {
|
XFree(cmaps);
|
||||||
XColor color;
|
}
|
||||||
|
if (cmap == None) {
|
||||||
|
XColor color;
|
||||||
|
|
||||||
cmap = XCreateColormap(context->dpy,
|
cmap = XCreateColormap(context->dpy,
|
||||||
RootWindow(context->dpy, screen_number),
|
RootWindow(context->dpy, screen_number),
|
||||||
context->visual, AllocNone);
|
context->visual, AllocNone);
|
||||||
|
|
||||||
color.red = color.green = color.blue = 0;
|
color.red = color.green = color.blue = 0;
|
||||||
XAllocColor(context->dpy, cmap, &color);
|
XAllocColor(context->dpy, cmap, &color);
|
||||||
context->black = color.pixel;
|
context->black = color.pixel;
|
||||||
|
|
||||||
color.red = color.green = color.blue = 0xffff;
|
color.red = color.green = color.blue = 0xffff;
|
||||||
XAllocColor(context->dpy, cmap, &color);
|
XAllocColor(context->dpy, cmap, &color);
|
||||||
context->white = color.pixel;
|
context->white = color.pixel;
|
||||||
|
|
||||||
}
|
}
|
||||||
context->cmap = cmap;
|
context->cmap = cmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int count_offset(unsigned long mask)
|
static int count_offset(unsigned long mask)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
while ((mask & 1) == 0) {
|
while ((mask & 1) == 0) {
|
||||||
i++;
|
i++;
|
||||||
mask = mask >> 1;
|
mask = mask >> 1;
|
||||||
}
|
}
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
RContext *
|
RContext *myRCreateContext(Display * dpy, int screen_number,
|
||||||
myRCreateContext(Display * dpy, int screen_number, RContextAttributes * attribs)
|
RContextAttributes * attribs)
|
||||||
{
|
{
|
||||||
RContext *context;
|
RContext *context;
|
||||||
XGCValues gcv;
|
XGCValues gcv;
|
||||||
|
|
||||||
|
|
||||||
context = malloc(sizeof(RContext));
|
context = malloc(sizeof(RContext));
|
||||||
if (!context) {
|
if (!context) {
|
||||||
RErrorCode = RERR_NOMEMORY;
|
RErrorCode = RERR_NOMEMORY;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
memset(context, 0, sizeof(RContext));
|
||||||
|
|
||||||
|
context->dpy = dpy;
|
||||||
|
|
||||||
|
context->screen_number = screen_number;
|
||||||
|
|
||||||
|
context->attribs = malloc(sizeof(RContextAttributes));
|
||||||
|
if (!context->attribs) {
|
||||||
|
free(context);
|
||||||
|
RErrorCode = RERR_NOMEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (!attribs)
|
||||||
|
*context->attribs = DEFAULT_CONTEXT_ATTRIBS;
|
||||||
|
else
|
||||||
|
*context->attribs = *attribs;
|
||||||
|
|
||||||
|
/* get configuration from environment variables */
|
||||||
|
gatherconfig(context, screen_number);
|
||||||
|
|
||||||
|
if ((context->attribs->flags & RC_VisualID)) {
|
||||||
|
XVisualInfo *vinfo, templ;
|
||||||
|
int nret;
|
||||||
|
|
||||||
|
templ.screen = screen_number;
|
||||||
|
templ.visualid = context->attribs->visualid;
|
||||||
|
vinfo =
|
||||||
|
XGetVisualInfo(context->dpy, VisualIDMask | VisualScreenMask,
|
||||||
|
&templ, &nret);
|
||||||
|
if (!vinfo || nret == 0) {
|
||||||
|
free(context);
|
||||||
|
RErrorCode = RERR_BADVISUALID;
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
memset(context, 0, sizeof(RContext));
|
if (vinfo[0].visual == DefaultVisual(dpy, screen_number)) {
|
||||||
|
context->attribs->flags |= RC_DefaultVisual;
|
||||||
|
} else {
|
||||||
|
XSetWindowAttributes attr;
|
||||||
|
unsigned long mask;
|
||||||
|
|
||||||
context->dpy = dpy;
|
context->visual = vinfo[0].visual;
|
||||||
|
context->depth = vinfo[0].depth;
|
||||||
context->screen_number = screen_number;
|
context->vclass = vinfo[0].class;
|
||||||
|
getColormap(context, screen_number);
|
||||||
context->attribs = malloc(sizeof(RContextAttributes));
|
attr.colormap = context->cmap;
|
||||||
if (!context->attribs) {
|
attr.override_redirect = True;
|
||||||
free(context);
|
attr.border_pixel = 0;
|
||||||
RErrorCode = RERR_NOMEMORY;
|
attr.background_pixel = 0;
|
||||||
return NULL;
|
mask =
|
||||||
|
CWBorderPixel | CWColormap | CWOverrideRedirect |
|
||||||
|
CWBackPixel;
|
||||||
|
context->drawable =
|
||||||
|
XCreateWindow(dpy, RootWindow(dpy, screen_number), 1, 1, 1,
|
||||||
|
1, 0, context->depth, CopyFromParent,
|
||||||
|
context->visual, mask, &attr);
|
||||||
|
/* XSetWindowColormap(dpy, context->drawable, attr.colormap); */
|
||||||
}
|
}
|
||||||
if (!attribs)
|
XFree(vinfo);
|
||||||
*context->attribs = DEFAULT_CONTEXT_ATTRIBS;
|
}
|
||||||
else
|
/* use default */
|
||||||
*context->attribs = *attribs;
|
if (!context->visual) {
|
||||||
|
if ((context->attribs->flags & RC_DefaultVisual)
|
||||||
/* get configuration from environment variables */
|
|| !bestContext(dpy, screen_number, context)) {
|
||||||
gatherconfig(context, screen_number);
|
context->visual = DefaultVisual(dpy, screen_number);
|
||||||
|
context->depth = DefaultDepth(dpy, screen_number);
|
||||||
if ((context->attribs->flags & RC_VisualID)) {
|
context->cmap = DefaultColormap(dpy, screen_number);
|
||||||
XVisualInfo *vinfo, templ;
|
context->drawable = RootWindow(dpy, screen_number);
|
||||||
int nret;
|
context->black = BlackPixel(dpy, screen_number);
|
||||||
|
context->white = WhitePixel(dpy, screen_number);
|
||||||
templ.screen = screen_number;
|
context->vclass = context->visual->class;
|
||||||
templ.visualid = context->attribs->visualid;
|
|
||||||
vinfo = XGetVisualInfo(context->dpy, VisualIDMask | VisualScreenMask,
|
|
||||||
&templ, &nret);
|
|
||||||
if (!vinfo || nret == 0) {
|
|
||||||
free(context);
|
|
||||||
RErrorCode = RERR_BADVISUALID;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (vinfo[0].visual == DefaultVisual(dpy, screen_number)) {
|
|
||||||
context->attribs->flags |= RC_DefaultVisual;
|
|
||||||
} else {
|
|
||||||
XSetWindowAttributes attr;
|
|
||||||
unsigned long mask;
|
|
||||||
|
|
||||||
context->visual = vinfo[0].visual;
|
|
||||||
context->depth = vinfo[0].depth;
|
|
||||||
context->vclass = vinfo[0].class;
|
|
||||||
getColormap(context, screen_number);
|
|
||||||
attr.colormap = context->cmap;
|
|
||||||
attr.override_redirect = True;
|
|
||||||
attr.border_pixel = 0;
|
|
||||||
attr.background_pixel = 0;
|
|
||||||
mask = CWBorderPixel | CWColormap | CWOverrideRedirect | CWBackPixel;
|
|
||||||
context->drawable =
|
|
||||||
XCreateWindow(dpy, RootWindow(dpy, screen_number), 1, 1,
|
|
||||||
1, 1, 0, context->depth, CopyFromParent,
|
|
||||||
context->visual, mask, &attr);
|
|
||||||
/* XSetWindowColormap(dpy, context->drawable, attr.colormap); */
|
|
||||||
}
|
|
||||||
XFree(vinfo);
|
|
||||||
}
|
}
|
||||||
/* use default */
|
}
|
||||||
if (!context->visual) {
|
gcv.function = GXcopy;
|
||||||
if ((context->attribs->flags & RC_DefaultVisual)
|
gcv.graphics_exposures = False;
|
||||||
|| !bestContext(dpy, screen_number, context)) {
|
context->copy_gc = XCreateGC(dpy, context->drawable, GCFunction
|
||||||
context->visual = DefaultVisual(dpy, screen_number);
|
| GCGraphicsExposures, &gcv);
|
||||||
context->depth = DefaultDepth(dpy, screen_number);
|
|
||||||
context->cmap = DefaultColormap(dpy, screen_number);
|
|
||||||
context->drawable = RootWindow(dpy, screen_number);
|
|
||||||
context->black = BlackPixel(dpy, screen_number);
|
|
||||||
context->white = WhitePixel(dpy, screen_number);
|
|
||||||
context->vclass = context->visual->class;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
gcv.function = GXcopy;
|
|
||||||
gcv.graphics_exposures = False;
|
|
||||||
context->copy_gc = XCreateGC(dpy, context->drawable, GCFunction
|
|
||||||
| GCGraphicsExposures, &gcv);
|
|
||||||
|
|
||||||
if (context->vclass == PseudoColor || context->vclass == StaticColor) {
|
if (context->vclass == PseudoColor || context->vclass == StaticColor) {
|
||||||
context->colors = allocatePseudoColor(context);
|
context->colors = allocatePseudoColor(context);
|
||||||
if (!context->colors) {
|
if (!context->colors) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
|
||||||
} else if (context->vclass == GrayScale || context->vclass == StaticGray) {
|
|
||||||
context->colors = allocateGrayScale(context);
|
|
||||||
if (!context->colors) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
} else if (context->vclass == TrueColor) {
|
|
||||||
/* calc offsets to create a TrueColor pixel */
|
|
||||||
context->red_offset = count_offset(context->visual->red_mask);
|
|
||||||
context->green_offset = count_offset(context->visual->green_mask);
|
|
||||||
context->blue_offset = count_offset(context->visual->blue_mask);
|
|
||||||
/* disable dithering on 24 bits visuals */
|
|
||||||
if (context->depth >= 24)
|
|
||||||
context->attribs->render_mode = RM_MATCH;
|
|
||||||
}
|
}
|
||||||
/* check avaiability of MIT-SHM */
|
} else if (context->vclass == GrayScale
|
||||||
|
|| context->vclass == StaticGray) {
|
||||||
|
context->colors = allocateGrayScale(context);
|
||||||
|
if (!context->colors) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
} else if (context->vclass == TrueColor) {
|
||||||
|
/* calc offsets to create a TrueColor pixel */
|
||||||
|
context->red_offset = count_offset(context->visual->red_mask);
|
||||||
|
context->green_offset = count_offset(context->visual->green_mask);
|
||||||
|
context->blue_offset = count_offset(context->visual->blue_mask);
|
||||||
|
/* disable dithering on 24 bits visuals */
|
||||||
|
if (context->depth >= 24)
|
||||||
|
context->attribs->render_mode = RBestMatchRendering;
|
||||||
|
}
|
||||||
|
/* check avaiability of MIT-SHM */
|
||||||
|
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static Bool
|
static Bool
|
||||||
bestContext(Display * dpy, int screen_number, RContext * context)
|
bestContext(Display * dpy, int screen_number, RContext * context)
|
||||||
{
|
{
|
||||||
XVisualInfo *vinfo = NULL, rvinfo;
|
XVisualInfo *vinfo = NULL, rvinfo;
|
||||||
int best = -1, numvis, i;
|
int best = -1, numvis, i;
|
||||||
long flags;
|
long flags;
|
||||||
XSetWindowAttributes attr;
|
XSetWindowAttributes attr;
|
||||||
|
|
||||||
rvinfo.class = TrueColor;
|
rvinfo.class = TrueColor;
|
||||||
rvinfo.screen = screen_number;
|
rvinfo.screen = screen_number;
|
||||||
flags = VisualClassMask | VisualScreenMask;
|
flags = VisualClassMask | VisualScreenMask;
|
||||||
|
|
||||||
vinfo = XGetVisualInfo(dpy, flags, &rvinfo, &numvis);
|
vinfo = XGetVisualInfo(dpy, flags, &rvinfo, &numvis);
|
||||||
if (vinfo) { /* look for a TrueColor, 24-bit or more (pref 24) */
|
if (vinfo) { /* look for a TrueColor, 24-bit or more (pref 24) */
|
||||||
for (i = numvis - 1, best = -1; i >= 0; i--) {
|
for (i = numvis - 1, best = -1; i >= 0; i--) {
|
||||||
if (vinfo[i].depth == 24)
|
if (vinfo[i].depth == 24)
|
||||||
best = i;
|
best = i;
|
||||||
else if (vinfo[i].depth > 24 && best < 0)
|
else if (vinfo[i].depth > 24 && best < 0)
|
||||||
best = i;
|
best = i;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
#if 0
|
#if 0
|
||||||
if (best == -1) { /* look for a DirectColor, 24-bit or more (pref 24) */
|
if (best == -1) { /* look for a DirectColor, 24-bit or more (pref 24) */
|
||||||
rvinfo.class = DirectColor;
|
rvinfo.class = DirectColor;
|
||||||
if (vinfo)
|
|
||||||
XFree((char *) vinfo);
|
|
||||||
vinfo = XGetVisualInfo(dpy, flags, &rvinfo, &numvis);
|
|
||||||
if (vinfo) {
|
|
||||||
for (i = 0, best = -1; i < numvis; i++) {
|
|
||||||
if (vinfo[i].depth == 24)
|
|
||||||
best = i;
|
|
||||||
else if (vinfo[i].depth > 24 && best < 0)
|
|
||||||
best = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (best > -1) {
|
|
||||||
context->visual = vinfo[best].visual;
|
|
||||||
context->depth = vinfo[best].depth;
|
|
||||||
context->vclass = vinfo[best].class;
|
|
||||||
getColormap(context, screen_number);
|
|
||||||
attr.colormap = context->cmap;
|
|
||||||
attr.override_redirect = True;
|
|
||||||
attr.border_pixel = 0;
|
|
||||||
context->drawable =
|
|
||||||
XCreateWindow(dpy, RootWindow(dpy, screen_number),
|
|
||||||
1, 1, 1, 1, 0, context->depth,
|
|
||||||
CopyFromParent, context->visual,
|
|
||||||
CWBorderPixel | CWColormap | CWOverrideRedirect, &attr);
|
|
||||||
/* XSetWindowColormap(dpy, context->drawable, context->cmap); */
|
|
||||||
}
|
|
||||||
if (vinfo)
|
if (vinfo)
|
||||||
XFree((char *) vinfo);
|
XFree((char *) vinfo);
|
||||||
|
vinfo = XGetVisualInfo(dpy, flags, &rvinfo, &numvis);
|
||||||
|
if (vinfo) {
|
||||||
|
for (i = 0, best = -1; i < numvis; i++) {
|
||||||
|
if (vinfo[i].depth == 24)
|
||||||
|
best = i;
|
||||||
|
else if (vinfo[i].depth > 24 && best < 0)
|
||||||
|
best = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (best > -1) {
|
||||||
|
context->visual = vinfo[best].visual;
|
||||||
|
context->depth = vinfo[best].depth;
|
||||||
|
context->vclass = vinfo[best].class;
|
||||||
|
getColormap(context, screen_number);
|
||||||
|
attr.colormap = context->cmap;
|
||||||
|
attr.override_redirect = True;
|
||||||
|
attr.border_pixel = 0;
|
||||||
|
context->drawable =
|
||||||
|
XCreateWindow(dpy, RootWindow(dpy, screen_number),
|
||||||
|
1, 1, 1, 1, 0, context->depth,
|
||||||
|
CopyFromParent, context->visual,
|
||||||
|
CWBorderPixel | CWColormap | CWOverrideRedirect,
|
||||||
|
&attr);
|
||||||
|
/* XSetWindowColormap(dpy, context->drawable, context->cmap); */
|
||||||
|
}
|
||||||
|
if (vinfo)
|
||||||
|
XFree((char *) vinfo);
|
||||||
|
|
||||||
if (best < 0)
|
if (best < 0)
|
||||||
return False;
|
return False;
|
||||||
else
|
else
|
||||||
return True;
|
return True;
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load diff
1454
wmglobe/src/rend.c
1454
wmglobe/src/rend.c
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,6 @@
|
||||||
/* WMGlobe 0.5 - All the Earth on a WMaker Icon
|
/* WMGlobe 1.3 - All the Earth on a WMaker Icon
|
||||||
* copyright (C) 1998,99 Jerome Dumonteil <jerome.dumonteil@capway.com>
|
* copyright (C) 1998,99,2000,01 Jerome Dumonteil <jerome.dumonteil@linuxfr.org>
|
||||||
* sunpos.c is taken from Xearth :
|
* sunpos.c is taken from Xearth 1.0 (and part of 1.1):
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* sunpos.c
|
* sunpos.c
|
||||||
|
@ -62,6 +62,7 @@
|
||||||
#define PI 3.141592653
|
#define PI 3.141592653
|
||||||
#endif
|
#endif
|
||||||
#define TWOPI (2*PI)
|
#define TWOPI (2*PI)
|
||||||
|
#define DegsToRads(x) ((x)*(TWOPI/360))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* the epoch upon which these astronomical calculations are based is
|
* the epoch upon which these astronomical calculations are based is
|
||||||
|
@ -93,8 +94,8 @@
|
||||||
* Eccentricity (eccentricity of orbit) 0.016713
|
* Eccentricity (eccentricity of orbit) 0.016713
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define Epsilon_g (279.403303*(TWOPI/360))
|
#define Epsilon_g (DegsToRads(279.403303))
|
||||||
#define OmegaBar_g (282.768422*(TWOPI/360))
|
#define OmegaBar_g (DegsToRads(282.768422))
|
||||||
#define Eccentricity (0.016713)
|
#define Eccentricity (0.016713)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -102,7 +103,36 @@
|
||||||
* 1990.0 (computed as 23.440592 degrees according to the method given
|
* 1990.0 (computed as 23.440592 degrees according to the method given
|
||||||
* in duffett-smith, section 27)
|
* in duffett-smith, section 27)
|
||||||
*/
|
*/
|
||||||
#define MeanObliquity (23.440592*(TWOPI/360))
|
#define MeanObliquity (DegsToRads(23.440592))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Lunar parameters, epoch January 0, 1990.0 (from Xearth 1.1)
|
||||||
|
*/
|
||||||
|
#define MoonMeanLongitude DegsToRads(318.351648)
|
||||||
|
#define MoonMeanLongitudePerigee DegsToRads( 36.340410)
|
||||||
|
#define MoonMeanLongitudeNode DegsToRads(318.510107)
|
||||||
|
#define MoonInclination DegsToRads( 5.145396)
|
||||||
|
|
||||||
|
#define SideralMonth (27.3217)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Force an angular value into the range [-PI, +PI]
|
||||||
|
*/
|
||||||
|
#define Normalize(x) \
|
||||||
|
do { \
|
||||||
|
if ((x) < -PI) \
|
||||||
|
do (x) += TWOPI; while ((x) < -PI); \
|
||||||
|
else if ((x) > PI) \
|
||||||
|
do (x) -= TWOPI; while ((x) > PI); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
static double solve_keplers_equation(double M);
|
||||||
|
static double mean_sun(double D);
|
||||||
|
static double sun_ecliptic_longitude(time_t ssue);
|
||||||
|
static void ecliptic_to_equatorial(double lambda, double beta,
|
||||||
|
double *alpha, double *delta);
|
||||||
|
static double julian_date(int y, int m, int d);
|
||||||
|
static double GST(time_t ssue);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* solve Kepler's equation via Newton's method
|
* solve Kepler's equation via Newton's method
|
||||||
|
@ -110,20 +140,39 @@
|
||||||
*/
|
*/
|
||||||
static double solve_keplers_equation(double M)
|
static double solve_keplers_equation(double M)
|
||||||
{
|
{
|
||||||
double E;
|
double E;
|
||||||
double delta;
|
double delta;
|
||||||
|
|
||||||
E = M;
|
E = M;
|
||||||
while (1) {
|
while (1) {
|
||||||
delta = E - Eccentricity * sin(E) - M;
|
delta = E - Eccentricity * sin(E) - M;
|
||||||
if (fabs(delta) <= 1e-10)
|
if (fabs(delta) <= 1e-10)
|
||||||
break;
|
break;
|
||||||
E -= delta / (1 - Eccentricity * cos(E));
|
E -= delta / (1 - Eccentricity * cos(E));
|
||||||
}
|
}
|
||||||
|
return E;
|
||||||
return E;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Calculate the position of the mean sun: where the sun would
|
||||||
|
* be if the earth's orbit were circular instead of ellipictal.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static double mean_sun(double D)
|
||||||
|
/* double D; days since ephemeris epoch */
|
||||||
|
{
|
||||||
|
double N, M;
|
||||||
|
|
||||||
|
N = RadsPerDay * D;
|
||||||
|
N = fmod(N, TWOPI);
|
||||||
|
if (N < 0)
|
||||||
|
N += TWOPI;
|
||||||
|
|
||||||
|
M = N + Epsilon_g - OmegaBar_g;
|
||||||
|
if (M < 0)
|
||||||
|
M += TWOPI;
|
||||||
|
return M;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* compute ecliptic longitude of sun (in radians)
|
* compute ecliptic longitude of sun (in radians)
|
||||||
|
@ -132,25 +181,19 @@ static double solve_keplers_equation(double M)
|
||||||
static double sun_ecliptic_longitude(time_t ssue)
|
static double sun_ecliptic_longitude(time_t ssue)
|
||||||
/* seconds since unix epoch */
|
/* seconds since unix epoch */
|
||||||
{
|
{
|
||||||
double D, N;
|
double D, N;
|
||||||
double M_sun, E;
|
double M_sun, E;
|
||||||
double v;
|
double v;
|
||||||
|
|
||||||
D = DaysSinceEpoch(ssue);
|
D = DaysSinceEpoch(ssue);
|
||||||
|
|
||||||
N = RadsPerDay * D;
|
N = RadsPerDay * D;
|
||||||
N = fmod(N, TWOPI);
|
M_sun = mean_sun(D);
|
||||||
if (N < 0)
|
E = solve_keplers_equation(M_sun);
|
||||||
N += TWOPI;
|
v = 2 * atan(sqrt((1 + Eccentricity) / (1 - Eccentricity)) *
|
||||||
|
tan(E / 2));
|
||||||
|
|
||||||
M_sun = N + Epsilon_g - OmegaBar_g;
|
return (v + OmegaBar_g);
|
||||||
if (M_sun < 0)
|
|
||||||
M_sun += TWOPI;
|
|
||||||
|
|
||||||
E = solve_keplers_equation(M_sun);
|
|
||||||
v = 2 * atan(sqrt((1 + Eccentricity) / (1 - Eccentricity)) * tan(E / 2));
|
|
||||||
|
|
||||||
return (v + OmegaBar_g);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -158,7 +201,8 @@ static double sun_ecliptic_longitude(time_t ssue)
|
||||||
* convert from ecliptic to equatorial coordinates
|
* convert from ecliptic to equatorial coordinates
|
||||||
* (after duffett-smith, section 27)
|
* (after duffett-smith, section 27)
|
||||||
*/
|
*/
|
||||||
static void ecliptic_to_equatorial(double lambda, double beta, double *alpha, double *delta)
|
static void ecliptic_to_equatorial(double lambda, double beta,
|
||||||
|
double *alpha, double *delta)
|
||||||
/*
|
/*
|
||||||
* double lambda; ecliptic longitude
|
* double lambda; ecliptic longitude
|
||||||
* double beta; ecliptic latitude
|
* double beta; ecliptic latitude
|
||||||
|
@ -166,13 +210,13 @@ static void ecliptic_to_equatorial(double lambda, double beta, double *alpha, do
|
||||||
* double *delta; (return) declination
|
* double *delta; (return) declination
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
double sin_e, cos_e;
|
double sin_e, cos_e;
|
||||||
|
|
||||||
sin_e = sin(MeanObliquity);
|
sin_e = sin(MeanObliquity);
|
||||||
cos_e = cos(MeanObliquity);
|
cos_e = cos(MeanObliquity);
|
||||||
|
|
||||||
*alpha = atan2(sin(lambda) * cos_e - tan(beta) * sin_e, cos(lambda));
|
*alpha = atan2(sin(lambda) * cos_e - tan(beta) * sin_e, cos(lambda));
|
||||||
*delta = asin(sin(beta) * cos_e + cos(beta) * sin_e * sin(lambda));
|
*delta = asin(sin(beta) * cos_e + cos(beta) * sin_e * sin(lambda));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -188,26 +232,26 @@ static double julian_date(int y, int m, int d)
|
||||||
* int d; day of month
|
* int d; day of month
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
int A, B, C, D;
|
int A, B, C, D;
|
||||||
double JD;
|
double JD;
|
||||||
|
|
||||||
/* lazy test to ensure gregorian calendar */
|
/* lazy test to ensure gregorian calendar */
|
||||||
/*
|
/*
|
||||||
* ASSERT(y >= 1583);
|
* ASSERT(y >= 1583);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if ((m == 1) || (m == 2)) {
|
if ((m == 1) || (m == 2)) {
|
||||||
y -= 1;
|
y -= 1;
|
||||||
m += 12;
|
m += 12;
|
||||||
}
|
}
|
||||||
A = y / 100;
|
A = y / 100;
|
||||||
B = 2 - A + (A / 4);
|
B = 2 - A + (A / 4);
|
||||||
C = (int) (365.25 * y);
|
C = (int) (365.25 * y);
|
||||||
D = (int) (30.6001 * (m + 1));
|
D = (int) (30.6001 * (m + 1));
|
||||||
|
|
||||||
JD = B + C + D + d + 1720994.5;
|
JD = B + C + D + d + 1720994.5;
|
||||||
|
|
||||||
return JD;
|
return JD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -219,30 +263,30 @@ static double julian_date(int y, int m, int d)
|
||||||
static double GST(time_t ssue)
|
static double GST(time_t ssue)
|
||||||
/*time_t ssue; seconds since unix epoch */
|
/*time_t ssue; seconds since unix epoch */
|
||||||
{
|
{
|
||||||
double JD;
|
double JD;
|
||||||
double T, T0;
|
double T, T0;
|
||||||
double UT;
|
double UT;
|
||||||
struct tm *tm;
|
struct tm *tm;
|
||||||
|
|
||||||
tm = gmtime(&ssue);
|
tm = gmtime(&ssue);
|
||||||
|
|
||||||
JD = julian_date(tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday);
|
JD = julian_date(tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday);
|
||||||
T = (JD - 2451545) / 36525;
|
T = (JD - 2451545) / 36525;
|
||||||
|
|
||||||
T0 = ((T + 2.5862e-5) * T + 2400.051336) * T + 6.697374558;
|
T0 = ((T + 2.5862e-5) * T + 2400.051336) * T + 6.697374558;
|
||||||
|
|
||||||
T0 = fmod(T0, 24.0);
|
T0 = fmod(T0, 24.0);
|
||||||
if (T0 < 0)
|
if (T0 < 0)
|
||||||
T0 += 24;
|
T0 += 24;
|
||||||
|
|
||||||
UT = tm->tm_hour + (tm->tm_min + tm->tm_sec / 60.0) / 60.0;
|
UT = tm->tm_hour + (tm->tm_min + tm->tm_sec / 60.0) / 60.0;
|
||||||
|
|
||||||
T0 += UT * 1.002737909;
|
T0 += UT * 1.002737909;
|
||||||
T0 = fmod(T0, 24.0);
|
T0 = fmod(T0, 24.0);
|
||||||
if (T0 < 0)
|
if (T0 < 0)
|
||||||
T0 += 24;
|
T0 += 24;
|
||||||
|
|
||||||
return T0;
|
return T0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -251,28 +295,67 @@ static double GST(time_t ssue)
|
||||||
* epoch), compute position on the earth (lat, lon) such that sun is
|
* epoch), compute position on the earth (lat, lon) such that sun is
|
||||||
* directly overhead.
|
* directly overhead.
|
||||||
*/
|
*/
|
||||||
void GetSunPos(time_t ssue, double *lat, double *lon)
|
void sun_position(time_t ssue, double *lat, double *lon)
|
||||||
/* time_t ssue; seconds since unix epoch */
|
/* time_t ssue; seconds since unix epoch */
|
||||||
/* double *lat; (return) latitude */
|
/* double *lat; (return) latitude in rad */
|
||||||
/* double *lon; (return) longitude */
|
/* double *lon; (return) longitude in rad */
|
||||||
{
|
{
|
||||||
double lambda;
|
double lambda;
|
||||||
double alpha, delta;
|
double alpha, delta;
|
||||||
double tmp;
|
double tmp;
|
||||||
|
|
||||||
lambda = sun_ecliptic_longitude(ssue);
|
lambda = sun_ecliptic_longitude(ssue);
|
||||||
ecliptic_to_equatorial(lambda, 0.0, &alpha, &delta);
|
ecliptic_to_equatorial(lambda, 0.0, &alpha, &delta);
|
||||||
|
|
||||||
tmp = alpha - (TWOPI / 24) * GST(ssue);
|
tmp = alpha - (TWOPI / 24) * GST(ssue);
|
||||||
if (tmp < -PI) {
|
Normalize(tmp);
|
||||||
do
|
*lon = tmp;
|
||||||
tmp += TWOPI;
|
*lat = delta;
|
||||||
while (tmp < -PI);
|
}
|
||||||
} else if (tmp > PI) {
|
|
||||||
do
|
/*
|
||||||
tmp -= TWOPI;
|
* given a particular time (expressed in seconds since the unix
|
||||||
while (tmp < -PI);
|
* epoch), compute position on the earth (lat, lon) such that the
|
||||||
}
|
* moon is directly overhead.
|
||||||
*lon = tmp;
|
*
|
||||||
*lat = delta;
|
* Based on duffett-smith **2nd ed** section 61; combines some steps
|
||||||
|
* into single expressions to reduce the number of extra variables.
|
||||||
|
*/
|
||||||
|
void moon_position(time_t ssue, double *lat, double *lon)
|
||||||
|
/* time_t ssue; seconds since unix epoch */
|
||||||
|
/* double *lat; (return) latitude in ra */
|
||||||
|
/* double *lon; (return) longitude in ra */
|
||||||
|
{
|
||||||
|
double lambda, beta;
|
||||||
|
double D, L, Ms, Mm, N, Ev, Ae, Ec, alpha, delta;
|
||||||
|
|
||||||
|
D = DaysSinceEpoch(ssue);
|
||||||
|
lambda = sun_ecliptic_longitude(ssue);
|
||||||
|
Ms = mean_sun(D);
|
||||||
|
|
||||||
|
L = fmod(D / SideralMonth, 1.0) * TWOPI + MoonMeanLongitude;
|
||||||
|
Normalize(L);
|
||||||
|
Mm = L - DegsToRads(0.1114041 * D) - MoonMeanLongitudePerigee;
|
||||||
|
Normalize(Mm);
|
||||||
|
N = MoonMeanLongitudeNode - DegsToRads(0.0529539 * D);
|
||||||
|
Normalize(N);
|
||||||
|
Ev = DegsToRads(1.2739) * sin(2.0 * (L - lambda) - Mm);
|
||||||
|
Ae = DegsToRads(0.1858) * sin(Ms);
|
||||||
|
Mm += Ev - Ae - DegsToRads(0.37) * sin(Ms);
|
||||||
|
Ec = DegsToRads(6.2886) * sin(Mm);
|
||||||
|
L += Ev + Ec - Ae + DegsToRads(0.214) * sin(2.0 * Mm);
|
||||||
|
L += DegsToRads(0.6583) * sin(2.0 * (L - lambda));
|
||||||
|
N -= DegsToRads(0.16) * sin(Ms);
|
||||||
|
|
||||||
|
L -= N;
|
||||||
|
lambda = (fabs(cos(L)) < 1e-12) ?
|
||||||
|
(N + sin(L) * cos(MoonInclination) * PI / 2) :
|
||||||
|
(N + atan2(sin(L) * cos(MoonInclination), cos(L)));
|
||||||
|
Normalize(lambda);
|
||||||
|
beta = asin(sin(L) * sin(MoonInclination));
|
||||||
|
ecliptic_to_equatorial(lambda, beta, &alpha, &delta);
|
||||||
|
alpha -= (TWOPI / 24) * GST(ssue);
|
||||||
|
Normalize(alpha);
|
||||||
|
*lon = alpha;
|
||||||
|
*lat = delta;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* WMGlobe 0.5 - All the Earth on a WMaker Icon
|
/* WMGlobe 1.3 - All the Earth on a WMaker Icon
|
||||||
* copyright (C) 1998,99 Jerome Dumonteil <jerome.dumonteil@capway.com>
|
* copyright (C) 1998,99,2000,01 Jerome Dumonteil <jerome.dumonteil@linuxfr.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -35,353 +35,398 @@
|
||||||
#include "defnimap.xpm"
|
#include "defnimap.xpm"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/***************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
unsigned int borderwidth = 1;
|
unsigned int borderwidth = 1;
|
||||||
XClassHint classHint;
|
XClassHint classHint;
|
||||||
char *wname = argv[0];
|
char *wname = argv[0];
|
||||||
XTextProperty name;
|
XTextProperty name;
|
||||||
|
|
||||||
XGCValues gcv;
|
XGCValues gcv;
|
||||||
unsigned long gcm;
|
unsigned long gcm;
|
||||||
XWindowAttributes attributes;
|
XWindowAttributes attributes;
|
||||||
XColor color;
|
XColor color;
|
||||||
|
|
||||||
RContext *ctx;
|
RContext *ctx;
|
||||||
|
|
||||||
XSizeHints mysizehints;
|
XSizeHints mysizehints;
|
||||||
XWMHints mywmhints;
|
XWMHints mywmhints;
|
||||||
Pixel back_pix, fore_pix;
|
Pixel back_pix, fore_pix;
|
||||||
char Geometry[256];
|
char Geometry[256];
|
||||||
|
|
||||||
char *rond_bits;
|
char *rond_bits;
|
||||||
|
|
||||||
int dummy = 0;
|
int dummy = 0;
|
||||||
int ok, redoaction, wait_release, move_lat_flag;
|
int ok, redoaction, wait_release, move_lat_flag;
|
||||||
int xx, yy;
|
int xx, yy;
|
||||||
|
|
||||||
/** initialisation *********************/
|
/** initialisation *********************/
|
||||||
|
|
||||||
xx = 0;
|
xx = 0;
|
||||||
yy = 0;
|
yy = 0;
|
||||||
ok = FALSE;
|
ok = FALSE;
|
||||||
move_lat_flag = FALSE;
|
move_lat_flag = FALSE;
|
||||||
redoaction = 0;
|
redoaction = 0;
|
||||||
wait_release = 0;
|
wait_release = 0;
|
||||||
|
|
||||||
setlocale(LC_TIME, "");
|
setlocale(LC_TIME, "");
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stdout, "%s\n", setlocale(LC_TIME, ""));
|
fprintf(stdout, "%s\n", setlocale(LC_TIME, ""));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
set_defaults();
|
set_defaults();
|
||||||
|
|
||||||
cmdline(argc, argv);
|
cmdline(argc, argv);
|
||||||
|
|
||||||
switch (typecadre) {
|
#if WITH_MARKERS
|
||||||
case 1:
|
if (nb_marker) {
|
||||||
rond_bits = cadre1_bits;
|
int i;
|
||||||
break;
|
for (i = 0; i < nb_marker; i++)
|
||||||
case 2:
|
if (i != moon_marker && i != sun_marker) {
|
||||||
rond_bits = cadre2_bits;
|
marker[i][0] = marker[i][0] * PI / 180.;
|
||||||
break;
|
marker[i][1] = marker[i][1] * PI / 180.;
|
||||||
default:
|
transform_marker(i);
|
||||||
rond_bits = cadre0_bits;
|
}
|
||||||
}
|
}
|
||||||
if (p_type == PTRANDOM) {
|
|
||||||
dlat = 0;
|
|
||||||
dlong = 0;
|
|
||||||
}
|
|
||||||
initmyconvert();
|
|
||||||
|
|
||||||
tdelay.tv_sec = (int) floor(delay);
|
|
||||||
tdelay.tv_usec = (int) ((delay - tdelay.tv_sec) * 1000000);
|
|
||||||
aml = (int) floor(ambient_light * 256);
|
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
if (!(dpy = XOpenDisplay(dpy_name))) {
|
|
||||||
fprintf(stderr, "%s: can't open display \"%s\"\n",
|
|
||||||
wname, XDisplayName(dpy_name));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
ctx = myRCreateContext(dpy, DefaultScreen(dpy), NULL);
|
|
||||||
|
|
||||||
if (ctx->attribs->use_shared_memory) {
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stdout, "enleve les flags use_shared_memory\n");
|
|
||||||
#endif
|
#endif
|
||||||
ctx->attribs->flags ^= RC_UseSharedMemory;
|
|
||||||
ctx->attribs->use_shared_memory = FALSE;
|
switch (typecadre) {
|
||||||
ctx->flags.use_shared_pixmap = 0;
|
case 1:
|
||||||
}
|
rond_bits = cadre1_bits;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
rond_bits = cadre2_bits;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rond_bits = cadre0_bits;
|
||||||
|
}
|
||||||
|
if (p_type == PTRANDOM) {
|
||||||
|
dlat = 0;
|
||||||
|
dlong = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* setup long term mem allocation */
|
||||||
|
initmyconvert();
|
||||||
|
|
||||||
|
|
||||||
|
tdelay.tv_sec = (int) floor(delay);
|
||||||
|
tdelay.tv_usec = (int) ((delay - tdelay.tv_sec) * 1000000);
|
||||||
|
aml = (int) floor(ambient_light * 256);
|
||||||
|
|
||||||
|
|
||||||
|
/* ctx initialization */
|
||||||
|
|
||||||
|
if (!(dpy = XOpenDisplay(dpy_name))) {
|
||||||
|
fprintf(stderr, "%s: can't open display \"%s\"\n",
|
||||||
|
wname, XDisplayName(dpy_name));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
ctx = myRCreateContext(dpy, DefaultScreen(dpy), NULL);
|
||||||
|
|
||||||
|
if (ctx->attribs->use_shared_memory) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stdout, "depth %d\n", ctx->depth);
|
fprintf(stdout, "remove flags use_shared_memory\n");
|
||||||
fflush(stdout);
|
#endif
|
||||||
|
ctx->attribs->flags ^= RC_UseSharedMemory;
|
||||||
|
ctx->attribs->use_shared_memory = FALSE;
|
||||||
|
ctx->flags.use_shared_pixmap = 0;
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stdout, "depth %d\n", ctx->depth);
|
||||||
|
fflush(stdout);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* loading maps .............
|
* loading maps .............
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (dayfile != NULL) {
|
if (dayfile != NULL) {
|
||||||
map = RLoadImage(ctx, dayfile, 0);
|
map = RLoadImage(ctx, dayfile, 0);
|
||||||
if (!map) {
|
if (!use_default_nightmap)
|
||||||
fprintf(stdout, "pb map ! file not found ?\n");
|
use_nightmap = FALSE;
|
||||||
exit(1);
|
ripalpha(map);
|
||||||
}
|
if (!map) {
|
||||||
|
fprintf(stdout, "pb map ! file not found ?\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
#ifdef DEFMAPOK
|
||||||
|
map = RGetImageFromXPMData(ctx, defmap_xpm);
|
||||||
|
use_default_nightmap = TRUE;
|
||||||
|
ripalpha(map);
|
||||||
|
if (!map) {
|
||||||
|
fprintf(stdout, "pb def map ! file not found ?\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
fprintf(stdout, "need a map !\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (!oknimap) {
|
||||||
|
use_nightmap = FALSE;
|
||||||
|
use_default_nightmap = FALSE;
|
||||||
|
}
|
||||||
|
if (use_nightmap) {
|
||||||
|
if (nightfile != NULL) {
|
||||||
|
mapnight = RLoadImage(ctx, nightfile, 0);
|
||||||
|
ripalpha(mapnight);
|
||||||
|
if (!mapnight) {
|
||||||
|
fprintf(stdout, "pb map night! file not found ?\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
#ifdef DEFMAPOK
|
#ifdef DEFMAPOK
|
||||||
map = RGetImageFromXPMData(ctx, defmap_xpm);
|
if (use_default_nightmap) {
|
||||||
if (!map) {
|
mapnight = RGetImageFromXPMData(ctx, defnimap_xpm);
|
||||||
fprintf(stdout, "pb def map ! file not found ?\n");
|
ripalpha(mapnight);
|
||||||
exit(1);
|
if (!mapnight) {
|
||||||
|
fprintf(stdout,
|
||||||
|
"pb def map night ! file not found ?\n");
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
nightfile = NULL;
|
}
|
||||||
use_nightmap = TRUE;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
fprintf(stdout, "need a map !\n");
|
use_nightmap = FALSE;
|
||||||
exit(1);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
if (use_nightmap) {
|
use_nmap_ini = use_nightmap;
|
||||||
if (nightfile != NULL) {
|
|
||||||
mapnight = RLoadImage(ctx, nightfile, 0);
|
/* we need a night map of same size as day map */
|
||||||
if (!mapnight) {
|
if (mapnight) {
|
||||||
fprintf(stdout, "pb map night! file not found ?\n");
|
if ((mapnight->width != map->width)
|
||||||
exit(1);
|
|| (mapnight->height != map->height)) {
|
||||||
}
|
RImage *tmp;
|
||||||
} else {
|
tmp = mapnight;
|
||||||
#ifdef DEFMAPOK
|
mapnight = RScaleImage(tmp, map->width, map->height);
|
||||||
mapnight = RGetImageFromXPMData(ctx, defnimap_xpm);
|
RReleaseImage(tmp);
|
||||||
if (!mapnight) {
|
ripalpha(mapnight);
|
||||||
fprintf(stdout, "pb def map night ! file not found ?\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* not very useful... */
|
|
||||||
use_nightmap = FALSE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
use_nmap_ini = use_nightmap;
|
}
|
||||||
if (!oknimap)
|
|
||||||
use_nightmap = FALSE;
|
|
||||||
/* some other init ..................................... */
|
/* some other init ..................................... */
|
||||||
ratiox = (double) map->width / (2 * PI);
|
ratiox = (double) map->width / (2 * PI);
|
||||||
ratioy = (double) map->height / PI;
|
ratioy = (double) map->height / PI;
|
||||||
mratiox = (int) floor(ratiox * 256);
|
mratiox = (int) floor(ratiox * 256);
|
||||||
mratioy = (int) floor(ratioy * 256);
|
mratioy = (int) floor(ratioy * 256);
|
||||||
loadxpm(ctx->drawable);
|
loadxpm(ctx->drawable);
|
||||||
|
|
||||||
small = RCreateImage(DIAMETRE, DIAMETRE, 1);
|
small = RCreateImage(DIAMETRE, DIAMETRE, 0);
|
||||||
|
|
||||||
calcDistance();
|
calcDistance();
|
||||||
/*...................................................... */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* first rendering of the earth
|
* first rendering of the earth
|
||||||
*/
|
*/
|
||||||
recalc(0);
|
rotation_terre(DIAMETRE / 2, DIAMETRE / 2, 0);
|
||||||
do_something = FALSE;
|
recalc(0);
|
||||||
|
do_something = FALSE;
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* well, here the problems begin : this code is a merge from wmgeneral and
|
* well, here the problems begin : this code is a merge from wmgeneral and
|
||||||
* some stuff of wmaker, should be rewritten ...
|
* some stuff of wmaker, should be rewritten ...
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
/* wmg */
|
XGetWindowAttributes(dpy, ctx->drawable, &attributes);
|
||||||
|
|
||||||
XGetWindowAttributes(dpy, ctx->drawable, &attributes);
|
if (!RConvertImage(ctx, small, &pix)) {
|
||||||
|
fprintf(stdout, "error small->&pix\n");
|
||||||
|
puts(RMessageForError(RErrorCode));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
wmg.pixmap = pix;
|
||||||
|
wmg.mask = pix;
|
||||||
|
|
||||||
if (!RConvertImage(ctx, small, &pix)) {
|
mysizehints.flags = USSize | USPosition;
|
||||||
fprintf(stdout, "error small->&pix\n");
|
mysizehints.x = 0;
|
||||||
puts(RMessageForError(RErrorCode));
|
mysizehints.y = 0;
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
wmg.pixmap = pix;
|
|
||||||
wmg.mask = pix;
|
|
||||||
|
|
||||||
mysizehints.flags = USSize | USPosition;
|
color.pixel = 0;
|
||||||
mysizehints.x = 0;
|
if (!XParseColor(dpy, attributes.colormap, "white", &color)) {
|
||||||
mysizehints.y = 0;
|
fprintf(stdout, "wmglobe: can't parse white\n");
|
||||||
|
} else if (!XAllocColor(dpy, attributes.colormap, &color)) {
|
||||||
|
fprintf(stdout, "wmglobe: can't allocate white\n");
|
||||||
|
}
|
||||||
|
back_pix = color.pixel;
|
||||||
|
|
||||||
color.pixel = 0;
|
XGetWindowAttributes(dpy, ctx->drawable, &attributes);
|
||||||
if (!XParseColor(dpy, attributes.colormap, "white", &color)) {
|
|
||||||
fprintf(stdout, "wmglobe: can't parse white\n");
|
|
||||||
} else if (!XAllocColor(dpy, attributes.colormap, &color)) {
|
|
||||||
fprintf(stdout, "wmglobe: can't allocate white\n");
|
|
||||||
}
|
|
||||||
back_pix = color.pixel;
|
|
||||||
|
|
||||||
XGetWindowAttributes(dpy, ctx->drawable, &attributes);
|
color.pixel = 0;
|
||||||
|
if (!XParseColor(dpy, attributes.colormap, "black", &color)) {
|
||||||
color.pixel = 0;
|
fprintf(stdout, "wmglobe: can't parse black\n");
|
||||||
if (!XParseColor(dpy, attributes.colormap, "black", &color)) {
|
} else if (!XAllocColor(dpy, attributes.colormap, &color)) {
|
||||||
fprintf(stdout, "wmglobe: can't parse black\n");
|
fprintf(stdout, "wmglobe: can't allocate black\n");
|
||||||
} else if (!XAllocColor(dpy, attributes.colormap, &color)) {
|
}
|
||||||
fprintf(stdout, "wmglobe: can't allocate black\n");
|
fore_pix = color.pixel;
|
||||||
}
|
|
||||||
fore_pix = color.pixel;
|
|
||||||
|
|
||||||
|
|
||||||
XWMGeometry(dpy, ctx->screen_number, Geometry, NULL, borderwidth, &mysizehints,
|
XWMGeometry(dpy, ctx->screen_number, Geometry, NULL, borderwidth,
|
||||||
&mysizehints.x, &mysizehints.y, &mysizehints.width, &mysizehints.height, &dummy);
|
&mysizehints, &mysizehints.x, &mysizehints.y,
|
||||||
mysizehints.width = DIAMETRE;
|
&mysizehints.width, &mysizehints.height, &dummy);
|
||||||
mysizehints.height = DIAMETRE;
|
mysizehints.width = DIAMETRE;
|
||||||
|
mysizehints.height = DIAMETRE;
|
||||||
|
|
||||||
win = XCreateSimpleWindow(dpy, ctx->drawable, mysizehints.x, mysizehints.y,
|
win =
|
||||||
mysizehints.width, mysizehints.height, borderwidth, fore_pix, back_pix);
|
XCreateSimpleWindow(dpy, ctx->drawable, mysizehints.x,
|
||||||
|
mysizehints.y, mysizehints.width,
|
||||||
|
mysizehints.height, borderwidth, fore_pix,
|
||||||
|
back_pix);
|
||||||
|
|
||||||
iconwin = XCreateSimpleWindow(dpy, win, mysizehints.x, mysizehints.y,
|
iconwin = XCreateSimpleWindow(dpy, win, mysizehints.x, mysizehints.y,
|
||||||
mysizehints.width, mysizehints.height, borderwidth, fore_pix, back_pix);
|
mysizehints.width, mysizehints.height,
|
||||||
|
borderwidth, fore_pix, back_pix);
|
||||||
|
|
||||||
/* Activate hints */
|
/* Activate hints */
|
||||||
XSetWMNormalHints(dpy, win, &mysizehints);
|
XSetWMNormalHints(dpy, win, &mysizehints);
|
||||||
classHint.res_name = wname;
|
classHint.res_name = wname;
|
||||||
classHint.res_class = wname;
|
classHint.res_class = wname;
|
||||||
XSetClassHint(dpy, win, &classHint);
|
XSetClassHint(dpy, win, &classHint);
|
||||||
|
|
||||||
XSelectInput(dpy, win, ButtonPressMask | ExposureMask | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask);
|
XSelectInput(dpy, win,
|
||||||
XSelectInput(dpy, iconwin, ButtonPressMask | ExposureMask | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask);
|
ButtonPressMask | ExposureMask | ButtonReleaseMask |
|
||||||
|
PointerMotionMask | StructureNotifyMask);
|
||||||
|
XSelectInput(dpy, iconwin,
|
||||||
|
ButtonPressMask | ExposureMask | ButtonReleaseMask |
|
||||||
|
PointerMotionMask | StructureNotifyMask);
|
||||||
|
|
||||||
if (XStringListToTextProperty(&wname, 1, &name) == 0) {
|
if (XStringListToTextProperty(&wname, 1, &name) == 0) {
|
||||||
fprintf(stdout, "%s: can't allocate window name\n", wname);
|
fprintf(stdout, "%s: can't allocate window name\n", wname);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
XSetWMName(dpy, win, &name);
|
XSetWMName(dpy, win, &name);
|
||||||
|
|
||||||
/* Create GC for drawing */
|
/* Create GC for drawing */
|
||||||
|
|
||||||
gcm = GCForeground | GCBackground | GCGraphicsExposures;
|
gcm = GCForeground | GCBackground | GCGraphicsExposures;
|
||||||
gcv.foreground = fore_pix;
|
gcv.foreground = fore_pix;
|
||||||
gcv.background = back_pix;
|
gcv.background = back_pix;
|
||||||
gcv.graphics_exposures = 0;
|
gcv.graphics_exposures = 0;
|
||||||
NormalGC = XCreateGC(dpy, ctx->drawable, gcm, &gcv);
|
NormalGC = XCreateGC(dpy, ctx->drawable, gcm, &gcv);
|
||||||
|
|
||||||
/* ONLYSHAPE ON */
|
/* ONLYSHAPE ON */
|
||||||
if (onlyshape) {
|
if (onlyshape) {
|
||||||
pixmask = XCreateBitmapFromData(dpy, win, rond_bits, DIAMETRE, DIAMETRE);
|
pixmask =
|
||||||
XShapeCombineMask(dpy, win, ShapeBounding, 0, 0, pixmask, ShapeSet);
|
XCreateBitmapFromData(dpy, win, rond_bits, DIAMETRE, DIAMETRE);
|
||||||
XShapeCombineMask(dpy, iconwin, ShapeBounding, 0, 0, pixmask, ShapeSet);
|
XShapeCombineMask(dpy, win, ShapeBounding, 0, 0, pixmask,
|
||||||
}
|
ShapeSet);
|
||||||
/* ONLYSHAPE OFF */
|
XShapeCombineMask(dpy, iconwin, ShapeBounding, 0, 0, pixmask,
|
||||||
|
ShapeSet);
|
||||||
|
}
|
||||||
|
/* ONLYSHAPE OFF */
|
||||||
|
|
||||||
mywmhints.initial_state = option_iw;
|
mywmhints.initial_state = option_iw;
|
||||||
mywmhints.icon_window = iconwin;
|
mywmhints.icon_window = iconwin;
|
||||||
mywmhints.icon_x = mysizehints.x;
|
mywmhints.icon_x = mysizehints.x;
|
||||||
mywmhints.icon_y = mysizehints.y;
|
mywmhints.icon_y = mysizehints.y;
|
||||||
mywmhints.window_group = win;
|
mywmhints.window_group = win;
|
||||||
mywmhints.flags = StateHint | IconWindowHint | IconPositionHint | WindowGroupHint;
|
mywmhints.flags =
|
||||||
|
StateHint | IconWindowHint | IconPositionHint | WindowGroupHint;
|
||||||
|
|
||||||
XSetWMHints(dpy, win, &mywmhints);
|
XSetWMHints(dpy, win, &mywmhints);
|
||||||
|
|
||||||
XSetCommand(dpy, win, argv, argc);
|
XSetCommand(dpy, win, argv, argc);
|
||||||
XMapWindow(dpy, win);
|
XMapWindow(dpy, win);
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
XCopyArea(dpy, wmg.pixmap, win, NormalGC, 0, 0, DIAMETRE, DIAMETRE, 0, 0);
|
XCopyArea(dpy, wmg.pixmap, win, NormalGC, 0, 0, DIAMETRE, DIAMETRE, 0,
|
||||||
|
0);
|
||||||
|
|
||||||
|
RedrawWindowXYWH(0, 0, DIAMETRE, DIAMETRE);
|
||||||
RedrawWindowXYWH(0, 0, DIAMETRE, DIAMETRE);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ================= MAIN LOOP ==================
|
* ================= MAIN LOOP ==================
|
||||||
*/
|
*/
|
||||||
while (1) {
|
while (1) {
|
||||||
while (XPending(dpy)) {
|
while (XPending(dpy)) {
|
||||||
XNextEvent(dpy, &Event);
|
XNextEvent(dpy, &Event);
|
||||||
switch (Event.type) {
|
switch (Event.type) {
|
||||||
case Expose:
|
case Expose:
|
||||||
RedrawWindowXYWH(0, 0, DIAMETRE, DIAMETRE);
|
RedrawWindowXYWH(0, 0, DIAMETRE, DIAMETRE);
|
||||||
break;
|
break;
|
||||||
case DestroyNotify:
|
case DestroyNotify:
|
||||||
XCloseDisplay(dpy);
|
XCloseDisplay(dpy);
|
||||||
exit(0);
|
exit(0);
|
||||||
break;
|
break;
|
||||||
case ButtonPress:
|
case ButtonPress:
|
||||||
/*
|
/*
|
||||||
* earth rotate when clic left (1) , zooming when middle (2)
|
* earth rotate when clic left (1) , zooming when middle (2)
|
||||||
* change screen to longitude / latitude when (3)
|
* change screen to longitude / latitude when (3)
|
||||||
*/
|
*/
|
||||||
switch (Event.xbutton.button) {
|
switch (Event.xbutton.button) {
|
||||||
case 1:
|
case 1:
|
||||||
#ifdef MOUSE_LAT_NO_SHIFT
|
#ifdef MOUSE_LAT_NO_SHIFT
|
||||||
move_lat_flag = TRUE;
|
move_lat_flag = TRUE;
|
||||||
#else
|
#else
|
||||||
if (Event.xbutton.state & ShiftMask)
|
if (Event.xbutton.state & ShiftMask)
|
||||||
move_lat_flag = TRUE;
|
move_lat_flag = TRUE;
|
||||||
else
|
else
|
||||||
move_lat_flag = FALSE;
|
move_lat_flag = FALSE;
|
||||||
#endif
|
#endif
|
||||||
redoaction = 1;
|
redoaction = 1;
|
||||||
wait_release = 1;
|
wait_release = 1;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
if (Event.xbutton.state & ShiftMask)
|
if (Event.xbutton.state & ShiftMask)
|
||||||
redoaction = 2;
|
redoaction = 2;
|
||||||
else
|
else
|
||||||
redoaction = 3;
|
redoaction = 3;
|
||||||
wait_release = 1;
|
wait_release = 1;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
wait_release = 0;
|
wait_release = 0;
|
||||||
redoaction = 0;
|
redoaction = 0;
|
||||||
screen_back();
|
screen_back();
|
||||||
ok = TRUE;
|
ok = TRUE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ButtonRelease:
|
|
||||||
wait_release = 0;
|
|
||||||
redoaction = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (wait_release) {
|
break;
|
||||||
usleep(2 * VAL_USLEEP_SHORT);
|
case ButtonRelease:
|
||||||
if (redoaction == 1)
|
wait_release = 0;
|
||||||
rotation_terre(Event.xbutton.x, Event.xbutton.y, move_lat_flag);
|
redoaction = 0;
|
||||||
else
|
break;
|
||||||
zooming(Event.xbutton.state & ShiftMask);
|
default:
|
||||||
ok = TRUE;
|
break;
|
||||||
}
|
}
|
||||||
if (diftimev(tnext, getimev()).tv_sec < 0 || ok) {
|
|
||||||
ok = FALSE;
|
|
||||||
recalc(redoaction == 1);
|
|
||||||
if (do_something) {
|
|
||||||
if (!myRConvertImage(ctx, small, &pix)) {
|
|
||||||
fprintf(stdout, "plante !?\n");
|
|
||||||
fprintf(stdout, RMessageForError(RErrorCode));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
wmg.pixmap = pix;
|
|
||||||
wmg.mask = pix;
|
|
||||||
RedrawWindowXYWH(0, 0, DIAMETRE, DIAMETRE);
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stdout, "draw\n");
|
|
||||||
#endif
|
|
||||||
do_something = FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
usleep(VAL_USLEEP);
|
|
||||||
}
|
}
|
||||||
/*
|
if (wait_release) {
|
||||||
* Still wonder about freeing some memory for X
|
usleep(2 * VAL_USLEEP_SHORT);
|
||||||
*/
|
if (redoaction == 1)
|
||||||
return 0;
|
rotation_terre(Event.xbutton.x, Event.xbutton.y,
|
||||||
|
move_lat_flag);
|
||||||
|
else
|
||||||
|
zooming(Event.xbutton.state & ShiftMask);
|
||||||
|
ok = TRUE;
|
||||||
|
}
|
||||||
|
if (diftimev(tnext, getimev()).tv_sec < 0 || ok) {
|
||||||
|
ok = FALSE;
|
||||||
|
recalc(redoaction == 1);
|
||||||
|
if (do_something) {
|
||||||
|
if (!myRConvertImage(ctx, small, &pix)) {
|
||||||
|
fprintf(stderr, "crash !?\n");
|
||||||
|
fprintf(stderr, RMessageForError(RErrorCode));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
wmg.pixmap = pix;
|
||||||
|
wmg.mask = pix;
|
||||||
|
RedrawWindowXYWH(0, 0, DIAMETRE, DIAMETRE);
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stdout, "draw\n");
|
||||||
|
#endif
|
||||||
|
do_something = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
usleep(VAL_USLEEP);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* WMGlobe 0.5 - All the Earth on a WMaker Icon
|
/* WMGlobe 1.3 - All the Earth on a WMaker Icon
|
||||||
* copyright (C) 1998,99 Jerome Dumonteil <jerome.dumonteil@capway.com>
|
* copyright (C) 1998,99,2000,01 Jerome Dumonteil <jerome.dumonteil@linuxfr.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -51,13 +51,15 @@
|
||||||
|
|
||||||
#define FALSE 0
|
#define FALSE 0
|
||||||
#define TRUE 1
|
#define TRUE 1
|
||||||
#define MAX(x, y) ((x) < (y) ? (y) : (x))
|
#define STRONG 2
|
||||||
#define MIN(x, y) ((x) > (y) ? (y) : (x))
|
#define MAX(x, y) ((x) < (y) ? (y) : (x))
|
||||||
|
#define MIN(x, y) ((x) > (y) ? (y) : (x))
|
||||||
#define ABS(a) ((a) < 0 ? -(a) : (a))
|
#define ABS(a) ((a) < 0 ? -(a) : (a))
|
||||||
|
|
||||||
#define PTFIXED 1
|
#define PTFIXED 1
|
||||||
#define PTSUNREL 2
|
#define PTSUN 2
|
||||||
#define PTRANDOM 3
|
#define PTRANDOM 3
|
||||||
|
#define PTMOON 4
|
||||||
|
|
||||||
#ifndef PI
|
#ifndef PI
|
||||||
#define PI 3.141592653
|
#define PI 3.141592653
|
||||||
|
@ -74,34 +76,31 @@
|
||||||
#define MAX_MOUSE_REGION (8)
|
#define MAX_MOUSE_REGION (8)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int enable;
|
int enable;
|
||||||
int top;
|
int top;
|
||||||
int bottom;
|
int bottom;
|
||||||
int left;
|
int left;
|
||||||
int right;
|
int right;
|
||||||
} MOUSE_REGION;
|
} MOUSE_REGION;
|
||||||
|
|
||||||
MOUSE_REGION mouse_region[MAX_MOUSE_REGION];
|
MOUSE_REGION mouse_region[MAX_MOUSE_REGION];
|
||||||
|
|
||||||
typedef struct MPO {
|
typedef struct MPO {
|
||||||
int r, g, b;
|
int r, g, b;
|
||||||
} MPO;
|
} MPO;
|
||||||
|
|
||||||
MPO *md[4], *mn[4];
|
MPO *md[4], *mn[4];
|
||||||
|
|
||||||
double soluce[DIAMETRE / 2][DIAMETRE][4];
|
double solu[DIAMETRE][DIAMETRE][3];
|
||||||
|
int tabsolu[DIAMETRE][DIAMETRE];
|
||||||
int solution;
|
int solution;
|
||||||
|
|
||||||
/************/
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
Pixmap pixmap;
|
Pixmap pixmap;
|
||||||
Pixmap mask;
|
Pixmap mask;
|
||||||
XpmAttributes attributes;
|
XpmAttributes attributes;
|
||||||
} XpmIcon;
|
} XpmIcon;
|
||||||
|
|
||||||
/************/
|
|
||||||
|
|
||||||
|
|
||||||
Display *dpy;
|
Display *dpy;
|
||||||
|
|
||||||
|
@ -121,6 +120,13 @@ GC NormalGC;
|
||||||
|
|
||||||
/********* rendering********/
|
/********* rendering********/
|
||||||
|
|
||||||
|
#if WITH_MARKERS
|
||||||
|
double marker[MAX_MARKERS][3];
|
||||||
|
int nb_marker, sun_marker, moon_marker;
|
||||||
|
RColor sun_col, moon_col;
|
||||||
|
double moon_lat,moon_long;
|
||||||
|
#endif
|
||||||
|
|
||||||
double delay, time_multi;
|
double delay, time_multi;
|
||||||
/*
|
/*
|
||||||
* struct timeval delta_tim, last_tim, next_tim, render_tim, base_tim,
|
* struct timeval delta_tim, last_tim, next_tim, render_tim, base_tim,
|
||||||
|
@ -133,8 +139,8 @@ time_t tsunpos;
|
||||||
|
|
||||||
int sens, fun, funx, funy, oknimap, mratiox, mratioy, gotoscr;
|
int sens, fun, funx, funy, oknimap, mratiox, mratioy, gotoscr;
|
||||||
|
|
||||||
int typecadre, p_type, use_nightmap, use_nmap_ini, firstTime, stoprand,
|
int typecadre, p_type, use_nightmap, use_default_nightmap, use_nmap_ini,
|
||||||
do_something, iop;
|
firstTime, stoprand, do_something, iop;
|
||||||
|
|
||||||
double v_lat, v_long, old_dvlat, old_dvlong, dv_lat, dv_long;
|
double v_lat, v_long, old_dvlat, old_dvlong, dv_lat, dv_long;
|
||||||
double dlat, dlong, addlat, addlong, ratiox, ratioy, dawn;
|
double dlat, dlong, addlat, addlong, ratiox, ratioy, dawn;
|
||||||
|
@ -161,11 +167,14 @@ RColor noir;
|
||||||
double minhz;
|
double minhz;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int stable;
|
||||||
|
|
||||||
/****************************************************************/
|
/****************************************************************/
|
||||||
/* Function Prototypes */
|
/* Function Prototypes */
|
||||||
/****************************************************************/
|
/****************************************************************/
|
||||||
int main(int argc, char *argv[]);
|
int main(int argc, char *argv[]);
|
||||||
/****************************************************************/
|
|
||||||
|
|
||||||
void AddMouseRegion(int index, int left, int top, int right, int bottom);
|
void AddMouseRegion(int index, int left, int top, int right, int bottom);
|
||||||
int CheckMouseRegion(int x, int y);
|
int CheckMouseRegion(int x, int y);
|
||||||
void RedrawWindowXYWH(int x, int y, int w, int h);
|
void RedrawWindowXYWH(int x, int y, int w, int h);
|
||||||
|
@ -179,19 +188,24 @@ struct timeval diftimev(struct timeval t1, struct timeval t2);
|
||||||
struct timeval addtimev(struct timeval t1, struct timeval t2);
|
struct timeval addtimev(struct timeval t1, struct timeval t2);
|
||||||
struct timeval getimev();
|
struct timeval getimev();
|
||||||
|
|
||||||
/***************************************************************/
|
|
||||||
void setZoom(double z);
|
void setZoom(double z);
|
||||||
void calcDistance();
|
void calcDistance();
|
||||||
void renderFrame();
|
void renderFrame();
|
||||||
void initmyconvert();
|
void initmyconvert();
|
||||||
int myRConvertImage(RContext * context, RImage * image, Pixmap * pixmap);
|
int myRConvertImage(RContext * context, RImage * image, Pixmap * pixmap);
|
||||||
RContext *myRCreateContext
|
RContext *myRCreateContext
|
||||||
(Display * dpy, int screen_number, RContextAttributes * attribs);
|
(Display * dpy, int screen_number, RContextAttributes * attribs);
|
||||||
void setTime(struct timeval t);
|
void setTime(struct timeval t);
|
||||||
void recalc(int calme);
|
void recalc(int calme);
|
||||||
void GetSunPos(time_t ssue, double *lat, double *lon);
|
void sun_position(time_t ssue, double *lat, double *lon);
|
||||||
|
void moon_position(time_t ssue, double *lat, double *lon);
|
||||||
|
void transform_marker(int m);
|
||||||
void setViewPos(double lat, double lon);
|
void setViewPos(double lat, double lon);
|
||||||
|
int ripalpha(RImage * image);
|
||||||
/***************************************************************/
|
RImage*
|
||||||
|
RScaleImage(RImage *image, unsigned new_width, unsigned new_height);
|
||||||
|
void
|
||||||
|
RReleaseImage(RImage *image);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* WMGlobe 0.5 - All the Earth on a WMaker Icon
|
/* WMGlobe 1.3 - All the Earth on a WMaker Icon
|
||||||
* copyright (C) 1998,99 Jerome Dumonteil <jerome.dumonteil@capway.com>
|
* copyright (C) 1998,99,2000,01 Jerome Dumonteil <jerome.dumonteil@linuxfr.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -20,7 +20,7 @@
|
||||||
* #define DEBUG
|
* #define DEBUG
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define WMGVERSION "WMGlobe v.0.5 6 fev 1999 <jerome.dumonteil@capway.com>"
|
#define WMGVERSION "WMGlobe v.1.3 12 aug 2001 <jerome.dumonteil@linuxfr.org>"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* comment DEFMAPOK to not install the built-in default maps,
|
* comment DEFMAPOK to not install the built-in default maps,
|
||||||
|
@ -64,14 +64,27 @@
|
||||||
#define STOP_RANDOM_FACTOR 1
|
#define STOP_RANDOM_FACTOR 1
|
||||||
#define RATIO_ROTATE 0.5
|
#define RATIO_ROTATE 0.5
|
||||||
|
|
||||||
|
/* Markers */
|
||||||
|
#define WITH_MARKERS 1 /* put to 0 to remove markers code */
|
||||||
|
#define CROSS_LENGTH 8 /* min 2 */
|
||||||
|
#define CROSS_INVERT 0 /* 0: black/white, 1: inv. color */
|
||||||
|
#define MAX_MARKERS 5
|
||||||
|
#define CR_SUN_R 255 /* sun cross color */
|
||||||
|
#define CR_SUN_G 255
|
||||||
|
#define CR_SUN_B 127
|
||||||
|
#define CR_MOON_R 0 /* moon cross color */
|
||||||
|
#define CR_MOON_G 200
|
||||||
|
#define CR_MOON_B 255
|
||||||
|
|
||||||
|
|
||||||
|
/* some default values*/
|
||||||
#define DEFAULT_DELAY 1.0
|
#define DEFAULT_DELAY 1.0
|
||||||
#define DEFAULT_V_LAT 0.0
|
#define DEFAULT_V_LAT 0.0
|
||||||
#define DEFAULT_V_LONG 0.0
|
#define DEFAULT_V_LONG 0.0
|
||||||
#define DEFAULT_SENS 1
|
#define DEFAULT_SENS 1
|
||||||
#define DEFAULT_ZOOM 1.0
|
#define DEFAULT_ZOOM 1.0
|
||||||
#define DEFAULT_LIGHT 0.25
|
#define DEFAULT_LIGHT 0.25
|
||||||
#define DEFAULT_BORDER 0
|
#define DEFAULT_BORDER 2
|
||||||
#define DEFAULT_NIGHTMAP 1 /* 1 or 0 */
|
#define DEFAULT_NIGHTMAP 1 /* 1 or 0 */
|
||||||
|
|
||||||
#define MAX_DELAY_SEC 86400.0
|
#define MAX_DELAY_SEC 86400.0
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,398 +0,0 @@
|
||||||
|
|
||||||
/*
|
|
||||||
* Raster graphics library
|
|
||||||
*
|
|
||||||
* Copyright (c) 1997, 1998 Alfredo K. Kojima
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 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
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Environment variables:
|
|
||||||
*
|
|
||||||
* WRASTER_GAMMA <rgamma>/<ggamma>/<bgamma>
|
|
||||||
* gamma correction value. Must be greater than 0
|
|
||||||
* Only for PseudoColor visuals.
|
|
||||||
*
|
|
||||||
* Default:
|
|
||||||
* WRASTER_GAMMA 1/1/1
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* If you want a specific value for a screen, append the screen number
|
|
||||||
* preceded by a hash to the variable name as in
|
|
||||||
* WRASTER_GAMMA#1
|
|
||||||
* for screen number 1
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef RLRASTER_H_
|
|
||||||
#define RLRASTER_H_
|
|
||||||
|
|
||||||
|
|
||||||
/* version of the header for the library: 0.11 */
|
|
||||||
#define WRASTER_HEADER_VERSION 11
|
|
||||||
|
|
||||||
#ifdef HAVE_ALLOCA_H
|
|
||||||
#include <alloca.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
|
||||||
#include <X11/Xutil.h>
|
|
||||||
|
|
||||||
#ifdef XSHM
|
|
||||||
#include <X11/extensions/XShm.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* RM_MATCH or RM_DITHER */
|
|
||||||
#define RC_RenderMode (1<<0)
|
|
||||||
|
|
||||||
/* number of colors per channel for colormap in PseudoColor mode */
|
|
||||||
#define RC_ColorsPerChannel (1<<1)
|
|
||||||
|
|
||||||
/* do gamma correction */
|
|
||||||
#define RC_GammaCorrection (1<<2)
|
|
||||||
|
|
||||||
/* visual id to use */
|
|
||||||
#define RC_VisualID (1<<3)
|
|
||||||
|
|
||||||
/* shared memory usage */
|
|
||||||
#define RC_UseSharedMemory (1<<4)
|
|
||||||
|
|
||||||
/* use default instead of best visual */
|
|
||||||
#define RC_DefaultVisual (1<<5)
|
|
||||||
|
|
||||||
typedef struct RContextAttributes {
|
|
||||||
int flags;
|
|
||||||
int render_mode;
|
|
||||||
int colors_per_channel; /* for PseudoColor */
|
|
||||||
float rgamma; /* gamma correction for red, */
|
|
||||||
float ggamma; /* green, */
|
|
||||||
float bgamma; /* and blue */
|
|
||||||
VisualID visualid; /* visual ID to use */
|
|
||||||
int use_shared_memory; /* True of False */
|
|
||||||
} RContextAttributes;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* describes a screen in terms of depth, visual, number of colors
|
|
||||||
* we can use, if we should do dithering, and what colors to use for
|
|
||||||
* dithering.
|
|
||||||
*/
|
|
||||||
typedef struct RContext {
|
|
||||||
Display *dpy;
|
|
||||||
int screen_number;
|
|
||||||
Colormap cmap;
|
|
||||||
|
|
||||||
RContextAttributes *attribs;
|
|
||||||
|
|
||||||
GC copy_gc;
|
|
||||||
|
|
||||||
Visual *visual;
|
|
||||||
int depth;
|
|
||||||
Window drawable; /* window to pass for XCreatePixmap(). */
|
|
||||||
/* generally = root */
|
|
||||||
int vclass;
|
|
||||||
|
|
||||||
unsigned long black;
|
|
||||||
unsigned long white;
|
|
||||||
|
|
||||||
int red_offset; /* only used in 24bpp */
|
|
||||||
int green_offset;
|
|
||||||
int blue_offset;
|
|
||||||
|
|
||||||
/* only used for pseudocolor and grayscale */
|
|
||||||
|
|
||||||
XStandardColormap *std_rgb_map; /* standard RGB colormap */
|
|
||||||
XStandardColormap *std_gray_map; /* standard grayscale colormap */
|
|
||||||
|
|
||||||
int ncolors; /* total number of colors we can use */
|
|
||||||
XColor *colors; /* internal colormap */
|
|
||||||
|
|
||||||
struct {
|
|
||||||
unsigned int use_shared_pixmap:1;
|
|
||||||
} flags;
|
|
||||||
} RContext;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct RColor {
|
|
||||||
unsigned char red;
|
|
||||||
unsigned char green;
|
|
||||||
unsigned char blue;
|
|
||||||
unsigned char alpha;
|
|
||||||
} RColor;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct RHSVColor {
|
|
||||||
unsigned short hue; /* 0-359 */
|
|
||||||
unsigned char saturation; /* 0-255 */
|
|
||||||
unsigned char value; /* 0-255 */
|
|
||||||
} RHSVColor;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct RPoint {
|
|
||||||
int x, y;
|
|
||||||
} RPoint;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct RSegment {
|
|
||||||
int x1, y1, x2, y2;
|
|
||||||
} RSegment;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* internal 24bit+alpha image representation
|
|
||||||
*/
|
|
||||||
typedef struct RImage {
|
|
||||||
unsigned width, height; /* size of the image */
|
|
||||||
RColor background; /* background color */
|
|
||||||
unsigned char *data[4]; /* image data (R,G,B,A) */
|
|
||||||
} RImage;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* internal wrapper for XImage. Used for shm abstraction
|
|
||||||
*/
|
|
||||||
typedef struct RXImage {
|
|
||||||
XImage *image;
|
|
||||||
|
|
||||||
/* Private data. Do not access */
|
|
||||||
#ifdef XSHM
|
|
||||||
XShmSegmentInfo info;
|
|
||||||
char is_shared;
|
|
||||||
#endif
|
|
||||||
} RXImage;
|
|
||||||
|
|
||||||
|
|
||||||
/* note that not all operations are supported in all functions */
|
|
||||||
enum {
|
|
||||||
RClearOperation, /* clear with 0 */
|
|
||||||
RCopyOperation,
|
|
||||||
RNormalOperation, /* same as combine */
|
|
||||||
RAddOperation,
|
|
||||||
RSubtractOperation
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* image display modes */
|
|
||||||
enum {
|
|
||||||
RDitheredRendering = 0,
|
|
||||||
RBestMatchRendering = 1
|
|
||||||
};
|
|
||||||
|
|
||||||
/* bw compat */
|
|
||||||
#define RM_DITHER RDitheredRendering
|
|
||||||
#define RM_MATCH RBestMatchRendering
|
|
||||||
|
|
||||||
enum {
|
|
||||||
RAbsoluteCoordinates = 0,
|
|
||||||
RRelativeCoordinates = 1
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
enum {
|
|
||||||
RSunkenBevel = -1,
|
|
||||||
RRaisedBevel = 1
|
|
||||||
};
|
|
||||||
|
|
||||||
/* bw compat */
|
|
||||||
#define RBEV_SUNKEN RSunkenBevel
|
|
||||||
/* 1 pixel wide */
|
|
||||||
#define RBEV_RAISED RRaisedBevel
|
|
||||||
/* 1 pixel wide on top/left 2 on bottom/right */
|
|
||||||
#define RBEV_RAISED2 2
|
|
||||||
/* 2 pixel width */
|
|
||||||
#define RBEV_RAISED3 3
|
|
||||||
|
|
||||||
enum {
|
|
||||||
RHorizontalGradient = 2,
|
|
||||||
RVerticalGradient = 3,
|
|
||||||
RDiagonalGradient = 4
|
|
||||||
};
|
|
||||||
|
|
||||||
/* for backwards compatibility */
|
|
||||||
#define RGRD_HORIZONTAL RHorizontalGradient
|
|
||||||
#define RGRD_VERTICAL RVerticalGradient
|
|
||||||
#define RGRD_DIAGONAL RDiagonalGradient
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* error codes */
|
|
||||||
#define RERR_NONE 0
|
|
||||||
#define RERR_OPEN 1 /* cant open file */
|
|
||||||
#define RERR_READ 2 /* error reading from file */
|
|
||||||
#define RERR_WRITE 3 /* error writing to file */
|
|
||||||
#define RERR_NOMEMORY 4 /* out of memory */
|
|
||||||
#define RERR_NOCOLOR 5 /* out of color cells */
|
|
||||||
#define RERR_BADIMAGEFILE 6 /* image file is corrupted or invalid */
|
|
||||||
#define RERR_BADFORMAT 7 /* image file format is unknown */
|
|
||||||
#define RERR_BADINDEX 8 /* no such image index in file */
|
|
||||||
|
|
||||||
#define RERR_BADVISUALID 16 /* invalid visual ID requested for context */
|
|
||||||
|
|
||||||
#define RERR_XERROR 127 /* internal X error */
|
|
||||||
#define RERR_INTERNAL 128 /* should not happen */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Returns a NULL terminated array of strings containing the
|
|
||||||
* supported formats, such as: TIFF, XPM, PNG, JPEG, PPM, GIF
|
|
||||||
*/
|
|
||||||
char **RSupportedFileFormats(void);
|
|
||||||
|
|
||||||
void RFreeStringList(char **list);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Xlib contexts
|
|
||||||
*/
|
|
||||||
RContext *RCreateContext(Display * dpy, int screen_number,
|
|
||||||
RContextAttributes * attribs);
|
|
||||||
|
|
||||||
void RDestroyContext(RContext * context);
|
|
||||||
|
|
||||||
Bool RGetClosestXColor(RContext * context, RColor * color, XColor * retColor);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* RImage creation
|
|
||||||
*/
|
|
||||||
RImage *RCreateImage(unsigned width, unsigned height, int alpha);
|
|
||||||
|
|
||||||
RImage *RCreateImageFromXImage(RContext * context, XImage * image, XImage * mask);
|
|
||||||
|
|
||||||
RImage *RCreateImageFromDrawable(RContext * context, Drawable drawable,
|
|
||||||
Pixmap mask);
|
|
||||||
|
|
||||||
RImage *RLoadImage(RContext * context, char *file, int index);
|
|
||||||
|
|
||||||
|
|
||||||
void RDestroyImage(RImage * image);
|
|
||||||
|
|
||||||
RImage *RGetImageFromXPMData(RContext * context, char **data);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* RImage storing
|
|
||||||
*/
|
|
||||||
Bool RSaveImage(RImage * image, char *filename, char *format);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Area manipulation
|
|
||||||
*/
|
|
||||||
RImage *RCloneImage(RImage * image);
|
|
||||||
|
|
||||||
RImage *RGetSubImage(RImage * image, int x, int y, unsigned width,
|
|
||||||
unsigned height);
|
|
||||||
|
|
||||||
void RCombineImageWithColor(RImage * image, RColor * color);
|
|
||||||
|
|
||||||
void RCombineImages(RImage * image, RImage * src);
|
|
||||||
|
|
||||||
void RCombineArea(RImage * image, RImage * src, int sx, int sy, unsigned width,
|
|
||||||
unsigned height, int dx, int dy);
|
|
||||||
|
|
||||||
void RCombineImagesWithOpaqueness(RImage * image, RImage * src, int opaqueness);
|
|
||||||
|
|
||||||
void RCombineAreaWithOpaqueness(RImage * image, RImage * src, int sx, int sy,
|
|
||||||
unsigned width, unsigned height, int dx, int dy,
|
|
||||||
int opaqueness);
|
|
||||||
|
|
||||||
RImage *RScaleImage(RImage * image, unsigned new_width, unsigned new_height);
|
|
||||||
|
|
||||||
RImage *RMakeTiledImage(RImage * tile, unsigned width, unsigned height);
|
|
||||||
|
|
||||||
RImage *RMakeCenteredImage(RImage * image, unsigned width, unsigned height,
|
|
||||||
RColor * color);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Drawing
|
|
||||||
*/
|
|
||||||
Bool RGetPixel(RImage * image, int x, int y, RColor * color);
|
|
||||||
|
|
||||||
void RPutPixel(RImage * image, int x, int y, RColor * color);
|
|
||||||
|
|
||||||
void ROperatePixel(RImage * image, int operation, int x, int y, RColor * color);
|
|
||||||
|
|
||||||
void RPutPixels(RImage * image, RPoint * points, int npoints, int mode,
|
|
||||||
RColor * color);
|
|
||||||
|
|
||||||
void ROperatePixels(RImage * image, int operation, RPoint * points,
|
|
||||||
int npoints, int mode, RColor * color);
|
|
||||||
|
|
||||||
int RDrawLine(RImage * image, int x0, int y0, int x1, int y1, RColor * color);
|
|
||||||
|
|
||||||
int ROperateLine(RImage * image, int operation, int x0, int y0, int x1, int y1,
|
|
||||||
RColor * color);
|
|
||||||
|
|
||||||
void RDrawLines(RImage * image, RPoint * points, int npoints, int mode,
|
|
||||||
RColor * color);
|
|
||||||
|
|
||||||
void ROperateLines(RImage * image, int operation, RPoint * points, int npoints,
|
|
||||||
int mode, RColor * color);
|
|
||||||
|
|
||||||
void RDrawSegments(RImage * image, RSegment * segs, int nsegs, RColor * color);
|
|
||||||
|
|
||||||
void ROperateSegments(RImage * image, int operation, RSegment * segs, int nsegs,
|
|
||||||
RColor * color);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Color convertion
|
|
||||||
*/
|
|
||||||
void RRGBtoHSV(RColor * color, RHSVColor * hsv);
|
|
||||||
void RHSVtoRGB(RHSVColor * hsv, RColor * rgb);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Painting
|
|
||||||
*/
|
|
||||||
void RClearImage(RImage * image, RColor * color);
|
|
||||||
|
|
||||||
void RBevelImage(RImage * image, int bevel_type);
|
|
||||||
|
|
||||||
RImage *RRenderGradient(unsigned width, unsigned height, RColor * from,
|
|
||||||
RColor * to, int style);
|
|
||||||
|
|
||||||
|
|
||||||
RImage *RRenderMultiGradient(unsigned width, unsigned height, RColor ** colors,
|
|
||||||
int style);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convertion into X Pixmaps
|
|
||||||
*/
|
|
||||||
int RConvertImage(RContext * context, RImage * image, Pixmap * pixmap);
|
|
||||||
|
|
||||||
int RConvertImageMask(RContext * context, RImage * image, Pixmap * pixmap,
|
|
||||||
Pixmap * mask, int threshold);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* misc. utilities
|
|
||||||
*/
|
|
||||||
RXImage *RCreateXImage(RContext * context, int depth,
|
|
||||||
unsigned width, unsigned height);
|
|
||||||
|
|
||||||
void RDestroyXImage(RContext * context, RXImage * ximage);
|
|
||||||
|
|
||||||
void RPutXImage(RContext * context, Drawable d, GC gc, RXImage * ximage,
|
|
||||||
int src_x, int src_y, int dest_x, int dest_y,
|
|
||||||
unsigned width, unsigned height);
|
|
||||||
|
|
||||||
/* do not free the returned string! */
|
|
||||||
const char *RMessageForError(int errorCode);
|
|
||||||
|
|
||||||
int RBlurImage(RImage * image);
|
|
||||||
|
|
||||||
/****** Global Variables *******/
|
|
||||||
|
|
||||||
extern int RErrorCode;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* WMGlobe 0.5.pre1 - All the Earth on a WMaker Icon
|
/* WMGlobe 1.3 - All the Earth on a WMaker Icon
|
||||||
* copyright (C) 1998,99 Jerome Dumonteil <jerome.dumonteil@capway.com>
|
* copyright (C) 1998,99,2000,01 Jerome Dumonteil <jerome.dumonteil@linuxfr.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -16,22 +16,21 @@
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
int zapnum[14][4] =
|
int zapnum[14][4] = {
|
||||||
{
|
{90, 0, 10, 13},
|
||||||
{90, 0, 10, 13},
|
{0, 0, 10, 13},
|
||||||
{0, 0, 10, 13},
|
{10, 0, 10, 13},
|
||||||
{10, 0, 10, 13},
|
{20, 0, 10, 13},
|
||||||
{20, 0, 10, 13},
|
{30, 0, 10, 13},
|
||||||
{30, 0, 10, 13},
|
{40, 0, 10, 13},
|
||||||
{40, 0, 10, 13},
|
{50, 0, 10, 13},
|
||||||
{50, 0, 10, 13},
|
{60, 0, 10, 13},
|
||||||
{60, 0, 10, 13},
|
{70, 0, 10, 13},
|
||||||
{70, 0, 10, 13},
|
{80, 0, 10, 13},
|
||||||
{80, 0, 10, 13},
|
{100, 0, 10, 13},
|
||||||
{100, 0, 10, 13},
|
{110, 0, 10, 13},
|
||||||
{110, 0, 10, 13},
|
{100, 0, 5, 13},
|
||||||
{100, 0, 5, 13},
|
{114, 0, 5, 13}
|
||||||
{114, 0, 5, 13}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -54,27 +53,23 @@ int zapnum[14][4] =
|
||||||
* };
|
* };
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int platd[4][2] =
|
int platd[4][2] = {
|
||||||
{
|
{2, 12},
|
||||||
{2, 12},
|
{6, 12},
|
||||||
{6, 12},
|
{16, 12},
|
||||||
{16, 12},
|
{26, 12}
|
||||||
{26, 12}
|
|
||||||
};
|
};
|
||||||
int platm[2][2] =
|
int platm[2][2] = {
|
||||||
{
|
{42, 12},
|
||||||
{42, 12},
|
{52, 12}
|
||||||
{52, 12}
|
|
||||||
};
|
};
|
||||||
int plongd[4][2] =
|
int plongd[4][2] = {
|
||||||
{
|
{2, 36},
|
||||||
{2, 36},
|
{6, 36},
|
||||||
{6, 36},
|
{16, 36},
|
||||||
{16, 36},
|
{26, 36}
|
||||||
{26, 36}
|
|
||||||
};
|
};
|
||||||
int plongm[2][2] =
|
int plongm[2][2] = {
|
||||||
{
|
{42, 36},
|
||||||
{42, 36},
|
{52, 36}
|
||||||
{52, 36}
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
.TH WMGlobe 1 "fevrier 1999"
|
.TH WMGlobe 1.3 "august 2001"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
WMGlobe - The Whole Earth spinning on you desktop...
|
WMGlobe - The Whole Earth spinning on you desktop...
|
||||||
as a dockable app for WindowMaker
|
as a dockable app for WindowMaker
|
||||||
|
@ -14,7 +14,7 @@ rendered on a sphere by raytracing. Yes, for a 64x64 pixel result:-)
|
||||||
.B \-v
|
.B \-v
|
||||||
version. Currently, this should display :
|
version. Currently, this should display :
|
||||||
|
|
||||||
WMGlobe v.0.5 6 fev 1999 <jerome.dumonteil@capway.com>
|
WMGlobe v.1.3 12 aug 2001 <jerome.dumonteil@linuxfr.org>
|
||||||
.TP
|
.TP
|
||||||
.B \-h
|
.B \-h
|
||||||
short help
|
short help
|
||||||
|
@ -28,11 +28,18 @@ the sun rotation. Accepted values in the form 45
|
||||||
Default: the initial position is "under" the sun, and
|
Default: the initial position is "under" the sun, and
|
||||||
the point of view follows the sun.
|
the point of view follows the sun.
|
||||||
.TP
|
.TP
|
||||||
|
.B \-sun
|
||||||
|
The point of view follows the Sun (default).
|
||||||
|
.TP
|
||||||
|
.B \-moon
|
||||||
|
The point of view follows the Moon (i.e. you see the Earth as you
|
||||||
|
were on the Moon).
|
||||||
|
.TP
|
||||||
.B \-rand
|
.B \-rand
|
||||||
New random position at every refresh of screen.
|
New random position at every refresh of screen.
|
||||||
.TP
|
.TP
|
||||||
.B \-map \fI map_file\fP
|
.B \-map \fI map_file\fP
|
||||||
Map used for the rendering. Can be JPEG, GIG, XPM
|
Map used for the rendering. Can be JPEG, GIF, XPM
|
||||||
PNM, TIFF but none BMP.
|
PNM, TIFF but none BMP.
|
||||||
Default: use internal map of earth.
|
Default: use internal map of earth.
|
||||||
.TP
|
.TP
|
||||||
|
@ -41,8 +48,9 @@ Map used for the dark side of the earth. Must be of
|
||||||
the same width x height as the day side map.
|
the same width x height as the day side map.
|
||||||
Default: if the default internal day map is used, use
|
Default: if the default internal day map is used, use
|
||||||
a default internal night file (see -nonimap option).
|
a default internal night file (see -nonimap option).
|
||||||
If a custom day map is provided, and no night map, the
|
.TP
|
||||||
dark side is computed via the -light option.
|
.B \-defnimap
|
||||||
|
Use the default night map (with a custom map).
|
||||||
.TP
|
.TP
|
||||||
.B \-nonimap
|
.B \-nonimap
|
||||||
Don't use the default night map.
|
Don't use the default night map.
|
||||||
|
@ -84,7 +92,7 @@ Default: 0.2
|
||||||
.TP
|
.TP
|
||||||
.B \-bord \fI border_num\fP
|
.B \-bord \fI border_num\fP
|
||||||
0 1 or 2. There are 3 different borders for the icon.
|
0 1 or 2. There are 3 different borders for the icon.
|
||||||
Default: 0
|
Default: 2
|
||||||
.TP
|
.TP
|
||||||
.B \-accel \fI time_multi\fP
|
.B \-accel \fI time_multi\fP
|
||||||
Time warp factor. With -accel 24, the sun make a full
|
Time warp factor. With -accel 24, the sun make a full
|
||||||
|
@ -97,6 +105,13 @@ WMGlobe is Y2K compliant without changing system time.
|
||||||
Negative values for dates before 1970 accepted.
|
Negative values for dates before 1970 accepted.
|
||||||
Default: not set, use current time.
|
Default: not set, use current time.
|
||||||
.TP
|
.TP
|
||||||
|
.B \-mk \fI latitude longitude\fP
|
||||||
|
Put a fixed marker at latitude/longitude.
|
||||||
|
-mk sun : put a marker under the Sun position.
|
||||||
|
-mk moon : put a marker under the Moon.
|
||||||
|
5 markers can be defined simultaneously, so you can
|
||||||
|
use wmglobe to predict when Moon will meet the Sun :-)
|
||||||
|
.TP
|
||||||
.B \-fun \fI dx dy\fP
|
.B \-fun \fI dx dy\fP
|
||||||
Move the earth image by dx dy pixels in the icon. See
|
Move the earth image by dx dy pixels in the icon. See
|
||||||
puzzle.sh to understand why.
|
puzzle.sh to understand why.
|
||||||
|
@ -104,6 +119,9 @@ puzzle.sh to understand why.
|
||||||
.B \-oz
|
.B \-oz
|
||||||
Start in "austral" mode (for "down under" people)
|
Start in "austral" mode (for "down under" people)
|
||||||
.TP
|
.TP
|
||||||
|
.B \-stable
|
||||||
|
Keep the globe from going over the poles.
|
||||||
|
.TP
|
||||||
.B \-d \fI display\fP
|
.B \-d \fI display\fP
|
||||||
Select another display
|
Select another display
|
||||||
.TP
|
.TP
|
||||||
|
@ -147,7 +165,7 @@ dimensions.
|
||||||
where to find the sources of wmglobe:
|
where to find the sources of wmglobe:
|
||||||
the web page of WMGlobe (made by Sylvestre Taburet):
|
the web page of WMGlobe (made by Sylvestre Taburet):
|
||||||
|
|
||||||
<http://www.capway.com/dumonte1/wm/wmg.html>
|
<http://perso.linuxfr.org/jdumont/wmg/>
|
||||||
|
|
||||||
|
|
||||||
where to find maps and similar softs:
|
where to find maps and similar softs:
|
||||||
|
@ -173,7 +191,8 @@ By the way, you can use maps of Mars, Luna ... and text.
|
||||||
.LP
|
.LP
|
||||||
WMGlobe uses the setlocale(3) function, so you LANG environment need to be ok.
|
WMGlobe uses the setlocale(3) function, so you LANG environment need to be ok.
|
||||||
|
|
||||||
You need WindowMaker 0.20.3 or 0.51.0 installed to use WMGlobe.
|
You need WindowMaker 0.62 or higher to use WMGlobe. (use WMGlobe 1.0 for
|
||||||
|
older versions of WindowMaker).
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
.LP
|
.LP
|
||||||
The Window Maker User Guide
|
The Window Maker User Guide
|
||||||
|
@ -181,7 +200,7 @@ The Window Maker User Guide
|
||||||
The Window Maker FAQ
|
The Window Maker FAQ
|
||||||
|
|
||||||
.SH "AUTHOR"
|
.SH "AUTHOR"
|
||||||
jerome dumonteil <jerome.dumonteil@capway.com>
|
jerome dumonteil <jerome.dumonteil@linuxfr.org>
|
||||||
|
|
||||||
Patches, bug reports, and suggestions are welcome.
|
Patches, bug reports, and suggestions are welcome.
|
||||||
|
|
||||||
|
@ -192,7 +211,9 @@ Read the COPYING file for the complete GNU license.
|
||||||
|
|
||||||
Original idea, tests, logos:
|
Original idea, tests, logos:
|
||||||
|
|
||||||
Sylvestre Taburet <staburet@consort.fr>
|
Sylvestre Taburet <Sylvestre.Taburet@free.fr>
|
||||||
|
|
||||||
|
WindowMaker 0.62 fix : Charles G Waldman <cgw@fnal.gov>
|
||||||
|
|
||||||
The code in 'sunpos.cpp' is taken from Xearth by Kirk Lauritz Johnson.
|
The code in 'sunpos.cpp' is taken from Xearth by Kirk Lauritz Johnson.
|
||||||
|
|
||||||
|
@ -238,5 +259,6 @@ and that LONG_MAX +1 = LONG_MIN . This happens with high values of -accel
|
||||||
when the date go over year 2038. The expected result is wmglobe
|
when the date go over year 2038. The expected result is wmglobe
|
||||||
continuing smoothly from 1901.
|
continuing smoothly from 1901.
|
||||||
|
|
||||||
|
Using WMGlobe at high speed through a LAN may induce some load on the net.
|
||||||
|
|
||||||
|
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 202 B |
BIN
wmglobe/wmgmap.jpeg
Normal file
BIN
wmglobe/wmgmap.jpeg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.4 KiB |
Loading…
Reference in a new issue