1 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3   Gpredict: Real-time satellite tracking and orbit prediction program
4 
5   Copyright (C)  2013  Alexandru Csete, OZ9AEC.
6 
7   Authors: Alexandru Csete <oz9aec@gmail.com>
8 
9   Comments, questions and bugreports should be submitted via
10   http://sourceforge.net/projects/gpredict/
11   More details can be found at the project home page:
12 
13   http://gpredict.oz9aec.net/
14 
15   This program is free software; you can redistribute it and/or modify
16   it under the terms of the GNU General Public License as published by
17   the Free Software Foundation; either version 2 of the License, or
18   (at your option) any later version.
19 
20   This program is distributed in the hope that it will be useful,
21   but WITHOUT ANY WARRANTY; without even the implied warranty of
22   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23   GNU General Public License for more details.
24 
25   You should have received a copy of the GNU General Public License
26   along with this program; if not, visit http://www.fsf.org/
27 */
28 #include <math.h>
29 #include <gdk-pixbuf/gdk-pixbuf.h>
30 #ifdef HAVE_CONFIG_H
31 #  include <build-config.h>
32 #endif
33 
34 
35 /*! \brief Rotate map to be centered around a specific longitude.
36  *  \param in Input map centered around 0 degrees longitude.
37  *  \param out Output map that will be centered around clon. Must have the same
38  *             dimension and color space as the input map.
39  *  \param clon The longitude that should be at center between -180 and 180 degrees (East positive).
40  *
41  * This function will rotate the input map to be centered around the specified longitude.
42  * The output map must be pre-allocated and have the sae width, height and colorspace as the input
43  * map. The longitude parameter must be between -180 and 180 degrees with negative values meaning
44  * West of Greenwich,positive values meaning East of Greenwich.
45  */
map_tools_shift_center(GdkPixbuf * in,GdkPixbuf * out,float clon)46 void map_tools_shift_center(GdkPixbuf *in, GdkPixbuf *out, float clon)
47 {
48     if (clon > 180.0)
49         clon = 180.0;
50     else if (clon < -180.0)
51         clon = -180.0;
52 
53     int lon_x = round((clon+180.0) * gdk_pixbuf_get_width(in)/360.0);
54     int img_w = gdk_pixbuf_get_width(in);
55     int img_h = gdk_pixbuf_get_height(in);
56 
57     if (clon < 0.0) {
58         /* copy left side to right */
59         gdk_pixbuf_copy_area(in,
60                              0,
61                              0,
62                              lon_x + img_w/2,
63                              img_h,
64                              out,
65                              img_w - (lon_x + img_w/2),
66                              0);
67         /* copy right side to left */
68         gdk_pixbuf_copy_area(in,
69                              lon_x + img_w/2,
70                              0,
71                              img_w - (lon_x + img_w/2),
72                              img_h,
73                              out,
74                              0,
75                              0);
76     }
77     else if (clon > 0.0) {
78         /* copy left side to right */
79         gdk_pixbuf_copy_area(in,
80                              0,
81                              0,
82                              lon_x - img_w/2,
83                              img_h,
84                              out,
85                              img_w - (lon_x - img_w/2),
86                              0);
87         /* copy right side to left */
88         gdk_pixbuf_copy_area(in,
89                              lon_x - img_w/2,
90                              0,
91                              img_w - (lon_x - img_w/2),
92                              img_h,
93                              out,
94                              0,
95                              0);
96     }
97     else {
98         /* no shifting of center */
99         gdk_pixbuf_copy_area(in,
100                              0,
101                              0,
102                              img_w,
103                              img_h,
104                              out,
105                              0,
106                              0);
107     }
108 }
109 
110