You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1380 lines
49 KiB

/******************************************************************************
*
* Component: OGDI Core C API
* Purpose: Include file for all the OGDI (included by ecs.h).
* Contains most macros, and function prototypes, and structures
* that aren't transmitted over RPC (the rest are in ecs.h).
*
******************************************************************************
* Copyright (C) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc
* Permission to use, copy, modify and distribute this software and
* its documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notice appear in all copies, that
* both the copyright notice and this permission notice appear in
* supporting documentation, and that the name of L.A.S. Inc not be used
* in advertising or publicity pertaining to distribution of the software
* without specific, written prior permission. L.A.S. Inc. makes no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
******************************************************************************
*
* $Log$
* Revision 1.30 2016-07-11 09:13:29 erouault
* Really fix Windows compilation issue due to int32/uint32
*
* Revision 1.29 2016/07/08 10:22:55 erouault
* Fix various compilation problems on Windows (contributed by Jerome Siot)
*
* Revision 1.28 2016/07/05 13:28:46 erouault
* ecs_util.h: update to 20160705 so that we have a way to know if ecs_SetReportErrorFunction() is available
*
* Revision 1.27 2016/07/04 17:33:49 erouault
* Also export ecs_ShouldStopOnError and ecs_SetErrorShouldStop on Windows
*
* Revision 1.26 2016/07/04 17:03:12 erouault
* Error handling: Add a ecs_SetErrorShouldStop() function that can be
* used internally when the code is able to recover from an error. The user
* may decide if he wants to be resilient on errors by defining OGDI_STOP_ON_ERROR=NO
* as environment variable (the default being YES: stop on error).
* Add a ecs_SetReportErrorFunction() method to install a custom callback that
* will be called when OGDI_STOP_ON_ERROR=YES so that the user code is still
* aware of errors that occured. If not defined, the error will be logged in stderr.
*
* Revision 1.25 2016/06/27 20:23:20 erouault
* Fix compiler warnings raised by GCC 4.4
*
* Revision 1.24 2008/05/28 01:47:03 cbalint
* * prepare 3.2.0.beta2
*
* Revision 1.23 2007/05/09 21:41:24 cbalint
* 3.2.0beta2 release
*
* Revision 1.22 2007/02/24 17:12:33 cbalint
* 3.2.0beta1 pre-release
* Modified Files:
* ChangeLog HOWTO-RELEASE NEWS configure configure.in
* mkogdidist.sh ogdi/include/ecs_util.h
*
* Revision 1.21 2007/02/13 20:24:28 cbalint
* fix 64bit platforms.
*
* Revision 1.20 2007/02/13 02:11:18 cbalint
* 3.1.6 release.
*
* Revision 1.19 2005/03/01 00:49:27 warmerda
* Updated to 3.1.5.
*
* Revision 1.18 2004/10/26 20:45:52 warmerda
* Uupdated to 3.1.4.
*
* Revision 1.17 2004/10/04 15:53:12 warmerda
* Updated to version 3.1.3.
*
* Revision 1.16 2003/12/15 18:11:21 warmerda
* Updated version to 3.1.2.
*
* Revision 1.15 2003/01/29 15:46:45 warmerda
* fixed spelling of length
*
* Revision 1.14 2002/12/18 14:31:47 warmerda
* provide more precision for PI and use M_PI if available
*
* Revision 1.13 2002/03/28 16:09:07 warmerda
* updated version/release info
*
* Revision 1.12 2001/09/28 18:56:20 warmerda
* added OGDI_VERSION and OGDI_RELEASEDATE
*
* Revision 1.11 2001/07/18 03:55:09 warmerda
* Fixed case where DISABLE_CVSID is defined.
*
* Revision 1.10 2001/06/22 16:28:24 warmerda
* fixed typo in ECS_SETGEOMIMAGEVALUE
*
* Revision 1.9 2001/04/12 19:25:39 warmerda
* added RGB<->Pixel functions
*
* Revision 1.8 2001/04/12 18:15:25 warmerda
* added/finished capabilities support
*
* Revision 1.7 2001/04/12 05:29:47 warmerda
* added ecs_LayerCapabilities structure, and additions to ecs_Client
*
* Revision 1.6 2001/04/09 15:04:35 warmerda
* applied new source headers
*
*/
#ifndef ECS_UTIL
#define ECS_UTIL 1
#define OGDI_VERSION 411
#define OGDI_RELEASEDATE 20240201
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <rpc/rpc.h>
#include <math.h>
#include <memory.h>
#include <ctype.h>
#ifdef _WINDOWS
#include <windows.h>
#include <winsock.h>
#else
#include <dlfcn.h>
#endif
#include <sys/types.h>
#include <sys/stat.h>
#include "ecs.h"
#ifdef _SCO
#include <sys/fs/nfs/time.h>
#endif
#ifdef _WINDOWS
#include <signal.h>
#define alarm(a) printf("")
#endif
#ifndef __INT32DEF__
#define __INT32DEF__
#ifdef _MSC_VER
typedef signed int int32;
typedef unsigned int uint32;
#elif defined(_ALPHA)
typedef int32_t int32;
typedef uint32_t uint32;
#else
typedef int32_t int32;
typedef uint32_t uint32;
#endif
#endif
/***********************************************************************/
/* Global definitions */
#undef _ANSI_ARGS_
#undef CONST
#if ((defined(__STDC__) || defined(SABER)) && !defined(NO_PROTOTYPE)) || defined(__cplusplus)
# define _USING_PROTOTYPES_ 1
# define _ANSI_ARGS_(x) x
# define CONST const
# ifdef __cplusplus
# define VARARGS(first) (first, ...)
# else
# define VARARGS(first) ()
# endif
#else
# define _ANSI_ARGS_(x) ()
# define CONST
#endif
#ifdef __cplusplus
# define EXTERN extern "C"
#else
# define EXTERN extern
#endif
/*
* Macro to use instead of "void" for arguments that must have
* type "void *" in ANSI C; maps them to type "char *" in
* non-ANSI systems.
*/
#ifndef VOID
# ifdef __STDC__
# define VOID void
# else
# define VOID char
# endif
#endif
/*
* Miscellaneous declarations (to allow Tcl to be used stand-alone,
* without the rest of Sprite).
*/
#ifndef NULL
#define NULL 0
#endif
#define ECSTOLERANCE 0.05
#define PROJ_UNKNOWN "unknown"
#define PROJ_LONGLAT "+proj=longlat"
#define ECSGETJ(s,i1,j1) (int)(((s->rasterconversion.coef.coef_val[0]*j1 + s->rasterconversion.coef.coef_val[1]*i1 + s->rasterconversion.coef.coef_val[6]) / (s->rasterconversion.coef.coef_val[4]*j1 + s->rasterconversion.coef.coef_val[5]*i1 + 1)) + 0.5)
#define ECSGETI(s,i1,j1) (int)(((s->rasterconversion.coef.coef_val[2]*j1 + s->rasterconversion.coef.coef_val[3]*i1 + s->rasterconversion.coef.coef_val[7]) / (s->rasterconversion.coef.coef_val[4]*j1 + s->rasterconversion.coef.coef_val[5]*i1 + 1)) + 0.5)
#ifndef PI
# ifdef M_PI
# define PI M_PI
# else
# define PI 3.1415926535897932384626433832795029
# endif
#endif
/***********************************************************************
* Define ECS_CVSID() macro. It can be disabled during a build by
* defining DISABLE_CVSID in the compiler options.
*
* The cvsid_aw() function is just there to prevent reports of ecs_cvsid()
* being unused.
*/
#ifndef DISABLE_CVSID
#if defined(__GNUC__) && __GNUC__ >= 4
# define ECS_CVSID(string) static const char ecs_cvsid[] __attribute__((used)) = string;
#else
# define ECS_CVSID(string) static char ecs_cvsid[] = string; \
static char *cvsid_aw() { return( cvsid_aw() ? ((char *) NULL) : ecs_cvsid ); }
#endif
#else
# define ECS_CVSID(string)
#endif
/***********************************************************************/
/* defines for defaults file */
#define MAX_DEF_LINE_LENGTH 1024
#define DEFAULTS_INDEX_FILE "ogdidef.idx"
/***********************************************************************/
/* server.c declarations */
#define OGDIID -1
#define OGDICAT -2
#define OGDIDESC -3
#define OGDILAYERINC 32
typedef ecs_Result *dynfunc();
typedef int attrfunc();
/*********************************************************************
STRUCTURE_INFORMATION
NAME
ecs_AttributeLink
DESCRIPTION
Description of a possible link between a geographic layer and a attribute driver
END_DESCRIPTION
ATTRIBUTES
char *url: URL of the geographic layer
char *layer: Geographic layer selection string
ecs_Family family: Family of the geographic objects selected by this layer
char *DriverType: The kind of attribute driver to be link
char *InformationSource: Information source of the link
char *UserDescription: User description
char *AutorizationDescription: Autorization description
char *SelectionRequest: The request to construct the link.
END_ATTRIBUTES
END_STRUCTURE_INFORMATION
********************************************************************/
typedef struct {
char *url;
char *layer;
ecs_Family family;
char *DriverType;
char *InformationSource;
char *UserDescription;
char *AutorizationDescription;
char *SelectionRequest;
} ecs_AttributeLink;
/*********************************************************************
STRUCTURE_INFORMATION
NAME
ecs_Layer
DESCRIPTION
Contain all the layer selection information.
END_DESCRIPTION
ATTRIBUTES
ecs_LayerSelection sel: Layer Selection Information
int index: For GetNextObject, the current object extracted
int nbfeature: The number of features in a layer. Optionnal.
void *priv: The private geographic information of the geographic driver for a geographic layer.
ecs_AttributeLink *AttributeDriverLinkPtr: The item in the list of possible odbc link that's in use. If null, no ODBC link
void *attribute_priv: The private geographic information of the geographic driver.
attrfunc *InitializeDBLinkFuncPtr: The pointer to the function dyn_InitializeDBLink in the attribute driver
attrfunc *DeinitializeDBLinkFuncPtr: The pointer to the function dyn_DeinitializeDBLink in the attribute driver
attrfunc *GetColumnsInfoFuncPtr: The pointer to the function dyn_GetColumnsInfo in the attribute driver
attrfunc *SelectAttributes: The pointer to the function dyn_SelectAttributes in the attribute driver
attrfunc *IsSelectedFuncPtr: The pointer to the function dyn_IsSelected in the attribute driver
attrfunc *GetSelectedAttributesFuncPtr: The pointer to the function GetSelectedAttributes in the attribute driver
void *AttributeDriverHandle: The dynamic library handle for the attribute driver
int SelectionAttributeListQty: The quantity of elements in the SelectionAttributeList
int *SelectionAttributeList: The list of positions of the objects attributes in use in the IsValueIsSelected of the attribute driver
char *AttrRequest: The attribute request with the "?code?" replaced with "?"
END_ATTRIBUTES
END_STRUCTURE_INFORMATION
********************************************************************/
typedef struct {
ecs_LayerSelection sel;
int index;
int nbfeature;
void *priv;
ecs_AttributeLink *AttributeDriverLinkPtr;
void *attribute_priv;
attrfunc *InitializeDBLinkFuncPtr;
attrfunc *DeinitializeDBLinkFuncPtr;
attrfunc *GetColumnsInfoFuncPtr;
attrfunc *SelectAttributesFuncPtr;
attrfunc *IsSelectedFuncPtr;
attrfunc *GetSelectedAttributesFuncPtr;
void *AttributeDriverHandle;
int SelectionAttributeListQty;
int *SelectionAttributeList;
char *AttrRequest;
} ecs_Layer;
/*********************************************************************
STRUCTURE_INFORMATION
NAME
ecs_Server
DESCRIPTION
Contain all the geographic driver information
END_DESCRIPTION
ATTRIBUTES
void *priv: The private geographic information of the geographic driver
ecs_Layer *layer: The table of the layer in use in the driver
int nblayer: Quantity of layer in layer.
int layer_tablesize: The table size of the layer table
int currentLayer: The current layer in use in the driver
void *handle: The dynamic library handle of the geographic driver
ecs_Region currentRegion: The current region of the geographic driver
ecs_Region globalRegion: The global region of the geographic driver
char *projection: The projection string of the contain of the geographic driver
char *hostname: The hostname extracted from the URL
char *server_type: The server type extracted from the URL
char *pathname: The path name extracted from the URL
int isRemote: Indicate if the server is a remote server or not
ecs_RasterConversion rasterconversion: Used to convert rasters in the driver
ecs_Result result: Returned structure to the client
int AttributeListQty: Quantity of links in AttributeList
ecs_AttributeList *AttributeList: The list of attribute links available
dynfunc *createserver: Pointer to the function dyn_CreateServer
dynfunc *destroyserver: Pointer to the function dyn_DestroyServer
dynfunc *selectlayer: Pointer to the function dyn_SelectLayer
dynfunc *releaselayer: Pointer to the function dyn_ReleaseLayer
dynfunc *closelayer: Pointer to the function dyn_ReleaseLayer
dynfunc *selectregion: Pointer to the function dyn_SelectRegion
dynfunc *getdictionary: Pointer to the function dyn_GetDictionary
dynfunc *getattrformat: Pointer to the function dyn_GetAttributesFormat
dynfunc *getnextobject: Pointer to the function dyn_GetNextObject
dynfunc *getrasterinfo: Pointer to the function dyn_GetRasterInfo
dynfunc *getobject: Pointer to the function dyn_GetObject
dynfunc *getobjectid: Pointer to the function dyn_GetObjectIdFromCoord
dynfunc *updatedictionary: Pointer to the function dyn_UpdateDictionary
dynfunc *getserverprojection: Pointer to the function dyn_GetServerProjection
dynfunc *getglobalbound: Pointer to the function dyn_GetGlobalBound
dynfunc *setserverlanguage: Pointer to the function dyn_SetServerLanguage
dynfunc *setrasterconversion: Pointer to the function dyn_SetRasterConversion
END_ATTRIBUTES
END_STRUCTURE_INFORMATION
********************************************************************/
typedef struct {
/* Specific information for dynamic part of the server */
void *priv;
ecs_Layer *layer;
int nblayer;
int currentLayer;
int layer_tablesize;
/* dynamic library handle */
void *handle;
/* Regions of the server */
ecs_Region currentRegion;
ecs_Region globalRegion;
/* Server projection */
char *projection;
/* Extracted information from URL */
char *url;
char *hostname;
char *server_type;
char *pathname;
/* Indicate if the server is a remote server or not */
int isRemote;
/* Indicate if the client is local or not */
int localClient;
/* RasterConversion structure */
ecs_RasterConversion rasterconversion;
/* Structure returned to client */
ecs_Result result;
/* Compression parameters */
ecs_Compression compression;
/* pointers to functions */
dynfunc *createserver;
dynfunc *destroyserver;
dynfunc *selectlayer;
dynfunc *releaselayer;
dynfunc *closelayer;
dynfunc *selectregion;
dynfunc *getdictionary;
dynfunc *getattrformat;
dynfunc *getnextobject;
dynfunc *getrasterinfo;
dynfunc *getobject;
dynfunc *getobjectid;
dynfunc *updatedictionary;
dynfunc *getserverprojection;
dynfunc *getglobalbound;
dynfunc *setserverlanguage;
dynfunc *setrasterconversion;
dynfunc *setcompression;
int AttributeListQty;
ecs_AttributeLink *AttributeList;
} ecs_Server;
ecs_Result *svr_CreateServer _ANSI_ARGS_((ecs_Server *s, char *Request, int isLocal));
ecs_Result *svr_DestroyServer _ANSI_ARGS_((ecs_Server *s));
ecs_Result *svr_SelectLayer _ANSI_ARGS_((ecs_Server *s, ecs_LayerSelection *ls));
ecs_Result *svr_ReleaseLayer _ANSI_ARGS_((ecs_Server *s, ecs_LayerSelection *ls));
void svr_BroadCloseLayers _ANSI_ARGS_((ecs_Server *s));
void svr_CloseLayer _ANSI_ARGS_((ecs_Server *s));
ecs_Result *svr_SelectRegion _ANSI_ARGS_((ecs_Server *s, ecs_Region *gr));
ecs_Result *svr_GetDictionary _ANSI_ARGS_((ecs_Server *s));
ecs_Result *svr_GetAttributesFormat _ANSI_ARGS_((ecs_Server *s));
ecs_Result *svr_GetNextObject _ANSI_ARGS_((ecs_Server *s));
ecs_Result *svr_GetRasterInfo _ANSI_ARGS_((ecs_Server *s));
ecs_Result *svr_GetObject _ANSI_ARGS_((ecs_Server *s, char *Id));
ecs_Result *svr_GetObjectIdFromCoord _ANSI_ARGS_((ecs_Server *s, ecs_Coordinate *coord));
ecs_Result *svr_UpdateDictionary _ANSI_ARGS_((ecs_Server *s, char *info));
ecs_Result *svr_GetServerProjection _ANSI_ARGS_((ecs_Server *s));
ecs_Result *svr_GetGlobalBound _ANSI_ARGS_((ecs_Server *s));
ecs_Result *svr_SetServerLanguage _ANSI_ARGS_((ecs_Server *s, u_int language));
ecs_Result *svr_SetCompression _ANSI_ARGS_((ecs_Server *s, ecs_Compression *compression));
ecs_Result *svr_SetRasterConversion _ANSI_ARGS_((ecs_Server *s,
ecs_RasterConversion *rc));
/* These functions will be called by dynamic servers */
int ecs_SetLayer _ANSI_ARGS_((ecs_Server *s, ecs_LayerSelection *sel));
int ecs_GetLayer _ANSI_ARGS_((ecs_Server *s, ecs_LayerSelection *sel));
void ecs_FreeLayer _ANSI_ARGS_((ecs_Server *s, int layer));
int ecs_RemoveDir _ANSI_ARGS_((char *path));
/* These functions are internally used in server.c */
int ecs_GetLateralDBConnectionCtrlFile _ANSI_ARGS_((ecs_Server *s));
int ecs_SetAttributeLinkWithRequest _ANSI_ARGS_((ecs_Server *s, char *request, ecs_Family family));
int ecs_RemoveAttributeLinkWithRequest _ANSI_ARGS_((ecs_Server *s, char *request, ecs_Family family));
int ecs_SetAttributeQuery _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, char **error));
int ecs_ReleaseAttributeQuery _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, char **error));
int ecs_UnstackRequest _ANSI_ARGS_((ecs_Server *s, char **request));
int AddAttributeLink _ANSI_ARGS_((ecs_Server *s, char *url, char *layer, char *family, char *drivertype, char *infosource, char *userdesc, char *autorization, char *request));
int ecs_SetBindListForVector _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, ecs_Result *msg, char ***BindList, char **error));
int ecs_SetBindListForMatrix _ANSI_ARGS_((ecs_Server *s,ecs_Layer *l,ecs_Category *ptr,char ***BindList,char **error));
int ecs_AddAttributeLink _ANSI_ARGS_((ecs_Server *s,char *url,char *layer,ecs_Family family,char *drivertype,char *infosource,
char *userdesc,char *autorization,char *request));
int ecs_ExtractRequestInformation _ANSI_ARGS_((char *request,char **ExtractRequest,char **DriverType,char **InformationSource,
char **UserDescription,char **AutorizationDescription, char **SelectionRequest));
/***********************************************************************/
/* ecs_dyna.c declarations */
void *ecs_OpenDynamicLib _ANSI_ARGS_((char *libname));
void *ecs_GetDynamicLibFunction _ANSI_ARGS_((void *handle,char *functionname));
void ecs_CloseDynamicLib _ANSI_ARGS_((void *handle));
/***********************************************************************/
/* ecsdist.c declarations */
double ecs_DistanceObject _ANSI_ARGS_((ecs_Object *obj, double X, double Y));
double ecs_DistanceObjectWithTolerance _ANSI_ARGS_((ecs_Object *obj, double X, double Y));
double ecs_SetTolerance _ANSI_ARGS_((ecs_Region *reg));
double ecs_DistanceMBR _ANSI_ARGS_((double xl, double yl, double xu, double yu, double dx, double dy));
double ecs_DistanceSegment _ANSI_ARGS_((double xl, double yl, double xu, double yu, double dx, double dy));
int ecs_IsPointInPolygon _ANSI_ARGS_((int npoints, ecs_Coordinate *poly,double x,double y));
/***********************************************************************/
/* ecsinfo.c declaration */
int ecs_GetDefaultInfo _ANSI_ARGS_((char* url, char* key, char** result));
/***********************************************************************/
/* ecsassoc.c declarations */
/* WARNING: These define do more than one operation.
Please, don't consider these as functions.
*/
/*
----------------------------------------------------------------
ECSRESULTTYPE: This macro indicate the object type of ecs_Result
----------------------------------------------------------------
*/
#define ECSRESULTTYPE(result) ((result)->res.type)
/*
----------------------------------------------------------------
ECSRESULTTYPE: This macro access the union in ecs_Result and
facilitate ecs_Result structures access.
----------------------------------------------------------------
*/
#define ECSRESULT(result) ((result)->res.ecs_ResultUnion_u)
/*
----------------------------------------------------------------
ECSRESULTTYPE: This macro indicate the geographical object type
contain in ecs_Result
----------------------------------------------------------------
*/
#define ECSGEOMTYPE(result) ((result)->res.ecs_ResultUnion_u.dob.geom.family)
/*
----------------------------------------------------------------
ECSGEOM: This macro access the union contain in the geographical
object in ecs_Result.
----------------------------------------------------------------
*/
#define ECSGEOM(result) ((result)->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u)
/*
----------------------------------------------------------------
ECSAREARING: This macro access the area ring in the geographic
object of type Area
----------------------------------------------------------------
*/
#define ECSAREARING(result,pos) ((result)->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.area.ring.ring_val[(pos)])
/*
----------------------------------------------------------------
ECSERROR: Indicate if ecs_Result contain an error code
----------------------------------------------------------------
*/
#define ECSERROR(r) ((r)->error != 0)
/*
----------------------------------------------------------------
ECSSUCCESS: Indicate if ecs_Result contain an success code
----------------------------------------------------------------
*/
#define ECSSUCCESS(r) ((r)->error == 0)
/*
----------------------------------------------------------------
ECSEOF: Indicate if ecs_Result contain EOF message. Mainly
use in cln_GetNextObject function.
----------------------------------------------------------------
*/
#define ECSEOF(r) ((r)->error == 2)
/*
----------------------------------------------------------------
ECSPROJ: Indicate if ecs_Result contain PROJ error message. Mainly
use in cln_GetNextObject function.
----------------------------------------------------------------
*/
#define ECSPROJ(r) ((r)->error == 3)
/*
----------------------------------------------------------------
ECSMESSAGE: Return the error message contain in ecs_Result (an
string).
----------------------------------------------------------------
*/
#define ECSMESSAGE(r) ((r)->message)
/*
----------------------------------------------------------------
ECSREGION: Return the geographical region contain in ecs_Result
(if it's the case). The structure returned is a ecs_Region.
----------------------------------------------------------------
*/
#define ECSREGION(r) (ECSRESULT(r).gr)
/*
----------------------------------------------------------------
ECSTEXT: Return the text string contain in ecs_Result (if
it's the case). The structure returned is a string.
----------------------------------------------------------------
*/
#define ECSTEXT(r) (ECSRESULT(r).s)
/*
----------------------------------------------------------------
ECSRASTERINFO: Return the raster information contain in ecs_Result
(if it's the case). The structure return is a ecs_RasterInfo.
----------------------------------------------------------------
*/
#define ECSRASTERINFO(r) (ECSRESULT(r).ri)
/*
----------------------------------------------------------------
ECSRASTERINFONB: Return the number of categories in the
ecs_RasterInfo structure contain in ecs_Result.
----------------------------------------------------------------
*/
#define ECSRASTERINFONB(r) (ECSRASTERINFO(r).cat.cat_len)
/*
----------------------------------------------------------------
ECSRASTERINFOCAT: Return the category number "c" contain in
ecs_RasterInfo in ecs_Result. The structure returned is a
ecs_Category.
----------------------------------------------------------------
*/
#define ECSRASTERINFOCAT(r,c) (ECSRASTERINFO(r).cat.cat_val[(c)])
/*
----------------------------------------------------------------
ECSOBJECT: Return the geographic object contain in ecs_Result
(if it's the case). The structure return is a ecs_Object.
----------------------------------------------------------------
*/
#define ECSOBJECT(r) (ECSRESULT(r).dob)
/*
----------------------------------------------------------------
ECSOBJECTID: Return the "Id" attribute contain the ecs_Object structure
contain in ecs_Result.
----------------------------------------------------------------
*/
#define ECSOBJECTID(r) (ECSOBJECT(r).Id)
/*
----------------------------------------------------------------
ECSOBJECTATTR: Return the "attr" attribute contain the ecs_Object structure
contain in ecs_Result.
----------------------------------------------------------------
*/
#define ECSOBJECTATTR(r) (ECSOBJECT(r).attr)
/*
----------------------------------------------------------------
ECSRASTER: Return the raster line table contain in ecs_Object.
----------------------------------------------------------------
*/
#define ECSRASTER(r) (ECSOBJECT(r).geom.ecs_Geometry_u.matrix.x.x_val)
/*
----------------------------------------------------------------
ECS_SETGEOMBOUNDINGBOX: This macro will put in the geographical
object contain in "result" the bounding rectangle (lxmin, lymin,
lxmax, lymax).
----------------------------------------------------------------
*/
#define ECS_SETGEOMBOUNDINGBOX(result,lxmin,lymin,lxmax,lymax) { \
{if ((result)->res.type==Object) { \
(result)->res.ecs_ResultUnion_u.dob.xmin=(lxmin); \
(result)->res.ecs_ResultUnion_u.dob.ymin=(lymin); \
(result)->res.ecs_ResultUnion_u.dob.xmax=(lxmax); \
(result)->res.ecs_ResultUnion_u.dob.ymax=(lymax); \
}} \
}
/*
----------------------------------------------------------------
ECSGEOMLINECOORD: This macro put a point (lx,ly) at the position
"position" in a line geographical object. To entirely set the
line object, ecs_SetGeomLine must be call first and for each point,
ECS_SETGEOMLINECOORD must be call.
----------------------------------------------------------------
*/
#define ECS_SETGEOMLINECOORD(result,position,lx,ly) \
{ \
(result)->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.line.c.c_val[position].x = (lx); \
(result)->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.line.c.c_val[position].y = (ly); \
}
/*
----------------------------------------------------------------
ECSGEOMAREACOORD: This macro put a point (lx,ly) at the position
"position" of the ring "ringpos" in a area geographical object. To
entirely set the area object, ecs_SetGeomArea must be call first
and for each ring, ecs_SetGeomAreaRing must be call. In each of
this ring, ECS_SETGEOMAREACOORD must be call define the polygons
points.
----------------------------------------------------------------
*/
#define ECS_SETGEOMAREACOORD(result,ringpos,position,lx,ly) \
{ \
(result)->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.area.ring.ring_val[ringpos].c.c_val[position].x = lx; \
(result)->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.area.ring.ring_val[ringpos].c.c_val[position].y = ly; \
}
/*
----------------------------------------------------------------
ECSGEOMMATRIXCOORD: This macro put a value at the position
"position" in a matrix geographical object. To entirely set the
matrix object, ecs_SetGeomMatrix must be call first and for each
column, ECS_SETGEOMMATRIXCOORD must be call.
----------------------------------------------------------------
*/
#define ECS_SETGEOMMATRIXVALUE(result,lpos,lval) \
{(result)->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.matrix.x.x_val[lpos] = (lval);}
/*
----------------------------------------------------------------
ECSGEOMIMAGECOORD: This macro put a value at the position
"position" in a image geographical object. To entirely set the
image object, ecs_SetGeomImage must be call first and for each
column, ECS_SETGEOMIMAGECOORD must be call.
----------------------------------------------------------------
*/
#define ECS_SETGEOMIMAGEVALUE(result,lpos,lval) \
{(result)->res.ecs_ResultUnion_u.dob.geom.ecs_Geometry_u.image.x.x_val[lpos] = (lval);}
/********************************/
int ecs_SetError _ANSI_ARGS_((ecs_Result *r,
int errorcode, char *error_message));
/* Shoud return TRUE if processing must go on */
typedef int (*ReportErrorType)(int errorcode, const char *error_message);
ReportErrorType ecs_SetReportErrorFunction(ReportErrorType pfn);
int ecs_ShouldStopOnError(void);
int ecs_SetErrorShouldStop _ANSI_ARGS_((ecs_Result *r,
int errorcode, char *error_message));
int ecs_SetSuccess _ANSI_ARGS_((ecs_Result *r));
int ecs_AdjustResult _ANSI_ARGS_((ecs_Result *r));
int ecs_SetGeoRegion _ANSI_ARGS_((ecs_Result *r,
double north, double south, double east,
double west, double nsres, double ewres));
int ecs_SetText _ANSI_ARGS_((ecs_Result *r,char *text));
int ecs_AddText _ANSI_ARGS_((ecs_Result *r,char *text));
int ecs_SetRasterInfo _ANSI_ARGS_((ecs_Result *r, int width, int height));
int ecs_AddRasterInfoCategory _ANSI_ARGS_((ecs_Result *r, long no_cat,
unsigned int red,
unsigned int green,
unsigned int blue, char *label,
unsigned long qty));
int ecs_SetObjAttributeFormat _ANSI_ARGS_((ecs_Result *r));
int ecs_AddAttributeFormat _ANSI_ARGS_((ecs_Result *r, char *name,
ecs_AttributeFormat type,
int length, int precision,
int nullable));
int ecs_SetGeomPoint _ANSI_ARGS_((ecs_Result *r, double x, double y));
int ecs_SetGeomText _ANSI_ARGS_((ecs_Result *r, double x,
double y, char *desc));
int ecs_SetGeomLine _ANSI_ARGS_((ecs_Result *r, unsigned int length));
int ecs_SetGeomArea _ANSI_ARGS_((ecs_Result *r, unsigned int length));
int ecs_SetGeomAreaRing _ANSI_ARGS_((ecs_Result *r, int position,
unsigned int length,
double centroid_x, double centroid_y));
int ecs_SetGeomMatrix _ANSI_ARGS_((ecs_Result *r, int size));
int ecs_SetGeomMatrixWithArray _ANSI_ARGS_((ecs_Result *r, int size, unsigned int *array));
int ecs_SetGeomImage _ANSI_ARGS_((ecs_Result *r, int size));
int ecs_SetGeomImageWithArray _ANSI_ARGS_((ecs_Result *r, int size, unsigned int *array));
int ecs_SetObjectId _ANSI_ARGS_((ecs_Result *r,char *id));
int ecs_SetObjectAttr _ANSI_ARGS_((ecs_Result *r,char *attr));
int ecs_CleanUp _ANSI_ARGS_((ecs_Result *r));
int ecs_CleanUpObject _ANSI_ARGS_((ecs_Object *r));
int ecs_CleanUpResultUnion _ANSI_ARGS_((ecs_ResultUnion *r));
int ecs_ResultInit _ANSI_ARGS_((ecs_Result *r));
int ecs_CalcObjectMBR _ANSI_ARGS_((ecs_Server *s, ecs_Object *obj));
int ecs_CopyResult _ANSI_ARGS_((ecs_Result *source, ecs_Result **copy));
int ecs_CopyResultFromUnion _ANSI_ARGS_((ecs_ResultUnion *source, ecs_Result **copy));
int ecs_CopyResultUnion _ANSI_ARGS_((ecs_ResultUnion *source, ecs_ResultUnion **copy));
int ecs_CopyResultUnionWork _ANSI_ARGS_((ecs_ResultUnion *source, ecs_ResultUnion *copy));
int ecs_CopyObject _ANSI_ARGS_((ecs_Object *source, ecs_Object *copy));
int ecs_CopyGeometry _ANSI_ARGS_((ecs_Object *source, ecs_Object *copy));
int ecs_CopyArea _ANSI_ARGS_((ecs_Area *source, ecs_Area *copy));
int ecs_CopyLine _ANSI_ARGS_((ecs_Line *source, ecs_Line *copy));
int ecs_CopyPoint _ANSI_ARGS_((ecs_Point *source, ecs_Point *copy));
int ecs_CopyText _ANSI_ARGS_((ecs_Text *source, ecs_Text *copy));
int ecs_CopyMatrix _ANSI_ARGS_((ecs_Matrix *source, ecs_Matrix *copy));
int ecs_CopyImage _ANSI_ARGS_((ecs_Image *source, ecs_Image *copy));
void ecs_FreeObject _ANSI_ARGS_((ecs_Object *obj));
/***********************************************************************/
/* ecs_split.c declarations */
void ecs_freeSplitURL _ANSI_ARGS_((char **type,char **machine,char **path));
int ecs_SplitURL _ANSI_ARGS_((const char *url,char **machine,char **server,char **path));
/***********************************************************************/
/* ecs_list.c declarations */
char ecs_Backslash _ANSI_ARGS_((char *src, int *readPtr));
int ecs_FindElement _ANSI_ARGS_((char *list,char **elementPtr, char **nextPtr, int *sizePtr, int *bracePtr));
void ecs_CopyAndCollapse _ANSI_ARGS_((int count,char *src,char *dst));
int ecs_SplitList _ANSI_ARGS_((char *list,int *argcPtr,char ***argvPtr));
/***********************************************************************/
/* dynamic library server declarations */
ecs_Result *dyn_CreateServer _ANSI_ARGS_((ecs_Server *s, char *Request));
ecs_Result *dyn_DestroyServer _ANSI_ARGS_((ecs_Server *s));
ecs_Result *dyn_SelectLayer _ANSI_ARGS_((ecs_Server *s, ecs_LayerSelection *ls));
ecs_Result *dyn_ReleaseLayer _ANSI_ARGS_((ecs_Server *s, ecs_LayerSelection *ls));
ecs_Result *dyn_SelectRegion _ANSI_ARGS_((ecs_Server *s, ecs_Region *gr));
ecs_Result *dyn_GetDictionary _ANSI_ARGS_((ecs_Server *s));
ecs_Result *dyn_GetAttributesFormat _ANSI_ARGS_((ecs_Server *s));
ecs_Result *dyn_GetNextObject _ANSI_ARGS_((ecs_Server *s));
ecs_Result *dyn_GetRasterInfo _ANSI_ARGS_((ecs_Server *s));
ecs_Result *dyn_GetObject _ANSI_ARGS_((ecs_Server *s, char *Id));
ecs_Result *dyn_GetObjectIdFromCoord _ANSI_ARGS_((ecs_Server *s, ecs_Coordinate *coord));
ecs_Result *dyn_UpdateDictionary _ANSI_ARGS_((ecs_Server *s, char *info));
ecs_Result *dyn_GetServerProjection _ANSI_ARGS_((ecs_Server *s));
ecs_Result *dyn_GetGlobalBound _ANSI_ARGS_((ecs_Server *s));
ecs_Result *dyn_SetServerLanguage _ANSI_ARGS_((ecs_Server *s, u_int language));
ecs_Result *dyn_SetRasterConversion _ANSI_ARGS_((ecs_Server *s,
ecs_RasterConversion *rc));
ecs_Result *dyn_SetCompression _ANSI_ARGS_((ecs_Server *s, ecs_Compression *compression));
/***********************************************************************/
/* dynamic library attribute driver declarations */
int dyn_InitializeDBLink _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, char **error));
int dyn_DeinitializeDBLink _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, char **error));
int dyn_GetColumnsInfo _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, int *columns_qty, ecs_ObjAttribute **attr, char **error));
int dyn_SelectAttributes _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, int attribute_qty, char **attribute_list, char **error));
int dyn_IsSelected _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, short *isSelected, char **error));
int dyn_GetSelectedAttributes _ANSI_ARGS_((ecs_Server *s, ecs_Layer *l, char **attributes, char **error));
/***********************************************************************/
/*
* client.h --
*
* Control dispatch of locals client. Also control cache management and
* projection changes.
*
* Copyright (c) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc.
* Il est strictement interdit de publier ou de devoiler le contenu de ce
* programme sans avoir prealablement obtenu la permission de L.A.S. Inc.
*/
#define CACHEINITSIZE 100
#define COMPARETOLERANCE 0.000000001 /* For projection conversion, tolerance factor during projection compare */
#define ECS_TTOS 0 /* define the conversion direction (target to source) or (source to target) */
#define ECS_STOT 1
typedef struct ecs_CtlPoint {
double e1,n1,e2,n2;
double errorx,errory;
} ecs_CtlPoint;
typedef struct ecs_CtlPoints {
int nbpts;
ecs_CtlPoint *pts;
} ecs_CtlPoints;
typedef struct ecs_Cache {
ecs_LayerSelection coverage; /* coverage descriptor */
int size; /* logical cache size */
int startpos; /* beginning position of cache */
int currentpos; /* current position in cache for getnextobject */
int allocatedSize; /* physical size of cache */
ecs_Result **o; /* the cache itself */
struct ecs_Cache *next; /* linked list successor, NULL if end of list */
struct ecs_Cache *previous; /* linked list predecessor */
} ecs_Cache;
/*********************************************************************
STRUCTURE_INFORMATION
NAME
ecs_Datum
DESCRIPTION
Description of all the possible states of a projection about datum.
END_DESCRIPTION
END_STRUCTURE_INFORMATION
********************************************************************/
enum ecs_Datum {
nodatum = 1,
nad27 = 2,
nad83 = 3
};
typedef enum ecs_Datum ecs_Datum;
typedef int dtfunc();
/*********************************************************************
STRUCTURE_INFORMATION
NAME
ecs_LayerCapabilities
DESCRIPTION
Information about a layer gleaned from OGDI_Capabilities document.
END_DESCRIPTION
ATTRIBUTES
char *name: The default layer name, as per the <Name> element.
END_ATTRIBUTES
END_STRUCTURE_INFORMATION
********************************************************************/
#define MAX_FAMILIES 20
typedef struct {
char *name;
char *title;
char *srs;
int families[MAX_FAMILIES];
char **parents;
char **extensions;
int ll_bounds_set;
double ll_north;
double ll_south;
double ll_east;
double ll_west;
double srs_north;
double srs_south;
double srs_east;
double srs_west;
double srs_nsres;
double srs_ewres;
int query_expression_set;
char *qe_prefix;
char *qe_suffix;
char *qe_format;
char *qe_description;
} ecs_LayerCapabilities;
/*********************************************************************
STRUCTURE_INFORMATION
NAME
ecs_Client
DESCRIPTION
Description of the attributes of the c interface object (client.c).
END_DESCRIPTION
ATTRIBUTES
char *url: Client URL, mostly used to see if a client already exist
ecs_Cache *cache: linked list of all cached coverage
ecs_Cache *selectCache: A pointer to the cache selected by SelectLayer
ecs_Region cacheRegion: mbr region of cache
ecs_Region currentRegion: mbr of current region
ecs_Family currentSelectionFamily: Current layer selection type
char *tclprocname: attribute callback procedure for tcl
ecs_Datum targetdatum: target datum information
ecs_Datum sourcedatum: source datum information
void *privdatuminfo: The private datum information pointer. Used to specify the object.
char datumtable[10]: Datum table name
int isCurrentRegionSet: Indicate if the current region is set
double target_azimuth: The azimuth angle to apply to the target projection
double sinazimuth: The azimuth sinus
double cosazimuth: The azimuth cosinus
ecs_Server s: The ecs_Server structure is hold here.
ecs_FeatureRing *mask: Polygon mask
int isMaskInclusive: Indicate if the mask is inclusive (all the objects are completelly inside) or not.
END_ATTRIBUTES
END_STRUCTURE_INFORMATION
********************************************************************/
typedef struct {
char *url; /* Client URL, mostly used to see if a client already exist */
ecs_Cache *cache; /* linked list of all cached coverage */
ecs_Cache *selectCache; /* A pointer to the cache selected by SelectLayer */
ecs_Cache *autoCache; /* Automatic cache when using with remote servers */
ecs_Region cacheRegion; /* mbr region of cache */
ecs_Region currentRegion; /* mbr of current region */
ecs_Family currentSelectionFamily; /* Current layer selection type */
char *tclprocname; /* attribute callback procedure for tcl */
int isCurrentRegionSet;
double target_azimuth;
double sinazimuth;
double cosazimuth;
ecs_Datum targetdatum;
ecs_Datum sourcedatum;
char datumtable[10];
void *privdatuminfo;
ecs_Server s;
ecs_FeatureRing *mask;
ecs_Region maskregion;
int isMaskInclusive;
int have_server_capabilities;
char server_version_str[32];
int server_version; /* version times 1000, ie. 3100 for 3.1 */
char **global_extensions;
int have_capabilities;
int layer_cap_count;
ecs_LayerCapabilities **layer_cap;
} ecs_Client;
#define MAXCLIENT 32
/* Functions used for allocation and deallocation. */
void cln_FreeClient _ANSI_ARGS_((ecs_Client **c));
int cln_AllocClient _ANSI_ARGS_((char *URL,int *error));
/* API functions */
ecs_Result *cln_CreateClient _ANSI_ARGS_((int *ClientID,char *url));
ecs_Result *cln_DestroyClient _ANSI_ARGS_((int ClientID));
ecs_Result *cln_SelectLayer _ANSI_ARGS_((int ClientID, ecs_LayerSelection *ls));
ecs_Result *cln_ReleaseLayer _ANSI_ARGS_((int ClientID, ecs_LayerSelection *ls));
void cln_BroadCloseLayers();
ecs_Result *cln_SelectMask _ANSI_ARGS_((int ClientID,ecs_FeatureRing *mask,int isInclusive));
ecs_Result *cln_UnSelectMask _ANSI_ARGS_((int ClientID));
ecs_Result *cln_SelectRegion _ANSI_ARGS_((int ClientID, ecs_Region *gr));
ecs_Result *cln_GetDictionary _ANSI_ARGS_((int ClientID));
ecs_Result *cln_GetAttributesFormat _ANSI_ARGS_((int ClientID));
ecs_Result *cln_GetNextObject _ANSI_ARGS_((int ClientID));
ecs_Result *cln_GetRasterInfo _ANSI_ARGS_((int ClientID));
ecs_Result *cln_GetObject _ANSI_ARGS_((int ClientID, char *Id));
ecs_Result *cln_GetObjectIdFromCoord _ANSI_ARGS_((int ClientID, ecs_Coordinate *coord));
ecs_Result *cln_UpdateDictionary _ANSI_ARGS_((int ClientID, char *info));
ecs_Result *cln_GetGlobalBound _ANSI_ARGS_((int ClientID));
ecs_Result *cln_SetServerLanguage _ANSI_ARGS_((int ClientID, u_int language));
ecs_Result *cln_SetCompression _ANSI_ARGS_((int ClientID, ecs_Compression *compression));
ecs_Result *cln_GetServerProjection _ANSI_ARGS_((int ClientID));
void cln_SetTclProc _ANSI_ARGS_((int ClientID, char *tclproc));
char *cln_GetTclProc _ANSI_ARGS_((int ClientID));
/* Projection conversion functions */
int cln_UpdateMaxRegion _ANSI_ARGS_((int ClientID, double x, double y, ecs_Region *gr, int sens, int first));
int cln_PointValid _ANSI_ARGS_((int ClientID, double x, double y));
ecs_Datum cln_GetDatumInfo _ANSI_ARGS_((char *projection));
/* Matrix conversion functions */
int cln_CalcCtlPoint _ANSI_ARGS_((int ClientID, ecs_Region *server_region,
int SI, int SJ, ecs_CtlPoint *pt));
int cln_CalcCtlPoints _ANSI_ARGS_((int ClientID, ecs_CtlPoints **pts,
char **error_message));
int cln_SetRasterConversion _ANSI_ARGS_((int ClientID,
ecs_CtlPoints **pts,
ecs_Resampling resampling,
ecs_Transformation trans,
char **error_message));
/* URL manipulation */
int cln_GetClientIdFromURL _ANSI_ARGS_((char *url));
int cln_GetURLList _ANSI_ARGS_((char **urllist));
/* Cache functions */
int cln_SetRegionCaches _ANSI_ARGS_((int ClientID, ecs_Region *GR, char **error_message));
int cln_LoadCache _ANSI_ARGS_((int ClientID, ecs_LayerSelection *ls, char **error_message));
int cln_ReleaseCache _ANSI_ARGS_((int ClientID, ecs_LayerSelection *ls, char **error_message));
void cln_FreeCache _ANSI_ARGS_((ecs_Cache *cache));
ecs_Cache *cln_NewCache _ANSI_ARGS_((int size));
ecs_Cache *cln_FoundCache _ANSI_ARGS_((int ClientID, ecs_LayerSelection *ls));
/* The rest */
void cln_BlockOGDI();
void cln_UnBlockOGDI();
int cln_IsGeoObjectInsideMask _ANSI_ARGS_((int ClientID,ecs_Result *obj));
int cln_ConvMBR _ANSI_ARGS_((int ClientID,double *xl,double *yl,double *xu,double *yu,int direction));
/* capabilities */
ecs_Result *cln_GetVersion( int ClientID );
int cln_CheckExtension( int ClientID, const char *extension,
const char *layer_name );
const ecs_LayerCapabilities *
cln_GetLayerCapabilities( int ClientID, int layer_index );
ecs_Result *cln_LoadCapabilities( int ClientID, const char *arg, int err );
void ecs_ParseCapabilities( ecs_Client *cln, const char *cap_doc,
ecs_Result *result );
/***********************************************************************/
/*
* ecsgeo --
*
* Make geometric calculations
*
* Copyright (c) 1995 Logiciels et Applications Scientifiques (L.A.S.) Inc.
* Il est strictement interdit de publier ou de devoiler le contenu de ce
* programme sans avoir prealablement obtenu la permission de L.A.S. Inc.
*/
void ecs_begin_ellipsoid_polygon_area _ANSI_ARGS_((double a, double e2));
double ecs_Q _ANSI_ARGS_((double x));
double ecs_Qbar _ANSI_ARGS_((double x));
double ecs_planimetric_polygon_area _ANSI_ARGS_((int n,ecs_Coordinate *coord));
double ecs_ellipsoid_polygon_area _ANSI_ARGS_((int n,ecs_Coordinate *coord));
double ecs_geodesic_distance _ANSI_ARGS_((double lon1, double lat1, double lon2, double lat2));
int ecs_CalculateCentroid _ANSI_ARGS_((int nb_segment, ecs_Coordinate *coord,ecs_Coordinate *centroid));
/***********************************************************************/
typedef int tile_func();
/*
********************************************************************
STRUCTURE_INFORMATION
NAME
ecs_TileID
DESCRIPTION
Identifier for a tile
END_DESCRIPTION
ATTRIBUTES
int x: the horizontal tile number
int y: the vertical tile number
short none: 0 if invalid tile
END_ATTRIBUTES
END_STRUCTURE_INFORMATION
********************************************************************
*/
typedef struct ecs_TileID {
int x;
int y;
short none; /* 1 if valid, 0 if uninitialized */
} ecs_TileID;
/*
********************************************************************
STRUCTURE_INFORMATION
NAME
ecs_TileBufferLine
DESCRIPTION
A line in the tile buffer. Stores categories
that have been retrieved from the file.
END_DESCRIPTION
ATTRIBUTES
int *linebuffer: ptr to array of values
(length is stored in ecs_Tile).
int index: the y-matrix position of this line.
int last: the last filled point.
ecs_TileBufferLinePtr *next: pointer to next line.
END_ATTRIBUTES
END_STRUCTURE_INFORMATION
********************************************************************
*/
typedef struct ecs_TileBufferLine {
int *linebuffer;
int index;
int last;
struct ecs_TileBufferLine *next;
} ecs_TileBufferLine;
/*
********************************************************************
STRUCTURE_INFORMATION
NAME
ecs_Tile
DESCRIPTION
structure for storing information about tiling
END_DESCRIPTION
ATTRIBUTES
int x: the number of horizontal tiles
int y: the number of vertical tiles
ecs_Region region: the "global" region of the tile
ecs_Result *callback(); the callback to get the i,j
value
int offValue; the value for a "no data" raster value
int uninitializedValue the value for an uninitialized
matrix value
ecs_TileBufferLine *linebuffer; a pointer to a linked
list of buffered lines
int index; index of the top line in the buffer (y
matrix value)
int nb_lines the number of lines
int linelength; the length of a line
ecs_TileID currentTile; the current tile: -1 if none
void *priv; private data for tile.
END_ATTRIBUTES
END_STRUCTURE_INFORMATION
********************************************************************
*/
typedef struct ecs_TileStructure {
int xtiles; /* the number of horizontal tiles */
int ytiles; /* the number of vertical tiles */
tile_func *callback; /* the callback to get the i,j value */
tile_func *tileDimCallback; /* a callback to get the tile dimensions */
int offValue; /* the value for a "no data" raster value */
int uninitializedValue; /* the value for an uninitialized matrix value */
ecs_Region region;
int regionwidth;
int regionheight;
ecs_TileBufferLine *linebuffer; /* a pointer to a linked list of buffered lines */
int index; /* the index of the top line in the buffer */
int nb_lines; /* the number of lines */
int linelength; /* the length of a line */
int width; /* the width of a tile */
int height; /* the height of a tile */
ecs_TileID currentTile; /* the current tile: -1 if none */
void *priv;
} ecs_TileStructure;
/* public commands */
int ecs_TileInitialize _ANSI_ARGS_((ecs_Server *s, ecs_TileStructure *t, ecs_Region *region, int xtiles, int ytiles, int tilewidth, int tileheight, tile_func *callbackFunc, tile_func *globalRegionFunc));
int ecs_TileGetLine _ANSI_ARGS_((ecs_Server *s, ecs_TileStructure *t, ecs_Coordinate *start, ecs_Coordinate *end));
void ecs_TileClearBuffer _ANSI_ARGS_((ecs_TileStructure *t));
/* private commands */
int ecs_TileFind _ANSI_ARGS_((ecs_Server *s, ecs_TileID *id, ecs_Coordinate *coord));
int ecs_TileFindBuffer _ANSI_ARGS_((ecs_TileStructure *t, int bufptr, ecs_TileBufferLine **tbuf));
int ecs_TileGetCurPos _ANSI_ARGS_((ecs_Server *s, ecs_TileStructure *t, int i, int j, int *cat));
int ecs_TileFill _ANSI_ARGS_((ecs_Server *s, ecs_TileStructure *t, int index, ecs_TileID *tile_id));
int ecs_TileAddLine _ANSI_ARGS_((ecs_TileStructure *tile, int length, int index, ecs_TileBufferLine **tbuf));
int ecs_TileDeleteLine _ANSI_ARGS_((ecs_TileStructure *tile));
void ecs_TileDeleteAllLines _ANSI_ARGS_((ecs_TileStructure *tile));
int ecs_GetTileId _ANSI_ARGS_((ecs_Server *s, ecs_TileStructure *t, ecs_Coordinate *coord, ecs_TileID *tile_id));
int ecs_GetTileIdFromPos _ANSI_ARGS_((ecs_Server *s, ecs_TileStructure *t, int x, int y, ecs_TileID *tile_id));
int ecs_TileCompare _ANSI_ARGS_((ecs_TileID *id1, ecs_TileID *id2));
int ecs_SetTile _ANSI_ARGS_((ecs_TileID *destination, ecs_TileID *source));
/* RGB Image functions */
void ecs_GetRGBFromPixel( unsigned int pixel,
unsigned char *transparent,
unsigned char *r,
unsigned char *g,
unsigned char *b );
unsigned int ecs_GetPixelFromRGB( int trans, int r, int g, int b );
#endif /* ECS_UTIL */