|
Packit |
df99a1 |
//C- -*- C++ -*-
|
|
Packit |
df99a1 |
//C- -------------------------------------------------------------------
|
|
Packit |
df99a1 |
//C- DjVuLibre-3.5
|
|
Packit |
df99a1 |
//C- Copyright (c) 2002 Leon Bottou and Yann Le Cun.
|
|
Packit |
df99a1 |
//C- Copyright (c) 2001 AT&T
|
|
Packit |
df99a1 |
//C-
|
|
Packit |
df99a1 |
//C- This software is subject to, and may be distributed under, the
|
|
Packit |
df99a1 |
//C- GNU General Public License, either Version 2 of the license,
|
|
Packit |
df99a1 |
//C- or (at your option) any later version. The license should have
|
|
Packit |
df99a1 |
//C- accompanied the software or you may obtain a copy of the license
|
|
Packit |
df99a1 |
//C- from the Free Software Foundation at http://www.fsf.org .
|
|
Packit |
df99a1 |
//C-
|
|
Packit |
df99a1 |
//C- This program is distributed in the hope that it will be useful,
|
|
Packit |
df99a1 |
//C- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
df99a1 |
//C- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
df99a1 |
//C- GNU General Public License for more details.
|
|
Packit |
df99a1 |
//C-
|
|
Packit |
df99a1 |
//C- DjVuLibre-3.5 is derived from the DjVu(r) Reference Library from
|
|
Packit |
df99a1 |
//C- Lizardtech Software. Lizardtech Software has authorized us to
|
|
Packit |
df99a1 |
//C- replace the original DjVu(r) Reference Library notice by the following
|
|
Packit |
df99a1 |
//C- text (see doc/lizard2002.djvu and doc/lizardtech2007.djvu):
|
|
Packit |
df99a1 |
//C-
|
|
Packit |
df99a1 |
//C- ------------------------------------------------------------------
|
|
Packit |
df99a1 |
//C- | DjVu (r) Reference Library (v. 3.5)
|
|
Packit |
df99a1 |
//C- | Copyright (c) 1999-2001 LizardTech, Inc. All Rights Reserved.
|
|
Packit |
df99a1 |
//C- | The DjVu Reference Library is protected by U.S. Pat. No.
|
|
Packit |
df99a1 |
//C- | 6,058,214 and patents pending.
|
|
Packit |
df99a1 |
//C- |
|
|
Packit |
df99a1 |
//C- | This software is subject to, and may be distributed under, the
|
|
Packit |
df99a1 |
//C- | GNU General Public License, either Version 2 of the license,
|
|
Packit |
df99a1 |
//C- | or (at your option) any later version. The license should have
|
|
Packit |
df99a1 |
//C- | accompanied the software or you may obtain a copy of the license
|
|
Packit |
df99a1 |
//C- | from the Free Software Foundation at http://www.fsf.org .
|
|
Packit |
df99a1 |
//C- |
|
|
Packit |
df99a1 |
//C- | The computer code originally released by LizardTech under this
|
|
Packit |
df99a1 |
//C- | license and unmodified by other parties is deemed "the LIZARDTECH
|
|
Packit |
df99a1 |
//C- | ORIGINAL CODE." Subject to any third party intellectual property
|
|
Packit |
df99a1 |
//C- | claims, LizardTech grants recipient a worldwide, royalty-free,
|
|
Packit |
df99a1 |
//C- | non-exclusive license to make, use, sell, or otherwise dispose of
|
|
Packit |
df99a1 |
//C- | the LIZARDTECH ORIGINAL CODE or of programs derived from the
|
|
Packit |
df99a1 |
//C- | LIZARDTECH ORIGINAL CODE in compliance with the terms of the GNU
|
|
Packit |
df99a1 |
//C- | General Public License. This grant only confers the right to
|
|
Packit |
df99a1 |
//C- | infringe patent claims underlying the LIZARDTECH ORIGINAL CODE to
|
|
Packit |
df99a1 |
//C- | the extent such infringement is reasonably necessary to enable
|
|
Packit |
df99a1 |
//C- | recipient to make, have made, practice, sell, or otherwise dispose
|
|
Packit |
df99a1 |
//C- | of the LIZARDTECH ORIGINAL CODE (or portions thereof) and not to
|
|
Packit |
df99a1 |
//C- | any greater extent that may be necessary to utilize further
|
|
Packit |
df99a1 |
//C- | modifications or combinations.
|
|
Packit |
df99a1 |
//C- |
|
|
Packit |
df99a1 |
//C- | The LIZARDTECH ORIGINAL CODE is provided "AS IS" WITHOUT WARRANTY
|
|
Packit |
df99a1 |
//C- | OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
Packit |
df99a1 |
//C- | TO ANY WARRANTY OF NON-INFRINGEMENT, OR ANY IMPLIED WARRANTY OF
|
|
Packit |
df99a1 |
//C- | MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
|
Packit |
df99a1 |
//C- +------------------------------------------------------------------
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
df99a1 |
# include "config.h"
|
|
Packit |
df99a1 |
#endif
|
|
Packit |
df99a1 |
#if NEED_GNUG_PRAGMAS
|
|
Packit |
df99a1 |
# pragma implementation
|
|
Packit |
df99a1 |
#endif
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
#include "GMapAreas.h"
|
|
Packit |
df99a1 |
#include "GException.h"
|
|
Packit |
df99a1 |
#include "debug.h"
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
#include <math.h>
|
|
Packit |
df99a1 |
#include <stdio.h>
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
#ifdef HAVE_NAMESPACES
|
|
Packit |
df99a1 |
namespace DJVU {
|
|
Packit |
df99a1 |
# ifdef NOT_DEFINED // Just to fool emacs c++ mode
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
#endif
|
|
Packit |
df99a1 |
#endif
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
/****************************************************************************
|
|
Packit |
df99a1 |
***************************** GMapArea definition ***************************
|
|
Packit |
df99a1 |
****************************************************************************/
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
const char GMapArea::MAPAREA_TAG[] = "maparea";
|
|
Packit |
df99a1 |
const char GMapArea::RECT_TAG[] = "rect";
|
|
Packit |
df99a1 |
const char GMapArea::POLY_TAG[] = "poly";
|
|
Packit |
df99a1 |
const char GMapArea::OVAL_TAG[] = "oval";
|
|
Packit |
df99a1 |
const char GMapArea::NO_BORDER_TAG[] = "none";
|
|
Packit |
df99a1 |
const char GMapArea::XOR_BORDER_TAG[] = "xor";
|
|
Packit |
df99a1 |
const char GMapArea::SOLID_BORDER_TAG[] = "border";
|
|
Packit |
df99a1 |
const char GMapArea::SHADOW_IN_BORDER_TAG[] = "shadow_in";
|
|
Packit |
df99a1 |
const char GMapArea::SHADOW_OUT_BORDER_TAG[] = "shadow_out";
|
|
Packit |
df99a1 |
const char GMapArea::SHADOW_EIN_BORDER_TAG[] = "shadow_ein";
|
|
Packit |
df99a1 |
const char GMapArea::SHADOW_EOUT_BORDER_TAG[] = "shadow_eout";
|
|
Packit |
df99a1 |
const char GMapArea::BORDER_AVIS_TAG[] = "border_avis";
|
|
Packit |
df99a1 |
const char GMapArea::HILITE_TAG[] = "hilite";
|
|
Packit |
df99a1 |
const char GMapArea::URL_TAG[] = "url";
|
|
Packit |
df99a1 |
const char GMapArea::TARGET_SELF[] = "_self";
|
|
Packit |
df99a1 |
static const char zero_width[] = ERR_MSG("GMapAreas.zero_width");
|
|
Packit |
df99a1 |
static const char zero_height[] = ERR_MSG("GMapAreas.zero_height");
|
|
Packit |
df99a1 |
static const char width_1[] = ERR_MSG("GMapAreas.width_1");
|
|
Packit |
df99a1 |
static const char width_3_32 [] = ERR_MSG("GMapAreas.width_3-32");
|
|
Packit |
df99a1 |
static const char error_poly_border [] = ERR_MSG("GMapAreas.poly_border");
|
|
Packit |
df99a1 |
static const char error_poly_hilite [] = ERR_MSG("GMapAreas.poly_hilite");
|
|
Packit |
df99a1 |
static const char error_oval_border [] = ERR_MSG("GMapAreas.oval_border");
|
|
Packit |
df99a1 |
static const char error_oval_hilite [] = ERR_MSG("GMapAreas.oval_hilite");
|
|
Packit |
df99a1 |
static const char error_too_few_points [] = ERR_MSG("GMapAreas.too_few_points");
|
|
Packit |
df99a1 |
static const char error_intersect [] = ERR_MSG("GMapAreas.intersect");
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GMapArea::~GMapArea() {}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GMapRect::~GMapRect() {}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GMapPoly::~GMapPoly() {}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GMapOval::~GMapOval() {}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapArea::initialize_bounds(void)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
xmin=gma_get_xmin();
|
|
Packit |
df99a1 |
xmax=gma_get_xmax();
|
|
Packit |
df99a1 |
ymin=gma_get_ymin();
|
|
Packit |
df99a1 |
ymax=gma_get_ymax();
|
|
Packit |
df99a1 |
bounds_initialized=true;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
int
|
|
Packit |
df99a1 |
GMapArea::get_xmin(void) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
if (!bounds_initialized)
|
|
Packit |
df99a1 |
const_cast<GMapArea *>(this)->initialize_bounds();
|
|
Packit |
df99a1 |
return xmin;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
int
|
|
Packit |
df99a1 |
GMapArea::get_ymin(void) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
if (!bounds_initialized)
|
|
Packit |
df99a1 |
const_cast<GMapArea *>(this)->initialize_bounds();
|
|
Packit |
df99a1 |
return ymin;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
int
|
|
Packit |
df99a1 |
GMapArea::get_xmax(void) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
if (!bounds_initialized)
|
|
Packit |
df99a1 |
const_cast<GMapArea *>(this)->initialize_bounds();
|
|
Packit |
df99a1 |
return xmax;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
int
|
|
Packit |
df99a1 |
GMapArea::get_ymax(void) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
if (!bounds_initialized)
|
|
Packit |
df99a1 |
const_cast<GMapArea *>(this)->initialize_bounds();
|
|
Packit |
df99a1 |
return ymax;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GRect
|
|
Packit |
df99a1 |
GMapArea::get_bound_rect(void) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
return GRect(get_xmin(), get_ymin(), get_xmax()-get_xmin(),
|
|
Packit |
df99a1 |
get_ymax()-get_ymin());
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapArea::move(int dx, int dy)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
if (dx || dy)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
if (bounds_initialized)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
xmin+=dx;
|
|
Packit |
df99a1 |
ymin+=dy;
|
|
Packit |
df99a1 |
xmax+=dx;
|
|
Packit |
df99a1 |
ymax+=dy;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
gma_move(dx, dy);
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapArea::resize(int new_width, int new_height)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
if (get_xmax()-get_xmin()!=new_width ||
|
|
Packit |
df99a1 |
get_ymax()-get_ymin()!=new_height)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
gma_resize(new_width, new_height);
|
|
Packit |
df99a1 |
bounds_initialized=false;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapArea::transform(const GRect & grect)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
if (grect.xmin!=get_xmin() || grect.ymin!=get_ymin() ||
|
|
Packit |
df99a1 |
grect.xmax!=get_xmax() || grect.ymax!=get_ymax())
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
gma_transform(grect);
|
|
Packit |
df99a1 |
bounds_initialized=false;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
char const * const
|
|
Packit |
df99a1 |
GMapArea::check_object(void)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
char const *retval;
|
|
Packit |
df99a1 |
if (get_xmax()==get_xmin())
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
retval=zero_width;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
else if (get_ymax()==get_ymin())
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
retval=zero_height;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
else if ((border_type==XOR_BORDER ||
|
|
Packit |
df99a1 |
border_type==SOLID_BORDER) && border_width!=1)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
retval=width_1;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
else if ((border_type==SHADOW_IN_BORDER ||
|
|
Packit |
df99a1 |
border_type==SHADOW_OUT_BORDER ||
|
|
Packit |
df99a1 |
border_type==SHADOW_EIN_BORDER ||
|
|
Packit |
df99a1 |
border_type==SHADOW_EOUT_BORDER)&&
|
|
Packit |
df99a1 |
(border_width<3 || border_width>32))
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
retval=width_3_32;
|
|
Packit |
df99a1 |
}else
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
retval=gma_check_object();
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
return retval;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
bool
|
|
Packit |
df99a1 |
GMapArea::is_point_inside(int x, int y) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
if (!bounds_initialized)
|
|
Packit |
df99a1 |
const_cast<GMapArea *>(this)->initialize_bounds();
|
|
Packit |
df99a1 |
return (x>=xmin && x<xmax && y>=ymin && y
|
|
Packit |
df99a1 |
gma_is_point_inside(x, y) : false;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
static GUTF8String make_c_string(GUTF8String string)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
GUTF8String buffer;
|
|
Packit |
df99a1 |
const char *data = (const char*)string;
|
|
Packit |
df99a1 |
int length = string.length();
|
|
Packit |
df99a1 |
buffer = GUTF8String("\"");
|
|
Packit |
df99a1 |
while (*data && length>0)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
int span = 0;
|
|
Packit |
df99a1 |
while (span<length && (unsigned char)(data[span])>=0x20 &&
|
|
Packit |
df99a1 |
data[span]!=0x7f && data[span]!='"' && data[span]!='\\' )
|
|
Packit |
df99a1 |
span++;
|
|
Packit |
df99a1 |
if (span > 0)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
buffer = buffer + GUTF8String(data, span);
|
|
Packit |
df99a1 |
data += span;
|
|
Packit |
df99a1 |
length -= span;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
else
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
char buf[8];
|
|
Packit |
df99a1 |
static const char *tr1 = "\"\\tnrbf";
|
|
Packit |
df99a1 |
static const char *tr2 = "\"\\\t\n\r\b\f";
|
|
Packit |
df99a1 |
sprintf(buf,"\\%03o", (int)(((unsigned char*)data)[span]));
|
|
Packit |
df99a1 |
for (int i=0; tr2[i]; i++)
|
|
Packit |
df99a1 |
if (data[span] == tr2[i])
|
|
Packit |
df99a1 |
buf[1] = tr1[i];
|
|
Packit |
df99a1 |
if (buf[1]<'0' || buf[1]>'3')
|
|
Packit |
df99a1 |
buf[2] = 0;
|
|
Packit |
df99a1 |
buffer = buffer + GUTF8String(buf);
|
|
Packit |
df99a1 |
data += 1;
|
|
Packit |
df99a1 |
length -= 1;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
buffer = buffer + GUTF8String("\"");
|
|
Packit |
df99a1 |
return buffer;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GUTF8String
|
|
Packit |
df99a1 |
GMapArea::print(void)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
// Make this hard check to make sure, that *no* illegal GMapArea
|
|
Packit |
df99a1 |
// can be stored into a file.
|
|
Packit |
df99a1 |
const char * const errors=check_object();
|
|
Packit |
df99a1 |
if (errors[0])
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
G_THROW(errors);
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GUTF8String url1 = make_c_string((GUTF8String)url);
|
|
Packit |
df99a1 |
GUTF8String target1 = make_c_string(target);
|
|
Packit |
df99a1 |
GUTF8String comment1 = make_c_string(comment);
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GUTF8String border_color_str;
|
|
Packit |
df99a1 |
border_color_str.format("#%02X%02X%02X",
|
|
Packit |
df99a1 |
(border_color & 0xff0000) >> 16,
|
|
Packit |
df99a1 |
(border_color & 0xff00) >> 8,
|
|
Packit |
df99a1 |
(border_color & 0xff));
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
static const GUTF8String left('(');
|
|
Packit |
df99a1 |
static const GUTF8String right(')');
|
|
Packit |
df99a1 |
static const GUTF8String space(' ');
|
|
Packit |
df99a1 |
GUTF8String border_type_str;
|
|
Packit |
df99a1 |
switch(border_type)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
case NO_BORDER:
|
|
Packit |
df99a1 |
border_type_str=left+NO_BORDER_TAG+right;
|
|
Packit |
df99a1 |
break;
|
|
Packit |
df99a1 |
case XOR_BORDER:
|
|
Packit |
df99a1 |
border_type_str=left+XOR_BORDER_TAG+right;
|
|
Packit |
df99a1 |
break;
|
|
Packit |
df99a1 |
case SOLID_BORDER:
|
|
Packit |
df99a1 |
border_type_str=left+SOLID_BORDER_TAG+space+border_color_str+right;
|
|
Packit |
df99a1 |
break;
|
|
Packit |
df99a1 |
case SHADOW_IN_BORDER:
|
|
Packit |
df99a1 |
border_type_str=left+SHADOW_IN_BORDER_TAG+space+GUTF8String(border_width)+right;
|
|
Packit |
df99a1 |
break;
|
|
Packit |
df99a1 |
case SHADOW_OUT_BORDER:
|
|
Packit |
df99a1 |
border_type_str=left+SHADOW_OUT_BORDER_TAG+space+GUTF8String(border_width)+right;
|
|
Packit |
df99a1 |
break;
|
|
Packit |
df99a1 |
case SHADOW_EIN_BORDER:
|
|
Packit |
df99a1 |
border_type_str=left+SHADOW_EIN_BORDER_TAG+space+GUTF8String(border_width)+right;
|
|
Packit |
df99a1 |
break;
|
|
Packit |
df99a1 |
case SHADOW_EOUT_BORDER:
|
|
Packit |
df99a1 |
border_type_str=left+SHADOW_EOUT_BORDER_TAG+space+GUTF8String(border_width)+right;
|
|
Packit |
df99a1 |
break;
|
|
Packit |
df99a1 |
default:
|
|
Packit |
df99a1 |
border_type_str=left+XOR_BORDER_TAG+right;
|
|
Packit |
df99a1 |
break;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GUTF8String hilite_str;
|
|
Packit |
df99a1 |
if (hilite_color!=0xffffffff)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
hilite_str.format("(%s #%02X%02X%02X)",
|
|
Packit |
df99a1 |
HILITE_TAG, (hilite_color & 0xff0000) >> 16,
|
|
Packit |
df99a1 |
(hilite_color & 0xff00) >> 8,
|
|
Packit |
df99a1 |
(hilite_color & 0xff));
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GUTF8String URL;
|
|
Packit |
df99a1 |
if (target1==TARGET_SELF)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
URL=url1;
|
|
Packit |
df99a1 |
}else
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
URL=left+URL_TAG+space+url1+space+target1+right;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GUTF8String total=left+MAPAREA_TAG+space+URL+space+comment1+space+gma_print()+border_type_str;
|
|
Packit |
df99a1 |
if (border_always_visible)
|
|
Packit |
df99a1 |
total+=space+left+BORDER_AVIS_TAG+right;
|
|
Packit |
df99a1 |
if ( hilite_str.length() > 0 )
|
|
Packit |
df99a1 |
total+=space+hilite_str;
|
|
Packit |
df99a1 |
total+=right;
|
|
Packit |
df99a1 |
return total;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
/*
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapArea::map(GRectMapper &mapper)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
get_bound_rect();
|
|
Packit |
df99a1 |
GRect rect = GRect(xmin, ymin, xmax, ymax);
|
|
Packit |
df99a1 |
mapper.map(rect);
|
|
Packit |
df99a1 |
xmin = rect.xmin;
|
|
Packit |
df99a1 |
ymin = rect.ymin;
|
|
Packit |
df99a1 |
xmax = rect.xmax;
|
|
Packit |
df99a1 |
ymax = rect.ymax;
|
|
Packit |
df99a1 |
clear_bounds();
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapArea::unmap(GRectMapper &mapper)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
get_bound_rect();
|
|
Packit |
df99a1 |
GRect rect = GRect(xmin, ymin, xmax, ymax);
|
|
Packit |
df99a1 |
mapper.unmap(rect);
|
|
Packit |
df99a1 |
xmin = rect.xmin;
|
|
Packit |
df99a1 |
ymin = rect.ymin;
|
|
Packit |
df99a1 |
xmax = rect.xmax;
|
|
Packit |
df99a1 |
ymax = rect.ymax;
|
|
Packit |
df99a1 |
clear_bounds();
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
*/
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
/// Virtual function generating a list of defining coordinates
|
|
Packit |
df99a1 |
/// (default are the opposite corners of the enclosing rectangle)
|
|
Packit |
df99a1 |
void GMapArea::get_coords( GList<int> & CoordList ) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
CoordList.append( get_xmin() );
|
|
Packit |
df99a1 |
CoordList.append( get_ymin() );
|
|
Packit |
df99a1 |
CoordList.append( get_xmax() );
|
|
Packit |
df99a1 |
CoordList.append( get_ymax() );
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
/****************************************************************************
|
|
Packit |
df99a1 |
**************************** GMapRect definition ****************************
|
|
Packit |
df99a1 |
****************************************************************************/
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapRect::gma_resize(int new_width, int new_height)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
xmax=xmin+new_width;
|
|
Packit |
df99a1 |
ymax=ymin+new_height;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapRect::gma_transform(const GRect & grect)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
xmin=grect.xmin; ymin=grect.ymin;
|
|
Packit |
df99a1 |
xmax=grect.xmax; ymax=grect.ymax;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GUTF8String
|
|
Packit |
df99a1 |
GMapRect::gma_print(void)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
GUTF8String buffer;
|
|
Packit |
df99a1 |
return buffer.format("(%s %d %d %d %d) ",
|
|
Packit |
df99a1 |
RECT_TAG, xmin, ymin, xmax-xmin, ymax-ymin);
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapRect::map(GRectMapper &mapper)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
get_bound_rect();
|
|
Packit |
df99a1 |
GRect rect;
|
|
Packit |
df99a1 |
rect.xmin = xmin;
|
|
Packit |
df99a1 |
rect.xmax = xmax;
|
|
Packit |
df99a1 |
rect.ymin = ymin;
|
|
Packit |
df99a1 |
rect.ymax = ymax;
|
|
Packit |
df99a1 |
mapper.map(rect);
|
|
Packit |
df99a1 |
xmin = rect.xmin;
|
|
Packit |
df99a1 |
ymin = rect.ymin;
|
|
Packit |
df99a1 |
xmax = rect.xmax;
|
|
Packit |
df99a1 |
ymax = rect.ymax;
|
|
Packit |
df99a1 |
clear_bounds();
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapRect::unmap(GRectMapper &mapper)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
get_bound_rect();
|
|
Packit |
df99a1 |
GRect rect;
|
|
Packit |
df99a1 |
rect.xmin = xmin;
|
|
Packit |
df99a1 |
rect.xmax = xmax;
|
|
Packit |
df99a1 |
rect.ymin = ymin;
|
|
Packit |
df99a1 |
rect.ymax = ymax;
|
|
Packit |
df99a1 |
mapper.unmap(rect);
|
|
Packit |
df99a1 |
xmin = rect.xmin;
|
|
Packit |
df99a1 |
ymin = rect.ymin;
|
|
Packit |
df99a1 |
xmax = rect.xmax;
|
|
Packit |
df99a1 |
ymax = rect.ymax;
|
|
Packit |
df99a1 |
clear_bounds();
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
/****************************************************************************
|
|
Packit |
df99a1 |
**************************** GMapPoly definition ****************************
|
|
Packit |
df99a1 |
****************************************************************************/
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
inline int
|
|
Packit |
df99a1 |
GMapPoly::sign(int x) { return x<0 ? -1 : x>0 ? 1 : 0; }
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
bool
|
|
Packit |
df99a1 |
GMapPoly::does_side_cross_rect(const GRect & grect, int side)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
int x1=xx[side], x2=xx[(side+1)%points];
|
|
Packit |
df99a1 |
int y1=yy[side], y2=yy[(side+1)%points];
|
|
Packit |
df99a1 |
int xmin=x1
|
|
Packit |
df99a1 |
int ymin=y1
|
|
Packit |
df99a1 |
int xmax=x1+x2-xmin;
|
|
Packit |
df99a1 |
int ymax=y1+y2-ymin;
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
if (xmax<grect.xmin || xmin>grect.xmax ||
|
|
Packit |
df99a1 |
ymax<grect.ymin || ymin>grect.ymax)
|
|
Packit |
df99a1 |
return false;
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
return
|
|
Packit |
df99a1 |
(x1>=grect.xmin && x1<=grect.xmax && y1>=grect.ymin && y1<=grect.ymax) ||
|
|
Packit |
df99a1 |
(x2>=grect.xmin && x2<=grect.xmax && y2>=grect.ymin && y2<=grect.ymax) ||
|
|
Packit |
df99a1 |
do_segments_intersect(grect.xmin, grect.ymin, grect.xmax, grect.ymax,
|
|
Packit |
df99a1 |
x1, y1, x2, y2) ||
|
|
Packit |
df99a1 |
do_segments_intersect(grect.xmax, grect.ymin, grect.xmin, grect.ymax,
|
|
Packit |
df99a1 |
x1, y1, x2, y2);
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
bool
|
|
Packit |
df99a1 |
GMapPoly::is_projection_on_segment(int x, int y, int x1, int y1, int x2, int y2)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
int res1=(x-x1)*(x2-x1)+(y-y1)*(y2-y1);
|
|
Packit |
df99a1 |
int res2=(x-x2)*(x2-x1)+(y-y2)*(y2-y1);
|
|
Packit |
df99a1 |
return sign(res1)*sign(res2)<=0;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
bool
|
|
Packit |
df99a1 |
GMapPoly::do_segments_intersect(int x11, int y11, int x12, int y12,
|
|
Packit |
df99a1 |
int x21, int y21, int x22, int y22)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
int res11=(x11-x21)*(y22-y21)-(y11-y21)*(x22-x21);
|
|
Packit |
df99a1 |
int res12=(x12-x21)*(y22-y21)-(y12-y21)*(x22-x21);
|
|
Packit |
df99a1 |
int res21=(x21-x11)*(y12-y11)-(y21-y11)*(x12-x11);
|
|
Packit |
df99a1 |
int res22=(x22-x11)*(y12-y11)-(y22-y11)*(x12-x11);
|
|
Packit |
df99a1 |
if (!res11 && !res12)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
// Segments are on the same line
|
|
Packit |
df99a1 |
return
|
|
Packit |
df99a1 |
is_projection_on_segment(x11, y11, x21, y21, x22, y22) ||
|
|
Packit |
df99a1 |
is_projection_on_segment(x12, y12, x21, y21, x22, y22) ||
|
|
Packit |
df99a1 |
is_projection_on_segment(x21, y21, x11, y11, x12, y12) ||
|
|
Packit |
df99a1 |
is_projection_on_segment(x22, y22, x11, y11, x12, y12);
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
int sign1=sign(res11)*sign(res12);
|
|
Packit |
df99a1 |
int sign2=sign(res21)*sign(res22);
|
|
Packit |
df99a1 |
return sign1<=0 && sign2<=0;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
bool
|
|
Packit |
df99a1 |
GMapPoly::are_segments_parallel(int x11, int y11, int x12, int y12,
|
|
Packit |
df99a1 |
int x21, int y21, int x22, int y22)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
return (x12-x11)*(y22-y21)-(y12-y11)*(x22-x21)==0;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
char const * const
|
|
Packit |
df99a1 |
GMapPoly::check_data(void)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
if ((open && points<2) || (!open && points<3))
|
|
Packit |
df99a1 |
return error_too_few_points;
|
|
Packit |
df99a1 |
for(int i=0;i
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
for(int j=i+2;j
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
if (i != (j+1)%points )
|
|
Packit |
df99a1 |
if (do_segments_intersect(xx[i], yy[i], xx[i+1], yy[i+1],
|
|
Packit |
df99a1 |
xx[j], yy[j], xx[(j+1)%points], yy[(j+1)%points]))
|
|
Packit |
df99a1 |
return error_intersect;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
return "";
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapPoly::optimize_data(void)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
// Removing segments of length zero
|
|
Packit |
df99a1 |
int i;
|
|
Packit |
df99a1 |
for(i=0;i
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
while(xx[i]==xx[(i+1)%points] && yy[i]==yy[(i+1)%points])
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
for(int k=(i+1)%points;k
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
xx[k]=xx[k+1]; yy[k]=yy[k+1];
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
points--; sides--;
|
|
Packit |
df99a1 |
if (!points) return;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
// Concatenating consequitive parallel segments
|
|
Packit |
df99a1 |
for(i=0;i
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
while(((open && i+1
|
|
Packit |
df99a1 |
are_segments_parallel(xx[i], yy[i],
|
|
Packit |
df99a1 |
xx[(i+1)%points], yy[(i+1)%points],
|
|
Packit |
df99a1 |
xx[(i+1)%points], yy[(i+1)%points],
|
|
Packit |
df99a1 |
xx[(i+2)%points], yy[(i+2)%points]))
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
for(int k=(i+1)%points;k
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
xx[k]=xx[k+1]; yy[k]=yy[k+1];
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
points--; sides--;
|
|
Packit |
df99a1 |
if (!points) return;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
bool
|
|
Packit |
df99a1 |
GMapPoly::gma_is_point_inside(const int xin, const int yin) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
if (open)
|
|
Packit |
df99a1 |
return false;
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
int xfar=get_xmax()+(get_xmax()-get_xmin());
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
int intersections=0;
|
|
Packit |
df99a1 |
for(int i=0;i
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
int res1=yy[i]-yin;
|
|
Packit |
df99a1 |
if (!res1) continue;
|
|
Packit |
df99a1 |
int res2, isaved=i;
|
|
Packit |
df99a1 |
while(!(res2=yy[(i+1)%points]-yin)) i++;
|
|
Packit |
df99a1 |
if (isaved!=i)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
// Some points fell exactly on the line
|
|
Packit |
df99a1 |
if ((xx[(isaved+1)%points]-xin)*
|
|
Packit |
df99a1 |
(xx[i%points]-xin)<=0)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
// Test point is exactly on the boundary
|
|
Packit |
df99a1 |
return true;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
if ((res1<0 && res2>0) || (res1>0 && res2<0))
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
int x1=xx[i%points], y1=yy[i%points];
|
|
Packit |
df99a1 |
int x2=xx[(i+1)%points], y2=yy[(i+1)%points];
|
|
Packit |
df99a1 |
int _res1=(xin-x1)*(y2-y1)-(yin-y1)*(x2-x1);
|
|
Packit |
df99a1 |
int _res2=(xfar-x1)*(y2-y1)-(yin-y1)*(x2-x1);
|
|
Packit |
df99a1 |
if (!_res1 || !_res2)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
// The point is on this boundary
|
|
Packit |
df99a1 |
return true;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
if (sign(_res1)*sign(_res2)<0) intersections++;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
return (intersections % 2)!=0;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
int
|
|
Packit |
df99a1 |
GMapPoly::gma_get_xmin(void) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
int x=xx[0];
|
|
Packit |
df99a1 |
for(int i=1;i
|
|
Packit |
df99a1 |
if (x>xx[i]) x=xx[i];
|
|
Packit |
df99a1 |
return x;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
int
|
|
Packit |
df99a1 |
GMapPoly::gma_get_xmax(void) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
int x=xx[0];
|
|
Packit |
df99a1 |
for(int i=1;i
|
|
Packit |
df99a1 |
if (x
|
|
Packit |
df99a1 |
return x+1;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
int
|
|
Packit |
df99a1 |
GMapPoly::gma_get_ymin(void) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
int y=yy[0];
|
|
Packit |
df99a1 |
for(int i=1;i
|
|
Packit |
df99a1 |
if (y>yy[i]) y=yy[i];
|
|
Packit |
df99a1 |
return y;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
int
|
|
Packit |
df99a1 |
GMapPoly::gma_get_ymax(void) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
int y=yy[0];
|
|
Packit |
df99a1 |
for(int i=1;i
|
|
Packit |
df99a1 |
if (y
|
|
Packit |
df99a1 |
return y+1;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapPoly::gma_move(int dx, int dy)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
for(int i=0;i
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
xx[i]+=dx; yy[i]+=dy;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapPoly::gma_resize(int new_width, int new_height)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
int width=get_xmax()-get_xmin();
|
|
Packit |
df99a1 |
int height=get_ymax()-get_ymin();
|
|
Packit |
df99a1 |
int xmin=get_xmin(), ymin=get_ymin();
|
|
Packit |
df99a1 |
for(int i=0;i
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
xx[i]=xmin+(xx[i]-xmin)*new_width/width;
|
|
Packit |
df99a1 |
yy[i]=ymin+(yy[i]-ymin)*new_height/height;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapPoly::gma_transform(const GRect & grect)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
int width=get_xmax()-get_xmin();
|
|
Packit |
df99a1 |
int height=get_ymax()-get_ymin();
|
|
Packit |
df99a1 |
int xmin=get_xmin(), ymin=get_ymin();
|
|
Packit |
df99a1 |
for(int i=0;i
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
xx[i]=grect.xmin+(xx[i]-xmin)*grect.width()/width;
|
|
Packit |
df99a1 |
yy[i]=grect.ymin+(yy[i]-ymin)*grect.height()/height;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
char const * const
|
|
Packit |
df99a1 |
GMapPoly::gma_check_object(void) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
const char * str;
|
|
Packit |
df99a1 |
str=(border_type!=NO_BORDER &&
|
|
Packit |
df99a1 |
border_type!=SOLID_BORDER &&
|
|
Packit |
df99a1 |
border_type!=XOR_BORDER) ? error_poly_border:
|
|
Packit |
df99a1 |
((hilite_color!=0xffffffff) ? error_poly_hilite:"");
|
|
Packit |
df99a1 |
return str;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GMapPoly::GMapPoly(const int * _xx, const int * _yy, int _points, bool _open) :
|
|
Packit |
df99a1 |
open(_open), points(_points)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
sides=points-(open!=0);
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
xx.resize(points-1); yy.resize(points-1);
|
|
Packit |
df99a1 |
for(int i=0;i
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
xx[i]=_xx[i]; yy[i]=_yy[i];
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
optimize_data();
|
|
Packit |
df99a1 |
char const * const res=check_data();
|
|
Packit |
df99a1 |
if (res[0])
|
|
Packit |
df99a1 |
G_THROW(res);
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
int
|
|
Packit |
df99a1 |
GMapPoly::add_vertex(int x, int y)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
points++;
|
|
Packit |
df99a1 |
sides=points-(open!=0);
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
xx.resize(points-1); yy.resize(points-1);
|
|
Packit |
df99a1 |
xx[points-1] = x;
|
|
Packit |
df99a1 |
yy[points-1] = y;
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
return points;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapPoly::close_poly()
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
open = false;
|
|
Packit |
df99a1 |
sides=points;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GUTF8String
|
|
Packit |
df99a1 |
GMapPoly::gma_print(void)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
static const GUTF8String space(' ');
|
|
Packit |
df99a1 |
GUTF8String res=GUTF8String('(')+POLY_TAG+space;
|
|
Packit |
df99a1 |
for(int i=0;i
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
GUTF8String buffer;
|
|
Packit |
df99a1 |
res+=buffer.format("%d %d ", xx[i], yy[i]);
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
res.setat(res.length()-1, ')');
|
|
Packit |
df99a1 |
res+=space;
|
|
Packit |
df99a1 |
return res;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
/// Virtual function generating a list of defining coordinates
|
|
Packit |
df99a1 |
void GMapPoly::get_coords( GList<int> & CoordList ) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
for(int i = 0 ; i < points ; i++)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
CoordList.append( xx[i] );
|
|
Packit |
df99a1 |
CoordList.append( yy[i] );
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapPoly::map(GRectMapper &mapper)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
get_bound_rect();
|
|
Packit |
df99a1 |
for(int i=0; i
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
mapper.map(xx[i], yy[i]);
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
clear_bounds();
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapPoly::unmap(GRectMapper &mapper)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
get_bound_rect();
|
|
Packit |
df99a1 |
for(int i=0; i
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
mapper.unmap(xx[i], yy[i]);
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
clear_bounds();
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
/****************************************************************************
|
|
Packit |
df99a1 |
**************************** GMapOval definition ****************************
|
|
Packit |
df99a1 |
****************************************************************************/
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapOval::gma_resize(int new_width, int new_height)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
xmax=xmin+new_width;
|
|
Packit |
df99a1 |
ymax=ymin+new_height;
|
|
Packit |
df99a1 |
initialize();
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapOval::gma_transform(const GRect & grect)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
xmin=grect.xmin; ymin=grect.ymin;
|
|
Packit |
df99a1 |
xmax=grect.xmax; ymax=grect.ymax;
|
|
Packit |
df99a1 |
initialize();
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
bool
|
|
Packit |
df99a1 |
GMapOval::gma_is_point_inside(const int x, const int y) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
return
|
|
Packit |
df99a1 |
sqrt((double)((x-xf1)*(x-xf1)+(y-yf1)*(y-yf1))) +
|
|
Packit |
df99a1 |
sqrt((double)((x-xf2)*(x-xf2)+(y-yf2)*(y-yf2))) <= 2*rmax;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
char const * const
|
|
Packit |
df99a1 |
GMapOval::gma_check_object(void) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
return (border_type!=NO_BORDER &&
|
|
Packit |
df99a1 |
border_type!=SOLID_BORDER &&
|
|
Packit |
df99a1 |
border_type!=XOR_BORDER)?error_oval_border:
|
|
Packit |
df99a1 |
((hilite_color!=0xffffffff) ? error_oval_hilite:"");
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapOval::initialize(void)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
int xc=(xmax+xmin)/2;
|
|
Packit |
df99a1 |
int yc=(ymax+ymin)/2;
|
|
Packit |
df99a1 |
int f;
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
a=(xmax-xmin)/2;
|
|
Packit |
df99a1 |
b=(ymax-ymin)/2;
|
|
Packit |
df99a1 |
if (a>b)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
rmin=b; rmax=a;
|
|
Packit |
df99a1 |
f=(int) sqrt((double)(rmax*rmax-rmin*rmin));
|
|
Packit |
df99a1 |
xf1=xc+f; xf2=xc-f; yf1=yf2=yc;
|
|
Packit |
df99a1 |
} else
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
rmin=a; rmax=b;
|
|
Packit |
df99a1 |
f=(int) sqrt((double)(rmax*rmax-rmin*rmin));
|
|
Packit |
df99a1 |
yf1=yc+f; yf2=yc-f; xf1=xf2=xc;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GMapOval::GMapOval(const GRect & rect) : xmin(rect.xmin), ymin(rect.ymin),
|
|
Packit |
df99a1 |
xmax(rect.xmax), ymax(rect.ymax)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
initialize();
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GUTF8String
|
|
Packit |
df99a1 |
GMapOval::gma_print(void)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
GUTF8String buffer;
|
|
Packit |
df99a1 |
return buffer.format("(%s %d %d %d %d) ",
|
|
Packit |
df99a1 |
OVAL_TAG, xmin, ymin, xmax-xmin, ymax-ymin);
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapOval::map(GRectMapper &mapper)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
get_bound_rect();
|
|
Packit |
df99a1 |
GRect rect;
|
|
Packit |
df99a1 |
rect.xmin = xmin;
|
|
Packit |
df99a1 |
rect.xmax = xmax;
|
|
Packit |
df99a1 |
rect.ymin = ymin;
|
|
Packit |
df99a1 |
rect.ymax = ymax;
|
|
Packit |
df99a1 |
mapper.map(rect);
|
|
Packit |
df99a1 |
xmin = rect.xmin;
|
|
Packit |
df99a1 |
ymin = rect.ymin;
|
|
Packit |
df99a1 |
xmax = rect.xmax;
|
|
Packit |
df99a1 |
ymax = rect.ymax;
|
|
Packit |
df99a1 |
clear_bounds();
|
|
Packit |
df99a1 |
initialize();
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapOval::unmap(GRectMapper &mapper)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
get_bound_rect();
|
|
Packit |
df99a1 |
GRect rect;
|
|
Packit |
df99a1 |
rect.xmin = xmin;
|
|
Packit |
df99a1 |
rect.xmax = xmax;
|
|
Packit |
df99a1 |
rect.ymin = ymin;
|
|
Packit |
df99a1 |
rect.ymax = ymax;
|
|
Packit |
df99a1 |
mapper.unmap(rect);
|
|
Packit |
df99a1 |
xmin = rect.xmin;
|
|
Packit |
df99a1 |
ymin = rect.ymin;
|
|
Packit |
df99a1 |
xmax = rect.xmax;
|
|
Packit |
df99a1 |
ymax = rect.ymax;
|
|
Packit |
df99a1 |
clear_bounds();
|
|
Packit |
df99a1 |
initialize();
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GMapArea::GMapArea(void) : target("_self"), border_type(NO_BORDER),
|
|
Packit |
df99a1 |
border_always_visible(false), border_color(0xff), border_width(1),
|
|
Packit |
df99a1 |
hilite_color(0xffffffff), bounds_initialized(0) {}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GMapRect::GMapRect(void) : xmin(0), ymin(0), xmax(0), ymax(0) {}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GMapRect::GMapRect(const GRect & rect) : xmin(rect.xmin), ymin(rect.ymin),
|
|
Packit |
df99a1 |
xmax(rect.xmax), ymax(rect.ymax) {}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GMapRect &
|
|
Packit |
df99a1 |
GMapRect::operator=(const GRect & rect)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
xmin=rect.xmin;
|
|
Packit |
df99a1 |
xmax=rect.xmax;
|
|
Packit |
df99a1 |
ymin=rect.ymin;
|
|
Packit |
df99a1 |
ymax=rect.ymax;
|
|
Packit |
df99a1 |
return *this;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapRect::gma_move(int dx, int dy)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
xmin+=dx;
|
|
Packit |
df99a1 |
xmax+=dx;
|
|
Packit |
df99a1 |
ymin+=dy;
|
|
Packit |
df99a1 |
ymax+=dy;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
bool
|
|
Packit |
df99a1 |
GMapRect::gma_is_point_inside(const int x, const int y) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
return (x>=xmin)&&(x<xmax)&&(y>=ymin)&&(y
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GP<GMapArea>
|
|
Packit |
df99a1 |
GMapRect::get_copy(void) const { return new GMapRect(*this); }
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GMapPoly::GMapPoly(void) : points(0), sides(0) {}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapPoly::move_vertex(int i, int x, int y)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
xx[i]=x; yy[i]=y;
|
|
Packit |
df99a1 |
clear_bounds();
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GP<GMapArea>
|
|
Packit |
df99a1 |
GMapPoly::get_copy(void) const { return new GMapPoly(*this); }
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GMapOval::GMapOval(void) : xmin(0), ymin(0), xmax(0), ymax(0) {}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
void
|
|
Packit |
df99a1 |
GMapOval::gma_move(int dx, int dy)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
xmin+=dx; xmax+=dx; ymin+=dy; ymax+=dy;
|
|
Packit |
df99a1 |
xf1+=dx; yf1+=dy; xf2+=dx; yf2+=dy;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GP<GMapArea>
|
|
Packit |
df99a1 |
GMapOval::get_copy(void) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
return new GMapOval(*this);
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
static GUTF8String
|
|
Packit |
df99a1 |
GMapArea2xmltag(const GMapArea &area,const GUTF8String &coords)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
GUTF8String retval("
|
|
Packit |
df99a1 |
+coords+"\" shape=\""+area.get_shape_name()+"\" "
|
|
Packit |
df99a1 |
+"alt=\""+area.comment.toEscaped()+"\" ");
|
|
Packit |
df99a1 |
if(area.url.length())
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
retval+="href=\""+area.url+"\" ";
|
|
Packit |
df99a1 |
}else
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
retval+="nohref=\"nohref\" ";
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
if(area.target.length())
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
retval+="target=\""+area.target.toEscaped()+"\" ";
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
// highlight
|
|
Packit |
df99a1 |
if( area.hilite_color != GMapArea::NO_HILITE &&
|
|
Packit |
df99a1 |
area.hilite_color != GMapArea::XOR_HILITE )
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
retval+=GUTF8String().format( "highlight=\"#%06X\" ", area.hilite_color );
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
const char *b_type="none";
|
|
Packit |
df99a1 |
switch( area.border_type )
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
case GMapArea::NO_BORDER:
|
|
Packit |
df99a1 |
b_type = "none";
|
|
Packit |
df99a1 |
break;
|
|
Packit |
df99a1 |
case GMapArea::XOR_BORDER:
|
|
Packit |
df99a1 |
b_type = "xor";
|
|
Packit |
df99a1 |
break;
|
|
Packit |
df99a1 |
case GMapArea::SOLID_BORDER:
|
|
Packit |
df99a1 |
b_type = "solid";
|
|
Packit |
df99a1 |
break;
|
|
Packit |
df99a1 |
case GMapArea::SHADOW_IN_BORDER:
|
|
Packit |
df99a1 |
b_type = "shadowin";
|
|
Packit |
df99a1 |
break;
|
|
Packit |
df99a1 |
case GMapArea::SHADOW_OUT_BORDER:
|
|
Packit |
df99a1 |
b_type = "shadowout";
|
|
Packit |
df99a1 |
break;
|
|
Packit |
df99a1 |
case GMapArea::SHADOW_EIN_BORDER:
|
|
Packit |
df99a1 |
b_type = "etchedin";
|
|
Packit |
df99a1 |
break;
|
|
Packit |
df99a1 |
case GMapArea::SHADOW_EOUT_BORDER:
|
|
Packit |
df99a1 |
b_type = "etchedout";
|
|
Packit |
df99a1 |
break;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
retval=retval+"bordertype=\""+b_type+"\" ";
|
|
Packit |
df99a1 |
if( area.border_type != GMapArea::NO_BORDER)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
retval+="bordercolor=\""+GUTF8String().format("#%06X",area.border_color)
|
|
Packit |
df99a1 |
+"\" border=\""+GUTF8String(area.border_width)+"\" ";
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
if(area.border_always_visible )
|
|
Packit |
df99a1 |
retval=retval+"visible=\"visible\" ";
|
|
Packit |
df99a1 |
return retval+"/>\n";
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GUTF8String
|
|
Packit |
df99a1 |
GMapRect::get_xmltag(const int height) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
return GMapArea2xmltag( *this, GUTF8String(get_xmin())
|
|
Packit |
df99a1 |
+","+GUTF8String(height-1-get_ymax())
|
|
Packit |
df99a1 |
+","+GUTF8String(get_xmax())
|
|
Packit |
df99a1 |
+","+GUTF8String(height-1-get_ymin()));
|
|
Packit |
df99a1 |
#if 0
|
|
Packit |
df99a1 |
GUTF8String retval;
|
|
Packit |
df99a1 |
return retval;
|
|
Packit |
df99a1 |
#endif
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GUTF8String
|
|
Packit |
df99a1 |
GMapOval::get_xmltag(const int height) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
return GMapArea2xmltag( *this, GUTF8String(get_xmin())
|
|
Packit |
df99a1 |
+","+GUTF8String(height-1-get_ymax())
|
|
Packit |
df99a1 |
+","+GUTF8String(get_xmax())
|
|
Packit |
df99a1 |
+","+GUTF8String(height-1-get_ymin()));
|
|
Packit |
df99a1 |
#if 0
|
|
Packit |
df99a1 |
GUTF8String retval;
|
|
Packit |
df99a1 |
return retval;
|
|
Packit |
df99a1 |
#endif
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
GUTF8String
|
|
Packit |
df99a1 |
GMapPoly::get_xmltag(const int height) const
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
GList<int> CoordList;
|
|
Packit |
df99a1 |
get_coords(CoordList);
|
|
Packit |
df99a1 |
GPosition pos=CoordList;
|
|
Packit |
df99a1 |
GUTF8String retval;
|
|
Packit |
df99a1 |
if(pos)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
GUTF8String coords(CoordList[pos]);
|
|
Packit |
df99a1 |
while(++pos)
|
|
Packit |
df99a1 |
{
|
|
Packit |
df99a1 |
coords+=","+GUTF8String(height-1-CoordList[pos]);
|
|
Packit |
df99a1 |
if(! ++pos)
|
|
Packit |
df99a1 |
break;
|
|
Packit |
df99a1 |
coords+=","+GUTF8String(CoordList[pos]);
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
retval=GMapArea2xmltag( *this, coords);
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
return retval;
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
#ifdef HAVE_NAMESPACES
|
|
Packit |
df99a1 |
}
|
|
Packit |
df99a1 |
# ifndef NOT_USING_DJVU_NAMESPACE
|
|
Packit |
df99a1 |
using namespace DJVU;
|
|
Packit |
df99a1 |
# endif
|
|
Packit |
df99a1 |
#endif
|
|
Packit |
df99a1 |
|