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,13 +42,13 @@
|
||||||
* #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 */
|
||||||
0, /* colors_per_channel */
|
3, /* colors_per_channel */
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
@ -57,8 +57,7 @@ static RContextAttributes DEFAULT_CONTEXT_ATTRIBS =
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static XColor *
|
static XColor *allocatePseudoColor(RContext * ctx)
|
||||||
allocatePseudoColor(RContext * ctx)
|
|
||||||
{
|
{
|
||||||
XColor *colors;
|
XColor *colors;
|
||||||
XColor avcolors[256];
|
XColor avcolors[256];
|
||||||
|
@ -71,7 +70,8 @@ static XColor *
|
||||||
|
|
||||||
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 =
|
||||||
|
1 << ((int) ctx->depth / 3);
|
||||||
ncolors = cpc * cpc * cpc;
|
ncolors = cpc * cpc * cpc;
|
||||||
}
|
}
|
||||||
assert(cpc >= 2 && ncolors <= (1 << ctx->depth));
|
assert(cpc >= 2 && ncolors <= (1 << ctx->depth));
|
||||||
|
@ -83,8 +83,9 @@ static XColor *
|
||||||
}
|
}
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
if ((ctx->attribs->flags & RC_GammaCorrection) && ctx->attribs->rgamma > 0
|
if ((ctx->attribs->flags & RC_GammaCorrection)
|
||||||
&& ctx->attribs->ggamma > 0 && ctx->attribs->bgamma > 0) {
|
&& ctx->attribs->rgamma > 0 && ctx->attribs->ggamma > 0
|
||||||
|
&& ctx->attribs->bgamma > 0) {
|
||||||
double rg, gg, bg;
|
double rg, gg, bg;
|
||||||
double tmp;
|
double tmp;
|
||||||
|
|
||||||
|
@ -101,13 +102,16 @@ static XColor *
|
||||||
colors[i].flags = DoRed | DoGreen | DoBlue;
|
colors[i].flags = DoRed | DoGreen | DoBlue;
|
||||||
|
|
||||||
tmp = (double) colors[i].red / 65536.0;
|
tmp = (double) colors[i].red / 65536.0;
|
||||||
colors[i].red = (unsigned short) (65536.0 * pow(tmp, rg));
|
colors[i].red =
|
||||||
|
(unsigned short) (65536.0 * pow(tmp, rg));
|
||||||
|
|
||||||
tmp = (double) colors[i].green / 65536.0;
|
tmp = (double) colors[i].green / 65536.0;
|
||||||
colors[i].green = (unsigned short) (65536.0 * pow(tmp, gg));
|
colors[i].green =
|
||||||
|
(unsigned short) (65536.0 * pow(tmp, gg));
|
||||||
|
|
||||||
tmp = (double) colors[i].blue / 65536.0;
|
tmp = (double) colors[i].blue / 65536.0;
|
||||||
colors[i].blue = (unsigned short) (65536.0 * pow(tmp, bg));
|
colors[i].blue =
|
||||||
|
(unsigned short) (65536.0 * pow(tmp, bg));
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
@ -181,8 +185,7 @@ static XColor *
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static XColor *
|
static XColor *allocateGrayScale(RContext * ctx)
|
||||||
allocateGrayScale(RContext * ctx)
|
|
||||||
{
|
{
|
||||||
XColor *colors;
|
XColor *colors;
|
||||||
XColor avcolors[256];
|
XColor avcolors[256];
|
||||||
|
@ -199,7 +202,8 @@ static XColor *
|
||||||
} else {
|
} 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 =
|
||||||
|
1 << ((int) ctx->depth / 3);
|
||||||
ncolors = cpc * cpc * cpc;
|
ncolors = cpc * cpc * cpc;
|
||||||
}
|
}
|
||||||
assert(cpc >= 2 && ncolors <= (1 << ctx->depth));
|
assert(cpc >= 2 && ncolors <= (1 << ctx->depth));
|
||||||
|
@ -207,7 +211,7 @@ static XColor *
|
||||||
|
|
||||||
if (ncolors >= 256 && ctx->vclass == StaticGray) {
|
if (ncolors >= 256 && ctx->vclass == StaticGray) {
|
||||||
/* don't need dithering for 256 levels of gray in StaticGray visual */
|
/* don't need dithering for 256 levels of gray in StaticGray visual */
|
||||||
ctx->attribs->render_mode = RM_MATCH;
|
ctx->attribs->render_mode = RBestMatchRendering;
|
||||||
}
|
}
|
||||||
colors = malloc(sizeof(XColor) * ncolors);
|
colors = malloc(sizeof(XColor) * ncolors);
|
||||||
if (!colors) {
|
if (!colors) {
|
||||||
|
@ -223,17 +227,20 @@ static XColor *
|
||||||
/* try to allocate the colors */
|
/* try to allocate the colors */
|
||||||
for (i = 0; i < ncolors; i++) {
|
for (i = 0; i < ncolors; i++) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("trying:%x,%x,%x\n", colors[i].red, colors[i].green, colors[i].blue);
|
printf("trying:%x,%x,%x\n", colors[i].red, colors[i].green,
|
||||||
|
colors[i].blue);
|
||||||
#endif
|
#endif
|
||||||
if (!XAllocColor(ctx->dpy, ctx->cmap, &(colors[i]))) {
|
if (!XAllocColor(ctx->dpy, ctx->cmap, &(colors[i]))) {
|
||||||
colors[i].flags = 0; /* failed */
|
colors[i].flags = 0; /* failed */
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("failed:%x,%x,%x\n", colors[i].red, colors[i].green, colors[i].blue);
|
printf("failed:%x,%x,%x\n", colors[i].red, colors[i].green,
|
||||||
|
colors[i].blue);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
colors[i].flags = DoRed | DoGreen | DoBlue;
|
colors[i].flags = DoRed | DoGreen | DoBlue;
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("success:%x,%x,%x\n", colors[i].red, colors[i].green, colors[i].blue);
|
printf("success:%x,%x,%x\n", colors[i].red, colors[i].green,
|
||||||
|
colors[i].blue);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -267,7 +274,10 @@ static XColor *
|
||||||
}
|
}
|
||||||
/* allocate closest color found */
|
/* allocate closest color found */
|
||||||
#ifdef DEBUG
|
#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);
|
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
|
#endif
|
||||||
colors[i].red = avcolors[closest].red;
|
colors[i].red = avcolors[closest].red;
|
||||||
colors[i].green = avcolors[closest].green;
|
colors[i].green = avcolors[closest].green;
|
||||||
|
@ -286,8 +296,7 @@ static XColor *
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static char *
|
static char *mygetenv(char *var, int scr)
|
||||||
mygetenv(char *var, int scr)
|
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
char varname[64];
|
char varname[64];
|
||||||
|
@ -323,7 +332,8 @@ static void gatherconfig(RContext * context, int screen_n)
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
int i;
|
int i;
|
||||||
if (sscanf(ptr, "%d", &i) != 1 || i < 2 || i > 6) {
|
if (sscanf(ptr, "%d", &i) != 1 || i < 2 || i > 6) {
|
||||||
printf("wrlib: invalid value for color resolution \"%s\"\n", ptr);
|
printf("wrlib: invalid value for color resolution \"%s\"\n",
|
||||||
|
ptr);
|
||||||
} else {
|
} else {
|
||||||
context->attribs->flags |= RC_ColorsPerChannel;
|
context->attribs->flags |= RC_ColorsPerChannel;
|
||||||
context->attribs->colors_per_channel = i;
|
context->attribs->colors_per_channel = i;
|
||||||
|
@ -383,8 +393,8 @@ static int count_offset(unsigned long mask)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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;
|
||||||
|
@ -421,7 +431,8 @@ RContext *
|
||||||
|
|
||||||
templ.screen = screen_number;
|
templ.screen = screen_number;
|
||||||
templ.visualid = context->attribs->visualid;
|
templ.visualid = context->attribs->visualid;
|
||||||
vinfo = XGetVisualInfo(context->dpy, VisualIDMask | VisualScreenMask,
|
vinfo =
|
||||||
|
XGetVisualInfo(context->dpy, VisualIDMask | VisualScreenMask,
|
||||||
&templ, &nret);
|
&templ, &nret);
|
||||||
if (!vinfo || nret == 0) {
|
if (!vinfo || nret == 0) {
|
||||||
free(context);
|
free(context);
|
||||||
|
@ -442,10 +453,12 @@ RContext *
|
||||||
attr.override_redirect = True;
|
attr.override_redirect = True;
|
||||||
attr.border_pixel = 0;
|
attr.border_pixel = 0;
|
||||||
attr.background_pixel = 0;
|
attr.background_pixel = 0;
|
||||||
mask = CWBorderPixel | CWColormap | CWOverrideRedirect | CWBackPixel;
|
mask =
|
||||||
|
CWBorderPixel | CWColormap | CWOverrideRedirect |
|
||||||
|
CWBackPixel;
|
||||||
context->drawable =
|
context->drawable =
|
||||||
XCreateWindow(dpy, RootWindow(dpy, screen_number), 1, 1,
|
XCreateWindow(dpy, RootWindow(dpy, screen_number), 1, 1, 1,
|
||||||
1, 1, 0, context->depth, CopyFromParent,
|
1, 0, context->depth, CopyFromParent,
|
||||||
context->visual, mask, &attr);
|
context->visual, mask, &attr);
|
||||||
/* XSetWindowColormap(dpy, context->drawable, attr.colormap); */
|
/* XSetWindowColormap(dpy, context->drawable, attr.colormap); */
|
||||||
}
|
}
|
||||||
|
@ -474,7 +487,8 @@ RContext *
|
||||||
if (!context->colors) {
|
if (!context->colors) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
} else if (context->vclass == GrayScale || context->vclass == StaticGray) {
|
} else if (context->vclass == GrayScale
|
||||||
|
|| context->vclass == StaticGray) {
|
||||||
context->colors = allocateGrayScale(context);
|
context->colors = allocateGrayScale(context);
|
||||||
if (!context->colors) {
|
if (!context->colors) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -486,7 +500,7 @@ RContext *
|
||||||
context->blue_offset = count_offset(context->visual->blue_mask);
|
context->blue_offset = count_offset(context->visual->blue_mask);
|
||||||
/* disable dithering on 24 bits visuals */
|
/* disable dithering on 24 bits visuals */
|
||||||
if (context->depth >= 24)
|
if (context->depth >= 24)
|
||||||
context->attribs->render_mode = RM_MATCH;
|
context->attribs->render_mode = RBestMatchRendering;
|
||||||
}
|
}
|
||||||
/* check avaiability of MIT-SHM */
|
/* check avaiability of MIT-SHM */
|
||||||
|
|
||||||
|
@ -543,7 +557,8 @@ static Bool
|
||||||
XCreateWindow(dpy, RootWindow(dpy, screen_number),
|
XCreateWindow(dpy, RootWindow(dpy, screen_number),
|
||||||
1, 1, 1, 1, 0, context->depth,
|
1, 1, 1, 1, 0, context->depth,
|
||||||
CopyFromParent, context->visual,
|
CopyFromParent, context->visual,
|
||||||
CWBorderPixel | CWColormap | CWOverrideRedirect, &attr);
|
CWBorderPixel | CWColormap | CWOverrideRedirect,
|
||||||
|
&attr);
|
||||||
/* XSetWindowColormap(dpy, context->drawable, context->cmap); */
|
/* XSetWindowColormap(dpy, context->drawable, context->cmap); */
|
||||||
}
|
}
|
||||||
if (vinfo)
|
if (vinfo)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* WMGlobe 0.5 - All the Earth on a WMaker Icon
|
/* WMGlobe 1.3 - All the Earth on a WMaker Icon
|
||||||
* myconvert.c - an adaptation of wrlib for use in wmglobe
|
* myconvert.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 :
|
||||||
*/
|
*/
|
||||||
|
@ -23,9 +23,6 @@
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
* #include <config.h>
|
|
||||||
*/
|
|
||||||
#include "wmglobe.h"
|
#include "wmglobe.h"
|
||||||
|
|
||||||
typedef struct RConversionTable {
|
typedef struct RConversionTable {
|
||||||
|
@ -58,8 +55,7 @@ void initmyconvert()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static unsigned short *
|
static unsigned short *computeTable(unsigned short mask, int hop)
|
||||||
computeTable(unsigned short mask, int hop)
|
|
||||||
{
|
{
|
||||||
RConversionTable *tmp = conversionTable;
|
RConversionTable *tmp = conversionTable;
|
||||||
int i;
|
int i;
|
||||||
|
@ -74,8 +70,7 @@ static unsigned short *
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static RXImage *
|
static RXImage *image2TrueColor(RContext * ctx, RImage * image)
|
||||||
image2TrueColor(RContext * ctx, RImage * image)
|
|
||||||
{
|
{
|
||||||
RXImage *ximg;
|
RXImage *ximg;
|
||||||
register int x, y, r, g, b;
|
register int x, y, r, g, b;
|
||||||
|
@ -87,16 +82,18 @@ static RXImage *
|
||||||
int ofs;
|
int ofs;
|
||||||
|
|
||||||
if (ximgok == NULL)
|
if (ximgok == NULL)
|
||||||
ximgok = RCreateXImage(ctx, ctx->depth, image->width, image->height);
|
ximgok =
|
||||||
|
RCreateXImage(ctx, ctx->depth, image->width, image->height);
|
||||||
|
|
||||||
ximg = ximgok;
|
ximg = ximgok;
|
||||||
if (!ximg) {
|
if (!ximg) {
|
||||||
puts("err ");
|
puts("err ");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
red = image->data[0];
|
|
||||||
grn = image->data[1];
|
red = image->data;
|
||||||
blu = image->data[2];
|
grn = image->data + 1;
|
||||||
|
blu = image->data + 2;
|
||||||
|
|
||||||
roffs = ctx->red_offset;
|
roffs = ctx->red_offset;
|
||||||
goffs = ctx->green_offset;
|
goffs = ctx->green_offset;
|
||||||
|
@ -117,13 +114,13 @@ static RXImage *
|
||||||
RDestroyXImage(ctx, ximg);
|
RDestroyXImage(ctx, ximg);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (ctx->attribs->render_mode == RM_MATCH) {
|
if (ctx->attribs->render_mode == RBestMatchRendering) {
|
||||||
/* fake match */
|
/* fake match */
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
puts("true color match");
|
puts("true color match");
|
||||||
#endif
|
#endif
|
||||||
for (y = 0, ofs = 0; y < image->height; y++) {
|
for (y = 0, ofs = 0; y < image->height; y++) {
|
||||||
for (x = 0; x < image->width; x++, ofs++) {
|
for (x = 0; x < image->width; x++, ofs += 3) {
|
||||||
/* reduce pixel */
|
/* reduce pixel */
|
||||||
r = rtable[red[ofs]];
|
r = rtable[red[ofs]];
|
||||||
g = gtable[grn[ofs]];
|
g = gtable[grn[ofs]];
|
||||||
|
@ -141,6 +138,7 @@ static RXImage *
|
||||||
const int dr = 0xff / rmask;
|
const int dr = 0xff / rmask;
|
||||||
const int dg = 0xff / gmask;
|
const int dg = 0xff / gmask;
|
||||||
const int db = 0xff / bmask;
|
const int db = 0xff / bmask;
|
||||||
|
register int x1;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
puts("true color dither");
|
puts("true color dither");
|
||||||
|
@ -157,24 +155,26 @@ static RXImage *
|
||||||
RDestroyXImage(ctx, ximg);
|
RDestroyXImage(ctx, ximg);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
for (x = 0; x < image->width; x++) {
|
for (x = x1 = 0; x < image->width; x++, x1 += 3) {
|
||||||
|
|
||||||
rerr[x] = red[x];
|
rerr[x] = red[x1];
|
||||||
gerr[x] = grn[x];
|
gerr[x] = grn[x1];
|
||||||
berr[x] = blu[x];
|
berr[x] = blu[x1];
|
||||||
}
|
}
|
||||||
rerr[x] = gerr[x] = berr[x] = 0;
|
rerr[x] = gerr[x] = berr[x] = 0;
|
||||||
/* convert and dither the image to XImage */
|
/* convert and dither the image to XImage */
|
||||||
for (y = 0, ofs = 0; y < image->height; y++) {
|
for (y = 0, ofs = 0; y < image->height; y++) {
|
||||||
if (y < image->height - 1) {
|
if (y < image->height - 1) {
|
||||||
int x1;
|
|
||||||
for (x = 0, x1 = ofs + image->width; x < image->width; x++, x1++) {
|
for (x = 0, x1 = 3 * (ofs + image->width); x <
|
||||||
|
image->width; x++, x1 += 3) {
|
||||||
|
|
||||||
nrerr[x] = red[x1];
|
nrerr[x] = red[x1];
|
||||||
ngerr[x] = grn[x1];
|
ngerr[x] = grn[x1];
|
||||||
nberr[x] = blu[x1];
|
nberr[x] = blu[x1];
|
||||||
}
|
}
|
||||||
/* last column */
|
/* last column */
|
||||||
x1--;
|
x1-=3;
|
||||||
nrerr[x] = red[x1];
|
nrerr[x] = red[x1];
|
||||||
ngerr[x] = grn[x1];
|
ngerr[x] = grn[x1];
|
||||||
nberr[x] = blu[x1];
|
nberr[x] = blu[x1];
|
||||||
|
@ -241,8 +241,7 @@ static RXImage *
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static RXImage *
|
static RXImage *image2PseudoColor(RContext * ctx, RImage * image)
|
||||||
image2PseudoColor(RContext * ctx, RImage * image)
|
|
||||||
{
|
{
|
||||||
RXImage *ximg;
|
RXImage *ximg;
|
||||||
register int x, y, r, g, b;
|
register int x, y, r, g, b;
|
||||||
|
@ -259,7 +258,8 @@ static RXImage *
|
||||||
/*register unsigned char maxrgb = 0xff; */
|
/*register unsigned char maxrgb = 0xff; */
|
||||||
|
|
||||||
if (ximgok == NULL)
|
if (ximgok == NULL)
|
||||||
ximgok = RCreateXImage(ctx, ctx->depth, image->width, image->height);
|
ximgok =
|
||||||
|
RCreateXImage(ctx, ctx->depth, image->width, image->height);
|
||||||
|
|
||||||
ximg = ximgok;
|
ximg = ximgok;
|
||||||
|
|
||||||
|
@ -267,9 +267,9 @@ static RXImage *
|
||||||
puts("err psc");
|
puts("err psc");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
red = image->data[0];
|
red = image->data;
|
||||||
grn = image->data[1];
|
grn = image->data + 1;
|
||||||
blu = image->data[2];
|
blu = image->data + 2;
|
||||||
|
|
||||||
data = ximg->image->data;
|
data = ximg->image->data;
|
||||||
|
|
||||||
|
@ -283,13 +283,13 @@ static RXImage *
|
||||||
RDestroyXImage(ctx, ximg);
|
RDestroyXImage(ctx, ximg);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (ctx->attribs->render_mode == RM_MATCH) {
|
if (ctx->attribs->render_mode == RBestMatchRendering) {
|
||||||
/* fake match */
|
/* fake match */
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("pseudo color match with %d colors per channel\n", cpc);
|
printf("pseudo color match with %d colors per channel\n", cpc);
|
||||||
#endif
|
#endif
|
||||||
for (y = 0, ofs = 0; y < image->height; y++) {
|
for (y = 0, ofs = 0; y < image->height; y++) {
|
||||||
for (x = 0; x < image->width; x++, ofs++) {
|
for (x = 0; x < image->width; x++, ofs += 3) {
|
||||||
/* reduce pixel */
|
/* reduce pixel */
|
||||||
r = rtable[red[ofs]];
|
r = rtable[red[ofs]];
|
||||||
g = gtable[grn[ofs]];
|
g = gtable[grn[ofs]];
|
||||||
|
@ -308,6 +308,7 @@ static RXImage *
|
||||||
const int dr = 0xff / rmask;
|
const int dr = 0xff / rmask;
|
||||||
const int dg = 0xff / gmask;
|
const int dg = 0xff / gmask;
|
||||||
const int db = 0xff / bmask;
|
const int db = 0xff / bmask;
|
||||||
|
register int x1;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("pseudo color dithering with %d colors per channel\n", cpc);
|
printf("pseudo color dithering with %d colors per channel\n", cpc);
|
||||||
|
@ -323,23 +324,24 @@ static RXImage *
|
||||||
RDestroyXImage(ctx, ximg);
|
RDestroyXImage(ctx, ximg);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
for (x = 0; x < image->width; x++) {
|
for (x = x1 = 0; x < image->width; x++, x1+=3) {
|
||||||
rerr[x] = red[x];
|
rerr[x] = red[x1];
|
||||||
gerr[x] = grn[x];
|
gerr[x] = grn[x1];
|
||||||
berr[x] = blu[x];
|
berr[x] = blu[x1];
|
||||||
}
|
}
|
||||||
rerr[x] = gerr[x] = berr[x] = 0;
|
rerr[x] = gerr[x] = berr[x] = 0;
|
||||||
/* convert and dither the image to XImage */
|
/* convert and dither the image to XImage */
|
||||||
for (y = 0, ofs = 0; y < image->height; y++) {
|
for (y = 0, ofs = 0; y < image->height; y++) {
|
||||||
if (y < image->height - 1) {
|
if (y < image->height - 1) {
|
||||||
int x1;
|
int x1;
|
||||||
for (x = 0, x1 = ofs + image->width; x < image->width; x++, x1++) {
|
for (x = 0, x1 = 3*(ofs + image->width); x <
|
||||||
|
image->width; x++, x1 += 3) {
|
||||||
nrerr[x] = red[x1];
|
nrerr[x] = red[x1];
|
||||||
ngerr[x] = grn[x1];
|
ngerr[x] = grn[x1];
|
||||||
nberr[x] = blu[x1];
|
nberr[x] = blu[x1];
|
||||||
}
|
}
|
||||||
/* last column */
|
/* last column */
|
||||||
x1--;
|
x1-=3;
|
||||||
nrerr[x] = red[x1];
|
nrerr[x] = red[x1];
|
||||||
ngerr[x] = grn[x1];
|
ngerr[x] = grn[x1];
|
||||||
nberr[x] = blu[x1];
|
nberr[x] = blu[x1];
|
||||||
|
@ -410,8 +412,7 @@ static RXImage *
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static RXImage *
|
static RXImage *image2GrayScale(RContext * ctx, RImage * image)
|
||||||
image2GrayScale(RContext * ctx, RImage * image)
|
|
||||||
{
|
{
|
||||||
RXImage *ximg;
|
RXImage *ximg;
|
||||||
register int x, y, g;
|
register int x, y, g;
|
||||||
|
@ -424,7 +425,8 @@ static RXImage *
|
||||||
/*register unsigned char maxrgb = 0xff; */
|
/*register unsigned char maxrgb = 0xff; */
|
||||||
|
|
||||||
if (ximgok == NULL)
|
if (ximgok == NULL)
|
||||||
ximgok = RCreateXImage(ctx, ctx->depth, image->width, image->height);
|
ximgok =
|
||||||
|
RCreateXImage(ctx, ctx->depth, image->width, image->height);
|
||||||
|
|
||||||
ximg = ximgok;
|
ximg = ximgok;
|
||||||
|
|
||||||
|
@ -432,9 +434,9 @@ static RXImage *
|
||||||
puts("error!");
|
puts("error!");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
red = image->data[0];
|
red = image->data;
|
||||||
grn = image->data[1];
|
grn = image->data + 1;
|
||||||
blu = image->data[2];
|
blu = image->data + 2;
|
||||||
|
|
||||||
data = ximg->image->data;
|
data = ximg->image->data;
|
||||||
|
|
||||||
|
@ -450,7 +452,7 @@ static RXImage *
|
||||||
RDestroyXImage(ctx, ximg);
|
RDestroyXImage(ctx, ximg);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (ctx->attribs->render_mode == RM_MATCH) {
|
if (ctx->attribs->render_mode == RBestMatchRendering) {
|
||||||
/* fake match */
|
/* fake match */
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("grayscale match with %d colors per channel\n", cpc);
|
printf("grayscale match with %d colors per channel\n", cpc);
|
||||||
|
@ -458,7 +460,9 @@ static RXImage *
|
||||||
for (y = 0, ofs = 0; y < image->height; y++) {
|
for (y = 0, ofs = 0; y < image->height; y++) {
|
||||||
for (x = 0; x < image->width; x++, ofs++) {
|
for (x = 0; x < image->width; x++, ofs++) {
|
||||||
/* reduce pixel */
|
/* reduce pixel */
|
||||||
g = table[(red[ofs] * 30 + grn[ofs] * 59 + blu[ofs] * 11) / 100];
|
g =
|
||||||
|
table[(red[ofs] * 30 + grn[ofs] * 59 + blu[ofs] * 11) /
|
||||||
|
100];
|
||||||
|
|
||||||
/*data[ofs] = ctx->colors[g].pixel; */
|
/*data[ofs] = ctx->colors[g].pixel; */
|
||||||
XPutPixel(ximg->image, x, y, ctx->colors[g].pixel);
|
XPutPixel(ximg->image, x, y, ctx->colors[g].pixel);
|
||||||
|
@ -490,12 +494,15 @@ static RXImage *
|
||||||
for (y = 0, ofs = 0; y < image->height; y++) {
|
for (y = 0, ofs = 0; y < image->height; y++) {
|
||||||
if (y < image->height - 1) {
|
if (y < image->height - 1) {
|
||||||
int x1;
|
int x1;
|
||||||
for (x = 0, x1 = ofs + image->width; x < image->width; x++, x1++) {
|
for (x = 0, x1 = ofs + image->width; x < image->width;
|
||||||
ngerr[x] = (red[x1] * 30 + grn[x1] * 59 + blu[x1] * 11) / 100;
|
x++, x1++) {
|
||||||
|
ngerr[x] =
|
||||||
|
(red[x1] * 30 + grn[x1] * 59 + blu[x1] * 11) / 100;
|
||||||
}
|
}
|
||||||
/* last column */
|
/* last column */
|
||||||
x1--;
|
x1--;
|
||||||
ngerr[x] = (red[x1] * 30 + grn[x1] * 59 + blu[x1] * 11) / 100;
|
ngerr[x] =
|
||||||
|
(red[x1] * 30 + grn[x1] * 59 + blu[x1] * 11) / 100;
|
||||||
}
|
}
|
||||||
for (x = 0; x < image->width; x++, ofs++) {
|
for (x = 0; x < image->width; x++, ofs++) {
|
||||||
/* reduce pixel */
|
/* reduce pixel */
|
||||||
|
@ -545,8 +552,9 @@ int myRConvertImage(RContext * context, RImage * image, Pixmap * pixmap)
|
||||||
/* clear error message */
|
/* clear error message */
|
||||||
if (context->vclass == TrueColor)
|
if (context->vclass == TrueColor)
|
||||||
ximg = image2TrueColor(context, image);
|
ximg = image2TrueColor(context, image);
|
||||||
else if (context->vclass == PseudoColor || context->vclass == StaticColor)
|
else if (context->vclass == PseudoColor
|
||||||
ximg = image2PseudoColor(context, image);
|
|| context->vclass == StaticColor) ximg =
|
||||||
|
image2PseudoColor(context, image);
|
||||||
else if (context->vclass == GrayScale || context->vclass == StaticGray)
|
else if (context->vclass == GrayScale || context->vclass == StaticGray)
|
||||||
ximg = image2GrayScale(context, image);
|
ximg = image2GrayScale(context, image);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
@ -15,11 +15,9 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
/* this code is based on XGlobe :
|
/* this code was based on XGlobe :
|
||||||
|
|
||||||
renderer.cpp
|
renderer.cpp
|
||||||
*
|
*
|
||||||
*
|
|
||||||
* This file is part of XGlobe. See README for details.
|
* This file is part of XGlobe. See README for details.
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 Thorsten Scheuermann
|
* Copyright (C) 1998 Thorsten Scheuermann
|
||||||
|
@ -27,8 +25,11 @@
|
||||||
* 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 Licenses as published by
|
* it under the terms of the GNU General Public Licenses as published by
|
||||||
* the Free Software Foundation.
|
* the Free Software Foundation.
|
||||||
*************************************************************************** */
|
************************************************************************/
|
||||||
|
/*
|
||||||
|
Some parts of this files should be rewritten to not depend on
|
||||||
|
WindowMaker version
|
||||||
|
*/
|
||||||
|
|
||||||
#include "wmglobe.h"
|
#include "wmglobe.h"
|
||||||
|
|
||||||
|
@ -42,18 +43,31 @@ static RColor mygetMapColorLinear
|
||||||
static void randomPosition();
|
static void randomPosition();
|
||||||
void setViewPos(double lat, double lon);
|
void setViewPos(double lat, double lon);
|
||||||
static void myRPutPixel(int x, int y, RColor * color);
|
static void myRPutPixel(int x, int y, RColor * color);
|
||||||
static void getquarter(RImage * image, int x, int y, MPO * m[4], int dx, int dy);
|
#ifdef WITH_MARKERS
|
||||||
|
#if (WITH_MARKERS == 1)
|
||||||
|
static void invertPixel(int x, int y);
|
||||||
|
static void put_cross(int x, int y);
|
||||||
|
static void put_dot_cross(int x, int y, RColor * color);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
static void getquarter(RImage * image, int x, int y, MPO * m[4], int dx,
|
||||||
|
int dy);
|
||||||
static void updateTime(int force);
|
static void updateTime(int force);
|
||||||
static struct timeval timeaccel(struct timeval t);
|
static struct timeval timeaccel(struct timeval t);
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct timeval timeaccel(struct timeval t)
|
struct timeval timeaccel(struct timeval t)
|
||||||
{
|
{
|
||||||
struct timeval at;
|
struct timeval at;
|
||||||
double rr;
|
double rr;
|
||||||
|
|
||||||
t = diftimev(t, tini);
|
t = diftimev(t, tini);
|
||||||
rr = floor((double) t.tv_sec * time_multi + (double) t.tv_usec * time_multi / 1000000.);
|
rr = floor((double) t.tv_sec * time_multi +
|
||||||
|
(double) t.tv_usec * time_multi / 1000000.);
|
||||||
/*** something bad may appen if time_multi=max after 41 minutes (overflow) ***/
|
/*** something bad may appen if time_multi=max after 41 minutes (overflow) ***/
|
||||||
while (rr > (double) LONG_MAX)
|
while (rr > (double) LONG_MAX)
|
||||||
rr -= (2.0 * (double) LONG_MAX + 1.0);
|
rr -= (2.0 * (double) LONG_MAX + 1.0);
|
||||||
|
@ -61,24 +75,158 @@ struct timeval timeaccel(struct timeval t)
|
||||||
at.tv_usec = (int) (t.tv_usec * time_multi) % 1000000;
|
at.tv_usec = (int) (t.tv_usec * time_multi) % 1000000;
|
||||||
return addtimev(at, tbase);
|
return addtimev(at, tbase);
|
||||||
}
|
}
|
||||||
/* ------------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void myRPutPixel(int x, int y, RColor * color)
|
static void myRPutPixel(int x, int y, RColor * color)
|
||||||
{
|
{
|
||||||
int ofs;
|
int ofs;
|
||||||
unsigned char *sr, *sg, *sb;
|
unsigned char *sr, *sg, *sb;
|
||||||
|
|
||||||
ofs = y * DIAMETRE + x;
|
ofs = (y * DIAMETRE + x) * 3;
|
||||||
sr = small->data[0] + ofs;
|
sr = small->data + (ofs++);
|
||||||
sg = small->data[1] + ofs;
|
sg = small->data + (ofs++);
|
||||||
sb = small->data[2] + ofs;
|
sb = small->data + (ofs);
|
||||||
|
|
||||||
*sr = color->red;
|
*sr = color->red;
|
||||||
*sg = color->green;
|
*sg = color->green;
|
||||||
*sb = color->blue;
|
*sb = color->blue;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* ------------------------------------------------------------------------ */
|
|
||||||
static void getquarter(RImage * image, int x, int y, MPO * m[4], int dx, int dy)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if WITH_MARKERS
|
||||||
|
static void invertPixel(int x, int y)
|
||||||
|
{
|
||||||
|
int ofs;
|
||||||
|
unsigned char *sr, *sg, *sb;
|
||||||
|
|
||||||
|
ofs = (y * DIAMETRE + x) * 3;
|
||||||
|
sr = small->data + (ofs++);
|
||||||
|
sg = small->data + (ofs++);
|
||||||
|
sb = small->data + (ofs);
|
||||||
|
|
||||||
|
#if ( CROSS_INVERT == 1 )
|
||||||
|
*sr = 255 - *sr;
|
||||||
|
*sg = 255 - *sg;
|
||||||
|
*sb = 255 - *sb;
|
||||||
|
#else
|
||||||
|
if (*sb > 127 || *sg > 127 || *sr > 127)
|
||||||
|
*sr = *sg = *sb = 0;
|
||||||
|
else
|
||||||
|
*sr = *sg = *sb = 255;
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define T_CADRE(x,y) ((x) < DIAMETRE && (x) >= 0 \
|
||||||
|
&& (y) < DIAMETRE && (y) >= 0 && tabsolu[(x)][(y)])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void put_cross(int x, int y)
|
||||||
|
{
|
||||||
|
int i, x_cross, y_cross;
|
||||||
|
|
||||||
|
if (T_CADRE(x, y)) {
|
||||||
|
if (!fun && sens != 1) {
|
||||||
|
x = DIAMETRE - 1 - x;
|
||||||
|
y = DIAMETRE - 1 - y;
|
||||||
|
}
|
||||||
|
for (i = 2; i <= CROSS_LENGTH; i++) {
|
||||||
|
x_cross = x + i;
|
||||||
|
y_cross = y;
|
||||||
|
if (T_CADRE(x_cross, y_cross))
|
||||||
|
invertPixel(x_cross, y_cross);
|
||||||
|
x_cross = x - i;
|
||||||
|
|
||||||
|
if (T_CADRE(x_cross, y_cross))
|
||||||
|
invertPixel(x_cross, y_cross);
|
||||||
|
x_cross = x;
|
||||||
|
y_cross = y - i;
|
||||||
|
if (T_CADRE(x_cross, y_cross))
|
||||||
|
invertPixel(x_cross, y_cross);
|
||||||
|
|
||||||
|
y_cross = y + i;
|
||||||
|
if (T_CADRE(x_cross, y_cross))
|
||||||
|
invertPixel(x_cross, y_cross);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void put_dot_cross(int x, int y, RColor * color)
|
||||||
|
{
|
||||||
|
int i, x_cross, y_cross;
|
||||||
|
|
||||||
|
if (T_CADRE(x, y)) {
|
||||||
|
if (!fun && sens != 1) {
|
||||||
|
x = DIAMETRE - 1 - x;
|
||||||
|
y = DIAMETRE - 1 - y;
|
||||||
|
}
|
||||||
|
for (i = 2; i <= CROSS_LENGTH; i += 2) {
|
||||||
|
x_cross = x + i;
|
||||||
|
y_cross = y;
|
||||||
|
if (T_CADRE(x_cross, y_cross))
|
||||||
|
invertPixel(x_cross, y_cross);
|
||||||
|
x_cross = x - i;
|
||||||
|
|
||||||
|
if (T_CADRE(x_cross, y_cross))
|
||||||
|
invertPixel(x_cross, y_cross);
|
||||||
|
x_cross = x;
|
||||||
|
y_cross = y - i;
|
||||||
|
if (T_CADRE(x_cross, y_cross))
|
||||||
|
invertPixel(x_cross, y_cross);
|
||||||
|
|
||||||
|
y_cross = y + i;
|
||||||
|
if (T_CADRE(x_cross, y_cross))
|
||||||
|
invertPixel(x_cross, y_cross);
|
||||||
|
|
||||||
|
x_cross = x + i + 1;
|
||||||
|
y_cross = y;
|
||||||
|
if (T_CADRE(x_cross, y_cross))
|
||||||
|
myRPutPixel(x_cross, y_cross, color);
|
||||||
|
x_cross = x - i - 1;
|
||||||
|
|
||||||
|
if (T_CADRE(x_cross, y_cross))
|
||||||
|
myRPutPixel(x_cross, y_cross, color);
|
||||||
|
x_cross = x;
|
||||||
|
y_cross = y - i - 1;
|
||||||
|
if (T_CADRE(x_cross, y_cross))
|
||||||
|
myRPutPixel(x_cross, y_cross, color);
|
||||||
|
|
||||||
|
y_cross = y + i + 1;
|
||||||
|
if (T_CADRE(x_cross, y_cross))
|
||||||
|
myRPutPixel(x_cross, y_cross, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void getquarter(RImage * image, int x, int y, MPO * m[4], int dx,
|
||||||
|
int dy)
|
||||||
{
|
{
|
||||||
int xx;
|
int xx;
|
||||||
register int ofs;
|
register int ofs;
|
||||||
|
@ -88,29 +236,29 @@ static void getquarter(RImage * image, int x, int y, MPO * m[4], int dx, int dy)
|
||||||
x %= image->width;
|
x %= image->width;
|
||||||
xx = x;
|
xx = x;
|
||||||
y %= image->height;
|
y %= image->height;
|
||||||
ofs = y * image->width + x;
|
ofs = (y * image->width + x) * 3;
|
||||||
m[0]->r = image->data[0][ofs];
|
m[0]->r = image->data[ofs++];
|
||||||
m[0]->g = image->data[1][ofs];
|
m[0]->g = image->data[ofs++];
|
||||||
m[0]->b = image->data[2][ofs];
|
m[0]->b = image->data[ofs];
|
||||||
|
|
||||||
xx++;
|
xx++;
|
||||||
xx %= image->width;
|
xx %= image->width;
|
||||||
ofs = y * image->width + xx;
|
ofs = (y * image->width + xx) * 3;
|
||||||
m[1]->r = image->data[0][ofs];
|
m[1]->r = image->data[ofs++];
|
||||||
m[1]->g = image->data[1][ofs];
|
m[1]->g = image->data[ofs++];
|
||||||
m[1]->b = image->data[2][ofs];
|
m[1]->b = image->data[ofs];
|
||||||
|
|
||||||
y++;
|
y++;
|
||||||
y %= image->height;
|
y %= image->height;
|
||||||
ofs = y * image->width + x;
|
ofs = (y * image->width + x) * 3;
|
||||||
m[2]->r = image->data[0][ofs];
|
m[2]->r = image->data[ofs++];
|
||||||
m[2]->g = image->data[1][ofs];
|
m[2]->g = image->data[ofs++];
|
||||||
m[2]->b = image->data[2][ofs];
|
m[2]->b = image->data[ofs];
|
||||||
|
|
||||||
ofs = y * image->width + xx;
|
ofs = (y * image->width + xx) * 3;
|
||||||
m[3]->r = image->data[0][ofs];
|
m[3]->r = image->data[ofs++];
|
||||||
m[3]->g = image->data[1][ofs];
|
m[3]->g = image->data[ofs++];
|
||||||
m[3]->b = image->data[2][ofs];
|
m[3]->b = image->data[ofs];
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -151,7 +299,15 @@ static void getquarter(RImage * image, int x, int y, MPO * m[4], int dx, int dy)
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* ------------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void calcDistance()
|
void calcDistance()
|
||||||
{
|
{
|
||||||
double tan_a;
|
double tan_a;
|
||||||
|
@ -165,7 +321,15 @@ void calcDistance()
|
||||||
solution = FALSE;
|
solution = FALSE;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* ------------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void renderFrame()
|
void renderFrame()
|
||||||
{
|
{
|
||||||
int py, px;
|
int py, px;
|
||||||
|
@ -181,7 +345,7 @@ void renderFrame()
|
||||||
|
|
||||||
double a; /* coeff. of quardatic equation */
|
double a; /* coeff. of quardatic equation */
|
||||||
|
|
||||||
double radikand;
|
double udroot; /* racine */
|
||||||
double wurzel;
|
double wurzel;
|
||||||
double r; /* r' */
|
double r; /* r' */
|
||||||
|
|
||||||
|
@ -218,7 +382,6 @@ void renderFrame()
|
||||||
*/
|
*/
|
||||||
if (solution == FALSE)
|
if (solution == FALSE)
|
||||||
RClearImage(small, &noir);
|
RClearImage(small, &noir);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* rotation matrix
|
* rotation matrix
|
||||||
*/
|
*/
|
||||||
|
@ -238,9 +401,10 @@ void renderFrame()
|
||||||
*/
|
*/
|
||||||
if (solution == FALSE) {
|
if (solution == FALSE) {
|
||||||
b_coef = 2 * center_dist * dir_z;
|
b_coef = 2 * center_dist * dir_z;
|
||||||
radius_proj = (int) sqrt(b_coef * b_coef / (4 * c_coef) - dir_z * dir_z) + 1;
|
radius_proj =
|
||||||
|
(int) sqrt(b_coef * b_coef / (4 * c_coef) - dir_z * dir_z) + 1;
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------------------------------------*/
|
|
||||||
if (fun) {
|
if (fun) {
|
||||||
starty = DIAMETRE / 2 - radius_proj - 3;
|
starty = DIAMETRE / 2 - radius_proj - 3;
|
||||||
endy = DIAMETRE - starty - 1;
|
endy = DIAMETRE - starty - 1;
|
||||||
|
@ -253,12 +417,24 @@ void renderFrame()
|
||||||
if ((double) endy > (double) (DIAMETRE - 1 - funy))
|
if ((double) endy > (double) (DIAMETRE - 1 - funy))
|
||||||
endy = DIAMETRE - 1 - funy;
|
endy = DIAMETRE - 1 - funy;
|
||||||
|
|
||||||
|
if (solution == FALSE) {
|
||||||
|
int i, j;
|
||||||
|
if (starty + funy > 0)
|
||||||
|
for (j = 0; j < starty + funy; j++)
|
||||||
|
for (i = 0; i < DIAMETRE; i++)
|
||||||
|
tabsolu[i][j] = 0;
|
||||||
|
if (endy + 1 + funy <= DIAMETRE - 1)
|
||||||
|
for (j = endy + funy + 1; j < DIAMETRE; j++)
|
||||||
|
for (i = 0; i < DIAMETRE; i++)
|
||||||
|
tabsolu[i][j] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
for (py = starty; py <= endy; py++) {
|
for (py = starty; py <= endy; py++) {
|
||||||
|
|
||||||
startx = DIAMETRE / 2 - 6 -
|
startx = DIAMETRE / 2 - 6 -
|
||||||
(int) sqrt(radius_proj * radius_proj -
|
(int) sqrt(MAX((radius_proj * radius_proj -
|
||||||
(py - DIAMETRE / 2) *
|
(py - DIAMETRE / 2) *
|
||||||
(py - DIAMETRE / 2));
|
(py - DIAMETRE / 2)), 0.0));
|
||||||
|
|
||||||
endx = DIAMETRE - startx - 1;
|
endx = DIAMETRE - startx - 1;
|
||||||
if ((double) startx < (double) (-funx))
|
if ((double) startx < (double) (-funx))
|
||||||
|
@ -272,34 +448,51 @@ void renderFrame()
|
||||||
if ((double) endx > (double) (DIAMETRE - 1 - funx))
|
if ((double) endx > (double) (DIAMETRE - 1 - funx))
|
||||||
endx = DIAMETRE - 1 - funx;
|
endx = DIAMETRE - 1 - funx;
|
||||||
|
|
||||||
|
if (solution == FALSE) {
|
||||||
|
int i;
|
||||||
|
if (startx + funx > 0)
|
||||||
|
for (i = 0; i < startx + funx; i++)
|
||||||
|
tabsolu[i][py + funy] = 0;
|
||||||
|
if (endx + 1 + funx <= DIAMETRE - 1)
|
||||||
|
for (i = endx + 1 + funx; i < DIAMETRE; i++)
|
||||||
|
tabsolu[i][py + funy] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* calculate offset into image data
|
* calculate offset into image data
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (px = startx; px <= endx; px++) {
|
for (px = startx; px <= endx; px++) {
|
||||||
|
if (solution == FALSE) {
|
||||||
dir_x = (double) px - DIAMETRE / 2 + 0.5;
|
dir_x = (double) px - DIAMETRE / 2 + 0.5;
|
||||||
dir_y = -(double) py + DIAMETRE / 2 - 0.5;
|
dir_y = -(double) py + DIAMETRE / 2 - 0.5;
|
||||||
|
|
||||||
a = dir_x * dir_x + dir_y * dir_y + dir_z * dir_z;
|
a = dir_x * dir_x + dir_y * dir_y + dir_z * dir_z;
|
||||||
/*
|
|
||||||
* c constant, see above
|
|
||||||
*/
|
|
||||||
radikand = b_coef * b_coef - 4 * a * c_coef; /*what's under the sq.root when solving the
|
|
||||||
quadratic equation */
|
|
||||||
|
|
||||||
if (radikand >= 0.0) { /* solution exists <=> intersection */
|
udroot = b_coef * b_coef - 4 * a * c_coef; /*what's under the
|
||||||
|
sq.root when solving the quadratic equation */
|
||||||
wurzel = sqrt(radikand);
|
if (udroot >= 0) {
|
||||||
|
tabsolu[px + funx][py + funy] = 1;
|
||||||
|
wurzel = sqrt(udroot);
|
||||||
s1 = (-b_coef + wurzel) / (2. * a);
|
s1 = (-b_coef + wurzel) / (2. * a);
|
||||||
s2 = (-b_coef - wurzel) / (2. * a);
|
s2 = (-b_coef - wurzel) / (2. * a);
|
||||||
s = (s1 < s2) ? s1 : s2; /* smaller solution belongs to nearer
|
s = (s1 < s2) ? s1 : s2; /* smaller solution belongs
|
||||||
* intersection */
|
to nearer intersection */
|
||||||
|
solu[px + funx][py + funy][0] = s * dir_x;
|
||||||
|
solu[px + funx][py + funy][1] = s * dir_y;
|
||||||
|
solu[px + funx][py + funy][2] =
|
||||||
|
center_dist + s * dir_z;
|
||||||
|
} else {
|
||||||
|
tabsolu[px + funx][py + funy] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tabsolu[px + funx][py + funy]) { /* solution exists <=>
|
||||||
sp_x = s * dir_x; /* sp = camera pos + s*dir */
|
intersection exists */
|
||||||
sp_y = s * dir_y;
|
sp_x = solu[px + funx][py + funy][0]; /* sp = camera pos + s*dir */
|
||||||
sp_z = center_dist + s * dir_z;
|
sp_y = solu[px + funx][py + funy][1];
|
||||||
|
sp_z = solu[px + funx][py + funy][2];
|
||||||
|
|
||||||
hit_x = m11 * sp_x + m12 * sp_y + m13 * sp_z;
|
hit_x = m11 * sp_x + m12 * sp_y + m13 * sp_z;
|
||||||
hit_y = m22 * sp_y + m23 * sp_z;
|
hit_y = m22 * sp_y + m23 * sp_z;
|
||||||
|
@ -330,19 +523,26 @@ void renderFrame()
|
||||||
latitude = atan(-hit_y / r);
|
latitude = atan(-hit_y / r);
|
||||||
|
|
||||||
light_angle =
|
light_angle =
|
||||||
(light_x * hit_x + light_y * hit_y + light_z * hit_z) / radius;
|
(light_x * hit_x + light_y * hit_y +
|
||||||
|
light_z * hit_z) / radius;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set pixel in image
|
* Set pixel in image
|
||||||
*/
|
*/
|
||||||
|
|
||||||
teinte = mygetMapColorLinear(longitude, latitude, light_angle);
|
teinte =
|
||||||
|
mygetMapColorLinear(longitude, latitude,
|
||||||
|
light_angle);
|
||||||
|
/* here dont use myRPutPixel since we prefer some
|
||||||
|
error detection about limits */
|
||||||
RPutPixel(small, px + funx, py + funy, &teinte);
|
RPutPixel(small, px + funx, py + funy, &teinte);
|
||||||
}
|
}
|
||||||
} /*px */
|
} /*px */
|
||||||
} /*py */
|
} /*py */
|
||||||
|
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*** not fun : ***/
|
/*** not fun : ***/
|
||||||
else {
|
else {
|
||||||
starty = DIAMETRE / 2 - radius_proj - 3;
|
starty = DIAMETRE / 2 - radius_proj - 3;
|
||||||
|
@ -351,15 +551,36 @@ void renderFrame()
|
||||||
/*
|
/*
|
||||||
* py 0 to 63 max
|
* py 0 to 63 max
|
||||||
*/
|
*/
|
||||||
|
if (solution == FALSE) {
|
||||||
|
int i, j;
|
||||||
|
if (starty > 0)
|
||||||
|
for (j = 0; j < starty; j++)
|
||||||
|
for (i = 0; i < DIAMETRE; i++)
|
||||||
|
tabsolu[i][j] = 0;
|
||||||
|
if (endy + 1 <= DIAMETRE - 1)
|
||||||
|
for (j = endy + 1; j < DIAMETRE; j++)
|
||||||
|
for (i = 0; i < DIAMETRE; i++)
|
||||||
|
tabsolu[i][j] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
for (py = starty; py <= endy; py++) {
|
for (py = starty; py <= endy; py++) {
|
||||||
startx = DIAMETRE / 2 - 6 -
|
startx = DIAMETRE / 2 - 6 -
|
||||||
(int) sqrt(radius_proj * radius_proj -
|
(int) sqrt(MAX((radius_proj * radius_proj -
|
||||||
(py - DIAMETRE / 2) *
|
(py - DIAMETRE / 2) *
|
||||||
(py - DIAMETRE / 2));
|
(py - DIAMETRE / 2)), 0.0));
|
||||||
startx = (startx < 0) ? 0 : startx;
|
startx = (startx < 0) ? 0 : startx;
|
||||||
/*
|
/*
|
||||||
* 0<= startx <=31
|
* 0<= startx <=31
|
||||||
*/
|
*/
|
||||||
|
if (solution == FALSE) {
|
||||||
|
int i;
|
||||||
|
if (startx > 0)
|
||||||
|
for (i = 0; i < startx; i++) {
|
||||||
|
tabsolu[i][py] = 0;
|
||||||
|
tabsolu[DIAMETRE - 1 - i][py] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (px = startx; px < DIAMETRE / 2; px++) {
|
for (px = startx; px < DIAMETRE / 2; px++) {
|
||||||
if (solution == FALSE) {
|
if (solution == FALSE) {
|
||||||
|
@ -369,28 +590,32 @@ void renderFrame()
|
||||||
|
|
||||||
a = dir_x * dir_x + dir_y * dir_y + dir_z * dir_z;
|
a = dir_x * dir_x + dir_y * dir_y + dir_z * dir_z;
|
||||||
|
|
||||||
|
|
||||||
soluce[px][py][0] = b_coef * b_coef - 4 * a * c_coef;
|
|
||||||
/*what's under the sq.root when solving the
|
/*what's under the sq.root when solving the
|
||||||
quadratic equation */
|
quadratic equation */
|
||||||
|
udroot = b_coef * b_coef - 4 * a * c_coef;
|
||||||
}
|
if (udroot >= 0) {
|
||||||
if (soluce[px][py][0] >= 0.0) { /* solution exists <=> intersection */
|
tabsolu[px][py] = 1;
|
||||||
|
tabsolu[DIAMETRE - 1 - px][py] = 1;
|
||||||
if (solution == FALSE) {
|
wurzel = sqrt(udroot);
|
||||||
wurzel = sqrt(soluce[px][py][0]);
|
|
||||||
s1 = (-b_coef + wurzel) / (2. * a);
|
s1 = (-b_coef + wurzel) / (2. * a);
|
||||||
s2 = (-b_coef - wurzel) / (2. * a);
|
s2 = (-b_coef - wurzel) / (2. * a);
|
||||||
s = (s1 < s2) ? s1 : s2; /* smaller solution belongs to nearer
|
s = (s1 < s2) ? s1 : s2; /* smaller solution
|
||||||
* intersection */
|
belongs to nearer
|
||||||
|
intersection */
|
||||||
soluce[px][py][1] = s * dir_x; /* sp = camera pos + s*dir */
|
/* sp = camera pos + s*dir */
|
||||||
soluce[px][py][2] = s * dir_y;
|
solu[px][py][0] = s * dir_x;
|
||||||
soluce[px][py][3] = center_dist + s * dir_z;
|
solu[px][py][1] = s * dir_y;
|
||||||
|
solu[px][py][2] = center_dist + s * dir_z;
|
||||||
|
} else {
|
||||||
|
tabsolu[px][py] = 0;
|
||||||
|
tabsolu[DIAMETRE - 1 - px][py] = 0;
|
||||||
}
|
}
|
||||||
sp_x = soluce[px][py][1];
|
}
|
||||||
sp_y = soluce[px][py][2];
|
if (tabsolu[px][py]) { /* solution exists <=>
|
||||||
sp_z = soluce[px][py][3];
|
intersection exists */
|
||||||
|
sp_x = solu[px][py][0];
|
||||||
|
sp_y = solu[px][py][1];
|
||||||
|
sp_z = solu[px][py][2];
|
||||||
hit_x = m11 * sp_x + m12 * sp_y + m13 * sp_z;
|
hit_x = m11 * sp_x + m12 * sp_y + m13 * sp_z;
|
||||||
hit_y = m22 * sp_y + m23 * sp_z;
|
hit_y = m22 * sp_y + m23 * sp_z;
|
||||||
hit_z = m31 * sp_x + m32 * sp_y + m33 * sp_z;
|
hit_z = m31 * sp_x + m32 * sp_y + m33 * sp_z;
|
||||||
|
@ -405,10 +630,12 @@ void renderFrame()
|
||||||
minhz = hit_z;
|
minhz = hit_z;
|
||||||
fprintf(stdout, "should >>0 : hit_z %f\n", hit_z);
|
fprintf(stdout, "should >>0 : hit_z %f\n", hit_z);
|
||||||
fprintf(stdout, " hit_x %f\n", hit_x);
|
fprintf(stdout, " hit_x %f\n", hit_x);
|
||||||
fprintf(stdout, " ratio %f\n", hit_x / hit_z);
|
fprintf(stdout, " ratio %f\n",
|
||||||
fprintf(stdout, " long %f\n", atan(hit_x / hit_z));
|
hit_x / hit_z);
|
||||||
|
fprintf(stdout, " long %f\n",
|
||||||
|
atan(hit_x / hit_z));
|
||||||
|
|
||||||
sleep(5);
|
sleep(1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (ABS(hit_z) < 0.001) {
|
if (ABS(hit_z) < 0.001) {
|
||||||
|
@ -432,24 +659,31 @@ void renderFrame()
|
||||||
latitude = atan(-hit_y / r);
|
latitude = atan(-hit_y / r);
|
||||||
|
|
||||||
light_angle =
|
light_angle =
|
||||||
(light_x * hit_x + light_y * hit_y + light_z * hit_z) / radius;
|
(light_x * hit_x + light_y * hit_y +
|
||||||
|
light_z * hit_z) / radius;
|
||||||
if (sens == 1) {
|
if (sens == 1) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set pixel in image
|
* Set pixel in image
|
||||||
*/
|
*/
|
||||||
|
|
||||||
teinte = mygetMapColorLinear(longitude, latitude, light_angle);
|
teinte =
|
||||||
|
mygetMapColorLinear(longitude, latitude,
|
||||||
|
light_angle);
|
||||||
myRPutPixel(px, py, &teinte);
|
myRPutPixel(px, py, &teinte);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* mirror the left half-circle of the globe: we need a new position
|
* mirror the left half-circle of the globe:
|
||||||
* and have to recalc. the light intensity
|
* we need a new position and have to recalc. the
|
||||||
|
* light intensity
|
||||||
*/
|
*/
|
||||||
|
|
||||||
light_angle =
|
light_angle =
|
||||||
(light_x * hit2_x + light_y * hit2_y + light_z * hit2_z) / radius;
|
(light_x * hit2_x + light_y * hit2_y +
|
||||||
teinte = mygetMapColorLinear(2 * v_long - longitude, latitude, light_angle);
|
light_z * hit2_z) / radius;
|
||||||
|
teinte =
|
||||||
|
mygetMapColorLinear(2 * v_long - longitude,
|
||||||
|
latitude, light_angle);
|
||||||
myRPutPixel(DIAMETRE - px - 1, py, &teinte);
|
myRPutPixel(DIAMETRE - px - 1, py, &teinte);
|
||||||
} else {
|
} else {
|
||||||
/* sens==-1 */
|
/* sens==-1 */
|
||||||
|
@ -457,27 +691,82 @@ void renderFrame()
|
||||||
* Set pixel in image
|
* Set pixel in image
|
||||||
*/
|
*/
|
||||||
|
|
||||||
teinte = mygetMapColorLinear(longitude, latitude, light_angle);
|
teinte =
|
||||||
myRPutPixel(DIAMETRE - px - 1, DIAMETRE - py - 1, &teinte);
|
mygetMapColorLinear(longitude, latitude,
|
||||||
|
light_angle);
|
||||||
|
myRPutPixel(DIAMETRE - px - 1, DIAMETRE - py - 1,
|
||||||
|
&teinte);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* mirror the left half-circle of the globe: we need a new position
|
* mirror the left half-circle of the globe:
|
||||||
* and have to recalc. the light intensity
|
* we need a new position and have
|
||||||
|
* to recalc. the light intensity
|
||||||
*/
|
*/
|
||||||
|
|
||||||
light_angle =
|
light_angle =
|
||||||
(light_x * hit2_x + light_y * hit2_y + light_z * hit2_z) / radius;
|
(light_x * hit2_x + light_y * hit2_y +
|
||||||
teinte = mygetMapColorLinear(2 * v_long - longitude, latitude, light_angle);
|
light_z * hit2_z) / radius;
|
||||||
|
teinte =
|
||||||
|
mygetMapColorLinear(2 * v_long - longitude,
|
||||||
|
latitude, light_angle);
|
||||||
myRPutPixel(px, DIAMETRE - py - 1, &teinte);
|
myRPutPixel(px, DIAMETRE - py - 1, &teinte);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} /*px */
|
} /*px */
|
||||||
} /*py */
|
} /*py */
|
||||||
|
|
||||||
|
|
||||||
} /*else fun */
|
} /*else fun */
|
||||||
|
#if WITH_MARKERS
|
||||||
|
/* markers */
|
||||||
|
if (nb_marker) {
|
||||||
|
int i;
|
||||||
|
double mx, my, mz;
|
||||||
|
|
||||||
|
for (i = 0; i < nb_marker; i++) {
|
||||||
|
|
||||||
|
mx = m11 * marker[i][0] + m31 * marker[i][2];
|
||||||
|
mz = -m31 * marker[i][0] + m11 * marker[i][2];
|
||||||
|
my = m22 * marker[i][1] - m23 * mz;
|
||||||
|
mz = m23 * marker[i][1] + m22 * mz;
|
||||||
|
|
||||||
|
if (mz > 0) {
|
||||||
|
if (i == sun_marker) {
|
||||||
|
put_dot_cross((int)
|
||||||
|
(mx * radius_proj + DIAMETRE / 2 + funx),
|
||||||
|
(int) (-my * radius_proj + DIAMETRE / 2 +
|
||||||
|
funy), &sun_col);
|
||||||
|
} else if (i == moon_marker) {
|
||||||
|
put_dot_cross((int)
|
||||||
|
(mx * radius_proj + DIAMETRE / 2 + funx),
|
||||||
|
(int) (-my * radius_proj + DIAMETRE / 2 +
|
||||||
|
funy), &moon_col);
|
||||||
|
} else {
|
||||||
|
put_cross((int)
|
||||||
|
(mx * radius_proj + DIAMETRE / 2 + funx),
|
||||||
|
(int) (-my * radius_proj + DIAMETRE / 2 +
|
||||||
|
funy));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
solution = TRUE;
|
solution = TRUE;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/*------------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static RColor
|
static RColor
|
||||||
mygetMapColorLinear(double longitude, double latitude, double angle)
|
mygetMapColorLinear(double longitude, double latitude, double angle)
|
||||||
{
|
{
|
||||||
|
@ -520,9 +809,15 @@ static RColor
|
||||||
} else {
|
} else {
|
||||||
getquarter(map, x, y, md, dx, dy);
|
getquarter(map, x, y, md, dx, dy);
|
||||||
if (ang > 0) {
|
if (ang > 0) {
|
||||||
md[0]->r = ((md[0]->r * aml + md[0]->r * ang / 256 * (256 - aml))) >> 8;
|
md[0]->r =
|
||||||
md[0]->g = ((md[0]->g * aml + md[0]->g * ang / 256 * (256 - aml))) >> 8;
|
((md[0]->r * aml +
|
||||||
md[0]->b = ((md[0]->b * aml + md[0]->b * ang / 256 * (256 - aml))) >> 8;
|
md[0]->r * ang / 256 * (256 - aml))) >> 8;
|
||||||
|
md[0]->g =
|
||||||
|
((md[0]->g * aml +
|
||||||
|
md[0]->g * ang / 256 * (256 - aml))) >> 8;
|
||||||
|
md[0]->b =
|
||||||
|
((md[0]->b * aml +
|
||||||
|
md[0]->b * ang / 256 * (256 - aml))) >> 8;
|
||||||
} else {
|
} else {
|
||||||
md[0]->r = (md[0]->r * aml) >> 8;
|
md[0]->r = (md[0]->r * aml) >> 8;
|
||||||
md[0]->g = (md[0]->g * aml) >> 8;
|
md[0]->g = (md[0]->g * aml) >> 8;
|
||||||
|
@ -533,31 +828,88 @@ static RColor
|
||||||
point.red = (unsigned char) md[0]->r;
|
point.red = (unsigned char) md[0]->r;
|
||||||
point.green = (unsigned char) md[0]->g;
|
point.green = (unsigned char) md[0]->g;
|
||||||
point.blue = (unsigned char) md[0]->b;
|
point.blue = (unsigned char) md[0]->b;
|
||||||
point.alpha = 255;
|
point.alpha = 255; /* in fun mode, we use original Rputpixel that need alpha?*/
|
||||||
return point;
|
return point;
|
||||||
}
|
}
|
||||||
/* ------------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void randomPosition()
|
static void randomPosition()
|
||||||
{
|
{
|
||||||
addlat = ((rand() % 30001) / 30000.) * 180. - 90.;
|
addlat = ((rand() % 30001) / 30000.) * 180. - 90.;
|
||||||
addlong = ((rand() % 30001) / 30000.) * 360. - 180.;
|
addlong = ((rand() % 30001) / 30000.) * 360. - 180.;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* ------------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void updateTime(int force)
|
static void updateTime(int force)
|
||||||
{
|
{
|
||||||
/* calcul of sun position every minute */
|
/* calcul of sun position every minute */
|
||||||
if ((trend.tv_sec - tsunpos) >= 60 || force) {
|
if ((trend.tv_sec - tsunpos) >= 60 || force) {
|
||||||
tsunpos = trend.tv_sec;
|
tsunpos = trend.tv_sec;
|
||||||
GetSunPos(tsunpos, &sun_lat, &sun_long);
|
sun_position(tsunpos, &sun_lat, &sun_long);
|
||||||
light_x = cos(sun_lat) * sin(sun_long);
|
light_x = cos(sun_lat) * sin(sun_long);
|
||||||
light_y = sin(sun_lat);
|
light_y = sin(sun_lat);
|
||||||
light_z = cos(sun_lat) * cos(sun_long);
|
light_z = cos(sun_lat) * cos(sun_long);
|
||||||
do_something = TRUE;
|
do_something = TRUE;
|
||||||
|
#if WITH_MARKERS
|
||||||
|
if (sun_marker >= 0) {
|
||||||
|
marker[sun_marker][0] = light_x;
|
||||||
|
marker[sun_marker][1] = light_y;
|
||||||
|
marker[sun_marker][2] = light_z;
|
||||||
|
}
|
||||||
|
/* ... and the moon position */
|
||||||
|
if (moon_marker >= 0 || p_type == PTMOON || force == STRONG) {
|
||||||
|
moon_position(tsunpos, &moon_lat, &moon_long);
|
||||||
|
if (moon_marker >= 0) {
|
||||||
|
marker[moon_marker][1] = moon_lat;
|
||||||
|
marker[moon_marker][0] = moon_long;
|
||||||
|
transform_marker(moon_marker);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* ------------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void transform_marker(int m)
|
||||||
|
{
|
||||||
|
/* long/lat => rotation matrix */
|
||||||
|
double dtmp1, dtmp2;
|
||||||
|
|
||||||
|
dtmp1 = sin(marker[m][0]) * cos(marker[m][1]);
|
||||||
|
dtmp2 = sin(marker[m][1]);
|
||||||
|
marker[m][2] = cos(marker[m][0]) * cos(marker[m][1]);
|
||||||
|
marker[m][0] = dtmp1;
|
||||||
|
marker[m][1] = dtmp2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void setViewPos(double lat, double lon)
|
void setViewPos(double lat, double lon)
|
||||||
{
|
{
|
||||||
double dif;
|
double dif;
|
||||||
|
@ -575,10 +927,11 @@ void setViewPos(double lat, double lon)
|
||||||
lat = 180. - lat;
|
lat = 180. - lat;
|
||||||
addlat += (lat - dif);
|
addlat += (lat - dif);
|
||||||
dlat *= -1;
|
dlat *= -1;
|
||||||
if (!fun) {
|
if (!fun && !stable) {
|
||||||
lon += 180.;
|
lon += 180.;
|
||||||
addlong += 180.;
|
addlong += 180.;
|
||||||
}
|
}
|
||||||
|
if (!stable)
|
||||||
sens *= -1;
|
sens *= -1;
|
||||||
}
|
}
|
||||||
if (lat <= -90.) {
|
if (lat <= -90.) {
|
||||||
|
@ -586,10 +939,11 @@ void setViewPos(double lat, double lon)
|
||||||
lat = -180. - lat;
|
lat = -180. - lat;
|
||||||
addlat += (lat - dif);
|
addlat += (lat - dif);
|
||||||
dlat *= -1;
|
dlat *= -1;
|
||||||
if (!fun) {
|
if (!fun && !stable) {
|
||||||
lon += 180.;
|
lon += 180.;
|
||||||
addlong += 180.;
|
addlong += 180.;
|
||||||
}
|
}
|
||||||
|
if (!stable)
|
||||||
sens *= -1;
|
sens *= -1;
|
||||||
}
|
}
|
||||||
if (lat >= 90.) {
|
if (lat >= 90.) {
|
||||||
|
@ -597,10 +951,11 @@ void setViewPos(double lat, double lon)
|
||||||
lat = 180. - lat;
|
lat = 180. - lat;
|
||||||
addlat += (lat - dif);
|
addlat += (lat - dif);
|
||||||
dlat *= -1;
|
dlat *= -1;
|
||||||
if (!fun) {
|
if (!fun && !stable) {
|
||||||
lon += 180.;
|
lon += 180.;
|
||||||
addlong += 180.;
|
addlong += 180.;
|
||||||
}
|
}
|
||||||
|
if (!stable)
|
||||||
sens *= -1;
|
sens *= -1;
|
||||||
}
|
}
|
||||||
if (lat <= -90.) {
|
if (lat <= -90.) {
|
||||||
|
@ -608,10 +963,11 @@ void setViewPos(double lat, double lon)
|
||||||
lat = -180. - lat;
|
lat = -180. - lat;
|
||||||
addlat += (lat - dif);
|
addlat += (lat - dif);
|
||||||
dlat *= -1;
|
dlat *= -1;
|
||||||
if (!fun) {
|
if (!fun && !stable) {
|
||||||
lon += 180.;
|
lon += 180.;
|
||||||
addlong += 180.;
|
addlong += 180.;
|
||||||
}
|
}
|
||||||
|
if (!stable)
|
||||||
sens *= -1;
|
sens *= -1;
|
||||||
}
|
}
|
||||||
while (lon >= 180.) {
|
while (lon >= 180.) {
|
||||||
|
@ -630,8 +986,15 @@ void setViewPos(double lat, double lon)
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* ------------------------------------------------------------------------ */
|
|
||||||
void recalc(int calme)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void recalc(int force)
|
||||||
{
|
{
|
||||||
double coeff, va, vo;
|
double coeff, va, vo;
|
||||||
struct timeval tv, tnow;
|
struct timeval tv, tnow;
|
||||||
|
@ -642,11 +1005,11 @@ void recalc(int calme)
|
||||||
|
|
||||||
if (firstTime) {
|
if (firstTime) {
|
||||||
firstTime = FALSE;
|
firstTime = FALSE;
|
||||||
updateTime(TRUE);
|
updateTime(STRONG);
|
||||||
} else {
|
} else {
|
||||||
coeff = (double) tv.tv_sec + tv.tv_usec / 1000000.;
|
coeff = (double) tv.tv_sec + tv.tv_usec / 1000000.;
|
||||||
|
|
||||||
if (!calme) {
|
if (!force) {
|
||||||
/** while !clic button rotate earth **/
|
/** while !clic button rotate earth **/
|
||||||
addlat += dlat * coeff;
|
addlat += dlat * coeff;
|
||||||
addlong += dlong * coeff;
|
addlong += dlong * coeff;
|
||||||
|
@ -658,23 +1021,46 @@ void recalc(int calme)
|
||||||
old_dvlat = addlat;
|
old_dvlat = addlat;
|
||||||
do_something = TRUE;
|
do_something = TRUE;
|
||||||
}
|
}
|
||||||
if (calme && p_type == PTSUNREL) {
|
#if WITH_MARKERS
|
||||||
|
if (force) {
|
||||||
|
if (p_type == PTSUN) {
|
||||||
va = sun_lat * 180. / PI;
|
va = sun_lat * 180. / PI;
|
||||||
vo = sun_long * 180. / PI;
|
vo = sun_long * 180. / PI;
|
||||||
updateTime(TRUE);
|
updateTime(TRUE);
|
||||||
addlat -= sun_lat * 180. / PI - va;
|
addlat -= sun_lat * 180. / PI - va;
|
||||||
addlong -= sun_long * 180. / PI - vo;
|
addlong -= sun_long * 180. / PI - vo;
|
||||||
|
} else if (p_type == PTMOON) {
|
||||||
|
va = moon_lat * 180. / PI;
|
||||||
|
vo = moon_long * 180. / PI;
|
||||||
|
updateTime(TRUE);
|
||||||
|
addlat -= moon_lat * 180. / PI - va;
|
||||||
|
addlong -= moon_long * 180. / PI - vo;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (force && p_type == PTSUN) {
|
||||||
|
va = sun_lat * 180. / PI;
|
||||||
|
vo = sun_long * 180. / PI;
|
||||||
|
updateTime(TRUE);
|
||||||
|
addlat -= sun_lat * 180. / PI - va;
|
||||||
|
addlong -= sun_long * 180. / PI - vo;
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
updateTime(FALSE);
|
updateTime(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (do_something) {
|
if (do_something) {
|
||||||
switch (p_type) {
|
switch (p_type) {
|
||||||
case PTSUNREL:
|
case PTSUN:
|
||||||
setViewPos(sun_lat * 180. / PI + addlat,
|
setViewPos(sun_lat * 180. / PI + addlat,
|
||||||
sun_long * 180. / PI + addlong);
|
sun_long * 180. / PI + addlong);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#if WITH_MARKERS
|
||||||
|
case PTMOON:
|
||||||
|
setViewPos(moon_lat * 180. / PI + addlat,
|
||||||
|
moon_long * 180. / PI + addlong);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
case PTFIXED:
|
case PTFIXED:
|
||||||
setViewPos(addlat, addlong);
|
setViewPos(addlat, addlong);
|
||||||
break;
|
break;
|
||||||
|
@ -700,4 +1086,42 @@ void recalc(int calme)
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* ------------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* convert a 4 layers RGBA image to a 3 layer one */
|
||||||
|
int ripalpha(RImage * image)
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
unsigned char *d, *s, *old;
|
||||||
|
|
||||||
|
if (image == NULL)
|
||||||
|
return 0;
|
||||||
|
if (image->format == RRGBFormat)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
d = malloc(image->width * image->height * 3 + 4);
|
||||||
|
if (!d) {
|
||||||
|
RErrorCode = RERR_NOMEMORY;
|
||||||
|
puts("error in ripalpha");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
s = image->data;
|
||||||
|
old = image->data;
|
||||||
|
image->data = d;
|
||||||
|
image->format = RRGBFormat;
|
||||||
|
for (y = 0; y < image->height; y++) {
|
||||||
|
for (x = 0; x < image->width; x++) {
|
||||||
|
*d++ = *s++;
|
||||||
|
*d++ = *s++;
|
||||||
|
*d++ = *s++;
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(old);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
@ -120,10 +150,29 @@ static double solve_keplers_equation(double M)
|
||||||
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)
|
||||||
|
@ -139,16 +188,10 @@ static double sun_ecliptic_longitude(time_t ssue)
|
||||||
D = DaysSinceEpoch(ssue);
|
D = DaysSinceEpoch(ssue);
|
||||||
|
|
||||||
N = RadsPerDay * D;
|
N = RadsPerDay * D;
|
||||||
N = fmod(N, TWOPI);
|
M_sun = mean_sun(D);
|
||||||
if (N < 0)
|
|
||||||
N += TWOPI;
|
|
||||||
|
|
||||||
M_sun = N + Epsilon_g - OmegaBar_g;
|
|
||||||
if (M_sun < 0)
|
|
||||||
M_sun += TWOPI;
|
|
||||||
|
|
||||||
E = solve_keplers_equation(M_sun);
|
E = solve_keplers_equation(M_sun);
|
||||||
v = 2 * atan(sqrt((1 + Eccentricity) / (1 - Eccentricity)) * tan(E / 2));
|
v = 2 * atan(sqrt((1 + Eccentricity) / (1 - Eccentricity)) *
|
||||||
|
tan(E / 2));
|
||||||
|
|
||||||
return (v + OmegaBar_g);
|
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
|
||||||
|
@ -251,10 +295,10 @@ 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;
|
||||||
|
@ -264,15 +308,54 @@ void GetSunPos(time_t ssue, double *lat, double *lon)
|
||||||
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
|
|
||||||
tmp += TWOPI;
|
|
||||||
while (tmp < -PI);
|
|
||||||
} else if (tmp > PI) {
|
|
||||||
do
|
|
||||||
tmp -= TWOPI;
|
|
||||||
while (tmp < -PI);
|
|
||||||
}
|
|
||||||
*lon = tmp;
|
*lon = tmp;
|
||||||
*lat = delta;
|
*lat = delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* given a particular time (expressed in seconds since the unix
|
||||||
|
* epoch), compute position on the earth (lat, lon) such that the
|
||||||
|
* moon is directly overhead.
|
||||||
|
*
|
||||||
|
* 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,7 +35,9 @@
|
||||||
#include "defnimap.xpm"
|
#include "defnimap.xpm"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/***************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
@ -81,6 +83,18 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
cmdline(argc, argv);
|
cmdline(argc, argv);
|
||||||
|
|
||||||
|
#if WITH_MARKERS
|
||||||
|
if (nb_marker) {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < nb_marker; i++)
|
||||||
|
if (i != moon_marker && i != sun_marker) {
|
||||||
|
marker[i][0] = marker[i][0] * PI / 180.;
|
||||||
|
marker[i][1] = marker[i][1] * PI / 180.;
|
||||||
|
transform_marker(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (typecadre) {
|
switch (typecadre) {
|
||||||
case 1:
|
case 1:
|
||||||
rond_bits = cadre1_bits;
|
rond_bits = cadre1_bits;
|
||||||
|
@ -95,13 +109,17 @@ int main(int argc, char *argv[])
|
||||||
dlat = 0;
|
dlat = 0;
|
||||||
dlong = 0;
|
dlong = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* setup long term mem allocation */
|
||||||
initmyconvert();
|
initmyconvert();
|
||||||
|
|
||||||
|
|
||||||
tdelay.tv_sec = (int) floor(delay);
|
tdelay.tv_sec = (int) floor(delay);
|
||||||
tdelay.tv_usec = (int) ((delay - tdelay.tv_sec) * 1000000);
|
tdelay.tv_usec = (int) ((delay - tdelay.tv_sec) * 1000000);
|
||||||
aml = (int) floor(ambient_light * 256);
|
aml = (int) floor(ambient_light * 256);
|
||||||
|
|
||||||
/****************************************************************************/
|
|
||||||
|
/* ctx initialization */
|
||||||
|
|
||||||
if (!(dpy = XOpenDisplay(dpy_name))) {
|
if (!(dpy = XOpenDisplay(dpy_name))) {
|
||||||
fprintf(stderr, "%s: can't open display \"%s\"\n",
|
fprintf(stderr, "%s: can't open display \"%s\"\n",
|
||||||
|
@ -112,7 +130,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
if (ctx->attribs->use_shared_memory) {
|
if (ctx->attribs->use_shared_memory) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stdout, "enleve les flags use_shared_memory\n");
|
fprintf(stdout, "remove flags use_shared_memory\n");
|
||||||
#endif
|
#endif
|
||||||
ctx->attribs->flags ^= RC_UseSharedMemory;
|
ctx->attribs->flags ^= RC_UseSharedMemory;
|
||||||
ctx->attribs->use_shared_memory = FALSE;
|
ctx->attribs->use_shared_memory = FALSE;
|
||||||
|
@ -125,11 +143,13 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* loading maps .............
|
* loading maps .............
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (dayfile != NULL) {
|
if (dayfile != NULL) {
|
||||||
map = RLoadImage(ctx, dayfile, 0);
|
map = RLoadImage(ctx, dayfile, 0);
|
||||||
|
if (!use_default_nightmap)
|
||||||
|
use_nightmap = FALSE;
|
||||||
|
ripalpha(map);
|
||||||
if (!map) {
|
if (!map) {
|
||||||
fprintf(stdout, "pb map ! file not found ?\n");
|
fprintf(stdout, "pb map ! file not found ?\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
|
@ -137,43 +157,62 @@ int main(int argc, char *argv[])
|
||||||
} else {
|
} else {
|
||||||
#ifdef DEFMAPOK
|
#ifdef DEFMAPOK
|
||||||
map = RGetImageFromXPMData(ctx, defmap_xpm);
|
map = RGetImageFromXPMData(ctx, defmap_xpm);
|
||||||
|
use_default_nightmap = TRUE;
|
||||||
|
ripalpha(map);
|
||||||
if (!map) {
|
if (!map) {
|
||||||
fprintf(stdout, "pb def map ! file not found ?\n");
|
fprintf(stdout, "pb def map ! file not found ?\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
nightfile = NULL;
|
|
||||||
use_nightmap = TRUE;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
fprintf(stdout, "need a map !\n");
|
fprintf(stdout, "need a map !\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
if (!oknimap) {
|
||||||
|
use_nightmap = FALSE;
|
||||||
|
use_default_nightmap = FALSE;
|
||||||
|
}
|
||||||
if (use_nightmap) {
|
if (use_nightmap) {
|
||||||
if (nightfile != NULL) {
|
if (nightfile != NULL) {
|
||||||
mapnight = RLoadImage(ctx, nightfile, 0);
|
mapnight = RLoadImage(ctx, nightfile, 0);
|
||||||
|
ripalpha(mapnight);
|
||||||
if (!mapnight) {
|
if (!mapnight) {
|
||||||
fprintf(stdout, "pb map night! file not found ?\n");
|
fprintf(stdout, "pb map night! file not found ?\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
#ifdef DEFMAPOK
|
#ifdef DEFMAPOK
|
||||||
|
if (use_default_nightmap) {
|
||||||
mapnight = RGetImageFromXPMData(ctx, defnimap_xpm);
|
mapnight = RGetImageFromXPMData(ctx, defnimap_xpm);
|
||||||
|
ripalpha(mapnight);
|
||||||
if (!mapnight) {
|
if (!mapnight) {
|
||||||
fprintf(stdout, "pb def map night ! file not found ?\n");
|
fprintf(stdout,
|
||||||
|
"pb def map night ! file not found ?\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
/* not very useful... */
|
|
||||||
use_nightmap = FALSE;
|
use_nightmap = FALSE;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
use_nmap_ini = use_nightmap;
|
use_nmap_ini = use_nightmap;
|
||||||
if (!oknimap)
|
|
||||||
use_nightmap = FALSE;
|
/* we need a night map of same size as day map */
|
||||||
|
if (mapnight) {
|
||||||
|
if ((mapnight->width != map->width)
|
||||||
|
|| (mapnight->height != map->height)) {
|
||||||
|
RImage *tmp;
|
||||||
|
tmp = mapnight;
|
||||||
|
mapnight = RScaleImage(tmp, map->width, map->height);
|
||||||
|
RReleaseImage(tmp);
|
||||||
|
ripalpha(mapnight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* 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;
|
||||||
|
@ -181,25 +220,22 @@ int main(int argc, char *argv[])
|
||||||
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
|
||||||
*/
|
*/
|
||||||
|
rotation_terre(DIAMETRE / 2, DIAMETRE / 2, 0);
|
||||||
recalc(0);
|
recalc(0);
|
||||||
do_something = FALSE;
|
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)) {
|
if (!RConvertImage(ctx, small, &pix)) {
|
||||||
|
@ -233,16 +269,21 @@ int main(int argc, char *argv[])
|
||||||
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, &mysizehints.height, &dummy);
|
||||||
mysizehints.width = DIAMETRE;
|
mysizehints.width = DIAMETRE;
|
||||||
mysizehints.height = 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);
|
||||||
|
@ -250,8 +291,12 @@ int main(int argc, char *argv[])
|
||||||
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);
|
||||||
|
@ -269,9 +314,12 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
/* 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);
|
||||||
|
XShapeCombineMask(dpy, iconwin, ShapeBounding, 0, 0, pixmask,
|
||||||
|
ShapeSet);
|
||||||
}
|
}
|
||||||
/* ONLYSHAPE OFF */
|
/* ONLYSHAPE OFF */
|
||||||
|
|
||||||
|
@ -280,18 +328,17 @@ int main(int argc, char *argv[])
|
||||||
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);
|
||||||
|
|
||||||
|
@ -355,7 +402,8 @@ int main(int argc, char *argv[])
|
||||||
if (wait_release) {
|
if (wait_release) {
|
||||||
usleep(2 * VAL_USLEEP_SHORT);
|
usleep(2 * VAL_USLEEP_SHORT);
|
||||||
if (redoaction == 1)
|
if (redoaction == 1)
|
||||||
rotation_terre(Event.xbutton.x, Event.xbutton.y, move_lat_flag);
|
rotation_terre(Event.xbutton.x, Event.xbutton.y,
|
||||||
|
move_lat_flag);
|
||||||
else
|
else
|
||||||
zooming(Event.xbutton.state & ShiftMask);
|
zooming(Event.xbutton.state & ShiftMask);
|
||||||
ok = TRUE;
|
ok = TRUE;
|
||||||
|
@ -365,8 +413,8 @@ int main(int argc, char *argv[])
|
||||||
recalc(redoaction == 1);
|
recalc(redoaction == 1);
|
||||||
if (do_something) {
|
if (do_something) {
|
||||||
if (!myRConvertImage(ctx, small, &pix)) {
|
if (!myRConvertImage(ctx, small, &pix)) {
|
||||||
fprintf(stdout, "plante !?\n");
|
fprintf(stderr, "crash !?\n");
|
||||||
fprintf(stdout, RMessageForError(RErrorCode));
|
fprintf(stderr, RMessageForError(RErrorCode));
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
wmg.pixmap = pix;
|
wmg.pixmap = pix;
|
||||||
|
@ -380,8 +428,5 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
usleep(VAL_USLEEP);
|
usleep(VAL_USLEEP);
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
* Still wonder about freeing some memory for X
|
|
||||||
*/
|
|
||||||
return 0;
|
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 STRONG 2
|
||||||
#define MAX(x, y) ((x) < (y) ? (y) : (x))
|
#define MAX(x, y) ((x) < (y) ? (y) : (x))
|
||||||
#define MIN(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
|
||||||
|
@ -89,19 +91,16 @@ typedef struct 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,7 +188,7 @@ 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();
|
||||||
|
@ -189,9 +198,14 @@ 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,8 +16,7 @@
|
||||||
* 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},
|
||||||
|
@ -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