Hex Artifact Content
Not logged in

Artifact 4fef8adfe74142c420f5a2679ec49b9ece4e923c:


0000: 2f 2a 0a 0a 20 67 67 5f 77 6b 62 2e 63 20 2d 2d  /*.. gg_wkb.c --
0010: 20 47 61 69 61 20 63 6f 6d 6d 6f 6e 20 73 75 70   Gaia common sup
0020: 70 6f 72 74 20 66 6f 72 20 57 4b 42 20 65 6e 63  port for WKB enc
0030: 6f 64 65 64 20 67 65 6f 6d 65 74 72 69 65 73 0a  oded geometries.
0040: 20 20 0a 20 76 65 72 73 69 6f 6e 20 35 2e 31 2e    . version 5.1.
0050: 30 2c 20 32 30 32 33 20 41 75 67 75 73 74 20 34  0, 2023 August 4
0060: 0a 0a 20 41 75 74 68 6f 72 3a 20 53 61 6e 64 72  .. Author: Sandr
0070: 6f 20 46 75 72 69 65 72 69 20 61 2e 66 75 72 69  o Furieri a.furi
0080: 65 72 69 40 6c 71 74 2e 69 74 0a 0a 20 2d 2d 2d  eri@lqt.it.. ---
0090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 0a 20 56 65  ----------. . Ve
00e0: 72 73 69 6f 6e 3a 20 4d 50 4c 20 31 2e 31 2f 47  rsion: MPL 1.1/G
00f0: 50 4c 20 32 2e 30 2f 4c 47 50 4c 20 32 2e 31 0a  PL 2.0/LGPL 2.1.
0100: 20 0a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   . The contents 
0110: 6f 66 20 74 68 69 73 20 66 69 6c 65 20 61 72 65  of this file are
0120: 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20   subject to the 
0130: 4d 6f 7a 69 6c 6c 61 20 50 75 62 6c 69 63 20 4c  Mozilla Public L
0140: 69 63 65 6e 73 65 20 56 65 72 73 69 6f 6e 0a 20  icense Version. 
0150: 31 2e 31 20 28 74 68 65 20 22 4c 69 63 65 6e 73  1.1 (the "Licens
0160: 65 22 29 3b 20 79 6f 75 20 6d 61 79 20 6e 6f 74  e"); you may not
0170: 20 75 73 65 20 74 68 69 73 20 66 69 6c 65 20 65   use this file e
0180: 78 63 65 70 74 20 69 6e 20 63 6f 6d 70 6c 69 61  xcept in complia
0190: 6e 63 65 20 77 69 74 68 0a 20 74 68 65 20 4c 69  nce with. the Li
01a0: 63 65 6e 73 65 2e 20 59 6f 75 20 6d 61 79 20 6f  cense. You may o
01b0: 62 74 61 69 6e 20 61 20 63 6f 70 79 20 6f 66 20  btain a copy of 
01c0: 74 68 65 20 4c 69 63 65 6e 73 65 20 61 74 0a 20  the License at. 
01d0: 68 74 74 70 3a 2f 2f 77 77 77 2e 6d 6f 7a 69 6c  http://www.mozil
01e0: 6c 61 2e 6f 72 67 2f 4d 50 4c 2f 0a 20 0a 53 6f  la.org/MPL/. .So
01f0: 66 74 77 61 72 65 20 64 69 73 74 72 69 62 75 74  ftware distribut
0200: 65 64 20 75 6e 64 65 72 20 74 68 65 20 4c 69 63  ed under the Lic
0210: 65 6e 73 65 20 69 73 20 64 69 73 74 72 69 62 75  ense is distribu
0220: 74 65 64 20 6f 6e 20 61 6e 20 22 41 53 20 49 53  ted on an "AS IS
0230: 22 20 62 61 73 69 73 2c 0a 57 49 54 48 4f 55 54  " basis,.WITHOUT
0240: 20 57 41 52 52 41 4e 54 59 20 4f 46 20 41 4e 59   WARRANTY OF ANY
0250: 20 4b 49 4e 44 2c 20 65 69 74 68 65 72 20 65 78   KIND, either ex
0260: 70 72 65 73 73 20 6f 72 20 69 6d 70 6c 69 65 64  press or implied
0270: 2e 20 53 65 65 20 74 68 65 20 4c 69 63 65 6e 73  . See the Licens
0280: 65 0a 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  e.for the specif
0290: 69 63 20 6c 61 6e 67 75 61 67 65 20 67 6f 76 65  ic language gove
02a0: 72 6e 69 6e 67 20 72 69 67 68 74 73 20 61 6e 64  rning rights and
02b0: 20 6c 69 6d 69 74 61 74 69 6f 6e 73 20 75 6e 64   limitations und
02c0: 65 72 20 74 68 65 0a 4c 69 63 65 6e 73 65 2e 0a  er the.License..
02d0: 0a 54 68 65 20 4f 72 69 67 69 6e 61 6c 20 43 6f  .The Original Co
02e0: 64 65 20 69 73 20 74 68 65 20 53 70 61 74 69 61  de is the Spatia
02f0: 4c 69 74 65 20 6c 69 62 72 61 72 79 0a 0a 54 68  Lite library..Th
0300: 65 20 49 6e 69 74 69 61 6c 20 44 65 76 65 6c 6f  e Initial Develo
0310: 70 65 72 20 6f 66 20 74 68 65 20 4f 72 69 67 69  per of the Origi
0320: 6e 61 6c 20 43 6f 64 65 20 69 73 20 41 6c 65 73  nal Code is Ales
0330: 73 61 6e 64 72 6f 20 46 75 72 69 65 72 69 0a 20  sandro Furieri. 
0340: 0a 50 6f 72 74 69 6f 6e 73 20 63 72 65 61 74 65  .Portions create
0350: 64 20 62 79 20 74 68 65 20 49 6e 69 74 69 61 6c  d by the Initial
0360: 20 44 65 76 65 6c 6f 70 65 72 20 61 72 65 20 43   Developer are C
0370: 6f 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30  opyright (C) 200
0380: 38 2d 32 30 32 33 0a 74 68 65 20 49 6e 69 74 69  8-2023.the Initi
0390: 61 6c 20 44 65 76 65 6c 6f 70 65 72 2e 20 41 6c  al Developer. Al
03a0: 6c 20 52 69 67 68 74 73 20 52 65 73 65 72 76 65  l Rights Reserve
03b0: 64 2e 0a 0a 43 6f 6e 74 72 69 62 75 74 6f 72 28  d...Contributor(
03c0: 73 29 3a 0a 0a 41 6c 74 65 72 6e 61 74 69 76 65  s):..Alternative
03d0: 6c 79 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ly, the contents
03e0: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 6d 61   of this file ma
03f0: 79 20 62 65 20 75 73 65 64 20 75 6e 64 65 72 20  y be used under 
0400: 74 68 65 20 74 65 72 6d 73 20 6f 66 0a 65 69 74  the terms of.eit
0410: 68 65 72 20 74 68 65 20 47 4e 55 20 47 65 6e 65  her the GNU Gene
0420: 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e  ral Public Licen
0430: 73 65 20 56 65 72 73 69 6f 6e 20 32 20 6f 72 20  se Version 2 or 
0440: 6c 61 74 65 72 20 28 74 68 65 20 22 47 50 4c 22  later (the "GPL"
0450: 29 2c 20 6f 72 0a 74 68 65 20 47 4e 55 20 4c 65  ), or.the GNU Le
0460: 73 73 65 72 20 47 65 6e 65 72 61 6c 20 50 75 62  sser General Pub
0470: 6c 69 63 20 4c 69 63 65 6e 73 65 20 56 65 72 73  lic License Vers
0480: 69 6f 6e 20 32 2e 31 20 6f 72 20 6c 61 74 65 72  ion 2.1 or later
0490: 20 28 74 68 65 20 22 4c 47 50 4c 22 29 2c 0a 69   (the "LGPL"),.i
04a0: 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
04b0: 20 70 72 6f 76 69 73 69 6f 6e 73 20 6f 66 20 74   provisions of t
04c0: 68 65 20 47 50 4c 20 6f 72 20 74 68 65 20 4c 47  he GPL or the LG
04d0: 50 4c 20 61 72 65 20 61 70 70 6c 69 63 61 62 6c  PL are applicabl
04e0: 65 20 69 6e 73 74 65 61 64 0a 6f 66 20 74 68 6f  e instead.of tho
04f0: 73 65 20 61 62 6f 76 65 2e 20 49 66 20 79 6f 75  se above. If you
0500: 20 77 69 73 68 20 74 6f 20 61 6c 6c 6f 77 20 75   wish to allow u
0510: 73 65 20 6f 66 20 79 6f 75 72 20 76 65 72 73 69  se of your versi
0520: 6f 6e 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20  on of this file 
0530: 6f 6e 6c 79 0a 75 6e 64 65 72 20 74 68 65 20 74  only.under the t
0540: 65 72 6d 73 20 6f 66 20 65 69 74 68 65 72 20 74  erms of either t
0550: 68 65 20 47 50 4c 20 6f 72 20 74 68 65 20 4c 47  he GPL or the LG
0560: 50 4c 2c 20 61 6e 64 20 6e 6f 74 20 74 6f 20 61  PL, and not to a
0570: 6c 6c 6f 77 20 6f 74 68 65 72 73 20 74 6f 0a 75  llow others to.u
0580: 73 65 20 79 6f 75 72 20 76 65 72 73 69 6f 6e 20  se your version 
0590: 6f 66 20 74 68 69 73 20 66 69 6c 65 20 75 6e 64  of this file und
05a0: 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  er the terms of 
05b0: 74 68 65 20 4d 50 4c 2c 20 69 6e 64 69 63 61 74  the MPL, indicat
05c0: 65 20 79 6f 75 72 0a 64 65 63 69 73 69 6f 6e 20  e your.decision 
05d0: 62 79 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  by deleting the 
05e0: 70 72 6f 76 69 73 69 6f 6e 73 20 61 62 6f 76 65  provisions above
05f0: 20 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68 65   and replace the
0600: 6d 20 77 69 74 68 20 74 68 65 20 6e 6f 74 69 63  m with the notic
0610: 65 0a 61 6e 64 20 6f 74 68 65 72 20 70 72 6f 76  e.and other prov
0620: 69 73 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20  isions required 
0630: 62 79 20 74 68 65 20 47 50 4c 20 6f 72 20 74 68  by the GPL or th
0640: 65 20 4c 47 50 4c 2e 20 49 66 20 79 6f 75 20 64  e LGPL. If you d
0650: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 0a 74 68 65  o not delete.the
0660: 20 70 72 6f 76 69 73 69 6f 6e 73 20 61 62 6f 76   provisions abov
0670: 65 2c 20 61 20 72 65 63 69 70 69 65 6e 74 20 6d  e, a recipient m
0680: 61 79 20 75 73 65 20 79 6f 75 72 20 76 65 72 73  ay use your vers
0690: 69 6f 6e 20 6f 66 20 74 68 69 73 20 66 69 6c 65  ion of this file
06a0: 20 75 6e 64 65 72 0a 74 68 65 20 74 65 72 6d 73   under.the terms
06b0: 20 6f 66 20 61 6e 79 20 6f 6e 65 20 6f 66 20 74   of any one of t
06c0: 68 65 20 4d 50 4c 2c 20 74 68 65 20 47 50 4c 20  he MPL, the GPL 
06d0: 6f 72 20 74 68 65 20 4c 47 50 4c 2e 0a 20 0a 2a  or the LGPL.. .*
06e0: 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  /..#include <sys
06f0: 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75  /types.h>.#inclu
0700: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0710: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e  nclude <stdio.h>
0720: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 6c 6f 61 74  .#include <float
0730: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0740: 72 69 6e 67 2e 68 3e 0a 0a 23 69 66 20 64 65 66  ring.h>..#if def
0750: 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20  ined(_WIN32) && 
0760: 21 64 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57  !defined(__MINGW
0770: 33 32 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 20 22  32__).#include "
0780: 63 6f 6e 66 69 67 2d 6d 73 76 63 2e 68 22 0a 23  config-msvc.h".#
0790: 65 6c 73 65 0a 23 69 6e 63 6c 75 64 65 20 22 63  else.#include "c
07a0: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
07b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 70 61 74 69  .#include <spati
07c0: 61 6c 69 74 65 2f 73 71 6c 69 74 65 2e 68 3e 0a  alite/sqlite.h>.
07d0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 70 61 74 69  .#include <spati
07e0: 61 6c 69 74 65 2f 67 61 69 61 67 65 6f 2e 68 3e  alite/gaiageo.h>
07f0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 70 61 74 69  .#include <spati
0800: 61 6c 69 74 65 2f 67 65 6f 70 61 63 6b 61 67 65  alite/geopackage
0810: 2e 68 3e 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .h>..static void
0820: 0a 50 61 72 73 65 57 6b 62 50 6f 69 6e 74 20 28  .ParseWkbPoint (
0830: 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
0840: 67 65 6f 29 0a 7b 0a 2f 2a 20 64 65 63 6f 64 65  geo).{./* decode
0850: 73 20 61 20 50 4f 49 4e 54 20 66 72 6f 6d 20 57  s a POINT from W
0860: 4b 42 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65  KB */.    double
0870: 20 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79   x;.    double y
0880: 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 2d 3e 73  ;.    if (geo->s
0890: 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66 73 65  ize < geo->offse
08a0: 74 20 2b 20 31 36 29 0a 09 72 65 74 75 72 6e 3b  t + 16)..return;
08b0: 0a 20 20 20 20 78 20 3d 20 67 61 69 61 49 6d 70  .    x = gaiaImp
08c0: 6f 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c 6f 62  ort64 (geo->blob
08d0: 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74 2c 20   + geo->offset, 
08e0: 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 20 67 65 6f  geo->endian, geo
08f0: 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  ->endian_arch);.
0900: 20 20 20 20 79 20 3d 20 67 61 69 61 49 6d 70 6f      y = gaiaImpo
0910: 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c 6f 62 20  rt64 (geo->blob 
0920: 2b 20 28 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b  + (geo->offset +
0930: 20 38 29 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e   8), geo->endian
0940: 2c 0a 09 09 20 20 20 20 20 20 67 65 6f 2d 3e 65  ,...      geo->e
0950: 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20  ndian_arch);.   
0960: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d 20   geo->offset += 
0970: 31 36 3b 0a 20 20 20 20 67 61 69 61 41 64 64 50  16;.    gaiaAddP
0980: 6f 69 6e 74 54 6f 47 65 6f 6d 43 6f 6c 6c 20 28  ointToGeomColl (
0990: 67 65 6f 2c 20 78 2c 20 79 29 3b 0a 7d 0a 0a 73  geo, x, y);.}..s
09a0: 74 61 74 69 63 20 76 6f 69 64 0a 50 61 72 73 65  tatic void.Parse
09b0: 57 6b 62 50 6f 69 6e 74 5a 20 28 67 61 69 61 47  WkbPointZ (gaiaG
09c0: 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 29 0a  eomCollPtr geo).
09d0: 7b 0a 2f 2a 20 64 65 63 6f 64 65 73 20 61 20 50  {./* decodes a P
09e0: 4f 49 4e 54 5a 20 66 72 6f 6d 20 57 4b 42 20 2a  OINTZ from WKB *
09f0: 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a  /.    double x;.
0a00: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
0a10: 20 20 64 6f 75 62 6c 65 20 7a 3b 0a 20 20 20 20    double z;.    
0a20: 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20  if (geo->size < 
0a30: 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 32 34  geo->offset + 24
0a40: 29 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 78  )..return;.    x
0a50: 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34 20   = gaiaImport64 
0a60: 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f  (geo->blob + geo
0a70: 2d 3e 6f 66 66 73 65 74 2c 20 67 65 6f 2d 3e 65  ->offset, geo->e
0a80: 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e 65 6e 64 69  ndian, geo->endi
0a90: 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20 79 20  an_arch);.    y 
0aa0: 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28  = gaiaImport64 (
0ab0: 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 28 67 65 6f  geo->blob + (geo
0ac0: 2d 3e 6f 66 66 73 65 74 20 2b 20 38 29 2c 20 67  ->offset + 8), g
0ad0: 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09 20 20  eo->endian,...  
0ae0: 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f      geo->endian_
0af0: 61 72 63 68 29 3b 0a 20 20 20 20 7a 20 3d 20 67  arch);.    z = g
0b00: 61 69 61 49 6d 70 6f 72 74 36 34 20 28 67 65 6f  aiaImport64 (geo
0b10: 2d 3e 62 6c 6f 62 20 2b 20 28 67 65 6f 2d 3e 6f  ->blob + (geo->o
0b20: 66 66 73 65 74 20 2b 20 31 36 29 2c 20 67 65 6f  ffset + 16), geo
0b30: 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09 20 20 20 20  ->endian,...    
0b40: 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72    geo->endian_ar
0b50: 63 68 29 3b 0a 20 20 20 20 67 65 6f 2d 3e 6f 66  ch);.    geo->of
0b60: 66 73 65 74 20 2b 3d 20 32 34 3b 0a 20 20 20 20  fset += 24;.    
0b70: 67 61 69 61 41 64 64 50 6f 69 6e 74 54 6f 47 65  gaiaAddPointToGe
0b80: 6f 6d 43 6f 6c 6c 58 59 5a 20 28 67 65 6f 2c 20  omCollXYZ (geo, 
0b90: 78 2c 20 79 2c 20 7a 29 3b 0a 7d 0a 0a 73 74 61  x, y, z);.}..sta
0ba0: 74 69 63 20 76 6f 69 64 0a 50 61 72 73 65 57 6b  tic void.ParseWk
0bb0: 62 50 6f 69 6e 74 4d 20 28 67 61 69 61 47 65 6f  bPointM (gaiaGeo
0bc0: 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 29 0a 7b 0a  mCollPtr geo).{.
0bd0: 2f 2a 20 64 65 63 6f 64 65 73 20 61 20 50 4f 49  /* decodes a POI
0be0: 4e 54 4d 20 66 72 6f 6d 20 57 4b 42 20 2a 2f 0a  NTM from WKB */.
0bf0: 20 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20      double x;.  
0c00: 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20    double y;.    
0c10: 64 6f 75 62 6c 65 20 6d 3b 0a 20 20 20 20 69 66  double m;.    if
0c20: 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65   (geo->size < ge
0c30: 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 32 34 29 0a  o->offset + 24).
0c40: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 78 20 3d  .return;.    x =
0c50: 20 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28 67   gaiaImport64 (g
0c60: 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e  eo->blob + geo->
0c70: 6f 66 66 73 65 74 2c 20 67 65 6f 2d 3e 65 6e 64  offset, geo->end
0c80: 69 61 6e 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e  ian, geo->endian
0c90: 5f 61 72 63 68 29 3b 0a 20 20 20 20 79 20 3d 20  _arch);.    y = 
0ca0: 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28 67 65  gaiaImport64 (ge
0cb0: 6f 2d 3e 62 6c 6f 62 20 2b 20 28 67 65 6f 2d 3e  o->blob + (geo->
0cc0: 6f 66 66 73 65 74 20 2b 20 38 29 2c 20 67 65 6f  offset + 8), geo
0cd0: 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09 20 20 20 20  ->endian,...    
0ce0: 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72    geo->endian_ar
0cf0: 63 68 29 3b 0a 20 20 20 20 6d 20 3d 20 67 61 69  ch);.    m = gai
0d00: 61 49 6d 70 6f 72 74 36 34 20 28 67 65 6f 2d 3e  aImport64 (geo->
0d10: 62 6c 6f 62 20 2b 20 28 67 65 6f 2d 3e 6f 66 66  blob + (geo->off
0d20: 73 65 74 20 2b 20 31 36 29 2c 20 67 65 6f 2d 3e  set + 16), geo->
0d30: 65 6e 64 69 61 6e 2c 0a 09 09 20 20 20 20 20 20  endian,...      
0d40: 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68  geo->endian_arch
0d50: 29 3b 0a 20 20 20 20 67 65 6f 2d 3e 6f 66 66 73  );.    geo->offs
0d60: 65 74 20 2b 3d 20 32 34 3b 0a 20 20 20 20 67 61  et += 24;.    ga
0d70: 69 61 41 64 64 50 6f 69 6e 74 54 6f 47 65 6f 6d  iaAddPointToGeom
0d80: 43 6f 6c 6c 58 59 4d 20 28 67 65 6f 2c 20 78 2c  CollXYM (geo, x,
0d90: 20 79 2c 20 6d 29 3b 0a 7d 0a 0a 73 74 61 74 69   y, m);.}..stati
0da0: 63 20 76 6f 69 64 0a 50 61 72 73 65 57 6b 62 50  c void.ParseWkbP
0db0: 6f 69 6e 74 5a 4d 20 28 67 61 69 61 47 65 6f 6d  ointZM (gaiaGeom
0dc0: 43 6f 6c 6c 50 74 72 20 67 65 6f 29 0a 7b 0a 2f  CollPtr geo).{./
0dd0: 2a 20 64 65 63 6f 64 65 73 20 61 20 50 4f 49 4e  * decodes a POIN
0de0: 54 5a 4d 20 66 72 6f 6d 20 57 4b 42 20 2a 2f 0a  TZM from WKB */.
0df0: 20 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20      double x;.  
0e00: 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20    double y;.    
0e10: 64 6f 75 62 6c 65 20 7a 3b 0a 20 20 20 20 64 6f  double z;.    do
0e20: 75 62 6c 65 20 6d 3b 0a 20 20 20 20 69 66 20 28  uble m;.    if (
0e30: 67 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65 6f 2d  geo->size < geo-
0e40: 3e 6f 66 66 73 65 74 20 2b 20 33 32 29 0a 09 72  >offset + 32)..r
0e50: 65 74 75 72 6e 3b 0a 20 20 20 20 78 20 3d 20 67  eturn;.    x = g
0e60: 61 69 61 49 6d 70 6f 72 74 36 34 20 28 67 65 6f  aiaImport64 (geo
0e70: 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66  ->blob + geo->of
0e80: 66 73 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69 61  fset, geo->endia
0e90: 6e 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61  n, geo->endian_a
0ea0: 72 63 68 29 3b 0a 20 20 20 20 79 20 3d 20 67 61  rch);.    y = ga
0eb0: 69 61 49 6d 70 6f 72 74 36 34 20 28 67 65 6f 2d  iaImport64 (geo-
0ec0: 3e 62 6c 6f 62 20 2b 20 28 67 65 6f 2d 3e 6f 66  >blob + (geo->of
0ed0: 66 73 65 74 20 2b 20 38 29 2c 20 67 65 6f 2d 3e  fset + 8), geo->
0ee0: 65 6e 64 69 61 6e 2c 0a 09 09 20 20 20 20 20 20  endian,...      
0ef0: 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68  geo->endian_arch
0f00: 29 3b 0a 20 20 20 20 7a 20 3d 20 67 61 69 61 49  );.    z = gaiaI
0f10: 6d 70 6f 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c  mport64 (geo->bl
0f20: 6f 62 20 2b 20 28 67 65 6f 2d 3e 6f 66 66 73 65  ob + (geo->offse
0f30: 74 20 2b 20 31 36 29 2c 20 67 65 6f 2d 3e 65 6e  t + 16), geo->en
0f40: 64 69 61 6e 2c 0a 09 09 20 20 20 20 20 20 67 65  dian,...      ge
0f50: 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  o->endian_arch);
0f60: 0a 20 20 20 20 6d 20 3d 20 67 61 69 61 49 6d 70  .    m = gaiaImp
0f70: 6f 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c 6f 62  ort64 (geo->blob
0f80: 20 2b 20 28 67 65 6f 2d 3e 6f 66 66 73 65 74 20   + (geo->offset 
0f90: 2b 20 32 34 29 2c 20 67 65 6f 2d 3e 65 6e 64 69  + 24), geo->endi
0fa0: 61 6e 2c 0a 09 09 20 20 20 20 20 20 67 65 6f 2d  an,...      geo-
0fb0: 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20  >endian_arch);. 
0fc0: 20 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b     geo->offset +
0fd0: 3d 20 33 32 3b 0a 20 20 20 20 67 61 69 61 41 64  = 32;.    gaiaAd
0fe0: 64 50 6f 69 6e 74 54 6f 47 65 6f 6d 43 6f 6c 6c  dPointToGeomColl
0ff0: 58 59 5a 4d 20 28 67 65 6f 2c 20 78 2c 20 79 2c  XYZM (geo, x, y,
1000: 20 7a 2c 20 6d 29 3b 0a 7d 0a 0a 73 74 61 74 69   z, m);.}..stati
1010: 63 20 76 6f 69 64 0a 50 61 72 73 65 57 6b 62 4c  c void.ParseWkbL
1020: 69 6e 65 20 28 67 61 69 61 47 65 6f 6d 43 6f 6c  ine (gaiaGeomCol
1030: 6c 50 74 72 20 67 65 6f 29 0a 7b 0a 2f 2a 20 64  lPtr geo).{./* d
1040: 65 63 6f 64 65 73 20 61 20 4c 49 4e 45 53 54 52  ecodes a LINESTR
1050: 49 4e 47 20 66 72 6f 6d 20 57 4b 42 20 2a 2f 0a  ING from WKB */.
1060: 20 20 20 20 69 6e 74 20 70 6f 69 6e 74 73 3b 0a      int points;.
1070: 20 20 20 20 69 6e 74 20 69 76 3b 0a 20 20 20 20      int iv;.    
1080: 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 64 6f  double x;.    do
1090: 75 62 6c 65 20 79 3b 0a 20 20 20 20 67 61 69 61  uble y;.    gaia
10a0: 4c 69 6e 65 73 74 72 69 6e 67 50 74 72 20 6c 69  LinestringPtr li
10b0: 6e 65 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 2d  ne;.    if (geo-
10c0: 3e 73 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66  >size < geo->off
10d0: 73 65 74 20 2b 20 34 29 0a 09 72 65 74 75 72 6e  set + 4)..return
10e0: 3b 0a 20 20 20 20 70 6f 69 6e 74 73 20 3d 0a 09  ;.    points =..
10f0: 67 61 69 61 49 6d 70 6f 72 74 33 32 20 28 67 65  gaiaImport32 (ge
1100: 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f  o->blob + geo->o
1110: 66 66 73 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69  ffset, geo->endi
1120: 61 6e 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f  an, geo->endian_
1130: 61 72 63 68 29 3b 0a 20 20 20 20 67 65 6f 2d 3e  arch);.    geo->
1140: 6f 66 66 73 65 74 20 2b 3d 20 34 3b 0a 20 20 20  offset += 4;.   
1150: 20 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c   if (geo->size <
1160: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 28   geo->offset + (
1170: 31 36 20 2a 20 70 6f 69 6e 74 73 29 29 0a 09 72  16 * points))..r
1180: 65 74 75 72 6e 3b 0a 20 20 20 20 6c 69 6e 65 20  eturn;.    line 
1190: 3d 20 67 61 69 61 41 64 64 4c 69 6e 65 73 74 72  = gaiaAddLinestr
11a0: 69 6e 67 54 6f 47 65 6f 6d 43 6f 6c 6c 20 28 67  ingToGeomColl (g
11b0: 65 6f 2c 20 70 6f 69 6e 74 73 29 3b 0a 20 20 20  eo, points);.   
11c0: 20 66 6f 72 20 28 69 76 20 3d 20 30 3b 20 69 76   for (iv = 0; iv
11d0: 20 3c 20 70 6f 69 6e 74 73 3b 20 69 76 2b 2b 29   < points; iv++)
11e0: 0a 20 20 20 20 20 20 7b 0a 09 20 20 78 20 3d 20  .      {..  x = 
11f0: 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28 67 65  gaiaImport64 (ge
1200: 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f  o->blob + geo->o
1210: 66 66 73 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69  ffset, geo->endi
1220: 61 6e 2c 0a 09 09 09 20 20 20 20 67 65 6f 2d 3e  an,....    geo->
1230: 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 20  endian_arch);.. 
1240: 20 79 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36   y = gaiaImport6
1250: 34 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 28  4 (geo->blob + (
1260: 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 38 29  geo->offset + 8)
1270: 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09  , geo->endian,..
1280: 09 09 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69 61  ..    geo->endia
1290: 6e 5f 61 72 63 68 29 3b 0a 09 20 20 67 61 69 61  n_arch);..  gaia
12a0: 53 65 74 50 6f 69 6e 74 20 28 6c 69 6e 65 2d 3e  SetPoint (line->
12b0: 43 6f 6f 72 64 73 2c 20 69 76 2c 20 78 2c 20 79  Coords, iv, x, y
12c0: 29 3b 0a 09 20 20 67 65 6f 2d 3e 6f 66 66 73 65  );..  geo->offse
12d0: 74 20 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20 7d  t += 16;.      }
12e0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
12f0: 50 61 72 73 65 57 6b 62 4c 69 6e 65 5a 20 28 67  ParseWkbLineZ (g
1300: 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
1310: 65 6f 29 0a 7b 0a 2f 2a 20 64 65 63 6f 64 65 73  eo).{./* decodes
1320: 20 61 20 4c 49 4e 45 53 54 52 49 4e 47 5a 20 66   a LINESTRINGZ f
1330: 72 6f 6d 20 57 4b 42 20 2a 2f 0a 20 20 20 20 69  rom WKB */.    i
1340: 6e 74 20 70 6f 69 6e 74 73 3b 0a 20 20 20 20 69  nt points;.    i
1350: 6e 74 20 69 76 3b 0a 20 20 20 20 64 6f 75 62 6c  nt iv;.    doubl
1360: 65 20 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  e x;.    double 
1370: 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 7a 3b  y;.    double z;
1380: 0a 20 20 20 20 67 61 69 61 4c 69 6e 65 73 74 72  .    gaiaLinestr
1390: 69 6e 67 50 74 72 20 6c 69 6e 65 3b 0a 20 20 20  ingPtr line;.   
13a0: 20 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c   if (geo->size <
13b0: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 34   geo->offset + 4
13c0: 29 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 70  )..return;.    p
13d0: 6f 69 6e 74 73 20 3d 0a 09 67 61 69 61 49 6d 70  oints =..gaiaImp
13e0: 6f 72 74 33 32 20 28 67 65 6f 2d 3e 62 6c 6f 62  ort32 (geo->blob
13f0: 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74 2c 20   + geo->offset, 
1400: 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 20 67 65 6f  geo->endian, geo
1410: 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  ->endian_arch);.
1420: 20 20 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20      geo->offset 
1430: 2b 3d 20 34 3b 0a 20 20 20 20 69 66 20 28 67 65  += 4;.    if (ge
1440: 6f 2d 3e 73 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f  o->size < geo->o
1450: 66 66 73 65 74 20 2b 20 28 32 34 20 2a 20 70 6f  ffset + (24 * po
1460: 69 6e 74 73 29 29 0a 09 72 65 74 75 72 6e 3b 0a  ints))..return;.
1470: 20 20 20 20 6c 69 6e 65 20 3d 20 67 61 69 61 41      line = gaiaA
1480: 64 64 4c 69 6e 65 73 74 72 69 6e 67 54 6f 47 65  ddLinestringToGe
1490: 6f 6d 43 6f 6c 6c 20 28 67 65 6f 2c 20 70 6f 69  omColl (geo, poi
14a0: 6e 74 73 29 3b 0a 20 20 20 20 66 6f 72 20 28 69  nts);.    for (i
14b0: 76 20 3d 20 30 3b 20 69 76 20 3c 20 70 6f 69 6e  v = 0; iv < poin
14c0: 74 73 3b 20 69 76 2b 2b 29 0a 20 20 20 20 20 20  ts; iv++).      
14d0: 7b 0a 09 20 20 78 20 3d 20 67 61 69 61 49 6d 70  {..  x = gaiaImp
14e0: 6f 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c 6f 62  ort64 (geo->blob
14f0: 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74 2c 20   + geo->offset, 
1500: 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09 09  geo->endian,....
1510: 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f      geo->endian_
1520: 61 72 63 68 29 3b 0a 09 20 20 79 20 3d 20 67 61  arch);..  y = ga
1530: 69 61 49 6d 70 6f 72 74 36 34 20 28 67 65 6f 2d  iaImport64 (geo-
1540: 3e 62 6c 6f 62 20 2b 20 28 67 65 6f 2d 3e 6f 66  >blob + (geo->of
1550: 66 73 65 74 20 2b 20 38 29 2c 20 67 65 6f 2d 3e  fset + 8), geo->
1560: 65 6e 64 69 61 6e 2c 0a 09 09 09 20 20 20 20 67  endian,....    g
1570: 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29  eo->endian_arch)
1580: 3b 0a 09 20 20 7a 20 3d 20 67 61 69 61 49 6d 70  ;..  z = gaiaImp
1590: 6f 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c 6f 62  ort64 (geo->blob
15a0: 20 2b 20 28 67 65 6f 2d 3e 6f 66 66 73 65 74 20   + (geo->offset 
15b0: 2b 20 31 36 29 2c 20 67 65 6f 2d 3e 65 6e 64 69  + 16), geo->endi
15c0: 61 6e 2c 0a 09 09 09 20 20 20 20 67 65 6f 2d 3e  an,....    geo->
15d0: 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 20  endian_arch);.. 
15e0: 20 67 61 69 61 53 65 74 50 6f 69 6e 74 58 59 5a   gaiaSetPointXYZ
15f0: 20 28 6c 69 6e 65 2d 3e 43 6f 6f 72 64 73 2c 20   (line->Coords, 
1600: 69 76 2c 20 78 2c 20 79 2c 20 7a 29 3b 0a 09 20  iv, x, y, z);.. 
1610: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d 20   geo->offset += 
1620: 32 34 3b 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a 73  24;.      }.}..s
1630: 74 61 74 69 63 20 76 6f 69 64 0a 50 61 72 73 65  tatic void.Parse
1640: 57 6b 62 4c 69 6e 65 4d 20 28 67 61 69 61 47 65  WkbLineM (gaiaGe
1650: 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 29 0a 7b  omCollPtr geo).{
1660: 0a 2f 2a 20 64 65 63 6f 64 65 73 20 61 20 4c 49  ./* decodes a LI
1670: 4e 45 53 54 52 49 4e 47 4d 20 66 72 6f 6d 20 57  NESTRINGM from W
1680: 4b 42 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 6f  KB */.    int po
1690: 69 6e 74 73 3b 0a 20 20 20 20 69 6e 74 20 69 76  ints;.    int iv
16a0: 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a  ;.    double x;.
16b0: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
16c0: 20 20 64 6f 75 62 6c 65 20 6d 3b 0a 20 20 20 20    double m;.    
16d0: 67 61 69 61 4c 69 6e 65 73 74 72 69 6e 67 50 74  gaiaLinestringPt
16e0: 72 20 6c 69 6e 65 3b 0a 20 20 20 20 69 66 20 28  r line;.    if (
16f0: 67 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65 6f 2d  geo->size < geo-
1700: 3e 6f 66 66 73 65 74 20 2b 20 34 29 0a 09 72 65  >offset + 4)..re
1710: 74 75 72 6e 3b 0a 20 20 20 20 70 6f 69 6e 74 73  turn;.    points
1720: 20 3d 0a 09 67 61 69 61 49 6d 70 6f 72 74 33 32   =..gaiaImport32
1730: 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65   (geo->blob + ge
1740: 6f 2d 3e 6f 66 66 73 65 74 2c 20 67 65 6f 2d 3e  o->offset, geo->
1750: 65 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e 65 6e 64  endian, geo->end
1760: 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20 67  ian_arch);.    g
1770: 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 34 3b  eo->offset += 4;
1780: 0a 20 20 20 20 69 66 20 28 67 65 6f 2d 3e 73 69  .    if (geo->si
1790: 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66 73 65 74  ze < geo->offset
17a0: 20 2b 20 28 32 34 20 2a 20 70 6f 69 6e 74 73 29   + (24 * points)
17b0: 29 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 6c  )..return;.    l
17c0: 69 6e 65 20 3d 20 67 61 69 61 41 64 64 4c 69 6e  ine = gaiaAddLin
17d0: 65 73 74 72 69 6e 67 54 6f 47 65 6f 6d 43 6f 6c  estringToGeomCol
17e0: 6c 20 28 67 65 6f 2c 20 70 6f 69 6e 74 73 29 3b  l (geo, points);
17f0: 0a 20 20 20 20 66 6f 72 20 28 69 76 20 3d 20 30  .    for (iv = 0
1800: 3b 20 69 76 20 3c 20 70 6f 69 6e 74 73 3b 20 69  ; iv < points; i
1810: 76 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  v++).      {..  
1820: 78 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34  x = gaiaImport64
1830: 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65   (geo->blob + ge
1840: 6f 2d 3e 6f 66 66 73 65 74 2c 20 67 65 6f 2d 3e  o->offset, geo->
1850: 65 6e 64 69 61 6e 2c 0a 09 09 09 20 20 20 20 67  endian,....    g
1860: 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29  eo->endian_arch)
1870: 3b 0a 09 20 20 79 20 3d 20 67 61 69 61 49 6d 70  ;..  y = gaiaImp
1880: 6f 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c 6f 62  ort64 (geo->blob
1890: 20 2b 20 28 67 65 6f 2d 3e 6f 66 66 73 65 74 20   + (geo->offset 
18a0: 2b 20 38 29 2c 20 67 65 6f 2d 3e 65 6e 64 69 61  + 8), geo->endia
18b0: 6e 2c 0a 09 09 09 20 20 20 20 67 65 6f 2d 3e 65  n,....    geo->e
18c0: 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 20 20  ndian_arch);..  
18d0: 6d 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34  m = gaiaImport64
18e0: 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 28 67   (geo->blob + (g
18f0: 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 31 36 29  eo->offset + 16)
1900: 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09  , geo->endian,..
1910: 09 09 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69 61  ..    geo->endia
1920: 6e 5f 61 72 63 68 29 3b 0a 09 20 20 67 61 69 61  n_arch);..  gaia
1930: 53 65 74 50 6f 69 6e 74 58 59 4d 20 28 6c 69 6e  SetPointXYM (lin
1940: 65 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 78  e->Coords, iv, x
1950: 2c 20 79 2c 20 6d 29 3b 0a 09 20 20 67 65 6f 2d  , y, m);..  geo-
1960: 3e 6f 66 66 73 65 74 20 2b 3d 20 32 34 3b 0a 20  >offset += 24;. 
1970: 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63       }.}..static
1980: 20 76 6f 69 64 0a 50 61 72 73 65 57 6b 62 4c 69   void.ParseWkbLi
1990: 6e 65 5a 4d 20 28 67 61 69 61 47 65 6f 6d 43 6f  neZM (gaiaGeomCo
19a0: 6c 6c 50 74 72 20 67 65 6f 29 0a 7b 0a 2f 2a 20  llPtr geo).{./* 
19b0: 64 65 63 6f 64 65 73 20 61 20 4c 49 4e 45 53 54  decodes a LINEST
19c0: 52 49 4e 47 5a 4d 20 66 72 6f 6d 20 57 4b 42 20  RINGZM from WKB 
19d0: 2a 2f 0a 20 20 20 20 69 6e 74 20 70 6f 69 6e 74  */.    int point
19e0: 73 3b 0a 20 20 20 20 69 6e 74 20 69 76 3b 0a 20  s;.    int iv;. 
19f0: 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20     double x;.   
1a00: 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 64   double y;.    d
1a10: 6f 75 62 6c 65 20 7a 3b 0a 20 20 20 20 64 6f 75  ouble z;.    dou
1a20: 62 6c 65 20 6d 3b 0a 20 20 20 20 67 61 69 61 4c  ble m;.    gaiaL
1a30: 69 6e 65 73 74 72 69 6e 67 50 74 72 20 6c 69 6e  inestringPtr lin
1a40: 65 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 2d 3e  e;.    if (geo->
1a50: 73 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66 73  size < geo->offs
1a60: 65 74 20 2b 20 34 29 0a 09 72 65 74 75 72 6e 3b  et + 4)..return;
1a70: 0a 20 20 20 20 70 6f 69 6e 74 73 20 3d 0a 09 67  .    points =..g
1a80: 61 69 61 49 6d 70 6f 72 74 33 32 20 28 67 65 6f  aiaImport32 (geo
1a90: 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66  ->blob + geo->of
1aa0: 66 73 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69 61  fset, geo->endia
1ab0: 6e 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61  n, geo->endian_a
1ac0: 72 63 68 29 3b 0a 20 20 20 20 67 65 6f 2d 3e 6f  rch);.    geo->o
1ad0: 66 66 73 65 74 20 2b 3d 20 34 3b 0a 20 20 20 20  ffset += 4;.    
1ae0: 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20  if (geo->size < 
1af0: 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 28 33  geo->offset + (3
1b00: 32 20 2a 20 70 6f 69 6e 74 73 29 29 0a 09 72 65  2 * points))..re
1b10: 74 75 72 6e 3b 0a 20 20 20 20 6c 69 6e 65 20 3d  turn;.    line =
1b20: 20 67 61 69 61 41 64 64 4c 69 6e 65 73 74 72 69   gaiaAddLinestri
1b30: 6e 67 54 6f 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  ngToGeomColl (ge
1b40: 6f 2c 20 70 6f 69 6e 74 73 29 3b 0a 20 20 20 20  o, points);.    
1b50: 66 6f 72 20 28 69 76 20 3d 20 30 3b 20 69 76 20  for (iv = 0; iv 
1b60: 3c 20 70 6f 69 6e 74 73 3b 20 69 76 2b 2b 29 0a  < points; iv++).
1b70: 20 20 20 20 20 20 7b 0a 09 20 20 78 20 3d 20 67        {..  x = g
1b80: 61 69 61 49 6d 70 6f 72 74 36 34 20 28 67 65 6f  aiaImport64 (geo
1b90: 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66  ->blob + geo->of
1ba0: 66 73 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69 61  fset, geo->endia
1bb0: 6e 2c 0a 09 09 09 20 20 20 20 67 65 6f 2d 3e 65  n,....    geo->e
1bc0: 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 20 20  ndian_arch);..  
1bd0: 79 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34  y = gaiaImport64
1be0: 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 28 67   (geo->blob + (g
1bf0: 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 38 29 2c  eo->offset + 8),
1c00: 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09   geo->endian,...
1c10: 09 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e  .    geo->endian
1c20: 5f 61 72 63 68 29 3b 0a 09 20 20 7a 20 3d 20 67  _arch);..  z = g
1c30: 61 69 61 49 6d 70 6f 72 74 36 34 20 28 67 65 6f  aiaImport64 (geo
1c40: 2d 3e 62 6c 6f 62 20 2b 20 28 67 65 6f 2d 3e 6f  ->blob + (geo->o
1c50: 66 66 73 65 74 20 2b 20 31 36 29 2c 20 67 65 6f  ffset + 16), geo
1c60: 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09 09 20 20 20  ->endian,....   
1c70: 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63   geo->endian_arc
1c80: 68 29 3b 0a 09 20 20 6d 20 3d 20 67 61 69 61 49  h);..  m = gaiaI
1c90: 6d 70 6f 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c  mport64 (geo->bl
1ca0: 6f 62 20 2b 20 28 67 65 6f 2d 3e 6f 66 66 73 65  ob + (geo->offse
1cb0: 74 20 2b 20 32 34 29 2c 20 67 65 6f 2d 3e 65 6e  t + 24), geo->en
1cc0: 64 69 61 6e 2c 0a 09 09 09 20 20 20 20 67 65 6f  dian,....    geo
1cd0: 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  ->endian_arch);.
1ce0: 09 20 20 67 61 69 61 53 65 74 50 6f 69 6e 74 58  .  gaiaSetPointX
1cf0: 59 5a 4d 20 28 6c 69 6e 65 2d 3e 43 6f 6f 72 64  YZM (line->Coord
1d00: 73 2c 20 69 76 2c 20 78 2c 20 79 2c 20 7a 2c 20  s, iv, x, y, z, 
1d10: 6d 29 3b 0a 09 20 20 67 65 6f 2d 3e 6f 66 66 73  m);..  geo->offs
1d20: 65 74 20 2b 3d 20 33 32 3b 0a 20 20 20 20 20 20  et += 32;.      
1d30: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
1d40: 0a 50 61 72 73 65 57 6b 62 50 6f 6c 79 67 6f 6e  .ParseWkbPolygon
1d50: 20 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74   (gaiaGeomCollPt
1d60: 72 20 67 65 6f 29 0a 7b 0a 2f 2a 20 64 65 63 6f  r geo).{./* deco
1d70: 64 65 73 20 61 20 50 4f 4c 59 47 4f 4e 20 66 72  des a POLYGON fr
1d80: 6f 6d 20 57 4b 42 20 2a 2f 0a 20 20 20 20 69 6e  om WKB */.    in
1d90: 74 20 72 69 6e 67 73 3b 0a 20 20 20 20 69 6e 74  t rings;.    int
1da0: 20 6e 76 65 72 74 73 3b 0a 20 20 20 20 69 6e 74   nverts;.    int
1db0: 20 69 76 3b 0a 20 20 20 20 69 6e 74 20 69 62 3b   iv;.    int ib;
1dc0: 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20  .    double x;. 
1dd0: 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20     double y;.   
1de0: 20 67 61 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20   gaiaPolygonPtr 
1df0: 70 6f 6c 79 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20  polyg = NULL;.  
1e00: 20 20 67 61 69 61 52 69 6e 67 50 74 72 20 72 69    gaiaRingPtr ri
1e10: 6e 67 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 2d  ng;.    if (geo-
1e20: 3e 73 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66  >size < geo->off
1e30: 73 65 74 20 2b 20 34 29 0a 09 72 65 74 75 72 6e  set + 4)..return
1e40: 3b 0a 20 20 20 20 72 69 6e 67 73 20 3d 0a 09 67  ;.    rings =..g
1e50: 61 69 61 49 6d 70 6f 72 74 33 32 20 28 67 65 6f  aiaImport32 (geo
1e60: 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66  ->blob + geo->of
1e70: 66 73 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69 61  fset, geo->endia
1e80: 6e 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61  n, geo->endian_a
1e90: 72 63 68 29 3b 0a 20 20 20 20 67 65 6f 2d 3e 6f  rch);.    geo->o
1ea0: 66 66 73 65 74 20 2b 3d 20 34 3b 0a 20 20 20 20  ffset += 4;.    
1eb0: 66 6f 72 20 28 69 62 20 3d 20 30 3b 20 69 62 20  for (ib = 0; ib 
1ec0: 3c 20 72 69 6e 67 73 3b 20 69 62 2b 2b 29 0a 20  < rings; ib++). 
1ed0: 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 67 65       {..  if (ge
1ee0: 6f 2d 3e 73 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f  o->size < geo->o
1ef0: 66 66 73 65 74 20 2b 20 34 29 0a 09 20 20 20 20  ffset + 4)..    
1f00: 20 20 72 65 74 75 72 6e 3b 0a 09 20 20 6e 76 65    return;..  nve
1f10: 72 74 73 20 3d 0a 09 20 20 20 20 20 20 67 61 69  rts =..      gai
1f20: 61 49 6d 70 6f 72 74 33 32 20 28 67 65 6f 2d 3e  aImport32 (geo->
1f30: 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73  blob + geo->offs
1f40: 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c  et, geo->endian,
1f50: 0a 09 09 09 20 20 20 20 67 65 6f 2d 3e 65 6e 64  ....    geo->end
1f60: 69 61 6e 5f 61 72 63 68 29 3b 0a 09 20 20 67 65  ian_arch);..  ge
1f70: 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 34 3b 0a  o->offset += 4;.
1f80: 09 20 20 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65  .  if (geo->size
1f90: 20 3c 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b   < geo->offset +
1fa0: 20 28 31 36 20 2a 20 6e 76 65 72 74 73 29 29 0a   (16 * nverts)).
1fb0: 09 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 09  .      return;..
1fc0: 20 20 69 66 20 28 69 62 20 3d 3d 20 30 29 0a 09    if (ib == 0)..
1fd0: 20 20 20 20 7b 0a 09 09 70 6f 6c 79 67 20 3d 20      {...polyg = 
1fe0: 67 61 69 61 41 64 64 50 6f 6c 79 67 6f 6e 54 6f  gaiaAddPolygonTo
1ff0: 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 2c 20 6e  GeomColl (geo, n
2000: 76 65 72 74 73 2c 20 72 69 6e 67 73 20 2d 20 31  verts, rings - 1
2010: 29 3b 0a 09 09 72 69 6e 67 20 3d 20 70 6f 6c 79  );...ring = poly
2020: 67 2d 3e 45 78 74 65 72 69 6f 72 3b 0a 09 20 20  g->Exterior;..  
2030: 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20    }..  else..   
2040: 20 20 20 72 69 6e 67 20 3d 20 67 61 69 61 41 64     ring = gaiaAd
2050: 64 49 6e 74 65 72 69 6f 72 52 69 6e 67 20 28 70  dInteriorRing (p
2060: 6f 6c 79 67 2c 20 69 62 20 2d 20 31 2c 20 6e 76  olyg, ib - 1, nv
2070: 65 72 74 73 29 3b 0a 09 20 20 66 6f 72 20 28 69  erts);..  for (i
2080: 76 20 3d 20 30 3b 20 69 76 20 3c 20 6e 76 65 72  v = 0; iv < nver
2090: 74 73 3b 20 69 76 2b 2b 29 0a 09 20 20 20 20 7b  ts; iv++)..    {
20a0: 0a 09 09 78 20 3d 20 67 61 69 61 49 6d 70 6f 72  ...x = gaiaImpor
20b0: 74 36 34 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b  t64 (geo->blob +
20c0: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 2c 20 67 65   geo->offset, ge
20d0: 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09 09 09 20  o->endian,..... 
20e0: 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63   geo->endian_arc
20f0: 68 29 3b 0a 09 09 79 20 3d 20 67 61 69 61 49 6d  h);...y = gaiaIm
2100: 70 6f 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c 6f  port64 (geo->blo
2110: 62 20 2b 20 28 67 65 6f 2d 3e 6f 66 66 73 65 74  b + (geo->offset
2120: 20 2b 20 38 29 2c 20 67 65 6f 2d 3e 65 6e 64 69   + 8), geo->endi
2130: 61 6e 2c 0a 09 09 09 09 20 20 67 65 6f 2d 3e 65  an,.....  geo->e
2140: 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 67  ndian_arch);...g
2150: 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 31 36  eo->offset += 16
2160: 3b 0a 09 09 67 61 69 61 53 65 74 50 6f 69 6e 74  ;...gaiaSetPoint
2170: 20 28 72 69 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20   (ring->Coords, 
2180: 69 76 2c 20 78 2c 20 79 29 3b 0a 09 20 20 20 20  iv, x, y);..    
2190: 7d 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61  }.      }.}..sta
21a0: 74 69 63 20 76 6f 69 64 0a 50 61 72 73 65 57 6b  tic void.ParseWk
21b0: 62 50 6f 6c 79 67 6f 6e 5a 20 28 67 61 69 61 47  bPolygonZ (gaiaG
21c0: 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 29 0a  eomCollPtr geo).
21d0: 7b 0a 2f 2a 20 64 65 63 6f 64 65 73 20 61 20 50  {./* decodes a P
21e0: 4f 4c 59 47 4f 4e 5a 20 66 72 6f 6d 20 57 4b 42  OLYGONZ from WKB
21f0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 69 6e 67   */.    int ring
2200: 73 3b 0a 20 20 20 20 69 6e 74 20 6e 76 65 72 74  s;.    int nvert
2210: 73 3b 0a 20 20 20 20 69 6e 74 20 69 76 3b 0a 20  s;.    int iv;. 
2220: 20 20 20 69 6e 74 20 69 62 3b 0a 20 20 20 20 64     int ib;.    d
2230: 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 64 6f 75  ouble x;.    dou
2240: 62 6c 65 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c  ble y;.    doubl
2250: 65 20 7a 3b 0a 20 20 20 20 67 61 69 61 50 6f 6c  e z;.    gaiaPol
2260: 79 67 6f 6e 50 74 72 20 70 6f 6c 79 67 20 3d 20  ygonPtr polyg = 
2270: 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 52 69  NULL;.    gaiaRi
2280: 6e 67 50 74 72 20 72 69 6e 67 3b 0a 20 20 20 20  ngPtr ring;.    
2290: 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20  if (geo->size < 
22a0: 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 34 29  geo->offset + 4)
22b0: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 72 69  ..return;.    ri
22c0: 6e 67 73 20 3d 0a 09 67 61 69 61 49 6d 70 6f 72  ngs =..gaiaImpor
22d0: 74 33 32 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b  t32 (geo->blob +
22e0: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 2c 20 67 65   geo->offset, ge
22f0: 6f 2d 3e 65 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e  o->endian, geo->
2300: 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20  endian_arch);.  
2310: 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d    geo->offset +=
2320: 20 34 3b 0a 20 20 20 20 66 6f 72 20 28 69 62 20   4;.    for (ib 
2330: 3d 20 30 3b 20 69 62 20 3c 20 72 69 6e 67 73 3b  = 0; ib < rings;
2340: 20 69 62 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09   ib++).      {..
2350: 20 20 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20    if (geo->size 
2360: 3c 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20  < geo->offset + 
2370: 34 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e  4)..      return
2380: 3b 0a 09 20 20 6e 76 65 72 74 73 20 3d 0a 09 20  ;..  nverts =.. 
2390: 20 20 20 20 20 67 61 69 61 49 6d 70 6f 72 74 33       gaiaImport3
23a0: 32 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67  2 (geo->blob + g
23b0: 65 6f 2d 3e 6f 66 66 73 65 74 2c 20 67 65 6f 2d  eo->offset, geo-
23c0: 3e 65 6e 64 69 61 6e 2c 0a 09 09 09 20 20 20 20  >endian,....    
23d0: 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68  geo->endian_arch
23e0: 29 3b 0a 09 20 20 67 65 6f 2d 3e 6f 66 66 73 65  );..  geo->offse
23f0: 74 20 2b 3d 20 34 3b 0a 09 20 20 69 66 20 28 67  t += 4;..  if (g
2400: 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65 6f 2d 3e  eo->size < geo->
2410: 6f 66 66 73 65 74 20 2b 20 28 32 34 20 2a 20 6e  offset + (24 * n
2420: 76 65 72 74 73 29 29 0a 09 20 20 20 20 20 20 72  verts))..      r
2430: 65 74 75 72 6e 3b 0a 09 20 20 69 66 20 28 69 62  eturn;..  if (ib
2440: 20 3d 3d 20 30 29 0a 09 20 20 20 20 7b 0a 09 09   == 0)..    {...
2450: 70 6f 6c 79 67 20 3d 20 67 61 69 61 41 64 64 50  polyg = gaiaAddP
2460: 6f 6c 79 67 6f 6e 54 6f 47 65 6f 6d 43 6f 6c 6c  olygonToGeomColl
2470: 20 28 67 65 6f 2c 20 6e 76 65 72 74 73 2c 20 72   (geo, nverts, r
2480: 69 6e 67 73 20 2d 20 31 29 3b 0a 09 09 72 69 6e  ings - 1);...rin
2490: 67 20 3d 20 70 6f 6c 79 67 2d 3e 45 78 74 65 72  g = polyg->Exter
24a0: 69 6f 72 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  ior;..    }..  e
24b0: 6c 73 65 0a 09 20 20 20 20 20 20 72 69 6e 67 20  lse..      ring 
24c0: 3d 20 67 61 69 61 41 64 64 49 6e 74 65 72 69 6f  = gaiaAddInterio
24d0: 72 52 69 6e 67 20 28 70 6f 6c 79 67 2c 20 69 62  rRing (polyg, ib
24e0: 20 2d 20 31 2c 20 6e 76 65 72 74 73 29 3b 0a 09   - 1, nverts);..
24f0: 20 20 66 6f 72 20 28 69 76 20 3d 20 30 3b 20 69    for (iv = 0; i
2500: 76 20 3c 20 6e 76 65 72 74 73 3b 20 69 76 2b 2b  v < nverts; iv++
2510: 29 0a 09 20 20 20 20 7b 0a 09 09 78 20 3d 20 67  )..    {...x = g
2520: 61 69 61 49 6d 70 6f 72 74 36 34 20 28 67 65 6f  aiaImport64 (geo
2530: 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66  ->blob + geo->of
2540: 66 73 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69 61  fset, geo->endia
2550: 6e 2c 0a 09 09 09 09 20 20 67 65 6f 2d 3e 65 6e  n,.....  geo->en
2560: 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 79 20  dian_arch);...y 
2570: 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28  = gaiaImport64 (
2580: 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 28 67 65 6f  geo->blob + (geo
2590: 2d 3e 6f 66 66 73 65 74 20 2b 20 38 29 2c 20 67  ->offset + 8), g
25a0: 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09 09 09  eo->endian,.....
25b0: 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72    geo->endian_ar
25c0: 63 68 29 3b 0a 09 09 7a 20 3d 20 67 61 69 61 49  ch);...z = gaiaI
25d0: 6d 70 6f 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c  mport64 (geo->bl
25e0: 6f 62 20 2b 20 28 67 65 6f 2d 3e 6f 66 66 73 65  ob + (geo->offse
25f0: 74 20 2b 20 31 36 29 2c 20 67 65 6f 2d 3e 65 6e  t + 16), geo->en
2600: 64 69 61 6e 2c 0a 09 09 09 09 20 20 67 65 6f 2d  dian,.....  geo-
2610: 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09  >endian_arch);..
2620: 09 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d 20  .geo->offset += 
2630: 32 34 3b 0a 09 09 67 61 69 61 53 65 74 50 6f 69  24;...gaiaSetPoi
2640: 6e 74 58 59 5a 20 28 72 69 6e 67 2d 3e 43 6f 6f  ntXYZ (ring->Coo
2650: 72 64 73 2c 20 69 76 2c 20 78 2c 20 79 2c 20 7a  rds, iv, x, y, z
2660: 29 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20  );..    }.      
2670: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
2680: 0a 50 61 72 73 65 57 6b 62 50 6f 6c 79 67 6f 6e  .ParseWkbPolygon
2690: 4d 20 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50  M (gaiaGeomCollP
26a0: 74 72 20 67 65 6f 29 0a 7b 0a 2f 2a 20 64 65 63  tr geo).{./* dec
26b0: 6f 64 65 73 20 61 20 50 4f 4c 59 47 4f 4e 4d 20  odes a POLYGONM 
26c0: 66 72 6f 6d 20 57 4b 42 20 2a 2f 0a 20 20 20 20  from WKB */.    
26d0: 69 6e 74 20 72 69 6e 67 73 3b 0a 20 20 20 20 69  int rings;.    i
26e0: 6e 74 20 6e 76 65 72 74 73 3b 0a 20 20 20 20 69  nt nverts;.    i
26f0: 6e 74 20 69 76 3b 0a 20 20 20 20 69 6e 74 20 69  nt iv;.    int i
2700: 62 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 3b  b;.    double x;
2710: 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20  .    double y;. 
2720: 20 20 20 64 6f 75 62 6c 65 20 6d 3b 0a 20 20 20     double m;.   
2730: 20 67 61 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20   gaiaPolygonPtr 
2740: 70 6f 6c 79 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20  polyg = NULL;.  
2750: 20 20 67 61 69 61 52 69 6e 67 50 74 72 20 72 69    gaiaRingPtr ri
2760: 6e 67 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 2d  ng;.    if (geo-
2770: 3e 73 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66  >size < geo->off
2780: 73 65 74 20 2b 20 34 29 0a 09 72 65 74 75 72 6e  set + 4)..return
2790: 3b 0a 20 20 20 20 72 69 6e 67 73 20 3d 0a 09 67  ;.    rings =..g
27a0: 61 69 61 49 6d 70 6f 72 74 33 32 20 28 67 65 6f  aiaImport32 (geo
27b0: 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66  ->blob + geo->of
27c0: 66 73 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69 61  fset, geo->endia
27d0: 6e 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61  n, geo->endian_a
27e0: 72 63 68 29 3b 0a 20 20 20 20 67 65 6f 2d 3e 6f  rch);.    geo->o
27f0: 66 66 73 65 74 20 2b 3d 20 34 3b 0a 20 20 20 20  ffset += 4;.    
2800: 66 6f 72 20 28 69 62 20 3d 20 30 3b 20 69 62 20  for (ib = 0; ib 
2810: 3c 20 72 69 6e 67 73 3b 20 69 62 2b 2b 29 0a 20  < rings; ib++). 
2820: 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 67 65       {..  if (ge
2830: 6f 2d 3e 73 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f  o->size < geo->o
2840: 66 66 73 65 74 20 2b 20 34 29 0a 09 20 20 20 20  ffset + 4)..    
2850: 20 20 72 65 74 75 72 6e 3b 0a 09 20 20 6e 76 65    return;..  nve
2860: 72 74 73 20 3d 0a 09 20 20 20 20 20 20 67 61 69  rts =..      gai
2870: 61 49 6d 70 6f 72 74 33 32 20 28 67 65 6f 2d 3e  aImport32 (geo->
2880: 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73  blob + geo->offs
2890: 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c  et, geo->endian,
28a0: 0a 09 09 09 20 20 20 20 67 65 6f 2d 3e 65 6e 64  ....    geo->end
28b0: 69 61 6e 5f 61 72 63 68 29 3b 0a 09 20 20 67 65  ian_arch);..  ge
28c0: 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 34 3b 0a  o->offset += 4;.
28d0: 09 20 20 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65  .  if (geo->size
28e0: 20 3c 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b   < geo->offset +
28f0: 20 28 32 34 20 2a 20 6e 76 65 72 74 73 29 29 0a   (24 * nverts)).
2900: 09 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 09  .      return;..
2910: 20 20 69 66 20 28 69 62 20 3d 3d 20 30 29 0a 09    if (ib == 0)..
2920: 20 20 20 20 7b 0a 09 09 70 6f 6c 79 67 20 3d 20      {...polyg = 
2930: 67 61 69 61 41 64 64 50 6f 6c 79 67 6f 6e 54 6f  gaiaAddPolygonTo
2940: 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 2c 20 6e  GeomColl (geo, n
2950: 76 65 72 74 73 2c 20 72 69 6e 67 73 20 2d 20 31  verts, rings - 1
2960: 29 3b 0a 09 09 72 69 6e 67 20 3d 20 70 6f 6c 79  );...ring = poly
2970: 67 2d 3e 45 78 74 65 72 69 6f 72 3b 0a 09 20 20  g->Exterior;..  
2980: 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20    }..  else..   
2990: 20 20 20 72 69 6e 67 20 3d 20 67 61 69 61 41 64     ring = gaiaAd
29a0: 64 49 6e 74 65 72 69 6f 72 52 69 6e 67 20 28 70  dInteriorRing (p
29b0: 6f 6c 79 67 2c 20 69 62 20 2d 20 31 2c 20 6e 76  olyg, ib - 1, nv
29c0: 65 72 74 73 29 3b 0a 09 20 20 66 6f 72 20 28 69  erts);..  for (i
29d0: 76 20 3d 20 30 3b 20 69 76 20 3c 20 6e 76 65 72  v = 0; iv < nver
29e0: 74 73 3b 20 69 76 2b 2b 29 0a 09 20 20 20 20 7b  ts; iv++)..    {
29f0: 0a 09 09 78 20 3d 20 67 61 69 61 49 6d 70 6f 72  ...x = gaiaImpor
2a00: 74 36 34 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b  t64 (geo->blob +
2a10: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 2c 20 67 65   geo->offset, ge
2a20: 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09 09 09 20  o->endian,..... 
2a30: 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63   geo->endian_arc
2a40: 68 29 3b 0a 09 09 79 20 3d 20 67 61 69 61 49 6d  h);...y = gaiaIm
2a50: 70 6f 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c 6f  port64 (geo->blo
2a60: 62 20 2b 20 28 67 65 6f 2d 3e 6f 66 66 73 65 74  b + (geo->offset
2a70: 20 2b 20 38 29 2c 20 67 65 6f 2d 3e 65 6e 64 69   + 8), geo->endi
2a80: 61 6e 2c 0a 09 09 09 09 20 20 67 65 6f 2d 3e 65  an,.....  geo->e
2a90: 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 6d  ndian_arch);...m
2aa0: 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34 20   = gaiaImport64 
2ab0: 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 28 67 65  (geo->blob + (ge
2ac0: 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 31 36 29 2c  o->offset + 16),
2ad0: 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09   geo->endian,...
2ae0: 09 09 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f  ..  geo->endian_
2af0: 61 72 63 68 29 3b 0a 09 09 67 65 6f 2d 3e 6f 66  arch);...geo->of
2b00: 66 73 65 74 20 2b 3d 20 32 34 3b 0a 09 09 67 61  fset += 24;...ga
2b10: 69 61 53 65 74 50 6f 69 6e 74 58 59 4d 20 28 72  iaSetPointXYM (r
2b20: 69 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c  ing->Coords, iv,
2b30: 20 78 2c 20 79 2c 20 6d 29 3b 0a 09 20 20 20 20   x, y, m);..    
2b40: 7d 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61  }.      }.}..sta
2b50: 74 69 63 20 76 6f 69 64 0a 50 61 72 73 65 57 6b  tic void.ParseWk
2b60: 62 50 6f 6c 79 67 6f 6e 5a 4d 20 28 67 61 69 61  bPolygonZM (gaia
2b70: 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 29  GeomCollPtr geo)
2b80: 0a 7b 0a 2f 2a 20 64 65 63 6f 64 65 73 20 61 20  .{./* decodes a 
2b90: 50 4f 4c 59 47 4f 4e 5a 4d 20 66 72 6f 6d 20 57  POLYGONZM from W
2ba0: 4b 42 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 69  KB */.    int ri
2bb0: 6e 67 73 3b 0a 20 20 20 20 69 6e 74 20 6e 76 65  ngs;.    int nve
2bc0: 72 74 73 3b 0a 20 20 20 20 69 6e 74 20 69 76 3b  rts;.    int iv;
2bd0: 0a 20 20 20 20 69 6e 74 20 69 62 3b 0a 20 20 20  .    int ib;.   
2be0: 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 64   double x;.    d
2bf0: 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 64 6f 75  ouble y;.    dou
2c00: 62 6c 65 20 7a 3b 0a 20 20 20 20 64 6f 75 62 6c  ble z;.    doubl
2c10: 65 20 6d 3b 0a 20 20 20 20 67 61 69 61 50 6f 6c  e m;.    gaiaPol
2c20: 79 67 6f 6e 50 74 72 20 70 6f 6c 79 67 20 3d 20  ygonPtr polyg = 
2c30: 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 52 69  NULL;.    gaiaRi
2c40: 6e 67 50 74 72 20 72 69 6e 67 3b 0a 20 20 20 20  ngPtr ring;.    
2c50: 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20  if (geo->size < 
2c60: 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 34 29  geo->offset + 4)
2c70: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 72 69  ..return;.    ri
2c80: 6e 67 73 20 3d 0a 09 67 61 69 61 49 6d 70 6f 72  ngs =..gaiaImpor
2c90: 74 33 32 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b  t32 (geo->blob +
2ca0: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 2c 20 67 65   geo->offset, ge
2cb0: 6f 2d 3e 65 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e  o->endian, geo->
2cc0: 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20  endian_arch);.  
2cd0: 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d    geo->offset +=
2ce0: 20 34 3b 0a 20 20 20 20 66 6f 72 20 28 69 62 20   4;.    for (ib 
2cf0: 3d 20 30 3b 20 69 62 20 3c 20 72 69 6e 67 73 3b  = 0; ib < rings;
2d00: 20 69 62 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09   ib++).      {..
2d10: 20 20 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20    if (geo->size 
2d20: 3c 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20  < geo->offset + 
2d30: 34 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e  4)..      return
2d40: 3b 0a 09 20 20 6e 76 65 72 74 73 20 3d 0a 09 20  ;..  nverts =.. 
2d50: 20 20 20 20 20 67 61 69 61 49 6d 70 6f 72 74 33       gaiaImport3
2d60: 32 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67  2 (geo->blob + g
2d70: 65 6f 2d 3e 6f 66 66 73 65 74 2c 20 67 65 6f 2d  eo->offset, geo-
2d80: 3e 65 6e 64 69 61 6e 2c 0a 09 09 09 20 20 20 20  >endian,....    
2d90: 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68  geo->endian_arch
2da0: 29 3b 0a 09 20 20 67 65 6f 2d 3e 6f 66 66 73 65  );..  geo->offse
2db0: 74 20 2b 3d 20 34 3b 0a 09 20 20 69 66 20 28 67  t += 4;..  if (g
2dc0: 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65 6f 2d 3e  eo->size < geo->
2dd0: 6f 66 66 73 65 74 20 2b 20 28 33 32 20 2a 20 6e  offset + (32 * n
2de0: 76 65 72 74 73 29 29 0a 09 20 20 20 20 20 20 72  verts))..      r
2df0: 65 74 75 72 6e 3b 0a 09 20 20 69 66 20 28 69 62  eturn;..  if (ib
2e00: 20 3d 3d 20 30 29 0a 09 20 20 20 20 7b 0a 09 09   == 0)..    {...
2e10: 70 6f 6c 79 67 20 3d 20 67 61 69 61 41 64 64 50  polyg = gaiaAddP
2e20: 6f 6c 79 67 6f 6e 54 6f 47 65 6f 6d 43 6f 6c 6c  olygonToGeomColl
2e30: 20 28 67 65 6f 2c 20 6e 76 65 72 74 73 2c 20 72   (geo, nverts, r
2e40: 69 6e 67 73 20 2d 20 31 29 3b 0a 09 09 72 69 6e  ings - 1);...rin
2e50: 67 20 3d 20 70 6f 6c 79 67 2d 3e 45 78 74 65 72  g = polyg->Exter
2e60: 69 6f 72 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  ior;..    }..  e
2e70: 6c 73 65 0a 09 20 20 20 20 20 20 72 69 6e 67 20  lse..      ring 
2e80: 3d 20 67 61 69 61 41 64 64 49 6e 74 65 72 69 6f  = gaiaAddInterio
2e90: 72 52 69 6e 67 20 28 70 6f 6c 79 67 2c 20 69 62  rRing (polyg, ib
2ea0: 20 2d 20 31 2c 20 6e 76 65 72 74 73 29 3b 0a 09   - 1, nverts);..
2eb0: 20 20 66 6f 72 20 28 69 76 20 3d 20 30 3b 20 69    for (iv = 0; i
2ec0: 76 20 3c 20 6e 76 65 72 74 73 3b 20 69 76 2b 2b  v < nverts; iv++
2ed0: 29 0a 09 20 20 20 20 7b 0a 09 09 78 20 3d 20 67  )..    {...x = g
2ee0: 61 69 61 49 6d 70 6f 72 74 36 34 20 28 67 65 6f  aiaImport64 (geo
2ef0: 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66  ->blob + geo->of
2f00: 66 73 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69 61  fset, geo->endia
2f10: 6e 2c 0a 09 09 09 09 20 20 67 65 6f 2d 3e 65 6e  n,.....  geo->en
2f20: 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 79 20  dian_arch);...y 
2f30: 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28  = gaiaImport64 (
2f40: 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 28 67 65 6f  geo->blob + (geo
2f50: 2d 3e 6f 66 66 73 65 74 20 2b 20 38 29 2c 20 67  ->offset + 8), g
2f60: 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09 09 09  eo->endian,.....
2f70: 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72    geo->endian_ar
2f80: 63 68 29 3b 0a 09 09 7a 20 3d 20 67 61 69 61 49  ch);...z = gaiaI
2f90: 6d 70 6f 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c  mport64 (geo->bl
2fa0: 6f 62 20 2b 20 28 67 65 6f 2d 3e 6f 66 66 73 65  ob + (geo->offse
2fb0: 74 20 2b 20 31 36 29 2c 20 67 65 6f 2d 3e 65 6e  t + 16), geo->en
2fc0: 64 69 61 6e 2c 0a 09 09 09 09 20 20 67 65 6f 2d  dian,.....  geo-
2fd0: 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09  >endian_arch);..
2fe0: 09 6d 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36  .m = gaiaImport6
2ff0: 34 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 28  4 (geo->blob + (
3000: 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 32 34  geo->offset + 24
3010: 29 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a  ), geo->endian,.
3020: 09 09 09 09 20 20 67 65 6f 2d 3e 65 6e 64 69 61  ....  geo->endia
3030: 6e 5f 61 72 63 68 29 3b 0a 09 09 67 65 6f 2d 3e  n_arch);...geo->
3040: 6f 66 66 73 65 74 20 2b 3d 20 33 32 3b 0a 09 09  offset += 32;...
3050: 67 61 69 61 53 65 74 50 6f 69 6e 74 58 59 5a 4d  gaiaSetPointXYZM
3060: 20 28 72 69 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20   (ring->Coords, 
3070: 69 76 2c 20 78 2c 20 79 2c 20 7a 2c 20 6d 29 3b  iv, x, y, z, m);
3080: 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a  ..    }.      }.
3090: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 50  }..static void.P
30a0: 61 72 73 65 57 6b 62 4d 75 6c 74 69 50 6f 69 6e  arseWkbMultiPoin
30b0: 74 20 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50  t (gaiaGeomCollP
30c0: 74 72 20 67 65 6f 29 0a 7b 0a 2f 2a 20 64 65 63  tr geo).{./* dec
30d0: 6f 64 65 73 20 61 20 4d 55 4c 54 49 50 4f 49 4e  odes a MULTIPOIN
30e0: 54 20 66 72 6f 6d 20 57 4b 42 20 2a 2f 0a 20 20  T from WKB */.  
30f0: 20 20 69 6e 74 20 69 67 3b 0a 20 20 20 20 69 6e    int ig;.    in
3100: 74 20 6e 5f 70 74 73 3b 0a 20 20 20 20 69 6e 74  t n_pts;.    int
3110: 20 67 5f 74 79 70 65 3b 0a 20 20 20 20 69 66 20   g_type;.    if 
3120: 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65 6f  (geo->size < geo
3130: 2d 3e 6f 66 66 73 65 74 20 2b 20 34 29 0a 09 72  ->offset + 4)..r
3140: 65 74 75 72 6e 3b 0a 20 20 20 20 6e 5f 70 74 73  eturn;.    n_pts
3150: 20 3d 0a 09 67 61 69 61 49 6d 70 6f 72 74 33 32   =..gaiaImport32
3160: 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65   (geo->blob + ge
3170: 6f 2d 3e 6f 66 66 73 65 74 2c 20 67 65 6f 2d 3e  o->offset, geo->
3180: 65 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e 65 6e 64  endian, geo->end
3190: 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20 67  ian_arch);.    g
31a0: 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 34 3b  eo->offset += 4;
31b0: 0a 20 20 20 20 66 6f 72 20 28 69 67 20 3d 20 30  .    for (ig = 0
31c0: 3b 20 69 67 20 3c 20 6e 5f 70 74 73 3b 20 69 67  ; ig < n_pts; ig
31d0: 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f  ++).      {..  /
31e0: 2a 20 70 61 72 73 69 6e 67 20 61 6c 6c 20 50 6f  * parsing all Po
31f0: 69 6e 74 73 20 6f 6e 65 20 62 79 20 6f 6e 65 20  ints one by one 
3200: 2a 2f 0a 09 20 20 69 66 20 28 67 65 6f 2d 3e 73  */..  if (geo->s
3210: 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66 73 65  ize < geo->offse
3220: 74 20 2b 20 35 29 0a 09 20 20 20 20 20 20 72 65  t + 5)..      re
3230: 74 75 72 6e 3b 0a 09 20 20 2f 2a 20 76 61 6e 69  turn;..  /* vani
3240: 6c 6c 61 20 57 4b 42 20 63 6f 75 6c 64 20 62 65  lla WKB could be
3250: 20 65 6e 63 6f 64 65 64 20 61 73 20 6d 69 78 65   encoded as mixe
3260: 64 20 62 69 67 2d 2f 6c 69 74 74 6c 65 2d 65 6e  d big-/little-en
3270: 64 69 61 6e 20 73 75 62 2d 69 74 65 6d 73 20 2a  dian sub-items *
3280: 2f 0a 09 20 20 69 66 20 28 2a 28 67 65 6f 2d 3e  /..  if (*(geo->
3290: 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73  blob + geo->offs
32a0: 65 74 29 20 3d 3d 20 30 78 30 31 29 0a 09 20 20  et) == 0x01)..  
32b0: 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 20      geo->endian 
32c0: 3d 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e  = GAIA_LITTLE_EN
32d0: 44 49 41 4e 3b 0a 09 20 20 65 6c 73 65 0a 09 20  DIAN;..  else.. 
32e0: 20 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e       geo->endian
32f0: 20 3d 20 47 41 49 41 5f 42 49 47 5f 45 4e 44 49   = GAIA_BIG_ENDI
3300: 41 4e 3b 0a 09 20 20 67 5f 74 79 70 65 20 3d 0a  AN;..  g_type =.
3310: 09 20 20 20 20 20 20 67 61 69 61 49 6d 70 6f 72  .      gaiaImpor
3320: 74 33 32 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b  t32 (geo->blob +
3330: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 31   geo->offset + 1
3340: 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09  , geo->endian,..
3350: 09 09 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69 61  ..    geo->endia
3360: 6e 5f 61 72 63 68 29 3b 0a 09 20 20 67 65 6f 2d  n_arch);..  geo-
3370: 3e 6f 66 66 73 65 74 20 2b 3d 20 35 3b 0a 09 20  >offset += 5;.. 
3380: 20 69 66 20 28 67 5f 74 79 70 65 20 3d 3d 20 47   if (g_type == G
3390: 41 49 41 5f 50 4f 49 4e 54 29 0a 09 20 20 20 20  AIA_POINT)..    
33a0: 20 20 50 61 72 73 65 57 6b 62 50 6f 69 6e 74 20    ParseWkbPoint 
33b0: 28 67 65 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 7d  (geo);.      }.}
33c0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 50 61  ..static void.Pa
33d0: 72 73 65 57 6b 62 4d 75 6c 74 69 4c 69 6e 65 20  rseWkbMultiLine 
33e0: 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72  (gaiaGeomCollPtr
33f0: 20 67 65 6f 29 0a 7b 0a 2f 2a 20 64 65 63 6f 64   geo).{./* decod
3400: 65 73 20 61 20 4d 55 4c 54 49 4c 49 4e 45 53 54  es a MULTILINEST
3410: 52 49 4e 47 20 66 72 6f 6d 20 57 4b 42 20 2a 2f  RING from WKB */
3420: 0a 20 20 20 20 69 6e 74 20 69 67 3b 0a 20 20 20  .    int ig;.   
3430: 20 69 6e 74 20 6e 5f 6c 6e 73 3b 0a 20 20 20 20   int n_lns;.    
3440: 69 6e 74 20 67 5f 74 79 70 65 3b 0a 20 20 20 20  int g_type;.    
3450: 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20  if (geo->size < 
3460: 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 34 29  geo->offset + 4)
3470: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e 5f  ..return;.    n_
3480: 6c 6e 73 20 3d 0a 09 67 61 69 61 49 6d 70 6f 72  lns =..gaiaImpor
3490: 74 33 32 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b  t32 (geo->blob +
34a0: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 2c 20 67 65   geo->offset, ge
34b0: 6f 2d 3e 65 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e  o->endian, geo->
34c0: 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20  endian_arch);.  
34d0: 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d    geo->offset +=
34e0: 20 34 3b 0a 20 20 20 20 66 6f 72 20 28 69 67 20   4;.    for (ig 
34f0: 3d 20 30 3b 20 69 67 20 3c 20 6e 5f 6c 6e 73 3b  = 0; ig < n_lns;
3500: 20 69 67 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09   ig++).      {..
3510: 20 20 2f 2a 20 70 61 72 73 69 6e 67 20 61 6c 6c    /* parsing all
3520: 20 4c 69 6e 65 73 74 72 69 6e 67 73 20 6f 6e 65   Linestrings one
3530: 20 62 79 20 6f 6e 65 20 2a 2f 0a 09 20 20 69 66   by one */..  if
3540: 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65   (geo->size < ge
3550: 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 35 29 0a 09  o->offset + 5)..
3560: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 09 20        return;.. 
3570: 20 2f 2a 20 76 61 6e 69 6c 6c 61 20 57 4b 42 20   /* vanilla WKB 
3580: 63 6f 75 6c 64 20 62 65 20 65 6e 63 6f 64 65 64  could be encoded
3590: 20 61 73 20 6d 69 78 65 64 20 62 69 67 2d 2f 6c   as mixed big-/l
35a0: 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 73 75 62  ittle-endian sub
35b0: 2d 69 74 65 6d 73 20 2a 2f 0a 09 20 20 69 66 20  -items */..  if 
35c0: 28 2a 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67  (*(geo->blob + g
35d0: 65 6f 2d 3e 6f 66 66 73 65 74 29 20 3d 3d 20 30  eo->offset) == 0
35e0: 78 30 31 29 0a 09 20 20 20 20 20 20 67 65 6f 2d  x01)..      geo-
35f0: 3e 65 6e 64 69 61 6e 20 3d 20 47 41 49 41 5f 4c  >endian = GAIA_L
3600: 49 54 54 4c 45 5f 45 4e 44 49 41 4e 3b 0a 09 20  ITTLE_ENDIAN;.. 
3610: 20 65 6c 73 65 0a 09 20 20 20 20 20 20 67 65 6f   else..      geo
3620: 2d 3e 65 6e 64 69 61 6e 20 3d 20 47 41 49 41 5f  ->endian = GAIA_
3630: 42 49 47 5f 45 4e 44 49 41 4e 3b 0a 09 20 20 67  BIG_ENDIAN;..  g
3640: 5f 74 79 70 65 20 3d 0a 09 20 20 20 20 20 20 67  _type =..      g
3650: 61 69 61 49 6d 70 6f 72 74 33 32 20 28 67 65 6f  aiaImport32 (geo
3660: 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66  ->blob + geo->of
3670: 66 73 65 74 20 2b 20 31 2c 20 67 65 6f 2d 3e 65  fset + 1, geo->e
3680: 6e 64 69 61 6e 2c 0a 09 09 09 20 20 20 20 67 65  ndian,....    ge
3690: 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  o->endian_arch);
36a0: 0a 09 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20  ..  geo->offset 
36b0: 2b 3d 20 35 3b 0a 09 20 20 69 66 20 28 67 5f 74  += 5;..  if (g_t
36c0: 79 70 65 20 3d 3d 20 47 41 49 41 5f 4c 49 4e 45  ype == GAIA_LINE
36d0: 53 54 52 49 4e 47 29 0a 09 20 20 20 20 20 20 50  STRING)..      P
36e0: 61 72 73 65 57 6b 62 4c 69 6e 65 20 28 67 65 6f  arseWkbLine (geo
36f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74  );.      }.}..st
3700: 61 74 69 63 20 76 6f 69 64 0a 50 61 72 73 65 57  atic void.ParseW
3710: 6b 62 4d 75 6c 74 69 50 6f 6c 79 67 6f 6e 20 28  kbMultiPolygon (
3720: 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
3730: 67 65 6f 29 0a 7b 0a 2f 2a 20 64 65 63 6f 64 65  geo).{./* decode
3740: 73 20 61 20 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e  s a MULTIPOLYGON
3750: 20 66 72 6f 6d 20 57 4b 42 20 2a 2f 0a 20 20 20   from WKB */.   
3760: 20 69 6e 74 20 69 67 3b 0a 20 20 20 20 69 6e 74   int ig;.    int
3770: 20 6e 5f 70 67 73 3b 0a 20 20 20 20 69 6e 74 20   n_pgs;.    int 
3780: 67 5f 74 79 70 65 3b 0a 20 20 20 20 69 66 20 28  g_type;.    if (
3790: 67 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65 6f 2d  geo->size < geo-
37a0: 3e 6f 66 66 73 65 74 20 2b 20 34 29 0a 09 72 65  >offset + 4)..re
37b0: 74 75 72 6e 3b 0a 20 20 20 20 6e 5f 70 67 73 20  turn;.    n_pgs 
37c0: 3d 0a 09 67 61 69 61 49 6d 70 6f 72 74 33 32 20  =..gaiaImport32 
37d0: 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f  (geo->blob + geo
37e0: 2d 3e 6f 66 66 73 65 74 2c 20 67 65 6f 2d 3e 65  ->offset, geo->e
37f0: 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e 65 6e 64 69  ndian, geo->endi
3800: 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20 67 65  an_arch);.    ge
3810: 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 34 3b 0a  o->offset += 4;.
3820: 20 20 20 20 66 6f 72 20 28 69 67 20 3d 20 30 3b      for (ig = 0;
3830: 20 69 67 20 3c 20 6e 5f 70 67 73 3b 20 69 67 2b   ig < n_pgs; ig+
3840: 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a  +).      {..  /*
3850: 20 70 61 72 73 69 6e 67 20 61 6c 6c 20 50 6f 6c   parsing all Pol
3860: 79 67 6f 6e 73 20 6f 6e 65 20 62 79 20 6f 6e 65  ygons one by one
3870: 20 2a 2f 0a 09 20 20 69 66 20 28 67 65 6f 2d 3e   */..  if (geo->
3880: 73 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66 73  size < geo->offs
3890: 65 74 20 2b 20 35 29 0a 09 20 20 20 20 20 20 72  et + 5)..      r
38a0: 65 74 75 72 6e 3b 0a 09 20 20 2f 2a 20 76 61 6e  eturn;..  /* van
38b0: 69 6c 6c 61 20 57 4b 42 20 63 6f 75 6c 64 20 62  illa WKB could b
38c0: 65 20 65 6e 63 6f 64 65 64 20 61 73 20 6d 69 78  e encoded as mix
38d0: 65 64 20 62 69 67 2d 2f 6c 69 74 74 6c 65 2d 65  ed big-/little-e
38e0: 6e 64 69 61 6e 20 73 75 62 2d 69 74 65 6d 73 20  ndian sub-items 
38f0: 2a 2f 0a 09 20 20 69 66 20 28 2a 28 67 65 6f 2d  */..  if (*(geo-
3900: 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66  >blob + geo->off
3910: 73 65 74 29 20 3d 3d 20 30 78 30 31 29 0a 09 20  set) == 0x01).. 
3920: 20 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e       geo->endian
3930: 20 3d 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45   = GAIA_LITTLE_E
3940: 4e 44 49 41 4e 3b 0a 09 20 20 65 6c 73 65 0a 09  NDIAN;..  else..
3950: 20 20 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69 61        geo->endia
3960: 6e 20 3d 20 47 41 49 41 5f 42 49 47 5f 45 4e 44  n = GAIA_BIG_END
3970: 49 41 4e 3b 0a 09 20 20 67 5f 74 79 70 65 20 3d  IAN;..  g_type =
3980: 0a 09 20 20 20 20 20 20 67 61 69 61 49 6d 70 6f  ..      gaiaImpo
3990: 72 74 33 32 20 28 67 65 6f 2d 3e 62 6c 6f 62 20  rt32 (geo->blob 
39a0: 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20  + geo->offset + 
39b0: 31 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a  1, geo->endian,.
39c0: 09 09 09 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69  ...    geo->endi
39d0: 61 6e 5f 61 72 63 68 29 3b 0a 09 20 20 67 65 6f  an_arch);..  geo
39e0: 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 35 3b 0a 09  ->offset += 5;..
39f0: 20 20 69 66 20 28 67 5f 74 79 70 65 20 3d 3d 20    if (g_type == 
3a00: 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 29 0a 09 20  GAIA_POLYGON).. 
3a10: 20 20 20 20 20 50 61 72 73 65 57 6b 62 50 6f 6c       ParseWkbPol
3a20: 79 67 6f 6e 20 28 67 65 6f 29 3b 0a 20 20 20 20  ygon (geo);.    
3a30: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
3a40: 69 64 0a 50 61 72 73 65 57 6b 62 47 65 6f 6d 43  id.ParseWkbGeomC
3a50: 6f 6c 6c 20 28 67 61 69 61 47 65 6f 6d 43 6f 6c  oll (gaiaGeomCol
3a60: 6c 50 74 72 20 67 65 6f 29 0a 7b 0a 2f 2a 20 64  lPtr geo).{./* d
3a70: 65 63 6f 64 65 73 20 61 20 47 45 4f 4d 45 54 52  ecodes a GEOMETR
3a80: 59 43 4f 4c 4c 45 43 54 49 4f 4e 20 66 72 6f 6d  YCOLLECTION from
3a90: 20 57 4b 42 20 2a 2f 0a 20 20 20 20 69 6e 74 20   WKB */.    int 
3aa0: 69 67 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 67 65  ig;.    int n_ge
3ab0: 6f 6d 73 3b 0a 20 20 20 20 69 66 20 28 67 65 6f  oms;.    if (geo
3ac0: 2d 3e 73 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66  ->size < geo->of
3ad0: 66 73 65 74 20 2b 20 34 29 0a 09 72 65 74 75 72  fset + 4)..retur
3ae0: 6e 3b 0a 20 20 20 20 6e 5f 67 65 6f 6d 73 20 3d  n;.    n_geoms =
3af0: 0a 09 67 61 69 61 49 6d 70 6f 72 74 33 32 20 28  ..gaiaImport32 (
3b00: 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d  geo->blob + geo-
3b10: 3e 6f 66 66 73 65 74 2c 20 67 65 6f 2d 3e 65 6e  >offset, geo->en
3b20: 64 69 61 6e 2c 20 67 65 6f 2d 3e 65 6e 64 69 61  dian, geo->endia
3b30: 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20 67 65 6f  n_arch);.    geo
3b40: 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 34 3b 0a 20  ->offset += 4;. 
3b50: 20 20 20 66 6f 72 20 28 69 67 20 3d 20 30 3b 20     for (ig = 0; 
3b60: 69 67 20 3c 20 6e 5f 67 65 6f 6d 73 3b 20 69 67  ig < n_geoms; ig
3b70: 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  ++).      {..  i
3b80: 6e 74 20 67 5f 74 79 70 65 3b 0a 09 20 20 69 66  nt g_type;..  if
3b90: 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65   (geo->size < ge
3ba0: 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 35 29 0a 09  o->offset + 5)..
3bb0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 09 20        return;.. 
3bc0: 20 2f 2a 20 76 61 6e 69 6c 6c 61 20 57 4b 42 20   /* vanilla WKB 
3bd0: 63 6f 75 6c 64 20 62 65 20 65 6e 63 6f 64 65 64  could be encoded
3be0: 20 61 73 20 6d 69 78 65 64 20 62 69 67 2d 2f 6c   as mixed big-/l
3bf0: 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 73 75 62  ittle-endian sub
3c00: 2d 69 74 65 6d 73 20 2a 2f 0a 09 20 20 69 66 20  -items */..  if 
3c10: 28 2a 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67  (*(geo->blob + g
3c20: 65 6f 2d 3e 6f 66 66 73 65 74 29 20 3d 3d 20 30  eo->offset) == 0
3c30: 78 30 31 29 0a 09 20 20 20 20 20 20 67 65 6f 2d  x01)..      geo-
3c40: 3e 65 6e 64 69 61 6e 20 3d 20 47 41 49 41 5f 4c  >endian = GAIA_L
3c50: 49 54 54 4c 45 5f 45 4e 44 49 41 4e 3b 0a 09 20  ITTLE_ENDIAN;.. 
3c60: 20 65 6c 73 65 0a 09 20 20 20 20 20 20 67 65 6f   else..      geo
3c70: 2d 3e 65 6e 64 69 61 6e 20 3d 20 47 41 49 41 5f  ->endian = GAIA_
3c80: 42 49 47 5f 45 4e 44 49 41 4e 3b 0a 09 20 20 67  BIG_ENDIAN;..  g
3c90: 5f 74 79 70 65 20 3d 0a 09 20 20 20 20 20 20 67  _type =..      g
3ca0: 61 69 61 49 6d 70 6f 72 74 33 32 20 28 67 65 6f  aiaImport32 (geo
3cb0: 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66  ->blob + geo->of
3cc0: 66 73 65 74 20 2b 20 31 2c 20 67 65 6f 2d 3e 65  fset + 1, geo->e
3cd0: 6e 64 69 61 6e 2c 0a 09 09 09 20 20 20 20 67 65  ndian,....    ge
3ce0: 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  o->endian_arch);
3cf0: 0a 09 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20  ..  geo->offset 
3d00: 2b 3d 20 35 3b 0a 09 20 20 73 77 69 74 63 68 20  += 5;..  switch 
3d10: 28 67 5f 74 79 70 65 29 0a 09 20 20 20 20 7b 0a  (g_type)..    {.
3d20: 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 50  .    case GAIA_P
3d30: 4f 49 4e 54 3a 0a 09 09 50 61 72 73 65 57 6b 62  OINT:...ParseWkb
3d40: 50 6f 69 6e 74 20 28 67 65 6f 29 3b 0a 09 09 62  Point (geo);...b
3d50: 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20  reak;..    case 
3d60: 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 3a  GAIA_LINESTRING:
3d70: 0a 09 09 50 61 72 73 65 57 6b 62 4c 69 6e 65 20  ...ParseWkbLine 
3d80: 28 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b 3b 0a  (geo);...break;.
3d90: 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 50  .    case GAIA_P
3da0: 4f 4c 59 47 4f 4e 3a 0a 09 09 50 61 72 73 65 57  OLYGON:...ParseW
3db0: 6b 62 50 6f 6c 79 67 6f 6e 20 28 67 65 6f 29 3b  kbPolygon (geo);
3dc0: 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63  ...break;..    c
3dd0: 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  ase GAIA_MULTIPO
3de0: 49 4e 54 3a 0a 09 09 50 61 72 73 65 57 6b 62 4d  INT:...ParseWkbM
3df0: 75 6c 74 69 50 6f 69 6e 74 20 28 67 65 6f 29 3b  ultiPoint (geo);
3e00: 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63  ...break;..    c
3e10: 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49  ase GAIA_MULTILI
3e20: 4e 45 53 54 52 49 4e 47 3a 0a 09 09 50 61 72 73  NESTRING:...Pars
3e30: 65 57 6b 62 4d 75 6c 74 69 4c 69 6e 65 20 28 67  eWkbMultiLine (g
3e40: 65 6f 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  eo);...break;.. 
3e50: 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c     case GAIA_MUL
3e60: 54 49 50 4f 4c 59 47 4f 4e 3a 0a 09 09 50 61 72  TIPOLYGON:...Par
3e70: 73 65 57 6b 62 4d 75 6c 74 69 50 6f 6c 79 67 6f  seWkbMultiPolygo
3e80: 6e 20 28 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b  n (geo);...break
3e90: 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ;..    case GAIA
3ea0: 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
3eb0: 49 4f 4e 3a 0a 09 09 50 61 72 73 65 57 6b 62 47  ION:...ParseWkbG
3ec0: 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 29 3b 0a 09  eomColl (geo);..
3ed0: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 3b 0a  .break;..    };.
3ee0: 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69        }.}..stati
3ef0: 63 20 76 6f 69 64 0a 50 61 72 73 65 57 6b 62 4d  c void.ParseWkbM
3f00: 75 6c 74 69 50 6f 69 6e 74 5a 20 28 67 61 69 61  ultiPointZ (gaia
3f10: 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 29  GeomCollPtr geo)
3f20: 0a 7b 0a 2f 2a 20 64 65 63 6f 64 65 73 20 61 20  .{./* decodes a 
3f30: 4d 55 4c 54 49 50 4f 49 4e 54 5a 20 66 72 6f 6d  MULTIPOINTZ from
3f40: 20 57 4b 42 20 2a 2f 0a 20 20 20 20 69 6e 74 20   WKB */.    int 
3f50: 69 67 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 70 74  ig;.    int n_pt
3f60: 73 3b 0a 20 20 20 20 69 6e 74 20 67 5f 74 79 70  s;.    int g_typ
3f70: 65 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 2d 3e  e;.    if (geo->
3f80: 73 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66 73  size < geo->offs
3f90: 65 74 20 2b 20 34 29 0a 09 72 65 74 75 72 6e 3b  et + 4)..return;
3fa0: 0a 20 20 20 20 6e 5f 70 74 73 20 3d 0a 09 67 61  .    n_pts =..ga
3fb0: 69 61 49 6d 70 6f 72 74 33 32 20 28 67 65 6f 2d  iaImport32 (geo-
3fc0: 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66  >blob + geo->off
3fd0: 73 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e  set, geo->endian
3fe0: 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72  , geo->endian_ar
3ff0: 63 68 29 3b 0a 20 20 20 20 67 65 6f 2d 3e 6f 66  ch);.    geo->of
4000: 66 73 65 74 20 2b 3d 20 34 3b 0a 20 20 20 20 66  fset += 4;.    f
4010: 6f 72 20 28 69 67 20 3d 20 30 3b 20 69 67 20 3c  or (ig = 0; ig <
4020: 20 6e 5f 70 74 73 3b 20 69 67 2b 2b 29 0a 20 20   n_pts; ig++).  
4030: 20 20 20 20 7b 0a 09 20 20 2f 2a 20 70 61 72 73      {..  /* pars
4040: 69 6e 67 20 61 6c 6c 20 50 6f 69 6e 74 73 20 6f  ing all Points o
4050: 6e 65 20 62 79 20 6f 6e 65 20 2a 2f 0a 09 20 20  ne by one */..  
4060: 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20  if (geo->size < 
4070: 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 35 29  geo->offset + 5)
4080: 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ..      return;.
4090: 09 20 20 2f 2a 20 76 61 6e 69 6c 6c 61 20 57 4b  .  /* vanilla WK
40a0: 42 20 63 6f 75 6c 64 20 62 65 20 65 6e 63 6f 64  B could be encod
40b0: 65 64 20 61 73 20 6d 69 78 65 64 20 62 69 67 2d  ed as mixed big-
40c0: 2f 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 73  /little-endian s
40d0: 75 62 2d 69 74 65 6d 73 20 2a 2f 0a 09 20 20 69  ub-items */..  i
40e0: 66 20 28 2a 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b  f (*(geo->blob +
40f0: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 29 20 3d 3d   geo->offset) ==
4100: 20 30 78 30 31 29 0a 09 20 20 20 20 20 20 67 65   0x01)..      ge
4110: 6f 2d 3e 65 6e 64 69 61 6e 20 3d 20 47 41 49 41  o->endian = GAIA
4120: 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 3b 0a  _LITTLE_ENDIAN;.
4130: 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 67  .  else..      g
4140: 65 6f 2d 3e 65 6e 64 69 61 6e 20 3d 20 47 41 49  eo->endian = GAI
4150: 41 5f 42 49 47 5f 45 4e 44 49 41 4e 3b 0a 09 20  A_BIG_ENDIAN;.. 
4160: 20 67 5f 74 79 70 65 20 3d 0a 09 20 20 20 20 20   g_type =..     
4170: 20 67 61 69 61 49 6d 70 6f 72 74 33 32 20 28 67   gaiaImport32 (g
4180: 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e  eo->blob + geo->
4190: 6f 66 66 73 65 74 20 2b 20 31 2c 20 67 65 6f 2d  offset + 1, geo-
41a0: 3e 65 6e 64 69 61 6e 2c 0a 09 09 09 20 20 20 20  >endian,....    
41b0: 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68  geo->endian_arch
41c0: 29 3b 0a 09 20 20 67 65 6f 2d 3e 6f 66 66 73 65  );..  geo->offse
41d0: 74 20 2b 3d 20 35 3b 0a 09 20 20 69 66 20 28 67  t += 5;..  if (g
41e0: 5f 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 50 4f  _type == GAIA_PO
41f0: 49 4e 54 5a 29 0a 09 20 20 20 20 20 20 50 61 72  INTZ)..      Par
4200: 73 65 57 6b 62 50 6f 69 6e 74 5a 20 28 67 65 6f  seWkbPointZ (geo
4210: 29 3b 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74  );.      }.}..st
4220: 61 74 69 63 20 76 6f 69 64 0a 50 61 72 73 65 57  atic void.ParseW
4230: 6b 62 4d 75 6c 74 69 4c 69 6e 65 5a 20 28 67 61  kbMultiLineZ (ga
4240: 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
4250: 6f 29 0a 7b 0a 2f 2a 20 64 65 63 6f 64 65 73 20  o).{./* decodes 
4260: 61 20 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e  a MULTILINESTRIN
4270: 47 5a 20 66 72 6f 6d 20 57 4b 42 20 2a 2f 0a 20  GZ from WKB */. 
4280: 20 20 20 69 6e 74 20 69 67 3b 0a 20 20 20 20 69     int ig;.    i
4290: 6e 74 20 6e 5f 6c 6e 73 3b 0a 20 20 20 20 69 6e  nt n_lns;.    in
42a0: 74 20 67 5f 74 79 70 65 3b 0a 20 20 20 20 69 66  t g_type;.    if
42b0: 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65   (geo->size < ge
42c0: 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 34 29 0a 09  o->offset + 4)..
42d0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e 5f 6c 6e  return;.    n_ln
42e0: 73 20 3d 0a 09 67 61 69 61 49 6d 70 6f 72 74 33  s =..gaiaImport3
42f0: 32 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67  2 (geo->blob + g
4300: 65 6f 2d 3e 6f 66 66 73 65 74 2c 20 67 65 6f 2d  eo->offset, geo-
4310: 3e 65 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e 65 6e  >endian, geo->en
4320: 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20  dian_arch);.    
4330: 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 34  geo->offset += 4
4340: 3b 0a 20 20 20 20 66 6f 72 20 28 69 67 20 3d 20  ;.    for (ig = 
4350: 30 3b 20 69 67 20 3c 20 6e 5f 6c 6e 73 3b 20 69  0; ig < n_lns; i
4360: 67 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  g++).      {..  
4370: 2f 2a 20 70 61 72 73 69 6e 67 20 61 6c 6c 20 4c  /* parsing all L
4380: 69 6e 65 73 74 72 69 6e 67 73 20 6f 6e 65 20 62  inestrings one b
4390: 79 20 6f 6e 65 20 2a 2f 0a 09 20 20 69 66 20 28  y one */..  if (
43a0: 67 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65 6f 2d  geo->size < geo-
43b0: 3e 6f 66 66 73 65 74 20 2b 20 35 29 0a 09 20 20  >offset + 5)..  
43c0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 09 20 20 2f      return;..  /
43d0: 2a 20 76 61 6e 69 6c 6c 61 20 57 4b 42 20 63 6f  * vanilla WKB co
43e0: 75 6c 64 20 62 65 20 65 6e 63 6f 64 65 64 20 61  uld be encoded a
43f0: 73 20 6d 69 78 65 64 20 62 69 67 2d 2f 6c 69 74  s mixed big-/lit
4400: 74 6c 65 2d 65 6e 64 69 61 6e 20 73 75 62 2d 69  tle-endian sub-i
4410: 74 65 6d 73 20 2a 2f 0a 09 20 20 69 66 20 28 2a  tems */..  if (*
4420: 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f  (geo->blob + geo
4430: 2d 3e 6f 66 66 73 65 74 29 20 3d 3d 20 30 78 30  ->offset) == 0x0
4440: 31 29 0a 09 20 20 20 20 20 20 67 65 6f 2d 3e 65  1)..      geo->e
4450: 6e 64 69 61 6e 20 3d 20 47 41 49 41 5f 4c 49 54  ndian = GAIA_LIT
4460: 54 4c 45 5f 45 4e 44 49 41 4e 3b 0a 09 20 20 65  TLE_ENDIAN;..  e
4470: 6c 73 65 0a 09 20 20 20 20 20 20 67 65 6f 2d 3e  lse..      geo->
4480: 65 6e 64 69 61 6e 20 3d 20 47 41 49 41 5f 42 49  endian = GAIA_BI
4490: 47 5f 45 4e 44 49 41 4e 3b 0a 09 20 20 67 5f 74  G_ENDIAN;..  g_t
44a0: 79 70 65 20 3d 0a 09 20 20 20 20 20 20 67 61 69  ype =..      gai
44b0: 61 49 6d 70 6f 72 74 33 32 20 28 67 65 6f 2d 3e  aImport32 (geo->
44c0: 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73  blob + geo->offs
44d0: 65 74 20 2b 20 31 2c 20 67 65 6f 2d 3e 65 6e 64  et + 1, geo->end
44e0: 69 61 6e 2c 0a 09 09 09 20 20 20 20 67 65 6f 2d  ian,....    geo-
44f0: 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09  >endian_arch);..
4500: 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d    geo->offset +=
4510: 20 35 3b 0a 09 20 20 69 66 20 28 67 5f 74 79 70   5;..  if (g_typ
4520: 65 20 3d 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54  e == GAIA_LINEST
4530: 52 49 4e 47 5a 29 0a 09 20 20 20 20 20 20 50 61  RINGZ)..      Pa
4540: 72 73 65 57 6b 62 4c 69 6e 65 5a 20 28 67 65 6f  rseWkbLineZ (geo
4550: 29 3b 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74  );.      }.}..st
4560: 61 74 69 63 20 76 6f 69 64 0a 50 61 72 73 65 57  atic void.ParseW
4570: 6b 62 4d 75 6c 74 69 50 6f 6c 79 67 6f 6e 5a 20  kbMultiPolygonZ 
4580: 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72  (gaiaGeomCollPtr
4590: 20 67 65 6f 29 0a 7b 0a 2f 2a 20 64 65 63 6f 64   geo).{./* decod
45a0: 65 73 20 61 20 4d 55 4c 54 49 50 4f 4c 59 47 4f  es a MULTIPOLYGO
45b0: 4e 5a 20 66 72 6f 6d 20 57 4b 42 20 2a 2f 0a 20  NZ from WKB */. 
45c0: 20 20 20 69 6e 74 20 69 67 3b 0a 20 20 20 20 69     int ig;.    i
45d0: 6e 74 20 6e 5f 70 67 73 3b 0a 20 20 20 20 69 6e  nt n_pgs;.    in
45e0: 74 20 67 5f 74 79 70 65 3b 0a 20 20 20 20 69 66  t g_type;.    if
45f0: 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65   (geo->size < ge
4600: 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 34 29 0a 09  o->offset + 4)..
4610: 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e 5f 70 67  return;.    n_pg
4620: 73 20 3d 0a 09 67 61 69 61 49 6d 70 6f 72 74 33  s =..gaiaImport3
4630: 32 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67  2 (geo->blob + g
4640: 65 6f 2d 3e 6f 66 66 73 65 74 2c 20 67 65 6f 2d  eo->offset, geo-
4650: 3e 65 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e 65 6e  >endian, geo->en
4660: 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20  dian_arch);.    
4670: 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 34  geo->offset += 4
4680: 3b 0a 20 20 20 20 66 6f 72 20 28 69 67 20 3d 20  ;.    for (ig = 
4690: 30 3b 20 69 67 20 3c 20 6e 5f 70 67 73 3b 20 69  0; ig < n_pgs; i
46a0: 67 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  g++).      {..  
46b0: 2f 2a 20 70 61 72 73 69 6e 67 20 61 6c 6c 20 50  /* parsing all P
46c0: 6f 6c 79 67 6f 6e 73 20 6f 6e 65 20 62 79 20 6f  olygons one by o
46d0: 6e 65 20 2a 2f 0a 09 20 20 69 66 20 28 67 65 6f  ne */..  if (geo
46e0: 2d 3e 73 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66  ->size < geo->of
46f0: 66 73 65 74 20 2b 20 35 29 0a 09 20 20 20 20 20  fset + 5)..     
4700: 20 72 65 74 75 72 6e 3b 0a 09 20 20 2f 2a 20 76   return;..  /* v
4710: 61 6e 69 6c 6c 61 20 57 4b 42 20 63 6f 75 6c 64  anilla WKB could
4720: 20 62 65 20 65 6e 63 6f 64 65 64 20 61 73 20 6d   be encoded as m
4730: 69 78 65 64 20 62 69 67 2d 2f 6c 69 74 74 6c 65  ixed big-/little
4740: 2d 65 6e 64 69 61 6e 20 73 75 62 2d 69 74 65 6d  -endian sub-item
4750: 73 20 2a 2f 0a 09 20 20 69 66 20 28 2a 28 67 65  s */..  if (*(ge
4760: 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f  o->blob + geo->o
4770: 66 66 73 65 74 29 20 3d 3d 20 30 78 30 31 29 0a  ffset) == 0x01).
4780: 09 20 20 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69  .      geo->endi
4790: 61 6e 20 3d 20 47 41 49 41 5f 4c 49 54 54 4c 45  an = GAIA_LITTLE
47a0: 5f 45 4e 44 49 41 4e 3b 0a 09 20 20 65 6c 73 65  _ENDIAN;..  else
47b0: 0a 09 20 20 20 20 20 20 67 65 6f 2d 3e 65 6e 64  ..      geo->end
47c0: 69 61 6e 20 3d 20 47 41 49 41 5f 42 49 47 5f 45  ian = GAIA_BIG_E
47d0: 4e 44 49 41 4e 3b 0a 09 20 20 67 5f 74 79 70 65  NDIAN;..  g_type
47e0: 20 3d 0a 09 20 20 20 20 20 20 67 61 69 61 49 6d   =..      gaiaIm
47f0: 70 6f 72 74 33 32 20 28 67 65 6f 2d 3e 62 6c 6f  port32 (geo->blo
4800: 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20  b + geo->offset 
4810: 2b 20 31 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e  + 1, geo->endian
4820: 2c 0a 09 09 09 20 20 20 20 67 65 6f 2d 3e 65 6e  ,....    geo->en
4830: 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 20 20 67  dian_arch);..  g
4840: 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 35 3b  eo->offset += 5;
4850: 0a 09 20 20 69 66 20 28 67 5f 74 79 70 65 20 3d  ..  if (g_type =
4860: 3d 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 29  = GAIA_POLYGONZ)
4870: 0a 09 20 20 20 20 20 20 50 61 72 73 65 57 6b 62  ..      ParseWkb
4880: 50 6f 6c 79 67 6f 6e 5a 20 28 67 65 6f 29 3b 0a  PolygonZ (geo);.
4890: 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69        }.}..stati
48a0: 63 20 76 6f 69 64 0a 50 61 72 73 65 57 6b 62 47  c void.ParseWkbG
48b0: 65 6f 6d 43 6f 6c 6c 5a 20 28 67 61 69 61 47 65  eomCollZ (gaiaGe
48c0: 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 29 0a 7b  omCollPtr geo).{
48d0: 0a 2f 2a 20 64 65 63 6f 64 65 73 20 61 20 47 45  ./* decodes a GE
48e0: 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
48f0: 5a 20 66 72 6f 6d 20 57 4b 42 20 2a 2f 0a 20 20  Z from WKB */.  
4900: 20 20 69 6e 74 20 69 67 3b 0a 20 20 20 20 69 6e    int ig;.    in
4910: 74 20 6e 5f 67 65 6f 6d 73 3b 0a 20 20 20 20 69  t n_geoms;.    i
4920: 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20 67  f (geo->size < g
4930: 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 34 29 0a  eo->offset + 4).
4940: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e 5f 67  .return;.    n_g
4950: 65 6f 6d 73 20 3d 0a 09 67 61 69 61 49 6d 70 6f  eoms =..gaiaImpo
4960: 72 74 33 32 20 28 67 65 6f 2d 3e 62 6c 6f 62 20  rt32 (geo->blob 
4970: 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74 2c 20 67  + geo->offset, g
4980: 65 6f 2d 3e 65 6e 64 69 61 6e 2c 20 67 65 6f 2d  eo->endian, geo-
4990: 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20  >endian_arch);. 
49a0: 20 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b     geo->offset +
49b0: 3d 20 34 3b 0a 20 20 20 20 66 6f 72 20 28 69 67  = 4;.    for (ig
49c0: 20 3d 20 30 3b 20 69 67 20 3c 20 6e 5f 67 65 6f   = 0; ig < n_geo
49d0: 6d 73 3b 20 69 67 2b 2b 29 0a 20 20 20 20 20 20  ms; ig++).      
49e0: 7b 0a 09 20 20 2f 2a 20 70 61 72 73 69 6e 67 20  {..  /* parsing 
49f0: 61 6c 6c 20 47 65 6f 6d 65 74 72 69 65 73 20 6f  all Geometries o
4a00: 6e 65 20 62 79 20 6f 6e 65 20 2a 2f 0a 09 20 20  ne by one */..  
4a10: 69 6e 74 20 67 5f 74 79 70 65 3b 0a 09 20 20 69  int g_type;..  i
4a20: 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20 67  f (geo->size < g
4a30: 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 35 29 0a  eo->offset + 5).
4a40: 09 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 09  .      return;..
4a50: 20 20 2f 2a 20 76 61 6e 69 6c 6c 61 20 57 4b 42    /* vanilla WKB
4a60: 20 63 6f 75 6c 64 20 62 65 20 65 6e 63 6f 64 65   could be encode
4a70: 64 20 61 73 20 6d 69 78 65 64 20 62 69 67 2d 2f  d as mixed big-/
4a80: 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 73 75  little-endian su
4a90: 62 2d 69 74 65 6d 73 20 2a 2f 0a 09 20 20 69 66  b-items */..  if
4aa0: 20 28 2a 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20   (*(geo->blob + 
4ab0: 67 65 6f 2d 3e 6f 66 66 73 65 74 29 20 3d 3d 20  geo->offset) == 
4ac0: 30 78 30 31 29 0a 09 20 20 20 20 20 20 67 65 6f  0x01)..      geo
4ad0: 2d 3e 65 6e 64 69 61 6e 20 3d 20 47 41 49 41 5f  ->endian = GAIA_
4ae0: 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 3b 0a 09  LITTLE_ENDIAN;..
4af0: 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 67 65    else..      ge
4b00: 6f 2d 3e 65 6e 64 69 61 6e 20 3d 20 47 41 49 41  o->endian = GAIA
4b10: 5f 42 49 47 5f 45 4e 44 49 41 4e 3b 0a 09 20 20  _BIG_ENDIAN;..  
4b20: 67 5f 74 79 70 65 20 3d 0a 09 20 20 20 20 20 20  g_type =..      
4b30: 67 61 69 61 49 6d 70 6f 72 74 33 32 20 28 67 65  gaiaImport32 (ge
4b40: 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f  o->blob + geo->o
4b50: 66 66 73 65 74 20 2b 20 31 2c 20 67 65 6f 2d 3e  ffset + 1, geo->
4b60: 65 6e 64 69 61 6e 2c 0a 09 09 09 20 20 20 20 67  endian,....    g
4b70: 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29  eo->endian_arch)
4b80: 3b 0a 09 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74  ;..  geo->offset
4b90: 20 2b 3d 20 35 3b 0a 09 20 20 73 77 69 74 63 68   += 5;..  switch
4ba0: 20 28 67 5f 74 79 70 65 29 0a 09 20 20 20 20 7b   (g_type)..    {
4bb0: 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f  ..    case GAIA_
4bc0: 50 4f 49 4e 54 5a 3a 0a 09 09 50 61 72 73 65 57  POINTZ:...ParseW
4bd0: 6b 62 50 6f 69 6e 74 5a 20 28 67 65 6f 29 3b 0a  kbPointZ (geo);.
4be0: 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61  ..break;..    ca
4bf0: 73 65 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49  se GAIA_LINESTRI
4c00: 4e 47 5a 3a 0a 09 09 50 61 72 73 65 57 6b 62 4c  NGZ:...ParseWkbL
4c10: 69 6e 65 5a 20 28 67 65 6f 29 3b 0a 09 09 62 72  ineZ (geo);...br
4c20: 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47  eak;..    case G
4c30: 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 3a 0a 09 09  AIA_POLYGONZ:...
4c40: 50 61 72 73 65 57 6b 62 50 6f 6c 79 67 6f 6e 5a  ParseWkbPolygonZ
4c50: 20 28 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b 3b   (geo);...break;
4c60: 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f  ..    case GAIA_
4c70: 4d 55 4c 54 49 50 4f 49 4e 54 5a 3a 0a 09 09 50  MULTIPOINTZ:...P
4c80: 61 72 73 65 57 6b 62 4d 75 6c 74 69 50 6f 69 6e  arseWkbMultiPoin
4c90: 74 5a 20 28 67 65 6f 29 3b 0a 09 09 62 72 65 61  tZ (geo);...brea
4ca0: 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49  k;..    case GAI
4cb0: 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e  A_MULTILINESTRIN
4cc0: 47 5a 3a 0a 09 09 50 61 72 73 65 57 6b 62 4d 75  GZ:...ParseWkbMu
4cd0: 6c 74 69 4c 69 6e 65 5a 20 28 67 65 6f 29 3b 0a  ltiLineZ (geo);.
4ce0: 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61  ..break;..    ca
4cf0: 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c  se GAIA_MULTIPOL
4d00: 59 47 4f 4e 5a 3a 0a 09 09 50 61 72 73 65 57 6b  YGONZ:...ParseWk
4d10: 62 4d 75 6c 74 69 50 6f 6c 79 67 6f 6e 5a 20 28  bMultiPolygonZ (
4d20: 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09  geo);...break;..
4d30: 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 47 45      case GAIA_GE
4d40: 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
4d50: 5a 3a 0a 09 09 50 61 72 73 65 57 6b 62 47 65 6f  Z:...ParseWkbGeo
4d60: 6d 43 6f 6c 6c 5a 20 28 67 65 6f 29 3b 0a 09 09  mCollZ (geo);...
4d70: 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 3b 0a 20  break;..    };. 
4d80: 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63       }.}..static
4d90: 20 76 6f 69 64 0a 50 61 72 73 65 57 6b 62 4d 75   void.ParseWkbMu
4da0: 6c 74 69 50 6f 69 6e 74 4d 20 28 67 61 69 61 47  ltiPointM (gaiaG
4db0: 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 29 0a  eomCollPtr geo).
4dc0: 7b 0a 2f 2a 20 64 65 63 6f 64 65 73 20 61 20 4d  {./* decodes a M
4dd0: 55 4c 54 49 50 4f 49 4e 54 4d 20 66 72 6f 6d 20  ULTIPOINTM from 
4de0: 57 4b 42 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  WKB */.    int i
4df0: 67 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 70 74 73  g;.    int n_pts
4e00: 3b 0a 20 20 20 20 69 6e 74 20 67 5f 74 79 70 65  ;.    int g_type
4e10: 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 2d 3e 73  ;.    if (geo->s
4e20: 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66 73 65  ize < geo->offse
4e30: 74 20 2b 20 34 29 0a 09 72 65 74 75 72 6e 3b 0a  t + 4)..return;.
4e40: 20 20 20 20 6e 5f 70 74 73 20 3d 0a 09 67 61 69      n_pts =..gai
4e50: 61 49 6d 70 6f 72 74 33 32 20 28 67 65 6f 2d 3e  aImport32 (geo->
4e60: 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73  blob + geo->offs
4e70: 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c  et, geo->endian,
4e80: 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63   geo->endian_arc
4e90: 68 29 3b 0a 20 20 20 20 67 65 6f 2d 3e 6f 66 66  h);.    geo->off
4ea0: 73 65 74 20 2b 3d 20 34 3b 0a 20 20 20 20 66 6f  set += 4;.    fo
4eb0: 72 20 28 69 67 20 3d 20 30 3b 20 69 67 20 3c 20  r (ig = 0; ig < 
4ec0: 6e 5f 70 74 73 3b 20 69 67 2b 2b 29 0a 20 20 20  n_pts; ig++).   
4ed0: 20 20 20 7b 0a 09 20 20 2f 2a 20 70 61 72 73 69     {..  /* parsi
4ee0: 6e 67 20 61 6c 6c 20 50 6f 69 6e 74 73 20 6f 6e  ng all Points on
4ef0: 65 20 62 79 20 6f 6e 65 20 2a 2f 0a 09 20 20 69  e by one */..  i
4f00: 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20 67  f (geo->size < g
4f10: 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 35 29 0a  eo->offset + 5).
4f20: 09 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 09  .      return;..
4f30: 20 20 2f 2a 20 76 61 6e 69 6c 6c 61 20 57 4b 42    /* vanilla WKB
4f40: 20 63 6f 75 6c 64 20 62 65 20 65 6e 63 6f 64 65   could be encode
4f50: 64 20 61 73 20 6d 69 78 65 64 20 62 69 67 2d 2f  d as mixed big-/
4f60: 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 73 75  little-endian su
4f70: 62 2d 69 74 65 6d 73 20 2a 2f 0a 09 20 20 69 66  b-items */..  if
4f80: 20 28 2a 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20   (*(geo->blob + 
4f90: 67 65 6f 2d 3e 6f 66 66 73 65 74 29 20 3d 3d 20  geo->offset) == 
4fa0: 30 78 30 31 29 0a 09 20 20 20 20 20 20 67 65 6f  0x01)..      geo
4fb0: 2d 3e 65 6e 64 69 61 6e 20 3d 20 47 41 49 41 5f  ->endian = GAIA_
4fc0: 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 3b 0a 09  LITTLE_ENDIAN;..
4fd0: 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 67 65    else..      ge
4fe0: 6f 2d 3e 65 6e 64 69 61 6e 20 3d 20 47 41 49 41  o->endian = GAIA
4ff0: 5f 42 49 47 5f 45 4e 44 49 41 4e 3b 0a 09 20 20  _BIG_ENDIAN;..  
5000: 67 5f 74 79 70 65 20 3d 0a 09 20 20 20 20 20 20  g_type =..      
5010: 67 61 69 61 49 6d 70 6f 72 74 33 32 20 28 67 65  gaiaImport32 (ge
5020: 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f  o->blob + geo->o
5030: 66 66 73 65 74 20 2b 20 31 2c 20 67 65 6f 2d 3e  ffset + 1, geo->
5040: 65 6e 64 69 61 6e 2c 0a 09 09 09 20 20 20 20 67  endian,....    g
5050: 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29  eo->endian_arch)
5060: 3b 0a 09 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74  ;..  geo->offset
5070: 20 2b 3d 20 35 3b 0a 09 20 20 69 66 20 28 67 5f   += 5;..  if (g_
5080: 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 50 4f 49  type == GAIA_POI
5090: 4e 54 4d 29 0a 09 20 20 20 20 20 20 50 61 72 73  NTM)..      Pars
50a0: 65 57 6b 62 50 6f 69 6e 74 4d 20 28 67 65 6f 29  eWkbPointM (geo)
50b0: 3b 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61  ;.      }.}..sta
50c0: 74 69 63 20 76 6f 69 64 0a 50 61 72 73 65 57 6b  tic void.ParseWk
50d0: 62 4d 75 6c 74 69 4c 69 6e 65 4d 20 28 67 61 69  bMultiLineM (gai
50e0: 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
50f0: 29 0a 7b 0a 2f 2a 20 64 65 63 6f 64 65 73 20 61  ).{./* decodes a
5100: 20 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47   MULTILINESTRING
5110: 4d 20 66 72 6f 6d 20 57 4b 42 20 2a 2f 0a 20 20  M from WKB */.  
5120: 20 20 69 6e 74 20 69 67 3b 0a 20 20 20 20 69 6e    int ig;.    in
5130: 74 20 6e 5f 6c 6e 73 3b 0a 20 20 20 20 69 6e 74  t n_lns;.    int
5140: 20 67 5f 74 79 70 65 3b 0a 20 20 20 20 69 66 20   g_type;.    if 
5150: 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65 6f  (geo->size < geo
5160: 2d 3e 6f 66 66 73 65 74 20 2b 20 34 29 0a 09 72  ->offset + 4)..r
5170: 65 74 75 72 6e 3b 0a 20 20 20 20 6e 5f 6c 6e 73  eturn;.    n_lns
5180: 20 3d 0a 09 67 61 69 61 49 6d 70 6f 72 74 33 32   =..gaiaImport32
5190: 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65   (geo->blob + ge
51a0: 6f 2d 3e 6f 66 66 73 65 74 2c 20 67 65 6f 2d 3e  o->offset, geo->
51b0: 65 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e 65 6e 64  endian, geo->end
51c0: 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20 67  ian_arch);.    g
51d0: 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 34 3b  eo->offset += 4;
51e0: 0a 20 20 20 20 66 6f 72 20 28 69 67 20 3d 20 30  .    for (ig = 0
51f0: 3b 20 69 67 20 3c 20 6e 5f 6c 6e 73 3b 20 69 67  ; ig < n_lns; ig
5200: 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f  ++).      {..  /
5210: 2a 20 70 61 72 73 69 6e 67 20 61 6c 6c 20 4c 69  * parsing all Li
5220: 6e 65 73 74 72 69 6e 67 73 20 6f 6e 65 20 62 79  nestrings one by
5230: 20 6f 6e 65 20 2a 2f 0a 09 20 20 69 66 20 28 67   one */..  if (g
5240: 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65 6f 2d 3e  eo->size < geo->
5250: 6f 66 66 73 65 74 20 2b 20 35 29 0a 09 20 20 20  offset + 5)..   
5260: 20 20 20 72 65 74 75 72 6e 3b 0a 09 20 20 2f 2a     return;..  /*
5270: 20 76 61 6e 69 6c 6c 61 20 57 4b 42 20 63 6f 75   vanilla WKB cou
5280: 6c 64 20 62 65 20 65 6e 63 6f 64 65 64 20 61 73  ld be encoded as
5290: 20 6d 69 78 65 64 20 62 69 67 2d 2f 6c 69 74 74   mixed big-/litt
52a0: 6c 65 2d 65 6e 64 69 61 6e 20 73 75 62 2d 69 74  le-endian sub-it
52b0: 65 6d 73 20 2a 2f 0a 09 20 20 69 66 20 28 2a 28  ems */..  if (*(
52c0: 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d  geo->blob + geo-
52d0: 3e 6f 66 66 73 65 74 29 20 3d 3d 20 30 78 30 31  >offset) == 0x01
52e0: 29 0a 09 20 20 20 20 20 20 67 65 6f 2d 3e 65 6e  )..      geo->en
52f0: 64 69 61 6e 20 3d 20 47 41 49 41 5f 4c 49 54 54  dian = GAIA_LITT
5300: 4c 45 5f 45 4e 44 49 41 4e 3b 0a 09 20 20 65 6c  LE_ENDIAN;..  el
5310: 73 65 0a 09 20 20 20 20 20 20 67 65 6f 2d 3e 65  se..      geo->e
5320: 6e 64 69 61 6e 20 3d 20 47 41 49 41 5f 42 49 47  ndian = GAIA_BIG
5330: 5f 45 4e 44 49 41 4e 3b 0a 09 20 20 67 5f 74 79  _ENDIAN;..  g_ty
5340: 70 65 20 3d 0a 09 20 20 20 20 20 20 67 61 69 61  pe =..      gaia
5350: 49 6d 70 6f 72 74 33 32 20 28 67 65 6f 2d 3e 62  Import32 (geo->b
5360: 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65  lob + geo->offse
5370: 74 20 2b 20 31 2c 20 67 65 6f 2d 3e 65 6e 64 69  t + 1, geo->endi
5380: 61 6e 2c 0a 09 09 09 20 20 20 20 67 65 6f 2d 3e  an,....    geo->
5390: 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 20  endian_arch);.. 
53a0: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d 20   geo->offset += 
53b0: 35 3b 0a 09 20 20 69 66 20 28 67 5f 74 79 70 65  5;..  if (g_type
53c0: 20 3d 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54 52   == GAIA_LINESTR
53d0: 49 4e 47 4d 29 0a 09 20 20 20 20 20 20 50 61 72  INGM)..      Par
53e0: 73 65 57 6b 62 4c 69 6e 65 4d 20 28 67 65 6f 29  seWkbLineM (geo)
53f0: 3b 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61  ;.      }.}..sta
5400: 74 69 63 20 76 6f 69 64 0a 50 61 72 73 65 57 6b  tic void.ParseWk
5410: 62 4d 75 6c 74 69 50 6f 6c 79 67 6f 6e 4d 20 28  bMultiPolygonM (
5420: 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
5430: 67 65 6f 29 0a 7b 0a 2f 2a 20 64 65 63 6f 64 65  geo).{./* decode
5440: 73 20 61 20 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e  s a MULTIPOLYGON
5450: 4d 20 66 72 6f 6d 20 57 4b 42 20 2a 2f 0a 20 20  M from WKB */.  
5460: 20 20 69 6e 74 20 69 67 3b 0a 20 20 20 20 69 6e    int ig;.    in
5470: 74 20 6e 5f 70 67 73 3b 0a 20 20 20 20 69 6e 74  t n_pgs;.    int
5480: 20 67 5f 74 79 70 65 3b 0a 20 20 20 20 69 66 20   g_type;.    if 
5490: 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65 6f  (geo->size < geo
54a0: 2d 3e 6f 66 66 73 65 74 20 2b 20 34 29 0a 09 72  ->offset + 4)..r
54b0: 65 74 75 72 6e 3b 0a 20 20 20 20 6e 5f 70 67 73  eturn;.    n_pgs
54c0: 20 3d 0a 09 67 61 69 61 49 6d 70 6f 72 74 33 32   =..gaiaImport32
54d0: 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65   (geo->blob + ge
54e0: 6f 2d 3e 6f 66 66 73 65 74 2c 20 67 65 6f 2d 3e  o->offset, geo->
54f0: 65 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e 65 6e 64  endian, geo->end
5500: 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20 67  ian_arch);.    g
5510: 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 34 3b  eo->offset += 4;
5520: 0a 20 20 20 20 66 6f 72 20 28 69 67 20 3d 20 30  .    for (ig = 0
5530: 3b 20 69 67 20 3c 20 6e 5f 70 67 73 3b 20 69 67  ; ig < n_pgs; ig
5540: 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f  ++).      {..  /
5550: 2a 20 70 61 72 73 69 6e 67 20 61 6c 6c 20 50 6f  * parsing all Po
5560: 6c 79 67 6f 6e 73 20 6f 6e 65 20 62 79 20 6f 6e  lygons one by on
5570: 65 20 2a 2f 0a 09 20 20 69 66 20 28 67 65 6f 2d  e */..  if (geo-
5580: 3e 73 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66  >size < geo->off
5590: 73 65 74 20 2b 20 35 29 0a 09 20 20 20 20 20 20  set + 5)..      
55a0: 72 65 74 75 72 6e 3b 0a 09 20 20 2f 2a 20 76 61  return;..  /* va
55b0: 6e 69 6c 6c 61 20 57 4b 42 20 63 6f 75 6c 64 20  nilla WKB could 
55c0: 62 65 20 65 6e 63 6f 64 65 64 20 61 73 20 6d 69  be encoded as mi
55d0: 78 65 64 20 62 69 67 2d 2f 6c 69 74 74 6c 65 2d  xed big-/little-
55e0: 65 6e 64 69 61 6e 20 73 75 62 2d 69 74 65 6d 73  endian sub-items
55f0: 20 2a 2f 0a 09 20 20 69 66 20 28 2a 28 67 65 6f   */..  if (*(geo
5600: 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66  ->blob + geo->of
5610: 66 73 65 74 29 20 3d 3d 20 30 78 30 31 29 0a 09  fset) == 0x01)..
5620: 20 20 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69 61        geo->endia
5630: 6e 20 3d 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f  n = GAIA_LITTLE_
5640: 45 4e 44 49 41 4e 3b 0a 09 20 20 65 6c 73 65 0a  ENDIAN;..  else.
5650: 09 20 20 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69  .      geo->endi
5660: 61 6e 20 3d 20 47 41 49 41 5f 42 49 47 5f 45 4e  an = GAIA_BIG_EN
5670: 44 49 41 4e 3b 0a 09 20 20 67 5f 74 79 70 65 20  DIAN;..  g_type 
5680: 3d 0a 09 20 20 20 20 20 20 67 61 69 61 49 6d 70  =..      gaiaImp
5690: 6f 72 74 33 32 20 28 67 65 6f 2d 3e 62 6c 6f 62  ort32 (geo->blob
56a0: 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b   + geo->offset +
56b0: 20 31 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c   1, geo->endian,
56c0: 0a 09 09 09 20 20 20 20 67 65 6f 2d 3e 65 6e 64  ....    geo->end
56d0: 69 61 6e 5f 61 72 63 68 29 3b 0a 09 20 20 67 65  ian_arch);..  ge
56e0: 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 35 3b 0a  o->offset += 5;.
56f0: 09 20 20 69 66 20 28 67 5f 74 79 70 65 20 3d 3d  .  if (g_type ==
5700: 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 4d 29 0a   GAIA_POLYGONM).
5710: 09 20 20 20 20 20 20 50 61 72 73 65 57 6b 62 50  .      ParseWkbP
5720: 6f 6c 79 67 6f 6e 4d 20 28 67 65 6f 29 3b 0a 20  olygonM (geo);. 
5730: 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63       }.}..static
5740: 20 76 6f 69 64 0a 50 61 72 73 65 57 6b 62 47 65   void.ParseWkbGe
5750: 6f 6d 43 6f 6c 6c 4d 20 28 67 61 69 61 47 65 6f  omCollM (gaiaGeo
5760: 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 29 0a 7b 0a  mCollPtr geo).{.
5770: 2f 2a 20 64 65 63 6f 64 65 73 20 61 20 47 45 4f  /* decodes a GEO
5780: 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 4d  METRYCOLLECTIONM
5790: 20 66 72 6f 6d 20 57 4b 42 20 2a 2f 0a 20 20 20   from WKB */.   
57a0: 20 69 6e 74 20 69 67 3b 0a 20 20 20 20 69 6e 74   int ig;.    int
57b0: 20 6e 5f 67 65 6f 6d 73 3b 0a 20 20 20 20 69 66   n_geoms;.    if
57c0: 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65   (geo->size < ge
57d0: 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 34 29 0a 09  o->offset + 4)..
57e0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e 5f 67 65  return;.    n_ge
57f0: 6f 6d 73 20 3d 0a 09 67 61 69 61 49 6d 70 6f 72  oms =..gaiaImpor
5800: 74 33 32 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b  t32 (geo->blob +
5810: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 2c 20 67 65   geo->offset, ge
5820: 6f 2d 3e 65 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e  o->endian, geo->
5830: 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20  endian_arch);.  
5840: 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d    geo->offset +=
5850: 20 34 3b 0a 20 20 20 20 66 6f 72 20 28 69 67 20   4;.    for (ig 
5860: 3d 20 30 3b 20 69 67 20 3c 20 6e 5f 67 65 6f 6d  = 0; ig < n_geom
5870: 73 3b 20 69 67 2b 2b 29 0a 20 20 20 20 20 20 7b  s; ig++).      {
5880: 0a 09 20 20 2f 2a 20 70 61 72 73 69 6e 67 20 61  ..  /* parsing a
5890: 6c 6c 20 47 65 6f 6d 65 74 72 69 65 73 20 6f 6e  ll Geometries on
58a0: 65 20 62 79 20 6f 6e 65 20 2a 2f 0a 09 20 20 69  e by one */..  i
58b0: 6e 74 20 67 5f 74 79 70 65 3b 0a 09 20 20 69 66  nt g_type;..  if
58c0: 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65   (geo->size < ge
58d0: 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 35 29 0a 09  o->offset + 5)..
58e0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 09 20        return;.. 
58f0: 20 2f 2a 20 76 61 6e 69 6c 6c 61 20 57 4b 42 20   /* vanilla WKB 
5900: 63 6f 75 6c 64 20 62 65 20 65 6e 63 6f 64 65 64  could be encoded
5910: 20 61 73 20 6d 69 78 65 64 20 62 69 67 2d 2f 6c   as mixed big-/l
5920: 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 73 75 62  ittle-endian sub
5930: 2d 69 74 65 6d 73 20 2a 2f 0a 09 20 20 69 66 20  -items */..  if 
5940: 28 2a 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67  (*(geo->blob + g
5950: 65 6f 2d 3e 6f 66 66 73 65 74 29 20 3d 3d 20 30  eo->offset) == 0
5960: 78 30 31 29 0a 09 20 20 20 20 20 20 67 65 6f 2d  x01)..      geo-
5970: 3e 65 6e 64 69 61 6e 20 3d 20 47 41 49 41 5f 4c  >endian = GAIA_L
5980: 49 54 54 4c 45 5f 45 4e 44 49 41 4e 3b 0a 09 20  ITTLE_ENDIAN;.. 
5990: 20 65 6c 73 65 0a 09 20 20 20 20 20 20 67 65 6f   else..      geo
59a0: 2d 3e 65 6e 64 69 61 6e 20 3d 20 47 41 49 41 5f  ->endian = GAIA_
59b0: 42 49 47 5f 45 4e 44 49 41 4e 3b 0a 09 20 20 67  BIG_ENDIAN;..  g
59c0: 5f 74 79 70 65 20 3d 0a 09 20 20 20 20 20 20 67  _type =..      g
59d0: 61 69 61 49 6d 70 6f 72 74 33 32 20 28 67 65 6f  aiaImport32 (geo
59e0: 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66  ->blob + geo->of
59f0: 66 73 65 74 20 2b 20 31 2c 20 67 65 6f 2d 3e 65  fset + 1, geo->e
5a00: 6e 64 69 61 6e 2c 0a 09 09 09 20 20 20 20 67 65  ndian,....    ge
5a10: 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  o->endian_arch);
5a20: 0a 09 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20  ..  geo->offset 
5a30: 2b 3d 20 35 3b 0a 09 20 20 73 77 69 74 63 68 20  += 5;..  switch 
5a40: 28 67 5f 74 79 70 65 29 0a 09 20 20 20 20 7b 0a  (g_type)..    {.
5a50: 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 50  .    case GAIA_P
5a60: 4f 49 4e 54 4d 3a 0a 09 09 50 61 72 73 65 57 6b  OINTM:...ParseWk
5a70: 62 50 6f 69 6e 74 4d 20 28 67 65 6f 29 3b 0a 09  bPointM (geo);..
5a80: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
5a90: 65 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e  e GAIA_LINESTRIN
5aa0: 47 4d 3a 0a 09 09 50 61 72 73 65 57 6b 62 4c 69  GM:...ParseWkbLi
5ab0: 6e 65 4d 20 28 67 65 6f 29 3b 0a 09 09 62 72 65  neM (geo);...bre
5ac0: 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41  ak;..    case GA
5ad0: 49 41 5f 50 4f 4c 59 47 4f 4e 4d 3a 0a 09 09 50  IA_POLYGONM:...P
5ae0: 61 72 73 65 57 6b 62 50 6f 6c 79 67 6f 6e 4d 20  arseWkbPolygonM 
5af0: 28 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b 3b 0a  (geo);...break;.
5b00: 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d  .    case GAIA_M
5b10: 55 4c 54 49 50 4f 49 4e 54 4d 3a 0a 09 09 50 61  ULTIPOINTM:...Pa
5b20: 72 73 65 57 6b 62 4d 75 6c 74 69 50 6f 69 6e 74  rseWkbMultiPoint
5b30: 4d 20 28 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b  M (geo);...break
5b40: 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ;..    case GAIA
5b50: 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47  _MULTILINESTRING
5b60: 4d 3a 0a 09 09 50 61 72 73 65 57 6b 62 4d 75 6c  M:...ParseWkbMul
5b70: 74 69 4c 69 6e 65 4d 20 28 67 65 6f 29 3b 0a 09  tiLineM (geo);..
5b80: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
5b90: 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59  e GAIA_MULTIPOLY
5ba0: 47 4f 4e 4d 3a 0a 09 09 50 61 72 73 65 57 6b 62  GONM:...ParseWkb
5bb0: 4d 75 6c 74 69 50 6f 6c 79 67 6f 6e 4d 20 28 67  MultiPolygonM (g
5bc0: 65 6f 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  eo);...break;.. 
5bd0: 20 20 20 63 61 73 65 20 47 41 49 41 5f 47 45 4f     case GAIA_GEO
5be0: 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 4d  METRYCOLLECTIONM
5bf0: 3a 0a 09 09 50 61 72 73 65 57 6b 62 47 65 6f 6d  :...ParseWkbGeom
5c00: 43 6f 6c 6c 4d 20 28 67 65 6f 29 3b 0a 09 09 62  CollM (geo);...b
5c10: 72 65 61 6b 3b 0a 09 20 20 20 20 7d 3b 0a 20 20  reak;..    };.  
5c20: 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20      }.}..static 
5c30: 76 6f 69 64 0a 50 61 72 73 65 57 6b 62 4d 75 6c  void.ParseWkbMul
5c40: 74 69 50 6f 69 6e 74 5a 4d 20 28 67 61 69 61 47  tiPointZM (gaiaG
5c50: 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 29 0a  eomCollPtr geo).
5c60: 7b 0a 2f 2a 20 64 65 63 6f 64 65 73 20 61 20 4d  {./* decodes a M
5c70: 55 4c 54 49 50 4f 49 4e 54 5a 4d 20 66 72 6f 6d  ULTIPOINTZM from
5c80: 20 57 4b 42 20 2a 2f 0a 20 20 20 20 69 6e 74 20   WKB */.    int 
5c90: 69 67 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 70 74  ig;.    int n_pt
5ca0: 73 3b 0a 20 20 20 20 69 6e 74 20 67 5f 74 79 70  s;.    int g_typ
5cb0: 65 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 2d 3e  e;.    if (geo->
5cc0: 73 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66 73  size < geo->offs
5cd0: 65 74 20 2b 20 34 29 0a 09 72 65 74 75 72 6e 3b  et + 4)..return;
5ce0: 0a 20 20 20 20 6e 5f 70 74 73 20 3d 0a 09 67 61  .    n_pts =..ga
5cf0: 69 61 49 6d 70 6f 72 74 33 32 20 28 67 65 6f 2d  iaImport32 (geo-
5d00: 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66  >blob + geo->off
5d10: 73 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e  set, geo->endian
5d20: 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72  , geo->endian_ar
5d30: 63 68 29 3b 0a 20 20 20 20 67 65 6f 2d 3e 6f 66  ch);.    geo->of
5d40: 66 73 65 74 20 2b 3d 20 34 3b 0a 20 20 20 20 66  fset += 4;.    f
5d50: 6f 72 20 28 69 67 20 3d 20 30 3b 20 69 67 20 3c  or (ig = 0; ig <
5d60: 20 6e 5f 70 74 73 3b 20 69 67 2b 2b 29 0a 20 20   n_pts; ig++).  
5d70: 20 20 20 20 7b 0a 09 20 20 2f 2a 20 70 61 72 73      {..  /* pars
5d80: 69 6e 67 20 61 6c 6c 20 50 6f 69 6e 74 73 20 6f  ing all Points o
5d90: 6e 65 20 62 79 20 6f 6e 65 20 2a 2f 0a 09 20 20  ne by one */..  
5da0: 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20  if (geo->size < 
5db0: 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 35 29  geo->offset + 5)
5dc0: 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ..      return;.
5dd0: 09 20 20 2f 2a 20 76 61 6e 69 6c 6c 61 20 57 4b  .  /* vanilla WK
5de0: 42 20 63 6f 75 6c 64 20 62 65 20 65 6e 63 6f 64  B could be encod
5df0: 65 64 20 61 73 20 6d 69 78 65 64 20 62 69 67 2d  ed as mixed big-
5e00: 2f 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 73  /little-endian s
5e10: 75 62 2d 69 74 65 6d 73 20 2a 2f 0a 09 20 20 69  ub-items */..  i
5e20: 66 20 28 2a 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b  f (*(geo->blob +
5e30: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 29 20 3d 3d   geo->offset) ==
5e40: 20 30 78 30 31 29 0a 09 20 20 20 20 20 20 67 65   0x01)..      ge
5e50: 6f 2d 3e 65 6e 64 69 61 6e 20 3d 20 47 41 49 41  o->endian = GAIA
5e60: 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 3b 0a  _LITTLE_ENDIAN;.
5e70: 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 67  .  else..      g
5e80: 65 6f 2d 3e 65 6e 64 69 61 6e 20 3d 20 47 41 49  eo->endian = GAI
5e90: 41 5f 42 49 47 5f 45 4e 44 49 41 4e 3b 0a 09 20  A_BIG_ENDIAN;.. 
5ea0: 20 67 5f 74 79 70 65 20 3d 0a 09 20 20 20 20 20   g_type =..     
5eb0: 20 67 61 69 61 49 6d 70 6f 72 74 33 32 20 28 67   gaiaImport32 (g
5ec0: 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e  eo->blob + geo->
5ed0: 6f 66 66 73 65 74 20 2b 20 31 2c 20 67 65 6f 2d  offset + 1, geo-
5ee0: 3e 65 6e 64 69 61 6e 2c 0a 09 09 09 20 20 20 20  >endian,....    
5ef0: 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68  geo->endian_arch
5f00: 29 3b 0a 09 20 20 67 65 6f 2d 3e 6f 66 66 73 65  );..  geo->offse
5f10: 74 20 2b 3d 20 35 3b 0a 09 20 20 69 66 20 28 67  t += 5;..  if (g
5f20: 5f 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 50 4f  _type == GAIA_PO
5f30: 49 4e 54 5a 4d 29 0a 09 20 20 20 20 20 20 50 61  INTZM)..      Pa
5f40: 72 73 65 57 6b 62 50 6f 69 6e 74 5a 4d 20 28 67  rseWkbPointZM (g
5f50: 65 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a  eo);.      }.}..
5f60: 73 74 61 74 69 63 20 76 6f 69 64 0a 50 61 72 73  static void.Pars
5f70: 65 57 6b 62 4d 75 6c 74 69 4c 69 6e 65 5a 4d 20  eWkbMultiLineZM 
5f80: 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72  (gaiaGeomCollPtr
5f90: 20 67 65 6f 29 0a 7b 0a 2f 2a 20 64 65 63 6f 64   geo).{./* decod
5fa0: 65 73 20 61 20 4d 55 4c 54 49 4c 49 4e 45 53 54  es a MULTILINEST
5fb0: 52 49 4e 47 5a 4d 20 66 72 6f 6d 20 57 4b 42 20  RINGZM from WKB 
5fc0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 67 3b 0a 20  */.    int ig;. 
5fd0: 20 20 20 69 6e 74 20 6e 5f 6c 6e 73 3b 0a 20 20     int n_lns;.  
5fe0: 20 20 69 6e 74 20 67 5f 74 79 70 65 3b 0a 20 20    int g_type;.  
5ff0: 20 20 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20    if (geo->size 
6000: 3c 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20  < geo->offset + 
6010: 34 29 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20  4)..return;.    
6020: 6e 5f 6c 6e 73 20 3d 0a 09 67 61 69 61 49 6d 70  n_lns =..gaiaImp
6030: 6f 72 74 33 32 20 28 67 65 6f 2d 3e 62 6c 6f 62  ort32 (geo->blob
6040: 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74 2c 20   + geo->offset, 
6050: 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 20 67 65 6f  geo->endian, geo
6060: 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  ->endian_arch);.
6070: 20 20 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20      geo->offset 
6080: 2b 3d 20 34 3b 0a 20 20 20 20 66 6f 72 20 28 69  += 4;.    for (i
6090: 67 20 3d 20 30 3b 20 69 67 20 3c 20 6e 5f 6c 6e  g = 0; ig < n_ln
60a0: 73 3b 20 69 67 2b 2b 29 0a 20 20 20 20 20 20 7b  s; ig++).      {
60b0: 0a 09 20 20 2f 2a 20 70 61 72 73 69 6e 67 20 61  ..  /* parsing a
60c0: 6c 6c 20 4c 69 6e 65 73 74 72 69 6e 67 73 20 6f  ll Linestrings o
60d0: 6e 65 20 62 79 20 6f 6e 65 20 2a 2f 0a 09 20 20  ne by one */..  
60e0: 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20  if (geo->size < 
60f0: 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 35 29  geo->offset + 5)
6100: 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ..      return;.
6110: 09 20 20 2f 2a 20 76 61 6e 69 6c 6c 61 20 57 4b  .  /* vanilla WK
6120: 42 20 63 6f 75 6c 64 20 62 65 20 65 6e 63 6f 64  B could be encod
6130: 65 64 20 61 73 20 6d 69 78 65 64 20 62 69 67 2d  ed as mixed big-
6140: 2f 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 73  /little-endian s
6150: 75 62 2d 69 74 65 6d 73 20 2a 2f 0a 09 20 20 69  ub-items */..  i
6160: 66 20 28 2a 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b  f (*(geo->blob +
6170: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 29 20 3d 3d   geo->offset) ==
6180: 20 30 78 30 31 29 0a 09 20 20 20 20 20 20 67 65   0x01)..      ge
6190: 6f 2d 3e 65 6e 64 69 61 6e 20 3d 20 47 41 49 41  o->endian = GAIA
61a0: 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 3b 0a  _LITTLE_ENDIAN;.
61b0: 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 67  .  else..      g
61c0: 65 6f 2d 3e 65 6e 64 69 61 6e 20 3d 20 47 41 49  eo->endian = GAI
61d0: 41 5f 42 49 47 5f 45 4e 44 49 41 4e 3b 0a 09 20  A_BIG_ENDIAN;.. 
61e0: 20 67 5f 74 79 70 65 20 3d 0a 09 20 20 20 20 20   g_type =..     
61f0: 20 67 61 69 61 49 6d 70 6f 72 74 33 32 20 28 67   gaiaImport32 (g
6200: 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e  eo->blob + geo->
6210: 6f 66 66 73 65 74 20 2b 20 31 2c 20 67 65 6f 2d  offset + 1, geo-
6220: 3e 65 6e 64 69 61 6e 2c 0a 09 09 09 20 20 20 20  >endian,....    
6230: 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68  geo->endian_arch
6240: 29 3b 0a 09 20 20 67 65 6f 2d 3e 6f 66 66 73 65  );..  geo->offse
6250: 74 20 2b 3d 20 35 3b 0a 09 20 20 69 66 20 28 67  t += 5;..  if (g
6260: 5f 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4c 49  _type == GAIA_LI
6270: 4e 45 53 54 52 49 4e 47 5a 4d 29 0a 09 20 20 20  NESTRINGZM)..   
6280: 20 20 20 50 61 72 73 65 57 6b 62 4c 69 6e 65 5a     ParseWkbLineZ
6290: 4d 20 28 67 65 6f 29 3b 0a 20 20 20 20 20 20 7d  M (geo);.      }
62a0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
62b0: 50 61 72 73 65 57 6b 62 4d 75 6c 74 69 50 6f 6c  ParseWkbMultiPol
62c0: 79 67 6f 6e 5a 4d 20 28 67 61 69 61 47 65 6f 6d  ygonZM (gaiaGeom
62d0: 43 6f 6c 6c 50 74 72 20 67 65 6f 29 0a 7b 0a 2f  CollPtr geo).{./
62e0: 2a 20 64 65 63 6f 64 65 73 20 61 20 4d 55 4c 54  * decodes a MULT
62f0: 49 50 4f 4c 59 47 4f 4e 5a 4d 20 66 72 6f 6d 20  IPOLYGONZM from 
6300: 57 4b 42 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  WKB */.    int i
6310: 67 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 70 67 73  g;.    int n_pgs
6320: 3b 0a 20 20 20 20 69 6e 74 20 67 5f 74 79 70 65  ;.    int g_type
6330: 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 2d 3e 73  ;.    if (geo->s
6340: 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66 73 65  ize < geo->offse
6350: 74 20 2b 20 34 29 0a 09 72 65 74 75 72 6e 3b 0a  t + 4)..return;.
6360: 20 20 20 20 6e 5f 70 67 73 20 3d 0a 09 67 61 69      n_pgs =..gai
6370: 61 49 6d 70 6f 72 74 33 32 20 28 67 65 6f 2d 3e  aImport32 (geo->
6380: 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73  blob + geo->offs
6390: 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c  et, geo->endian,
63a0: 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63   geo->endian_arc
63b0: 68 29 3b 0a 20 20 20 20 67 65 6f 2d 3e 6f 66 66  h);.    geo->off
63c0: 73 65 74 20 2b 3d 20 34 3b 0a 20 20 20 20 66 6f  set += 4;.    fo
63d0: 72 20 28 69 67 20 3d 20 30 3b 20 69 67 20 3c 20  r (ig = 0; ig < 
63e0: 6e 5f 70 67 73 3b 20 69 67 2b 2b 29 0a 20 20 20  n_pgs; ig++).   
63f0: 20 20 20 7b 0a 09 20 20 2f 2a 20 70 61 72 73 69     {..  /* parsi
6400: 6e 67 20 61 6c 6c 20 50 6f 6c 79 67 6f 6e 73 20  ng all Polygons 
6410: 6f 6e 65 20 62 79 20 6f 6e 65 20 2a 2f 0a 09 20  one by one */.. 
6420: 20 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c   if (geo->size <
6430: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 35   geo->offset + 5
6440: 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e 3b  )..      return;
6450: 0a 09 20 20 2f 2a 20 76 61 6e 69 6c 6c 61 20 57  ..  /* vanilla W
6460: 4b 42 20 63 6f 75 6c 64 20 62 65 20 65 6e 63 6f  KB could be enco
6470: 64 65 64 20 61 73 20 6d 69 78 65 64 20 62 69 67  ded as mixed big
6480: 2d 2f 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20  -/little-endian 
6490: 73 75 62 2d 69 74 65 6d 73 20 2a 2f 0a 09 20 20  sub-items */..  
64a0: 69 66 20 28 2a 28 67 65 6f 2d 3e 62 6c 6f 62 20  if (*(geo->blob 
64b0: 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74 29 20 3d  + geo->offset) =
64c0: 3d 20 30 78 30 31 29 0a 09 20 20 20 20 20 20 67  = 0x01)..      g
64d0: 65 6f 2d 3e 65 6e 64 69 61 6e 20 3d 20 47 41 49  eo->endian = GAI
64e0: 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 3b  A_LITTLE_ENDIAN;
64f0: 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20  ..  else..      
6500: 67 65 6f 2d 3e 65 6e 64 69 61 6e 20 3d 20 47 41  geo->endian = GA
6510: 49 41 5f 42 49 47 5f 45 4e 44 49 41 4e 3b 0a 09  IA_BIG_ENDIAN;..
6520: 20 20 67 5f 74 79 70 65 20 3d 0a 09 20 20 20 20    g_type =..    
6530: 20 20 67 61 69 61 49 6d 70 6f 72 74 33 32 20 28    gaiaImport32 (
6540: 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d  geo->blob + geo-
6550: 3e 6f 66 66 73 65 74 20 2b 20 31 2c 20 67 65 6f  >offset + 1, geo
6560: 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09 09 20 20 20  ->endian,....   
6570: 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63   geo->endian_arc
6580: 68 29 3b 0a 09 20 20 67 65 6f 2d 3e 6f 66 66 73  h);..  geo->offs
6590: 65 74 20 2b 3d 20 35 3b 0a 09 20 20 69 66 20 28  et += 5;..  if (
65a0: 67 5f 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 50  g_type == GAIA_P
65b0: 4f 4c 59 47 4f 4e 5a 4d 29 0a 09 20 20 20 20 20  OLYGONZM)..     
65c0: 20 50 61 72 73 65 57 6b 62 50 6f 6c 79 67 6f 6e   ParseWkbPolygon
65d0: 5a 4d 20 28 67 65 6f 29 3b 0a 20 20 20 20 20 20  ZM (geo);.      
65e0: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
65f0: 0a 50 61 72 73 65 57 6b 62 47 65 6f 6d 43 6f 6c  .ParseWkbGeomCol
6600: 6c 5a 4d 20 28 67 61 69 61 47 65 6f 6d 43 6f 6c  lZM (gaiaGeomCol
6610: 6c 50 74 72 20 67 65 6f 29 0a 7b 0a 2f 2a 20 64  lPtr geo).{./* d
6620: 65 63 6f 64 65 73 20 61 20 47 45 4f 4d 45 54 52  ecodes a GEOMETR
6630: 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 4d 20 66 72  YCOLLECTIONZM fr
6640: 6f 6d 20 57 4b 42 20 2a 2f 0a 20 20 20 20 69 6e  om WKB */.    in
6650: 74 20 69 67 3b 0a 20 20 20 20 69 6e 74 20 6e 5f  t ig;.    int n_
6660: 67 65 6f 6d 73 3b 0a 20 20 20 20 69 66 20 28 67  geoms;.    if (g
6670: 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65 6f 2d 3e  eo->size < geo->
6680: 6f 66 66 73 65 74 20 2b 20 34 29 0a 09 72 65 74  offset + 4)..ret
6690: 75 72 6e 3b 0a 20 20 20 20 6e 5f 67 65 6f 6d 73  urn;.    n_geoms
66a0: 20 3d 0a 09 67 61 69 61 49 6d 70 6f 72 74 33 32   =..gaiaImport32
66b0: 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65   (geo->blob + ge
66c0: 6f 2d 3e 6f 66 66 73 65 74 2c 20 67 65 6f 2d 3e  o->offset, geo->
66d0: 65 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e 65 6e 64  endian, geo->end
66e0: 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20 67  ian_arch);.    g
66f0: 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 34 3b  eo->offset += 4;
6700: 0a 20 20 20 20 66 6f 72 20 28 69 67 20 3d 20 30  .    for (ig = 0
6710: 3b 20 69 67 20 3c 20 6e 5f 67 65 6f 6d 73 3b 20  ; ig < n_geoms; 
6720: 69 67 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20  ig++).      {.. 
6730: 20 2f 2a 20 70 61 72 73 69 6e 67 20 61 6c 6c 20   /* parsing all 
6740: 47 65 6f 6d 65 74 72 69 65 73 20 6f 6e 65 20 62  Geometries one b
6750: 79 20 6f 6e 65 20 2a 2f 0a 09 20 20 69 6e 74 20  y one */..  int 
6760: 67 5f 74 79 70 65 3b 0a 09 20 20 69 66 20 28 67  g_type;..  if (g
6770: 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65 6f 2d 3e  eo->size < geo->
6780: 6f 66 66 73 65 74 20 2b 20 35 29 0a 09 20 20 20  offset + 5)..   
6790: 20 20 20 72 65 74 75 72 6e 3b 0a 09 20 20 2f 2a     return;..  /*
67a0: 20 76 61 6e 69 6c 6c 61 20 57 4b 42 20 63 6f 75   vanilla WKB cou
67b0: 6c 64 20 62 65 20 65 6e 63 6f 64 65 64 20 61 73  ld be encoded as
67c0: 20 6d 69 78 65 64 20 62 69 67 2d 2f 6c 69 74 74   mixed big-/litt
67d0: 6c 65 2d 65 6e 64 69 61 6e 20 73 75 62 2d 69 74  le-endian sub-it
67e0: 65 6d 73 20 2a 2f 0a 09 20 20 69 66 20 28 2a 28  ems */..  if (*(
67f0: 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d  geo->blob + geo-
6800: 3e 6f 66 66 73 65 74 29 20 3d 3d 20 30 78 30 31  >offset) == 0x01
6810: 29 0a 09 20 20 20 20 20 20 67 65 6f 2d 3e 65 6e  )..      geo->en
6820: 64 69 61 6e 20 3d 20 47 41 49 41 5f 4c 49 54 54  dian = GAIA_LITT
6830: 4c 45 5f 45 4e 44 49 41 4e 3b 0a 09 20 20 65 6c  LE_ENDIAN;..  el
6840: 73 65 0a 09 20 20 20 20 20 20 67 65 6f 2d 3e 65  se..      geo->e
6850: 6e 64 69 61 6e 20 3d 20 47 41 49 41 5f 42 49 47  ndian = GAIA_BIG
6860: 5f 45 4e 44 49 41 4e 3b 0a 09 20 20 67 5f 74 79  _ENDIAN;..  g_ty
6870: 70 65 20 3d 0a 09 20 20 20 20 20 20 67 61 69 61  pe =..      gaia
6880: 49 6d 70 6f 72 74 33 32 20 28 67 65 6f 2d 3e 62  Import32 (geo->b
6890: 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65  lob + geo->offse
68a0: 74 20 2b 20 31 2c 20 67 65 6f 2d 3e 65 6e 64 69  t + 1, geo->endi
68b0: 61 6e 2c 0a 09 09 09 20 20 20 20 67 65 6f 2d 3e  an,....    geo->
68c0: 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 20  endian_arch);.. 
68d0: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d 20   geo->offset += 
68e0: 35 3b 0a 09 20 20 73 77 69 74 63 68 20 28 67 5f  5;..  switch (g_
68f0: 74 79 70 65 29 0a 09 20 20 20 20 7b 0a 09 20 20  type)..    {..  
6900: 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f 49 4e    case GAIA_POIN
6910: 54 5a 4d 3a 0a 09 09 50 61 72 73 65 57 6b 62 50  TZM:...ParseWkbP
6920: 6f 69 6e 74 5a 4d 20 28 67 65 6f 29 3b 0a 09 09  ointZM (geo);...
6930: 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65  break;..    case
6940: 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47   GAIA_LINESTRING
6950: 5a 4d 3a 0a 09 09 50 61 72 73 65 57 6b 62 4c 69  ZM:...ParseWkbLi
6960: 6e 65 5a 4d 20 28 67 65 6f 29 3b 0a 09 09 62 72  neZM (geo);...br
6970: 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47  eak;..    case G
6980: 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 4d 3a 0a 09  AIA_POLYGONZM:..
6990: 09 50 61 72 73 65 57 6b 62 50 6f 6c 79 67 6f 6e  .ParseWkbPolygon
69a0: 5a 4d 20 28 67 65 6f 29 3b 0a 09 09 62 72 65 61  ZM (geo);...brea
69b0: 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49  k;..    case GAI
69c0: 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a 4d 3a 0a  A_MULTIPOINTZM:.
69d0: 09 09 50 61 72 73 65 57 6b 62 4d 75 6c 74 69 50  ..ParseWkbMultiP
69e0: 6f 69 6e 74 5a 4d 20 28 67 65 6f 29 3b 0a 09 09  ointZM (geo);...
69f0: 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65  break;..    case
6a00: 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53   GAIA_MULTILINES
6a10: 54 52 49 4e 47 5a 4d 3a 0a 09 09 50 61 72 73 65  TRINGZM:...Parse
6a20: 57 6b 62 4d 75 6c 74 69 4c 69 6e 65 5a 4d 20 28  WkbMultiLineZM (
6a30: 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09  geo);...break;..
6a40: 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55      case GAIA_MU
6a50: 4c 54 49 50 4f 4c 59 47 4f 4e 5a 4d 3a 0a 09 09  LTIPOLYGONZM:...
6a60: 50 61 72 73 65 57 6b 62 4d 75 6c 74 69 50 6f 6c  ParseWkbMultiPol
6a70: 79 67 6f 6e 5a 4d 20 28 67 65 6f 29 3b 0a 09 09  ygonZM (geo);...
6a80: 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65  break;..    case
6a90: 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f   GAIA_GEOMETRYCO
6aa0: 4c 4c 45 43 54 49 4f 4e 5a 4d 3a 0a 09 09 50 61  LLECTIONZM:...Pa
6ab0: 72 73 65 57 6b 62 47 65 6f 6d 43 6f 6c 6c 5a 4d  rseWkbGeomCollZM
6ac0: 20 28 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b 3b   (geo);...break;
6ad0: 0a 09 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 7d  ..    };.      }
6ae0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
6af0: 50 61 72 73 65 43 6f 6d 70 72 65 73 73 65 64 57  ParseCompressedW
6b00: 6b 62 4c 69 6e 65 20 28 67 61 69 61 47 65 6f 6d  kbLine (gaiaGeom
6b10: 43 6f 6c 6c 50 74 72 20 67 65 6f 29 0a 7b 0a 2f  CollPtr geo).{./
6b20: 2a 20 64 65 63 6f 64 65 73 20 61 20 43 4f 4d 50  * decodes a COMP
6b30: 52 45 53 53 45 44 20 4c 49 4e 45 53 54 52 49 4e  RESSED LINESTRIN
6b40: 47 20 66 72 6f 6d 20 57 4b 42 20 2a 2f 0a 20 20  G from WKB */.  
6b50: 20 20 69 6e 74 20 70 6f 69 6e 74 73 3b 0a 20 20    int points;.  
6b60: 20 20 69 6e 74 20 69 76 3b 0a 20 20 20 20 64 6f    int iv;.    do
6b70: 75 62 6c 65 20 78 3b 0a 20 20 20 20 64 6f 75 62  uble x;.    doub
6b80: 6c 65 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65  le y;.    double
6b90: 20 6c 61 73 74 5f 78 20 3d 20 30 2e 30 3b 0a 20   last_x = 0.0;. 
6ba0: 20 20 20 64 6f 75 62 6c 65 20 6c 61 73 74 5f 79     double last_y
6bb0: 20 3d 20 30 2e 30 3b 0a 20 20 20 20 66 6c 6f 61   = 0.0;.    floa
6bc0: 74 20 66 78 3b 0a 20 20 20 20 66 6c 6f 61 74 20  t fx;.    float 
6bd0: 66 79 3b 0a 20 20 20 20 67 61 69 61 4c 69 6e 65  fy;.    gaiaLine
6be0: 73 74 72 69 6e 67 50 74 72 20 6c 69 6e 65 3b 0a  stringPtr line;.
6bf0: 20 20 20 20 69 66 20 28 67 65 6f 2d 3e 73 69 7a      if (geo->siz
6c00: 65 20 3c 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20  e < geo->offset 
6c10: 2b 20 34 29 0a 09 72 65 74 75 72 6e 3b 0a 20 20  + 4)..return;.  
6c20: 20 20 70 6f 69 6e 74 73 20 3d 0a 09 67 61 69 61    points =..gaia
6c30: 49 6d 70 6f 72 74 33 32 20 28 67 65 6f 2d 3e 62  Import32 (geo->b
6c40: 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65  lob + geo->offse
6c50: 74 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 20  t, geo->endian, 
6c60: 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68  geo->endian_arch
6c70: 29 3b 0a 20 20 20 20 67 65 6f 2d 3e 6f 66 66 73  );.    geo->offs
6c80: 65 74 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 20  et += 4;.    if 
6c90: 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65 6f  (geo->size < geo
6ca0: 2d 3e 6f 66 66 73 65 74 20 2b 20 28 38 20 2a 20  ->offset + (8 * 
6cb0: 70 6f 69 6e 74 73 29 20 2b 20 31 36 29 0a 09 72  points) + 16)..r
6cc0: 65 74 75 72 6e 3b 0a 20 20 20 20 6c 69 6e 65 20  eturn;.    line 
6cd0: 3d 20 67 61 69 61 41 64 64 4c 69 6e 65 73 74 72  = gaiaAddLinestr
6ce0: 69 6e 67 54 6f 47 65 6f 6d 43 6f 6c 6c 20 28 67  ingToGeomColl (g
6cf0: 65 6f 2c 20 70 6f 69 6e 74 73 29 3b 0a 20 20 20  eo, points);.   
6d00: 20 66 6f 72 20 28 69 76 20 3d 20 30 3b 20 69 76   for (iv = 0; iv
6d10: 20 3c 20 70 6f 69 6e 74 73 3b 20 69 76 2b 2b 29   < points; iv++)
6d20: 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
6d30: 69 76 20 3d 3d 20 30 20 7c 7c 20 69 76 20 3d 3d  iv == 0 || iv ==
6d40: 20 28 70 6f 69 6e 74 73 20 2d 20 31 29 29 0a 09   (points - 1))..
6d50: 20 20 20 20 7b 0a 09 09 2f 2a 20 66 69 72 73 74      {.../* first
6d60: 20 61 6e 64 20 6c 61 73 74 20 76 65 72 74 69 63   and last vertic
6d70: 65 73 20 61 72 65 20 75 6e 63 6f 6d 70 72 65 73  es are uncompres
6d80: 73 65 64 20 2a 2f 0a 09 09 78 20 3d 20 67 61 69  sed */...x = gai
6d90: 61 49 6d 70 6f 72 74 36 34 20 28 67 65 6f 2d 3e  aImport64 (geo->
6da0: 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73  blob + geo->offs
6db0: 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c  et, geo->endian,
6dc0: 0a 09 09 09 09 20 20 67 65 6f 2d 3e 65 6e 64 69  .....  geo->endi
6dd0: 61 6e 5f 61 72 63 68 29 3b 0a 09 09 79 20 3d 20  an_arch);...y = 
6de0: 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28 67 65  gaiaImport64 (ge
6df0: 6f 2d 3e 62 6c 6f 62 20 2b 20 28 67 65 6f 2d 3e  o->blob + (geo->
6e00: 6f 66 66 73 65 74 20 2b 20 38 29 2c 20 67 65 6f  offset + 8), geo
6e10: 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09 09 09 20 20  ->endian,.....  
6e20: 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68  geo->endian_arch
6e30: 29 3b 0a 09 09 67 65 6f 2d 3e 6f 66 66 73 65 74  );...geo->offset
6e40: 20 2b 3d 20 31 36 3b 0a 09 20 20 20 20 7d 0a 09   += 16;..    }..
6e50: 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09    else..    {...
6e60: 2f 2a 20 61 6e 79 20 6f 74 68 65 72 20 69 6e 74  /* any other int
6e70: 65 72 6d 65 64 69 61 74 65 20 76 65 72 74 65 78  ermediate vertex
6e80: 20 69 73 20 63 6f 6d 70 72 65 73 73 65 64 20 2a   is compressed *
6e90: 2f 0a 09 09 66 78 20 3d 20 67 61 69 61 49 6d 70  /...fx = gaiaImp
6ea0: 6f 72 74 46 33 32 20 28 67 65 6f 2d 3e 62 6c 6f  ortF32 (geo->blo
6eb0: 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74 2c  b + geo->offset,
6ec0: 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09   geo->endian,...
6ed0: 09 09 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69 61  ..    geo->endia
6ee0: 6e 5f 61 72 63 68 29 3b 0a 09 09 66 79 20 3d 20  n_arch);...fy = 
6ef0: 67 61 69 61 49 6d 70 6f 72 74 46 33 32 20 28 67  gaiaImportF32 (g
6f00: 65 6f 2d 3e 62 6c 6f 62 20 2b 20 28 67 65 6f 2d  eo->blob + (geo-
6f10: 3e 6f 66 66 73 65 74 20 2b 20 34 29 2c 20 67 65  >offset + 4), ge
6f20: 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09 09 09 20  o->endian,..... 
6f30: 20 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61     geo->endian_a
6f40: 72 63 68 29 3b 0a 09 09 78 20 3d 20 6c 61 73 74  rch);...x = last
6f50: 5f 78 20 2b 20 66 78 3b 0a 09 09 79 20 3d 20 6c  _x + fx;...y = l
6f60: 61 73 74 5f 79 20 2b 20 66 79 3b 0a 09 09 67 65  ast_y + fy;...ge
6f70: 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 38 3b 0a  o->offset += 8;.
6f80: 09 20 20 20 20 7d 0a 09 20 20 67 61 69 61 53 65  .    }..  gaiaSe
6f90: 74 50 6f 69 6e 74 20 28 6c 69 6e 65 2d 3e 43 6f  tPoint (line->Co
6fa0: 6f 72 64 73 2c 20 69 76 2c 20 78 2c 20 79 29 3b  ords, iv, x, y);
6fb0: 0a 09 20 20 6c 61 73 74 5f 78 20 3d 20 78 3b 0a  ..  last_x = x;.
6fc0: 09 20 20 6c 61 73 74 5f 79 20 3d 20 79 3b 0a 20  .  last_y = y;. 
6fd0: 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63       }.}..static
6fe0: 20 76 6f 69 64 0a 50 61 72 73 65 43 6f 6d 70 72   void.ParseCompr
6ff0: 65 73 73 65 64 57 6b 62 4c 69 6e 65 5a 20 28 67  essedWkbLineZ (g
7000: 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
7010: 65 6f 29 0a 7b 0a 2f 2a 20 64 65 63 6f 64 65 73  eo).{./* decodes
7020: 20 61 20 43 4f 4d 50 52 45 53 53 45 44 20 4c 49   a COMPRESSED LI
7030: 4e 45 53 54 52 49 4e 47 5a 20 66 72 6f 6d 20 57  NESTRINGZ from W
7040: 4b 42 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 6f  KB */.    int po
7050: 69 6e 74 73 3b 0a 20 20 20 20 69 6e 74 20 69 76  ints;.    int iv
7060: 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a  ;.    double x;.
7070: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
7080: 20 20 64 6f 75 62 6c 65 20 7a 3b 0a 20 20 20 20    double z;.    
7090: 64 6f 75 62 6c 65 20 6c 61 73 74 5f 78 20 3d 20  double last_x = 
70a0: 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  0.0;.    double 
70b0: 6c 61 73 74 5f 79 20 3d 20 30 2e 30 3b 0a 20 20  last_y = 0.0;.  
70c0: 20 20 64 6f 75 62 6c 65 20 6c 61 73 74 5f 7a 20    double last_z 
70d0: 3d 20 30 2e 30 3b 0a 20 20 20 20 66 6c 6f 61 74  = 0.0;.    float
70e0: 20 66 78 3b 0a 20 20 20 20 66 6c 6f 61 74 20 66   fx;.    float f
70f0: 79 3b 0a 20 20 20 20 66 6c 6f 61 74 20 66 7a 3b  y;.    float fz;
7100: 0a 20 20 20 20 67 61 69 61 4c 69 6e 65 73 74 72  .    gaiaLinestr
7110: 69 6e 67 50 74 72 20 6c 69 6e 65 3b 0a 20 20 20  ingPtr line;.   
7120: 20 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c   if (geo->size <
7130: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 34   geo->offset + 4
7140: 29 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 70  )..return;.    p
7150: 6f 69 6e 74 73 20 3d 0a 09 67 61 69 61 49 6d 70  oints =..gaiaImp
7160: 6f 72 74 33 32 20 28 67 65 6f 2d 3e 62 6c 6f 62  ort32 (geo->blob
7170: 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74 2c 20   + geo->offset, 
7180: 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 20 67 65 6f  geo->endian, geo
7190: 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  ->endian_arch);.
71a0: 20 20 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20      geo->offset 
71b0: 2b 3d 20 34 3b 0a 20 20 20 20 69 66 20 28 67 65  += 4;.    if (ge
71c0: 6f 2d 3e 73 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f  o->size < geo->o
71d0: 66 66 73 65 74 20 2b 20 28 31 32 20 2a 20 70 6f  ffset + (12 * po
71e0: 69 6e 74 73 29 20 2b 20 32 34 29 0a 09 72 65 74  ints) + 24)..ret
71f0: 75 72 6e 3b 0a 20 20 20 20 6c 69 6e 65 20 3d 20  urn;.    line = 
7200: 67 61 69 61 41 64 64 4c 69 6e 65 73 74 72 69 6e  gaiaAddLinestrin
7210: 67 54 6f 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  gToGeomColl (geo
7220: 2c 20 70 6f 69 6e 74 73 29 3b 0a 20 20 20 20 66  , points);.    f
7230: 6f 72 20 28 69 76 20 3d 20 30 3b 20 69 76 20 3c  or (iv = 0; iv <
7240: 20 70 6f 69 6e 74 73 3b 20 69 76 2b 2b 29 0a 20   points; iv++). 
7250: 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 69 76       {..  if (iv
7260: 20 3d 3d 20 30 20 7c 7c 20 69 76 20 3d 3d 20 28   == 0 || iv == (
7270: 70 6f 69 6e 74 73 20 2d 20 31 29 29 0a 09 20 20  points - 1))..  
7280: 20 20 7b 0a 09 09 2f 2a 20 66 69 72 73 74 20 61    {.../* first a
7290: 6e 64 20 6c 61 73 74 20 76 65 72 74 69 63 65 73  nd last vertices
72a0: 20 61 72 65 20 75 6e 63 6f 6d 70 72 65 73 73 65   are uncompresse
72b0: 64 20 2a 2f 0a 09 09 78 20 3d 20 67 61 69 61 49  d */...x = gaiaI
72c0: 6d 70 6f 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c  mport64 (geo->bl
72d0: 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74  ob + geo->offset
72e0: 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09  , geo->endian,..
72f0: 09 09 09 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e  ...  geo->endian
7300: 5f 61 72 63 68 29 3b 0a 09 09 79 20 3d 20 67 61  _arch);...y = ga
7310: 69 61 49 6d 70 6f 72 74 36 34 20 28 67 65 6f 2d  iaImport64 (geo-
7320: 3e 62 6c 6f 62 20 2b 20 28 67 65 6f 2d 3e 6f 66  >blob + (geo->of
7330: 66 73 65 74 20 2b 20 38 29 2c 20 67 65 6f 2d 3e  fset + 8), geo->
7340: 65 6e 64 69 61 6e 2c 0a 09 09 09 09 20 20 67 65  endian,.....  ge
7350: 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  o->endian_arch);
7360: 0a 09 09 7a 20 3d 20 67 61 69 61 49 6d 70 6f 72  ...z = gaiaImpor
7370: 74 36 34 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b  t64 (geo->blob +
7380: 20 28 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20   (geo->offset + 
7390: 31 36 29 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e  16), geo->endian
73a0: 2c 0a 09 09 09 09 20 20 67 65 6f 2d 3e 65 6e 64  ,.....  geo->end
73b0: 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 67 65 6f  ian_arch);...geo
73c0: 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 32 34 3b 0a  ->offset += 24;.
73d0: 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09  .    }..  else..
73e0: 20 20 20 20 7b 0a 09 09 2f 2a 20 61 6e 79 20 6f      {.../* any o
73f0: 74 68 65 72 20 69 6e 74 65 72 6d 65 64 69 61 74  ther intermediat
7400: 65 20 76 65 72 74 65 78 20 69 73 20 63 6f 6d 70  e vertex is comp
7410: 72 65 73 73 65 64 20 2a 2f 0a 09 09 66 78 20 3d  ressed */...fx =
7420: 20 67 61 69 61 49 6d 70 6f 72 74 46 33 32 20 28   gaiaImportF32 (
7430: 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d  geo->blob + geo-
7440: 3e 6f 66 66 73 65 74 2c 20 67 65 6f 2d 3e 65 6e  >offset, geo->en
7450: 64 69 61 6e 2c 0a 09 09 09 09 20 20 20 20 67 65  dian,.....    ge
7460: 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  o->endian_arch);
7470: 0a 09 09 66 79 20 3d 20 67 61 69 61 49 6d 70 6f  ...fy = gaiaImpo
7480: 72 74 46 33 32 20 28 67 65 6f 2d 3e 62 6c 6f 62  rtF32 (geo->blob
7490: 20 2b 20 28 67 65 6f 2d 3e 6f 66 66 73 65 74 20   + (geo->offset 
74a0: 2b 20 34 29 2c 20 67 65 6f 2d 3e 65 6e 64 69 61  + 4), geo->endia
74b0: 6e 2c 0a 09 09 09 09 20 20 20 20 67 65 6f 2d 3e  n,.....    geo->
74c0: 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09  endian_arch);...
74d0: 66 7a 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 46  fz = gaiaImportF
74e0: 33 32 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20  32 (geo->blob + 
74f0: 28 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 38  (geo->offset + 8
7500: 29 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a  ), geo->endian,.
7510: 09 09 09 09 20 20 20 20 67 65 6f 2d 3e 65 6e 64  ....    geo->end
7520: 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 78 20 3d  ian_arch);...x =
7530: 20 6c 61 73 74 5f 78 20 2b 20 66 78 3b 0a 09 09   last_x + fx;...
7540: 79 20 3d 20 6c 61 73 74 5f 79 20 2b 20 66 79 3b  y = last_y + fy;
7550: 0a 09 09 7a 20 3d 20 6c 61 73 74 5f 7a 20 2b 20  ...z = last_z + 
7560: 66 7a 3b 0a 09 09 67 65 6f 2d 3e 6f 66 66 73 65  fz;...geo->offse
7570: 74 20 2b 3d 20 31 32 3b 0a 09 20 20 20 20 7d 0a  t += 12;..    }.
7580: 09 20 20 67 61 69 61 53 65 74 50 6f 69 6e 74 58  .  gaiaSetPointX
7590: 59 5a 20 28 6c 69 6e 65 2d 3e 43 6f 6f 72 64 73  YZ (line->Coords
75a0: 2c 20 69 76 2c 20 78 2c 20 79 2c 20 7a 29 3b 0a  , iv, x, y, z);.
75b0: 09 20 20 6c 61 73 74 5f 78 20 3d 20 78 3b 0a 09  .  last_x = x;..
75c0: 20 20 6c 61 73 74 5f 79 20 3d 20 79 3b 0a 09 20    last_y = y;.. 
75d0: 20 6c 61 73 74 5f 7a 20 3d 20 7a 3b 0a 20 20 20   last_z = z;.   
75e0: 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76     }.}..static v
75f0: 6f 69 64 0a 50 61 72 73 65 43 6f 6d 70 72 65 73  oid.ParseCompres
7600: 73 65 64 57 6b 62 4c 69 6e 65 4d 20 28 67 61 69  sedWkbLineM (gai
7610: 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
7620: 29 0a 7b 0a 2f 2a 20 64 65 63 6f 64 65 73 20 61  ).{./* decodes a
7630: 20 43 4f 4d 50 52 45 53 53 45 44 20 4c 49 4e 45   COMPRESSED LINE
7640: 53 54 52 49 4e 47 4d 20 66 72 6f 6d 20 57 4b 42  STRINGM from WKB
7650: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 6f 69 6e   */.    int poin
7660: 74 73 3b 0a 20 20 20 20 69 6e 74 20 69 76 3b 0a  ts;.    int iv;.
7670: 20 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20      double x;.  
7680: 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20    double y;.    
7690: 64 6f 75 62 6c 65 20 6d 3b 0a 20 20 20 20 64 6f  double m;.    do
76a0: 75 62 6c 65 20 6c 61 73 74 5f 78 20 3d 20 30 2e  uble last_x = 0.
76b0: 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 61  0;.    double la
76c0: 73 74 5f 79 20 3d 20 30 2e 30 3b 0a 20 20 20 20  st_y = 0.0;.    
76d0: 66 6c 6f 61 74 20 66 78 3b 0a 20 20 20 20 66 6c  float fx;.    fl
76e0: 6f 61 74 20 66 79 3b 0a 20 20 20 20 67 61 69 61  oat fy;.    gaia
76f0: 4c 69 6e 65 73 74 72 69 6e 67 50 74 72 20 6c 69  LinestringPtr li
7700: 6e 65 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 2d  ne;.    if (geo-
7710: 3e 73 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66  >size < geo->off
7720: 73 65 74 20 2b 20 34 29 0a 09 72 65 74 75 72 6e  set + 4)..return
7730: 3b 0a 20 20 20 20 70 6f 69 6e 74 73 20 3d 0a 09  ;.    points =..
7740: 67 61 69 61 49 6d 70 6f 72 74 33 32 20 28 67 65  gaiaImport32 (ge
7750: 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f  o->blob + geo->o
7760: 66 66 73 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69  ffset, geo->endi
7770: 61 6e 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f  an, geo->endian_
7780: 61 72 63 68 29 3b 0a 20 20 20 20 67 65 6f 2d 3e  arch);.    geo->
7790: 6f 66 66 73 65 74 20 2b 3d 20 34 3b 0a 20 20 20  offset += 4;.   
77a0: 20 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c   if (geo->size <
77b0: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 28   geo->offset + (
77c0: 31 36 20 2a 20 70 6f 69 6e 74 73 29 20 2b 20 31  16 * points) + 1
77d0: 36 29 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20  6)..return;.    
77e0: 6c 69 6e 65 20 3d 20 67 61 69 61 41 64 64 4c 69  line = gaiaAddLi
77f0: 6e 65 73 74 72 69 6e 67 54 6f 47 65 6f 6d 43 6f  nestringToGeomCo
7800: 6c 6c 20 28 67 65 6f 2c 20 70 6f 69 6e 74 73 29  ll (geo, points)
7810: 3b 0a 20 20 20 20 66 6f 72 20 28 69 76 20 3d 20  ;.    for (iv = 
7820: 30 3b 20 69 76 20 3c 20 70 6f 69 6e 74 73 3b 20  0; iv < points; 
7830: 69 76 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20  iv++).      {.. 
7840: 20 69 66 20 28 69 76 20 3d 3d 20 30 20 7c 7c 20   if (iv == 0 || 
7850: 69 76 20 3d 3d 20 28 70 6f 69 6e 74 73 20 2d 20  iv == (points - 
7860: 31 29 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20  1))..    {.../* 
7870: 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 76  first and last v
7880: 65 72 74 69 63 65 73 20 61 72 65 20 75 6e 63 6f  ertices are unco
7890: 6d 70 72 65 73 73 65 64 20 2a 2f 0a 09 09 78 20  mpressed */...x 
78a0: 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28  = gaiaImport64 (
78b0: 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d  geo->blob + geo-
78c0: 3e 6f 66 66 73 65 74 2c 20 67 65 6f 2d 3e 65 6e  >offset, geo->en
78d0: 64 69 61 6e 2c 0a 09 09 09 09 20 20 67 65 6f 2d  dian,.....  geo-
78e0: 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09  >endian_arch);..
78f0: 09 79 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36  .y = gaiaImport6
7900: 34 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 28  4 (geo->blob + (
7910: 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 38 29  geo->offset + 8)
7920: 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09  , geo->endian,..
7930: 09 09 09 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e  ...  geo->endian
7940: 5f 61 72 63 68 29 3b 0a 09 09 6d 20 3d 20 67 61  _arch);...m = ga
7950: 69 61 49 6d 70 6f 72 74 36 34 20 28 67 65 6f 2d  iaImport64 (geo-
7960: 3e 62 6c 6f 62 20 2b 20 28 67 65 6f 2d 3e 6f 66  >blob + (geo->of
7970: 66 73 65 74 20 2b 20 31 36 29 2c 20 67 65 6f 2d  fset + 16), geo-
7980: 3e 65 6e 64 69 61 6e 2c 0a 09 09 09 09 20 20 67  >endian,.....  g
7990: 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29  eo->endian_arch)
79a0: 3b 0a 09 09 67 65 6f 2d 3e 6f 66 66 73 65 74 20  ;...geo->offset 
79b0: 2b 3d 20 32 34 3b 0a 09 20 20 20 20 7d 0a 09 20  += 24;..    }.. 
79c0: 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 2f   else..    {.../
79d0: 2a 20 61 6e 79 20 6f 74 68 65 72 20 69 6e 74 65  * any other inte
79e0: 72 6d 65 64 69 61 74 65 20 76 65 72 74 65 78 20  rmediate vertex 
79f0: 69 73 20 63 6f 6d 70 72 65 73 73 65 64 20 2a 2f  is compressed */
7a00: 0a 09 09 66 78 20 3d 20 67 61 69 61 49 6d 70 6f  ...fx = gaiaImpo
7a10: 72 74 46 33 32 20 28 67 65 6f 2d 3e 62 6c 6f 62  rtF32 (geo->blob
7a20: 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74 2c 20   + geo->offset, 
7a30: 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09 09  geo->endian,....
7a40: 09 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e  .    geo->endian
7a50: 5f 61 72 63 68 29 3b 0a 09 09 66 79 20 3d 20 67  _arch);...fy = g
7a60: 61 69 61 49 6d 70 6f 72 74 46 33 32 20 28 67 65  aiaImportF32 (ge
7a70: 6f 2d 3e 62 6c 6f 62 20 2b 20 28 67 65 6f 2d 3e  o->blob + (geo->
7a80: 6f 66 66 73 65 74 20 2b 20 34 29 2c 20 67 65 6f  offset + 4), geo
7a90: 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09 09 09 20 20  ->endian,.....  
7aa0: 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72    geo->endian_ar
7ab0: 63 68 29 3b 0a 09 09 6d 20 3d 20 67 61 69 61 49  ch);...m = gaiaI
7ac0: 6d 70 6f 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c  mport64 (geo->bl
7ad0: 6f 62 20 2b 20 28 67 65 6f 2d 3e 6f 66 66 73 65  ob + (geo->offse
7ae0: 74 20 2b 20 38 29 2c 20 67 65 6f 2d 3e 65 6e 64  t + 8), geo->end
7af0: 69 61 6e 2c 0a 09 09 09 09 20 20 67 65 6f 2d 3e  ian,.....  geo->
7b00: 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09  endian_arch);...
7b10: 78 20 3d 20 6c 61 73 74 5f 78 20 2b 20 66 78 3b  x = last_x + fx;
7b20: 0a 09 09 79 20 3d 20 6c 61 73 74 5f 79 20 2b 20  ...y = last_y + 
7b30: 66 79 3b 0a 09 09 67 65 6f 2d 3e 6f 66 66 73 65  fy;...geo->offse
7b40: 74 20 2b 3d 20 31 36 3b 0a 09 20 20 20 20 7d 0a  t += 16;..    }.
7b50: 09 20 20 67 61 69 61 53 65 74 50 6f 69 6e 74 58  .  gaiaSetPointX
7b60: 59 4d 20 28 6c 69 6e 65 2d 3e 43 6f 6f 72 64 73  YM (line->Coords
7b70: 2c 20 69 76 2c 20 78 2c 20 79 2c 20 6d 29 3b 0a  , iv, x, y, m);.
7b80: 09 20 20 6c 61 73 74 5f 78 20 3d 20 78 3b 0a 09  .  last_x = x;..
7b90: 20 20 6c 61 73 74 5f 79 20 3d 20 79 3b 0a 20 20    last_y = y;.  
7ba0: 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20      }.}..static 
7bb0: 76 6f 69 64 0a 50 61 72 73 65 43 6f 6d 70 72 65  void.ParseCompre
7bc0: 73 73 65 64 57 6b 62 4c 69 6e 65 5a 4d 20 28 67  ssedWkbLineZM (g
7bd0: 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
7be0: 65 6f 29 0a 7b 0a 2f 2a 20 64 65 63 6f 64 65 73  eo).{./* decodes
7bf0: 20 61 20 43 4f 4d 50 52 45 53 53 45 44 20 4c 49   a COMPRESSED LI
7c00: 4e 45 53 54 52 49 4e 47 5a 4d 20 66 72 6f 6d 20  NESTRINGZM from 
7c10: 57 4b 42 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70  WKB */.    int p
7c20: 6f 69 6e 74 73 3b 0a 20 20 20 20 69 6e 74 20 69  oints;.    int i
7c30: 76 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 3b  v;.    double x;
7c40: 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20  .    double y;. 
7c50: 20 20 20 64 6f 75 62 6c 65 20 7a 3b 0a 20 20 20     double z;.   
7c60: 20 64 6f 75 62 6c 65 20 6d 3b 0a 20 20 20 20 64   double m;.    d
7c70: 6f 75 62 6c 65 20 6c 61 73 74 5f 78 20 3d 20 30  ouble last_x = 0
7c80: 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c  .0;.    double l
7c90: 61 73 74 5f 79 20 3d 20 30 2e 30 3b 0a 20 20 20  ast_y = 0.0;.   
7ca0: 20 64 6f 75 62 6c 65 20 6c 61 73 74 5f 7a 20 3d   double last_z =
7cb0: 20 30 2e 30 3b 0a 20 20 20 20 66 6c 6f 61 74 20   0.0;.    float 
7cc0: 66 78 3b 0a 20 20 20 20 66 6c 6f 61 74 20 66 79  fx;.    float fy
7cd0: 3b 0a 20 20 20 20 66 6c 6f 61 74 20 66 7a 3b 0a  ;.    float fz;.
7ce0: 20 20 20 20 67 61 69 61 4c 69 6e 65 73 74 72 69      gaiaLinestri
7cf0: 6e 67 50 74 72 20 6c 69 6e 65 3b 0a 20 20 20 20  ngPtr line;.    
7d00: 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20  if (geo->size < 
7d10: 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 34 29  geo->offset + 4)
7d20: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 6f  ..return;.    po
7d30: 69 6e 74 73 20 3d 0a 09 67 61 69 61 49 6d 70 6f  ints =..gaiaImpo
7d40: 72 74 33 32 20 28 67 65 6f 2d 3e 62 6c 6f 62 20  rt32 (geo->blob 
7d50: 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74 2c 20 67  + geo->offset, g
7d60: 65 6f 2d 3e 65 6e 64 69 61 6e 2c 20 67 65 6f 2d  eo->endian, geo-
7d70: 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20  >endian_arch);. 
7d80: 20 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b     geo->offset +
7d90: 3d 20 34 3b 0a 20 20 20 20 69 66 20 28 67 65 6f  = 4;.    if (geo
7da0: 2d 3e 73 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66  ->size < geo->of
7db0: 66 73 65 74 20 2b 20 28 32 30 20 2a 20 70 6f 69  fset + (20 * poi
7dc0: 6e 74 73 29 20 2b 20 32 34 29 0a 09 72 65 74 75  nts) + 24)..retu
7dd0: 72 6e 3b 0a 20 20 20 20 6c 69 6e 65 20 3d 20 67  rn;.    line = g
7de0: 61 69 61 41 64 64 4c 69 6e 65 73 74 72 69 6e 67  aiaAddLinestring
7df0: 54 6f 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 2c  ToGeomColl (geo,
7e00: 20 70 6f 69 6e 74 73 29 3b 0a 20 20 20 20 66 6f   points);.    fo
7e10: 72 20 28 69 76 20 3d 20 30 3b 20 69 76 20 3c 20  r (iv = 0; iv < 
7e20: 70 6f 69 6e 74 73 3b 20 69 76 2b 2b 29 0a 20 20  points; iv++).  
7e30: 20 20 20 20 7b 0a 09 20 20 69 66 20 28 69 76 20      {..  if (iv 
7e40: 3d 3d 20 30 20 7c 7c 20 69 76 20 3d 3d 20 28 70  == 0 || iv == (p
7e50: 6f 69 6e 74 73 20 2d 20 31 29 29 0a 09 20 20 20  oints - 1))..   
7e60: 20 7b 0a 09 09 2f 2a 20 66 69 72 73 74 20 61 6e   {.../* first an
7e70: 64 20 6c 61 73 74 20 76 65 72 74 69 63 65 73 20  d last vertices 
7e80: 61 72 65 20 75 6e 63 6f 6d 70 72 65 73 73 65 64  are uncompressed
7e90: 20 2a 2f 0a 09 09 78 20 3d 20 67 61 69 61 49 6d   */...x = gaiaIm
7ea0: 70 6f 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c 6f  port64 (geo->blo
7eb0: 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74 2c  b + geo->offset,
7ec0: 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09   geo->endian,...
7ed0: 09 09 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f  ..  geo->endian_
7ee0: 61 72 63 68 29 3b 0a 09 09 79 20 3d 20 67 61 69  arch);...y = gai
7ef0: 61 49 6d 70 6f 72 74 36 34 20 28 67 65 6f 2d 3e  aImport64 (geo->
7f00: 62 6c 6f 62 20 2b 20 28 67 65 6f 2d 3e 6f 66 66  blob + (geo->off
7f10: 73 65 74 20 2b 20 38 29 2c 20 67 65 6f 2d 3e 65  set + 8), geo->e
7f20: 6e 64 69 61 6e 2c 0a 09 09 09 09 20 20 67 65 6f  ndian,.....  geo
7f30: 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  ->endian_arch);.
7f40: 09 09 7a 20 3d 20 67 61 69 61 49 6d 70 6f 72 74  ..z = gaiaImport
7f50: 36 34 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20  64 (geo->blob + 
7f60: 28 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 31  (geo->offset + 1
7f70: 36 29 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c  6), geo->endian,
7f80: 0a 09 09 09 09 20 20 67 65 6f 2d 3e 65 6e 64 69  .....  geo->endi
7f90: 61 6e 5f 61 72 63 68 29 3b 0a 09 09 6d 20 3d 20  an_arch);...m = 
7fa0: 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28 67 65  gaiaImport64 (ge
7fb0: 6f 2d 3e 62 6c 6f 62 20 2b 20 28 67 65 6f 2d 3e  o->blob + (geo->
7fc0: 6f 66 66 73 65 74 20 2b 20 32 34 29 2c 20 67 65  offset + 24), ge
7fd0: 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09 09 09 20  o->endian,..... 
7fe0: 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63   geo->endian_arc
7ff0: 68 29 3b 0a 09 09 67 65 6f 2d 3e 6f 66 66 73 65  h);...geo->offse
8000: 74 20 2b 3d 20 33 32 3b 0a 09 20 20 20 20 7d 0a  t += 32;..    }.
8010: 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09  .  else..    {..
8020: 09 2f 2a 20 61 6e 79 20 6f 74 68 65 72 20 69 6e  ./* any other in
8030: 74 65 72 6d 65 64 69 61 74 65 20 76 65 72 74 65  termediate verte
8040: 78 20 69 73 20 63 6f 6d 70 72 65 73 73 65 64 20  x is compressed 
8050: 2a 2f 0a 09 09 66 78 20 3d 20 67 61 69 61 49 6d  */...fx = gaiaIm
8060: 70 6f 72 74 46 33 32 20 28 67 65 6f 2d 3e 62 6c  portF32 (geo->bl
8070: 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74  ob + geo->offset
8080: 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09  , geo->endian,..
8090: 09 09 09 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69  ...    geo->endi
80a0: 61 6e 5f 61 72 63 68 29 3b 0a 09 09 66 79 20 3d  an_arch);...fy =
80b0: 20 67 61 69 61 49 6d 70 6f 72 74 46 33 32 20 28   gaiaImportF32 (
80c0: 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 28 67 65 6f  geo->blob + (geo
80d0: 2d 3e 6f 66 66 73 65 74 20 2b 20 34 29 2c 20 67  ->offset + 4), g
80e0: 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09 09 09  eo->endian,.....
80f0: 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f      geo->endian_
8100: 61 72 63 68 29 3b 0a 09 09 66 7a 20 3d 20 67 61  arch);...fz = ga
8110: 69 61 49 6d 70 6f 72 74 46 33 32 20 28 67 65 6f  iaImportF32 (geo
8120: 2d 3e 62 6c 6f 62 20 2b 20 28 67 65 6f 2d 3e 6f  ->blob + (geo->o
8130: 66 66 73 65 74 20 2b 20 38 29 2c 20 67 65 6f 2d  ffset + 8), geo-
8140: 3e 65 6e 64 69 61 6e 2c 0a 09 09 09 09 20 20 20  >endian,.....   
8150: 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63   geo->endian_arc
8160: 68 29 3b 0a 09 09 6d 20 3d 20 67 61 69 61 49 6d  h);...m = gaiaIm
8170: 70 6f 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c 6f  port64 (geo->blo
8180: 62 20 2b 20 28 67 65 6f 2d 3e 6f 66 66 73 65 74  b + (geo->offset
8190: 20 2b 20 31 32 29 2c 20 67 65 6f 2d 3e 65 6e 64   + 12), geo->end
81a0: 69 61 6e 2c 0a 09 09 09 09 20 20 67 65 6f 2d 3e  ian,.....  geo->
81b0: 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09  endian_arch);...
81c0: 78 20 3d 20 6c 61 73 74 5f 78 20 2b 20 66 78 3b  x = last_x + fx;
81d0: 0a 09 09 79 20 3d 20 6c 61 73 74 5f 79 20 2b 20  ...y = last_y + 
81e0: 66 79 3b 0a 09 09 7a 20 3d 20 6c 61 73 74 5f 7a  fy;...z = last_z
81f0: 20 2b 20 66 7a 3b 0a 09 09 67 65 6f 2d 3e 6f 66   + fz;...geo->of
8200: 66 73 65 74 20 2b 3d 20 32 30 3b 0a 09 20 20 20  fset += 20;..   
8210: 20 7d 0a 09 20 20 67 61 69 61 53 65 74 50 6f 69   }..  gaiaSetPoi
8220: 6e 74 58 59 5a 4d 20 28 6c 69 6e 65 2d 3e 43 6f  ntXYZM (line->Co
8230: 6f 72 64 73 2c 20 69 76 2c 20 78 2c 20 79 2c 20  ords, iv, x, y, 
8240: 7a 2c 20 6d 29 3b 0a 09 20 20 6c 61 73 74 5f 78  z, m);..  last_x
8250: 20 3d 20 78 3b 0a 09 20 20 6c 61 73 74 5f 79 20   = x;..  last_y 
8260: 3d 20 79 3b 0a 09 20 20 6c 61 73 74 5f 7a 20 3d  = y;..  last_z =
8270: 20 7a 3b 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a 73   z;.      }.}..s
8280: 74 61 74 69 63 20 76 6f 69 64 0a 50 61 72 73 65  tatic void.Parse
8290: 43 6f 6d 70 72 65 73 73 65 64 57 6b 62 50 6f 6c  CompressedWkbPol
82a0: 79 67 6f 6e 20 28 67 61 69 61 47 65 6f 6d 43 6f  ygon (gaiaGeomCo
82b0: 6c 6c 50 74 72 20 67 65 6f 29 0a 7b 0a 2f 2a 20  llPtr geo).{./* 
82c0: 64 65 63 6f 64 65 73 20 61 20 43 4f 4d 50 52 45  decodes a COMPRE
82d0: 53 53 45 44 20 50 4f 4c 59 47 4f 4e 20 66 72 6f  SSED POLYGON fro
82e0: 6d 20 57 4b 42 20 2a 2f 0a 20 20 20 20 69 6e 74  m WKB */.    int
82f0: 20 72 69 6e 67 73 3b 0a 20 20 20 20 69 6e 74 20   rings;.    int 
8300: 6e 76 65 72 74 73 3b 0a 20 20 20 20 69 6e 74 20  nverts;.    int 
8310: 69 76 3b 0a 20 20 20 20 69 6e 74 20 69 62 3b 0a  iv;.    int ib;.
8320: 20 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20      double x;.  
8330: 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20    double y;.    
8340: 64 6f 75 62 6c 65 20 6c 61 73 74 5f 78 20 3d 20  double last_x = 
8350: 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  0.0;.    double 
8360: 6c 61 73 74 5f 79 20 3d 20 30 2e 30 3b 0a 20 20  last_y = 0.0;.  
8370: 20 20 66 6c 6f 61 74 20 66 78 3b 0a 20 20 20 20    float fx;.    
8380: 66 6c 6f 61 74 20 66 79 3b 0a 20 20 20 20 67 61  float fy;.    ga
8390: 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20 70 6f 6c  iaPolygonPtr pol
83a0: 79 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67  yg = NULL;.    g
83b0: 61 69 61 52 69 6e 67 50 74 72 20 72 69 6e 67 3b  aiaRingPtr ring;
83c0: 0a 20 20 20 20 69 66 20 28 67 65 6f 2d 3e 73 69  .    if (geo->si
83d0: 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66 73 65 74  ze < geo->offset
83e0: 20 2b 20 34 29 0a 09 72 65 74 75 72 6e 3b 0a 20   + 4)..return;. 
83f0: 20 20 20 72 69 6e 67 73 20 3d 0a 09 67 61 69 61     rings =..gaia
8400: 49 6d 70 6f 72 74 33 32 20 28 67 65 6f 2d 3e 62  Import32 (geo->b
8410: 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65  lob + geo->offse
8420: 74 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 20  t, geo->endian, 
8430: 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68  geo->endian_arch
8440: 29 3b 0a 20 20 20 20 67 65 6f 2d 3e 6f 66 66 73  );.    geo->offs
8450: 65 74 20 2b 3d 20 34 3b 0a 20 20 20 20 66 6f 72  et += 4;.    for
8460: 20 28 69 62 20 3d 20 30 3b 20 69 62 20 3c 20 72   (ib = 0; ib < r
8470: 69 6e 67 73 3b 20 69 62 2b 2b 29 0a 20 20 20 20  ings; ib++).    
8480: 20 20 7b 0a 09 20 20 69 66 20 28 67 65 6f 2d 3e    {..  if (geo->
8490: 73 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66 73  size < geo->offs
84a0: 65 74 20 2b 20 34 29 0a 09 20 20 20 20 20 20 72  et + 4)..      r
84b0: 65 74 75 72 6e 3b 0a 09 20 20 6e 76 65 72 74 73  eturn;..  nverts
84c0: 20 3d 0a 09 20 20 20 20 20 20 67 61 69 61 49 6d   =..      gaiaIm
84d0: 70 6f 72 74 33 32 20 28 67 65 6f 2d 3e 62 6c 6f  port32 (geo->blo
84e0: 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74 2c  b + geo->offset,
84f0: 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09 09   geo->endian,...
8500: 09 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e  .    geo->endian
8510: 5f 61 72 63 68 29 3b 0a 09 20 20 67 65 6f 2d 3e  _arch);..  geo->
8520: 6f 66 66 73 65 74 20 2b 3d 20 34 3b 0a 09 20 20  offset += 4;..  
8530: 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20  if (geo->size < 
8540: 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 28 38  geo->offset + (8
8550: 20 2a 20 6e 76 65 72 74 73 29 20 2b 20 31 36 29   * nverts) + 16)
8560: 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ..      return;.
8570: 09 20 20 69 66 20 28 69 62 20 3d 3d 20 30 29 0a  .  if (ib == 0).
8580: 09 20 20 20 20 7b 0a 09 09 70 6f 6c 79 67 20 3d  .    {...polyg =
8590: 20 67 61 69 61 41 64 64 50 6f 6c 79 67 6f 6e 54   gaiaAddPolygonT
85a0: 6f 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 2c 20  oGeomColl (geo, 
85b0: 6e 76 65 72 74 73 2c 20 72 69 6e 67 73 20 2d 20  nverts, rings - 
85c0: 31 29 3b 0a 09 09 72 69 6e 67 20 3d 20 70 6f 6c  1);...ring = pol
85d0: 79 67 2d 3e 45 78 74 65 72 69 6f 72 3b 0a 09 20  yg->Exterior;.. 
85e0: 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20     }..  else..  
85f0: 20 20 20 20 72 69 6e 67 20 3d 20 67 61 69 61 41      ring = gaiaA
8600: 64 64 49 6e 74 65 72 69 6f 72 52 69 6e 67 20 28  ddInteriorRing (
8610: 70 6f 6c 79 67 2c 20 69 62 20 2d 20 31 2c 20 6e  polyg, ib - 1, n
8620: 76 65 72 74 73 29 3b 0a 09 20 20 66 6f 72 20 28  verts);..  for (
8630: 69 76 20 3d 20 30 3b 20 69 76 20 3c 20 6e 76 65  iv = 0; iv < nve
8640: 72 74 73 3b 20 69 76 2b 2b 29 0a 09 20 20 20 20  rts; iv++)..    
8650: 7b 0a 09 09 69 66 20 28 69 76 20 3d 3d 20 30 20  {...if (iv == 0 
8660: 7c 7c 20 69 76 20 3d 3d 20 28 6e 76 65 72 74 73  || iv == (nverts
8670: 20 2d 20 31 29 29 0a 09 09 20 20 7b 0a 09 09 20   - 1))...  {... 
8680: 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 61 6e       /* first an
8690: 64 20 6c 61 73 74 20 76 65 72 74 69 63 65 73 20  d last vertices 
86a0: 61 72 65 20 75 6e 63 6f 6d 70 72 65 73 73 65 64  are uncompressed
86b0: 20 2a 2f 0a 09 09 20 20 20 20 20 20 78 20 3d 20   */...      x = 
86c0: 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28 67 65  gaiaImport64 (ge
86d0: 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f  o->blob + geo->o
86e0: 66 66 73 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69  ffset, geo->endi
86f0: 61 6e 2c 0a 09 09 09 09 09 67 65 6f 2d 3e 65 6e  an,......geo->en
8700: 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20  dian_arch);...  
8710: 20 20 20 20 79 20 3d 20 67 61 69 61 49 6d 70 6f      y = gaiaImpo
8720: 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c 6f 62 20  rt64 (geo->blob 
8730: 2b 20 28 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b  + (geo->offset +
8740: 20 38 29 2c 0a 09 09 09 09 09 67 65 6f 2d 3e 65   8),......geo->e
8750: 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e 65 6e 64 69  ndian, geo->endi
8760: 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20 20 20  an_arch);...    
8770: 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d    geo->offset +=
8780: 20 31 36 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73   16;...  }...els
8790: 65 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  e...  {...      
87a0: 2f 2a 20 61 6e 79 20 6f 74 68 65 72 20 69 6e 74  /* any other int
87b0: 65 72 6d 65 64 69 61 74 65 20 76 65 72 74 65 78  ermediate vertex
87c0: 20 69 73 20 63 6f 6d 70 72 65 73 73 65 64 20 2a   is compressed *
87d0: 2f 0a 09 09 20 20 20 20 20 20 66 78 20 3d 20 67  /...      fx = g
87e0: 61 69 61 49 6d 70 6f 72 74 46 33 32 20 28 67 65  aiaImportF32 (ge
87f0: 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f  o->blob + geo->o
8800: 66 66 73 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69  ffset, geo->endi
8810: 61 6e 2c 0a 09 09 09 09 09 20 20 67 65 6f 2d 3e  an,......  geo->
8820: 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09  endian_arch);...
8830: 20 20 20 20 20 20 66 79 20 3d 20 67 61 69 61 49        fy = gaiaI
8840: 6d 70 6f 72 74 46 33 32 20 28 67 65 6f 2d 3e 62  mportF32 (geo->b
8850: 6c 6f 62 20 2b 20 28 67 65 6f 2d 3e 6f 66 66 73  lob + (geo->offs
8860: 65 74 20 2b 20 34 29 2c 0a 09 09 09 09 09 20 20  et + 4),......  
8870: 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 20 67 65 6f  geo->endian, geo
8880: 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  ->endian_arch);.
8890: 09 09 20 20 20 20 20 20 78 20 3d 20 6c 61 73 74  ..      x = last
88a0: 5f 78 20 2b 20 66 78 3b 0a 09 09 20 20 20 20 20  _x + fx;...     
88b0: 20 79 20 3d 20 6c 61 73 74 5f 79 20 2b 20 66 79   y = last_y + fy
88c0: 3b 0a 09 09 20 20 20 20 20 20 67 65 6f 2d 3e 6f  ;...      geo->o
88d0: 66 66 73 65 74 20 2b 3d 20 38 3b 0a 09 09 20 20  ffset += 8;...  
88e0: 7d 0a 09 09 67 61 69 61 53 65 74 50 6f 69 6e 74  }...gaiaSetPoint
88f0: 20 28 72 69 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20   (ring->Coords, 
8900: 69 76 2c 20 78 2c 20 79 29 3b 0a 09 09 6c 61 73  iv, x, y);...las
8910: 74 5f 78 20 3d 20 78 3b 0a 09 09 6c 61 73 74 5f  t_x = x;...last_
8920: 79 20 3d 20 79 3b 0a 09 20 20 20 20 7d 0a 20 20  y = y;..    }.  
8930: 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20      }.}..static 
8940: 76 6f 69 64 0a 50 61 72 73 65 43 6f 6d 70 72 65  void.ParseCompre
8950: 73 73 65 64 57 6b 62 50 6f 6c 79 67 6f 6e 5a 20  ssedWkbPolygonZ 
8960: 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72  (gaiaGeomCollPtr
8970: 20 67 65 6f 29 0a 7b 0a 2f 2a 20 64 65 63 6f 64   geo).{./* decod
8980: 65 73 20 61 20 43 4f 4d 50 52 45 53 53 45 44 20  es a COMPRESSED 
8990: 50 4f 4c 59 47 4f 4e 5a 20 66 72 6f 6d 20 57 4b  POLYGONZ from WK
89a0: 42 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 69 6e  B */.    int rin
89b0: 67 73 3b 0a 20 20 20 20 69 6e 74 20 6e 76 65 72  gs;.    int nver
89c0: 74 73 3b 0a 20 20 20 20 69 6e 74 20 69 76 3b 0a  ts;.    int iv;.
89d0: 20 20 20 20 69 6e 74 20 69 62 3b 0a 20 20 20 20      int ib;.    
89e0: 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 64 6f  double x;.    do
89f0: 75 62 6c 65 20 79 3b 0a 20 20 20 20 64 6f 75 62  uble y;.    doub
8a00: 6c 65 20 7a 3b 0a 20 20 20 20 64 6f 75 62 6c 65  le z;.    double
8a10: 20 6c 61 73 74 5f 78 20 3d 20 30 2e 30 3b 0a 20   last_x = 0.0;. 
8a20: 20 20 20 64 6f 75 62 6c 65 20 6c 61 73 74 5f 79     double last_y
8a30: 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62   = 0.0;.    doub
8a40: 6c 65 20 6c 61 73 74 5f 7a 20 3d 20 30 2e 30 3b  le last_z = 0.0;
8a50: 0a 20 20 20 20 66 6c 6f 61 74 20 66 78 3b 0a 20  .    float fx;. 
8a60: 20 20 20 66 6c 6f 61 74 20 66 79 3b 0a 20 20 20     float fy;.   
8a70: 20 66 6c 6f 61 74 20 66 7a 3b 0a 20 20 20 20 67   float fz;.    g
8a80: 61 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20 70 6f  aiaPolygonPtr po
8a90: 6c 79 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  lyg = NULL;.    
8aa0: 67 61 69 61 52 69 6e 67 50 74 72 20 72 69 6e 67  gaiaRingPtr ring
8ab0: 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 2d 3e 73  ;.    if (geo->s
8ac0: 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66 73 65  ize < geo->offse
8ad0: 74 20 2b 20 34 29 0a 09 72 65 74 75 72 6e 3b 0a  t + 4)..return;.
8ae0: 20 20 20 20 72 69 6e 67 73 20 3d 0a 09 67 61 69      rings =..gai
8af0: 61 49 6d 70 6f 72 74 33 32 20 28 67 65 6f 2d 3e  aImport32 (geo->
8b00: 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73  blob + geo->offs
8b10: 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c  et, geo->endian,
8b20: 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63   geo->endian_arc
8b30: 68 29 3b 0a 20 20 20 20 67 65 6f 2d 3e 6f 66 66  h);.    geo->off
8b40: 73 65 74 20 2b 3d 20 34 3b 0a 20 20 20 20 66 6f  set += 4;.    fo
8b50: 72 20 28 69 62 20 3d 20 30 3b 20 69 62 20 3c 20  r (ib = 0; ib < 
8b60: 72 69 6e 67 73 3b 20 69 62 2b 2b 29 0a 20 20 20  rings; ib++).   
8b70: 20 20 20 7b 0a 09 20 20 69 66 20 28 67 65 6f 2d     {..  if (geo-
8b80: 3e 73 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66  >size < geo->off
8b90: 73 65 74 20 2b 20 34 29 0a 09 20 20 20 20 20 20  set + 4)..      
8ba0: 72 65 74 75 72 6e 3b 0a 09 20 20 6e 76 65 72 74  return;..  nvert
8bb0: 73 20 3d 0a 09 20 20 20 20 20 20 67 61 69 61 49  s =..      gaiaI
8bc0: 6d 70 6f 72 74 33 32 20 28 67 65 6f 2d 3e 62 6c  mport32 (geo->bl
8bd0: 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74  ob + geo->offset
8be0: 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09  , geo->endian,..
8bf0: 09 09 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69 61  ..    geo->endia
8c00: 6e 5f 61 72 63 68 29 3b 0a 09 20 20 67 65 6f 2d  n_arch);..  geo-
8c10: 3e 6f 66 66 73 65 74 20 2b 3d 20 34 3b 0a 09 20  >offset += 4;.. 
8c20: 20 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c   if (geo->size <
8c30: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 28   geo->offset + (
8c40: 31 32 20 2a 20 6e 76 65 72 74 73 29 20 2b 20 32  12 * nverts) + 2
8c50: 34 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e  4)..      return
8c60: 3b 0a 09 20 20 69 66 20 28 69 62 20 3d 3d 20 30  ;..  if (ib == 0
8c70: 29 0a 09 20 20 20 20 7b 0a 09 09 70 6f 6c 79 67  )..    {...polyg
8c80: 20 3d 20 67 61 69 61 41 64 64 50 6f 6c 79 67 6f   = gaiaAddPolygo
8c90: 6e 54 6f 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  nToGeomColl (geo
8ca0: 2c 20 6e 76 65 72 74 73 2c 20 72 69 6e 67 73 20  , nverts, rings 
8cb0: 2d 20 31 29 3b 0a 09 09 72 69 6e 67 20 3d 20 70  - 1);...ring = p
8cc0: 6f 6c 79 67 2d 3e 45 78 74 65 72 69 6f 72 3b 0a  olyg->Exterior;.
8cd0: 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09  .    }..  else..
8ce0: 20 20 20 20 20 20 72 69 6e 67 20 3d 20 67 61 69        ring = gai
8cf0: 61 41 64 64 49 6e 74 65 72 69 6f 72 52 69 6e 67  aAddInteriorRing
8d00: 20 28 70 6f 6c 79 67 2c 20 69 62 20 2d 20 31 2c   (polyg, ib - 1,
8d10: 20 6e 76 65 72 74 73 29 3b 0a 09 20 20 66 6f 72   nverts);..  for
8d20: 20 28 69 76 20 3d 20 30 3b 20 69 76 20 3c 20 6e   (iv = 0; iv < n
8d30: 76 65 72 74 73 3b 20 69 76 2b 2b 29 0a 09 20 20  verts; iv++)..  
8d40: 20 20 7b 0a 09 09 69 66 20 28 69 76 20 3d 3d 20    {...if (iv == 
8d50: 30 20 7c 7c 20 69 76 20 3d 3d 20 28 6e 76 65 72  0 || iv == (nver
8d60: 74 73 20 2d 20 31 29 29 0a 09 09 20 20 7b 0a 09  ts - 1))...  {..
8d70: 09 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20  .      /* first 
8d80: 61 6e 64 20 6c 61 73 74 20 76 65 72 74 69 63 65  and last vertice
8d90: 73 20 61 72 65 20 75 6e 63 6f 6d 70 72 65 73 73  s are uncompress
8da0: 65 64 20 2a 2f 0a 09 09 20 20 20 20 20 20 78 20  ed */...      x 
8db0: 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28  = gaiaImport64 (
8dc0: 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d  geo->blob + geo-
8dd0: 3e 6f 66 66 73 65 74 2c 20 67 65 6f 2d 3e 65 6e  >offset, geo->en
8de0: 64 69 61 6e 2c 0a 09 09 09 09 09 67 65 6f 2d 3e  dian,......geo->
8df0: 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09  endian_arch);...
8e00: 20 20 20 20 20 20 79 20 3d 20 67 61 69 61 49 6d        y = gaiaIm
8e10: 70 6f 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c 6f  port64 (geo->blo
8e20: 62 20 2b 20 28 67 65 6f 2d 3e 6f 66 66 73 65 74  b + (geo->offset
8e30: 20 2b 20 38 29 2c 0a 09 09 09 09 09 67 65 6f 2d   + 8),......geo-
8e40: 3e 65 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e 65 6e  >endian, geo->en
8e50: 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20  dian_arch);...  
8e60: 20 20 20 20 7a 20 3d 20 67 61 69 61 49 6d 70 6f      z = gaiaImpo
8e70: 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c 6f 62 20  rt64 (geo->blob 
8e80: 2b 20 28 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b  + (geo->offset +
8e90: 20 31 36 29 2c 0a 09 09 09 09 09 67 65 6f 2d 3e   16),......geo->
8ea0: 65 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e 65 6e 64  endian, geo->end
8eb0: 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20 20  ian_arch);...   
8ec0: 20 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b     geo->offset +
8ed0: 3d 20 32 34 3b 0a 09 09 20 20 7d 0a 09 09 65 6c  = 24;...  }...el
8ee0: 73 65 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20  se...  {...     
8ef0: 20 2f 2a 20 61 6e 79 20 6f 74 68 65 72 20 69 6e   /* any other in
8f00: 74 65 72 6d 65 64 69 61 74 65 20 76 65 72 74 65  termediate verte
8f10: 78 20 69 73 20 63 6f 6d 70 72 65 73 73 65 64 20  x is compressed 
8f20: 2a 2f 0a 09 09 20 20 20 20 20 20 66 78 20 3d 20  */...      fx = 
8f30: 67 61 69 61 49 6d 70 6f 72 74 46 33 32 20 28 67  gaiaImportF32 (g
8f40: 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e  eo->blob + geo->
8f50: 6f 66 66 73 65 74 2c 20 67 65 6f 2d 3e 65 6e 64  offset, geo->end
8f60: 69 61 6e 2c 0a 09 09 09 09 09 20 20 67 65 6f 2d  ian,......  geo-
8f70: 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09  >endian_arch);..
8f80: 09 20 20 20 20 20 20 66 79 20 3d 20 67 61 69 61  .      fy = gaia
8f90: 49 6d 70 6f 72 74 46 33 32 20 28 67 65 6f 2d 3e  ImportF32 (geo->
8fa0: 62 6c 6f 62 20 2b 20 28 67 65 6f 2d 3e 6f 66 66  blob + (geo->off
8fb0: 73 65 74 20 2b 20 34 29 2c 0a 09 09 09 09 09 20  set + 4),...... 
8fc0: 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 20 67 65   geo->endian, ge
8fd0: 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  o->endian_arch);
8fe0: 0a 09 09 20 20 20 20 20 20 66 7a 20 3d 20 67 61  ...      fz = ga
8ff0: 69 61 49 6d 70 6f 72 74 46 33 32 20 28 67 65 6f  iaImportF32 (geo
9000: 2d 3e 62 6c 6f 62 20 2b 20 28 67 65 6f 2d 3e 6f  ->blob + (geo->o
9010: 66 66 73 65 74 20 2b 20 38 29 2c 0a 09 09 09 09  ffset + 8),.....
9020: 09 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 20  .  geo->endian, 
9030: 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68  geo->endian_arch
9040: 29 3b 0a 09 09 20 20 20 20 20 20 78 20 3d 20 6c  );...      x = l
9050: 61 73 74 5f 78 20 2b 20 66 78 3b 0a 09 09 20 20  ast_x + fx;...  
9060: 20 20 20 20 79 20 3d 20 6c 61 73 74 5f 79 20 2b      y = last_y +
9070: 20 66 79 3b 0a 09 09 20 20 20 20 20 20 7a 20 3d   fy;...      z =
9080: 20 6c 61 73 74 5f 7a 20 2b 20 66 7a 3b 0a 09 09   last_z + fz;...
9090: 20 20 20 20 20 20 67 65 6f 2d 3e 6f 66 66 73 65        geo->offse
90a0: 74 20 2b 3d 20 31 32 3b 0a 09 09 20 20 7d 0a 09  t += 12;...  }..
90b0: 09 67 61 69 61 53 65 74 50 6f 69 6e 74 58 59 5a  .gaiaSetPointXYZ
90c0: 20 28 72 69 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20   (ring->Coords, 
90d0: 69 76 2c 20 78 2c 20 79 2c 20 7a 29 3b 0a 09 09  iv, x, y, z);...
90e0: 6c 61 73 74 5f 78 20 3d 20 78 3b 0a 09 09 6c 61  last_x = x;...la
90f0: 73 74 5f 79 20 3d 20 79 3b 0a 09 09 6c 61 73 74  st_y = y;...last
9100: 5f 7a 20 3d 20 7a 3b 0a 09 20 20 20 20 7d 0a 20  _z = z;..    }. 
9110: 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63       }.}..static
9120: 20 76 6f 69 64 0a 50 61 72 73 65 43 6f 6d 70 72   void.ParseCompr
9130: 65 73 73 65 64 57 6b 62 50 6f 6c 79 67 6f 6e 4d  essedWkbPolygonM
9140: 20 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74   (gaiaGeomCollPt
9150: 72 20 67 65 6f 29 0a 7b 0a 2f 2a 20 64 65 63 6f  r geo).{./* deco
9160: 64 65 73 20 61 20 43 4f 4d 50 52 45 53 53 45 44  des a COMPRESSED
9170: 20 50 4f 4c 59 47 4f 4e 4d 20 66 72 6f 6d 20 57   POLYGONM from W
9180: 4b 42 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 69  KB */.    int ri
9190: 6e 67 73 3b 0a 20 20 20 20 69 6e 74 20 6e 76 65  ngs;.    int nve
91a0: 72 74 73 3b 0a 20 20 20 20 69 6e 74 20 69 76 3b  rts;.    int iv;
91b0: 0a 20 20 20 20 69 6e 74 20 69 62 3b 0a 20 20 20  .    int ib;.   
91c0: 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 64   double x;.    d
91d0: 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 64 6f 75  ouble y;.    dou
91e0: 62 6c 65 20 6d 3b 0a 20 20 20 20 64 6f 75 62 6c  ble m;.    doubl
91f0: 65 20 6c 61 73 74 5f 78 20 3d 20 30 2e 30 3b 0a  e last_x = 0.0;.
9200: 20 20 20 20 64 6f 75 62 6c 65 20 6c 61 73 74 5f      double last_
9210: 79 20 3d 20 30 2e 30 3b 0a 20 20 20 20 66 6c 6f  y = 0.0;.    flo
9220: 61 74 20 66 78 3b 0a 20 20 20 20 66 6c 6f 61 74  at fx;.    float
9230: 20 66 79 3b 0a 20 20 20 20 67 61 69 61 50 6f 6c   fy;.    gaiaPol
9240: 79 67 6f 6e 50 74 72 20 70 6f 6c 79 67 20 3d 20  ygonPtr polyg = 
9250: 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 52 69  NULL;.    gaiaRi
9260: 6e 67 50 74 72 20 72 69 6e 67 3b 0a 20 20 20 20  ngPtr ring;.    
9270: 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20  if (geo->size < 
9280: 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 34 29  geo->offset + 4)
9290: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 72 69  ..return;.    ri
92a0: 6e 67 73 20 3d 0a 09 67 61 69 61 49 6d 70 6f 72  ngs =..gaiaImpor
92b0: 74 33 32 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b  t32 (geo->blob +
92c0: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 2c 20 67 65   geo->offset, ge
92d0: 6f 2d 3e 65 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e  o->endian, geo->
92e0: 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20  endian_arch);.  
92f0: 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d    geo->offset +=
9300: 20 34 3b 0a 20 20 20 20 66 6f 72 20 28 69 62 20   4;.    for (ib 
9310: 3d 20 30 3b 20 69 62 20 3c 20 72 69 6e 67 73 3b  = 0; ib < rings;
9320: 20 69 62 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09   ib++).      {..
9330: 20 20 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20    if (geo->size 
9340: 3c 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20  < geo->offset + 
9350: 34 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e  4)..      return
9360: 3b 0a 09 20 20 6e 76 65 72 74 73 20 3d 0a 09 20  ;..  nverts =.. 
9370: 20 20 20 20 20 67 61 69 61 49 6d 70 6f 72 74 33       gaiaImport3
9380: 32 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67  2 (geo->blob + g
9390: 65 6f 2d 3e 6f 66 66 73 65 74 2c 20 67 65 6f 2d  eo->offset, geo-
93a0: 3e 65 6e 64 69 61 6e 2c 0a 09 09 09 20 20 20 20  >endian,....    
93b0: 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68  geo->endian_arch
93c0: 29 3b 0a 09 20 20 67 65 6f 2d 3e 6f 66 66 73 65  );..  geo->offse
93d0: 74 20 2b 3d 20 34 3b 0a 09 20 20 69 66 20 28 67  t += 4;..  if (g
93e0: 65 6f 2d 3e 73 69 7a 65 20 3c 20 67 65 6f 2d 3e  eo->size < geo->
93f0: 6f 66 66 73 65 74 20 2b 20 28 31 36 20 2a 20 6e  offset + (16 * n
9400: 76 65 72 74 73 29 20 2b 20 31 36 29 0a 09 20 20  verts) + 16)..  
9410: 20 20 20 20 72 65 74 75 72 6e 3b 0a 09 20 20 69      return;..  i
9420: 66 20 28 69 62 20 3d 3d 20 30 29 0a 09 20 20 20  f (ib == 0)..   
9430: 20 7b 0a 09 09 70 6f 6c 79 67 20 3d 20 67 61 69   {...polyg = gai
9440: 61 41 64 64 50 6f 6c 79 67 6f 6e 54 6f 47 65 6f  aAddPolygonToGeo
9450: 6d 43 6f 6c 6c 20 28 67 65 6f 2c 20 6e 76 65 72  mColl (geo, nver
9460: 74 73 2c 20 72 69 6e 67 73 20 2d 20 31 29 3b 0a  ts, rings - 1);.
9470: 09 09 72 69 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e  ..ring = polyg->
9480: 45 78 74 65 72 69 6f 72 3b 0a 09 20 20 20 20 7d  Exterior;..    }
9490: 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20  ..  else..      
94a0: 72 69 6e 67 20 3d 20 67 61 69 61 41 64 64 49 6e  ring = gaiaAddIn
94b0: 74 65 72 69 6f 72 52 69 6e 67 20 28 70 6f 6c 79  teriorRing (poly
94c0: 67 2c 20 69 62 20 2d 20 31 2c 20 6e 76 65 72 74  g, ib - 1, nvert
94d0: 73 29 3b 0a 09 20 20 66 6f 72 20 28 69 76 20 3d  s);..  for (iv =
94e0: 20 30 3b 20 69 76 20 3c 20 6e 76 65 72 74 73 3b   0; iv < nverts;
94f0: 20 69 76 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09   iv++)..    {...
9500: 69 66 20 28 69 76 20 3d 3d 20 30 20 7c 7c 20 69  if (iv == 0 || i
9510: 76 20 3d 3d 20 28 6e 76 65 72 74 73 20 2d 20 31  v == (nverts - 1
9520: 29 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20  ))...  {...     
9530: 20 2f 2a 20 66 69 72 73 74 20 61 6e 64 20 6c 61   /* first and la
9540: 73 74 20 76 65 72 74 69 63 65 73 20 61 72 65 20  st vertices are 
9550: 75 6e 63 6f 6d 70 72 65 73 73 65 64 20 2a 2f 0a  uncompressed */.
9560: 09 09 20 20 20 20 20 20 78 20 3d 20 67 61 69 61  ..      x = gaia
9570: 49 6d 70 6f 72 74 36 34 20 28 67 65 6f 2d 3e 62  Import64 (geo->b
9580: 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65  lob + geo->offse
9590: 74 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a  t, geo->endian,.
95a0: 09 09 09 09 09 67 65 6f 2d 3e 65 6e 64 69 61 6e  .....geo->endian
95b0: 5f 61 72 63 68 29 3b 0a 09 09 20 20 20 20 20 20  _arch);...      
95c0: 79 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34  y = gaiaImport64
95d0: 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 28 67   (geo->blob + (g
95e0: 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 38 29 2c  eo->offset + 8),
95f0: 0a 09 09 09 09 09 67 65 6f 2d 3e 65 6e 64 69 61  ......geo->endia
9600: 6e 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61  n, geo->endian_a
9610: 72 63 68 29 3b 0a 09 09 20 20 20 20 20 20 6d 20  rch);...      m 
9620: 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28  = gaiaImport64 (
9630: 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 28 67 65 6f  geo->blob + (geo
9640: 2d 3e 6f 66 66 73 65 74 20 2b 20 31 36 29 2c 0a  ->offset + 16),.
9650: 09 09 09 09 09 67 65 6f 2d 3e 65 6e 64 69 61 6e  .....geo->endian
9660: 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72  , geo->endian_ar
9670: 63 68 29 3b 0a 09 09 20 20 20 20 20 20 67 65 6f  ch);...      geo
9680: 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 32 34 3b 0a  ->offset += 24;.
9690: 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 20  ..  }...else... 
96a0: 20 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20 61 6e   {...      /* an
96b0: 79 20 6f 74 68 65 72 20 69 6e 74 65 72 6d 65 64  y other intermed
96c0: 69 61 74 65 20 76 65 72 74 65 78 20 69 73 20 63  iate vertex is c
96d0: 6f 6d 70 72 65 73 73 65 64 20 2a 2f 0a 09 09 20  ompressed */... 
96e0: 20 20 20 20 20 66 78 20 3d 20 67 61 69 61 49 6d       fx = gaiaIm
96f0: 70 6f 72 74 46 33 32 20 28 67 65 6f 2d 3e 62 6c  portF32 (geo->bl
9700: 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74  ob + geo->offset
9710: 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09  , geo->endian,..
9720: 09 09 09 09 20 20 67 65 6f 2d 3e 65 6e 64 69 61  ....  geo->endia
9730: 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20 20 20 20  n_arch);...     
9740: 20 66 79 20 3d 20 67 61 69 61 49 6d 70 6f 72 74   fy = gaiaImport
9750: 46 33 32 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b  F32 (geo->blob +
9760: 20 28 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20   (geo->offset + 
9770: 34 29 2c 0a 09 09 09 09 09 20 20 67 65 6f 2d 3e  4),......  geo->
9780: 65 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e 65 6e 64  endian, geo->end
9790: 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20 20  ian_arch);...   
97a0: 20 20 20 6d 20 3d 20 67 61 69 61 49 6d 70 6f 72     m = gaiaImpor
97b0: 74 36 34 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b  t64 (geo->blob +
97c0: 20 28 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20   (geo->offset + 
97d0: 38 29 2c 0a 09 09 09 09 09 67 65 6f 2d 3e 65 6e  8),......geo->en
97e0: 64 69 61 6e 2c 20 67 65 6f 2d 3e 65 6e 64 69 61  dian, geo->endia
97f0: 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20 20 20 20  n_arch);...     
9800: 20 78 20 3d 20 6c 61 73 74 5f 78 20 2b 20 66 78   x = last_x + fx
9810: 3b 0a 09 09 20 20 20 20 20 20 79 20 3d 20 6c 61  ;...      y = la
9820: 73 74 5f 79 20 2b 20 66 79 3b 0a 09 09 20 20 20  st_y + fy;...   
9830: 20 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b     geo->offset +
9840: 3d 20 31 36 3b 0a 09 09 20 20 7d 0a 09 09 67 61  = 16;...  }...ga
9850: 69 61 53 65 74 50 6f 69 6e 74 58 59 4d 20 28 72  iaSetPointXYM (r
9860: 69 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c  ing->Coords, iv,
9870: 20 78 2c 20 79 2c 20 6d 29 3b 0a 09 09 6c 61 73   x, y, m);...las
9880: 74 5f 78 20 3d 20 78 3b 0a 09 09 6c 61 73 74 5f  t_x = x;...last_
9890: 79 20 3d 20 79 3b 0a 09 20 20 20 20 7d 0a 20 20  y = y;..    }.  
98a0: 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20      }.}..static 
98b0: 76 6f 69 64 0a 50 61 72 73 65 43 6f 6d 70 72 65  void.ParseCompre
98c0: 73 73 65 64 57 6b 62 50 6f 6c 79 67 6f 6e 5a 4d  ssedWkbPolygonZM
98d0: 20 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74   (gaiaGeomCollPt
98e0: 72 20 67 65 6f 29 0a 7b 0a 2f 2a 20 64 65 63 6f  r geo).{./* deco
98f0: 64 65 73 20 61 20 43 4f 4d 50 52 45 53 53 45 44  des a COMPRESSED
9900: 20 50 4f 4c 59 47 4f 4e 5a 4d 20 66 72 6f 6d 20   POLYGONZM from 
9910: 57 4b 42 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  WKB */.    int r
9920: 69 6e 67 73 3b 0a 20 20 20 20 69 6e 74 20 6e 76  ings;.    int nv
9930: 65 72 74 73 3b 0a 20 20 20 20 69 6e 74 20 69 76  erts;.    int iv
9940: 3b 0a 20 20 20 20 69 6e 74 20 69 62 3b 0a 20 20  ;.    int ib;.  
9950: 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20    double x;.    
9960: 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 64 6f  double y;.    do
9970: 75 62 6c 65 20 7a 3b 0a 20 20 20 20 64 6f 75 62  uble z;.    doub
9980: 6c 65 20 6d 3b 0a 20 20 20 20 64 6f 75 62 6c 65  le m;.    double
9990: 20 6c 61 73 74 5f 78 20 3d 20 30 2e 30 3b 0a 20   last_x = 0.0;. 
99a0: 20 20 20 64 6f 75 62 6c 65 20 6c 61 73 74 5f 79     double last_y
99b0: 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62   = 0.0;.    doub
99c0: 6c 65 20 6c 61 73 74 5f 7a 20 3d 20 30 2e 30 3b  le last_z = 0.0;
99d0: 0a 20 20 20 20 66 6c 6f 61 74 20 66 78 3b 0a 20  .    float fx;. 
99e0: 20 20 20 66 6c 6f 61 74 20 66 79 3b 0a 20 20 20     float fy;.   
99f0: 20 66 6c 6f 61 74 20 66 7a 3b 0a 20 20 20 20 67   float fz;.    g
9a00: 61 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20 70 6f  aiaPolygonPtr po
9a10: 6c 79 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  lyg = NULL;.    
9a20: 67 61 69 61 52 69 6e 67 50 74 72 20 72 69 6e 67  gaiaRingPtr ring
9a30: 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 2d 3e 73  ;.    if (geo->s
9a40: 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66 73 65  ize < geo->offse
9a50: 74 20 2b 20 34 29 0a 09 72 65 74 75 72 6e 3b 0a  t + 4)..return;.
9a60: 20 20 20 20 72 69 6e 67 73 20 3d 0a 09 67 61 69      rings =..gai
9a70: 61 49 6d 70 6f 72 74 33 32 20 28 67 65 6f 2d 3e  aImport32 (geo->
9a80: 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73  blob + geo->offs
9a90: 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c  et, geo->endian,
9aa0: 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63   geo->endian_arc
9ab0: 68 29 3b 0a 20 20 20 20 67 65 6f 2d 3e 6f 66 66  h);.    geo->off
9ac0: 73 65 74 20 2b 3d 20 34 3b 0a 20 20 20 20 66 6f  set += 4;.    fo
9ad0: 72 20 28 69 62 20 3d 20 30 3b 20 69 62 20 3c 20  r (ib = 0; ib < 
9ae0: 72 69 6e 67 73 3b 20 69 62 2b 2b 29 0a 20 20 20  rings; ib++).   
9af0: 20 20 20 7b 0a 09 20 20 69 66 20 28 67 65 6f 2d     {..  if (geo-
9b00: 3e 73 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66  >size < geo->off
9b10: 73 65 74 20 2b 20 34 29 0a 09 20 20 20 20 20 20  set + 4)..      
9b20: 72 65 74 75 72 6e 3b 0a 09 20 20 6e 76 65 72 74  return;..  nvert
9b30: 73 20 3d 0a 09 20 20 20 20 20 20 67 61 69 61 49  s =..      gaiaI
9b40: 6d 70 6f 72 74 33 32 20 28 67 65 6f 2d 3e 62 6c  mport32 (geo->bl
9b50: 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74  ob + geo->offset
9b60: 2c 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 0a 09  , geo->endian,..
9b70: 09 09 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69 61  ..    geo->endia
9b80: 6e 5f 61 72 63 68 29 3b 0a 09 20 20 67 65 6f 2d  n_arch);..  geo-
9b90: 3e 6f 66 66 73 65 74 20 2b 3d 20 34 3b 0a 09 20  >offset += 4;.. 
9ba0: 20 69 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c   if (geo->size <
9bb0: 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 28   geo->offset + (
9bc0: 32 30 20 2a 20 6e 76 65 72 74 73 29 20 2b 20 32  20 * nverts) + 2
9bd0: 34 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e  4)..      return
9be0: 3b 0a 09 20 20 69 66 20 28 69 62 20 3d 3d 20 30  ;..  if (ib == 0
9bf0: 29 0a 09 20 20 20 20 7b 0a 09 09 70 6f 6c 79 67  )..    {...polyg
9c00: 20 3d 20 67 61 69 61 41 64 64 50 6f 6c 79 67 6f   = gaiaAddPolygo
9c10: 6e 54 6f 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f  nToGeomColl (geo
9c20: 2c 20 6e 76 65 72 74 73 2c 20 72 69 6e 67 73 20  , nverts, rings 
9c30: 2d 20 31 29 3b 0a 09 09 72 69 6e 67 20 3d 20 70  - 1);...ring = p
9c40: 6f 6c 79 67 2d 3e 45 78 74 65 72 69 6f 72 3b 0a  olyg->Exterior;.
9c50: 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09  .    }..  else..
9c60: 20 20 20 20 20 20 72 69 6e 67 20 3d 20 67 61 69        ring = gai
9c70: 61 41 64 64 49 6e 74 65 72 69 6f 72 52 69 6e 67  aAddInteriorRing
9c80: 20 28 70 6f 6c 79 67 2c 20 69 62 20 2d 20 31 2c   (polyg, ib - 1,
9c90: 20 6e 76 65 72 74 73 29 3b 0a 09 20 20 66 6f 72   nverts);..  for
9ca0: 20 28 69 76 20 3d 20 30 3b 20 69 76 20 3c 20 6e   (iv = 0; iv < n
9cb0: 76 65 72 74 73 3b 20 69 76 2b 2b 29 0a 09 20 20  verts; iv++)..  
9cc0: 20 20 7b 0a 09 09 69 66 20 28 69 76 20 3d 3d 20    {...if (iv == 
9cd0: 30 20 7c 7c 20 69 76 20 3d 3d 20 28 6e 76 65 72  0 || iv == (nver
9ce0: 74 73 20 2d 20 31 29 29 0a 09 09 20 20 7b 0a 09  ts - 1))...  {..
9cf0: 09 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20  .      /* first 
9d00: 61 6e 64 20 6c 61 73 74 20 76 65 72 74 69 63 65  and last vertice
9d10: 73 20 61 72 65 20 75 6e 63 6f 6d 70 72 65 73 73  s are uncompress
9d20: 65 64 20 2a 2f 0a 09 09 20 20 20 20 20 20 78 20  ed */...      x 
9d30: 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28  = gaiaImport64 (
9d40: 67 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d  geo->blob + geo-
9d50: 3e 6f 66 66 73 65 74 2c 20 67 65 6f 2d 3e 65 6e  >offset, geo->en
9d60: 64 69 61 6e 2c 0a 09 09 09 09 09 67 65 6f 2d 3e  dian,......geo->
9d70: 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09  endian_arch);...
9d80: 20 20 20 20 20 20 79 20 3d 20 67 61 69 61 49 6d        y = gaiaIm
9d90: 70 6f 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c 6f  port64 (geo->blo
9da0: 62 20 2b 20 28 67 65 6f 2d 3e 6f 66 66 73 65 74  b + (geo->offset
9db0: 20 2b 20 38 29 2c 0a 09 09 09 09 09 67 65 6f 2d   + 8),......geo-
9dc0: 3e 65 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e 65 6e  >endian, geo->en
9dd0: 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20  dian_arch);...  
9de0: 20 20 20 20 7a 20 3d 20 67 61 69 61 49 6d 70 6f      z = gaiaImpo
9df0: 72 74 36 34 20 28 67 65 6f 2d 3e 62 6c 6f 62 20  rt64 (geo->blob 
9e00: 2b 20 28 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b  + (geo->offset +
9e10: 20 31 36 29 2c 0a 09 09 09 09 09 67 65 6f 2d 3e   16),......geo->
9e20: 65 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e 65 6e 64  endian, geo->end
9e30: 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20 20  ian_arch);...   
9e40: 20 20 20 6d 20 3d 20 67 61 69 61 49 6d 70 6f 72     m = gaiaImpor
9e50: 74 36 34 20 28 67 65 6f 2d 3e 62 6c 6f 62 20 2b  t64 (geo->blob +
9e60: 20 28 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20   (geo->offset + 
9e70: 32 34 29 2c 0a 09 09 09 09 09 67 65 6f 2d 3e 65  24),......geo->e
9e80: 6e 64 69 61 6e 2c 20 67 65 6f 2d 3e 65 6e 64 69  ndian, geo->endi
9e90: 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20 20 20  an_arch);...    
9ea0: 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d    geo->offset +=
9eb0: 20 33 32 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73   32;...  }...els
9ec0: 65 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  e...  {...      
9ed0: 2f 2a 20 61 6e 79 20 6f 74 68 65 72 20 69 6e 74  /* any other int
9ee0: 65 72 6d 65 64 69 61 74 65 20 76 65 72 74 65 78  ermediate vertex
9ef0: 20 69 73 20 63 6f 6d 70 72 65 73 73 65 64 20 2a   is compressed *
9f00: 2f 0a 09 09 20 20 20 20 20 20 66 78 20 3d 20 67  /...      fx = g
9f10: 61 69 61 49 6d 70 6f 72 74 46 33 32 20 28 67 65  aiaImportF32 (ge
9f20: 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f  o->blob + geo->o
9f30: 66 66 73 65 74 2c 20 67 65 6f 2d 3e 65 6e 64 69  ffset, geo->endi
9f40: 61 6e 2c 0a 09 09 09 09 09 20 20 67 65 6f 2d 3e  an,......  geo->
9f50: 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09  endian_arch);...
9f60: 20 20 20 20 20 20 66 79 20 3d 20 67 61 69 61 49        fy = gaiaI
9f70: 6d 70 6f 72 74 46 33 32 20 28 67 65 6f 2d 3e 62  mportF32 (geo->b
9f80: 6c 6f 62 20 2b 20 28 67 65 6f 2d 3e 6f 66 66 73  lob + (geo->offs
9f90: 65 74 20 2b 20 34 29 2c 0a 09 09 09 09 09 20 20  et + 4),......  
9fa0: 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 20 67 65 6f  geo->endian, geo
9fb0: 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  ->endian_arch);.
9fc0: 09 09 20 20 20 20 20 20 66 7a 20 3d 20 67 61 69  ..      fz = gai
9fd0: 61 49 6d 70 6f 72 74 46 33 32 20 28 67 65 6f 2d  aImportF32 (geo-
9fe0: 3e 62 6c 6f 62 20 2b 20 28 67 65 6f 2d 3e 6f 66  >blob + (geo->of
9ff0: 66 73 65 74 20 2b 20 38 29 2c 0a 09 09 09 09 09  fset + 8),......
a000: 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 20 67    geo->endian, g
a010: 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29  eo->endian_arch)
a020: 3b 0a 09 09 20 20 20 20 20 20 6d 20 3d 20 67 61  ;...      m = ga
a030: 69 61 49 6d 70 6f 72 74 36 34 20 28 67 65 6f 2d  iaImport64 (geo-
a040: 3e 62 6c 6f 62 20 2b 20 28 67 65 6f 2d 3e 6f 66  >blob + (geo->of
a050: 66 73 65 74 20 2b 20 31 32 29 2c 0a 09 09 09 09  fset + 12),.....
a060: 09 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 20 67 65  .geo->endian, ge
a070: 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  o->endian_arch);
a080: 0a 09 09 20 20 20 20 20 20 78 20 3d 20 6c 61 73  ...      x = las
a090: 74 5f 78 20 2b 20 66 78 3b 0a 09 09 20 20 20 20  t_x + fx;...    
a0a0: 20 20 79 20 3d 20 6c 61 73 74 5f 79 20 2b 20 66    y = last_y + f
a0b0: 79 3b 0a 09 09 20 20 20 20 20 20 7a 20 3d 20 6c  y;...      z = l
a0c0: 61 73 74 5f 7a 20 2b 20 66 7a 3b 0a 09 09 20 20  ast_z + fz;...  
a0d0: 20 20 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20      geo->offset 
a0e0: 2b 3d 20 32 30 3b 0a 09 09 20 20 7d 0a 09 09 67  += 20;...  }...g
a0f0: 61 69 61 53 65 74 50 6f 69 6e 74 58 59 5a 4d 20  aiaSetPointXYZM 
a100: 28 72 69 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69  (ring->Coords, i
a110: 76 2c 20 78 2c 20 79 2c 20 7a 2c 20 6d 29 3b 0a  v, x, y, z, m);.
a120: 09 09 6c 61 73 74 5f 78 20 3d 20 78 3b 0a 09 09  ..last_x = x;...
a130: 6c 61 73 74 5f 79 20 3d 20 79 3b 0a 09 09 6c 61  last_y = y;...la
a140: 73 74 5f 7a 20 3d 20 7a 3b 0a 09 20 20 20 20 7d  st_z = z;..    }
a150: 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74  .      }.}..stat
a160: 69 63 20 76 6f 69 64 0a 50 61 72 73 65 57 6b 62  ic void.ParseWkb
a170: 47 65 6f 6d 65 74 72 79 20 28 67 61 69 61 47 65  Geometry (gaiaGe
a180: 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 2c 20 69  omCollPtr geo, i
a190: 6e 74 20 69 73 57 4b 42 29 0a 7b 0a 2f 2a 20 64  nt isWKB).{./* d
a1a0: 65 63 6f 64 65 73 20 61 20 4d 55 4c 54 49 78 78  ecodes a MULTIxx
a1b0: 20 6f 72 20 47 45 4f 4d 45 54 52 59 43 4f 4c 4c   or GEOMETRYCOLL
a1c0: 45 43 54 49 4f 4e 20 66 72 6f 6d 20 53 70 61 74  ECTION from Spat
a1d0: 69 61 4c 69 74 65 20 42 4c 4f 42 20 2a 2f 0a 20  iaLite BLOB */. 
a1e0: 20 20 20 69 6e 74 20 65 6e 74 69 74 69 65 73 3b     int entities;
a1f0: 0a 20 20 20 20 69 6e 74 20 74 79 70 65 3b 0a 20  .    int type;. 
a200: 20 20 20 69 6e 74 20 69 65 3b 0a 20 20 20 20 69     int ie;.    i
a210: 66 20 28 67 65 6f 2d 3e 73 69 7a 65 20 3c 20 67  f (geo->size < g
a220: 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 20 34 29 0a  eo->offset + 4).
a230: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 65 6e 74  .return;.    ent
a240: 69 74 69 65 73 20 3d 0a 09 67 61 69 61 49 6d 70  ities =..gaiaImp
a250: 6f 72 74 33 32 20 28 67 65 6f 2d 3e 62 6c 6f 62  ort32 (geo->blob
a260: 20 2b 20 67 65 6f 2d 3e 6f 66 66 73 65 74 2c 20   + geo->offset, 
a270: 67 65 6f 2d 3e 65 6e 64 69 61 6e 2c 20 67 65 6f  geo->endian, geo
a280: 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  ->endian_arch);.
a290: 20 20 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20      geo->offset 
a2a0: 2b 3d 20 34 3b 0a 20 20 20 20 66 6f 72 20 28 69  += 4;.    for (i
a2b0: 65 20 3d 20 30 3b 20 69 65 20 3c 20 65 6e 74 69  e = 0; ie < enti
a2c0: 74 69 65 73 3b 20 69 65 2b 2b 29 0a 20 20 20 20  ties; ie++).    
a2d0: 20 20 7b 0a 09 20 20 69 66 20 28 67 65 6f 2d 3e    {..  if (geo->
a2e0: 73 69 7a 65 20 3c 20 67 65 6f 2d 3e 6f 66 66 73  size < geo->offs
a2f0: 65 74 20 2b 20 35 29 0a 09 20 20 20 20 20 20 72  et + 5)..      r
a300: 65 74 75 72 6e 3b 0a 09 20 20 69 66 20 28 69 73  eturn;..  if (is
a310: 57 4b 42 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a  WKB)..    {.../*
a320: 20 76 61 6e 69 6c 6c 61 20 57 4b 42 20 63 6f 75   vanilla WKB cou
a330: 6c 64 20 62 65 20 65 6e 63 6f 64 65 64 20 61 73  ld be encoded as
a340: 20 6d 69 78 65 64 20 62 69 67 2d 2f 6c 69 74 74   mixed big-/litt
a350: 6c 65 2d 65 6e 64 69 61 6e 20 73 75 62 2d 69 74  le-endian sub-it
a360: 65 6d 73 20 2a 2f 0a 09 09 69 66 20 28 2a 28 67  ems */...if (*(g
a370: 65 6f 2d 3e 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e  eo->blob + geo->
a380: 6f 66 66 73 65 74 29 20 3d 3d 20 30 78 30 31 29  offset) == 0x01)
a390: 0a 09 09 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69  ...    geo->endi
a3a0: 61 6e 20 3d 20 47 41 49 41 5f 4c 49 54 54 4c 45  an = GAIA_LITTLE
a3b0: 5f 45 4e 44 49 41 4e 3b 0a 09 09 65 6c 73 65 0a  _ENDIAN;...else.
a3c0: 09 09 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69 61  ..    geo->endia
a3d0: 6e 20 3d 20 47 41 49 41 5f 42 49 47 5f 45 4e 44  n = GAIA_BIG_END
a3e0: 49 41 4e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 74  IAN;..    }..  t
a3f0: 79 70 65 20 3d 0a 09 20 20 20 20 20 20 67 61 69  ype =..      gai
a400: 61 49 6d 70 6f 72 74 33 32 20 28 67 65 6f 2d 3e  aImport32 (geo->
a410: 62 6c 6f 62 20 2b 20 67 65 6f 2d 3e 6f 66 66 73  blob + geo->offs
a420: 65 74 20 2b 20 31 2c 20 67 65 6f 2d 3e 65 6e 64  et + 1, geo->end
a430: 69 61 6e 2c 0a 09 09 09 20 20 20 20 67 65 6f 2d  ian,....    geo-
a440: 3e 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09  >endian_arch);..
a450: 20 20 67 65 6f 2d 3e 6f 66 66 73 65 74 20 2b 3d    geo->offset +=
a460: 20 35 3b 0a 09 20 20 73 77 69 74 63 68 20 28 74   5;..  switch (t
a470: 79 70 65 29 0a 09 20 20 20 20 7b 0a 09 20 20 20  ype)..    {..   
a480: 20 63 61 73 65 20 47 41 49 41 5f 50 4f 49 4e 54   case GAIA_POINT
a490: 3a 0a 09 09 50 61 72 73 65 57 6b 62 50 6f 69 6e  :...ParseWkbPoin
a4a0: 74 20 28 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b  t (geo);...break
a4b0: 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ;..    case GAIA
a4c0: 5f 50 4f 49 4e 54 5a 3a 0a 09 20 20 20 20 63 61  _POINTZ:..    ca
a4d0: 73 65 20 47 41 49 41 5f 47 45 4f 53 57 4b 42 5f  se GAIA_GEOSWKB_
a4e0: 50 4f 49 4e 54 5a 3a 0a 09 09 50 61 72 73 65 57  POINTZ:...ParseW
a4f0: 6b 62 50 6f 69 6e 74 5a 20 28 67 65 6f 29 3b 0a  kbPointZ (geo);.
a500: 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61  ..break;..    ca
a510: 73 65 20 47 41 49 41 5f 50 4f 49 4e 54 4d 3a 0a  se GAIA_POINTM:.
a520: 09 09 50 61 72 73 65 57 6b 62 50 6f 69 6e 74 4d  ..ParseWkbPointM
a530: 20 28 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b 3b   (geo);...break;
a540: 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f  ..    case GAIA_
a550: 50 4f 49 4e 54 5a 4d 3a 0a 09 09 50 61 72 73 65  POINTZM:...Parse
a560: 57 6b 62 50 6f 69 6e 74 5a 4d 20 28 67 65 6f 29  WkbPointZM (geo)
a570: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
a580: 63 61 73 65 20 47 41 49 41 5f 4c 49 4e 45 53 54  case GAIA_LINEST
a590: 52 49 4e 47 3a 0a 09 09 50 61 72 73 65 57 6b 62  RING:...ParseWkb
a5a0: 4c 69 6e 65 20 28 67 65 6f 29 3b 0a 09 09 62 72  Line (geo);...br
a5b0: 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47  eak;..    case G
a5c0: 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 3a  AIA_LINESTRINGZ:
a5d0: 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f  ..    case GAIA_
a5e0: 47 45 4f 53 57 4b 42 5f 4c 49 4e 45 53 54 52 49  GEOSWKB_LINESTRI
a5f0: 4e 47 5a 3a 0a 09 09 50 61 72 73 65 57 6b 62 4c  NGZ:...ParseWkbL
a600: 69 6e 65 5a 20 28 67 65 6f 29 3b 0a 09 09 62 72  ineZ (geo);...br
a610: 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47  eak;..    case G
a620: 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 4d 3a  AIA_LINESTRINGM:
a630: 0a 09 09 50 61 72 73 65 57 6b 62 4c 69 6e 65 4d  ...ParseWkbLineM
a640: 20 28 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b 3b   (geo);...break;
a650: 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f  ..    case GAIA_
a660: 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 3a 0a 09 09  LINESTRINGZM:...
a670: 50 61 72 73 65 57 6b 62 4c 69 6e 65 5a 4d 20 28  ParseWkbLineZM (
a680: 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09  geo);...break;..
a690: 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f      case GAIA_PO
a6a0: 4c 59 47 4f 4e 3a 0a 09 09 50 61 72 73 65 57 6b  LYGON:...ParseWk
a6b0: 62 50 6f 6c 79 67 6f 6e 20 28 67 65 6f 29 3b 0a  bPolygon (geo);.
a6c0: 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61  ..break;..    ca
a6d0: 73 65 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a  se GAIA_POLYGONZ
a6e0: 3a 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  :..    case GAIA
a6f0: 5f 47 45 4f 53 57 4b 42 5f 50 4f 4c 59 47 4f 4e  _GEOSWKB_POLYGON
a700: 5a 3a 0a 09 09 50 61 72 73 65 57 6b 62 50 6f 6c  Z:...ParseWkbPol
a710: 79 67 6f 6e 5a 20 28 67 65 6f 29 3b 0a 09 09 62  ygonZ (geo);...b
a720: 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20  reak;..    case 
a730: 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 4d 3a 0a 09  GAIA_POLYGONM:..
a740: 09 50 61 72 73 65 57 6b 62 50 6f 6c 79 67 6f 6e  .ParseWkbPolygon
a750: 4d 20 28 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b  M (geo);...break
a760: 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ;..    case GAIA
a770: 5f 50 4f 4c 59 47 4f 4e 5a 4d 3a 0a 09 09 50 61  _POLYGONZM:...Pa
a780: 72 73 65 57 6b 62 50 6f 6c 79 67 6f 6e 5a 4d 20  rseWkbPolygonZM 
a790: 28 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b 3b 0a  (geo);...break;.
a7a0: 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d  .    case GAIA_M
a7b0: 55 4c 54 49 50 4f 49 4e 54 3a 0a 09 09 50 61 72  ULTIPOINT:...Par
a7c0: 73 65 57 6b 62 4d 75 6c 74 69 50 6f 69 6e 74 20  seWkbMultiPoint 
a7d0: 28 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b 3b 0a  (geo);...break;.
a7e0: 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d  .    case GAIA_M
a7f0: 55 4c 54 49 50 4f 49 4e 54 5a 3a 0a 09 09 50 61  ULTIPOINTZ:...Pa
a800: 72 73 65 57 6b 62 4d 75 6c 74 69 50 6f 69 6e 74  rseWkbMultiPoint
a810: 5a 20 28 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b  Z (geo);...break
a820: 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ;..    case GAIA
a830: 5f 4d 55 4c 54 49 50 4f 49 4e 54 4d 3a 0a 09 09  _MULTIPOINTM:...
a840: 50 61 72 73 65 57 6b 62 4d 75 6c 74 69 50 6f 69  ParseWkbMultiPoi
a850: 6e 74 4d 20 28 67 65 6f 29 3b 0a 09 09 62 72 65  ntM (geo);...bre
a860: 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41  ak;..    case GA
a870: 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a 4d 3a  IA_MULTIPOINTZM:
a880: 0a 09 09 50 61 72 73 65 57 6b 62 4d 75 6c 74 69  ...ParseWkbMulti
a890: 50 6f 69 6e 74 5a 4d 20 28 67 65 6f 29 3b 0a 09  PointZM (geo);..
a8a0: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
a8b0: 65 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45  e GAIA_MULTILINE
a8c0: 53 54 52 49 4e 47 3a 0a 09 09 50 61 72 73 65 57  STRING:...ParseW
a8d0: 6b 62 4d 75 6c 74 69 4c 69 6e 65 20 28 67 65 6f  kbMultiLine (geo
a8e0: 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  );...break;..   
a8f0: 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49   case GAIA_MULTI
a900: 4c 49 4e 45 53 54 52 49 4e 47 5a 3a 0a 09 09 50  LINESTRINGZ:...P
a910: 61 72 73 65 57 6b 62 4d 75 6c 74 69 4c 69 6e 65  arseWkbMultiLine
a920: 5a 20 28 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b  Z (geo);...break
a930: 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ;..    case GAIA
a940: 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47  _MULTILINESTRING
a950: 4d 3a 0a 09 09 50 61 72 73 65 57 6b 62 4d 75 6c  M:...ParseWkbMul
a960: 74 69 4c 69 6e 65 4d 20 28 67 65 6f 29 3b 0a 09  tiLineM (geo);..
a970: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
a980: 65 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45  e GAIA_MULTILINE
a990: 53 54 52 49 4e 47 5a 4d 3a 0a 09 09 50 61 72 73  STRINGZM:...Pars
a9a0: 65 57 6b 62 4d 75 6c 74 69 4c 69 6e 65 5a 4d 20  eWkbMultiLineZM 
a9b0: 28 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b 3b 0a  (geo);...break;.
a9c0: 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d  .    case GAIA_M
a9d0: 55 4c 54 49 50 4f 4c 59 47 4f 4e 3a 0a 09 09 50  ULTIPOLYGON:...P
a9e0: 61 72 73 65 57 6b 62 4d 75 6c 74 69 50 6f 6c 79  arseWkbMultiPoly
a9f0: 67 6f 6e 20 28 67 65 6f 29 3b 0a 09 09 62 72 65  gon (geo);...bre
aa00: 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41  ak;..    case GA
aa10: 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a  IA_MULTIPOLYGONZ
aa20: 3a 0a 09 09 50 61 72 73 65 57 6b 62 4d 75 6c 74  :...ParseWkbMult
aa30: 69 50 6f 6c 79 67 6f 6e 5a 20 28 67 65 6f 29 3b  iPolygonZ (geo);
aa40: 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63  ...break;..    c
aa50: 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  ase GAIA_MULTIPO
aa60: 4c 59 47 4f 4e 4d 3a 0a 09 09 50 61 72 73 65 57  LYGONM:...ParseW
aa70: 6b 62 4d 75 6c 74 69 50 6f 6c 79 67 6f 6e 4d 20  kbMultiPolygonM 
aa80: 28 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b 3b 0a  (geo);...break;.
aa90: 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d  .    case GAIA_M
aaa0: 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a 4d 3a 0a 09  ULTIPOLYGONZM:..
aab0: 09 50 61 72 73 65 57 6b 62 4d 75 6c 74 69 50 6f  .ParseWkbMultiPo
aac0: 6c 79 67 6f 6e 5a 4d 20 28 67 65 6f 29 3b 0a 09  lygonZM (geo);..
aad0: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
aae0: 65 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43  e GAIA_GEOMETRYC
aaf0: 4f 4c 4c 45 43 54 49 4f 4e 3a 0a 09 09 50 61 72  OLLECTION:...Par
ab00: 73 65 57 6b 62 47 65 6f 6d 43 6f 6c 6c 20 28 67  seWkbGeomColl (g
ab10: 65 6f 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  eo);...break;.. 
ab20: 20 20 20 63 61 73 65 20 47 41 49 41 5f 47 45 4f     case GAIA_GEO
ab30: 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a  METRYCOLLECTIONZ
ab40: 3a 0a 09 09 50 61 72 73 65 57 6b 62 47 65 6f 6d  :...ParseWkbGeom
ab50: 43 6f 6c 6c 5a 20 28 67 65 6f 29 3b 0a 09 09 62  CollZ (geo);...b
ab60: 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20  reak;..    case 
ab70: 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
ab80: 4c 45 43 54 49 4f 4e 4d 3a 0a 09 09 50 61 72 73  LECTIONM:...Pars
ab90: 65 57 6b 62 47 65 6f 6d 43 6f 6c 6c 4d 20 28 67  eWkbGeomCollM (g
aba0: 65 6f 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  eo);...break;.. 
abb0: 20 20 20 63 61 73 65 20 47 41 49 41 5f 47 45 4f     case GAIA_GEO
abc0: 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a  METRYCOLLECTIONZ
abd0: 4d 3a 0a 09 09 50 61 72 73 65 57 6b 62 47 65 6f  M:...ParseWkbGeo
abe0: 6d 43 6f 6c 6c 5a 4d 20 28 67 65 6f 29 3b 0a 09  mCollZM (geo);..
abf0: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
ac00: 65 20 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45  e GAIA_COMPRESSE
ac10: 44 5f 4c 49 4e 45 53 54 52 49 4e 47 3a 0a 09 09  D_LINESTRING:...
ac20: 50 61 72 73 65 43 6f 6d 70 72 65 73 73 65 64 57  ParseCompressedW
ac30: 6b 62 4c 69 6e 65 20 28 67 65 6f 29 3b 0a 09 09  kbLine (geo);...
ac40: 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65  break;..    case
ac50: 20 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45 44   GAIA_COMPRESSED
ac60: 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 3a 0a 09 09  _LINESTRINGZ:...
ac70: 50 61 72 73 65 43 6f 6d 70 72 65 73 73 65 64 57  ParseCompressedW
ac80: 6b 62 4c 69 6e 65 5a 20 28 67 65 6f 29 3b 0a 09  kbLineZ (geo);..
ac90: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73  .break;..    cas
aca0: 65 20 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45  e GAIA_COMPRESSE
acb0: 44 5f 4c 49 4e 45 53 54 52 49 4e 47 4d 3a 0a 09  D_LINESTRINGM:..
acc0: 09 50 61 72 73 65 43 6f 6d 70 72 65 73 73 65 64  .ParseCompressed
acd0: 57 6b 62 4c 69 6e 65 4d 20 28 67 65 6f 29 3b 0a  WkbLineM (geo);.
ace0: 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61  ..break;..    ca
acf0: 73 65 20 47 41 49 41 5f 43 4f 4d 50 52 45 53 53  se GAIA_COMPRESS
ad00: 45 44 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 3a  ED_LINESTRINGZM:
ad10: 0a 09 09 50 61 72 73 65 43 6f 6d 70 72 65 73 73  ...ParseCompress
ad20: 65 64 57 6b 62 4c 69 6e 65 5a 4d 20 28 67 65 6f  edWkbLineZM (geo
ad30: 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  );...break;..   
ad40: 20 63 61 73 65 20 47 41 49 41 5f 43 4f 4d 50 52   case GAIA_COMPR
ad50: 45 53 53 45 44 5f 50 4f 4c 59 47 4f 4e 3a 0a 09  ESSED_POLYGON:..
ad60: 09 50 61 72 73 65 43 6f 6d 70 72 65 73 73 65 64  .ParseCompressed
ad70: 57 6b 62 50 6f 6c 79 67 6f 6e 20 28 67 65 6f 29  WkbPolygon (geo)
ad80: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
ad90: 63 61 73 65 20 47 41 49 41 5f 43 4f 4d 50 52 45  case GAIA_COMPRE
ada0: 53 53 45 44 5f 50 4f 4c 59 47 4f 4e 5a 3a 0a 09  SSED_POLYGONZ:..
adb0: 09 50 61 72 73 65 43 6f 6d 70 72 65 73 73 65 64  .ParseCompressed
adc0: 57 6b 62 50 6f 6c 79 67 6f 6e 5a 20 28 67 65 6f  WkbPolygonZ (geo
add0: 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  );...break;..   
ade0: 20 63 61 73 65 20 47 41 49 41 5f 43 4f 4d 50 52   case GAIA_COMPR
adf0: 45 53 53 45 44 5f 50 4f 4c 59 47 4f 4e 4d 3a 0a  ESSED_POLYGONM:.
ae00: 09 09 50 61 72 73 65 43 6f 6d 70 72 65 73 73 65  ..ParseCompresse
ae10: 64 57 6b 62 50 6f 6c 79 67 6f 6e 4d 20 28 67 65  dWkbPolygonM (ge
ae20: 6f 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20  o);...break;..  
ae30: 20 20 63 61 73 65 20 47 41 49 41 5f 43 4f 4d 50    case GAIA_COMP
ae40: 52 45 53 53 45 44 5f 50 4f 4c 59 47 4f 4e 5a 4d  RESSED_POLYGONZM
ae50: 3a 0a 09 09 50 61 72 73 65 43 6f 6d 70 72 65 73  :...ParseCompres
ae60: 73 65 64 57 6b 62 50 6f 6c 79 67 6f 6e 5a 4d 20  sedWkbPolygonZM 
ae70: 28 67 65 6f 29 3b 0a 09 09 62 72 65 61 6b 3b 0a  (geo);...break;.
ae80: 09 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 09  .    default:...
ae90: 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 3b 0a 20  break;..    };. 
aea0: 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63       }.}..static
aeb0: 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
aec0: 0a 64 6f 50 61 72 73 65 54 69 6e 79 50 6f 69 6e  .doParseTinyPoin
aed0: 74 42 6c 6f 62 20 28 63 6f 6e 73 74 20 75 6e 73  tBlob (const uns
aee0: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62  igned char *blob
aef0: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 73  , unsigned int s
af00: 69 7a 65 29 0a 7b 0a 2f 2a 20 64 65 63 6f 64 69  ize).{./* decodi
af10: 6e 67 20 66 72 6f 6d 20 53 70 61 74 69 61 4c 69  ng from SpatiaLi
af20: 74 65 20 54 69 6e 79 50 6f 69 6e 74 20 42 4c 4f  te TinyPoint BLO
af30: 42 20 74 6f 20 47 45 4f 4d 45 54 52 59 20 2a 2f  B to GEOMETRY */
af40: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
af50: 61 72 20 70 6f 69 6e 74 54 79 70 65 3b 0a 20 20  ar pointType;.  
af60: 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 20 20    int type;.    
af70: 69 6e 74 20 6c 69 74 74 6c 65 5f 65 6e 64 69 61  int little_endia
af80: 6e 3b 0a 20 20 20 20 69 6e 74 20 65 6e 64 69 61  n;.    int endia
af90: 6e 5f 61 72 63 68 20 3d 20 67 61 69 61 45 6e 64  n_arch = gaiaEnd
afa0: 69 61 6e 41 72 63 68 20 28 29 3b 0a 20 20 20 20  ianArch ();.    
afb0: 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
afc0: 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20  geo = NULL;..   
afd0: 20 69 66 20 28 73 69 7a 65 20 3c 20 32 34 29 0a   if (size < 24).
afe0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 09 09 2f  .return NULL;../
aff0: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 69  * cannot be an i
b000: 6e 74 65 72 6e 61 6c 20 42 4c 4f 42 20 54 69 6e  nternal BLOB Tin
b010: 79 50 6f 69 6e 74 20 67 65 6f 6d 65 74 72 79 20  yPoint geometry 
b020: 2a 2f 0a 20 20 20 20 69 66 20 28 2a 28 62 6c 6f  */.    if (*(blo
b030: 62 20 2b 20 30 29 20 21 3d 20 47 41 49 41 5f 4d  b + 0) != GAIA_M
b040: 41 52 4b 5f 53 54 41 52 54 29 0a 09 72 65 74 75  ARK_START)..retu
b050: 72 6e 20 4e 55 4c 4c 3b 09 09 2f 2a 20 66 61 69  rn NULL;../* fai
b060: 6c 65 64 20 74 6f 20 72 65 63 6f 67 6e 69 7a 65  led to recognize
b070: 20 53 54 41 52 54 20 73 69 67 6e 61 74 75 72 65   START signature
b080: 20 2a 2f 0a 20 20 20 20 69 66 20 28 2a 28 62 6c   */.    if (*(bl
b090: 6f 62 20 2b 20 28 73 69 7a 65 20 2d 20 31 29 29  ob + (size - 1))
b0a0: 20 21 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 45 4e   != GAIA_MARK_EN
b0b0: 44 29 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  D)..return NULL;
b0c0: 09 09 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 72  ../* failed to r
b0d0: 65 63 6f 67 6e 69 7a 65 20 45 4e 44 20 73 69 67  ecognize END sig
b0e0: 6e 61 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 66  nature */.    if
b0f0: 20 28 2a 28 62 6c 6f 62 20 2b 20 31 29 20 3d 3d   (*(blob + 1) ==
b100: 20 47 41 49 41 5f 54 49 4e 59 50 4f 49 4e 54 5f   GAIA_TINYPOINT_
b110: 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 29 0a 09  LITTLE_ENDIAN)..
b120: 6c 69 74 74 6c 65 5f 65 6e 64 69 61 6e 20 3d 20  little_endian = 
b130: 31 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28  1;.    else if (
b140: 2a 28 62 6c 6f 62 20 2b 20 31 29 20 3d 3d 20 47  *(blob + 1) == G
b150: 41 49 41 5f 54 49 4e 59 50 4f 49 4e 54 5f 42 49  AIA_TINYPOINT_BI
b160: 47 5f 45 4e 44 49 41 4e 29 0a 09 6c 69 74 74 6c  G_ENDIAN)..littl
b170: 65 5f 65 6e 64 69 61 6e 20 3d 20 30 3b 0a 20 20  e_endian = 0;.  
b180: 20 20 65 6c 73 65 0a 09 72 65 74 75 72 6e 20 4e    else..return N
b190: 55 4c 4c 3b 09 09 2f 2a 20 75 6e 6b 6e 6f 77 6e  ULL;../* unknown
b1a0: 20 65 6e 63 6f 64 69 6e 67 3b 20 6e 6f 72 20 6c   encoding; nor l
b1b0: 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 6e 65 69  ittle-endian nei
b1c0: 74 68 65 72 20 62 69 67 2d 65 6e 64 69 61 6e 20  ther big-endian 
b1d0: 2a 2f 0a 0a 20 20 20 20 70 6f 69 6e 74 54 79 70  */..    pointTyp
b1e0: 65 20 3d 20 2a 28 62 6c 6f 62 20 2b 20 36 29 3b  e = *(blob + 6);
b1f0: 0a 20 20 20 20 67 65 6f 20 3d 20 67 61 69 61 41  .    geo = gaiaA
b200: 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 20 28 29 3b  llocGeomColl ();
b210: 0a 20 20 20 20 67 65 6f 2d 3e 53 72 69 64 20 3d  .    geo->Srid =
b220: 20 67 61 69 61 49 6d 70 6f 72 74 33 32 20 28 62   gaiaImport32 (b
b230: 6c 6f 62 20 2b 20 32 2c 20 6c 69 74 74 6c 65 5f  lob + 2, little_
b240: 65 6e 64 69 61 6e 2c 20 65 6e 64 69 61 6e 5f 61  endian, endian_a
b250: 72 63 68 29 3b 0a 20 20 20 20 67 65 6f 2d 3e 65  rch);.    geo->e
b260: 6e 64 69 61 6e 5f 61 72 63 68 20 3d 20 28 63 68  ndian_arch = (ch
b270: 61 72 29 20 65 6e 64 69 61 6e 5f 61 72 63 68 3b  ar) endian_arch;
b280: 0a 20 20 20 20 67 65 6f 2d 3e 65 6e 64 69 61 6e  .    geo->endian
b290: 20 3d 20 28 63 68 61 72 29 20 6c 69 74 74 6c 65   = (char) little
b2a0: 5f 65 6e 64 69 61 6e 3b 0a 20 20 20 20 67 65 6f  _endian;.    geo
b2b0: 2d 3e 62 6c 6f 62 20 3d 20 62 6c 6f 62 3b 0a 20  ->blob = blob;. 
b2c0: 20 20 20 67 65 6f 2d 3e 73 69 7a 65 20 3d 20 73     geo->size = s
b2d0: 69 7a 65 3b 0a 20 20 20 20 67 65 6f 2d 3e 6f 66  ize;.    geo->of
b2e0: 66 73 65 74 20 3d 20 37 3b 0a 20 20 20 20 73 77  fset = 7;.    sw
b2f0: 69 74 63 68 20 28 70 6f 69 6e 74 54 79 70 65 29  itch (pointType)
b300: 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 73  .      {..  /* s
b310: 65 74 74 69 6e 67 20 75 70 20 44 69 6d 65 6e 73  etting up Dimens
b320: 69 6f 6e 4d 6f 64 65 6c 20 2a 2f 0a 20 20 20 20  ionModel */.    
b330: 20 20 63 61 73 65 20 47 41 49 41 5f 54 49 4e 59    case GAIA_TINY
b340: 50 4f 49 4e 54 5f 58 59 5a 3a 0a 09 20 20 74 79  POINT_XYZ:..  ty
b350: 70 65 20 3d 20 47 41 49 41 5f 50 4f 49 4e 54 5a  pe = GAIA_POINTZ
b360: 3b 0a 09 20 20 67 65 6f 2d 3e 44 69 6d 65 6e 73  ;..  geo->Dimens
b370: 69 6f 6e 4d 6f 64 65 6c 20 3d 20 47 41 49 41 5f  ionModel = GAIA_
b380: 58 59 5f 5a 3b 0a 09 20 20 62 72 65 61 6b 3b 0a  XY_Z;..  break;.
b390: 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
b3a0: 54 49 4e 59 50 4f 49 4e 54 5f 58 59 4d 3a 0a 09  TINYPOINT_XYM:..
b3b0: 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f 50 4f    type = GAIA_PO
b3c0: 49 4e 54 4d 3b 0a 09 20 20 67 65 6f 2d 3e 44 69  INTM;..  geo->Di
b3d0: 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 20 47  mensionModel = G
b3e0: 41 49 41 5f 58 59 5f 4d 3b 0a 09 20 20 62 72 65  AIA_XY_M;..  bre
b3f0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47  ak;.      case G
b400: 41 49 41 5f 54 49 4e 59 50 4f 49 4e 54 5f 58 59  AIA_TINYPOINT_XY
b410: 5a 4d 3a 0a 09 20 20 74 79 70 65 20 3d 20 47 41  ZM:..  type = GA
b420: 49 41 5f 50 4f 49 4e 54 5a 4d 3b 0a 09 20 20 67  IA_POINTZM;..  g
b430: 65 6f 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  eo->DimensionMod
b440: 65 6c 20 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  el = GAIA_XY_Z_M
b450: 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;..  break;.    
b460: 20 20 64 65 66 61 75 6c 74 3a 0a 09 20 20 74 79    default:..  ty
b470: 70 65 20 3d 20 47 41 49 41 5f 50 4f 49 4e 54 3b  pe = GAIA_POINT;
b480: 0a 09 20 20 67 65 6f 2d 3e 44 69 6d 65 6e 73 69  ..  geo->Dimensi
b490: 6f 6e 4d 6f 64 65 6c 20 3d 20 47 41 49 41 5f 58  onModel = GAIA_X
b4a0: 59 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  Y;..  break;.   
b4b0: 20 20 20 7d 3b 0a 20 20 20 20 73 77 69 74 63 68     };.    switch
b4c0: 20 28 74 79 70 65 29 0a 20 20 20 20 20 20 7b 0a   (type).      {.
b4d0: 09 20 20 2f 2a 20 70 61 72 73 69 6e 67 20 65 6c  .  /* parsing el
b4e0: 65 6d 65 6e 74 61 72 79 20 67 65 6f 6d 65 74 72  ementary geometr
b4f0: 69 65 73 20 2a 2f 0a 20 20 20 20 20 20 63 61 73  ies */.      cas
b500: 65 20 47 41 49 41 5f 50 4f 49 4e 54 3a 0a 09 20  e GAIA_POINT:.. 
b510: 20 50 61 72 73 65 57 6b 62 50 6f 69 6e 74 20 28   ParseWkbPoint (
b520: 67 65 6f 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a  geo);..  break;.
b530: 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
b540: 50 4f 49 4e 54 5a 3a 0a 09 20 20 50 61 72 73 65  POINTZ:..  Parse
b550: 57 6b 62 50 6f 69 6e 74 5a 20 28 67 65 6f 29 3b  WkbPointZ (geo);
b560: 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
b570: 20 63 61 73 65 20 47 41 49 41 5f 50 4f 49 4e 54   case GAIA_POINT
b580: 4d 3a 0a 09 20 20 50 61 72 73 65 57 6b 62 50 6f  M:..  ParseWkbPo
b590: 69 6e 74 4d 20 28 67 65 6f 29 3b 0a 09 20 20 62  intM (geo);..  b
b5a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b5b0: 20 47 41 49 41 5f 50 4f 49 4e 54 5a 4d 3a 0a 09   GAIA_POINTZM:..
b5c0: 20 20 50 61 72 73 65 57 6b 62 50 6f 69 6e 74 5a    ParseWkbPointZ
b5d0: 4d 20 28 67 65 6f 29 3b 0a 09 20 20 62 72 65 61  M (geo);..  brea
b5e0: 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  k;.      default
b5f0: 3a 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  :..  break;.    
b600: 20 20 7d 3b 0a 20 20 20 20 67 65 6f 2d 3e 4d 69    };.    geo->Mi
b610: 6e 58 20 3d 20 67 65 6f 2d 3e 46 69 72 73 74 50  nX = geo->FirstP
b620: 6f 69 6e 74 2d 3e 58 3b 0a 20 20 20 20 67 65 6f  oint->X;.    geo
b630: 2d 3e 4d 69 6e 59 20 3d 20 67 65 6f 2d 3e 46 69  ->MinY = geo->Fi
b640: 72 73 74 50 6f 69 6e 74 2d 3e 59 3b 0a 20 20 20  rstPoint->Y;.   
b650: 20 67 65 6f 2d 3e 4d 61 78 58 20 3d 20 67 65 6f   geo->MaxX = geo
b660: 2d 3e 46 69 72 73 74 50 6f 69 6e 74 2d 3e 58 3b  ->FirstPoint->X;
b670: 0a 20 20 20 20 67 65 6f 2d 3e 4d 61 78 59 20 3d  .    geo->MaxY =
b680: 20 67 65 6f 2d 3e 46 69 72 73 74 50 6f 69 6e 74   geo->FirstPoint
b690: 2d 3e 59 3b 0a 20 20 20 20 67 65 6f 2d 3e 44 65  ->Y;.    geo->De
b6a0: 63 6c 61 72 65 64 54 79 70 65 20 3d 20 47 41 49  claredType = GAI
b6b0: 41 5f 50 4f 49 4e 54 3b 0a 20 20 20 20 72 65 74  A_POINT;.    ret
b6c0: 75 72 6e 20 67 65 6f 3b 0a 7d 0a 0a 47 41 49 41  urn geo;.}..GAIA
b6d0: 47 45 4f 5f 44 45 43 4c 41 52 45 20 67 61 69 61  GEO_DECLARE gaia
b6e0: 47 65 6f 6d 43 6f 6c 6c 50 74 72 0a 67 61 69 61  GeomCollPtr.gaia
b6f0: 46 72 6f 6d 53 70 61 74 69 61 4c 69 74 65 42 6c  FromSpatiaLiteBl
b700: 6f 62 57 6b 62 45 78 20 28 63 6f 6e 73 74 20 75  obWkbEx (const u
b710: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 6c  nsigned char *bl
b720: 6f 62 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ob, unsigned int
b730: 20 73 69 7a 65 2c 0a 09 09 09 20 20 20 20 20 69   size,....     i
b740: 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 2c 20 69 6e  nt gpkg_mode, in
b750: 74 20 67 70 6b 67 5f 61 6d 70 68 69 62 69 6f 75  t gpkg_amphibiou
b760: 73 29 0a 7b 0a 2f 2a 20 64 65 63 6f 64 69 6e 67  s).{./* decoding
b770: 20 66 72 6f 6d 20 53 70 61 74 69 61 4c 69 74 65   from SpatiaLite
b780: 20 42 4c 4f 42 20 74 6f 20 47 45 4f 4d 45 54 52   BLOB to GEOMETR
b790: 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 79 70  Y */.    int typ
b7a0: 65 3b 0a 20 20 20 20 69 6e 74 20 6c 69 74 74 6c  e;.    int littl
b7b0: 65 5f 65 6e 64 69 61 6e 3b 0a 20 20 20 20 69 6e  e_endian;.    in
b7c0: 74 20 65 6e 64 69 61 6e 5f 61 72 63 68 20 3d 20  t endian_arch = 
b7d0: 67 61 69 61 45 6e 64 69 61 6e 41 72 63 68 20 28  gaiaEndianArch (
b7e0: 29 3b 0a 20 20 20 20 67 61 69 61 47 65 6f 6d 43  );.    gaiaGeomC
b7f0: 6f 6c 6c 50 74 72 20 67 65 6f 20 3d 20 4e 55 4c  ollPtr geo = NUL
b800: 4c 3b 0a 0a 20 20 20 20 69 66 20 28 67 70 6b 67  L;..    if (gpkg
b810: 5f 61 6d 70 68 69 62 69 6f 75 73 20 7c 7c 20 67  _amphibious || g
b820: 70 6b 67 5f 6d 6f 64 65 29 0a 20 20 20 20 20 20  pkg_mode).      
b830: 7b 0a 23 69 66 64 65 66 20 45 4e 41 42 4c 45 5f  {.#ifdef ENABLE_
b840: 47 45 4f 50 41 43 4b 41 47 45 09 2f 2a 20 47 45  GEOPACKAGE./* GE
b850: 4f 50 41 43 4b 41 47 45 20 65 6e 61 62 6c 65 64  OPACKAGE enabled
b860: 3a 20 73 75 70 70 6f 72 74 69 6e 67 20 47 50 4b  : supporting GPK
b870: 47 20 67 65 6f 6d 65 74 72 69 65 73 20 2a 2f 0a  G geometries */.
b880: 09 20 20 69 66 20 28 67 61 69 61 49 73 56 61 6c  .  if (gaiaIsVal
b890: 69 64 47 50 42 20 28 62 6c 6f 62 2c 20 73 69 7a  idGPB (blob, siz
b8a0: 65 29 29 0a 09 20 20 20 20 7b 0a 09 09 67 65 6f  e))..    {...geo
b8b0: 20 3d 20 67 61 69 61 46 72 6f 6d 47 65 6f 50 61   = gaiaFromGeoPa
b8c0: 63 6b 61 67 65 47 65 6f 6d 65 74 72 79 42 6c 6f  ckageGeometryBlo
b8d0: 62 20 28 62 6c 6f 62 2c 20 73 69 7a 65 29 3b 0a  b (blob, size);.
b8e0: 09 09 69 66 20 28 67 65 6f 20 21 3d 20 4e 55 4c  ..if (geo != NUL
b8f0: 4c 29 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20  L)...    return 
b900: 67 65 6f 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69  geo;..    }..  i
b910: 66 20 28 67 70 6b 67 5f 6d 6f 64 65 29 0a 09 20  f (gpkg_mode).. 
b920: 20 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c       return NULL
b930: 3b 09 2f 2a 20 6d 75 73 74 20 61 63 63 65 70 74  ;./* must accept
b940: 20 6f 6e 6c 79 20 47 50 4b 47 20 67 65 6f 6d 65   only GPKG geome
b950: 74 72 69 65 73 20 2a 2f 0a 23 65 6c 73 65 0a 09  tries */.#else..
b960: 20 20 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 65 6e    ;.#endif /* en
b970: 64 20 47 45 4f 50 41 43 4b 41 47 45 3a 20 73 75  d GEOPACKAGE: su
b980: 70 70 6f 72 74 69 6e 67 20 47 50 4b 47 20 67 65  pporting GPKG ge
b990: 6f 6d 65 74 72 69 65 73 20 2a 2f 0a 20 20 20 20  ometries */.    
b9a0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 69 7a    }..    if (siz
b9b0: 65 20 3d 3d 20 32 34 20 7c 7c 20 73 69 7a 65 20  e == 24 || size 
b9c0: 3d 3d 20 33 32 20 7c 7c 20 73 69 7a 65 20 3d 3d  == 32 || size ==
b9d0: 20 34 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20   40).      {..  
b9e0: 2f 2a 20 74 65 73 74 69 6e 67 20 66 6f 72 20 61  /* testing for a
b9f0: 20 70 6f 73 73 69 62 6c 65 20 54 69 6e 79 50 6f   possible TinyPo
ba00: 69 6e 74 20 42 4c 4f 42 20 2a 2f 0a 09 20 20 69  int BLOB */..  i
ba10: 66 20 28 2a 28 62 6c 6f 62 20 2b 20 30 29 20 3d  f (*(blob + 0) =
ba20: 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 53 54 41 52  = GAIA_MARK_STAR
ba30: 54 20 26 26 0a 09 20 20 20 20 20 20 28 2a 28 62  T &&..      (*(b
ba40: 6c 6f 62 20 2b 20 31 29 20 3d 3d 20 47 41 49 41  lob + 1) == GAIA
ba50: 5f 54 49 4e 59 50 4f 49 4e 54 5f 4c 49 54 54 4c  _TINYPOINT_LITTL
ba60: 45 5f 45 4e 44 49 41 4e 0a 09 20 20 20 20 20 20  E_ENDIAN..      
ba70: 20 7c 7c 20 2a 28 62 6c 6f 62 20 2b 20 31 29 20   || *(blob + 1) 
ba80: 3d 3d 20 47 41 49 41 5f 54 49 4e 59 50 4f 49 4e  == GAIA_TINYPOIN
ba90: 54 5f 42 49 47 5f 45 4e 44 49 41 4e 29 0a 09 20  T_BIG_ENDIAN).. 
baa0: 20 20 20 20 20 26 26 20 2a 28 62 6c 6f 62 20 2b       && *(blob +
bab0: 20 28 73 69 7a 65 20 2d 20 31 29 29 20 3d 3d 20   (size - 1)) == 
bac0: 47 41 49 41 5f 4d 41 52 4b 5f 45 4e 44 29 0a 09  GAIA_MARK_END)..
bad0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 64 6f 50        return doP
bae0: 61 72 73 65 54 69 6e 79 50 6f 69 6e 74 42 6c 6f  arseTinyPointBlo
baf0: 62 20 28 62 6c 6f 62 2c 20 73 69 7a 65 29 3b 0a  b (blob, size);.
bb00: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20        }..    if 
bb10: 28 73 69 7a 65 20 3c 20 34 35 29 0a 09 72 65 74  (size < 45)..ret
bb20: 75 72 6e 20 4e 55 4c 4c 3b 09 09 2f 2a 20 63 61  urn NULL;../* ca
bb30: 6e 6e 6f 74 20 62 65 20 61 6e 20 69 6e 74 65 72  nnot be an inter
bb40: 6e 61 6c 20 42 4c 4f 42 20 57 4b 42 20 67 65 6f  nal BLOB WKB geo
bb50: 6d 65 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 20  metry */.    if 
bb60: 28 2a 28 62 6c 6f 62 20 2b 20 30 29 20 21 3d 20  (*(blob + 0) != 
bb70: 47 41 49 41 5f 4d 41 52 4b 5f 53 54 41 52 54 29  GAIA_MARK_START)
bb80: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 09 09  ..return NULL;..
bb90: 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 63  /* failed to rec
bba0: 6f 67 6e 69 7a 65 20 53 54 41 52 54 20 73 69 67  ognize START sig
bbb0: 6e 61 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 66  nature */.    if
bbc0: 20 28 2a 28 62 6c 6f 62 20 2b 20 28 73 69 7a 65   (*(blob + (size
bbd0: 20 2d 20 31 29 29 20 21 3d 20 47 41 49 41 5f 4d   - 1)) != GAIA_M
bbe0: 41 52 4b 5f 45 4e 44 29 0a 09 72 65 74 75 72 6e  ARK_END)..return
bbf0: 20 4e 55 4c 4c 3b 09 09 2f 2a 20 66 61 69 6c 65   NULL;../* faile
bc00: 64 20 74 6f 20 72 65 63 6f 67 6e 69 7a 65 20 45  d to recognize E
bc10: 4e 44 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a  ND signature */.
bc20: 20 20 20 20 69 66 20 28 2a 28 62 6c 6f 62 20 2b      if (*(blob +
bc30: 20 33 38 29 20 21 3d 20 47 41 49 41 5f 4d 41 52   38) != GAIA_MAR
bc40: 4b 5f 4d 42 52 29 0a 09 72 65 74 75 72 6e 20 4e  K_MBR)..return N
bc50: 55 4c 4c 3b 09 09 2f 2a 20 66 61 69 6c 65 64 20  ULL;../* failed 
bc60: 74 6f 20 72 65 63 6f 67 6e 69 7a 65 20 4d 42 52  to recognize MBR
bc70: 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 20 20   signature */.  
bc80: 20 20 69 66 20 28 2a 28 62 6c 6f 62 20 2b 20 31    if (*(blob + 1
bc90: 29 20 3d 3d 20 47 41 49 41 5f 4c 49 54 54 4c 45  ) == GAIA_LITTLE
bca0: 5f 45 4e 44 49 41 4e 29 0a 09 6c 69 74 74 6c 65  _ENDIAN)..little
bcb0: 5f 65 6e 64 69 61 6e 20 3d 20 31 3b 0a 20 20 20  _endian = 1;.   
bcc0: 20 65 6c 73 65 20 69 66 20 28 2a 28 62 6c 6f 62   else if (*(blob
bcd0: 20 2b 20 31 29 20 3d 3d 20 47 41 49 41 5f 42 49   + 1) == GAIA_BI
bce0: 47 5f 45 4e 44 49 41 4e 29 0a 09 6c 69 74 74 6c  G_ENDIAN)..littl
bcf0: 65 5f 65 6e 64 69 61 6e 20 3d 20 30 3b 0a 20 20  e_endian = 0;.  
bd00: 20 20 65 6c 73 65 0a 09 72 65 74 75 72 6e 20 4e    else..return N
bd10: 55 4c 4c 3b 09 09 2f 2a 20 75 6e 6b 6e 6f 77 6e  ULL;../* unknown
bd20: 20 65 6e 63 6f 64 69 6e 67 3b 20 6e 6f 72 20 6c   encoding; nor l
bd30: 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 6e 65 69  ittle-endian nei
bd40: 74 68 65 72 20 62 69 67 2d 65 6e 64 69 61 6e 20  ther big-endian 
bd50: 2a 2f 0a 20 20 20 20 74 79 70 65 20 3d 20 67 61  */.    type = ga
bd60: 69 61 49 6d 70 6f 72 74 33 32 20 28 62 6c 6f 62  iaImport32 (blob
bd70: 20 2b 20 33 39 2c 20 6c 69 74 74 6c 65 5f 65 6e   + 39, little_en
bd80: 64 69 61 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63  dian, endian_arc
bd90: 68 29 3b 0a 20 20 20 20 67 65 6f 20 3d 20 67 61  h);.    geo = ga
bda0: 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 20  iaAllocGeomColl 
bdb0: 28 29 3b 0a 20 20 20 20 67 65 6f 2d 3e 53 72 69  ();.    geo->Sri
bdc0: 64 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 33 32  d = gaiaImport32
bdd0: 20 28 62 6c 6f 62 20 2b 20 32 2c 20 6c 69 74 74   (blob + 2, litt
bde0: 6c 65 5f 65 6e 64 69 61 6e 2c 20 65 6e 64 69 61  le_endian, endia
bdf0: 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20 67 65 6f  n_arch);.    geo
be00: 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68 20 3d 20  ->endian_arch = 
be10: 28 63 68 61 72 29 20 65 6e 64 69 61 6e 5f 61 72  (char) endian_ar
be20: 63 68 3b 0a 20 20 20 20 67 65 6f 2d 3e 65 6e 64  ch;.    geo->end
be30: 69 61 6e 20 3d 20 28 63 68 61 72 29 20 6c 69 74  ian = (char) lit
be40: 74 6c 65 5f 65 6e 64 69 61 6e 3b 0a 20 20 20 20  tle_endian;.    
be50: 67 65 6f 2d 3e 62 6c 6f 62 20 3d 20 62 6c 6f 62  geo->blob = blob
be60: 3b 0a 20 20 20 20 67 65 6f 2d 3e 73 69 7a 65 20  ;.    geo->size 
be70: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 67 65 6f 2d  = size;.    geo-
be80: 3e 6f 66 66 73 65 74 20 3d 20 34 33 3b 0a 20 20  >offset = 43;.  
be90: 20 20 73 77 69 74 63 68 20 28 74 79 70 65 29 0a    switch (type).
bea0: 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 73 65        {..  /* se
beb0: 74 74 69 6e 67 20 75 70 20 44 69 6d 65 6e 73 69  tting up Dimensi
bec0: 6f 6e 4d 6f 64 65 6c 20 2a 2f 0a 20 20 20 20 20  onModel */.     
bed0: 20 63 61 73 65 20 47 41 49 41 5f 50 4f 49 4e 54   case GAIA_POINT
bee0: 5a 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47 41  Z:.      case GA
bef0: 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 3a 0a  IA_LINESTRINGZ:.
bf00: 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
bf10: 50 4f 4c 59 47 4f 4e 5a 3a 0a 20 20 20 20 20 20  POLYGONZ:.      
bf20: 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50  case GAIA_MULTIP
bf30: 4f 49 4e 54 5a 3a 0a 20 20 20 20 20 20 63 61 73  OINTZ:.      cas
bf40: 65 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45  e GAIA_MULTILINE
bf50: 53 54 52 49 4e 47 5a 3a 0a 20 20 20 20 20 20 63  STRINGZ:.      c
bf60: 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  ase GAIA_MULTIPO
bf70: 4c 59 47 4f 4e 5a 3a 0a 20 20 20 20 20 20 63 61  LYGONZ:.      ca
bf80: 73 65 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59  se GAIA_GEOMETRY
bf90: 43 4f 4c 4c 45 43 54 49 4f 4e 5a 3a 0a 20 20 20  COLLECTIONZ:.   
bfa0: 20 20 20 63 61 73 65 20 47 41 49 41 5f 43 4f 4d     case GAIA_COM
bfb0: 50 52 45 53 53 45 44 5f 4c 49 4e 45 53 54 52 49  PRESSED_LINESTRI
bfc0: 4e 47 5a 3a 0a 20 20 20 20 20 20 63 61 73 65 20  NGZ:.      case 
bfd0: 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45 44 5f  GAIA_COMPRESSED_
bfe0: 50 4f 4c 59 47 4f 4e 5a 3a 0a 09 20 20 67 65 6f  POLYGONZ:..  geo
bff0: 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
c000: 20 3d 20 47 41 49 41 5f 58 59 5f 5a 3b 0a 09 20   = GAIA_XY_Z;.. 
c010: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c020: 73 65 20 47 41 49 41 5f 50 4f 49 4e 54 4d 3a 0a  se GAIA_POINTM:.
c030: 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
c040: 4c 49 4e 45 53 54 52 49 4e 47 4d 3a 0a 20 20 20  LINESTRINGM:.   
c050: 20 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f 4c     case GAIA_POL
c060: 59 47 4f 4e 4d 3a 0a 20 20 20 20 20 20 63 61 73  YGONM:.      cas
c070: 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e  e GAIA_MULTIPOIN
c080: 54 4d 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47  TM:.      case G
c090: 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52  AIA_MULTILINESTR
c0a0: 49 4e 47 4d 3a 0a 20 20 20 20 20 20 63 61 73 65  INGM:.      case
c0b0: 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47   GAIA_MULTIPOLYG
c0c0: 4f 4e 4d 3a 0a 20 20 20 20 20 20 63 61 73 65 20  ONM:.      case 
c0d0: 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
c0e0: 4c 45 43 54 49 4f 4e 4d 3a 0a 20 20 20 20 20 20  LECTIONM:.      
c0f0: 63 61 73 65 20 47 41 49 41 5f 43 4f 4d 50 52 45  case GAIA_COMPRE
c100: 53 53 45 44 5f 4c 49 4e 45 53 54 52 49 4e 47 4d  SSED_LINESTRINGM
c110: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  :.      case GAI
c120: 41 5f 43 4f 4d 50 52 45 53 53 45 44 5f 50 4f 4c  A_COMPRESSED_POL
c130: 59 47 4f 4e 4d 3a 0a 09 20 20 67 65 6f 2d 3e 44  YGONM:..  geo->D
c140: 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 20  imensionModel = 
c150: 47 41 49 41 5f 58 59 5f 4d 3b 0a 09 20 20 62 72  GAIA_XY_M;..  br
c160: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c170: 47 41 49 41 5f 50 4f 49 4e 54 5a 4d 3a 0a 20 20  GAIA_POINTZM:.  
c180: 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4c 49      case GAIA_LI
c190: 4e 45 53 54 52 49 4e 47 5a 4d 3a 0a 20 20 20 20  NESTRINGZM:.    
c1a0: 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f 4c 59    case GAIA_POLY
c1b0: 47 4f 4e 5a 4d 3a 0a 20 20 20 20 20 20 63 61 73  GONZM:.      cas
c1c0: 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e  e GAIA_MULTIPOIN
c1d0: 54 5a 4d 3a 0a 20 20 20 20 20 20 63 61 73 65 20  TZM:.      case 
c1e0: 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54  GAIA_MULTILINEST
c1f0: 52 49 4e 47 5a 4d 3a 0a 20 20 20 20 20 20 63 61  RINGZM:.      ca
c200: 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c  se GAIA_MULTIPOL
c210: 59 47 4f 4e 5a 4d 3a 0a 20 20 20 20 20 20 63 61  YGONZM:.      ca
c220: 73 65 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59  se GAIA_GEOMETRY
c230: 43 4f 4c 4c 45 43 54 49 4f 4e 5a 4d 3a 0a 20 20  COLLECTIONZM:.  
c240: 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 43 4f      case GAIA_CO
c250: 4d 50 52 45 53 53 45 44 5f 4c 49 4e 45 53 54 52  MPRESSED_LINESTR
c260: 49 4e 47 5a 4d 3a 0a 20 20 20 20 20 20 63 61 73  INGZM:.      cas
c270: 65 20 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45  e GAIA_COMPRESSE
c280: 44 5f 50 4f 4c 59 47 4f 4e 5a 4d 3a 0a 09 20 20  D_POLYGONZM:..  
c290: 67 65 6f 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  geo->DimensionMo
c2a0: 64 65 6c 20 3d 20 47 41 49 41 5f 58 59 5f 5a 5f  del = GAIA_XY_Z_
c2b0: 4d 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  M;..  break;.   
c2c0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 20 20 67     default:..  g
c2d0: 65 6f 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  eo->DimensionMod
c2e0: 65 6c 20 3d 20 47 41 49 41 5f 58 59 3b 0a 09 20  el = GAIA_XY;.. 
c2f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 3b   break;.      };
c300: 0a 20 20 20 20 73 77 69 74 63 68 20 28 74 79 70  .    switch (typ
c310: 65 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a  e).      {..  /*
c320: 20 70 61 72 73 69 6e 67 20 65 6c 65 6d 65 6e 74   parsing element
c330: 61 72 79 20 67 65 6f 6d 65 74 72 69 65 73 20 2a  ary geometries *
c340: 2f 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  /.      case GAI
c350: 41 5f 50 4f 49 4e 54 3a 0a 09 20 20 50 61 72 73  A_POINT:..  Pars
c360: 65 57 6b 62 50 6f 69 6e 74 20 28 67 65 6f 29 3b  eWkbPoint (geo);
c370: 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
c380: 20 63 61 73 65 20 47 41 49 41 5f 50 4f 49 4e 54   case GAIA_POINT
c390: 5a 3a 0a 09 20 20 50 61 72 73 65 57 6b 62 50 6f  Z:..  ParseWkbPo
c3a0: 69 6e 74 5a 20 28 67 65 6f 29 3b 0a 09 20 20 62  intZ (geo);..  b
c3b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c3c0: 20 47 41 49 41 5f 50 4f 49 4e 54 4d 3a 0a 09 20   GAIA_POINTM:.. 
c3d0: 20 50 61 72 73 65 57 6b 62 50 6f 69 6e 74 4d 20   ParseWkbPointM 
c3e0: 28 67 65 6f 29 3b 0a 09 20 20 62 72 65 61 6b 3b  (geo);..  break;
c3f0: 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41  .      case GAIA
c400: 5f 50 4f 49 4e 54 5a 4d 3a 0a 09 20 20 50 61 72  _POINTZM:..  Par
c410: 73 65 57 6b 62 50 6f 69 6e 74 5a 4d 20 28 67 65  seWkbPointZM (ge
c420: 6f 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20  o);..  break;.  
c430: 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4c 49      case GAIA_LI
c440: 4e 45 53 54 52 49 4e 47 3a 0a 09 20 20 50 61 72  NESTRING:..  Par
c450: 73 65 57 6b 62 4c 69 6e 65 20 28 67 65 6f 29 3b  seWkbLine (geo);
c460: 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
c470: 20 63 61 73 65 20 47 41 49 41 5f 4c 49 4e 45 53   case GAIA_LINES
c480: 54 52 49 4e 47 5a 3a 0a 09 20 20 50 61 72 73 65  TRINGZ:..  Parse
c490: 57 6b 62 4c 69 6e 65 5a 20 28 67 65 6f 29 3b 0a  WkbLineZ (geo);.
c4a0: 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
c4b0: 63 61 73 65 20 47 41 49 41 5f 4c 49 4e 45 53 54  case GAIA_LINEST
c4c0: 52 49 4e 47 4d 3a 0a 09 20 20 50 61 72 73 65 57  RINGM:..  ParseW
c4d0: 6b 62 4c 69 6e 65 4d 20 28 67 65 6f 29 3b 0a 09  kbLineM (geo);..
c4e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c4f0: 61 73 65 20 47 41 49 41 5f 4c 49 4e 45 53 54 52  ase GAIA_LINESTR
c500: 49 4e 47 5a 4d 3a 0a 09 20 20 50 61 72 73 65 57  INGZM:..  ParseW
c510: 6b 62 4c 69 6e 65 5a 4d 20 28 67 65 6f 29 3b 0a  kbLineZM (geo);.
c520: 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
c530: 63 61 73 65 20 47 41 49 41 5f 50 4f 4c 59 47 4f  case GAIA_POLYGO
c540: 4e 3a 0a 09 20 20 50 61 72 73 65 57 6b 62 50 6f  N:..  ParseWkbPo
c550: 6c 79 67 6f 6e 20 28 67 65 6f 29 3b 0a 09 20 20  lygon (geo);..  
c560: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c570: 65 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 3a  e GAIA_POLYGONZ:
c580: 0a 09 20 20 50 61 72 73 65 57 6b 62 50 6f 6c 79  ..  ParseWkbPoly
c590: 67 6f 6e 5a 20 28 67 65 6f 29 3b 0a 09 20 20 62  gonZ (geo);..  b
c5a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c5b0: 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 4d 3a 0a   GAIA_POLYGONM:.
c5c0: 09 20 20 50 61 72 73 65 57 6b 62 50 6f 6c 79 67  .  ParseWkbPolyg
c5d0: 6f 6e 4d 20 28 67 65 6f 29 3b 0a 09 20 20 62 72  onM (geo);..  br
c5e0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c5f0: 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 4d 3a 0a  GAIA_POLYGONZM:.
c600: 09 20 20 50 61 72 73 65 57 6b 62 50 6f 6c 79 67  .  ParseWkbPolyg
c610: 6f 6e 5a 4d 20 28 67 65 6f 29 3b 0a 09 20 20 62  onZM (geo);..  b
c620: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c630: 20 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45 44   GAIA_COMPRESSED
c640: 5f 4c 49 4e 45 53 54 52 49 4e 47 3a 0a 09 20 20  _LINESTRING:..  
c650: 50 61 72 73 65 43 6f 6d 70 72 65 73 73 65 64 57  ParseCompressedW
c660: 6b 62 4c 69 6e 65 20 28 67 65 6f 29 3b 0a 09 20  kbLine (geo);.. 
c670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c680: 73 65 20 47 41 49 41 5f 43 4f 4d 50 52 45 53 53  se GAIA_COMPRESS
c690: 45 44 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 3a 0a  ED_LINESTRINGZ:.
c6a0: 09 20 20 50 61 72 73 65 43 6f 6d 70 72 65 73 73  .  ParseCompress
c6b0: 65 64 57 6b 62 4c 69 6e 65 5a 20 28 67 65 6f 29  edWkbLineZ (geo)
c6c0: 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;..  break;.    
c6d0: 20 20 63 61 73 65 20 47 41 49 41 5f 43 4f 4d 50    case GAIA_COMP
c6e0: 52 45 53 53 45 44 5f 4c 49 4e 45 53 54 52 49 4e  RESSED_LINESTRIN
c6f0: 47 4d 3a 0a 09 20 20 50 61 72 73 65 43 6f 6d 70  GM:..  ParseComp
c700: 72 65 73 73 65 64 57 6b 62 4c 69 6e 65 4d 20 28  ressedWkbLineM (
c710: 67 65 6f 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a  geo);..  break;.
c720: 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
c730: 43 4f 4d 50 52 45 53 53 45 44 5f 4c 49 4e 45 53  COMPRESSED_LINES
c740: 54 52 49 4e 47 5a 4d 3a 0a 09 20 20 50 61 72 73  TRINGZM:..  Pars
c750: 65 43 6f 6d 70 72 65 73 73 65 64 57 6b 62 4c 69  eCompressedWkbLi
c760: 6e 65 5a 4d 20 28 67 65 6f 29 3b 0a 09 20 20 62  neZM (geo);..  b
c770: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c780: 20 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45 44   GAIA_COMPRESSED
c790: 5f 50 4f 4c 59 47 4f 4e 3a 0a 09 20 20 50 61 72  _POLYGON:..  Par
c7a0: 73 65 43 6f 6d 70 72 65 73 73 65 64 57 6b 62 50  seCompressedWkbP
c7b0: 6f 6c 79 67 6f 6e 20 28 67 65 6f 29 3b 0a 09 20  olygon (geo);.. 
c7c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c7d0: 73 65 20 47 41 49 41 5f 43 4f 4d 50 52 45 53 53  se GAIA_COMPRESS
c7e0: 45 44 5f 50 4f 4c 59 47 4f 4e 5a 3a 0a 09 20 20  ED_POLYGONZ:..  
c7f0: 50 61 72 73 65 43 6f 6d 70 72 65 73 73 65 64 57  ParseCompressedW
c800: 6b 62 50 6f 6c 79 67 6f 6e 5a 20 28 67 65 6f 29  kbPolygonZ (geo)
c810: 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;..  break;.    
c820: 20 20 63 61 73 65 20 47 41 49 41 5f 43 4f 4d 50    case GAIA_COMP
c830: 52 45 53 53 45 44 5f 50 4f 4c 59 47 4f 4e 4d 3a  RESSED_POLYGONM:
c840: 0a 09 20 20 50 61 72 73 65 43 6f 6d 70 72 65 73  ..  ParseCompres
c850: 73 65 64 57 6b 62 50 6f 6c 79 67 6f 6e 4d 20 28  sedWkbPolygonM (
c860: 67 65 6f 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a  geo);..  break;.
c870: 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
c880: 43 4f 4d 50 52 45 53 53 45 44 5f 50 4f 4c 59 47  COMPRESSED_POLYG
c890: 4f 4e 5a 4d 3a 0a 09 20 20 50 61 72 73 65 43 6f  ONZM:..  ParseCo
c8a0: 6d 70 72 65 73 73 65 64 57 6b 62 50 6f 6c 79 67  mpressedWkbPolyg
c8b0: 6f 6e 5a 4d 20 28 67 65 6f 29 3b 0a 09 20 20 62  onZM (geo);..  b
c8c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c8d0: 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54   GAIA_MULTIPOINT
c8e0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  :.      case GAI
c8f0: 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a 3a 0a 20  A_MULTIPOINTZ:. 
c900: 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d       case GAIA_M
c910: 55 4c 54 49 50 4f 49 4e 54 4d 3a 0a 20 20 20 20  ULTIPOINTM:.    
c920: 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54    case GAIA_MULT
c930: 49 50 4f 49 4e 54 5a 4d 3a 0a 20 20 20 20 20 20  IPOINTZM:.      
c940: 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 4c  case GAIA_MULTIL
c950: 49 4e 45 53 54 52 49 4e 47 3a 0a 20 20 20 20 20  INESTRING:.     
c960: 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49   case GAIA_MULTI
c970: 4c 49 4e 45 53 54 52 49 4e 47 5a 3a 0a 20 20 20  LINESTRINGZ:.   
c980: 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c     case GAIA_MUL
c990: 54 49 4c 49 4e 45 53 54 52 49 4e 47 4d 3a 0a 20  TILINESTRINGM:. 
c9a0: 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d       case GAIA_M
c9b0: 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 5a 4d  ULTILINESTRINGZM
c9c0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  :.      case GAI
c9d0: 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 3a 0a  A_MULTIPOLYGON:.
c9e0: 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
c9f0: 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a 3a 0a 20  MULTIPOLYGONZ:. 
ca00: 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d       case GAIA_M
ca10: 55 4c 54 49 50 4f 4c 59 47 4f 4e 4d 3a 0a 20 20  ULTIPOLYGONM:.  
ca20: 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55      case GAIA_MU
ca30: 4c 54 49 50 4f 4c 59 47 4f 4e 5a 4d 3a 0a 20 20  LTIPOLYGONZM:.  
ca40: 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 47 45      case GAIA_GE
ca50: 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
ca60: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  :.      case GAI
ca70: 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
ca80: 54 49 4f 4e 5a 3a 0a 20 20 20 20 20 20 63 61 73  TIONZ:.      cas
ca90: 65 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43  e GAIA_GEOMETRYC
caa0: 4f 4c 4c 45 43 54 49 4f 4e 4d 3a 0a 20 20 20 20  OLLECTIONM:.    
cab0: 20 20 63 61 73 65 20 47 41 49 41 5f 47 45 4f 4d    case GAIA_GEOM
cac0: 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 4d  ETRYCOLLECTIONZM
cad0: 3a 0a 09 20 20 50 61 72 73 65 57 6b 62 47 65 6f  :..  ParseWkbGeo
cae0: 6d 65 74 72 79 20 28 67 65 6f 2c 20 30 29 3b 0a  metry (geo, 0);.
caf0: 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
cb00: 64 65 66 61 75 6c 74 3a 0a 09 20 20 62 72 65 61  default:..  brea
cb10: 6b 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  k;.      };.    
cb20: 67 65 6f 2d 3e 4d 69 6e 58 20 3d 20 67 61 69 61  geo->MinX = gaia
cb30: 49 6d 70 6f 72 74 36 34 20 28 62 6c 6f 62 20 2b  Import64 (blob +
cb40: 20 36 2c 20 6c 69 74 74 6c 65 5f 65 6e 64 69 61   6, little_endia
cb50: 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  n, endian_arch);
cb60: 0a 20 20 20 20 67 65 6f 2d 3e 4d 69 6e 59 20 3d  .    geo->MinY =
cb70: 20 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28 62   gaiaImport64 (b
cb80: 6c 6f 62 20 2b 20 31 34 2c 20 6c 69 74 74 6c 65  lob + 14, little
cb90: 5f 65 6e 64 69 61 6e 2c 20 65 6e 64 69 61 6e 5f  _endian, endian_
cba0: 61 72 63 68 29 3b 0a 20 20 20 20 67 65 6f 2d 3e  arch);.    geo->
cbb0: 4d 61 78 58 20 3d 20 67 61 69 61 49 6d 70 6f 72  MaxX = gaiaImpor
cbc0: 74 36 34 20 28 62 6c 6f 62 20 2b 20 32 32 2c 20  t64 (blob + 22, 
cbd0: 6c 69 74 74 6c 65 5f 65 6e 64 69 61 6e 2c 20 65  little_endian, e
cbe0: 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20  ndian_arch);.   
cbf0: 20 67 65 6f 2d 3e 4d 61 78 59 20 3d 20 67 61 69   geo->MaxY = gai
cc00: 61 49 6d 70 6f 72 74 36 34 20 28 62 6c 6f 62 20  aImport64 (blob 
cc10: 2b 20 33 30 2c 20 6c 69 74 74 6c 65 5f 65 6e 64  + 30, little_end
cc20: 69 61 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  ian, endian_arch
cc30: 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 74  );.    switch (t
cc40: 79 70 65 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ype).      {..  
cc50: 2f 2a 20 73 65 74 74 69 6e 67 20 75 70 20 44 65  /* setting up De
cc60: 63 6c 61 72 65 64 54 79 70 65 20 2a 2f 0a 20 20  claredType */.  
cc70: 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f      case GAIA_PO
cc80: 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20  INT:.      case 
cc90: 47 41 49 41 5f 50 4f 49 4e 54 5a 3a 0a 20 20 20  GAIA_POINTZ:.   
cca0: 20 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f 49     case GAIA_POI
ccb0: 4e 54 4d 3a 0a 20 20 20 20 20 20 63 61 73 65 20  NTM:.      case 
ccc0: 47 41 49 41 5f 50 4f 49 4e 54 5a 4d 3a 0a 09 20  GAIA_POINTZM:.. 
ccd0: 20 67 65 6f 2d 3e 44 65 63 6c 61 72 65 64 54 79   geo->DeclaredTy
cce0: 70 65 20 3d 20 47 41 49 41 5f 50 4f 49 4e 54 3b  pe = GAIA_POINT;
ccf0: 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
cd00: 20 63 61 73 65 20 47 41 49 41 5f 4c 49 4e 45 53   case GAIA_LINES
cd10: 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 63 61 73  TRING:.      cas
cd20: 65 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e  e GAIA_LINESTRIN
cd30: 47 5a 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47  GZ:.      case G
cd40: 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 4d 3a  AIA_LINESTRINGM:
cd50: 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41  .      case GAIA
cd60: 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 3a 0a 20  _LINESTRINGZM:. 
cd70: 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 43       case GAIA_C
cd80: 4f 4d 50 52 45 53 53 45 44 5f 4c 49 4e 45 53 54  OMPRESSED_LINEST
cd90: 52 49 4e 47 3a 0a 20 20 20 20 20 20 63 61 73 65  RING:.      case
cda0: 20 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45 44   GAIA_COMPRESSED
cdb0: 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 3a 0a 20 20  _LINESTRINGZ:.  
cdc0: 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 43 4f      case GAIA_CO
cdd0: 4d 50 52 45 53 53 45 44 5f 4c 49 4e 45 53 54 52  MPRESSED_LINESTR
cde0: 49 4e 47 4d 3a 0a 20 20 20 20 20 20 63 61 73 65  INGM:.      case
cdf0: 20 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45 44   GAIA_COMPRESSED
ce00: 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 3a 0a 09  _LINESTRINGZM:..
ce10: 20 20 67 65 6f 2d 3e 44 65 63 6c 61 72 65 64 54    geo->DeclaredT
ce20: 79 70 65 20 3d 20 47 41 49 41 5f 4c 49 4e 45 53  ype = GAIA_LINES
ce30: 54 52 49 4e 47 3b 0a 09 20 20 62 72 65 61 6b 3b  TRING;..  break;
ce40: 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41  .      case GAIA
ce50: 5f 50 4f 4c 59 47 4f 4e 3a 0a 20 20 20 20 20 20  _POLYGON:.      
ce60: 63 61 73 65 20 47 41 49 41 5f 50 4f 4c 59 47 4f  case GAIA_POLYGO
ce70: 4e 5a 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47  NZ:.      case G
ce80: 41 49 41 5f 50 4f 4c 59 47 4f 4e 4d 3a 0a 20 20  AIA_POLYGONM:.  
ce90: 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f      case GAIA_PO
cea0: 4c 59 47 4f 4e 5a 4d 3a 0a 20 20 20 20 20 20 63  LYGONZM:.      c
ceb0: 61 73 65 20 47 41 49 41 5f 43 4f 4d 50 52 45 53  ase GAIA_COMPRES
cec0: 53 45 44 5f 50 4f 4c 59 47 4f 4e 3a 0a 20 20 20  SED_POLYGON:.   
ced0: 20 20 20 63 61 73 65 20 47 41 49 41 5f 43 4f 4d     case GAIA_COM
cee0: 50 52 45 53 53 45 44 5f 50 4f 4c 59 47 4f 4e 5a  PRESSED_POLYGONZ
cef0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  :.      case GAI
cf00: 41 5f 43 4f 4d 50 52 45 53 53 45 44 5f 50 4f 4c  A_COMPRESSED_POL
cf10: 59 47 4f 4e 4d 3a 0a 20 20 20 20 20 20 63 61 73  YGONM:.      cas
cf20: 65 20 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45  e GAIA_COMPRESSE
cf30: 44 5f 50 4f 4c 59 47 4f 4e 5a 4d 3a 0a 09 20 20  D_POLYGONZM:..  
cf40: 67 65 6f 2d 3e 44 65 63 6c 61 72 65 64 54 79 70  geo->DeclaredTyp
cf50: 65 20 3d 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e  e = GAIA_POLYGON
cf60: 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;..  break;.    
cf70: 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54    case GAIA_MULT
cf80: 49 50 4f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61  IPOINT:.      ca
cf90: 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49  se GAIA_MULTIPOI
cfa0: 4e 54 5a 3a 0a 20 20 20 20 20 20 63 61 73 65 20  NTZ:.      case 
cfb0: 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 4d  GAIA_MULTIPOINTM
cfc0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  :.      case GAI
cfd0: 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a 4d 3a 0a  A_MULTIPOINTZM:.
cfe0: 09 20 20 67 65 6f 2d 3e 44 65 63 6c 61 72 65 64  .  geo->Declared
cff0: 54 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54  Type = GAIA_MULT
d000: 49 50 4f 49 4e 54 3b 0a 09 20 20 62 72 65 61 6b  IPOINT;..  break
d010: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  ;.      case GAI
d020: 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e  A_MULTILINESTRIN
d030: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47 41  G:.      case GA
d040: 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49  IA_MULTILINESTRI
d050: 4e 47 5a 3a 0a 20 20 20 20 20 20 63 61 73 65 20  NGZ:.      case 
d060: 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54  GAIA_MULTILINEST
d070: 52 49 4e 47 4d 3a 0a 20 20 20 20 20 20 63 61 73  RINGM:.      cas
d080: 65 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45  e GAIA_MULTILINE
d090: 53 54 52 49 4e 47 5a 4d 3a 0a 09 20 20 67 65 6f  STRINGZM:..  geo
d0a0: 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65 20 3d  ->DeclaredType =
d0b0: 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53   GAIA_MULTILINES
d0c0: 54 52 49 4e 47 3b 0a 09 20 20 62 72 65 61 6b 3b  TRING;..  break;
d0d0: 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41  .      case GAIA
d0e0: 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 3a 0a 20  _MULTIPOLYGON:. 
d0f0: 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d       case GAIA_M
d100: 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a 3a 0a 20 20  ULTIPOLYGONZ:.  
d110: 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55      case GAIA_MU
d120: 4c 54 49 50 4f 4c 59 47 4f 4e 4d 3a 0a 20 20 20  LTIPOLYGONM:.   
d130: 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c     case GAIA_MUL
d140: 54 49 50 4f 4c 59 47 4f 4e 5a 4d 3a 0a 09 20 20  TIPOLYGONZM:..  
d150: 67 65 6f 2d 3e 44 65 63 6c 61 72 65 64 54 79 70  geo->DeclaredTyp
d160: 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  e = GAIA_MULTIPO
d170: 4c 59 47 4f 4e 3b 0a 09 20 20 62 72 65 61 6b 3b  LYGON;..  break;
d180: 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41  .      case GAIA
d190: 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
d1a0: 49 4f 4e 3a 0a 20 20 20 20 20 20 63 61 73 65 20  ION:.      case 
d1b0: 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
d1c0: 4c 45 43 54 49 4f 4e 5a 3a 0a 20 20 20 20 20 20  LECTIONZ:.      
d1d0: 63 61 73 65 20 47 41 49 41 5f 47 45 4f 4d 45 54  case GAIA_GEOMET
d1e0: 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 4d 3a 0a 20  RYCOLLECTIONM:. 
d1f0: 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 47       case GAIA_G
d200: 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f  EOMETRYCOLLECTIO
d210: 4e 5a 4d 3a 0a 09 20 20 67 65 6f 2d 3e 44 65 63  NZM:..  geo->Dec
d220: 6c 61 72 65 64 54 79 70 65 20 3d 20 47 41 49 41  laredType = GAIA
d230: 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
d240: 49 4f 4e 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20  ION;..  break;. 
d250: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 20       default:.. 
d260: 20 67 65 6f 2d 3e 44 65 63 6c 61 72 65 64 54 79   geo->DeclaredTy
d270: 70 65 20 3d 20 47 41 49 41 5f 55 4e 4b 4e 4f 57  pe = GAIA_UNKNOW
d280: 4e 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  N;..  break;.   
d290: 20 20 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e     };.    return
d2a0: 20 67 65 6f 3b 0a 7d 0a 0a 47 41 49 41 47 45 4f   geo;.}..GAIAGEO
d2b0: 5f 44 45 43 4c 41 52 45 20 67 61 69 61 47 65 6f  _DECLARE gaiaGeo
d2c0: 6d 43 6f 6c 6c 50 74 72 0a 67 61 69 61 46 72 6f  mCollPtr.gaiaFro
d2d0: 6d 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57  mSpatiaLiteBlobW
d2e0: 6b 62 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  kb (const unsign
d2f0: 65 64 20 63 68 61 72 20 2a 62 6c 6f 62 2c 20 75  ed char *blob, u
d300: 6e 73 69 67 6e 65 64 20 69 6e 74 20 73 69 7a 65  nsigned int size
d310: 29 0a 7b 0a 2f 2a 20 0a 2a 20 64 65 63 6f 64 69  ).{./* .* decodi
d320: 6e 67 20 66 72 6f 6d 20 53 70 61 74 69 61 4c 69  ng from SpatiaLi
d330: 74 65 20 42 4c 4f 42 20 74 6f 20 47 45 4f 4d 45  te BLOB to GEOME
d340: 54 52 59 20 0a 2a 20 63 6f 6e 76 65 6e 69 65 6e  TRY .* convenien
d350: 63 65 20 6d 65 74 68 6f 64 20 2d 20 61 6c 77 61  ce method - alwa
d360: 79 73 20 64 69 73 61 62 6c 69 6e 67 20 47 50 4b  ys disabling GPK
d370: 47 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  G compatibility 
d380: 4d 6f 64 65 73 0a 2a 2f 0a 20 20 20 20 72 65 74  Modes.*/.    ret
d390: 75 72 6e 20 67 61 69 61 46 72 6f 6d 53 70 61 74  urn gaiaFromSpat
d3a0: 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20  iaLiteBlobWkbEx 
d3b0: 28 62 6c 6f 62 2c 20 73 69 7a 65 2c 20 30 2c 20  (blob, size, 0, 
d3c0: 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 67 61  0);.}..static ga
d3d0: 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 0a 64 6f  iaGeomCollPtr.do
d3e0: 50 61 72 73 65 54 69 6e 79 50 6f 69 6e 74 42 6c  ParseTinyPointBl
d3f0: 6f 62 4d 62 72 20 28 63 6f 6e 73 74 20 75 6e 73  obMbr (const uns
d400: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62  igned char *blob
d410: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 73  , unsigned int s
d420: 69 7a 65 29 0a 7b 0a 2f 2a 20 64 65 63 6f 64 69  ize).{./* decodi
d430: 6e 67 20 66 72 6f 6d 20 53 70 61 74 69 61 4c 69  ng from SpatiaLi
d440: 74 65 20 54 69 6e 79 50 6f 69 6e 74 20 42 4c 4f  te TinyPoint BLO
d450: 42 20 28 4d 42 52 20 6f 6e 6c 79 29 20 2a 2f 0a  B (MBR only) */.
d460: 20 20 20 20 69 6e 74 20 6c 69 74 74 6c 65 5f 65      int little_e
d470: 6e 64 69 61 6e 3b 0a 20 20 20 20 69 6e 74 20 65  ndian;.    int e
d480: 6e 64 69 61 6e 5f 61 72 63 68 20 3d 20 67 61 69  ndian_arch = gai
d490: 61 45 6e 64 69 61 6e 41 72 63 68 20 28 29 3b 0a  aEndianArch ();.
d4a0: 20 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20      double x;.  
d4b0: 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20    double y;.    
d4c0: 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
d4d0: 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  geo = NULL;.    
d4e0: 67 61 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20 70  gaiaPolygonPtr p
d4f0: 6f 6c 79 67 3b 0a 20 20 20 20 67 61 69 61 52 69  olyg;.    gaiaRi
d500: 6e 67 50 74 72 20 72 69 6e 67 3b 0a 0a 20 20 20  ngPtr ring;..   
d510: 20 69 66 20 28 73 69 7a 65 20 3c 20 32 34 29 0a   if (size < 24).
d520: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 09 09 2f  .return NULL;../
d530: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 69  * cannot be an i
d540: 6e 74 65 72 6e 61 6c 20 42 4c 4f 42 20 54 69 6e  nternal BLOB Tin
d550: 79 50 6f 69 6e 74 20 67 65 6f 6d 65 74 72 79 20  yPoint geometry 
d560: 2a 2f 0a 20 20 20 20 69 66 20 28 2a 28 62 6c 6f  */.    if (*(blo
d570: 62 20 2b 20 30 29 20 21 3d 20 47 41 49 41 5f 4d  b + 0) != GAIA_M
d580: 41 52 4b 5f 53 54 41 52 54 29 0a 09 72 65 74 75  ARK_START)..retu
d590: 72 6e 20 4e 55 4c 4c 3b 09 09 2f 2a 20 66 61 69  rn NULL;../* fai
d5a0: 6c 65 64 20 74 6f 20 72 65 63 6f 67 6e 69 7a 65  led to recognize
d5b0: 20 53 54 41 52 54 20 73 69 67 6e 61 74 75 72 65   START signature
d5c0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 2a 28 62 6c   */.    if (*(bl
d5d0: 6f 62 20 2b 20 28 73 69 7a 65 20 2d 20 31 29 29  ob + (size - 1))
d5e0: 20 21 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 45 4e   != GAIA_MARK_EN
d5f0: 44 29 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  D)..return NULL;
d600: 09 09 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 72  ../* failed to r
d610: 65 63 6f 67 6e 69 7a 65 20 45 4e 44 20 73 69 67  ecognize END sig
d620: 6e 61 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 66  nature */.    if
d630: 20 28 2a 28 62 6c 6f 62 20 2b 20 31 29 20 3d 3d   (*(blob + 1) ==
d640: 20 47 41 49 41 5f 54 49 4e 59 50 4f 49 4e 54 5f   GAIA_TINYPOINT_
d650: 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 29 0a 09  LITTLE_ENDIAN)..
d660: 6c 69 74 74 6c 65 5f 65 6e 64 69 61 6e 20 3d 20  little_endian = 
d670: 31 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28  1;.    else if (
d680: 2a 28 62 6c 6f 62 20 2b 20 31 29 20 3d 3d 20 47  *(blob + 1) == G
d690: 41 49 41 5f 54 49 4e 59 50 4f 49 4e 54 5f 42 49  AIA_TINYPOINT_BI
d6a0: 47 5f 45 4e 44 49 41 4e 29 0a 09 6c 69 74 74 6c  G_ENDIAN)..littl
d6b0: 65 5f 65 6e 64 69 61 6e 20 3d 20 30 3b 0a 20 20  e_endian = 0;.  
d6c0: 20 20 65 6c 73 65 0a 09 72 65 74 75 72 6e 20 4e    else..return N
d6d0: 55 4c 4c 3b 09 09 2f 2a 20 75 6e 6b 6e 6f 77 6e  ULL;../* unknown
d6e0: 20 65 6e 63 6f 64 69 6e 67 3b 20 6e 6f 72 20 6c   encoding; nor l
d6f0: 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 6e 65 69  ittle-endian nei
d700: 74 68 65 72 20 62 69 67 2d 65 6e 64 69 61 6e 20  ther big-endian 
d710: 2a 2f 0a 0a 20 20 20 20 78 20 3d 20 67 61 69 61  */..    x = gaia
d720: 49 6d 70 6f 72 74 36 34 20 28 62 6c 6f 62 20 2b  Import64 (blob +
d730: 20 37 2c 20 6c 69 74 74 6c 65 5f 65 6e 64 69 61   7, little_endia
d740: 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  n, endian_arch);
d750: 0a 20 20 20 20 79 20 3d 20 67 61 69 61 49 6d 70  .    y = gaiaImp
d760: 6f 72 74 36 34 20 28 62 6c 6f 62 20 2b 20 31 35  ort64 (blob + 15
d770: 2c 20 6c 69 74 74 6c 65 5f 65 6e 64 69 61 6e 2c  , little_endian,
d780: 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 0a   endian_arch);..
d790: 20 20 20 20 67 65 6f 20 3d 20 67 61 69 61 41 6c      geo = gaiaAl
d7a0: 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 20 28 29 3b 0a  locGeomColl ();.
d7b0: 20 20 20 20 70 6f 6c 79 67 20 3d 20 67 61 69 61      polyg = gaia
d7c0: 41 64 64 50 6f 6c 79 67 6f 6e 54 6f 47 65 6f 6d  AddPolygonToGeom
d7d0: 43 6f 6c 6c 20 28 67 65 6f 2c 20 35 2c 20 30 29  Coll (geo, 5, 0)
d7e0: 3b 0a 20 20 20 20 72 69 6e 67 20 3d 20 70 6f 6c  ;.    ring = pol
d7f0: 79 67 2d 3e 45 78 74 65 72 69 6f 72 3b 0a 20 20  yg->Exterior;.  
d800: 20 20 67 61 69 61 53 65 74 50 6f 69 6e 74 20 28    gaiaSetPoint (
d810: 72 69 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 30 2c  ring->Coords, 0,
d820: 20 78 2c 20 79 29 3b 09 2f 2a 20 76 65 72 74 65   x, y);./* verte
d830: 78 20 23 20 31 20 2a 2f 0a 20 20 20 20 67 61 69  x # 1 */.    gai
d840: 61 53 65 74 50 6f 69 6e 74 20 28 72 69 6e 67 2d  aSetPoint (ring-
d850: 3e 43 6f 6f 72 64 73 2c 20 31 2c 20 78 2c 20 79  >Coords, 1, x, y
d860: 29 3b 09 2f 2a 20 76 65 72 74 65 78 20 23 20 32  );./* vertex # 2
d870: 20 2a 2f 0a 20 20 20 20 67 61 69 61 53 65 74 50   */.    gaiaSetP
d880: 6f 69 6e 74 20 28 72 69 6e 67 2d 3e 43 6f 6f 72  oint (ring->Coor
d890: 64 73 2c 20 32 2c 20 78 2c 20 79 29 3b 09 2f 2a  ds, 2, x, y);./*
d8a0: 20 76 65 72 74 65 78 20 23 20 33 20 2a 2f 0a 20   vertex # 3 */. 
d8b0: 20 20 20 67 61 69 61 53 65 74 50 6f 69 6e 74 20     gaiaSetPoint 
d8c0: 28 72 69 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 33  (ring->Coords, 3
d8d0: 2c 20 78 2c 20 79 29 3b 09 2f 2a 20 76 65 72 74  , x, y);./* vert
d8e0: 65 78 20 23 20 34 20 2a 2f 0a 20 20 20 20 67 61  ex # 4 */.    ga
d8f0: 69 61 53 65 74 50 6f 69 6e 74 20 28 72 69 6e 67  iaSetPoint (ring
d900: 2d 3e 43 6f 6f 72 64 73 2c 20 34 2c 20 78 2c 20  ->Coords, 4, x, 
d910: 79 29 3b 09 2f 2a 20 76 65 72 74 65 78 20 23 20  y);./* vertex # 
d920: 35 20 5b 73 61 6d 65 20 61 73 20 76 65 72 74 65  5 [same as verte
d930: 78 20 23 20 31 20 74 6f 20 63 6c 6f 73 65 20 74  x # 1 to close t
d940: 68 65 20 70 6f 6c 79 67 6f 6e 5d 20 2a 2f 0a 20  he polygon] */. 
d950: 20 20 20 72 65 74 75 72 6e 20 67 65 6f 3b 0a 7d     return geo;.}
d960: 0a 0a 47 41 49 41 47 45 4f 5f 44 45 43 4c 41 52  ..GAIAGEO_DECLAR
d970: 45 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74  E gaiaGeomCollPt
d980: 72 0a 67 61 69 61 46 72 6f 6d 53 70 61 74 69 61  r.gaiaFromSpatia
d990: 4c 69 74 65 42 6c 6f 62 4d 62 72 20 28 63 6f 6e  LiteBlobMbr (con
d9a0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
d9b0: 20 2a 62 6c 6f 62 2c 20 75 6e 73 69 67 6e 65 64   *blob, unsigned
d9c0: 20 69 6e 74 20 73 69 7a 65 29 0a 7b 0a 2f 2a 20   int size).{./* 
d9d0: 64 65 63 6f 64 69 6e 67 20 66 72 6f 6d 20 53 70  decoding from Sp
d9e0: 61 74 69 61 4c 69 74 65 20 42 4c 4f 42 20 74 6f  atiaLite BLOB to
d9f0: 20 47 45 4f 4d 45 54 52 59 20 5b 4d 42 52 20 6f   GEOMETRY [MBR o
da00: 6e 6c 79 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nly] */.    int 
da10: 6c 69 74 74 6c 65 5f 65 6e 64 69 61 6e 3b 0a 20  little_endian;. 
da20: 20 20 20 69 6e 74 20 65 6e 64 69 61 6e 5f 61 72     int endian_ar
da30: 63 68 20 3d 20 67 61 69 61 45 6e 64 69 61 6e 41  ch = gaiaEndianA
da40: 72 63 68 20 28 29 3b 0a 20 20 20 20 64 6f 75 62  rch ();.    doub
da50: 6c 65 20 6d 69 6e 78 3b 0a 20 20 20 20 64 6f 75  le minx;.    dou
da60: 62 6c 65 20 6d 69 6e 79 3b 0a 20 20 20 20 64 6f  ble miny;.    do
da70: 75 62 6c 65 20 6d 61 78 78 3b 0a 20 20 20 20 64  uble maxx;.    d
da80: 6f 75 62 6c 65 20 6d 61 78 79 3b 0a 20 20 20 20  ouble maxy;.    
da90: 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20  gaiaGeomCollPtr 
daa0: 67 65 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  geo = NULL;.    
dab0: 67 61 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20 70  gaiaPolygonPtr p
dac0: 6f 6c 79 67 3b 0a 20 20 20 20 67 61 69 61 52 69  olyg;.    gaiaRi
dad0: 6e 67 50 74 72 20 72 69 6e 67 3b 0a 0a 20 20 20  ngPtr ring;..   
dae0: 20 69 66 20 28 73 69 7a 65 20 3d 3d 20 32 34 20   if (size == 24 
daf0: 7c 7c 20 73 69 7a 65 20 3d 3d 20 33 32 20 7c 7c  || size == 32 ||
db00: 20 73 69 7a 65 20 3d 3d 20 34 30 29 0a 20 20 20   size == 40).   
db10: 20 20 20 7b 0a 09 20 20 2f 2a 20 74 65 73 74 69     {..  /* testi
db20: 6e 67 20 66 6f 72 20 61 20 70 6f 73 73 69 62 6c  ng for a possibl
db30: 65 20 54 69 6e 79 50 6f 69 6e 74 20 42 4c 4f 42  e TinyPoint BLOB
db40: 20 2a 2f 0a 09 20 20 69 66 20 28 2a 28 62 6c 6f   */..  if (*(blo
db50: 62 20 2b 20 30 29 20 3d 3d 20 47 41 49 41 5f 4d  b + 0) == GAIA_M
db60: 41 52 4b 5f 53 54 41 52 54 20 26 26 0a 09 20 20  ARK_START &&..  
db70: 20 20 20 20 28 2a 28 62 6c 6f 62 20 2b 20 31 29      (*(blob + 1)
db80: 20 3d 3d 20 47 41 49 41 5f 54 49 4e 59 50 4f 49   == GAIA_TINYPOI
db90: 4e 54 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e  NT_LITTLE_ENDIAN
dba0: 0a 09 20 20 20 20 20 20 20 7c 7c 20 2a 28 62 6c  ..       || *(bl
dbb0: 6f 62 20 2b 20 31 29 20 3d 3d 20 47 41 49 41 5f  ob + 1) == GAIA_
dbc0: 54 49 4e 59 50 4f 49 4e 54 5f 42 49 47 5f 45 4e  TINYPOINT_BIG_EN
dbd0: 44 49 41 4e 29 0a 09 20 20 20 20 20 20 26 26 20  DIAN)..      && 
dbe0: 2a 28 62 6c 6f 62 20 2b 20 28 73 69 7a 65 20 2d  *(blob + (size -
dbf0: 20 31 29 29 20 3d 3d 20 47 41 49 41 5f 4d 41 52   1)) == GAIA_MAR
dc00: 4b 5f 45 4e 44 29 0a 09 20 20 20 20 20 20 72 65  K_END)..      re
dc10: 74 75 72 6e 20 64 6f 50 61 72 73 65 54 69 6e 79  turn doParseTiny
dc20: 50 6f 69 6e 74 42 6c 6f 62 4d 62 72 20 28 62 6c  PointBlobMbr (bl
dc30: 6f 62 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 20  ob, size);.     
dc40: 20 7d 0a 20 20 20 20 69 66 20 28 73 69 7a 65 20   }.    if (size 
dc50: 3c 20 34 35 29 0a 09 72 65 74 75 72 6e 20 4e 55  < 45)..return NU
dc60: 4c 4c 3b 09 09 2f 2a 20 63 61 6e 6e 6f 74 20 62  LL;../* cannot b
dc70: 65 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 42 4c  e an internal BL
dc80: 4f 42 20 57 4b 42 20 67 65 6f 6d 65 74 72 79 20  OB WKB geometry 
dc90: 2a 2f 0a 20 20 20 20 69 66 20 28 2a 28 62 6c 6f  */.    if (*(blo
dca0: 62 20 2b 20 30 29 20 21 3d 20 47 41 49 41 5f 4d  b + 0) != GAIA_M
dcb0: 41 52 4b 5f 53 54 41 52 54 29 0a 09 72 65 74 75  ARK_START)..retu
dcc0: 72 6e 20 4e 55 4c 4c 3b 09 09 2f 2a 20 66 61 69  rn NULL;../* fai
dcd0: 6c 65 64 20 74 6f 20 72 65 63 6f 67 6e 69 7a 65  led to recognize
dce0: 20 53 54 41 52 54 20 73 69 67 6e 61 74 75 72 65   START signature
dcf0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 2a 28 62 6c   */.    if (*(bl
dd00: 6f 62 20 2b 20 28 73 69 7a 65 20 2d 20 31 29 29  ob + (size - 1))
dd10: 20 21 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 45 4e   != GAIA_MARK_EN
dd20: 44 29 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  D)..return NULL;
dd30: 09 09 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 72  ../* failed to r
dd40: 65 63 6f 67 6e 69 7a 65 20 45 4e 44 20 73 69 67  ecognize END sig
dd50: 6e 61 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 66  nature */.    if
dd60: 20 28 2a 28 62 6c 6f 62 20 2b 20 33 38 29 20 21   (*(blob + 38) !
dd70: 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 4d 42 52 29  = GAIA_MARK_MBR)
dd80: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 09 09  ..return NULL;..
dd90: 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 63  /* failed to rec
dda0: 6f 67 6e 69 7a 65 20 4d 42 52 20 73 69 67 6e 61  ognize MBR signa
ddb0: 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 66 20 28  ture */.    if (
ddc0: 2a 28 62 6c 6f 62 20 2b 20 31 29 20 3d 3d 20 47  *(blob + 1) == G
ddd0: 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41  AIA_LITTLE_ENDIA
dde0: 4e 29 0a 09 6c 69 74 74 6c 65 5f 65 6e 64 69 61  N)..little_endia
ddf0: 6e 20 3d 20 31 3b 0a 20 20 20 20 65 6c 73 65 20  n = 1;.    else 
de00: 69 66 20 28 2a 28 62 6c 6f 62 20 2b 20 31 29 20  if (*(blob + 1) 
de10: 3d 3d 20 47 41 49 41 5f 42 49 47 5f 45 4e 44 49  == GAIA_BIG_ENDI
de20: 41 4e 29 0a 09 6c 69 74 74 6c 65 5f 65 6e 64 69  AN)..little_endi
de30: 61 6e 20 3d 20 30 3b 0a 20 20 20 20 65 6c 73 65  an = 0;.    else
de40: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 09 09  ..return NULL;..
de50: 2f 2a 20 75 6e 6b 6e 6f 77 6e 20 65 6e 63 6f 64  /* unknown encod
de60: 69 6e 67 3b 20 6e 6f 72 20 6c 69 74 74 65 2d 65  ing; nor litte-e
de70: 6e 64 69 61 6e 20 6e 65 69 74 68 65 72 20 62 69  ndian neither bi
de80: 67 2d 65 6e 64 69 61 6e 20 2a 2f 0a 20 20 20 20  g-endian */.    
de90: 67 65 6f 20 3d 20 67 61 69 61 41 6c 6c 6f 63 47  geo = gaiaAllocG
dea0: 65 6f 6d 43 6f 6c 6c 20 28 29 3b 0a 20 20 20 20  eomColl ();.    
deb0: 70 6f 6c 79 67 20 3d 20 67 61 69 61 41 64 64 50  polyg = gaiaAddP
dec0: 6f 6c 79 67 6f 6e 54 6f 47 65 6f 6d 43 6f 6c 6c  olygonToGeomColl
ded0: 20 28 67 65 6f 2c 20 35 2c 20 30 29 3b 0a 20 20   (geo, 5, 0);.  
dee0: 20 20 72 69 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e    ring = polyg->
def0: 45 78 74 65 72 69 6f 72 3b 0a 20 20 20 20 6d 69  Exterior;.    mi
df00: 6e 78 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36  nx = gaiaImport6
df10: 34 20 28 62 6c 6f 62 20 2b 20 36 2c 20 6c 69 74  4 (blob + 6, lit
df20: 74 6c 65 5f 65 6e 64 69 61 6e 2c 20 65 6e 64 69  tle_endian, endi
df30: 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20 6d 69  an_arch);.    mi
df40: 6e 79 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36  ny = gaiaImport6
df50: 34 20 28 62 6c 6f 62 20 2b 20 31 34 2c 20 6c 69  4 (blob + 14, li
df60: 74 74 6c 65 5f 65 6e 64 69 61 6e 2c 20 65 6e 64  ttle_endian, end
df70: 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20 6d  ian_arch);.    m
df80: 61 78 78 20 3d 20 67 61 69 61 49 6d 70 6f 72 74  axx = gaiaImport
df90: 36 34 20 28 62 6c 6f 62 20 2b 20 32 32 2c 20 6c  64 (blob + 22, l
dfa0: 69 74 74 6c 65 5f 65 6e 64 69 61 6e 2c 20 65 6e  ittle_endian, en
dfb0: 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20  dian_arch);.    
dfc0: 6d 61 78 79 20 3d 20 67 61 69 61 49 6d 70 6f 72  maxy = gaiaImpor
dfd0: 74 36 34 20 28 62 6c 6f 62 20 2b 20 33 30 2c 20  t64 (blob + 30, 
dfe0: 6c 69 74 74 6c 65 5f 65 6e 64 69 61 6e 2c 20 65  little_endian, e
dff0: 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20  ndian_arch);.   
e000: 20 67 61 69 61 53 65 74 50 6f 69 6e 74 20 28 72   gaiaSetPoint (r
e010: 69 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 30 2c 20  ing->Coords, 0, 
e020: 6d 69 6e 78 2c 20 6d 69 6e 79 29 3b 09 2f 2a 20  minx, miny);./* 
e030: 76 65 72 74 65 78 20 23 20 31 20 2a 2f 0a 20 20  vertex # 1 */.  
e040: 20 20 67 61 69 61 53 65 74 50 6f 69 6e 74 20 28    gaiaSetPoint (
e050: 72 69 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 31 2c  ring->Coords, 1,
e060: 20 6d 61 78 78 2c 20 6d 69 6e 79 29 3b 09 2f 2a   maxx, miny);./*
e070: 20 76 65 72 74 65 78 20 23 20 32 20 2a 2f 0a 20   vertex # 2 */. 
e080: 20 20 20 67 61 69 61 53 65 74 50 6f 69 6e 74 20     gaiaSetPoint 
e090: 28 72 69 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 32  (ring->Coords, 2
e0a0: 2c 20 6d 61 78 78 2c 20 6d 61 78 79 29 3b 09 2f  , maxx, maxy);./
e0b0: 2a 20 76 65 72 74 65 78 20 23 20 33 20 2a 2f 0a  * vertex # 3 */.
e0c0: 20 20 20 20 67 61 69 61 53 65 74 50 6f 69 6e 74      gaiaSetPoint
e0d0: 20 28 72 69 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20   (ring->Coords, 
e0e0: 33 2c 20 6d 69 6e 78 2c 20 6d 61 78 79 29 3b 09  3, minx, maxy);.
e0f0: 2f 2a 20 76 65 72 74 65 78 20 23 20 34 20 2a 2f  /* vertex # 4 */
e100: 0a 20 20 20 20 67 61 69 61 53 65 74 50 6f 69 6e  .    gaiaSetPoin
e110: 74 20 28 72 69 6e 67 2d 3e 43 6f 6f 72 64 73 2c  t (ring->Coords,
e120: 20 34 2c 20 6d 69 6e 78 2c 20 6d 69 6e 79 29 3b   4, minx, miny);
e130: 09 2f 2a 20 76 65 72 74 65 78 20 23 20 35 20 5b  ./* vertex # 5 [
e140: 73 61 6d 65 20 61 73 20 76 65 72 74 65 78 20 23  same as vertex #
e150: 20 31 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20   1 to close the 
e160: 70 6f 6c 79 67 6f 6e 5d 20 2a 2f 0a 20 20 20 20  polygon] */.    
e170: 72 65 74 75 72 6e 20 67 65 6f 3b 0a 7d 0a 0a 47  return geo;.}..G
e180: 41 49 41 47 45 4f 5f 44 45 43 4c 41 52 45 20 76  AIAGEO_DECLARE v
e190: 6f 69 64 0a 67 61 69 61 54 6f 53 70 61 74 69 61  oid.gaiaToSpatia
e1a0: 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 20 28 67  LiteBlobWkbEx (g
e1b0: 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
e1c0: 65 6f 6d 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  eom, unsigned ch
e1d0: 61 72 20 2a 2a 72 65 73 75 6c 74 2c 0a 09 09 09  ar **result,....
e1e0: 20 20 20 69 6e 74 20 2a 73 69 7a 65 2c 20 69 6e     int *size, in
e1f0: 74 20 67 70 6b 67 5f 6d 6f 64 65 29 0a 7b 0a 2f  t gpkg_mode).{./
e200: 2a 20 73 69 6d 70 6c 79 20 64 65 66 61 75 6c 74  * simply default
e210: 73 20 74 6f 20 67 61 69 61 54 6f 53 70 61 74 69  s to gaiaToSpati
e220: 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 20  aLiteBlobWkbEx2 
e230: 74 69 6e 79 5f 70 6f 69 6e 74 3d 46 41 4c 53 45  tiny_point=FALSE
e240: 20 2a 2f 0a 20 20 20 20 67 61 69 61 54 6f 53 70   */.    gaiaToSp
e250: 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45  atiaLiteBlobWkbE
e260: 78 32 20 28 67 65 6f 6d 2c 20 72 65 73 75 6c 74  x2 (geom, result
e270: 2c 20 73 69 7a 65 2c 20 67 70 6b 67 5f 6d 6f 64  , size, gpkg_mod
e280: 65 2c 20 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  e, 0);.}..static
e290: 20 76 6f 69 64 0a 64 6f 45 6e 63 6f 64 65 54 69   void.doEncodeTi
e2a0: 6e 79 50 6f 69 6e 74 42 6c 6f 62 20 28 67 61 69  nyPointBlob (gai
e2b0: 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f  aGeomCollPtr geo
e2c0: 6d 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  m, unsigned char
e2d0: 20 2a 2a 72 65 73 75 6c 74 2c 20 69 6e 74 20 2a   **result, int *
e2e0: 73 69 7a 65 29 0a 7b 0a 2f 2a 20 65 6e 63 6f 64  size).{./* encod
e2f0: 69 6e 67 20 61 20 54 69 6e 79 50 6f 69 6e 74 20  ing a TinyPoint 
e300: 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 69 6e 74 20  BLOB */.    int 
e310: 73 7a 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  sz;.    unsigned
e320: 20 63 68 61 72 20 2a 62 6c 6f 62 3b 0a 20 20 20   char *blob;.   
e330: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
e340: 70 74 72 3b 0a 20 20 20 20 69 6e 74 20 65 6e 64  ptr;.    int end
e350: 69 61 6e 5f 61 72 63 68 20 3d 20 67 61 69 61 45  ian_arch = gaiaE
e360: 6e 64 69 61 6e 41 72 63 68 20 28 29 3b 0a 20 20  ndianArch ();.  
e370: 20 20 67 61 69 61 50 6f 69 6e 74 50 74 72 20 70    gaiaPointPtr p
e380: 6f 69 6e 74 20 3d 20 67 65 6f 6d 2d 3e 46 69 72  oint = geom->Fir
e390: 73 74 50 6f 69 6e 74 3b 0a 0a 2f 2a 20 63 6f 6d  stPoint;../* com
e3a0: 70 75 6e 74 69 6e 67 20 74 68 65 20 42 4c 4f 42  punting the BLOB
e3b0: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 66 20   size */.    if 
e3c0: 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
e3d0: 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
e3e0: 5f 5a 29 0a 09 73 7a 20 3d 20 33 32 3b 0a 20 20  _Z)..sz = 32;.  
e3f0: 20 20 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d    else if (geom-
e400: 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
e410: 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 73  == GAIA_XY_M)..s
e420: 7a 20 3d 20 33 32 3b 0a 20 20 20 20 65 6c 73 65  z = 32;.    else
e430: 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e   if (geom->Dimen
e440: 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
e450: 41 5f 58 59 5f 5a 5f 4d 29 0a 09 73 7a 20 3d 20  A_XY_Z_M)..sz = 
e460: 34 30 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 7a  40;.    else..sz
e470: 20 3d 20 32 34 3b 0a 2f 2a 20 61 6c 6c 6f 63 61   = 24;./* alloca
e480: 74 69 6e 67 20 74 68 65 20 42 4c 4f 42 20 2a 2f  ting the BLOB */
e490: 0a 20 20 20 20 62 6c 6f 62 20 3d 20 6d 61 6c 6c  .    blob = mall
e4a0: 6f 63 20 28 73 7a 29 3b 0a 20 20 20 20 70 74 72  oc (sz);.    ptr
e4b0: 20 3d 20 62 6c 6f 62 3b 0a 2f 2a 20 61 6e 64 20   = blob;./* and 
e4c0: 66 69 6e 61 6c 6c 79 20 77 65 20 62 75 69 6c 64  finally we build
e4d0: 20 74 68 65 20 42 4c 4f 42 20 2a 2f 0a 20 20 20   the BLOB */.   
e4e0: 20 2a 70 74 72 20 3d 20 47 41 49 41 5f 4d 41 52   *ptr = GAIA_MAR
e4f0: 4b 5f 53 54 41 52 54 3b 09 2f 2a 20 53 54 41 52  K_START;./* STAR
e500: 54 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 20  T signature */. 
e510: 20 20 20 70 74 72 2b 2b 3b 0a 20 20 20 20 2a 28     ptr++;.    *(
e520: 70 74 72 29 20 3d 20 47 41 49 41 5f 54 49 4e 59  ptr) = GAIA_TINY
e530: 50 4f 49 4e 54 5f 4c 49 54 54 4c 45 5f 45 4e 44  POINT_LITTLE_END
e540: 49 41 4e 3b 09 2f 2a 20 62 79 74 65 20 6f 72 64  IAN;./* byte ord
e550: 65 72 69 6e 67 20 2a 2f 0a 20 20 20 20 70 74 72  ering */.    ptr
e560: 2b 2b 3b 0a 20 20 20 20 67 61 69 61 45 78 70 6f  ++;.    gaiaExpo
e570: 72 74 33 32 20 28 70 74 72 2c 20 67 65 6f 6d 2d  rt32 (ptr, geom-
e580: 3e 53 72 69 64 2c 20 31 2c 20 65 6e 64 69 61 6e  >Srid, 1, endian
e590: 5f 61 72 63 68 29 3b 09 2f 2a 20 74 68 65 20 53  _arch);./* the S
e5a0: 52 49 44 20 2a 2f 0a 20 20 20 20 70 74 72 20 2b  RID */.    ptr +
e5b0: 3d 20 34 3b 0a 20 20 20 20 69 66 20 28 67 65 6f  = 4;.    if (geo
e5c0: 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
e5d0: 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a  l == GAIA_XY_Z).
e5e0: 09 2a 70 74 72 20 3d 20 47 41 49 41 5f 54 49 4e  .*ptr = GAIA_TIN
e5f0: 59 50 4f 49 4e 54 5f 58 59 5a 3b 0a 20 20 20 20  YPOINT_XYZ;.    
e600: 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44  else if (geom->D
e610: 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d  imensionModel ==
e620: 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 2a 70 74   GAIA_XY_M)..*pt
e630: 72 20 3d 20 47 41 49 41 5f 54 49 4e 59 50 4f 49  r = GAIA_TINYPOI
e640: 4e 54 5f 58 59 4d 3b 0a 20 20 20 20 65 6c 73 65  NT_XYM;.    else
e650: 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e   if (geom->Dimen
e660: 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
e670: 41 5f 58 59 5f 5a 5f 4d 29 0a 09 2a 70 74 72 20  A_XY_Z_M)..*ptr 
e680: 3d 20 47 41 49 41 5f 54 49 4e 59 50 4f 49 4e 54  = GAIA_TINYPOINT
e690: 5f 58 59 5a 4d 3b 0a 20 20 20 20 65 6c 73 65 0a  _XYZM;.    else.
e6a0: 09 2a 70 74 72 20 3d 20 47 41 49 41 5f 54 49 4e  .*ptr = GAIA_TIN
e6b0: 59 50 4f 49 4e 54 5f 58 59 3b 0a 20 20 20 20 70  YPOINT_XY;.    p
e6c0: 74 72 2b 2b 3b 0a 20 20 20 20 67 61 69 61 45 78  tr++;.    gaiaEx
e6d0: 70 6f 72 74 36 34 20 28 70 74 72 2c 20 70 6f 69  port64 (ptr, poi
e6e0: 6e 74 2d 3e 58 2c 20 31 2c 20 65 6e 64 69 61 6e  nt->X, 1, endian
e6f0: 5f 61 72 63 68 29 3b 09 2f 2a 20 58 20 2a 2f 0a  _arch);./* X */.
e700: 20 20 20 20 70 74 72 20 2b 3d 20 38 3b 0a 20 20      ptr += 8;.  
e710: 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28    gaiaExport64 (
e720: 70 74 72 2c 20 70 6f 69 6e 74 2d 3e 59 2c 20 31  ptr, point->Y, 1
e730: 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
e740: 2f 2a 20 59 20 2a 2f 0a 20 20 20 20 70 74 72 20  /* Y */.    ptr 
e750: 2b 3d 20 38 3b 0a 20 20 20 20 69 66 20 28 67 65  += 8;.    if (ge
e760: 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  om->DimensionMod
e770: 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29  el == GAIA_XY_Z)
e780: 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 61 69 61  .      {..  gaia
e790: 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20 70  Export64 (ptr, p
e7a0: 6f 69 6e 74 2d 3e 5a 2c 20 31 2c 20 65 6e 64 69  oint->Z, 1, endi
e7b0: 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 5a 20 2a  an_arch);./* Z *
e7c0: 2f 0a 09 20 20 70 74 72 20 2b 3d 20 38 3b 0a 20  /..  ptr += 8;. 
e7d0: 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20       }.    else 
e7e0: 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
e7f0: 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
e800: 5f 58 59 5f 4d 29 0a 20 20 20 20 20 20 7b 0a 09  _XY_M).      {..
e810: 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28    gaiaExport64 (
e820: 70 74 72 2c 20 70 6f 69 6e 74 2d 3e 4d 2c 20 31  ptr, point->M, 1
e830: 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
e840: 2f 2a 20 4d 20 2a 2f 0a 09 20 20 70 74 72 20 2b  /* M */..  ptr +
e850: 3d 20 38 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 8;.      }.   
e860: 20 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e   else if (geom->
e870: 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
e880: 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 20  = GAIA_XY_Z_M). 
e890: 20 20 20 20 20 7b 0a 09 20 20 67 61 69 61 45 78       {..  gaiaEx
e8a0: 70 6f 72 74 36 34 20 28 70 74 72 2c 20 70 6f 69  port64 (ptr, poi
e8b0: 6e 74 2d 3e 5a 2c 20 31 2c 20 65 6e 64 69 61 6e  nt->Z, 1, endian
e8c0: 5f 61 72 63 68 29 3b 09 2f 2a 20 5a 20 2a 2f 0a  _arch);./* Z */.
e8d0: 09 20 20 70 74 72 20 2b 3d 20 38 3b 0a 09 20 20  .  ptr += 8;..  
e8e0: 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74  gaiaExport64 (pt
e8f0: 72 2c 20 70 6f 69 6e 74 2d 3e 4d 2c 20 31 2c 20  r, point->M, 1, 
e900: 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a  endian_arch);./*
e910: 20 4d 20 2a 2f 0a 09 20 20 70 74 72 20 2b 3d 20   M */..  ptr += 
e920: 38 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 2a  8;.      }.    *
e930: 70 74 72 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f  ptr = GAIA_MARK_
e940: 45 4e 44 3b 09 2f 2a 20 45 4e 44 20 73 69 67 6e  END;./* END sign
e950: 61 74 75 72 65 20 2a 2f 0a 0a 20 20 20 20 2a 72  ature */..    *r
e960: 65 73 75 6c 74 20 3d 20 62 6c 6f 62 3b 0a 20 20  esult = blob;.  
e970: 20 20 2a 73 69 7a 65 20 3d 20 73 7a 3b 0a 7d 0a    *size = sz;.}.
e980: 0a 47 41 49 41 47 45 4f 5f 44 45 43 4c 41 52 45  .GAIAGEO_DECLARE
e990: 20 76 6f 69 64 0a 67 61 69 61 54 6f 53 70 61 74   void.gaiaToSpat
e9a0: 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32  iaLiteBlobWkbEx2
e9b0: 20 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74   (gaiaGeomCollPt
e9c0: 72 20 67 65 6f 6d 2c 20 75 6e 73 69 67 6e 65 64  r geom, unsigned
e9d0: 20 63 68 61 72 20 2a 2a 72 65 73 75 6c 74 2c 0a   char **result,.
e9e0: 09 09 09 20 20 20 20 69 6e 74 20 2a 73 69 7a 65  ...    int *size
e9f0: 2c 20 69 6e 74 20 67 70 6b 67 5f 6d 6f 64 65 2c  , int gpkg_mode,
ea00: 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 29   int tiny_point)
ea10: 0a 7b 0a 2f 2a 20 62 75 69 6c 64 73 20 74 68 65  .{./* builds the
ea20: 20 53 70 61 74 69 61 4c 69 74 65 20 42 4c 4f 42   SpatiaLite BLOB
ea30: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
ea40: 66 6f 72 20 74 68 69 73 20 47 45 4f 4d 45 54 52  for this GEOMETR
ea50: 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 62 3b  Y */.    int ib;
ea60: 0a 20 20 20 20 69 6e 74 20 69 76 3b 0a 20 20 20  .    int iv;.   
ea70: 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 64   double x;.    d
ea80: 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 64 6f 75  ouble y;.    dou
ea90: 62 6c 65 20 7a 20 3d 20 30 2e 30 3b 0a 20 20 20  ble z = 0.0;.   
eaa0: 20 64 6f 75 62 6c 65 20 6d 20 3d 20 30 2e 30 3b   double m = 0.0;
eab0: 0a 20 20 20 20 69 6e 74 20 65 6e 74 69 74 69 65  .    int entitie
eac0: 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  s = 0;.    int n
ead0: 5f 70 6f 69 6e 74 73 20 3d 20 30 3b 0a 20 20 20  _points = 0;.   
eae0: 20 69 6e 74 20 6e 5f 6c 69 6e 65 73 74 72 69 6e   int n_linestrin
eaf0: 67 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  gs = 0;.    int 
eb00: 6e 5f 70 6f 6c 79 67 6f 6e 73 20 3d 20 30 3b 0a  n_polygons = 0;.
eb10: 20 20 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20      int type;.  
eb20: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
eb30: 2a 70 74 72 3b 0a 20 20 20 20 67 61 69 61 50 6f  *ptr;.    gaiaPo
eb40: 69 6e 74 50 74 72 20 70 74 3b 0a 20 20 20 20 67  intPtr pt;.    g
eb50: 61 69 61 4c 69 6e 65 73 74 72 69 6e 67 50 74 72  aiaLinestringPtr
eb60: 20 6c 6e 3b 0a 20 20 20 20 67 61 69 61 50 6f 6c   ln;.    gaiaPol
eb70: 79 67 6f 6e 50 74 72 20 70 67 3b 0a 20 20 20 20  ygonPtr pg;.    
eb80: 67 61 69 61 52 69 6e 67 50 74 72 20 72 6e 67 3b  gaiaRingPtr rng;
eb90: 0a 20 20 20 20 67 61 69 61 50 6f 69 6e 74 50 74  .    gaiaPointPt
eba0: 72 20 70 6f 69 6e 74 20 3d 20 4e 55 4c 4c 3b 0a  r point = NULL;.
ebb0: 20 20 20 20 67 61 69 61 4c 69 6e 65 73 74 72 69      gaiaLinestri
ebc0: 6e 67 50 74 72 20 6c 69 6e 65 20 3d 20 4e 55 4c  ngPtr line = NUL
ebd0: 4c 3b 0a 20 20 20 20 67 61 69 61 50 6f 6c 79 67  L;.    gaiaPolyg
ebe0: 6f 6e 50 74 72 20 70 6f 6c 79 67 20 3d 20 4e 55  onPtr polyg = NU
ebf0: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 65 6e 64 69  LL;.    int endi
ec00: 61 6e 5f 61 72 63 68 20 3d 20 67 61 69 61 45 6e  an_arch = gaiaEn
ec10: 64 69 61 6e 41 72 63 68 20 28 29 3b 0a 20 20 20  dianArch ();.   
ec20: 20 67 61 69 61 4d 62 72 47 65 6f 6d 65 74 72 79   gaiaMbrGeometry
ec30: 20 28 67 65 6f 6d 29 3b 0a 0a 20 20 20 20 69 66   (geom);..    if
ec40: 20 28 67 70 6b 67 5f 6d 6f 64 65 29 0a 20 20 20   (gpkg_mode).   
ec50: 20 20 20 7b 0a 23 69 66 64 65 66 20 45 4e 41 42     {.#ifdef ENAB
ec60: 4c 45 5f 47 45 4f 50 41 43 4b 41 47 45 09 2f 2a  LE_GEOPACKAGE./*
ec70: 20 6f 6e 6c 79 20 69 66 20 47 65 6f 50 61 63 6b   only if GeoPack
ec80: 61 67 65 20 73 75 70 70 6f 72 74 20 69 73 20 65  age support is e
ec90: 6e 61 62 6c 65 64 20 2a 2f 0a 09 20 20 2f 2a 20  nabled */..  /* 
eca0: 47 65 6f 50 61 63 6b 61 67 65 20 4d 6f 64 65 20  GeoPackage Mode 
ecb0: 65 6e 61 62 6c 65 64 20 2a 2f 0a 09 20 20 67 61  enabled */..  ga
ecc0: 69 61 54 6f 47 50 42 20 28 67 65 6f 6d 2c 20 72  iaToGPB (geom, r
ecd0: 65 73 75 6c 74 2c 20 73 69 7a 65 29 3b 0a 23 65  esult, size);.#e
ece0: 6e 64 69 66 20 2f 2a 20 65 6e 64 20 47 45 4f 50  ndif /* end GEOP
ecf0: 41 43 4b 41 47 45 20 63 6f 6e 64 69 74 69 6f 6e  ACKAGE condition
ed00: 61 6c 20 2a 2f 0a 09 20 20 72 65 74 75 72 6e 3b  al */..  return;
ed10: 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 68 6f 77  .      }../* how
ed20: 20 6d 61 6e 79 20 65 6e 74 69 74 69 65 73 2c 20   many entities, 
ed30: 61 6e 64 20 6f 66 20 77 68 61 74 20 6b 69 6e 64  and of what kind
ed40: 2c 20 64 6f 20 77 65 20 68 61 76 65 20 3f 20 2a  , do we have ? *
ed50: 2f 0a 20 20 20 20 70 74 20 3d 20 67 65 6f 6d 2d  /.    pt = geom-
ed60: 3e 46 69 72 73 74 50 6f 69 6e 74 3b 0a 20 20 20  >FirstPoint;.   
ed70: 20 77 68 69 6c 65 20 28 70 74 29 0a 20 20 20 20   while (pt).    
ed80: 20 20 7b 0a 09 20 20 70 6f 69 6e 74 20 3d 20 70    {..  point = p
ed90: 74 3b 0a 09 20 20 65 6e 74 69 74 69 65 73 2b 2b  t;..  entities++
eda0: 3b 0a 09 20 20 6e 5f 70 6f 69 6e 74 73 2b 2b 3b  ;..  n_points++;
edb0: 0a 09 20 20 70 74 20 3d 20 70 74 2d 3e 4e 65 78  ..  pt = pt->Nex
edc0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 6c  t;.      }.    l
edd0: 6e 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73 74 4c  n = geom->FirstL
ede0: 69 6e 65 73 74 72 69 6e 67 3b 0a 20 20 20 20 77  inestring;.    w
edf0: 68 69 6c 65 20 28 6c 6e 29 0a 20 20 20 20 20 20  hile (ln).      
ee00: 7b 0a 09 20 20 6c 69 6e 65 20 3d 20 6c 6e 3b 0a  {..  line = ln;.
ee10: 09 20 20 65 6e 74 69 74 69 65 73 2b 2b 3b 0a 09  .  entities++;..
ee20: 20 20 6e 5f 6c 69 6e 65 73 74 72 69 6e 67 73 2b    n_linestrings+
ee30: 2b 3b 0a 09 20 20 6c 6e 20 3d 20 6c 6e 2d 3e 4e  +;..  ln = ln->N
ee40: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
ee50: 20 70 67 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73   pg = geom->Firs
ee60: 74 50 6f 6c 79 67 6f 6e 3b 0a 20 20 20 20 77 68  tPolygon;.    wh
ee70: 69 6c 65 20 28 70 67 29 0a 20 20 20 20 20 20 7b  ile (pg).      {
ee80: 0a 09 20 20 70 6f 6c 79 67 20 3d 20 70 67 3b 0a  ..  polyg = pg;.
ee90: 09 20 20 65 6e 74 69 74 69 65 73 2b 2b 3b 0a 09  .  entities++;..
eea0: 20 20 6e 5f 70 6f 6c 79 67 6f 6e 73 2b 2b 3b 0a    n_polygons++;.
eeb0: 09 20 20 70 67 20 3d 20 70 67 2d 3e 4e 65 78 74  .  pg = pg->Next
eec0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 2a  ;.      }..    *
eed0: 73 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 2a 72  size = 0;.    *r
eee0: 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20  esult = NULL;.  
eef0: 20 20 69 66 20 28 6e 5f 70 6f 69 6e 74 73 20 3d    if (n_points =
ef00: 3d 20 30 20 26 26 20 6e 5f 70 6f 6c 79 67 6f 6e  = 0 && n_polygon
ef10: 73 20 3d 3d 20 30 20 26 26 20 6e 5f 6c 69 6e 65  s == 0 && n_line
ef20: 73 74 72 69 6e 67 73 20 3d 3d 20 30 29 0a 09 72  strings == 0)..r
ef30: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 20 28 6e  eturn;.    if (n
ef40: 5f 70 6f 69 6e 74 73 20 3d 3d 20 31 20 26 26 20  _points == 1 && 
ef50: 6e 5f 6c 69 6e 65 73 74 72 69 6e 67 73 20 3d 3d  n_linestrings ==
ef60: 20 30 20 26 26 20 6e 5f 70 6f 6c 79 67 6f 6e 73   0 && n_polygons
ef70: 20 3d 3d 20 30 20 26 26 20 65 6e 74 69 74 69 65   == 0 && entitie
ef80: 73 20 3d 3d 20 31 0a 09 26 26 20 67 65 6f 6d 2d  s == 1..&& geom-
ef90: 3e 44 65 63 6c 61 72 65 64 54 79 70 65 20 21 3d  >DeclaredType !=
efa0: 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54   GAIA_MULTIPOINT
efb0: 0a 09 26 26 20 67 65 6f 6d 2d 3e 44 65 63 6c 61  ..&& geom->Decla
efc0: 72 65 64 54 79 70 65 20 21 3d 20 47 41 49 41 5f  redType != GAIA_
efd0: 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49  GEOMETRYCOLLECTI
efe0: 4f 4e 20 26 26 20 74 69 6e 79 5f 70 6f 69 6e 74  ON && tiny_point
eff0: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20  ).      {..  /* 
f000: 75 73 69 6e 67 20 74 68 65 20 54 69 6e 79 50 6f  using the TinyPo
f010: 69 6e 74 20 42 4c 4f 42 20 65 6e 63 6f 64 69 6e  int BLOB encodin
f020: 67 20 2a 2f 0a 09 20 20 64 6f 45 6e 63 6f 64 65  g */..  doEncode
f030: 54 69 6e 79 50 6f 69 6e 74 42 6c 6f 62 20 28 67  TinyPointBlob (g
f040: 65 6f 6d 2c 20 72 65 73 75 6c 74 2c 20 73 69 7a  eom, result, siz
f050: 65 29 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a 20  e);..  return;. 
f060: 20 20 20 20 20 7d 0a 0a 2f 2a 20 6f 6b 2c 20 77       }../* ok, w
f070: 65 20 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20  e can determine 
f080: 74 68 65 20 67 65 6f 6d 65 74 72 79 20 63 6c 61  the geometry cla
f090: 73 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 6e 5f  ss */.    if (n_
f0a0: 70 6f 69 6e 74 73 20 3d 3d 20 31 20 26 26 20 6e  points == 1 && n
f0b0: 5f 6c 69 6e 65 73 74 72 69 6e 67 73 20 3d 3d 20  _linestrings == 
f0c0: 30 20 26 26 20 6e 5f 70 6f 6c 79 67 6f 6e 73 20  0 && n_polygons 
f0d0: 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20  == 0).      {.. 
f0e0: 20 69 66 20 28 67 65 6f 6d 2d 3e 44 65 63 6c 61   if (geom->Decla
f0f0: 72 65 64 54 79 70 65 20 3d 3d 20 47 41 49 41 5f  redType == GAIA_
f100: 4d 55 4c 54 49 50 4f 49 4e 54 29 0a 09 20 20 20  MULTIPOINT)..   
f110: 20 7b 0a 09 09 69 66 20 28 67 65 6f 6d 2d 3e 44   {...if (geom->D
f120: 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d  imensionModel ==
f130: 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09 20 20   GAIA_XY_Z)...  
f140: 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f 4d 55    type = GAIA_MU
f150: 4c 54 49 50 4f 49 4e 54 5a 3b 0a 09 09 65 6c 73  LTIPOINTZ;...els
f160: 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  e if (geom->Dime
f170: 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
f180: 49 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20 74  IA_XY_M)...    t
f190: 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49  ype = GAIA_MULTI
f1a0: 50 4f 49 4e 54 4d 3b 0a 09 09 65 6c 73 65 20 69  POINTM;...else i
f1b0: 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69  f (geom->Dimensi
f1c0: 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
f1d0: 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20 20 74 79  XY_Z_M)...    ty
f1e0: 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50  pe = GAIA_MULTIP
f1f0: 4f 49 4e 54 5a 4d 3b 0a 09 09 65 6c 73 65 0a 09  OINTZM;...else..
f200: 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41  .    type = GAIA
f210: 5f 4d 55 4c 54 49 50 4f 49 4e 54 3b 0a 09 20 20  _MULTIPOINT;..  
f220: 20 20 7d 0a 09 20 20 65 6c 73 65 20 69 66 20 28    }..  else if (
f230: 67 65 6f 6d 2d 3e 44 65 63 6c 61 72 65 64 54 79  geom->DeclaredTy
f240: 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45  pe == GAIA_GEOME
f250: 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 29 0a 09  TRYCOLLECTION)..
f260: 20 20 20 20 7b 0a 09 09 69 66 20 28 67 65 6f 6d      {...if (geom
f270: 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
f280: 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09   == GAIA_XY_Z)..
f290: 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41  .    type = GAIA
f2a0: 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
f2b0: 49 4f 4e 5a 3b 0a 09 09 65 6c 73 65 20 69 66 20  IONZ;...else if 
f2c0: 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
f2d0: 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
f2e0: 5f 4d 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d  _M)...    type =
f2f0: 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f   GAIA_GEOMETRYCO
f300: 4c 4c 45 43 54 49 4f 4e 4d 3b 0a 09 09 65 6c 73  LLECTIONM;...els
f310: 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  e if (geom->Dime
f320: 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
f330: 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20  IA_XY_Z_M)...   
f340: 20 74 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f   type = GAIA_GEO
f350: 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a  METRYCOLLECTIONZ
f360: 4d 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20  M;...else...    
f370: 74 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d  type = GAIA_GEOM
f380: 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 3b 0a  ETRYCOLLECTION;.
f390: 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09  .    }..  else..
f3a0: 20 20 20 20 7b 0a 09 09 69 66 20 28 67 65 6f 6d      {...if (geom
f3b0: 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
f3c0: 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09   == GAIA_XY_Z)..
f3d0: 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41  .    type = GAIA
f3e0: 5f 50 4f 49 4e 54 5a 3b 0a 09 09 65 6c 73 65 20  _POINTZ;...else 
f3f0: 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
f400: 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
f410: 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20 74 79 70  _XY_M)...    typ
f420: 65 20 3d 20 47 41 49 41 5f 50 4f 49 4e 54 4d 3b  e = GAIA_POINTM;
f430: 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d  ...else if (geom
f440: 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
f450: 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29   == GAIA_XY_Z_M)
f460: 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41  ...    type = GA
f470: 49 41 5f 50 4f 49 4e 54 5a 4d 3b 0a 09 09 65 6c  IA_POINTZM;...el
f480: 73 65 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20  se...    type = 
f490: 47 41 49 41 5f 50 4f 49 4e 54 3b 0a 09 20 20 20  GAIA_POINT;..   
f4a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65   }.      }.    e
f4b0: 6c 73 65 20 69 66 20 28 6e 5f 70 6f 69 6e 74 73  lse if (n_points
f4c0: 20 3e 20 31 20 26 26 20 6e 5f 6c 69 6e 65 73 74   > 1 && n_linest
f4d0: 72 69 6e 67 73 20 3d 3d 20 30 20 26 26 20 6e 5f  rings == 0 && n_
f4e0: 70 6f 6c 79 67 6f 6e 73 20 3d 3d 20 30 29 0a 20  polygons == 0). 
f4f0: 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 67 65       {..  if (ge
f500: 6f 6d 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65  om->DeclaredType
f510: 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52   == GAIA_GEOMETR
f520: 59 43 4f 4c 4c 45 43 54 49 4f 4e 29 0a 09 20 20  YCOLLECTION)..  
f530: 20 20 7b 0a 09 09 69 66 20 28 67 65 6f 6d 2d 3e    {...if (geom->
f540: 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
f550: 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09 20  = GAIA_XY_Z)... 
f560: 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f 47     type = GAIA_G
f570: 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f  EOMETRYCOLLECTIO
f580: 4e 5a 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 67  NZ;...else if (g
f590: 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  eom->DimensionMo
f5a0: 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d  del == GAIA_XY_M
f5b0: 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47  )...    type = G
f5c0: 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
f5d0: 45 43 54 49 4f 4e 4d 3b 0a 09 09 65 6c 73 65 20  ECTIONM;...else 
f5e0: 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
f5f0: 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
f600: 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20 20 74  _XY_Z_M)...    t
f610: 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45  ype = GAIA_GEOME
f620: 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 4d 3b  TRYCOLLECTIONZM;
f630: 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 74 79  ...else...    ty
f640: 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54  pe = GAIA_GEOMET
f650: 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 3b 0a 09 20  RYCOLLECTION;.. 
f660: 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20     }..  else..  
f670: 20 20 7b 0a 09 09 69 66 20 28 67 65 6f 6d 2d 3e    {...if (geom->
f680: 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
f690: 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09 20  = GAIA_XY_Z)... 
f6a0: 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f 4d     type = GAIA_M
f6b0: 55 4c 54 49 50 4f 49 4e 54 5a 3b 0a 09 09 65 6c  ULTIPOINTZ;...el
f6c0: 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d  se if (geom->Dim
f6d0: 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
f6e0: 41 49 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20  AIA_XY_M)...    
f6f0: 74 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54  type = GAIA_MULT
f700: 49 50 4f 49 4e 54 4d 3b 0a 09 09 65 6c 73 65 20  IPOINTM;...else 
f710: 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
f720: 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
f730: 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20 20 74  _XY_Z_M)...    t
f740: 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49  ype = GAIA_MULTI
f750: 50 4f 49 4e 54 5a 4d 3b 0a 09 09 65 6c 73 65 0a  POINTZM;...else.
f760: 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49  ..    type = GAI
f770: 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 3b 0a 09 20  A_MULTIPOINT;.. 
f780: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f790: 20 65 6c 73 65 20 69 66 20 28 6e 5f 70 6f 69 6e   else if (n_poin
f7a0: 74 73 20 3d 3d 20 30 20 26 26 20 6e 5f 6c 69 6e  ts == 0 && n_lin
f7b0: 65 73 74 72 69 6e 67 73 20 3d 3d 20 31 20 26 26  estrings == 1 &&
f7c0: 20 6e 5f 70 6f 6c 79 67 6f 6e 73 20 3d 3d 20 30   n_polygons == 0
f7d0: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20  ).      {..  if 
f7e0: 28 67 65 6f 6d 2d 3e 44 65 63 6c 61 72 65 64 54  (geom->DeclaredT
f7f0: 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54  ype == GAIA_MULT
f800: 49 4c 49 4e 45 53 54 52 49 4e 47 29 0a 09 20 20  ILINESTRING)..  
f810: 20 20 7b 0a 09 09 69 66 20 28 67 65 6f 6d 2d 3e    {...if (geom->
f820: 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
f830: 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09 20  = GAIA_XY_Z)... 
f840: 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f 4d     type = GAIA_M
f850: 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 5a 3b  ULTILINESTRINGZ;
f860: 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d  ...else if (geom
f870: 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
f880: 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09   == GAIA_XY_M)..
f890: 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41  .    type = GAIA
f8a0: 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47  _MULTILINESTRING
f8b0: 4d 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65  M;...else if (ge
f8c0: 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  om->DimensionMod
f8d0: 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f  el == GAIA_XY_Z_
f8e0: 4d 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20  M)...    type = 
f8f0: 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54  GAIA_MULTILINEST
f900: 52 49 4e 47 5a 4d 3b 0a 09 09 65 6c 73 65 0a 09  RINGZM;...else..
f910: 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41  .    type = GAIA
f920: 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47  _MULTILINESTRING
f930: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65  ;..    }..  else
f940: 20 69 66 20 28 67 65 6f 6d 2d 3e 44 65 63 6c 61   if (geom->Decla
f950: 72 65 64 54 79 70 65 20 3d 3d 20 47 41 49 41 5f  redType == GAIA_
f960: 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49  GEOMETRYCOLLECTI
f970: 4f 4e 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20  ON)..    {...if 
f980: 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
f990: 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
f9a0: 5f 5a 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d  _Z)...    type =
f9b0: 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f   GAIA_GEOMETRYCO
f9c0: 4c 4c 45 43 54 49 4f 4e 5a 3b 0a 09 09 65 6c 73  LLECTIONZ;...els
f9d0: 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  e if (geom->Dime
f9e0: 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
f9f0: 49 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20 74  IA_XY_M)...    t
fa00: 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45  ype = GAIA_GEOME
fa10: 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 4d 3b 0a  TRYCOLLECTIONM;.
fa20: 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d  ..else if (geom-
fa30: 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
fa40: 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a  == GAIA_XY_Z_M).
fa50: 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49  ..    type = GAI
fa60: 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
fa70: 54 49 4f 4e 5a 4d 3b 0a 09 09 65 6c 73 65 0a 09  TIONZM;...else..
fa80: 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41  .    type = GAIA
fa90: 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
faa0: 49 4f 4e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  ION;..    }..  e
fab0: 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 69 66 20  lse..    {...if 
fac0: 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
fad0: 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
fae0: 5f 5a 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d  _Z)...    type =
faf0: 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47   GAIA_LINESTRING
fb00: 5a 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65  Z;...else if (ge
fb10: 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  om->DimensionMod
fb20: 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29  el == GAIA_XY_M)
fb30: 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41  ...    type = GA
fb40: 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 4d 3b 0a  IA_LINESTRINGM;.
fb50: 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d  ..else if (geom-
fb60: 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
fb70: 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a  == GAIA_XY_Z_M).
fb80: 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49  ..    type = GAI
fb90: 41 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 3b 0a  A_LINESTRINGZM;.
fba0: 09 09 65 6c 73 65 0a 09 09 20 20 20 20 74 79 70  ..else...    typ
fbb0: 65 20 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54 52  e = GAIA_LINESTR
fbc0: 49 4e 47 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20  ING;..    }.    
fbd0: 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20    }.    else if 
fbe0: 28 6e 5f 70 6f 69 6e 74 73 20 3d 3d 20 30 20 26  (n_points == 0 &
fbf0: 26 20 6e 5f 6c 69 6e 65 73 74 72 69 6e 67 73 20  & n_linestrings 
fc00: 3e 20 31 20 26 26 20 6e 5f 70 6f 6c 79 67 6f 6e  > 1 && n_polygon
fc10: 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a  s == 0).      {.
fc20: 09 20 20 69 66 20 28 67 65 6f 6d 2d 3e 44 65 63  .  if (geom->Dec
fc30: 6c 61 72 65 64 54 79 70 65 20 3d 3d 20 47 41 49  laredType == GAI
fc40: 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
fc50: 54 49 4f 4e 29 0a 09 20 20 20 20 7b 0a 09 09 69  TION)..    {...i
fc60: 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69  f (geom->Dimensi
fc70: 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
fc80: 58 59 5f 5a 29 0a 09 09 20 20 20 20 74 79 70 65  XY_Z)...    type
fc90: 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59   = GAIA_GEOMETRY
fca0: 43 4f 4c 4c 45 43 54 49 4f 4e 5a 3b 0a 09 09 65  COLLECTIONZ;...e
fcb0: 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69  lse if (geom->Di
fcc0: 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
fcd0: 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20  GAIA_XY_M)...   
fce0: 20 74 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f   type = GAIA_GEO
fcf0: 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 4d  METRYCOLLECTIONM
fd00: 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f  ;...else if (geo
fd10: 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
fd20: 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  l == GAIA_XY_Z_M
fd30: 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47  )...    type = G
fd40: 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
fd50: 45 43 54 49 4f 4e 5a 4d 3b 0a 09 09 65 6c 73 65  ECTIONZM;...else
fd60: 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41  ...    type = GA
fd70: 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45  IA_GEOMETRYCOLLE
fd80: 43 54 49 4f 4e 3b 0a 09 20 20 20 20 7d 0a 09 20  CTION;..    }.. 
fd90: 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 69   else..    {...i
fda0: 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69  f (geom->Dimensi
fdb0: 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
fdc0: 58 59 5f 5a 29 0a 09 09 20 20 20 20 74 79 70 65  XY_Z)...    type
fdd0: 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e   = GAIA_MULTILIN
fde0: 45 53 54 52 49 4e 47 5a 3b 0a 09 09 65 6c 73 65  ESTRINGZ;...else
fdf0: 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e   if (geom->Dimen
fe00: 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
fe10: 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20 74 79  A_XY_M)...    ty
fe20: 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c  pe = GAIA_MULTIL
fe30: 49 4e 45 53 54 52 49 4e 47 4d 3b 0a 09 09 65 6c  INESTRINGM;...el
fe40: 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d  se if (geom->Dim
fe50: 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
fe60: 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20  AIA_XY_Z_M)...  
fe70: 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f 4d 55    type = GAIA_MU
fe80: 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 3b  LTILINESTRINGZM;
fe90: 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 74 79  ...else...    ty
fea0: 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c  pe = GAIA_MULTIL
feb0: 49 4e 45 53 54 52 49 4e 47 3b 0a 09 20 20 20 20  INESTRING;..    
fec0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  }.      }.    el
fed0: 73 65 20 69 66 20 28 6e 5f 70 6f 69 6e 74 73 20  se if (n_points 
fee0: 3d 3d 20 30 20 26 26 20 6e 5f 6c 69 6e 65 73 74  == 0 && n_linest
fef0: 72 69 6e 67 73 20 3d 3d 20 30 20 26 26 20 6e 5f  rings == 0 && n_
ff00: 70 6f 6c 79 67 6f 6e 73 20 3d 3d 20 31 29 0a 20  polygons == 1). 
ff10: 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 67 65       {..  if (ge
ff20: 6f 6d 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65  om->DeclaredType
ff30: 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f   == GAIA_MULTIPO
ff40: 4c 59 47 4f 4e 29 0a 09 20 20 20 20 7b 0a 09 09  LYGON)..    {...
ff50: 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
ff60: 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
ff70: 5f 58 59 5f 5a 29 0a 09 09 20 20 20 20 74 79 70  _XY_Z)...    typ
ff80: 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  e = GAIA_MULTIPO
ff90: 4c 59 47 4f 4e 5a 3b 0a 09 09 65 6c 73 65 20 69  LYGONZ;...else i
ffa0: 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69  f (geom->Dimensi
ffb0: 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
ffc0: 58 59 5f 4d 29 0a 09 09 20 20 20 20 74 79 70 65  XY_M)...    type
ffd0: 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c   = GAIA_MULTIPOL
ffe0: 59 47 4f 4e 4d 3b 0a 09 09 65 6c 73 65 20 69 66  YGONM;...else if
fff0: 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f   (geom->Dimensio
10000 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
10010 59 5f 5a 5f 4d 29 0a 09 09 20 20 20 20 74 79 70  Y_Z_M)...    typ
10020 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  e = GAIA_MULTIPO
10030 4c 59 47 4f 4e 5a 4d 3b 0a 09 09 65 6c 73 65 0a  LYGONZM;...else.
10040 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49  ..    type = GAI
10050 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 3b 0a  A_MULTIPOLYGON;.
10060 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 20 69  .    }..  else i
10070 66 20 28 67 65 6f 6d 2d 3e 44 65 63 6c 61 72 65  f (geom->Declare
10080 64 54 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45  dType == GAIA_GE
10090 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
100a0 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 67  )..    {...if (g
100b0 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  eom->DimensionMo
100c0 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a  del == GAIA_XY_Z
100d0 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47  )...    type = G
100e0 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
100f0 45 43 54 49 4f 4e 5a 3b 0a 09 09 65 6c 73 65 20  ECTIONZ;...else 
10100 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
10110 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
10120 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20 74 79 70  _XY_M)...    typ
10130 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52  e = GAIA_GEOMETR
10140 59 43 4f 4c 4c 45 43 54 49 4f 4e 4d 3b 0a 09 09  YCOLLECTIONM;...
10150 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44  else if (geom->D
10160 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d  imensionModel ==
10170 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09   GAIA_XY_Z_M)...
10180 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f      type = GAIA_
10190 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49  GEOMETRYCOLLECTI
101a0 4f 4e 5a 4d 3b 0a 09 09 65 6c 73 65 0a 09 09 20  ONZM;...else... 
101b0 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f 47     type = GAIA_G
101c0 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f  EOMETRYCOLLECTIO
101d0 4e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73  N;..    }..  els
101e0 65 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 67  e..    {...if (g
101f0 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  eom->DimensionMo
10200 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a  del == GAIA_XY_Z
10210 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47  )...    type = G
10220 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 3b 0a 09 09  AIA_POLYGONZ;...
10230 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44  else if (geom->D
10240 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d  imensionModel ==
10250 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09 20 20   GAIA_XY_M)...  
10260 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f 50 4f    type = GAIA_PO
10270 4c 59 47 4f 4e 4d 3b 0a 09 09 65 6c 73 65 20 69  LYGONM;...else i
10280 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69  f (geom->Dimensi
10290 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
102a0 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20 20 74 79  XY_Z_M)...    ty
102b0 70 65 20 3d 20 47 41 49 41 5f 50 4f 4c 59 47 4f  pe = GAIA_POLYGO
102c0 4e 5a 4d 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20  NZM;...else...  
102d0 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f 50 4f    type = GAIA_PO
102e0 4c 59 47 4f 4e 3b 0a 09 20 20 20 20 7d 0a 20 20  LYGON;..    }.  
102f0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
10300 66 20 28 6e 5f 70 6f 69 6e 74 73 20 3d 3d 20 30  f (n_points == 0
10310 20 26 26 20 6e 5f 6c 69 6e 65 73 74 72 69 6e 67   && n_linestring
10320 73 20 3d 3d 20 30 20 26 26 20 6e 5f 70 6f 6c 79  s == 0 && n_poly
10330 67 6f 6e 73 20 3e 20 31 29 0a 20 20 20 20 20 20  gons > 1).      
10340 7b 0a 09 20 20 69 66 20 28 67 65 6f 6d 2d 3e 44  {..  if (geom->D
10350 65 63 6c 61 72 65 64 54 79 70 65 20 3d 3d 20 47  eclaredType == G
10360 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
10370 45 43 54 49 4f 4e 29 0a 09 20 20 20 20 7b 0a 09  ECTION)..    {..
10380 09 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e  .if (geom->Dimen
10390 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
103a0 41 5f 58 59 5f 5a 29 0a 09 09 20 20 20 20 74 79  A_XY_Z)...    ty
103b0 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54  pe = GAIA_GEOMET
103c0 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 3b 0a 09  RYCOLLECTIONZ;..
103d0 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e  .else if (geom->
103e0 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
103f0 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09 20  = GAIA_XY_M)... 
10400 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f 47     type = GAIA_G
10410 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f  EOMETRYCOLLECTIO
10420 4e 4d 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 67  NM;...else if (g
10430 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  eom->DimensionMo
10440 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a  del == GAIA_XY_Z
10450 5f 4d 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d  _M)...    type =
10460 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f   GAIA_GEOMETRYCO
10470 4c 4c 45 43 54 49 4f 4e 5a 4d 3b 0a 09 09 65 6c  LLECTIONZM;...el
10480 73 65 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20  se...    type = 
10490 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
104a0 4c 45 43 54 49 4f 4e 3b 0a 09 20 20 20 20 7d 0a  LECTION;..    }.
104b0 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09  .  else..    {..
104c0 09 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e  .if (geom->Dimen
104d0 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
104e0 41 5f 58 59 5f 5a 29 0a 09 09 20 20 20 20 74 79  A_XY_Z)...    ty
104f0 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50  pe = GAIA_MULTIP
10500 4f 4c 59 47 4f 4e 5a 3b 0a 09 09 65 6c 73 65 20  OLYGONZ;...else 
10510 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
10520 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
10530 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20 74 79 70  _XY_M)...    typ
10540 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  e = GAIA_MULTIPO
10550 4c 59 47 4f 4e 4d 3b 0a 09 09 65 6c 73 65 20 69  LYGONM;...else i
10560 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69  f (geom->Dimensi
10570 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
10580 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20 20 74 79  XY_Z_M)...    ty
10590 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50  pe = GAIA_MULTIP
105a0 4f 4c 59 47 4f 4e 5a 4d 3b 0a 09 09 65 6c 73 65  OLYGONZM;...else
105b0 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41  ...    type = GA
105c0 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 3b  IA_MULTIPOLYGON;
105d0 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a  ..    }.      }.
105e0 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
105f0 0a 09 20 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69  ..  if (geom->Di
10600 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
10610 47 41 49 41 5f 58 59 5f 5a 29 0a 09 20 20 20 20  GAIA_XY_Z)..    
10620 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f 47 45    type = GAIA_GE
10630 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
10640 5a 3b 0a 09 20 20 65 6c 73 65 20 69 66 20 28 67  Z;..  else if (g
10650 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  eom->DimensionMo
10660 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d  del == GAIA_XY_M
10670 29 0a 09 20 20 20 20 20 20 74 79 70 65 20 3d 20  )..      type = 
10680 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
10690 4c 45 43 54 49 4f 4e 4d 3b 0a 09 20 20 65 6c 73  LECTIONM;..  els
106a0 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  e if (geom->Dime
106b0 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
106c0 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 20 20 20 20  IA_XY_Z_M)..    
106d0 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f 47 45    type = GAIA_GE
106e0 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
106f0 5a 4d 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20  ZM;..  else..   
10700 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f 47     type = GAIA_G
10710 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f  EOMETRYCOLLECTIO
10720 4e 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a 20 61 6e  N;.      }./* an
10730 64 20 6e 6f 77 20 77 65 20 63 6f 6d 70 75 74 65  d now we compute
10740 20 74 68 65 20 73 69 7a 65 20 6f 66 20 42 4c 4f   the size of BLO
10750 42 20 2a 2f 0a 20 20 20 20 2a 73 69 7a 65 20 3d  B */.    *size =
10760 20 34 34 3b 09 09 09 2f 2a 20 68 65 61 64 65 72   44;.../* header
10770 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 77 69   size */.    swi
10780 74 63 68 20 28 74 79 70 65 29 0a 20 20 20 20 20  tch (type).     
10790 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41   {.      case GA
107a0 49 41 5f 50 4f 49 4e 54 3a 0a 09 20 20 2a 73 69  IA_POINT:..  *si
107b0 7a 65 20 2b 3d 20 28 73 69 7a 65 6f 66 20 28 64  ze += (sizeof (d
107c0 6f 75 62 6c 65 29 20 2a 20 32 29 3b 09 2f 2a 20  ouble) * 2);./* 
107d0 5b 78 2c 79 5d 20 63 6f 6f 72 64 73 20 2a 2f 0a  [x,y] coords */.
107e0 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
107f0 63 61 73 65 20 47 41 49 41 5f 50 4f 49 4e 54 5a  case GAIA_POINTZ
10800 3a 0a 09 20 20 2a 73 69 7a 65 20 2b 3d 20 28 73  :..  *size += (s
10810 69 7a 65 6f 66 20 28 64 6f 75 62 6c 65 29 20 2a  izeof (double) *
10820 20 33 29 3b 09 2f 2a 20 5b 78 2c 79 2c 7a 5d 20   3);./* [x,y,z] 
10830 63 6f 6f 72 64 73 20 2a 2f 0a 09 20 20 62 72 65  coords */..  bre
10840 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47  ak;.      case G
10850 41 49 41 5f 50 4f 49 4e 54 4d 3a 0a 09 20 20 2a  AIA_POINTM:..  *
10860 73 69 7a 65 20 2b 3d 20 28 73 69 7a 65 6f 66 20  size += (sizeof 
10870 28 64 6f 75 62 6c 65 29 20 2a 20 33 29 3b 09 2f  (double) * 3);./
10880 2a 20 5b 78 2c 79 2c 6d 5d 20 63 6f 6f 72 64 73  * [x,y,m] coords
10890 20 2a 2f 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20   */..  break;.  
108a0 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f      case GAIA_PO
108b0 49 4e 54 5a 4d 3a 0a 09 20 20 2a 73 69 7a 65 20  INTZM:..  *size 
108c0 2b 3d 20 28 73 69 7a 65 6f 66 20 28 64 6f 75 62  += (sizeof (doub
108d0 6c 65 29 20 2a 20 34 29 3b 09 2f 2a 20 5b 78 2c  le) * 4);./* [x,
108e0 79 2c 7a 2c 6d 5d 20 63 6f 6f 72 64 73 20 2a 2f  y,z,m] coords */
108f0 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
10900 20 63 61 73 65 20 47 41 49 41 5f 4c 49 4e 45 53   case GAIA_LINES
10910 54 52 49 4e 47 3a 0a 09 20 20 2a 73 69 7a 65 20  TRING:..  *size 
10920 2b 3d 20 28 34 20 2b 20 28 28 73 69 7a 65 6f 66  += (4 + ((sizeof
10930 20 28 64 6f 75 62 6c 65 29 20 2a 20 32 29 20 2a   (double) * 2) *
10940 20 6c 69 6e 65 2d 3e 50 6f 69 6e 74 73 29 29 3b   line->Points));
10950 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20 2b 20 5b  ./* # points + [
10960 78 2c 79 5d 20 66 6f 72 20 65 61 63 68 20 76 65  x,y] for each ve
10970 72 74 65 78 20 2a 2f 0a 09 20 20 62 72 65 61 6b  rtex */..  break
10980 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  ;.      case GAI
10990 41 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 3a 0a 09  A_LINESTRINGZ:..
109a0 20 20 2a 73 69 7a 65 20 2b 3d 20 28 34 20 2b 20    *size += (4 + 
109b0 28 28 73 69 7a 65 6f 66 20 28 64 6f 75 62 6c 65  ((sizeof (double
109c0 29 20 2a 20 33 29 20 2a 20 6c 69 6e 65 2d 3e 50  ) * 3) * line->P
109d0 6f 69 6e 74 73 29 29 3b 09 2f 2a 20 23 20 70 6f  oints));./* # po
109e0 69 6e 74 73 20 2b 20 5b 78 2c 79 2c 7a 5d 20 66  ints + [x,y,z] f
109f0 6f 72 20 65 61 63 68 20 76 65 72 74 65 78 20 2a  or each vertex *
10a00 2f 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  /..  break;.    
10a10 20 20 63 61 73 65 20 47 41 49 41 5f 4c 49 4e 45    case GAIA_LINE
10a20 53 54 52 49 4e 47 4d 3a 0a 09 20 20 2a 73 69 7a  STRINGM:..  *siz
10a30 65 20 2b 3d 20 28 34 20 2b 20 28 28 73 69 7a 65  e += (4 + ((size
10a40 6f 66 20 28 64 6f 75 62 6c 65 29 20 2a 20 33 29  of (double) * 3)
10a50 20 2a 20 6c 69 6e 65 2d 3e 50 6f 69 6e 74 73 29   * line->Points)
10a60 29 3b 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20 2b  );./* # points +
10a70 20 5b 78 2c 79 2c 6d 5d 20 66 6f 72 20 65 61 63   [x,y,m] for eac
10a80 68 20 76 65 72 74 65 78 20 2a 2f 0a 09 20 20 62  h vertex */..  b
10a90 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
10aa0 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47   GAIA_LINESTRING
10ab0 5a 4d 3a 0a 09 20 20 2a 73 69 7a 65 20 2b 3d 20  ZM:..  *size += 
10ac0 28 34 20 2b 20 28 28 73 69 7a 65 6f 66 20 28 64  (4 + ((sizeof (d
10ad0 6f 75 62 6c 65 29 20 2a 20 34 29 20 2a 20 6c 69  ouble) * 4) * li
10ae0 6e 65 2d 3e 50 6f 69 6e 74 73 29 29 3b 09 2f 2a  ne->Points));./*
10af0 20 23 20 70 6f 69 6e 74 73 20 2b 20 5b 78 2c 79   # points + [x,y
10b00 2c 7a 2c 6d 5d 20 66 6f 72 20 65 61 63 68 20 76  ,z,m] for each v
10b10 65 72 74 65 78 20 2a 2f 0a 09 20 20 62 72 65 61  ertex */..  brea
10b20 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41  k;.      case GA
10b30 49 41 5f 50 4f 4c 59 47 4f 4e 3a 0a 09 20 20 72  IA_POLYGON:..  r
10b40 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e 45 78 74 65  ng = polyg->Exte
10b50 72 69 6f 72 3b 0a 09 20 20 2a 73 69 7a 65 20 2b  rior;..  *size +
10b60 3d 20 28 38 20 2b 20 28 28 73 69 7a 65 6f 66 20  = (8 + ((sizeof 
10b70 28 64 6f 75 62 6c 65 29 20 2a 20 32 29 20 2a 20  (double) * 2) * 
10b80 72 6e 67 2d 3e 50 6f 69 6e 74 73 29 29 3b 09 2f  rng->Points));./
10b90 2a 20 23 20 72 69 6e 67 73 20 2b 20 23 20 70 6f  * # rings + # po
10ba0 69 6e 74 73 20 2b 20 5b 78 2e 79 5d 20 61 72 72  ints + [x.y] arr
10bb0 61 79 20 2d 20 65 78 74 65 72 69 6f 72 20 72 69  ay - exterior ri
10bc0 6e 67 20 2a 2f 0a 09 20 20 66 6f 72 20 28 69 62  ng */..  for (ib
10bd0 20 3d 20 30 3b 20 69 62 20 3c 20 70 6f 6c 79 67   = 0; ib < polyg
10be0 2d 3e 4e 75 6d 49 6e 74 65 72 69 6f 72 73 3b 20  ->NumInteriors; 
10bf0 69 62 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09 72  ib++)..    {...r
10c00 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e 49 6e 74 65  ng = polyg->Inte
10c10 72 69 6f 72 73 20 2b 20 69 62 3b 0a 09 09 2a 73  riors + ib;...*s
10c20 69 7a 65 20 2b 3d 20 28 34 20 2b 20 28 28 73 69  ize += (4 + ((si
10c30 7a 65 6f 66 20 28 64 6f 75 62 6c 65 29 20 2a 20  zeof (double) * 
10c40 32 29 20 2a 20 72 6e 67 2d 3e 50 6f 69 6e 74 73  2) * rng->Points
10c50 29 29 3b 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20  ));./* # points 
10c60 2b 20 5b 78 2c 79 5d 20 61 72 72 61 79 20 2d 20  + [x,y] array - 
10c70 69 6e 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f  interior ring */
10c80 0a 09 20 20 20 20 7d 0a 09 20 20 62 72 65 61 6b  ..    }..  break
10c90 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  ;.      case GAI
10ca0 41 5f 50 4f 4c 59 47 4f 4e 5a 3a 0a 09 20 20 72  A_POLYGONZ:..  r
10cb0 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e 45 78 74 65  ng = polyg->Exte
10cc0 72 69 6f 72 3b 0a 09 20 20 2a 73 69 7a 65 20 2b  rior;..  *size +
10cd0 3d 20 28 38 20 2b 20 28 28 73 69 7a 65 6f 66 20  = (8 + ((sizeof 
10ce0 28 64 6f 75 62 6c 65 29 20 2a 20 33 29 20 2a 20  (double) * 3) * 
10cf0 72 6e 67 2d 3e 50 6f 69 6e 74 73 29 29 3b 09 2f  rng->Points));./
10d00 2a 20 23 20 72 69 6e 67 73 20 2b 20 23 20 70 6f  * # rings + # po
10d10 69 6e 74 73 20 2b 20 5b 78 2c 79 2c 7a 5d 20 61  ints + [x,y,z] a
10d20 72 72 61 79 20 2d 20 65 78 74 65 72 69 6f 72 20  rray - exterior 
10d30 72 69 6e 67 20 2a 2f 0a 09 20 20 66 6f 72 20 28  ring */..  for (
10d40 69 62 20 3d 20 30 3b 20 69 62 20 3c 20 70 6f 6c  ib = 0; ib < pol
10d50 79 67 2d 3e 4e 75 6d 49 6e 74 65 72 69 6f 72 73  yg->NumInteriors
10d60 3b 20 69 62 2b 2b 29 0a 09 20 20 20 20 7b 0a 09  ; ib++)..    {..
10d70 09 72 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e 49 6e  .rng = polyg->In
10d80 74 65 72 69 6f 72 73 20 2b 20 69 62 3b 0a 09 09  teriors + ib;...
10d90 2a 73 69 7a 65 20 2b 3d 20 28 34 20 2b 20 28 28  *size += (4 + ((
10da0 73 69 7a 65 6f 66 20 28 64 6f 75 62 6c 65 29 20  sizeof (double) 
10db0 2a 20 33 29 20 2a 20 72 6e 67 2d 3e 50 6f 69 6e  * 3) * rng->Poin
10dc0 74 73 29 29 3b 09 2f 2a 20 23 20 70 6f 69 6e 74  ts));./* # point
10dd0 73 20 2b 20 5b 78 2c 79 2c 7a 5d 20 61 72 72 61  s + [x,y,z] arra
10de0 79 20 2d 20 69 6e 74 65 72 69 6f 72 20 72 69 6e  y - interior rin
10df0 67 20 2a 2f 0a 09 20 20 20 20 7d 0a 09 20 20 62  g */..    }..  b
10e00 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
10e10 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 4d 3a 0a   GAIA_POLYGONM:.
10e20 09 20 20 72 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e  .  rng = polyg->
10e30 45 78 74 65 72 69 6f 72 3b 0a 09 20 20 2a 73 69  Exterior;..  *si
10e40 7a 65 20 2b 3d 20 28 38 20 2b 20 28 28 73 69 7a  ze += (8 + ((siz
10e50 65 6f 66 20 28 64 6f 75 62 6c 65 29 20 2a 20 33  eof (double) * 3
10e60 29 20 2a 20 72 6e 67 2d 3e 50 6f 69 6e 74 73 29  ) * rng->Points)
10e70 29 3b 09 2f 2a 20 23 20 72 69 6e 67 73 20 2b 20  );./* # rings + 
10e80 23 20 70 6f 69 6e 74 73 20 2b 20 5b 78 2c 79 2c  # points + [x,y,
10e90 6d 5d 20 61 72 72 61 79 20 2d 20 65 78 74 65 72  m] array - exter
10ea0 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 20 20 66  ior ring */..  f
10eb0 6f 72 20 28 69 62 20 3d 20 30 3b 20 69 62 20 3c  or (ib = 0; ib <
10ec0 20 70 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74 65 72   polyg->NumInter
10ed0 69 6f 72 73 3b 20 69 62 2b 2b 29 0a 09 20 20 20  iors; ib++)..   
10ee0 20 7b 0a 09 09 72 6e 67 20 3d 20 70 6f 6c 79 67   {...rng = polyg
10ef0 2d 3e 49 6e 74 65 72 69 6f 72 73 20 2b 20 69 62  ->Interiors + ib
10f00 3b 0a 09 09 2a 73 69 7a 65 20 2b 3d 20 28 34 20  ;...*size += (4 
10f10 2b 20 28 28 73 69 7a 65 6f 66 20 28 64 6f 75 62  + ((sizeof (doub
10f20 6c 65 29 20 2a 20 33 29 20 2a 20 72 6e 67 2d 3e  le) * 3) * rng->
10f30 50 6f 69 6e 74 73 29 29 3b 09 2f 2a 20 23 20 70  Points));./* # p
10f40 6f 69 6e 74 73 20 2b 20 5b 78 2c 79 2c 6d 5d 20  oints + [x,y,m] 
10f50 61 72 72 61 79 20 2d 20 69 6e 74 65 72 69 6f 72  array - interior
10f60 20 72 69 6e 67 20 2a 2f 0a 09 20 20 20 20 7d 0a   ring */..    }.
10f70 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
10f80 63 61 73 65 20 47 41 49 41 5f 50 4f 4c 59 47 4f  case GAIA_POLYGO
10f90 4e 5a 4d 3a 0a 09 20 20 72 6e 67 20 3d 20 70 6f  NZM:..  rng = po
10fa0 6c 79 67 2d 3e 45 78 74 65 72 69 6f 72 3b 0a 09  lyg->Exterior;..
10fb0 20 20 2a 73 69 7a 65 20 2b 3d 20 28 38 20 2b 20    *size += (8 + 
10fc0 28 28 73 69 7a 65 6f 66 20 28 64 6f 75 62 6c 65  ((sizeof (double
10fd0 29 20 2a 20 34 29 20 2a 20 72 6e 67 2d 3e 50 6f  ) * 4) * rng->Po
10fe0 69 6e 74 73 29 29 3b 09 2f 2a 20 23 20 72 69 6e  ints));./* # rin
10ff0 67 73 20 2b 20 23 20 70 6f 69 6e 74 73 20 2b 20  gs + # points + 
11000 5b 78 2c 79 2c 7a 2c 6d 5d 20 61 72 72 61 79 20  [x,y,z,m] array 
11010 2d 20 65 78 74 65 72 69 6f 72 20 72 69 6e 67 20  - exterior ring 
11020 2a 2f 0a 09 20 20 66 6f 72 20 28 69 62 20 3d 20  */..  for (ib = 
11030 30 3b 20 69 62 20 3c 20 70 6f 6c 79 67 2d 3e 4e  0; ib < polyg->N
11040 75 6d 49 6e 74 65 72 69 6f 72 73 3b 20 69 62 2b  umInteriors; ib+
11050 2b 29 0a 09 20 20 20 20 7b 0a 09 09 72 6e 67 20  +)..    {...rng 
11060 3d 20 70 6f 6c 79 67 2d 3e 49 6e 74 65 72 69 6f  = polyg->Interio
11070 72 73 20 2b 20 69 62 3b 0a 09 09 2a 73 69 7a 65  rs + ib;...*size
11080 20 2b 3d 20 28 34 20 2b 20 28 28 73 69 7a 65 6f   += (4 + ((sizeo
11090 66 20 28 64 6f 75 62 6c 65 29 20 2a 20 34 29 20  f (double) * 4) 
110a0 2a 20 72 6e 67 2d 3e 50 6f 69 6e 74 73 29 29 3b  * rng->Points));
110b0 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20 2b 20 5b  ./* # points + [
110c0 78 2c 79 2c 7a 2c 6d 5d 20 61 72 72 61 79 20 2d  x,y,z,m] array -
110d0 20 69 6e 74 65 72 69 6f 72 20 72 69 6e 67 20 2a   interior ring *
110e0 2f 0a 09 20 20 20 20 7d 0a 09 20 20 62 72 65 61  /..    }..  brea
110f0 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  k;.      default
11100 3a 0a 09 20 20 2f 2a 20 74 68 69 73 20 6f 6e 65  :..  /* this one
11110 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65   is not a simple
11120 20 67 65 6f 6d 65 74 72 79 3b 20 73 68 6f 75 6c   geometry; shoul
11130 64 20 62 65 20 61 20 4d 55 4c 54 49 78 78 78 78  d be a MULTIxxxx
11140 20 6f 72 20 61 20 47 45 4f 4d 45 54 52 59 43 4f   or a GEOMETRYCO
11150 4c 4c 45 43 54 49 4f 4e 20 2a 2f 0a 09 20 20 2a  LLECTION */..  *
11160 73 69 7a 65 20 2b 3d 20 34 3b 09 09 2f 2a 20 23  size += 4;../* #
11170 20 65 6e 74 69 74 69 65 73 20 2a 2f 0a 09 20 20   entities */..  
11180 70 6f 69 6e 74 20 3d 20 67 65 6f 6d 2d 3e 46 69  point = geom->Fi
11190 72 73 74 50 6f 69 6e 74 3b 0a 09 20 20 77 68 69  rstPoint;..  whi
111a0 6c 65 20 28 70 6f 69 6e 74 29 0a 09 20 20 20 20  le (point)..    
111b0 7b 0a 09 09 2a 73 69 7a 65 20 2b 3d 20 35 3b 09  {...*size += 5;.
111c0 2f 2a 20 65 6e 74 69 74 79 20 68 65 61 64 65 72  /* entity header
111d0 20 2a 2f 0a 09 09 69 66 20 28 67 65 6f 6d 2d 3e   */...if (geom->
111e0 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
111f0 3d 20 47 41 49 41 5f 58 59 5f 5a 0a 09 09 20 20  = GAIA_XY_Z...  
11200 20 20 7c 7c 20 67 65 6f 6d 2d 3e 44 69 6d 65 6e    || geom->Dimen
11210 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
11220 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20 2a 73  A_XY_M)...    *s
11230 69 7a 65 20 2b 3d 20 28 73 69 7a 65 6f 66 20 28  ize += (sizeof (
11240 64 6f 75 62 6c 65 29 20 2a 20 33 29 3b 09 2f 2a  double) * 3);./*
11250 20 74 68 72 65 65 20 64 6f 75 62 6c 65 73 20 66   three doubles f
11260 6f 72 20 65 61 63 68 20 50 4f 49 4e 54 20 2a 2f  or each POINT */
11270 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d  ...else if (geom
11280 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
11290 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29   == GAIA_XY_Z_M)
112a0 0a 09 09 20 20 20 20 2a 73 69 7a 65 20 2b 3d 20  ...    *size += 
112b0 28 73 69 7a 65 6f 66 20 28 64 6f 75 62 6c 65 29  (sizeof (double)
112c0 20 2a 20 34 29 3b 09 2f 2a 20 66 6f 75 72 20 64   * 4);./* four d
112d0 6f 75 62 6c 65 73 20 66 6f 72 20 65 61 63 68 20  oubles for each 
112e0 50 4f 49 4e 54 20 2a 2f 0a 09 09 65 6c 73 65 0a  POINT */...else.
112f0 09 09 20 20 20 20 2a 73 69 7a 65 20 2b 3d 20 28  ..    *size += (
11300 73 69 7a 65 6f 66 20 28 64 6f 75 62 6c 65 29 20  sizeof (double) 
11310 2a 20 32 29 3b 09 2f 2a 20 74 77 6f 20 64 6f 75  * 2);./* two dou
11320 62 6c 65 73 20 66 6f 72 20 65 61 63 68 20 50 4f  bles for each PO
11330 49 4e 54 20 2a 2f 0a 09 09 70 6f 69 6e 74 20 3d  INT */...point =
11340 20 70 6f 69 6e 74 2d 3e 4e 65 78 74 3b 0a 09 20   point->Next;.. 
11350 20 20 20 7d 0a 09 20 20 6c 69 6e 65 20 3d 20 67     }..  line = g
11360 65 6f 6d 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74  eom->FirstLinest
11370 72 69 6e 67 3b 0a 09 20 20 77 68 69 6c 65 20 28  ring;..  while (
11380 6c 69 6e 65 29 0a 09 20 20 20 20 7b 0a 09 09 2a  line)..    {...*
11390 73 69 7a 65 20 2b 3d 20 35 3b 09 2f 2a 20 65 6e  size += 5;./* en
113a0 74 69 74 79 20 68 65 61 64 65 72 20 2a 2f 0a 09  tity header */..
113b0 09 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e  .if (geom->Dimen
113c0 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
113d0 41 5f 58 59 5f 5a 0a 09 09 20 20 20 20 7c 7c 20  A_XY_Z...    || 
113e0 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d  geom->DimensionM
113f0 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f  odel == GAIA_XY_
11400 4d 29 0a 09 09 20 20 20 20 2a 73 69 7a 65 20 2b  M)...    *size +
11410 3d 20 28 34 20 2b 20 28 28 73 69 7a 65 6f 66 20  = (4 + ((sizeof 
11420 28 64 6f 75 62 6c 65 29 20 2a 20 33 29 20 2a 20  (double) * 3) * 
11430 6c 69 6e 65 2d 3e 50 6f 69 6e 74 73 29 29 3b 09  line->Points));.
11440 2f 2a 20 23 20 70 6f 69 6e 74 73 20 2b 20 5b 78  /* # points + [x
11450 2c 79 2c 7a 5d 20 66 6f 72 20 65 61 63 68 20 76  ,y,z] for each v
11460 65 72 74 65 78 20 2a 2f 0a 09 09 65 6c 73 65 20  ertex */...else 
11470 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
11480 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
11490 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20 20 2a  _XY_Z_M)...    *
114a0 73 69 7a 65 20 2b 3d 20 28 34 20 2b 20 28 28 73  size += (4 + ((s
114b0 69 7a 65 6f 66 20 28 64 6f 75 62 6c 65 29 20 2a  izeof (double) *
114c0 20 34 29 20 2a 20 6c 69 6e 65 2d 3e 50 6f 69 6e   4) * line->Poin
114d0 74 73 29 29 3b 09 2f 2a 20 23 20 70 6f 69 6e 74  ts));./* # point
114e0 73 20 2b 20 5b 78 2c 79 2c 7a 2c 6d 5d 20 66 6f  s + [x,y,z,m] fo
114f0 72 20 65 61 63 68 20 76 65 72 74 65 78 20 2a 2f  r each vertex */
11500 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 2a 73  ...else...    *s
11510 69 7a 65 20 2b 3d 20 28 34 20 2b 20 28 28 73 69  ize += (4 + ((si
11520 7a 65 6f 66 20 28 64 6f 75 62 6c 65 29 20 2a 20  zeof (double) * 
11530 32 29 20 2a 20 6c 69 6e 65 2d 3e 50 6f 69 6e 74  2) * line->Point
11540 73 29 29 3b 09 2f 2a 20 23 20 70 6f 69 6e 74 73  s));./* # points
11550 20 2b 20 5b 78 2c 79 5d 20 66 6f 72 20 65 61 63   + [x,y] for eac
11560 68 20 76 65 72 74 65 78 20 2a 2f 0a 09 09 6c 69  h vertex */...li
11570 6e 65 20 3d 20 6c 69 6e 65 2d 3e 4e 65 78 74 3b  ne = line->Next;
11580 0a 09 20 20 20 20 7d 0a 09 20 20 70 6f 6c 79 67  ..    }..  polyg
11590 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73 74 50 6f   = geom->FirstPo
115a0 6c 79 67 6f 6e 3b 0a 09 20 20 77 68 69 6c 65 20  lygon;..  while 
115b0 28 70 6f 6c 79 67 29 0a 09 20 20 20 20 7b 0a 09  (polyg)..    {..
115c0 09 2a 73 69 7a 65 20 2b 3d 20 35 3b 09 2f 2a 20  .*size += 5;./* 
115d0 65 6e 74 69 74 79 20 68 65 61 64 65 72 20 2a 2f  entity header */
115e0 0a 09 09 72 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e  ...rng = polyg->
115f0 45 78 74 65 72 69 6f 72 3b 0a 09 09 69 66 20 28  Exterior;...if (
11600 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d  geom->DimensionM
11610 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f  odel == GAIA_XY_
11620 5a 0a 09 09 20 20 20 20 7c 7c 20 67 65 6f 6d 2d  Z...    || geom-
11630 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
11640 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09  == GAIA_XY_M)...
11650 20 20 20 20 2a 73 69 7a 65 20 2b 3d 20 28 38 20      *size += (8 
11660 2b 20 28 28 73 69 7a 65 6f 66 20 28 64 6f 75 62  + ((sizeof (doub
11670 6c 65 29 20 2a 20 33 29 20 2a 20 72 6e 67 2d 3e  le) * 3) * rng->
11680 50 6f 69 6e 74 73 29 29 3b 09 2f 2a 20 23 20 72  Points));./* # r
11690 69 6e 67 73 20 2b 20 23 20 70 6f 69 6e 74 73 20  ings + # points 
116a0 2b 20 5b 78 2c 79 2c 7a 5d 20 61 72 72 61 79 20  + [x,y,z] array 
116b0 2d 20 65 78 74 65 72 69 6f 72 20 72 69 6e 67 20  - exterior ring 
116c0 2a 2f 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65  */...else if (ge
116d0 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  om->DimensionMod
116e0 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f  el == GAIA_XY_Z_
116f0 4d 29 0a 09 09 20 20 20 20 2a 73 69 7a 65 20 2b  M)...    *size +
11700 3d 20 28 38 20 2b 20 28 28 73 69 7a 65 6f 66 20  = (8 + ((sizeof 
11710 28 64 6f 75 62 6c 65 29 20 2a 20 34 29 20 2a 20  (double) * 4) * 
11720 72 6e 67 2d 3e 50 6f 69 6e 74 73 29 29 3b 09 2f  rng->Points));./
11730 2a 20 23 20 72 69 6e 67 73 20 2b 20 23 20 70 6f  * # rings + # po
11740 69 6e 74 73 20 2b 20 5b 78 2c 79 2c 7a 2c 6d 5d  ints + [x,y,z,m]
11750 20 61 72 72 61 79 20 2d 20 65 78 74 65 72 69 6f   array - exterio
11760 72 20 72 69 6e 67 20 2a 2f 0a 09 09 65 6c 73 65  r ring */...else
11770 0a 09 09 20 20 20 20 2a 73 69 7a 65 20 2b 3d 20  ...    *size += 
11780 28 38 20 2b 20 28 28 73 69 7a 65 6f 66 20 28 64  (8 + ((sizeof (d
11790 6f 75 62 6c 65 29 20 2a 20 32 29 20 2a 20 72 6e  ouble) * 2) * rn
117a0 67 2d 3e 50 6f 69 6e 74 73 29 29 3b 09 2f 2a 20  g->Points));./* 
117b0 23 20 72 69 6e 67 73 20 2b 20 23 20 70 6f 69 6e  # rings + # poin
117c0 74 73 20 2b 20 5b 78 2c 79 5d 20 61 72 72 61 79  ts + [x,y] array
117d0 20 2d 20 65 78 74 65 72 69 6f 72 20 72 69 6e 67   - exterior ring
117e0 20 2a 2f 0a 09 09 66 6f 72 20 28 69 62 20 3d 20   */...for (ib = 
117f0 30 3b 20 69 62 20 3c 20 70 6f 6c 79 67 2d 3e 4e  0; ib < polyg->N
11800 75 6d 49 6e 74 65 72 69 6f 72 73 3b 20 69 62 2b  umInteriors; ib+
11810 2b 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20  +)...  {...     
11820 20 72 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e 49 6e   rng = polyg->In
11830 74 65 72 69 6f 72 73 20 2b 20 69 62 3b 0a 09 09  teriors + ib;...
11840 20 20 20 20 20 20 69 66 20 28 67 65 6f 6d 2d 3e        if (geom->
11850 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
11860 3d 20 47 41 49 41 5f 58 59 5f 5a 0a 09 09 09 20  = GAIA_XY_Z.... 
11870 20 7c 7c 20 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73   || geom->Dimens
11880 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
11890 5f 58 59 5f 4d 29 0a 09 09 09 20 20 2a 73 69 7a  _XY_M)....  *siz
118a0 65 20 2b 3d 20 28 34 20 2b 20 28 28 73 69 7a 65  e += (4 + ((size
118b0 6f 66 20 28 64 6f 75 62 6c 65 29 20 2a 20 33 29  of (double) * 3)
118c0 20 2a 20 72 6e 67 2d 3e 50 6f 69 6e 74 73 29 29   * rng->Points))
118d0 3b 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20 2b 20  ;./* # points + 
118e0 5b 78 2c 79 2c 7a 5d 20 61 72 72 61 79 20 2d 20  [x,y,z] array - 
118f0 69 6e 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f  interior ring */
11900 0a 09 09 20 20 20 20 20 20 65 6c 73 65 20 69 66  ...      else if
11910 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f   (geom->Dimensio
11920 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
11930 59 5f 5a 5f 4d 29 0a 09 09 09 20 20 2a 73 69 7a  Y_Z_M)....  *siz
11940 65 20 2b 3d 20 28 34 20 2b 20 28 28 73 69 7a 65  e += (4 + ((size
11950 6f 66 20 28 64 6f 75 62 6c 65 29 20 2a 20 34 29  of (double) * 4)
11960 20 2a 20 72 6e 67 2d 3e 50 6f 69 6e 74 73 29 29   * rng->Points))
11970 3b 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20 2b 20  ;./* # points + 
11980 5b 78 2c 79 2c 7a 2c 6d 5d 20 61 72 72 61 79 20  [x,y,z,m] array 
11990 2d 20 69 6e 74 65 72 69 6f 72 20 72 69 6e 67 20  - interior ring 
119a0 2a 2f 0a 09 09 20 20 20 20 20 20 65 6c 73 65 0a  */...      else.
119b0 09 09 09 20 20 2a 73 69 7a 65 20 2b 3d 20 28 34  ...  *size += (4
119c0 20 2b 20 28 28 73 69 7a 65 6f 66 20 28 64 6f 75   + ((sizeof (dou
119d0 62 6c 65 29 20 2a 20 32 29 20 2a 20 72 6e 67 2d  ble) * 2) * rng-
119e0 3e 50 6f 69 6e 74 73 29 29 3b 09 2f 2a 20 23 20  >Points));./* # 
119f0 70 6f 69 6e 74 73 20 2b 20 5b 78 2c 79 5d 20 61  points + [x,y] a
11a00 72 72 61 79 20 2d 20 69 6e 74 65 72 69 6f 72 20  rray - interior 
11a10 72 69 6e 67 20 2a 2f 0a 09 09 20 20 7d 0a 09 09  ring */...  }...
11a20 70 6f 6c 79 67 20 3d 20 70 6f 6c 79 67 2d 3e 4e  polyg = polyg->N
11a30 65 78 74 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20  ext;..    }.    
11a40 20 20 7d 3b 0a 20 20 20 20 2a 72 65 73 75 6c 74    };.    *result
11a50 20 3d 20 6d 61 6c 6c 6f 63 20 28 2a 73 69 7a 65   = malloc (*size
11a60 29 3b 0a 20 20 20 20 70 74 72 20 3d 20 2a 72 65  );.    ptr = *re
11a70 73 75 6c 74 3b 0a 2f 2a 20 61 6e 64 20 66 69 6e  sult;./* and fin
11a80 61 6c 6c 79 20 77 65 20 62 75 69 6c 64 20 74 68  ally we build th
11a90 65 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 73 77  e BLOB */.    sw
11aa0 69 74 63 68 20 28 74 79 70 65 29 0a 20 20 20 20  itch (type).    
11ab0 20 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 47    {.      case G
11ac0 41 49 41 5f 50 4f 49 4e 54 3a 0a 09 20 20 2a 70  AIA_POINT:..  *p
11ad0 74 72 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 53  tr = GAIA_MARK_S
11ae0 54 41 52 54 3b 09 2f 2a 20 53 54 41 52 54 20 73  TART;./* START s
11af0 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20 2a  ignature */..  *
11b00 28 70 74 72 20 2b 20 31 29 20 3d 20 47 41 49 41  (ptr + 1) = GAIA
11b10 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 3b 09  _LITTLE_ENDIAN;.
11b20 2f 2a 20 62 79 74 65 20 6f 72 64 65 72 69 6e 67  /* byte ordering
11b30 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72   */..  gaiaExpor
11b40 74 33 32 20 28 70 74 72 20 2b 20 32 2c 20 67 65  t32 (ptr + 2, ge
11b50 6f 6d 2d 3e 53 72 69 64 2c 20 31 2c 20 65 6e 64  om->Srid, 1, end
11b60 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 74 68  ian_arch);./* th
11b70 65 20 53 52 49 44 20 2a 2f 0a 09 20 20 67 61 69  e SRID */..  gai
11b80 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b  aExport64 (ptr +
11b90 20 36 2c 20 67 65 6f 6d 2d 3e 4d 69 6e 58 2c 20   6, geom->MinX, 
11ba0 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
11bb0 09 2f 2a 20 4d 42 52 20 2d 20 6d 69 6e 69 6d 75  ./* MBR - minimu
11bc0 6d 20 58 20 2a 2f 0a 09 20 20 67 61 69 61 45 78  m X */..  gaiaEx
11bd0 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 31 34  port64 (ptr + 14
11be0 2c 20 67 65 6f 6d 2d 3e 4d 69 6e 59 2c 20 31 2c  , geom->MinY, 1,
11bf0 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
11c00 2a 20 4d 42 52 20 2d 20 6d 69 6e 69 6d 75 6d 20  * MBR - minimum 
11c10 59 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f  Y */..  gaiaExpo
11c20 72 74 36 34 20 28 70 74 72 20 2b 20 32 32 2c 20  rt64 (ptr + 22, 
11c30 67 65 6f 6d 2d 3e 4d 61 78 58 2c 20 31 2c 20 65  geom->MaxX, 1, e
11c40 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
11c50 4d 42 52 20 2d 20 6d 61 78 69 6d 75 6d 20 58 20  MBR - maximum X 
11c60 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74  */..  gaiaExport
11c70 36 34 20 28 70 74 72 20 2b 20 33 30 2c 20 67 65  64 (ptr + 30, ge
11c80 6f 6d 2d 3e 4d 61 78 59 2c 20 31 2c 20 65 6e 64  om->MaxY, 1, end
11c90 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42  ian_arch);./* MB
11ca0 52 20 2d 20 6d 61 78 69 6d 75 6d 20 59 20 2a 2f  R - maximum Y */
11cb0 0a 09 20 20 2a 28 70 74 72 20 2b 20 33 38 29 20  ..  *(ptr + 38) 
11cc0 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 4d 42 52 3b  = GAIA_MARK_MBR;
11cd0 09 2f 2a 20 4d 42 52 20 73 69 67 6e 61 74 75 72  ./* MBR signatur
11ce0 65 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f  e */..  gaiaExpo
11cf0 72 74 33 32 20 28 70 74 72 20 2b 20 33 39 2c 20  rt32 (ptr + 39, 
11d00 47 41 49 41 5f 50 4f 49 4e 54 2c 20 31 2c 20 65  GAIA_POINT, 1, e
11d10 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
11d20 63 6c 61 73 73 20 50 4f 49 4e 54 20 2a 2f 0a 09  class POINT */..
11d30 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28    gaiaExport64 (
11d40 70 74 72 20 2b 20 34 33 2c 20 70 6f 69 6e 74 2d  ptr + 43, point-
11d50 3e 58 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72  >X, 1, endian_ar
11d60 63 68 29 3b 09 2f 2a 20 58 20 2a 2f 0a 09 20 20  ch);./* X */..  
11d70 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74  gaiaExport64 (pt
11d80 72 20 2b 20 35 31 2c 20 70 6f 69 6e 74 2d 3e 59  r + 51, point->Y
11d90 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
11da0 29 3b 09 2f 2a 20 59 20 2a 2f 0a 09 20 20 2a 28  );./* Y */..  *(
11db0 70 74 72 20 2b 20 35 39 29 20 3d 20 47 41 49 41  ptr + 59) = GAIA
11dc0 5f 4d 41 52 4b 5f 45 4e 44 3b 09 2f 2a 20 45 4e  _MARK_END;./* EN
11dd0 44 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09  D signature */..
11de0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
11df0 61 73 65 20 47 41 49 41 5f 50 4f 49 4e 54 5a 3a  ase GAIA_POINTZ:
11e00 0a 09 20 20 2a 70 74 72 20 3d 20 47 41 49 41 5f  ..  *ptr = GAIA_
11e10 4d 41 52 4b 5f 53 54 41 52 54 3b 09 2f 2a 20 53  MARK_START;./* S
11e20 54 41 52 54 20 73 69 67 6e 61 74 75 72 65 20 2a  TART signature *
11e30 2f 0a 09 20 20 2a 28 70 74 72 20 2b 20 31 29 20  /..  *(ptr + 1) 
11e40 3d 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e  = GAIA_LITTLE_EN
11e50 44 49 41 4e 3b 09 2f 2a 20 62 79 74 65 20 6f 72  DIAN;./* byte or
11e60 64 65 72 69 6e 67 20 2a 2f 0a 09 20 20 67 61 69  dering */..  gai
11e70 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 20 2b  aExport32 (ptr +
11e80 20 32 2c 20 67 65 6f 6d 2d 3e 53 72 69 64 2c 20   2, geom->Srid, 
11e90 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
11ea0 09 2f 2a 20 74 68 65 20 53 52 49 44 20 2a 2f 0a  ./* the SRID */.
11eb0 09 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20  .  gaiaExport64 
11ec0 28 70 74 72 20 2b 20 36 2c 20 67 65 6f 6d 2d 3e  (ptr + 6, geom->
11ed0 4d 69 6e 58 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  MinX, 1, endian_
11ee0 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20  arch);./* MBR - 
11ef0 6d 69 6e 69 6d 75 6d 20 58 20 2a 2f 0a 09 20 20  minimum X */..  
11f00 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74  gaiaExport64 (pt
11f10 72 20 2b 20 31 34 2c 20 67 65 6f 6d 2d 3e 4d 69  r + 14, geom->Mi
11f20 6e 59 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72  nY, 1, endian_ar
11f30 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 69  ch);./* MBR - mi
11f40 6e 69 6d 75 6d 20 59 20 2a 2f 0a 09 20 20 67 61  nimum Y */..  ga
11f50 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20  iaExport64 (ptr 
11f60 2b 20 32 32 2c 20 67 65 6f 6d 2d 3e 4d 61 78 58  + 22, geom->MaxX
11f70 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
11f80 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 61 78 69  );./* MBR - maxi
11f90 6d 75 6d 20 58 20 2a 2f 0a 09 20 20 67 61 69 61  mum X */..  gaia
11fa0 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20  Export64 (ptr + 
11fb0 33 30 2c 20 67 65 6f 6d 2d 3e 4d 61 78 59 2c 20  30, geom->MaxY, 
11fc0 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
11fd0 09 2f 2a 20 4d 42 52 20 2d 20 6d 61 78 69 6d 75  ./* MBR - maximu
11fe0 6d 20 59 20 2a 2f 0a 09 20 20 2a 28 70 74 72 20  m Y */..  *(ptr 
11ff0 2b 20 33 38 29 20 3d 20 47 41 49 41 5f 4d 41 52  + 38) = GAIA_MAR
12000 4b 5f 4d 42 52 3b 09 2f 2a 20 4d 42 52 20 73 69  K_MBR;./* MBR si
12010 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20 67 61  gnature */..  ga
12020 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 20  iaExport32 (ptr 
12030 2b 20 33 39 2c 20 47 41 49 41 5f 50 4f 49 4e 54  + 39, GAIA_POINT
12040 5a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  Z, 1, endian_arc
12050 68 29 3b 09 2f 2a 20 63 6c 61 73 73 20 50 4f 49  h);./* class POI
12060 4e 54 20 58 59 5a 20 2a 2f 0a 09 20 20 67 61 69  NT XYZ */..  gai
12070 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b  aExport64 (ptr +
12080 20 34 33 2c 20 70 6f 69 6e 74 2d 3e 58 2c 20 31   43, point->X, 1
12090 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
120a0 2f 2a 20 58 20 2a 2f 0a 09 20 20 67 61 69 61 45  /* X */..  gaiaE
120b0 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 35  xport64 (ptr + 5
120c0 31 2c 20 70 6f 69 6e 74 2d 3e 59 2c 20 31 2c 20  1, point->Y, 1, 
120d0 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a  endian_arch);./*
120e0 20 59 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70   Y */..  gaiaExp
120f0 6f 72 74 36 34 20 28 70 74 72 20 2b 20 35 39 2c  ort64 (ptr + 59,
12100 20 70 6f 69 6e 74 2d 3e 5a 2c 20 31 2c 20 65 6e   point->Z, 1, en
12110 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 5a  dian_arch);./* Z
12120 20 2a 2f 0a 09 20 20 2a 28 70 74 72 20 2b 20 36   */..  *(ptr + 6
12130 37 29 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 45  7) = GAIA_MARK_E
12140 4e 44 3b 09 2f 2a 20 45 4e 44 20 73 69 67 6e 61  ND;./* END signa
12150 74 75 72 65 20 2a 2f 0a 09 20 20 62 72 65 61 6b  ture */..  break
12160 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  ;.      case GAI
12170 41 5f 50 4f 49 4e 54 4d 3a 0a 09 20 20 2a 70 74  A_POINTM:..  *pt
12180 72 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 53 54  r = GAIA_MARK_ST
12190 41 52 54 3b 09 2f 2a 20 53 54 41 52 54 20 73 69  ART;./* START si
121a0 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20 2a 28  gnature */..  *(
121b0 70 74 72 20 2b 20 31 29 20 3d 20 47 41 49 41 5f  ptr + 1) = GAIA_
121c0 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 3b 09 2f  LITTLE_ENDIAN;./
121d0 2a 20 62 79 74 65 20 6f 72 64 65 72 69 6e 67 20  * byte ordering 
121e0 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74  */..  gaiaExport
121f0 33 32 20 28 70 74 72 20 2b 20 32 2c 20 67 65 6f  32 (ptr + 2, geo
12200 6d 2d 3e 53 72 69 64 2c 20 31 2c 20 65 6e 64 69  m->Srid, 1, endi
12210 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 74 68 65  an_arch);./* the
12220 20 53 52 49 44 20 2a 2f 0a 09 20 20 67 61 69 61   SRID */..  gaia
12230 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20  Export64 (ptr + 
12240 36 2c 20 67 65 6f 6d 2d 3e 4d 69 6e 58 2c 20 31  6, geom->MinX, 1
12250 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
12260 2f 2a 20 4d 42 52 20 2d 20 6d 69 6e 69 6d 75 6d  /* MBR - minimum
12270 20 58 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70   X */..  gaiaExp
12280 6f 72 74 36 34 20 28 70 74 72 20 2b 20 31 34 2c  ort64 (ptr + 14,
12290 20 67 65 6f 6d 2d 3e 4d 69 6e 59 2c 20 31 2c 20   geom->MinY, 1, 
122a0 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a  endian_arch);./*
122b0 20 4d 42 52 20 2d 20 6d 69 6e 69 6d 75 6d 20 59   MBR - minimum Y
122c0 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72   */..  gaiaExpor
122d0 74 36 34 20 28 70 74 72 20 2b 20 32 32 2c 20 67  t64 (ptr + 22, g
122e0 65 6f 6d 2d 3e 4d 61 78 58 2c 20 31 2c 20 65 6e  eom->MaxX, 1, en
122f0 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d  dian_arch);./* M
12300 42 52 20 2d 20 6d 61 78 69 6d 75 6d 20 58 20 2a  BR - maximum X *
12310 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 36  /..  gaiaExport6
12320 34 20 28 70 74 72 20 2b 20 33 30 2c 20 67 65 6f  4 (ptr + 30, geo
12330 6d 2d 3e 4d 61 78 59 2c 20 31 2c 20 65 6e 64 69  m->MaxY, 1, endi
12340 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52  an_arch);./* MBR
12350 20 2d 20 6d 61 78 69 6d 75 6d 20 59 20 2a 2f 0a   - maximum Y */.
12360 09 20 20 2a 28 70 74 72 20 2b 20 33 38 29 20 3d  .  *(ptr + 38) =
12370 20 47 41 49 41 5f 4d 41 52 4b 5f 4d 42 52 3b 09   GAIA_MARK_MBR;.
12380 2f 2a 20 4d 42 52 20 73 69 67 6e 61 74 75 72 65  /* MBR signature
12390 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72   */..  gaiaExpor
123a0 74 33 32 20 28 70 74 72 20 2b 20 33 39 2c 20 47  t32 (ptr + 39, G
123b0 41 49 41 5f 50 4f 49 4e 54 4d 2c 20 31 2c 20 65  AIA_POINTM, 1, e
123c0 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
123d0 63 6c 61 73 73 20 50 4f 49 4e 54 20 58 59 4d 20  class POINT XYM 
123e0 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74  */..  gaiaExport
123f0 36 34 20 28 70 74 72 20 2b 20 34 33 2c 20 70 6f  64 (ptr + 43, po
12400 69 6e 74 2d 3e 58 2c 20 31 2c 20 65 6e 64 69 61  int->X, 1, endia
12410 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 58 20 2a 2f  n_arch);./* X */
12420 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 36 34  ..  gaiaExport64
12430 20 28 70 74 72 20 2b 20 35 31 2c 20 70 6f 69 6e   (ptr + 51, poin
12440 74 2d 3e 59 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  t->Y, 1, endian_
12450 61 72 63 68 29 3b 09 2f 2a 20 59 20 2a 2f 0a 09  arch);./* Y */..
12460 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28    gaiaExport64 (
12470 70 74 72 20 2b 20 35 39 2c 20 70 6f 69 6e 74 2d  ptr + 59, point-
12480 3e 4d 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72  >M, 1, endian_ar
12490 63 68 29 3b 09 2f 2a 20 4d 20 2a 2f 0a 09 20 20  ch);./* M */..  
124a0 2a 28 70 74 72 20 2b 20 36 37 29 20 3d 20 47 41  *(ptr + 67) = GA
124b0 49 41 5f 4d 41 52 4b 5f 45 4e 44 3b 09 2f 2a 20  IA_MARK_END;./* 
124c0 45 4e 44 20 73 69 67 6e 61 74 75 72 65 20 2a 2f  END signature */
124d0 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
124e0 20 63 61 73 65 20 47 41 49 41 5f 50 4f 49 4e 54   case GAIA_POINT
124f0 5a 4d 3a 0a 09 20 20 2a 70 74 72 20 3d 20 47 41  ZM:..  *ptr = GA
12500 49 41 5f 4d 41 52 4b 5f 53 54 41 52 54 3b 09 2f  IA_MARK_START;./
12510 2a 20 53 54 41 52 54 20 73 69 67 6e 61 74 75 72  * START signatur
12520 65 20 2a 2f 0a 09 20 20 2a 28 70 74 72 20 2b 20  e */..  *(ptr + 
12530 31 29 20 3d 20 47 41 49 41 5f 4c 49 54 54 4c 45  1) = GAIA_LITTLE
12540 5f 45 4e 44 49 41 4e 3b 09 2f 2a 20 62 79 74 65  _ENDIAN;./* byte
12550 20 6f 72 64 65 72 69 6e 67 20 2a 2f 0a 09 20 20   ordering */..  
12560 67 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74  gaiaExport32 (pt
12570 72 20 2b 20 32 2c 20 67 65 6f 6d 2d 3e 53 72 69  r + 2, geom->Sri
12580 64 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  d, 1, endian_arc
12590 68 29 3b 09 2f 2a 20 74 68 65 20 53 52 49 44 20  h);./* the SRID 
125a0 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74  */..  gaiaExport
125b0 36 34 20 28 70 74 72 20 2b 20 36 2c 20 67 65 6f  64 (ptr + 6, geo
125c0 6d 2d 3e 4d 69 6e 58 2c 20 31 2c 20 65 6e 64 69  m->MinX, 1, endi
125d0 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52  an_arch);./* MBR
125e0 20 2d 20 6d 69 6e 69 6d 75 6d 20 58 20 2a 2f 0a   - minimum X */.
125f0 09 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20  .  gaiaExport64 
12600 28 70 74 72 20 2b 20 31 34 2c 20 67 65 6f 6d 2d  (ptr + 14, geom-
12610 3e 4d 69 6e 59 2c 20 31 2c 20 65 6e 64 69 61 6e  >MinY, 1, endian
12620 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d  _arch);./* MBR -
12630 20 6d 69 6e 69 6d 75 6d 20 59 20 2a 2f 0a 09 20   minimum Y */.. 
12640 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70   gaiaExport64 (p
12650 74 72 20 2b 20 32 32 2c 20 67 65 6f 6d 2d 3e 4d  tr + 22, geom->M
12660 61 78 58 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  axX, 1, endian_a
12670 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d  rch);./* MBR - m
12680 61 78 69 6d 75 6d 20 58 20 2a 2f 0a 09 20 20 67  aximum X */..  g
12690 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
126a0 20 2b 20 33 30 2c 20 67 65 6f 6d 2d 3e 4d 61 78   + 30, geom->Max
126b0 59 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  Y, 1, endian_arc
126c0 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 61 78  h);./* MBR - max
126d0 69 6d 75 6d 20 59 20 2a 2f 0a 09 20 20 2a 28 70  imum Y */..  *(p
126e0 74 72 20 2b 20 33 38 29 20 3d 20 47 41 49 41 5f  tr + 38) = GAIA_
126f0 4d 41 52 4b 5f 4d 42 52 3b 09 2f 2a 20 4d 42 52  MARK_MBR;./* MBR
12700 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20   signature */.. 
12710 20 67 61 69 61 45 78 70 6f 72 74 33 32 20 28 70   gaiaExport32 (p
12720 74 72 20 2b 20 33 39 2c 20 47 41 49 41 5f 50 4f  tr + 39, GAIA_PO
12730 49 4e 54 5a 4d 2c 20 31 2c 20 65 6e 64 69 61 6e  INTZM, 1, endian
12740 5f 61 72 63 68 29 3b 09 2f 2a 20 63 6c 61 73 73  _arch);./* class
12750 20 50 4f 49 4e 54 20 58 59 5a 4d 20 2a 2f 0a 09   POINT XYZM */..
12760 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28    gaiaExport64 (
12770 70 74 72 20 2b 20 34 33 2c 20 70 6f 69 6e 74 2d  ptr + 43, point-
12780 3e 58 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72  >X, 1, endian_ar
12790 63 68 29 3b 09 2f 2a 20 58 20 2a 2f 0a 09 20 20  ch);./* X */..  
127a0 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74  gaiaExport64 (pt
127b0 72 20 2b 20 35 31 2c 20 70 6f 69 6e 74 2d 3e 59  r + 51, point->Y
127c0 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
127d0 29 3b 09 2f 2a 20 59 20 2a 2f 0a 09 20 20 67 61  );./* Y */..  ga
127e0 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20  iaExport64 (ptr 
127f0 2b 20 35 39 2c 20 70 6f 69 6e 74 2d 3e 5a 2c 20  + 59, point->Z, 
12800 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
12810 09 2f 2a 20 4d 20 2a 2f 0a 09 20 20 67 61 69 61  ./* M */..  gaia
12820 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20  Export64 (ptr + 
12830 36 37 2c 20 70 6f 69 6e 74 2d 3e 4d 2c 20 31 2c  67, point->M, 1,
12840 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
12850 2a 20 5a 20 2a 2f 0a 09 20 20 2a 28 70 74 72 20  * Z */..  *(ptr 
12860 2b 20 37 35 29 20 3d 20 47 41 49 41 5f 4d 41 52  + 75) = GAIA_MAR
12870 4b 5f 45 4e 44 3b 09 2f 2a 20 45 4e 44 20 73 69  K_END;./* END si
12880 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20 62 72  gnature */..  br
12890 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
128a0 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 3a  GAIA_LINESTRING:
128b0 0a 09 20 20 2a 70 74 72 20 3d 20 47 41 49 41 5f  ..  *ptr = GAIA_
128c0 4d 41 52 4b 5f 53 54 41 52 54 3b 09 2f 2a 20 53  MARK_START;./* S
128d0 54 41 52 54 20 73 69 67 6e 61 74 75 72 65 20 2a  TART signature *
128e0 2f 0a 09 20 20 2a 28 70 74 72 20 2b 20 31 29 20  /..  *(ptr + 1) 
128f0 3d 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e  = GAIA_LITTLE_EN
12900 44 49 41 4e 3b 09 2f 2a 20 62 79 74 65 20 6f 72  DIAN;./* byte or
12910 64 65 72 69 6e 67 20 2a 2f 0a 09 20 20 67 61 69  dering */..  gai
12920 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 20 2b  aExport32 (ptr +
12930 20 32 2c 20 67 65 6f 6d 2d 3e 53 72 69 64 2c 20   2, geom->Srid, 
12940 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
12950 09 2f 2a 20 74 68 65 20 53 52 49 44 20 2a 2f 0a  ./* the SRID */.
12960 09 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20  .  gaiaExport64 
12970 28 70 74 72 20 2b 20 36 2c 20 67 65 6f 6d 2d 3e  (ptr + 6, geom->
12980 4d 69 6e 58 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  MinX, 1, endian_
12990 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20  arch);./* MBR - 
129a0 6d 69 6e 69 6d 75 6d 20 58 20 2a 2f 0a 09 20 20  minimum X */..  
129b0 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74  gaiaExport64 (pt
129c0 72 20 2b 20 31 34 2c 20 67 65 6f 6d 2d 3e 4d 69  r + 14, geom->Mi
129d0 6e 59 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72  nY, 1, endian_ar
129e0 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 69  ch);./* MBR - mi
129f0 6e 69 6d 75 6d 20 59 20 2a 2f 0a 09 20 20 67 61  nimum Y */..  ga
12a00 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20  iaExport64 (ptr 
12a10 2b 20 32 32 2c 20 67 65 6f 6d 2d 3e 4d 61 78 58  + 22, geom->MaxX
12a20 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
12a30 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 61 78 69  );./* MBR - maxi
12a40 6d 75 6d 20 58 20 2a 2f 0a 09 20 20 67 61 69 61  mum X */..  gaia
12a50 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20  Export64 (ptr + 
12a60 33 30 2c 20 67 65 6f 6d 2d 3e 4d 61 78 59 2c 20  30, geom->MaxY, 
12a70 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
12a80 09 2f 2a 20 4d 42 52 20 2d 20 6d 61 78 69 6d 75  ./* MBR - maximu
12a90 6d 20 59 20 2a 2f 0a 09 20 20 2a 28 70 74 72 20  m Y */..  *(ptr 
12aa0 2b 20 33 38 29 20 3d 20 47 41 49 41 5f 4d 41 52  + 38) = GAIA_MAR
12ab0 4b 5f 4d 42 52 3b 09 2f 2a 20 4d 42 52 20 73 69  K_MBR;./* MBR si
12ac0 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20 67 61  gnature */..  ga
12ad0 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 20  iaExport32 (ptr 
12ae0 2b 20 33 39 2c 20 47 41 49 41 5f 4c 49 4e 45 53  + 39, GAIA_LINES
12af0 54 52 49 4e 47 2c 20 31 2c 20 65 6e 64 69 61 6e  TRING, 1, endian
12b00 5f 61 72 63 68 29 3b 09 2f 2a 20 63 6c 61 73 73  _arch);./* class
12b10 20 4c 49 4e 45 53 54 52 49 4e 47 20 2a 2f 0a 09   LINESTRING */..
12b20 20 20 67 61 69 61 45 78 70 6f 72 74 33 32 20 28    gaiaExport32 (
12b30 70 74 72 20 2b 20 34 33 2c 20 6c 69 6e 65 2d 3e  ptr + 43, line->
12b40 50 6f 69 6e 74 73 2c 20 31 2c 20 65 6e 64 69 61  Points, 1, endia
12b50 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 23 20 70 6f  n_arch);./* # po
12b60 69 6e 74 73 20 2a 2f 0a 09 20 20 70 74 72 20 2b  ints */..  ptr +
12b70 3d 20 34 37 3b 0a 09 20 20 66 6f 72 20 28 69 76  = 47;..  for (iv
12b80 20 3d 20 30 3b 20 69 76 20 3c 20 6c 69 6e 65 2d   = 0; iv < line-
12b90 3e 50 6f 69 6e 74 73 3b 20 69 76 2b 2b 29 0a 09  >Points; iv++)..
12ba0 20 20 20 20 7b 0a 09 09 67 61 69 61 47 65 74 50      {...gaiaGetP
12bb0 6f 69 6e 74 20 28 6c 69 6e 65 2d 3e 43 6f 6f 72  oint (line->Coor
12bc0 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 29 3b  ds, iv, &x, &y);
12bd0 0a 09 09 67 61 69 61 45 78 70 6f 72 74 36 34 20  ...gaiaExport64 
12be0 28 70 74 72 2c 20 78 2c 20 31 2c 20 65 6e 64 69  (ptr, x, 1, endi
12bf0 61 6e 5f 61 72 63 68 29 3b 0a 09 09 67 61 69 61  an_arch);...gaia
12c00 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20  Export64 (ptr + 
12c10 38 2c 20 79 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  8, y, 1, endian_
12c20 61 72 63 68 29 3b 0a 09 09 70 74 72 20 2b 3d 20  arch);...ptr += 
12c30 31 36 3b 0a 09 20 20 20 20 7d 0a 09 20 20 2a 70  16;..    }..  *p
12c40 74 72 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 45  tr = GAIA_MARK_E
12c50 4e 44 3b 09 2f 2a 20 45 4e 44 20 73 69 67 6e 61  ND;./* END signa
12c60 74 75 72 65 20 2a 2f 0a 09 20 20 62 72 65 61 6b  ture */..  break
12c70 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  ;.      case GAI
12c80 41 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 3a 0a 09  A_LINESTRINGZ:..
12c90 20 20 2a 70 74 72 20 3d 20 47 41 49 41 5f 4d 41    *ptr = GAIA_MA
12ca0 52 4b 5f 53 54 41 52 54 3b 09 2f 2a 20 53 54 41  RK_START;./* STA
12cb0 52 54 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a  RT signature */.
12cc0 09 20 20 2a 28 70 74 72 20 2b 20 31 29 20 3d 20  .  *(ptr + 1) = 
12cd0 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49  GAIA_LITTLE_ENDI
12ce0 41 4e 3b 09 2f 2a 20 62 79 74 65 20 6f 72 64 65  AN;./* byte orde
12cf0 72 69 6e 67 20 2a 2f 0a 09 20 20 67 61 69 61 45  ring */..  gaiaE
12d00 78 70 6f 72 74 33 32 20 28 70 74 72 20 2b 20 32  xport32 (ptr + 2
12d10 2c 20 67 65 6f 6d 2d 3e 53 72 69 64 2c 20 31 2c  , geom->Srid, 1,
12d20 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
12d30 2a 20 74 68 65 20 53 52 49 44 20 2a 2f 0a 09 20  * the SRID */.. 
12d40 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70   gaiaExport64 (p
12d50 74 72 20 2b 20 36 2c 20 67 65 6f 6d 2d 3e 4d 69  tr + 6, geom->Mi
12d60 6e 58 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72  nX, 1, endian_ar
12d70 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 69  ch);./* MBR - mi
12d80 6e 69 6d 75 6d 20 58 20 2a 2f 0a 09 20 20 67 61  nimum X */..  ga
12d90 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20  iaExport64 (ptr 
12da0 2b 20 31 34 2c 20 67 65 6f 6d 2d 3e 4d 69 6e 59  + 14, geom->MinY
12db0 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
12dc0 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 69 6e 69  );./* MBR - mini
12dd0 6d 75 6d 20 59 20 2a 2f 0a 09 20 20 67 61 69 61  mum Y */..  gaia
12de0 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20  Export64 (ptr + 
12df0 32 32 2c 20 67 65 6f 6d 2d 3e 4d 61 78 58 2c 20  22, geom->MaxX, 
12e00 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
12e10 09 2f 2a 20 4d 42 52 20 2d 20 6d 61 78 69 6d 75  ./* MBR - maximu
12e20 6d 20 58 20 2a 2f 0a 09 20 20 67 61 69 61 45 78  m X */..  gaiaEx
12e30 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 33 30  port64 (ptr + 30
12e40 2c 20 67 65 6f 6d 2d 3e 4d 61 78 59 2c 20 31 2c  , geom->MaxY, 1,
12e50 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
12e60 2a 20 4d 42 52 20 2d 20 6d 61 78 69 6d 75 6d 20  * MBR - maximum 
12e70 59 20 2a 2f 0a 09 20 20 2a 28 70 74 72 20 2b 20  Y */..  *(ptr + 
12e80 33 38 29 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f  38) = GAIA_MARK_
12e90 4d 42 52 3b 09 2f 2a 20 4d 42 52 20 73 69 67 6e  MBR;./* MBR sign
12ea0 61 74 75 72 65 20 2a 2f 0a 09 20 20 67 61 69 61  ature */..  gaia
12eb0 45 78 70 6f 72 74 33 32 20 28 70 74 72 20 2b 20  Export32 (ptr + 
12ec0 33 39 2c 20 47 41 49 41 5f 4c 49 4e 45 53 54 52  39, GAIA_LINESTR
12ed0 49 4e 47 5a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  INGZ, 1, endian_
12ee0 61 72 63 68 29 3b 09 2f 2a 20 63 6c 61 73 73 20  arch);./* class 
12ef0 4c 49 4e 45 53 54 52 49 4e 47 20 58 59 5a 20 2a  LINESTRING XYZ *
12f00 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 33  /..  gaiaExport3
12f10 32 20 28 70 74 72 20 2b 20 34 33 2c 20 6c 69 6e  2 (ptr + 43, lin
12f20 65 2d 3e 50 6f 69 6e 74 73 2c 20 31 2c 20 65 6e  e->Points, 1, en
12f30 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 23  dian_arch);./* #
12f40 20 70 6f 69 6e 74 73 20 2a 2f 0a 09 20 20 70 74   points */..  pt
12f50 72 20 2b 3d 20 34 37 3b 0a 09 20 20 66 6f 72 20  r += 47;..  for 
12f60 28 69 76 20 3d 20 30 3b 20 69 76 20 3c 20 6c 69  (iv = 0; iv < li
12f70 6e 65 2d 3e 50 6f 69 6e 74 73 3b 20 69 76 2b 2b  ne->Points; iv++
12f80 29 0a 09 20 20 20 20 7b 0a 09 09 67 61 69 61 47  )..    {...gaiaG
12f90 65 74 50 6f 69 6e 74 58 59 5a 20 28 6c 69 6e 65  etPointXYZ (line
12fa0 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78  ->Coords, iv, &x
12fb0 2c 20 26 79 2c 20 26 7a 29 3b 0a 09 09 67 61 69  , &y, &z);...gai
12fc0 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20  aExport64 (ptr, 
12fd0 78 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  x, 1, endian_arc
12fe0 68 29 3b 0a 09 09 67 61 69 61 45 78 70 6f 72 74  h);...gaiaExport
12ff0 36 34 20 28 70 74 72 20 2b 20 38 2c 20 79 2c 20  64 (ptr + 8, y, 
13000 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
13010 0a 09 09 67 61 69 61 45 78 70 6f 72 74 36 34 20  ...gaiaExport64 
13020 28 70 74 72 20 2b 20 31 36 2c 20 7a 2c 20 31 2c  (ptr + 16, z, 1,
13030 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09   endian_arch);..
13040 09 70 74 72 20 2b 3d 20 32 34 3b 0a 09 20 20 20  .ptr += 24;..   
13050 20 7d 0a 09 20 20 2a 70 74 72 20 3d 20 47 41 49   }..  *ptr = GAI
13060 41 5f 4d 41 52 4b 5f 45 4e 44 3b 09 2f 2a 20 45  A_MARK_END;./* E
13070 4e 44 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a  ND signature */.
13080 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
13090 63 61 73 65 20 47 41 49 41 5f 4c 49 4e 45 53 54  case GAIA_LINEST
130a0 52 49 4e 47 4d 3a 0a 09 20 20 2a 70 74 72 20 3d  RINGM:..  *ptr =
130b0 20 47 41 49 41 5f 4d 41 52 4b 5f 53 54 41 52 54   GAIA_MARK_START
130c0 3b 09 2f 2a 20 53 54 41 52 54 20 73 69 67 6e 61  ;./* START signa
130d0 74 75 72 65 20 2a 2f 0a 09 20 20 2a 28 70 74 72  ture */..  *(ptr
130e0 20 2b 20 31 29 20 3d 20 47 41 49 41 5f 4c 49 54   + 1) = GAIA_LIT
130f0 54 4c 45 5f 45 4e 44 49 41 4e 3b 09 2f 2a 20 62  TLE_ENDIAN;./* b
13100 79 74 65 20 6f 72 64 65 72 69 6e 67 20 2a 2f 0a  yte ordering */.
13110 09 20 20 67 61 69 61 45 78 70 6f 72 74 33 32 20  .  gaiaExport32 
13120 28 70 74 72 20 2b 20 32 2c 20 67 65 6f 6d 2d 3e  (ptr + 2, geom->
13130 53 72 69 64 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  Srid, 1, endian_
13140 61 72 63 68 29 3b 09 2f 2a 20 74 68 65 20 53 52  arch);./* the SR
13150 49 44 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70  ID */..  gaiaExp
13160 6f 72 74 36 34 20 28 70 74 72 20 2b 20 36 2c 20  ort64 (ptr + 6, 
13170 67 65 6f 6d 2d 3e 4d 69 6e 58 2c 20 31 2c 20 65  geom->MinX, 1, e
13180 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
13190 4d 42 52 20 2d 20 6d 69 6e 69 6d 75 6d 20 58 20  MBR - minimum X 
131a0 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74  */..  gaiaExport
131b0 36 34 20 28 70 74 72 20 2b 20 31 34 2c 20 67 65  64 (ptr + 14, ge
131c0 6f 6d 2d 3e 4d 69 6e 59 2c 20 31 2c 20 65 6e 64  om->MinY, 1, end
131d0 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42  ian_arch);./* MB
131e0 52 20 2d 20 6d 69 6e 69 6d 75 6d 20 59 20 2a 2f  R - minimum Y */
131f0 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 36 34  ..  gaiaExport64
13200 20 28 70 74 72 20 2b 20 32 32 2c 20 67 65 6f 6d   (ptr + 22, geom
13210 2d 3e 4d 61 78 58 2c 20 31 2c 20 65 6e 64 69 61  ->MaxX, 1, endia
13220 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20  n_arch);./* MBR 
13230 2d 20 6d 61 78 69 6d 75 6d 20 58 20 2a 2f 0a 09  - maximum X */..
13240 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28    gaiaExport64 (
13250 70 74 72 20 2b 20 33 30 2c 20 67 65 6f 6d 2d 3e  ptr + 30, geom->
13260 4d 61 78 59 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  MaxY, 1, endian_
13270 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20  arch);./* MBR - 
13280 6d 61 78 69 6d 75 6d 20 59 20 2a 2f 0a 09 20 20  maximum Y */..  
13290 2a 28 70 74 72 20 2b 20 33 38 29 20 3d 20 47 41  *(ptr + 38) = GA
132a0 49 41 5f 4d 41 52 4b 5f 4d 42 52 3b 09 2f 2a 20  IA_MARK_MBR;./* 
132b0 4d 42 52 20 73 69 67 6e 61 74 75 72 65 20 2a 2f  MBR signature */
132c0 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 33 32  ..  gaiaExport32
132d0 20 28 70 74 72 20 2b 20 33 39 2c 20 47 41 49 41   (ptr + 39, GAIA
132e0 5f 4c 49 4e 45 53 54 52 49 4e 47 4d 2c 20 31 2c  _LINESTRINGM, 1,
132f0 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
13300 2a 20 63 6c 61 73 73 20 4c 49 4e 45 53 54 52 49  * class LINESTRI
13310 4e 47 20 58 59 4d 20 2a 2f 0a 09 20 20 67 61 69  NG XYM */..  gai
13320 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 20 2b  aExport32 (ptr +
13330 20 34 33 2c 20 6c 69 6e 65 2d 3e 50 6f 69 6e 74   43, line->Point
13340 73 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  s, 1, endian_arc
13350 68 29 3b 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20  h);./* # points 
13360 2a 2f 0a 09 20 20 70 74 72 20 2b 3d 20 34 37 3b  */..  ptr += 47;
13370 0a 09 20 20 66 6f 72 20 28 69 76 20 3d 20 30 3b  ..  for (iv = 0;
13380 20 69 76 20 3c 20 6c 69 6e 65 2d 3e 50 6f 69 6e   iv < line->Poin
13390 74 73 3b 20 69 76 2b 2b 29 0a 09 20 20 20 20 7b  ts; iv++)..    {
133a0 0a 09 09 67 61 69 61 47 65 74 50 6f 69 6e 74 58  ...gaiaGetPointX
133b0 59 4d 20 28 6c 69 6e 65 2d 3e 43 6f 6f 72 64 73  YM (line->Coords
133c0 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26 6d  , iv, &x, &y, &m
133d0 29 3b 0a 09 09 67 61 69 61 45 78 70 6f 72 74 36  );...gaiaExport6
133e0 34 20 28 70 74 72 2c 20 78 2c 20 31 2c 20 65 6e  4 (ptr, x, 1, en
133f0 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 67 61  dian_arch);...ga
13400 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20  iaExport64 (ptr 
13410 2b 20 38 2c 20 79 2c 20 31 2c 20 65 6e 64 69 61  + 8, y, 1, endia
13420 6e 5f 61 72 63 68 29 3b 0a 09 09 67 61 69 61 45  n_arch);...gaiaE
13430 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 31  xport64 (ptr + 1
13440 36 2c 20 6d 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  6, m, 1, endian_
13450 61 72 63 68 29 3b 0a 09 09 70 74 72 20 2b 3d 20  arch);...ptr += 
13460 32 34 3b 0a 09 20 20 20 20 7d 0a 09 20 20 2a 70  24;..    }..  *p
13470 74 72 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 45  tr = GAIA_MARK_E
13480 4e 44 3b 09 2f 2a 20 45 4e 44 20 73 69 67 6e 61  ND;./* END signa
13490 74 75 72 65 20 2a 2f 0a 09 20 20 62 72 65 61 6b  ture */..  break
134a0 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  ;.      case GAI
134b0 41 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 3a 0a  A_LINESTRINGZM:.
134c0 09 20 20 2a 70 74 72 20 3d 20 47 41 49 41 5f 4d  .  *ptr = GAIA_M
134d0 41 52 4b 5f 53 54 41 52 54 3b 09 2f 2a 20 53 54  ARK_START;./* ST
134e0 41 52 54 20 73 69 67 6e 61 74 75 72 65 20 2a 2f  ART signature */
134f0 0a 09 20 20 2a 28 70 74 72 20 2b 20 31 29 20 3d  ..  *(ptr + 1) =
13500 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44   GAIA_LITTLE_END
13510 49 41 4e 3b 09 2f 2a 20 62 79 74 65 20 6f 72 64  IAN;./* byte ord
13520 65 72 69 6e 67 20 2a 2f 0a 09 20 20 67 61 69 61  ering */..  gaia
13530 45 78 70 6f 72 74 33 32 20 28 70 74 72 20 2b 20  Export32 (ptr + 
13540 32 2c 20 67 65 6f 6d 2d 3e 53 72 69 64 2c 20 31  2, geom->Srid, 1
13550 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
13560 2f 2a 20 74 68 65 20 53 52 49 44 20 2a 2f 0a 09  /* the SRID */..
13570 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28    gaiaExport64 (
13580 70 74 72 20 2b 20 36 2c 20 67 65 6f 6d 2d 3e 4d  ptr + 6, geom->M
13590 69 6e 58 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  inX, 1, endian_a
135a0 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d  rch);./* MBR - m
135b0 69 6e 69 6d 75 6d 20 58 20 2a 2f 0a 09 20 20 67  inimum X */..  g
135c0 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
135d0 20 2b 20 31 34 2c 20 67 65 6f 6d 2d 3e 4d 69 6e   + 14, geom->Min
135e0 59 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  Y, 1, endian_arc
135f0 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 69 6e  h);./* MBR - min
13600 69 6d 75 6d 20 59 20 2a 2f 0a 09 20 20 67 61 69  imum Y */..  gai
13610 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b  aExport64 (ptr +
13620 20 32 32 2c 20 67 65 6f 6d 2d 3e 4d 61 78 58 2c   22, geom->MaxX,
13630 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
13640 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 61 78 69 6d  ;./* MBR - maxim
13650 75 6d 20 58 20 2a 2f 0a 09 20 20 67 61 69 61 45  um X */..  gaiaE
13660 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 33  xport64 (ptr + 3
13670 30 2c 20 67 65 6f 6d 2d 3e 4d 61 78 59 2c 20 31  0, geom->MaxY, 1
13680 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
13690 2f 2a 20 4d 42 52 20 2d 20 6d 61 78 69 6d 75 6d  /* MBR - maximum
136a0 20 59 20 2a 2f 0a 09 20 20 2a 28 70 74 72 20 2b   Y */..  *(ptr +
136b0 20 33 38 29 20 3d 20 47 41 49 41 5f 4d 41 52 4b   38) = GAIA_MARK
136c0 5f 4d 42 52 3b 09 2f 2a 20 4d 42 52 20 73 69 67  _MBR;./* MBR sig
136d0 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20 67 61 69  nature */..  gai
136e0 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 20 2b  aExport32 (ptr +
136f0 20 33 39 2c 20 47 41 49 41 5f 4c 49 4e 45 53 54   39, GAIA_LINEST
13700 52 49 4e 47 5a 4d 2c 20 31 2c 20 65 6e 64 69 61  RINGZM, 1, endia
13710 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 63 6c 61 73  n_arch);./* clas
13720 73 20 4c 49 4e 45 53 54 52 49 4e 47 20 58 59 5a  s LINESTRING XYZ
13730 4d 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f  M */..  gaiaExpo
13740 72 74 33 32 20 28 70 74 72 20 2b 20 34 33 2c 20  rt32 (ptr + 43, 
13750 6c 69 6e 65 2d 3e 50 6f 69 6e 74 73 2c 20 31 2c  line->Points, 1,
13760 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
13770 2a 20 23 20 70 6f 69 6e 74 73 20 2a 2f 0a 09 20  * # points */.. 
13780 20 70 74 72 20 2b 3d 20 34 37 3b 0a 09 20 20 66   ptr += 47;..  f
13790 6f 72 20 28 69 76 20 3d 20 30 3b 20 69 76 20 3c  or (iv = 0; iv <
137a0 20 6c 69 6e 65 2d 3e 50 6f 69 6e 74 73 3b 20 69   line->Points; i
137b0 76 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09 67 61  v++)..    {...ga
137c0 69 61 47 65 74 50 6f 69 6e 74 58 59 5a 4d 20 28  iaGetPointXYZM (
137d0 6c 69 6e 65 2d 3e 43 6f 6f 72 64 73 2c 20 69 76  line->Coords, iv
137e0 2c 20 26 78 2c 20 26 79 2c 20 26 7a 2c 20 26 6d  , &x, &y, &z, &m
137f0 29 3b 0a 09 09 67 61 69 61 45 78 70 6f 72 74 36  );...gaiaExport6
13800 34 20 28 70 74 72 2c 20 78 2c 20 31 2c 20 65 6e  4 (ptr, x, 1, en
13810 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 67 61  dian_arch);...ga
13820 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20  iaExport64 (ptr 
13830 2b 20 38 2c 20 79 2c 20 31 2c 20 65 6e 64 69 61  + 8, y, 1, endia
13840 6e 5f 61 72 63 68 29 3b 0a 09 09 67 61 69 61 45  n_arch);...gaiaE
13850 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 31  xport64 (ptr + 1
13860 36 2c 20 7a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  6, z, 1, endian_
13870 61 72 63 68 29 3b 0a 09 09 67 61 69 61 45 78 70  arch);...gaiaExp
13880 6f 72 74 36 34 20 28 70 74 72 20 2b 20 32 34 2c  ort64 (ptr + 24,
13890 20 6d 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72   m, 1, endian_ar
138a0 63 68 29 3b 0a 09 09 70 74 72 20 2b 3d 20 33 32  ch);...ptr += 32
138b0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 2a 70 74 72  ;..    }..  *ptr
138c0 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 45 4e 44   = GAIA_MARK_END
138d0 3b 09 2f 2a 20 45 4e 44 20 73 69 67 6e 61 74 75  ;./* END signatu
138e0 72 65 20 2a 2f 0a 09 20 20 62 72 65 61 6b 3b 0a  re */..  break;.
138f0 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
13900 50 4f 4c 59 47 4f 4e 3a 0a 09 20 20 2a 70 74 72  POLYGON:..  *ptr
13910 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 53 54 41   = GAIA_MARK_STA
13920 52 54 3b 09 2f 2a 20 53 54 41 52 54 20 73 69 67  RT;./* START sig
13930 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20 2a 28 70  nature */..  *(p
13940 74 72 20 2b 20 31 29 20 3d 20 47 41 49 41 5f 4c  tr + 1) = GAIA_L
13950 49 54 54 4c 45 5f 45 4e 44 49 41 4e 3b 09 2f 2a  ITTLE_ENDIAN;./*
13960 20 62 79 74 65 20 6f 72 64 65 72 69 6e 67 20 2a   byte ordering *
13970 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 33  /..  gaiaExport3
13980 32 20 28 70 74 72 20 2b 20 32 2c 20 67 65 6f 6d  2 (ptr + 2, geom
13990 2d 3e 53 72 69 64 2c 20 31 2c 20 65 6e 64 69 61  ->Srid, 1, endia
139a0 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 74 68 65 20  n_arch);./* the 
139b0 53 52 49 44 20 2a 2f 0a 09 20 20 67 61 69 61 45  SRID */..  gaiaE
139c0 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 36  xport64 (ptr + 6
139d0 2c 20 67 65 6f 6d 2d 3e 4d 69 6e 58 2c 20 31 2c  , geom->MinX, 1,
139e0 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
139f0 2a 20 4d 42 52 20 2d 20 6d 69 6e 69 6d 75 6d 20  * MBR - minimum 
13a00 58 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f  X */..  gaiaExpo
13a10 72 74 36 34 20 28 70 74 72 20 2b 20 31 34 2c 20  rt64 (ptr + 14, 
13a20 67 65 6f 6d 2d 3e 4d 69 6e 59 2c 20 31 2c 20 65  geom->MinY, 1, e
13a30 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
13a40 4d 42 52 20 2d 20 6d 69 6e 69 6d 75 6d 20 59 20  MBR - minimum Y 
13a50 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74  */..  gaiaExport
13a60 36 34 20 28 70 74 72 20 2b 20 32 32 2c 20 67 65  64 (ptr + 22, ge
13a70 6f 6d 2d 3e 4d 61 78 58 2c 20 31 2c 20 65 6e 64  om->MaxX, 1, end
13a80 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42  ian_arch);./* MB
13a90 52 20 2d 20 6d 61 78 69 6d 75 6d 20 58 20 2a 2f  R - maximum X */
13aa0 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 36 34  ..  gaiaExport64
13ab0 20 28 70 74 72 20 2b 20 33 30 2c 20 67 65 6f 6d   (ptr + 30, geom
13ac0 2d 3e 4d 61 78 59 2c 20 31 2c 20 65 6e 64 69 61  ->MaxY, 1, endia
13ad0 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20  n_arch);./* MBR 
13ae0 2d 20 6d 61 78 69 6d 75 6d 20 59 20 2a 2f 0a 09  - maximum Y */..
13af0 20 20 2a 28 70 74 72 20 2b 20 33 38 29 20 3d 20    *(ptr + 38) = 
13b00 47 41 49 41 5f 4d 41 52 4b 5f 4d 42 52 3b 09 2f  GAIA_MARK_MBR;./
13b10 2a 20 4d 42 52 20 73 69 67 6e 61 74 75 72 65 20  * MBR signature 
13b20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74  */..  gaiaExport
13b30 33 32 20 28 70 74 72 20 2b 20 33 39 2c 20 47 41  32 (ptr + 39, GA
13b40 49 41 5f 50 4f 4c 59 47 4f 4e 2c 20 31 2c 20 65  IA_POLYGON, 1, e
13b50 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
13b60 63 6c 61 73 73 20 50 4f 4c 59 47 4f 4e 20 2a 2f  class POLYGON */
13b70 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 33 32  ..  gaiaExport32
13b80 20 28 70 74 72 20 2b 20 34 33 2c 20 70 6f 6c 79   (ptr + 43, poly
13b90 67 2d 3e 4e 75 6d 49 6e 74 65 72 69 6f 72 73 20  g->NumInteriors 
13ba0 2b 20 31 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  + 1, 1, endian_a
13bb0 72 63 68 29 3b 09 2f 2a 20 23 20 72 69 6e 67 73  rch);./* # rings
13bc0 20 2a 2f 0a 09 20 20 72 6e 67 20 3d 20 70 6f 6c   */..  rng = pol
13bd0 79 67 2d 3e 45 78 74 65 72 69 6f 72 3b 0a 09 20  yg->Exterior;.. 
13be0 20 67 61 69 61 45 78 70 6f 72 74 33 32 20 28 70   gaiaExport32 (p
13bf0 74 72 20 2b 20 34 37 2c 20 72 6e 67 2d 3e 50 6f  tr + 47, rng->Po
13c00 69 6e 74 73 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  ints, 1, endian_
13c10 61 72 63 68 29 3b 09 2f 2a 20 23 20 70 6f 69 6e  arch);./* # poin
13c20 74 73 20 2d 20 65 78 74 65 72 69 6f 72 20 72 69  ts - exterior ri
13c30 6e 67 20 2a 2f 0a 09 20 20 70 74 72 20 2b 3d 20  ng */..  ptr += 
13c40 35 31 3b 0a 09 20 20 66 6f 72 20 28 69 76 20 3d  51;..  for (iv =
13c50 20 30 3b 20 69 76 20 3c 20 72 6e 67 2d 3e 50 6f   0; iv < rng->Po
13c60 69 6e 74 73 3b 20 69 76 2b 2b 29 0a 09 20 20 20  ints; iv++)..   
13c70 20 7b 0a 09 09 67 61 69 61 47 65 74 50 6f 69 6e   {...gaiaGetPoin
13c80 74 20 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20  t (rng->Coords, 
13c90 69 76 2c 20 26 78 2c 20 26 79 29 3b 0a 09 09 67  iv, &x, &y);...g
13ca0 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
13cb0 2c 20 78 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  , x, 1, endian_a
13cc0 72 63 68 29 3b 09 2f 2a 20 58 20 2d 20 65 78 74  rch);./* X - ext
13cd0 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 09  erior ring */...
13ce0 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74  gaiaExport64 (pt
13cf0 72 20 2b 20 38 2c 20 79 2c 20 31 2c 20 65 6e 64  r + 8, y, 1, end
13d00 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 59 20  ian_arch);./* Y 
13d10 2d 20 65 78 74 65 72 69 6f 72 20 72 69 6e 67 20  - exterior ring 
13d20 2a 2f 0a 09 09 70 74 72 20 2b 3d 20 31 36 3b 0a  */...ptr += 16;.
13d30 09 20 20 20 20 7d 0a 09 20 20 66 6f 72 20 28 69  .    }..  for (i
13d40 62 20 3d 20 30 3b 20 69 62 20 3c 20 70 6f 6c 79  b = 0; ib < poly
13d50 67 2d 3e 4e 75 6d 49 6e 74 65 72 69 6f 72 73 3b  g->NumInteriors;
13d60 20 69 62 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09   ib++)..    {...
13d70 72 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e 49 6e 74  rng = polyg->Int
13d80 65 72 69 6f 72 73 20 2b 20 69 62 3b 0a 09 09 67  eriors + ib;...g
13d90 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72  aiaExport32 (ptr
13da0 2c 20 72 6e 67 2d 3e 50 6f 69 6e 74 73 2c 20 31  , rng->Points, 1
13db0 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
13dc0 2f 2a 20 23 20 70 6f 69 6e 74 73 20 2d 20 69 6e  /* # points - in
13dd0 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09  terior ring */..
13de0 09 70 74 72 20 2b 3d 20 34 3b 0a 09 09 66 6f 72  .ptr += 4;...for
13df0 20 28 69 76 20 3d 20 30 3b 20 69 76 20 3c 20 72   (iv = 0; iv < r
13e00 6e 67 2d 3e 50 6f 69 6e 74 73 3b 20 69 76 2b 2b  ng->Points; iv++
13e10 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  )...  {...      
13e20 67 61 69 61 47 65 74 50 6f 69 6e 74 20 28 72 6e  gaiaGetPoint (rn
13e30 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26  g->Coords, iv, &
13e40 78 2c 20 26 79 29 3b 0a 09 09 20 20 20 20 20 20  x, &y);...      
13e50 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74  gaiaExport64 (pt
13e60 72 2c 20 78 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  r, x, 1, endian_
13e70 61 72 63 68 29 3b 09 2f 2a 20 58 20 2d 20 69 6e  arch);./* X - in
13e80 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09  terior ring */..
13e90 09 20 20 20 20 20 20 67 61 69 61 45 78 70 6f 72  .      gaiaExpor
13ea0 74 36 34 20 28 70 74 72 20 2b 20 38 2c 20 79 2c  t64 (ptr + 8, y,
13eb0 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
13ec0 3b 09 2f 2a 20 59 20 2d 20 69 6e 74 65 72 69 6f  ;./* Y - interio
13ed0 72 20 72 69 6e 67 20 2a 2f 0a 09 09 20 20 20 20  r ring */...    
13ee0 20 20 70 74 72 20 2b 3d 20 31 36 3b 0a 09 09 20    ptr += 16;... 
13ef0 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 2a 70 74   }..    }..  *pt
13f00 72 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 45 4e  r = GAIA_MARK_EN
13f10 44 3b 09 2f 2a 20 45 4e 44 20 73 69 67 6e 61 74  D;./* END signat
13f20 75 72 65 20 2a 2f 0a 09 20 20 62 72 65 61 6b 3b  ure */..  break;
13f30 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41  .      case GAIA
13f40 5f 50 4f 4c 59 47 4f 4e 5a 3a 0a 09 20 20 2a 70  _POLYGONZ:..  *p
13f50 74 72 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 53  tr = GAIA_MARK_S
13f60 54 41 52 54 3b 09 2f 2a 20 53 54 41 52 54 20 73  TART;./* START s
13f70 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20 2a  ignature */..  *
13f80 28 70 74 72 20 2b 20 31 29 20 3d 20 47 41 49 41  (ptr + 1) = GAIA
13f90 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 3b 09  _LITTLE_ENDIAN;.
13fa0 2f 2a 20 62 79 74 65 20 6f 72 64 65 72 69 6e 67  /* byte ordering
13fb0 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72   */..  gaiaExpor
13fc0 74 33 32 20 28 70 74 72 20 2b 20 32 2c 20 67 65  t32 (ptr + 2, ge
13fd0 6f 6d 2d 3e 53 72 69 64 2c 20 31 2c 20 65 6e 64  om->Srid, 1, end
13fe0 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 74 68  ian_arch);./* th
13ff0 65 20 53 52 49 44 20 2a 2f 0a 09 20 20 67 61 69  e SRID */..  gai
14000 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b  aExport64 (ptr +
14010 20 36 2c 20 67 65 6f 6d 2d 3e 4d 69 6e 58 2c 20   6, geom->MinX, 
14020 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
14030 09 2f 2a 20 4d 42 52 20 2d 20 6d 69 6e 69 6d 75  ./* MBR - minimu
14040 6d 20 58 20 2a 2f 0a 09 20 20 67 61 69 61 45 78  m X */..  gaiaEx
14050 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 31 34  port64 (ptr + 14
14060 2c 20 67 65 6f 6d 2d 3e 4d 69 6e 59 2c 20 31 2c  , geom->MinY, 1,
14070 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
14080 2a 20 4d 42 52 20 2d 20 6d 69 6e 69 6d 75 6d 20  * MBR - minimum 
14090 59 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f  Y */..  gaiaExpo
140a0 72 74 36 34 20 28 70 74 72 20 2b 20 32 32 2c 20  rt64 (ptr + 22, 
140b0 67 65 6f 6d 2d 3e 4d 61 78 58 2c 20 31 2c 20 65  geom->MaxX, 1, e
140c0 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
140d0 4d 42 52 20 2d 20 6d 61 78 69 6d 75 6d 20 58 20  MBR - maximum X 
140e0 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74  */..  gaiaExport
140f0 36 34 20 28 70 74 72 20 2b 20 33 30 2c 20 67 65  64 (ptr + 30, ge
14100 6f 6d 2d 3e 4d 61 78 59 2c 20 31 2c 20 65 6e 64  om->MaxY, 1, end
14110 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42  ian_arch);./* MB
14120 52 20 2d 20 6d 61 78 69 6d 75 6d 20 59 20 2a 2f  R - maximum Y */
14130 0a 09 20 20 2a 28 70 74 72 20 2b 20 33 38 29 20  ..  *(ptr + 38) 
14140 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 4d 42 52 3b  = GAIA_MARK_MBR;
14150 09 2f 2a 20 4d 42 52 20 73 69 67 6e 61 74 75 72  ./* MBR signatur
14160 65 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f  e */..  gaiaExpo
14170 72 74 33 32 20 28 70 74 72 20 2b 20 33 39 2c 20  rt32 (ptr + 39, 
14180 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 2c 20 31  GAIA_POLYGONZ, 1
14190 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
141a0 2f 2a 20 63 6c 61 73 73 20 50 4f 4c 59 47 4f 4e  /* class POLYGON
141b0 20 58 59 5a 20 2a 2f 0a 09 20 20 67 61 69 61 45   XYZ */..  gaiaE
141c0 78 70 6f 72 74 33 32 20 28 70 74 72 20 2b 20 34  xport32 (ptr + 4
141d0 33 2c 20 70 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74  3, polyg->NumInt
141e0 65 72 69 6f 72 73 20 2b 20 31 2c 20 31 2c 20 65  eriors + 1, 1, e
141f0 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
14200 23 20 72 69 6e 67 73 20 2a 2f 0a 09 20 20 72 6e  # rings */..  rn
14210 67 20 3d 20 70 6f 6c 79 67 2d 3e 45 78 74 65 72  g = polyg->Exter
14220 69 6f 72 3b 0a 09 20 20 67 61 69 61 45 78 70 6f  ior;..  gaiaExpo
14230 72 74 33 32 20 28 70 74 72 20 2b 20 34 37 2c 20  rt32 (ptr + 47, 
14240 72 6e 67 2d 3e 50 6f 69 6e 74 73 2c 20 31 2c 20  rng->Points, 1, 
14250 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a  endian_arch);./*
14260 20 23 20 70 6f 69 6e 74 73 20 2d 20 65 78 74 65   # points - exte
14270 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 20 20  rior ring */..  
14280 70 74 72 20 2b 3d 20 35 31 3b 0a 09 20 20 66 6f  ptr += 51;..  fo
14290 72 20 28 69 76 20 3d 20 30 3b 20 69 76 20 3c 20  r (iv = 0; iv < 
142a0 72 6e 67 2d 3e 50 6f 69 6e 74 73 3b 20 69 76 2b  rng->Points; iv+
142b0 2b 29 0a 09 20 20 20 20 7b 0a 09 09 67 61 69 61  +)..    {...gaia
142c0 47 65 74 50 6f 69 6e 74 58 59 5a 20 28 72 6e 67  GetPointXYZ (rng
142d0 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78  ->Coords, iv, &x
142e0 2c 20 26 79 2c 20 26 7a 29 3b 0a 09 09 67 61 69  , &y, &z);...gai
142f0 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20  aExport64 (ptr, 
14300 78 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  x, 1, endian_arc
14310 68 29 3b 09 2f 2a 20 58 20 2d 20 65 78 74 65 72  h);./* X - exter
14320 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 09 67 61  ior ring */...ga
14330 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20  iaExport64 (ptr 
14340 2b 20 38 2c 20 79 2c 20 31 2c 20 65 6e 64 69 61  + 8, y, 1, endia
14350 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 59 20 2d 20  n_arch);./* Y - 
14360 65 78 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f  exterior ring */
14370 0a 09 09 67 61 69 61 45 78 70 6f 72 74 36 34 20  ...gaiaExport64 
14380 28 70 74 72 20 2b 20 31 36 2c 20 7a 2c 20 31 2c  (ptr + 16, z, 1,
14390 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
143a0 2a 20 5a 20 2d 20 65 78 74 65 72 69 6f 72 20 72  * Z - exterior r
143b0 69 6e 67 20 2a 2f 0a 09 09 70 74 72 20 2b 3d 20  ing */...ptr += 
143c0 32 34 3b 0a 09 20 20 20 20 7d 0a 09 20 20 66 6f  24;..    }..  fo
143d0 72 20 28 69 62 20 3d 20 30 3b 20 69 62 20 3c 20  r (ib = 0; ib < 
143e0 70 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74 65 72 69  polyg->NumInteri
143f0 6f 72 73 3b 20 69 62 2b 2b 29 0a 09 20 20 20 20  ors; ib++)..    
14400 7b 0a 09 09 72 6e 67 20 3d 20 70 6f 6c 79 67 2d  {...rng = polyg-
14410 3e 49 6e 74 65 72 69 6f 72 73 20 2b 20 69 62 3b  >Interiors + ib;
14420 0a 09 09 67 61 69 61 45 78 70 6f 72 74 33 32 20  ...gaiaExport32 
14430 28 70 74 72 2c 20 72 6e 67 2d 3e 50 6f 69 6e 74  (ptr, rng->Point
14440 73 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  s, 1, endian_arc
14450 68 29 3b 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20  h);./* # points 
14460 2d 20 69 6e 74 65 72 69 6f 72 20 72 69 6e 67 20  - interior ring 
14470 2a 2f 0a 09 09 70 74 72 20 2b 3d 20 34 3b 0a 09  */...ptr += 4;..
14480 09 66 6f 72 20 28 69 76 20 3d 20 30 3b 20 69 76  .for (iv = 0; iv
14490 20 3c 20 72 6e 67 2d 3e 50 6f 69 6e 74 73 3b 20   < rng->Points; 
144a0 69 76 2b 2b 29 0a 09 09 20 20 7b 0a 09 09 20 20  iv++)...  {...  
144b0 20 20 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74      gaiaGetPoint
144c0 58 59 5a 20 28 72 6e 67 2d 3e 43 6f 6f 72 64 73  XYZ (rng->Coords
144d0 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26 7a  , iv, &x, &y, &z
144e0 29 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61 45  );...      gaiaE
144f0 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20 78 2c  xport64 (ptr, x,
14500 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
14510 3b 09 2f 2a 20 58 20 2d 20 69 6e 74 65 72 69 6f  ;./* X - interio
14520 72 20 72 69 6e 67 20 2a 2f 0a 09 09 20 20 20 20  r ring */...    
14530 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28    gaiaExport64 (
14540 70 74 72 20 2b 20 38 2c 20 79 2c 20 31 2c 20 65  ptr + 8, y, 1, e
14550 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
14560 59 20 2d 20 69 6e 74 65 72 69 6f 72 20 72 69 6e  Y - interior rin
14570 67 20 2a 2f 0a 09 09 20 20 20 20 20 20 67 61 69  g */...      gai
14580 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b  aExport64 (ptr +
14590 20 31 36 2c 20 7a 2c 20 31 2c 20 65 6e 64 69 61   16, z, 1, endia
145a0 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 5a 20 2d 20  n_arch);./* Z - 
145b0 69 6e 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f  interior ring */
145c0 0a 09 09 20 20 20 20 20 20 70 74 72 20 2b 3d 20  ...      ptr += 
145d0 32 34 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d  24;...  }..    }
145e0 0a 09 20 20 2a 70 74 72 20 3d 20 47 41 49 41 5f  ..  *ptr = GAIA_
145f0 4d 41 52 4b 5f 45 4e 44 3b 09 2f 2a 20 45 4e 44  MARK_END;./* END
14600 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20   signature */.. 
14610 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
14620 73 65 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 4d  se GAIA_POLYGONM
14630 3a 0a 09 20 20 2a 70 74 72 20 3d 20 47 41 49 41  :..  *ptr = GAIA
14640 5f 4d 41 52 4b 5f 53 54 41 52 54 3b 09 2f 2a 20  _MARK_START;./* 
14650 53 54 41 52 54 20 73 69 67 6e 61 74 75 72 65 20  START signature 
14660 2a 2f 0a 09 20 20 2a 28 70 74 72 20 2b 20 31 29  */..  *(ptr + 1)
14670 20 3d 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45   = GAIA_LITTLE_E
14680 4e 44 49 41 4e 3b 09 2f 2a 20 62 79 74 65 20 6f  NDIAN;./* byte o
14690 72 64 65 72 69 6e 67 20 2a 2f 0a 09 20 20 67 61  rdering */..  ga
146a0 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 20  iaExport32 (ptr 
146b0 2b 20 32 2c 20 67 65 6f 6d 2d 3e 53 72 69 64 2c  + 2, geom->Srid,
146c0 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
146d0 3b 09 2f 2a 20 74 68 65 20 53 52 49 44 20 2a 2f  ;./* the SRID */
146e0 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 36 34  ..  gaiaExport64
146f0 20 28 70 74 72 20 2b 20 36 2c 20 67 65 6f 6d 2d   (ptr + 6, geom-
14700 3e 4d 69 6e 58 2c 20 31 2c 20 65 6e 64 69 61 6e  >MinX, 1, endian
14710 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d  _arch);./* MBR -
14720 20 6d 69 6e 69 6d 75 6d 20 58 20 2a 2f 0a 09 20   minimum X */.. 
14730 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70   gaiaExport64 (p
14740 74 72 20 2b 20 31 34 2c 20 67 65 6f 6d 2d 3e 4d  tr + 14, geom->M
14750 69 6e 59 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  inY, 1, endian_a
14760 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d  rch);./* MBR - m
14770 69 6e 69 6d 75 6d 20 59 20 2a 2f 0a 09 20 20 67  inimum Y */..  g
14780 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
14790 20 2b 20 32 32 2c 20 67 65 6f 6d 2d 3e 4d 61 78   + 22, geom->Max
147a0 58 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  X, 1, endian_arc
147b0 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 61 78  h);./* MBR - max
147c0 69 6d 75 6d 20 58 20 2a 2f 0a 09 20 20 67 61 69  imum X */..  gai
147d0 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b  aExport64 (ptr +
147e0 20 33 30 2c 20 67 65 6f 6d 2d 3e 4d 61 78 59 2c   30, geom->MaxY,
147f0 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
14800 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 61 78 69 6d  ;./* MBR - maxim
14810 75 6d 20 59 20 2a 2f 0a 09 20 20 2a 28 70 74 72  um Y */..  *(ptr
14820 20 2b 20 33 38 29 20 3d 20 47 41 49 41 5f 4d 41   + 38) = GAIA_MA
14830 52 4b 5f 4d 42 52 3b 09 2f 2a 20 4d 42 52 20 73  RK_MBR;./* MBR s
14840 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20 67  ignature */..  g
14850 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72  aiaExport32 (ptr
14860 20 2b 20 33 39 2c 20 47 41 49 41 5f 50 4f 4c 59   + 39, GAIA_POLY
14870 47 4f 4e 4d 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  GONM, 1, endian_
14880 61 72 63 68 29 3b 09 2f 2a 20 63 6c 61 73 73 20  arch);./* class 
14890 50 4f 4c 59 47 4f 4e 20 58 59 4d 20 2a 2f 0a 09  POLYGON XYM */..
148a0 20 20 67 61 69 61 45 78 70 6f 72 74 33 32 20 28    gaiaExport32 (
148b0 70 74 72 20 2b 20 34 33 2c 20 70 6f 6c 79 67 2d  ptr + 43, polyg-
148c0 3e 4e 75 6d 49 6e 74 65 72 69 6f 72 73 20 2b 20  >NumInteriors + 
148d0 31 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  1, 1, endian_arc
148e0 68 29 3b 09 2f 2a 20 23 20 72 69 6e 67 73 20 2a  h);./* # rings *
148f0 2f 0a 09 20 20 72 6e 67 20 3d 20 70 6f 6c 79 67  /..  rng = polyg
14900 2d 3e 45 78 74 65 72 69 6f 72 3b 0a 09 20 20 67  ->Exterior;..  g
14910 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72  aiaExport32 (ptr
14920 20 2b 20 34 37 2c 20 72 6e 67 2d 3e 50 6f 69 6e   + 47, rng->Poin
14930 74 73 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72  ts, 1, endian_ar
14940 63 68 29 3b 09 2f 2a 20 23 20 70 6f 69 6e 74 73  ch);./* # points
14950 20 2d 20 65 78 74 65 72 69 6f 72 20 72 69 6e 67   - exterior ring
14960 20 2a 2f 0a 09 20 20 70 74 72 20 2b 3d 20 35 31   */..  ptr += 51
14970 3b 0a 09 20 20 66 6f 72 20 28 69 76 20 3d 20 30  ;..  for (iv = 0
14980 3b 20 69 76 20 3c 20 72 6e 67 2d 3e 50 6f 69 6e  ; iv < rng->Poin
14990 74 73 3b 20 69 76 2b 2b 29 0a 09 20 20 20 20 7b  ts; iv++)..    {
149a0 0a 09 09 67 61 69 61 47 65 74 50 6f 69 6e 74 58  ...gaiaGetPointX
149b0 59 4d 20 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c  YM (rng->Coords,
149c0 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26 6d 29   iv, &x, &y, &m)
149d0 3b 0a 09 09 67 61 69 61 45 78 70 6f 72 74 36 34  ;...gaiaExport64
149e0 20 28 70 74 72 2c 20 78 2c 20 31 2c 20 65 6e 64   (ptr, x, 1, end
149f0 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 58 20  ian_arch);./* X 
14a00 2d 20 65 78 74 65 72 69 6f 72 20 72 69 6e 67 20  - exterior ring 
14a10 2a 2f 0a 09 09 67 61 69 61 45 78 70 6f 72 74 36  */...gaiaExport6
14a20 34 20 28 70 74 72 20 2b 20 38 2c 20 79 2c 20 31  4 (ptr + 8, y, 1
14a30 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
14a40 2f 2a 20 59 20 2d 20 65 78 74 65 72 69 6f 72 20  /* Y - exterior 
14a50 72 69 6e 67 20 2a 2f 0a 09 09 67 61 69 61 45 78  ring */...gaiaEx
14a60 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 31 36  port64 (ptr + 16
14a70 2c 20 6d 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  , m, 1, endian_a
14a80 72 63 68 29 3b 09 2f 2a 20 4d 20 2d 20 65 78 74  rch);./* M - ext
14a90 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 09  erior ring */...
14aa0 70 74 72 20 2b 3d 20 32 34 3b 0a 09 20 20 20 20  ptr += 24;..    
14ab0 7d 0a 09 20 20 66 6f 72 20 28 69 62 20 3d 20 30  }..  for (ib = 0
14ac0 3b 20 69 62 20 3c 20 70 6f 6c 79 67 2d 3e 4e 75  ; ib < polyg->Nu
14ad0 6d 49 6e 74 65 72 69 6f 72 73 3b 20 69 62 2b 2b  mInteriors; ib++
14ae0 29 0a 09 20 20 20 20 7b 0a 09 09 72 6e 67 20 3d  )..    {...rng =
14af0 20 70 6f 6c 79 67 2d 3e 49 6e 74 65 72 69 6f 72   polyg->Interior
14b00 73 20 2b 20 69 62 3b 0a 09 09 67 61 69 61 45 78  s + ib;...gaiaEx
14b10 70 6f 72 74 33 32 20 28 70 74 72 2c 20 72 6e 67  port32 (ptr, rng
14b20 2d 3e 50 6f 69 6e 74 73 2c 20 31 2c 20 65 6e 64  ->Points, 1, end
14b30 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 23 20  ian_arch);./* # 
14b40 70 6f 69 6e 74 73 20 2d 20 69 6e 74 65 72 69 6f  points - interio
14b50 72 20 72 69 6e 67 20 2a 2f 0a 09 09 70 74 72 20  r ring */...ptr 
14b60 2b 3d 20 34 3b 0a 09 09 66 6f 72 20 28 69 76 20  += 4;...for (iv 
14b70 3d 20 30 3b 20 69 76 20 3c 20 72 6e 67 2d 3e 50  = 0; iv < rng->P
14b80 6f 69 6e 74 73 3b 20 69 76 2b 2b 29 0a 09 09 20  oints; iv++)... 
14b90 20 7b 0a 09 09 20 20 20 20 20 20 67 61 69 61 47   {...      gaiaG
14ba0 65 74 50 6f 69 6e 74 58 59 4d 20 28 72 6e 67 2d  etPointXYM (rng-
14bb0 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c  >Coords, iv, &x,
14bc0 20 26 79 2c 20 26 6d 29 3b 0a 09 09 20 20 20 20   &y, &m);...    
14bd0 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28    gaiaExport64 (
14be0 70 74 72 2c 20 78 2c 20 31 2c 20 65 6e 64 69 61  ptr, x, 1, endia
14bf0 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 58 20 2d 20  n_arch);./* X - 
14c00 69 6e 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f  interior ring */
14c10 0a 09 09 20 20 20 20 20 20 67 61 69 61 45 78 70  ...      gaiaExp
14c20 6f 72 74 36 34 20 28 70 74 72 20 2b 20 38 2c 20  ort64 (ptr + 8, 
14c30 79 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  y, 1, endian_arc
14c40 68 29 3b 09 2f 2a 20 59 20 2d 20 69 6e 74 65 72  h);./* Y - inter
14c50 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 09 20 20  ior ring */...  
14c60 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 36 34      gaiaExport64
14c70 20 28 70 74 72 20 2b 20 31 36 2c 20 6d 2c 20 31   (ptr + 16, m, 1
14c80 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
14c90 2f 2a 20 4d 20 2d 20 69 6e 74 65 72 69 6f 72 20  /* M - interior 
14ca0 72 69 6e 67 20 2a 2f 0a 09 09 20 20 20 20 20 20  ring */...      
14cb0 70 74 72 20 2b 3d 20 32 34 3b 0a 09 09 20 20 7d  ptr += 24;...  }
14cc0 0a 09 20 20 20 20 7d 0a 09 20 20 2a 70 74 72 20  ..    }..  *ptr 
14cd0 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 45 4e 44 3b  = GAIA_MARK_END;
14ce0 09 2f 2a 20 45 4e 44 20 73 69 67 6e 61 74 75 72  ./* END signatur
14cf0 65 20 2a 2f 0a 09 20 20 62 72 65 61 6b 3b 0a 20  e */..  break;. 
14d00 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 50       case GAIA_P
14d10 4f 4c 59 47 4f 4e 5a 4d 3a 0a 09 20 20 2a 70 74  OLYGONZM:..  *pt
14d20 72 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 53 54  r = GAIA_MARK_ST
14d30 41 52 54 3b 09 2f 2a 20 53 54 41 52 54 20 73 69  ART;./* START si
14d40 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20 2a 28  gnature */..  *(
14d50 70 74 72 20 2b 20 31 29 20 3d 20 47 41 49 41 5f  ptr + 1) = GAIA_
14d60 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 3b 09 2f  LITTLE_ENDIAN;./
14d70 2a 20 62 79 74 65 20 6f 72 64 65 72 69 6e 67 20  * byte ordering 
14d80 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74  */..  gaiaExport
14d90 33 32 20 28 70 74 72 20 2b 20 32 2c 20 67 65 6f  32 (ptr + 2, geo
14da0 6d 2d 3e 53 72 69 64 2c 20 31 2c 20 65 6e 64 69  m->Srid, 1, endi
14db0 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 74 68 65  an_arch);./* the
14dc0 20 53 52 49 44 20 2a 2f 0a 09 20 20 67 61 69 61   SRID */..  gaia
14dd0 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20  Export64 (ptr + 
14de0 36 2c 20 67 65 6f 6d 2d 3e 4d 69 6e 58 2c 20 31  6, geom->MinX, 1
14df0 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
14e00 2f 2a 20 4d 42 52 20 2d 20 6d 69 6e 69 6d 75 6d  /* MBR - minimum
14e10 20 58 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70   X */..  gaiaExp
14e20 6f 72 74 36 34 20 28 70 74 72 20 2b 20 31 34 2c  ort64 (ptr + 14,
14e30 20 67 65 6f 6d 2d 3e 4d 69 6e 59 2c 20 31 2c 20   geom->MinY, 1, 
14e40 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a  endian_arch);./*
14e50 20 4d 42 52 20 2d 20 6d 69 6e 69 6d 75 6d 20 59   MBR - minimum Y
14e60 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72   */..  gaiaExpor
14e70 74 36 34 20 28 70 74 72 20 2b 20 32 32 2c 20 67  t64 (ptr + 22, g
14e80 65 6f 6d 2d 3e 4d 61 78 58 2c 20 31 2c 20 65 6e  eom->MaxX, 1, en
14e90 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d  dian_arch);./* M
14ea0 42 52 20 2d 20 6d 61 78 69 6d 75 6d 20 58 20 2a  BR - maximum X *
14eb0 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 36  /..  gaiaExport6
14ec0 34 20 28 70 74 72 20 2b 20 33 30 2c 20 67 65 6f  4 (ptr + 30, geo
14ed0 6d 2d 3e 4d 61 78 59 2c 20 31 2c 20 65 6e 64 69  m->MaxY, 1, endi
14ee0 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52  an_arch);./* MBR
14ef0 20 2d 20 6d 61 78 69 6d 75 6d 20 59 20 2a 2f 0a   - maximum Y */.
14f00 09 20 20 2a 28 70 74 72 20 2b 20 33 38 29 20 3d  .  *(ptr + 38) =
14f10 20 47 41 49 41 5f 4d 41 52 4b 5f 4d 42 52 3b 09   GAIA_MARK_MBR;.
14f20 2f 2a 20 4d 42 52 20 73 69 67 6e 61 74 75 72 65  /* MBR signature
14f30 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72   */..  gaiaExpor
14f40 74 33 32 20 28 70 74 72 20 2b 20 33 39 2c 20 47  t32 (ptr + 39, G
14f50 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 4d 2c 20 31  AIA_POLYGONZM, 1
14f60 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
14f70 2f 2a 20 63 6c 61 73 73 20 50 4f 4c 59 47 4f 4e  /* class POLYGON
14f80 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72   */..  gaiaExpor
14f90 74 33 32 20 28 70 74 72 20 2b 20 34 33 2c 20 70  t32 (ptr + 43, p
14fa0 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74 65 72 69 6f  olyg->NumInterio
14fb0 72 73 20 2b 20 31 2c 20 31 2c 20 65 6e 64 69 61  rs + 1, 1, endia
14fc0 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 23 20 72 69  n_arch);./* # ri
14fd0 6e 67 73 20 2a 2f 0a 09 20 20 72 6e 67 20 3d 20  ngs */..  rng = 
14fe0 70 6f 6c 79 67 2d 3e 45 78 74 65 72 69 6f 72 3b  polyg->Exterior;
14ff0 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 33 32  ..  gaiaExport32
15000 20 28 70 74 72 20 2b 20 34 37 2c 20 72 6e 67 2d   (ptr + 47, rng-
15010 3e 50 6f 69 6e 74 73 2c 20 31 2c 20 65 6e 64 69  >Points, 1, endi
15020 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 23 20 70  an_arch);./* # p
15030 6f 69 6e 74 73 20 2d 20 65 78 74 65 72 69 6f 72  oints - exterior
15040 20 72 69 6e 67 20 2a 2f 0a 09 20 20 70 74 72 20   ring */..  ptr 
15050 2b 3d 20 35 31 3b 0a 09 20 20 66 6f 72 20 28 69  += 51;..  for (i
15060 76 20 3d 20 30 3b 20 69 76 20 3c 20 72 6e 67 2d  v = 0; iv < rng-
15070 3e 50 6f 69 6e 74 73 3b 20 69 76 2b 2b 29 0a 09  >Points; iv++)..
15080 20 20 20 20 7b 0a 09 09 67 61 69 61 47 65 74 50      {...gaiaGetP
15090 6f 69 6e 74 58 59 5a 4d 20 28 72 6e 67 2d 3e 43  ointXYZM (rng->C
150a0 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26  oords, iv, &x, &
150b0 79 2c 20 26 7a 2c 20 26 6d 29 3b 0a 09 09 67 61  y, &z, &m);...ga
150c0 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c  iaExport64 (ptr,
150d0 20 78 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72   x, 1, endian_ar
150e0 63 68 29 3b 09 2f 2a 20 58 20 2d 20 65 78 74 65  ch);./* X - exte
150f0 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 09 67  rior ring */...g
15100 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
15110 20 2b 20 38 2c 20 79 2c 20 31 2c 20 65 6e 64 69   + 8, y, 1, endi
15120 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 59 20 2d  an_arch);./* Y -
15130 20 65 78 74 65 72 69 6f 72 20 72 69 6e 67 20 2a   exterior ring *
15140 2f 0a 09 09 67 61 69 61 45 78 70 6f 72 74 36 34  /...gaiaExport64
15150 20 28 70 74 72 20 2b 20 31 36 2c 20 7a 2c 20 31   (ptr + 16, z, 1
15160 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
15170 2f 2a 20 5a 20 2d 20 65 78 74 65 72 69 6f 72 20  /* Z - exterior 
15180 72 69 6e 67 20 2a 2f 0a 09 09 67 61 69 61 45 78  ring */...gaiaEx
15190 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 32 34  port64 (ptr + 24
151a0 2c 20 6d 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  , m, 1, endian_a
151b0 72 63 68 29 3b 09 2f 2a 20 4d 20 2d 20 65 78 74  rch);./* M - ext
151c0 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 09  erior ring */...
151d0 70 74 72 20 2b 3d 20 33 32 3b 0a 09 20 20 20 20  ptr += 32;..    
151e0 7d 0a 09 20 20 66 6f 72 20 28 69 62 20 3d 20 30  }..  for (ib = 0
151f0 3b 20 69 62 20 3c 20 70 6f 6c 79 67 2d 3e 4e 75  ; ib < polyg->Nu
15200 6d 49 6e 74 65 72 69 6f 72 73 3b 20 69 62 2b 2b  mInteriors; ib++
15210 29 0a 09 20 20 20 20 7b 0a 09 09 72 6e 67 20 3d  )..    {...rng =
15220 20 70 6f 6c 79 67 2d 3e 49 6e 74 65 72 69 6f 72   polyg->Interior
15230 73 20 2b 20 69 62 3b 0a 09 09 67 61 69 61 45 78  s + ib;...gaiaEx
15240 70 6f 72 74 33 32 20 28 70 74 72 2c 20 72 6e 67  port32 (ptr, rng
15250 2d 3e 50 6f 69 6e 74 73 2c 20 31 2c 20 65 6e 64  ->Points, 1, end
15260 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 23 20  ian_arch);./* # 
15270 70 6f 69 6e 74 73 20 2d 20 69 6e 74 65 72 69 6f  points - interio
15280 72 20 72 69 6e 67 20 2a 2f 0a 09 09 70 74 72 20  r ring */...ptr 
15290 2b 3d 20 34 3b 0a 09 09 66 6f 72 20 28 69 76 20  += 4;...for (iv 
152a0 3d 20 30 3b 20 69 76 20 3c 20 72 6e 67 2d 3e 50  = 0; iv < rng->P
152b0 6f 69 6e 74 73 3b 20 69 76 2b 2b 29 0a 09 09 20  oints; iv++)... 
152c0 20 7b 0a 09 09 20 20 20 20 20 20 67 61 69 61 47   {...      gaiaG
152d0 65 74 50 6f 69 6e 74 58 59 5a 4d 20 28 72 6e 67  etPointXYZM (rng
152e0 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78  ->Coords, iv, &x
152f0 2c 20 26 79 2c 20 26 7a 2c 20 26 6d 29 3b 0a 09  , &y, &z, &m);..
15300 09 20 20 20 20 20 20 67 61 69 61 45 78 70 6f 72  .      gaiaExpor
15310 74 36 34 20 28 70 74 72 2c 20 78 2c 20 31 2c 20  t64 (ptr, x, 1, 
15320 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a  endian_arch);./*
15330 20 58 20 2d 20 69 6e 74 65 72 69 6f 72 20 72 69   X - interior ri
15340 6e 67 20 2a 2f 0a 09 09 20 20 20 20 20 20 67 61  ng */...      ga
15350 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20  iaExport64 (ptr 
15360 2b 20 38 2c 20 79 2c 20 31 2c 20 65 6e 64 69 61  + 8, y, 1, endia
15370 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 59 20 2d 20  n_arch);./* Y - 
15380 69 6e 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f  interior ring */
15390 0a 09 09 20 20 20 20 20 20 67 61 69 61 45 78 70  ...      gaiaExp
153a0 6f 72 74 36 34 20 28 70 74 72 20 2b 20 31 36 2c  ort64 (ptr + 16,
153b0 20 7a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72   z, 1, endian_ar
153c0 63 68 29 3b 09 2f 2a 20 5a 20 2d 20 65 78 74 65  ch);./* Z - exte
153d0 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 09 20  rior ring */... 
153e0 20 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 36       gaiaExport6
153f0 34 20 28 70 74 72 20 2b 20 32 34 2c 20 6d 2c 20  4 (ptr + 24, m, 
15400 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
15410 09 2f 2a 20 4d 20 2d 20 65 78 74 65 72 69 6f 72  ./* M - exterior
15420 20 72 69 6e 67 20 2a 2f 0a 09 09 20 20 20 20 20   ring */...     
15430 20 70 74 72 20 2b 3d 20 33 32 3b 0a 09 09 20 20   ptr += 32;...  
15440 7d 0a 09 20 20 20 20 7d 0a 09 20 20 2a 70 74 72  }..    }..  *ptr
15450 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 45 4e 44   = GAIA_MARK_END
15460 3b 09 2f 2a 20 45 4e 44 20 73 69 67 6e 61 74 75  ;./* END signatu
15470 72 65 20 2a 2f 0a 09 20 20 62 72 65 61 6b 3b 0a  re */..  break;.
15480 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09        default:..
15490 20 20 2f 2a 20 74 68 69 73 20 6f 6e 65 20 69 73    /* this one is
154a0 20 61 20 4d 55 4c 54 49 78 78 78 78 20 6f 72 20   a MULTIxxxx or 
154b0 61 20 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  a GEOMETRYCOLLEC
154c0 54 49 4f 4e 20 2d 20 62 75 69 6c 64 69 6e 67 20  TION - building 
154d0 74 68 65 20 6d 61 69 6e 20 68 65 61 64 65 72 20  the main header 
154e0 2a 2f 0a 09 20 20 2a 70 74 72 20 3d 20 47 41 49  */..  *ptr = GAI
154f0 41 5f 4d 41 52 4b 5f 53 54 41 52 54 3b 09 2f 2a  A_MARK_START;./*
15500 20 53 54 41 52 54 20 73 69 67 6e 61 74 75 72 65   START signature
15510 20 2a 2f 0a 09 20 20 2a 28 70 74 72 20 2b 20 31   */..  *(ptr + 1
15520 29 20 3d 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f  ) = GAIA_LITTLE_
15530 45 4e 44 49 41 4e 3b 09 2f 2a 20 62 79 74 65 20  ENDIAN;./* byte 
15540 6f 72 64 65 72 69 6e 67 20 2a 2f 0a 09 20 20 67  ordering */..  g
15550 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72  aiaExport32 (ptr
15560 20 2b 20 32 2c 20 67 65 6f 6d 2d 3e 53 72 69 64   + 2, geom->Srid
15570 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
15580 29 3b 09 2f 2a 20 74 68 65 20 53 52 49 44 20 2a  );./* the SRID *
15590 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 36  /..  gaiaExport6
155a0 34 20 28 70 74 72 20 2b 20 36 2c 20 67 65 6f 6d  4 (ptr + 6, geom
155b0 2d 3e 4d 69 6e 58 2c 20 31 2c 20 65 6e 64 69 61  ->MinX, 1, endia
155c0 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20  n_arch);./* MBR 
155d0 2d 20 6d 69 6e 69 6d 75 6d 20 58 20 2a 2f 0a 09  - minimum X */..
155e0 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28    gaiaExport64 (
155f0 70 74 72 20 2b 20 31 34 2c 20 67 65 6f 6d 2d 3e  ptr + 14, geom->
15600 4d 69 6e 59 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  MinY, 1, endian_
15610 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20  arch);./* MBR - 
15620 6d 69 6e 69 6d 75 6d 20 59 20 2a 2f 0a 09 20 20  minimum Y */..  
15630 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74  gaiaExport64 (pt
15640 72 20 2b 20 32 32 2c 20 67 65 6f 6d 2d 3e 4d 61  r + 22, geom->Ma
15650 78 58 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72  xX, 1, endian_ar
15660 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 61  ch);./* MBR - ma
15670 78 69 6d 75 6d 20 58 20 2a 2f 0a 09 20 20 67 61  ximum X */..  ga
15680 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20  iaExport64 (ptr 
15690 2b 20 33 30 2c 20 67 65 6f 6d 2d 3e 4d 61 78 59  + 30, geom->MaxY
156a0 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
156b0 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 61 78 69  );./* MBR - maxi
156c0 6d 75 6d 20 59 20 2a 2f 0a 09 20 20 2a 28 70 74  mum Y */..  *(pt
156d0 72 20 2b 20 33 38 29 20 3d 20 47 41 49 41 5f 4d  r + 38) = GAIA_M
156e0 41 52 4b 5f 4d 42 52 3b 09 2f 2a 20 4d 42 52 20  ARK_MBR;./* MBR 
156f0 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20  signature */..  
15700 67 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74  gaiaExport32 (pt
15710 72 20 2b 20 33 39 2c 20 74 79 70 65 2c 20 31 2c  r + 39, type, 1,
15720 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
15730 2a 20 67 65 6f 6d 65 74 72 69 63 20 63 6c 61 73  * geometric clas
15740 73 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f  s */..  gaiaExpo
15750 72 74 33 32 20 28 70 74 72 20 2b 20 34 33 2c 20  rt32 (ptr + 43, 
15760 65 6e 74 69 74 69 65 73 2c 20 31 2c 20 65 6e 64  entities, 1, end
15770 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 23 20  ian_arch);./* # 
15780 65 6e 74 69 74 69 65 73 20 2a 2f 0a 09 20 20 70  entities */..  p
15790 74 72 20 2b 3d 20 34 37 3b 0a 09 20 20 70 6f 69  tr += 47;..  poi
157a0 6e 74 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73 74  nt = geom->First
157b0 50 6f 69 6e 74 3b 0a 09 20 20 77 68 69 6c 65 20  Point;..  while 
157c0 28 70 6f 69 6e 74 29 0a 09 20 20 20 20 7b 0a 09  (point)..    {..
157d0 09 2a 70 74 72 20 3d 20 47 41 49 41 5f 4d 41 52  .*ptr = GAIA_MAR
157e0 4b 5f 45 4e 54 49 54 59 3b 09 2f 2a 20 45 4e 54  K_ENTITY;./* ENT
157f0 49 54 59 20 73 69 67 6e 61 74 75 72 65 20 2a 2f  ITY signature */
15800 0a 09 09 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d  ...if (geom->Dim
15810 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
15820 41 49 41 5f 58 59 5f 5a 29 0a 09 09 20 20 7b 0a  AIA_XY_Z)...  {.
15830 09 09 20 20 20 20 20 20 67 61 69 61 45 78 70 6f  ..      gaiaExpo
15840 72 74 33 32 20 28 70 74 72 20 2b 20 31 2c 20 47  rt32 (ptr + 1, G
15850 41 49 41 5f 50 4f 49 4e 54 5a 2c 20 31 2c 20 65  AIA_POINTZ, 1, e
15860 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
15870 63 6c 61 73 73 20 50 4f 49 4e 54 20 58 59 5a 20  class POINT XYZ 
15880 2a 2f 0a 09 09 20 20 20 20 20 20 67 61 69 61 45  */...      gaiaE
15890 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 35  xport64 (ptr + 5
158a0 2c 20 70 6f 69 6e 74 2d 3e 58 2c 20 31 2c 20 65  , point->X, 1, e
158b0 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
158c0 58 20 2a 2f 0a 09 09 20 20 20 20 20 20 67 61 69  X */...      gai
158d0 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b  aExport64 (ptr +
158e0 20 31 33 2c 20 70 6f 69 6e 74 2d 3e 59 2c 20 31   13, point->Y, 1
158f0 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
15900 2f 2a 20 59 20 2a 2f 0a 09 09 20 20 20 20 20 20  /* Y */...      
15910 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74  gaiaExport64 (pt
15920 72 20 2b 20 32 31 2c 20 70 6f 69 6e 74 2d 3e 5a  r + 21, point->Z
15930 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
15940 29 3b 09 2f 2a 20 5a 20 2a 2f 0a 09 09 20 20 20  );./* Z */...   
15950 20 20 20 70 74 72 20 2b 3d 20 32 39 3b 0a 09 09     ptr += 29;...
15960 20 20 7d 0a 09 09 65 6c 73 65 20 69 66 20 28 67    }...else if (g
15970 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  eom->DimensionMo
15980 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d  del == GAIA_XY_M
15990 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  )...  {...      
159a0 67 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74  gaiaExport32 (pt
159b0 72 20 2b 20 31 2c 20 47 41 49 41 5f 50 4f 49 4e  r + 1, GAIA_POIN
159c0 54 4d 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72  TM, 1, endian_ar
159d0 63 68 29 3b 09 2f 2a 20 63 6c 61 73 73 20 50 4f  ch);./* class PO
159e0 49 4e 54 20 58 59 4d 20 2a 2f 0a 09 09 20 20 20  INT XYM */...   
159f0 20 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20     gaiaExport64 
15a00 28 70 74 72 20 2b 20 35 2c 20 70 6f 69 6e 74 2d  (ptr + 5, point-
15a10 3e 58 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72  >X, 1, endian_ar
15a20 63 68 29 3b 09 2f 2a 20 58 20 2a 2f 0a 09 09 20  ch);./* X */... 
15a30 20 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 36       gaiaExport6
15a40 34 20 28 70 74 72 20 2b 20 31 33 2c 20 70 6f 69  4 (ptr + 13, poi
15a50 6e 74 2d 3e 59 2c 20 31 2c 20 65 6e 64 69 61 6e  nt->Y, 1, endian
15a60 5f 61 72 63 68 29 3b 09 2f 2a 20 59 20 2a 2f 0a  _arch);./* Y */.
15a70 09 09 20 20 20 20 20 20 67 61 69 61 45 78 70 6f  ..      gaiaExpo
15a80 72 74 36 34 20 28 70 74 72 20 2b 20 32 31 2c 20  rt64 (ptr + 21, 
15a90 70 6f 69 6e 74 2d 3e 4d 2c 20 31 2c 20 65 6e 64  point->M, 1, end
15aa0 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 20  ian_arch);./* M 
15ab0 2a 2f 0a 09 09 20 20 20 20 20 20 70 74 72 20 2b  */...      ptr +
15ac0 3d 20 32 39 3b 0a 09 09 20 20 7d 0a 09 09 65 6c  = 29;...  }...el
15ad0 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d  se if (geom->Dim
15ae0 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
15af0 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20  AIA_XY_Z_M)...  
15b00 7b 0a 09 09 20 20 20 20 20 20 67 61 69 61 45 78  {...      gaiaEx
15b10 70 6f 72 74 33 32 20 28 70 74 72 20 2b 20 31 2c  port32 (ptr + 1,
15b20 20 47 41 49 41 5f 50 4f 49 4e 54 5a 4d 2c 20 31   GAIA_POINTZM, 1
15b30 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
15b40 2f 2a 20 63 6c 61 73 73 20 50 4f 49 4e 54 20 58  /* class POINT X
15b50 59 5a 4d 20 2a 2f 0a 09 09 20 20 20 20 20 20 67  YZM */...      g
15b60 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
15b70 20 2b 20 35 2c 20 70 6f 69 6e 74 2d 3e 58 2c 20   + 5, point->X, 
15b80 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
15b90 09 2f 2a 20 58 20 2a 2f 0a 09 09 20 20 20 20 20  ./* X */...     
15ba0 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70   gaiaExport64 (p
15bb0 74 72 20 2b 20 31 33 2c 20 70 6f 69 6e 74 2d 3e  tr + 13, point->
15bc0 59 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  Y, 1, endian_arc
15bd0 68 29 3b 09 2f 2a 20 59 20 2a 2f 0a 09 09 20 20  h);./* Y */...  
15be0 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 36 34      gaiaExport64
15bf0 20 28 70 74 72 20 2b 20 32 31 2c 20 70 6f 69 6e   (ptr + 21, poin
15c00 74 2d 3e 5a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  t->Z, 1, endian_
15c10 61 72 63 68 29 3b 09 2f 2a 20 5a 20 2a 2f 0a 09  arch);./* Z */..
15c20 09 20 20 20 20 20 20 67 61 69 61 45 78 70 6f 72  .      gaiaExpor
15c30 74 36 34 20 28 70 74 72 20 2b 20 32 39 2c 20 70  t64 (ptr + 29, p
15c40 6f 69 6e 74 2d 3e 4d 2c 20 31 2c 20 65 6e 64 69  oint->M, 1, endi
15c50 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 20 2a  an_arch);./* M *
15c60 2f 0a 09 09 20 20 20 20 20 20 70 74 72 20 2b 3d  /...      ptr +=
15c70 20 33 37 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73   37;...  }...els
15c80 65 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  e...  {...      
15c90 67 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74  gaiaExport32 (pt
15ca0 72 20 2b 20 31 2c 20 47 41 49 41 5f 50 4f 49 4e  r + 1, GAIA_POIN
15cb0 54 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  T, 1, endian_arc
15cc0 68 29 3b 09 2f 2a 20 63 6c 61 73 73 20 50 4f 49  h);./* class POI
15cd0 4e 54 20 2a 2f 0a 09 09 20 20 20 20 20 20 67 61  NT */...      ga
15ce0 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20  iaExport64 (ptr 
15cf0 2b 20 35 2c 20 70 6f 69 6e 74 2d 3e 58 2c 20 31  + 5, point->X, 1
15d00 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
15d10 2f 2a 20 58 20 2a 2f 0a 09 09 20 20 20 20 20 20  /* X */...      
15d20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74  gaiaExport64 (pt
15d30 72 20 2b 20 31 33 2c 20 70 6f 69 6e 74 2d 3e 59  r + 13, point->Y
15d40 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
15d50 29 3b 09 2f 2a 20 59 20 2a 2f 0a 09 09 20 20 20  );./* Y */...   
15d60 20 20 20 70 74 72 20 2b 3d 20 32 31 3b 0a 09 09     ptr += 21;...
15d70 20 20 7d 0a 09 09 70 6f 69 6e 74 20 3d 20 70 6f    }...point = po
15d80 69 6e 74 2d 3e 4e 65 78 74 3b 0a 09 20 20 20 20  int->Next;..    
15d90 7d 0a 09 20 20 6c 69 6e 65 20 3d 20 67 65 6f 6d  }..  line = geom
15da0 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74 72 69 6e  ->FirstLinestrin
15db0 67 3b 0a 09 20 20 77 68 69 6c 65 20 28 6c 69 6e  g;..  while (lin
15dc0 65 29 0a 09 20 20 20 20 7b 0a 09 09 2a 70 74 72  e)..    {...*ptr
15dd0 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 45 4e 54   = GAIA_MARK_ENT
15de0 49 54 59 3b 09 2f 2a 20 45 4e 54 49 54 59 20 73  ITY;./* ENTITY s
15df0 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 09 69 66  ignature */...if
15e00 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f   (geom->Dimensio
15e10 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
15e20 59 5f 5a 29 0a 09 09 20 20 20 20 67 61 69 61 45  Y_Z)...    gaiaE
15e30 78 70 6f 72 74 33 32 20 28 70 74 72 20 2b 20 31  xport32 (ptr + 1
15e40 2c 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e  , GAIA_LINESTRIN
15e50 47 5a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72  GZ, 1, endian_ar
15e60 63 68 29 3b 09 2f 2a 20 63 6c 61 73 73 20 4c 49  ch);./* class LI
15e70 4e 45 53 54 52 49 4e 47 20 58 59 5a 20 2a 2f 0a  NESTRING XYZ */.
15e80 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d  ..else if (geom-
15e90 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
15ea0 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09  == GAIA_XY_M)...
15eb0 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 33 32      gaiaExport32
15ec0 20 28 70 74 72 20 2b 20 31 2c 20 47 41 49 41 5f   (ptr + 1, GAIA_
15ed0 4c 49 4e 45 53 54 52 49 4e 47 4d 2c 20 31 2c 20  LINESTRINGM, 1, 
15ee0 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a  endian_arch);./*
15ef0 20 63 6c 61 73 73 20 4c 49 4e 45 53 54 52 49 4e   class LINESTRIN
15f00 47 20 58 59 4d 20 2a 2f 0a 09 09 65 6c 73 65 20  G XYM */...else 
15f10 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
15f20 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
15f30 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20 20 67  _XY_Z_M)...    g
15f40 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72  aiaExport32 (ptr
15f50 20 2b 20 31 2c 20 47 41 49 41 5f 4c 49 4e 45 53   + 1, GAIA_LINES
15f60 54 52 49 4e 47 5a 4d 2c 20 31 2c 20 65 6e 64 69  TRINGZM, 1, endi
15f70 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 63 6c 61  an_arch);./* cla
15f80 73 73 20 4c 49 4e 45 53 54 52 49 4e 47 20 58 59  ss LINESTRING XY
15f90 5a 4d 20 2a 2f 0a 09 09 65 6c 73 65 0a 09 09 20  ZM */...else... 
15fa0 20 20 20 67 61 69 61 45 78 70 6f 72 74 33 32 20     gaiaExport32 
15fb0 28 70 74 72 20 2b 20 31 2c 20 47 41 49 41 5f 4c  (ptr + 1, GAIA_L
15fc0 49 4e 45 53 54 52 49 4e 47 2c 20 31 2c 20 65 6e  INESTRING, 1, en
15fd0 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 63  dian_arch);./* c
15fe0 6c 61 73 73 20 4c 49 4e 45 53 54 52 49 4e 47 20  lass LINESTRING 
15ff0 2a 2f 0a 09 09 67 61 69 61 45 78 70 6f 72 74 33  */...gaiaExport3
16000 32 20 28 70 74 72 20 2b 20 35 2c 20 6c 69 6e 65  2 (ptr + 5, line
16010 2d 3e 50 6f 69 6e 74 73 2c 20 31 2c 20 65 6e 64  ->Points, 1, end
16020 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 23 20  ian_arch);./* # 
16030 70 6f 69 6e 74 73 20 2a 2f 0a 09 09 70 74 72 20  points */...ptr 
16040 2b 3d 20 39 3b 0a 09 09 66 6f 72 20 28 69 76 20  += 9;...for (iv 
16050 3d 20 30 3b 20 69 76 20 3c 20 6c 69 6e 65 2d 3e  = 0; iv < line->
16060 50 6f 69 6e 74 73 3b 20 69 76 2b 2b 29 0a 09 09  Points; iv++)...
16070 20 20 7b 0a 09 09 20 20 20 20 20 20 69 66 20 28    {...      if (
16080 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d  geom->DimensionM
16090 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f  odel == GAIA_XY_
160a0 5a 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 67  Z)....{....    g
160b0 61 69 61 47 65 74 50 6f 69 6e 74 58 59 5a 20 28  aiaGetPointXYZ (
160c0 6c 69 6e 65 2d 3e 43 6f 6f 72 64 73 2c 20 69 76  line->Coords, iv
160d0 2c 20 26 78 2c 20 26 79 2c 20 26 7a 29 3b 0a 09  , &x, &y, &z);..
160e0 09 09 7d 0a 09 09 20 20 20 20 20 20 65 6c 73 65  ..}...      else
160f0 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e   if (geom->Dimen
16100 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
16110 41 5f 58 59 5f 4d 29 0a 09 09 09 7b 0a 09 09 09  A_XY_M)....{....
16120 20 20 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74      gaiaGetPoint
16130 58 59 4d 20 28 6c 69 6e 65 2d 3e 43 6f 6f 72 64  XYM (line->Coord
16140 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26  s, iv, &x, &y, &
16150 6d 29 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20  m);....}...     
16160 20 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e   else if (geom->
16170 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
16180 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09  = GAIA_XY_Z_M)..
16190 09 09 7b 0a 09 09 09 20 20 20 20 67 61 69 61 47  ..{....    gaiaG
161a0 65 74 50 6f 69 6e 74 58 59 5a 4d 20 28 6c 69 6e  etPointXYZM (lin
161b0 65 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26  e->Coords, iv, &
161c0 78 2c 20 26 79 2c 20 26 7a 2c 20 26 6d 29 3b 0a  x, &y, &z, &m);.
161d0 09 09 09 7d 0a 09 09 20 20 20 20 20 20 65 6c 73  ...}...      els
161e0 65 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 67 61  e....{....    ga
161f0 69 61 47 65 74 50 6f 69 6e 74 20 28 6c 69 6e 65  iaGetPoint (line
16200 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78  ->Coords, iv, &x
16210 2c 20 26 79 29 3b 0a 09 09 09 7d 0a 09 09 20 20  , &y);....}...  
16220 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 36 34      gaiaExport64
16230 20 28 70 74 72 2c 20 78 2c 20 31 2c 20 65 6e 64   (ptr, x, 1, end
16240 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 58 20  ian_arch);./* X 
16250 2a 2f 0a 09 09 20 20 20 20 20 20 67 61 69 61 45  */...      gaiaE
16260 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 38  xport64 (ptr + 8
16270 2c 20 79 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  , y, 1, endian_a
16280 72 63 68 29 3b 09 2f 2a 20 59 20 2a 2f 0a 09 09  rch);./* Y */...
16290 20 20 20 20 20 20 70 74 72 20 2b 3d 20 31 36 3b        ptr += 16;
162a0 0a 09 09 20 20 20 20 20 20 69 66 20 28 67 65 6f  ...      if (geo
162b0 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
162c0 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a  l == GAIA_XY_Z).
162d0 09 09 09 7b 0a 09 09 09 20 20 20 20 67 61 69 61  ...{....    gaia
162e0 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20 7a  Export64 (ptr, z
162f0 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
16300 29 3b 09 2f 2a 20 5a 20 2a 2f 0a 09 09 09 20 20  );./* Z */....  
16310 20 20 70 74 72 20 2b 3d 20 38 3b 0a 09 09 09 7d    ptr += 8;....}
16320 0a 09 09 20 20 20 20 20 20 69 66 20 28 67 65 6f  ...      if (geo
16330 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
16340 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a  l == GAIA_XY_M).
16350 09 09 09 7b 0a 09 09 09 20 20 20 20 67 61 69 61  ...{....    gaia
16360 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20 6d  Export64 (ptr, m
16370 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
16380 29 3b 09 2f 2a 20 4d 20 2a 2f 0a 09 09 09 20 20  );./* M */....  
16390 20 20 70 74 72 20 2b 3d 20 38 3b 0a 09 09 09 7d    ptr += 8;....}
163a0 0a 09 09 20 20 20 20 20 20 69 66 20 28 67 65 6f  ...      if (geo
163b0 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
163c0 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  l == GAIA_XY_Z_M
163d0 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 67 61  )....{....    ga
163e0 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c  iaExport64 (ptr,
163f0 20 7a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72   z, 1, endian_ar
16400 63 68 29 3b 09 2f 2a 20 5a 20 2a 2f 0a 09 09 09  ch);./* Z */....
16410 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 36 34      gaiaExport64
16420 20 28 70 74 72 20 2b 20 38 2c 20 6d 2c 20 31 2c   (ptr + 8, m, 1,
16430 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
16440 2a 20 4d 20 2a 2f 0a 09 09 09 20 20 20 20 70 74  * M */....    pt
16450 72 20 2b 3d 20 31 36 3b 0a 09 09 09 7d 0a 09 09  r += 16;....}...
16460 20 20 7d 0a 09 09 6c 69 6e 65 20 3d 20 6c 69 6e    }...line = lin
16470 65 2d 3e 4e 65 78 74 3b 0a 09 20 20 20 20 7d 0a  e->Next;..    }.
16480 09 20 20 70 6f 6c 79 67 20 3d 20 67 65 6f 6d 2d  .  polyg = geom-
16490 3e 46 69 72 73 74 50 6f 6c 79 67 6f 6e 3b 0a 09  >FirstPolygon;..
164a0 20 20 77 68 69 6c 65 20 28 70 6f 6c 79 67 29 0a    while (polyg).
164b0 09 20 20 20 20 7b 0a 09 09 2a 70 74 72 20 3d 20  .    {...*ptr = 
164c0 47 41 49 41 5f 4d 41 52 4b 5f 45 4e 54 49 54 59  GAIA_MARK_ENTITY
164d0 3b 09 2f 2a 20 45 4e 54 49 54 59 20 73 69 67 6e  ;./* ENTITY sign
164e0 61 74 75 72 65 20 2a 2f 0a 09 09 69 66 20 28 67  ature */...if (g
164f0 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  eom->DimensionMo
16500 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a  del == GAIA_XY_Z
16510 29 0a 09 09 20 20 20 20 67 61 69 61 45 78 70 6f  )...    gaiaExpo
16520 72 74 33 32 20 28 70 74 72 20 2b 20 31 2c 20 47  rt32 (ptr + 1, G
16530 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 2c 20 31 2c  AIA_POLYGONZ, 1,
16540 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
16550 2a 20 63 6c 61 73 73 20 50 4f 4c 59 47 4f 4e 20  * class POLYGON 
16560 58 59 5a 20 2a 2f 0a 09 09 65 6c 73 65 20 69 66  XYZ */...else if
16570 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f   (geom->Dimensio
16580 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
16590 59 5f 4d 29 0a 09 09 20 20 20 20 67 61 69 61 45  Y_M)...    gaiaE
165a0 78 70 6f 72 74 33 32 20 28 70 74 72 20 2b 20 31  xport32 (ptr + 1
165b0 2c 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 4d 2c  , GAIA_POLYGONM,
165c0 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
165d0 3b 09 2f 2a 20 63 6c 61 73 73 20 50 4f 4c 59 47  ;./* class POLYG
165e0 4f 4e 20 58 59 4d 20 2a 2f 0a 09 09 65 6c 73 65  ON XYM */...else
165f0 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e   if (geom->Dimen
16600 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
16610 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20 20  A_XY_Z_M)...    
16620 67 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74  gaiaExport32 (pt
16630 72 20 2b 20 31 2c 20 47 41 49 41 5f 50 4f 4c 59  r + 1, GAIA_POLY
16640 47 4f 4e 5a 4d 2c 20 31 2c 20 65 6e 64 69 61 6e  GONZM, 1, endian
16650 5f 61 72 63 68 29 3b 09 2f 2a 20 63 6c 61 73 73  _arch);./* class
16660 20 50 4f 4c 59 47 4f 4e 20 58 59 5a 4d 20 2a 2f   POLYGON XYZM */
16670 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 67 61  ...else...    ga
16680 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 20  iaExport32 (ptr 
16690 2b 20 31 2c 20 47 41 49 41 5f 50 4f 4c 59 47 4f  + 1, GAIA_POLYGO
166a0 4e 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  N, 1, endian_arc
166b0 68 29 3b 09 2f 2a 20 63 6c 61 73 73 20 50 4f 4c  h);./* class POL
166c0 59 47 4f 4e 20 2a 2f 0a 09 09 67 61 69 61 45 78  YGON */...gaiaEx
166d0 70 6f 72 74 33 32 20 28 70 74 72 20 2b 20 35 2c  port32 (ptr + 5,
166e0 20 70 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74 65 72   polyg->NumInter
166f0 69 6f 72 73 20 2b 20 31 2c 20 31 2c 20 65 6e 64  iors + 1, 1, end
16700 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 23 20  ian_arch);./* # 
16710 72 69 6e 67 73 20 2a 2f 0a 09 09 72 6e 67 20 3d  rings */...rng =
16720 20 70 6f 6c 79 67 2d 3e 45 78 74 65 72 69 6f 72   polyg->Exterior
16730 3b 0a 09 09 67 61 69 61 45 78 70 6f 72 74 33 32  ;...gaiaExport32
16740 20 28 70 74 72 20 2b 20 39 2c 20 72 6e 67 2d 3e   (ptr + 9, rng->
16750 50 6f 69 6e 74 73 2c 20 31 2c 20 65 6e 64 69 61  Points, 1, endia
16760 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 23 20 70 6f  n_arch);./* # po
16770 69 6e 74 73 20 2d 20 65 78 74 65 72 69 6f 72 20  ints - exterior 
16780 72 69 6e 67 20 2a 2f 0a 09 09 70 74 72 20 2b 3d  ring */...ptr +=
16790 20 31 33 3b 0a 09 09 66 6f 72 20 28 69 76 20 3d   13;...for (iv =
167a0 20 30 3b 20 69 76 20 3c 20 72 6e 67 2d 3e 50 6f   0; iv < rng->Po
167b0 69 6e 74 73 3b 20 69 76 2b 2b 29 0a 09 09 20 20  ints; iv++)...  
167c0 7b 0a 09 09 20 20 20 20 20 20 69 66 20 28 67 65  {...      if (ge
167d0 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  om->DimensionMod
167e0 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29  el == GAIA_XY_Z)
167f0 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 67 61 69  ....{....    gai
16800 61 47 65 74 50 6f 69 6e 74 58 59 5a 20 28 72 6e  aGetPointXYZ (rn
16810 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26  g->Coords, iv, &
16820 78 2c 20 26 79 2c 20 26 7a 29 3b 0a 09 09 09 7d  x, &y, &z);....}
16830 0a 09 09 20 20 20 20 20 20 65 6c 73 65 20 69 66  ...      else if
16840 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f   (geom->Dimensio
16850 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
16860 59 5f 4d 29 0a 09 09 09 7b 0a 09 09 09 20 20 20  Y_M)....{....   
16870 20 67 61 69 61 47 65 74 50 6f 69 6e 74 58 59 4d   gaiaGetPointXYM
16880 20 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69   (rng->Coords, i
16890 76 2c 20 26 78 2c 20 26 79 2c 20 26 6d 29 3b 0a  v, &x, &y, &m);.
168a0 09 09 09 7d 0a 09 09 20 20 20 20 20 20 65 6c 73  ...}...      els
168b0 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  e if (geom->Dime
168c0 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
168d0 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 09 7b 0a  IA_XY_Z_M)....{.
168e0 09 09 09 20 20 20 20 67 61 69 61 47 65 74 50 6f  ...    gaiaGetPo
168f0 69 6e 74 58 59 5a 4d 20 28 72 6e 67 2d 3e 43 6f  intXYZM (rng->Co
16900 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79  ords, iv, &x, &y
16910 2c 20 26 7a 2c 20 26 6d 29 3b 0a 09 09 09 7d 0a  , &z, &m);....}.
16920 09 09 20 20 20 20 20 20 65 6c 73 65 0a 09 09 09  ..      else....
16930 7b 0a 09 09 09 20 20 20 20 67 61 69 61 47 65 74  {....    gaiaGet
16940 50 6f 69 6e 74 20 28 72 6e 67 2d 3e 43 6f 6f 72  Point (rng->Coor
16950 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 29 3b  ds, iv, &x, &y);
16960 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 67 61  ....}...      ga
16970 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c  iaExport64 (ptr,
16980 20 78 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72   x, 1, endian_ar
16990 63 68 29 3b 09 2f 2a 20 58 20 2d 20 65 78 74 65  ch);./* X - exte
169a0 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 09 20  rior ring */... 
169b0 20 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 36       gaiaExport6
169c0 34 20 28 70 74 72 20 2b 20 38 2c 20 79 2c 20 31  4 (ptr + 8, y, 1
169d0 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
169e0 2f 2a 20 59 20 2d 20 65 78 74 65 72 69 6f 72 20  /* Y - exterior 
169f0 72 69 6e 67 20 2a 2f 0a 09 09 20 20 20 20 20 20  ring */...      
16a00 70 74 72 20 2b 3d 20 31 36 3b 0a 09 09 20 20 20  ptr += 16;...   
16a10 20 20 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d     if (geom->Dim
16a20 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
16a30 41 49 41 5f 58 59 5f 5a 29 0a 09 09 09 7b 0a 09  AIA_XY_Z)....{..
16a40 09 09 20 20 20 20 67 61 69 61 45 78 70 6f 72 74  ..    gaiaExport
16a50 36 34 20 28 70 74 72 2c 20 7a 2c 20 31 2c 20 65  64 (ptr, z, 1, e
16a60 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
16a70 5a 20 2a 2f 0a 09 09 09 20 20 20 20 70 74 72 20  Z */....    ptr 
16a80 2b 3d 20 38 3b 0a 09 09 09 7d 0a 09 09 20 20 20  += 8;....}...   
16a90 20 20 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d     if (geom->Dim
16aa0 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
16ab0 41 49 41 5f 58 59 5f 4d 29 0a 09 09 09 7b 0a 09  AIA_XY_M)....{..
16ac0 09 09 20 20 20 20 67 61 69 61 45 78 70 6f 72 74  ..    gaiaExport
16ad0 36 34 20 28 70 74 72 2c 20 6d 2c 20 31 2c 20 65  64 (ptr, m, 1, e
16ae0 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
16af0 4d 20 2a 2f 0a 09 09 09 20 20 20 20 70 74 72 20  M */....    ptr 
16b00 2b 3d 20 38 3b 0a 09 09 09 7d 0a 09 09 20 20 20  += 8;....}...   
16b10 20 20 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d     if (geom->Dim
16b20 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
16b30 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 09 7b  AIA_XY_Z_M)....{
16b40 0a 09 09 09 20 20 20 20 67 61 69 61 45 78 70 6f  ....    gaiaExpo
16b50 72 74 36 34 20 28 70 74 72 2c 20 7a 2c 20 31 2c  rt64 (ptr, z, 1,
16b60 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
16b70 2a 20 5a 20 2a 2f 0a 09 09 09 20 20 20 20 67 61  * Z */....    ga
16b80 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20  iaExport64 (ptr 
16b90 2b 20 38 2c 20 6d 2c 20 31 2c 20 65 6e 64 69 61  + 8, m, 1, endia
16ba0 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 20 2a 2f  n_arch);./* M */
16bb0 0a 09 09 09 20 20 20 20 70 74 72 20 2b 3d 20 31  ....    ptr += 1
16bc0 36 3b 0a 09 09 09 7d 0a 09 09 20 20 7d 0a 09 09  6;....}...  }...
16bd0 66 6f 72 20 28 69 62 20 3d 20 30 3b 20 69 62 20  for (ib = 0; ib 
16be0 3c 20 70 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74 65  < polyg->NumInte
16bf0 72 69 6f 72 73 3b 20 69 62 2b 2b 29 0a 09 09 20  riors; ib++)... 
16c00 20 7b 0a 09 09 20 20 20 20 20 20 72 6e 67 20 3d   {...      rng =
16c10 20 70 6f 6c 79 67 2d 3e 49 6e 74 65 72 69 6f 72   polyg->Interior
16c20 73 20 2b 20 69 62 3b 0a 09 09 20 20 20 20 20 20  s + ib;...      
16c30 67 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74  gaiaExport32 (pt
16c40 72 2c 20 72 6e 67 2d 3e 50 6f 69 6e 74 73 2c 20  r, rng->Points, 
16c50 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
16c60 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20 2d 20 69  ./* # points - i
16c70 6e 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a  nterior ring */.
16c80 09 09 20 20 20 20 20 20 70 74 72 20 2b 3d 20 34  ..      ptr += 4
16c90 3b 0a 09 09 20 20 20 20 20 20 66 6f 72 20 28 69  ;...      for (i
16ca0 76 20 3d 20 30 3b 20 69 76 20 3c 20 72 6e 67 2d  v = 0; iv < rng-
16cb0 3e 50 6f 69 6e 74 73 3b 20 69 76 2b 2b 29 0a 09  >Points; iv++)..
16cc0 09 09 7b 0a 09 09 09 20 20 20 20 69 66 20 28 67  ..{....    if (g
16cd0 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  eom->DimensionMo
16ce0 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a  del == GAIA_XY_Z
16cf0 29 0a 09 09 09 20 20 20 20 20 20 7b 0a 09 09 09  )....      {....
16d00 09 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74 58  .  gaiaGetPointX
16d10 59 5a 20 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c  YZ (rng->Coords,
16d20 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26 7a 29   iv, &x, &y, &z)
16d30 3b 0a 09 09 09 20 20 20 20 20 20 7d 0a 09 09 09  ;....      }....
16d40 20 20 20 20 65 6c 73 65 20 69 66 20 28 67 65 6f      else if (geo
16d50 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
16d60 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a  l == GAIA_XY_M).
16d70 09 09 09 20 20 20 20 20 20 7b 0a 09 09 09 09 20  ...      {..... 
16d80 20 67 61 69 61 47 65 74 50 6f 69 6e 74 58 59 4d   gaiaGetPointXYM
16d90 20 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69   (rng->Coords, i
16da0 76 2c 20 26 78 2c 20 26 79 2c 20 26 6d 29 3b 0a  v, &x, &y, &m);.
16db0 09 09 09 20 20 20 20 20 20 7d 0a 09 09 09 20 20  ...      }....  
16dc0 20 20 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d    else if (geom-
16dd0 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
16de0 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a  == GAIA_XY_Z_M).
16df0 09 09 09 20 20 20 20 20 20 7b 0a 09 09 09 09 20  ...      {..... 
16e00 20 67 61 69 61 47 65 74 50 6f 69 6e 74 58 59 5a   gaiaGetPointXYZ
16e10 4d 20 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20  M (rng->Coords, 
16e20 69 76 2c 20 26 78 2c 20 26 79 2c 0a 09 09 09 09  iv, &x, &y,.....
16e30 09 09 20 20 20 20 26 7a 2c 20 26 6d 29 3b 0a 09  ..    &z, &m);..
16e40 09 09 20 20 20 20 20 20 7d 0a 09 09 09 20 20 20  ..      }....   
16e50 20 65 6c 73 65 0a 09 09 09 20 20 20 20 20 20 7b   else....      {
16e60 0a 09 09 09 09 20 20 67 61 69 61 47 65 74 50 6f  .....  gaiaGetPo
16e70 69 6e 74 20 28 72 6e 67 2d 3e 43 6f 6f 72 64 73  int (rng->Coords
16e80 2c 20 69 76 2c 20 26 78 2c 20 26 79 29 3b 0a 09  , iv, &x, &y);..
16e90 09 09 20 20 20 20 20 20 7d 0a 09 09 09 20 20 20  ..      }....   
16ea0 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70   gaiaExport64 (p
16eb0 74 72 2c 20 78 2c 20 31 2c 20 65 6e 64 69 61 6e  tr, x, 1, endian
16ec0 5f 61 72 63 68 29 3b 09 2f 2a 20 58 20 2d 20 69  _arch);./* X - i
16ed0 6e 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a  nterior ring */.
16ee0 09 09 09 20 20 20 20 67 61 69 61 45 78 70 6f 72  ...    gaiaExpor
16ef0 74 36 34 20 28 70 74 72 20 2b 20 38 2c 20 79 2c  t64 (ptr + 8, y,
16f00 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
16f10 3b 09 2f 2a 20 59 20 2d 20 69 6e 74 65 72 69 6f  ;./* Y - interio
16f20 72 20 72 69 6e 67 20 2a 2f 0a 09 09 09 20 20 20  r ring */....   
16f30 20 70 74 72 20 2b 3d 20 31 36 3b 0a 09 09 09 20   ptr += 16;.... 
16f40 20 20 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d     if (geom->Dim
16f50 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
16f60 41 49 41 5f 58 59 5f 5a 29 0a 09 09 09 20 20 20  AIA_XY_Z)....   
16f70 20 20 20 7b 0a 09 09 09 09 20 20 67 61 69 61 45     {.....  gaiaE
16f80 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20 7a 2c  xport64 (ptr, z,
16f90 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
16fa0 3b 09 2f 2a 20 5a 20 2a 2f 0a 09 09 09 09 20 20  ;./* Z */.....  
16fb0 70 74 72 20 2b 3d 20 38 3b 0a 09 09 09 20 20 20  ptr += 8;....   
16fc0 20 20 20 7d 0a 09 09 09 20 20 20 20 69 66 20 28     }....    if (
16fd0 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d  geom->DimensionM
16fe0 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f  odel == GAIA_XY_
16ff0 4d 29 0a 09 09 09 20 20 20 20 20 20 7b 0a 09 09  M)....      {...
17000 09 09 20 20 67 61 69 61 45 78 70 6f 72 74 36 34  ..  gaiaExport64
17010 20 28 70 74 72 2c 20 6d 2c 20 31 2c 20 65 6e 64   (ptr, m, 1, end
17020 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 20  ian_arch);./* M 
17030 2a 2f 0a 09 09 09 09 20 20 70 74 72 20 2b 3d 20  */.....  ptr += 
17040 38 3b 0a 09 09 09 20 20 20 20 20 20 7d 0a 09 09  8;....      }...
17050 09 20 20 20 20 69 66 20 28 67 65 6f 6d 2d 3e 44  .    if (geom->D
17060 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d  imensionModel ==
17070 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09   GAIA_XY_Z_M)...
17080 09 20 20 20 20 20 20 7b 0a 09 09 09 09 20 20 67  .      {.....  g
17090 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
170a0 2c 20 7a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  , z, 1, endian_a
170b0 72 63 68 29 3b 09 2f 2a 20 5a 20 2a 2f 0a 09 09  rch);./* Z */...
170c0 09 09 20 20 67 61 69 61 45 78 70 6f 72 74 36 34  ..  gaiaExport64
170d0 20 28 70 74 72 20 2b 20 38 2c 20 6d 2c 20 31 2c   (ptr + 8, m, 1,
170e0 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
170f0 2a 20 4d 20 2a 2f 0a 09 09 09 09 20 20 70 74 72  * M */.....  ptr
17100 20 2b 3d 20 31 36 3b 0a 09 09 09 20 20 20 20 20   += 16;....     
17110 20 7d 0a 09 09 09 7d 0a 09 09 20 20 7d 0a 09 09   }....}...  }...
17120 70 6f 6c 79 67 20 3d 20 70 6f 6c 79 67 2d 3e 4e  polyg = polyg->N
17130 65 78 74 3b 0a 09 20 20 20 20 7d 0a 09 20 20 2a  ext;..    }..  *
17140 70 74 72 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f  ptr = GAIA_MARK_
17150 45 4e 44 3b 09 2f 2a 20 45 4e 44 20 73 69 67 6e  END;./* END sign
17160 61 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 7d  ature */.      }
17170 3b 0a 7d 0a 0a 47 41 49 41 47 45 4f 5f 44 45 43  ;.}..GAIAGEO_DEC
17180 4c 41 52 45 20 76 6f 69 64 0a 67 61 69 61 54 6f  LARE void.gaiaTo
17190 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b  SpatiaLiteBlobWk
171a0 62 20 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50  b (gaiaGeomCollP
171b0 74 72 20 67 65 6f 6d 2c 20 75 6e 73 69 67 6e 65  tr geom, unsigne
171c0 64 20 63 68 61 72 20 2a 2a 72 65 73 75 6c 74 2c  d char **result,
171d0 0a 09 09 09 20 69 6e 74 20 2a 73 69 7a 65 29 0a  .... int *size).
171e0 7b 0a 2f 2a 20 0a 2a 20 62 75 69 6c 64 73 20 74  {./* .* builds t
171f0 68 65 20 53 70 61 74 69 61 4c 69 74 65 20 42 4c  he SpatiaLite BL
17200 4f 42 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  OB representatio
17210 6e 20 66 6f 72 20 74 68 69 73 20 47 45 4f 4d 45  n for this GEOME
17220 54 52 59 20 0a 2a 20 63 6f 6e 76 65 6e 69 65 6e  TRY .* convenien
17230 63 65 20 6d 65 74 68 6f 64 20 2d 20 61 6c 77 61  ce method - alwa
17240 79 73 20 64 69 73 61 62 6c 69 6e 67 20 47 50 4b  ys disabling GPK
17250 47 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  G compatibility 
17260 4d 6f 64 65 73 0a 2a 2f 0a 20 20 20 20 67 61 69  Modes.*/.    gai
17270 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f  aToSpatiaLiteBlo
17280 62 57 6b 62 45 78 20 28 67 65 6f 6d 2c 20 72 65  bWkbEx (geom, re
17290 73 75 6c 74 2c 20 73 69 7a 65 2c 20 30 29 3b 0a  sult, size, 0);.
172a0 7d 0a 0a 47 41 49 41 47 45 4f 5f 44 45 43 4c 41  }..GAIAGEO_DECLA
172b0 52 45 20 76 6f 69 64 0a 67 61 69 61 54 6f 43 6f  RE void.gaiaToCo
172c0 6d 70 72 65 73 73 65 64 42 6c 6f 62 57 6b 62 20  mpressedBlobWkb 
172d0 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72  (gaiaGeomCollPtr
172e0 20 67 65 6f 6d 2c 20 75 6e 73 69 67 6e 65 64 20   geom, unsigned 
172f0 63 68 61 72 20 2a 2a 72 65 73 75 6c 74 2c 0a 09  char **result,..
17300 09 09 20 69 6e 74 20 2a 73 69 7a 65 29 0a 7b 0a  .. int *size).{.
17310 2f 2a 20 0a 2f 20 62 75 69 6c 64 73 20 74 68 65  /* ./ builds the
17320 20 53 70 61 74 69 61 4c 69 74 65 20 42 4c 4f 42   SpatiaLite BLOB
17330 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
17340 66 6f 72 20 74 68 69 73 20 47 45 4f 4d 45 54 52  for this GEOMETR
17350 59 20 0a 2f 20 67 65 6f 6d 65 74 72 79 2d 63 6f  Y ./ geometry-co
17360 6d 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62  mpression will b
17370 65 20 61 70 70 6c 69 65 64 20 74 6f 20 4c 49 4e  e applied to LIN
17380 45 53 54 52 49 4e 47 73 20 61 6e 64 20 52 49 4e  ESTRINGs and RIN
17390 47 73 0a 2a 2f 0a 20 20 20 20 69 6e 74 20 69 62  Gs.*/.    int ib
173a0 3b 0a 20 20 20 20 69 6e 74 20 69 76 3b 0a 20 20  ;.    int iv;.  
173b0 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20    double x;.    
173c0 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 64 6f  double y;.    do
173d0 75 62 6c 65 20 7a 3b 0a 20 20 20 20 64 6f 75 62  uble z;.    doub
173e0 6c 65 20 6d 3b 0a 20 20 20 20 64 6f 75 62 6c 65  le m;.    double
173f0 20 6c 61 73 74 5f 78 20 3d 20 30 2e 30 3b 0a 20   last_x = 0.0;. 
17400 20 20 20 64 6f 75 62 6c 65 20 6c 61 73 74 5f 79     double last_y
17410 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62   = 0.0;.    doub
17420 6c 65 20 6c 61 73 74 5f 7a 20 3d 20 30 2e 30 3b  le last_z = 0.0;
17430 0a 20 20 20 20 66 6c 6f 61 74 20 66 78 3b 0a 20  .    float fx;. 
17440 20 20 20 66 6c 6f 61 74 20 66 79 3b 0a 20 20 20     float fy;.   
17450 20 66 6c 6f 61 74 20 66 7a 3b 0a 20 20 20 20 69   float fz;.    i
17460 6e 74 20 65 6e 74 69 74 69 65 73 20 3d 20 30 3b  nt entities = 0;
17470 0a 20 20 20 20 69 6e 74 20 6e 5f 70 6f 69 6e 74  .    int n_point
17480 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  s = 0;.    int n
17490 5f 6c 69 6e 65 73 74 72 69 6e 67 73 20 3d 20 30  _linestrings = 0
174a0 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 70 6f 6c 79  ;.    int n_poly
174b0 67 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e  gons = 0;.    in
174c0 74 20 74 79 70 65 3b 0a 20 20 20 20 75 6e 73 69  t type;.    unsi
174d0 67 6e 65 64 20 63 68 61 72 20 2a 70 74 72 3b 0a  gned char *ptr;.
174e0 20 20 20 20 67 61 69 61 50 6f 69 6e 74 50 74 72      gaiaPointPtr
174f0 20 70 74 3b 0a 20 20 20 20 67 61 69 61 4c 69 6e   pt;.    gaiaLin
17500 65 73 74 72 69 6e 67 50 74 72 20 6c 6e 3b 0a 20  estringPtr ln;. 
17510 20 20 20 67 61 69 61 50 6f 6c 79 67 6f 6e 50 74     gaiaPolygonPt
17520 72 20 70 67 3b 0a 20 20 20 20 67 61 69 61 52 69  r pg;.    gaiaRi
17530 6e 67 50 74 72 20 72 6e 67 3b 0a 20 20 20 20 67  ngPtr rng;.    g
17540 61 69 61 50 6f 69 6e 74 50 74 72 20 70 6f 69 6e  aiaPointPtr poin
17550 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61  t = NULL;.    ga
17560 69 61 4c 69 6e 65 73 74 72 69 6e 67 50 74 72 20  iaLinestringPtr 
17570 6c 69 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  line = NULL;.   
17580 20 67 61 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20   gaiaPolygonPtr 
17590 70 6f 6c 79 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20  polyg = NULL;.  
175a0 20 20 69 6e 74 20 65 6e 64 69 61 6e 5f 61 72 63    int endian_arc
175b0 68 20 3d 20 67 61 69 61 45 6e 64 69 61 6e 41 72  h = gaiaEndianAr
175c0 63 68 20 28 29 3b 0a 20 20 20 20 67 61 69 61 4d  ch ();.    gaiaM
175d0 62 72 47 65 6f 6d 65 74 72 79 20 28 67 65 6f 6d  brGeometry (geom
175e0 29 3b 0a 2f 2a 20 68 6f 77 20 6d 61 6e 79 20 65  );./* how many e
175f0 6e 74 69 74 69 65 73 2c 20 61 6e 64 20 6f 66 20  ntities, and of 
17600 77 68 61 74 20 6b 69 6e 64 2c 20 64 6f 20 77 65  what kind, do we
17610 20 68 61 76 65 20 3f 20 2a 2f 0a 20 20 20 20 70   have ? */.    p
17620 74 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73 74 50  t = geom->FirstP
17630 6f 69 6e 74 3b 0a 20 20 20 20 77 68 69 6c 65 20  oint;.    while 
17640 28 70 74 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  (pt).      {..  
17650 70 6f 69 6e 74 20 3d 20 70 74 3b 0a 09 20 20 65  point = pt;..  e
17660 6e 74 69 74 69 65 73 2b 2b 3b 0a 09 20 20 6e 5f  ntities++;..  n_
17670 70 6f 69 6e 74 73 2b 2b 3b 0a 09 20 20 70 74 20  points++;..  pt 
17680 3d 20 70 74 2d 3e 4e 65 78 74 3b 0a 20 20 20 20  = pt->Next;.    
17690 20 20 7d 0a 20 20 20 20 6c 6e 20 3d 20 67 65 6f    }.    ln = geo
176a0 6d 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74 72 69  m->FirstLinestri
176b0 6e 67 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 6c  ng;.    while (l
176c0 6e 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 6c 69  n).      {..  li
176d0 6e 65 20 3d 20 6c 6e 3b 0a 09 20 20 65 6e 74 69  ne = ln;..  enti
176e0 74 69 65 73 2b 2b 3b 0a 09 20 20 6e 5f 6c 69 6e  ties++;..  n_lin
176f0 65 73 74 72 69 6e 67 73 2b 2b 3b 0a 09 20 20 6c  estrings++;..  l
17700 6e 20 3d 20 6c 6e 2d 3e 4e 65 78 74 3b 0a 20 20  n = ln->Next;.  
17710 20 20 20 20 7d 0a 20 20 20 20 70 67 20 3d 20 67      }.    pg = g
17720 65 6f 6d 2d 3e 46 69 72 73 74 50 6f 6c 79 67 6f  eom->FirstPolygo
17730 6e 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 70 67  n;.    while (pg
17740 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 70 6f 6c  ).      {..  pol
17750 79 67 20 3d 20 70 67 3b 0a 09 20 20 65 6e 74 69  yg = pg;..  enti
17760 74 69 65 73 2b 2b 3b 0a 09 20 20 6e 5f 70 6f 6c  ties++;..  n_pol
17770 79 67 6f 6e 73 2b 2b 3b 0a 09 20 20 70 67 20 3d  ygons++;..  pg =
17780 20 70 67 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20   pg->Next;.     
17790 20 7d 0a 20 20 20 20 2a 73 69 7a 65 20 3d 20 30   }.    *size = 0
177a0 3b 0a 20 20 20 20 2a 72 65 73 75 6c 74 20 3d 20  ;.    *result = 
177b0 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6e 5f  NULL;.    if (n_
177c0 70 6f 69 6e 74 73 20 3d 3d 20 30 20 26 26 20 6e  points == 0 && n
177d0 5f 70 6f 6c 79 67 6f 6e 73 20 3d 3d 20 30 20 26  _polygons == 0 &
177e0 26 20 6e 5f 6c 69 6e 65 73 74 72 69 6e 67 73 20  & n_linestrings 
177f0 3d 3d 20 30 29 0a 09 72 65 74 75 72 6e 3b 0a 2f  == 0)..return;./
17800 2a 20 6f 6b 2c 20 77 65 20 63 61 6e 20 64 65 74  * ok, we can det
17810 65 72 6d 69 6e 65 20 74 68 65 20 67 65 6f 6d 65  ermine the geome
17820 74 72 79 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20  try class */.   
17830 20 69 66 20 28 6e 5f 70 6f 69 6e 74 73 20 3d 3d   if (n_points ==
17840 20 31 20 26 26 20 6e 5f 6c 69 6e 65 73 74 72 69   1 && n_linestri
17850 6e 67 73 20 3d 3d 20 30 20 26 26 20 6e 5f 70 6f  ngs == 0 && n_po
17860 6c 79 67 6f 6e 73 20 3d 3d 20 30 29 0a 20 20 20  lygons == 0).   
17870 20 20 20 7b 0a 09 20 20 69 66 20 28 67 65 6f 6d     {..  if (geom
17880 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65 20 3d  ->DeclaredType =
17890 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e  = GAIA_MULTIPOIN
178a0 54 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28  T)..    {...if (
178b0 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d  geom->DimensionM
178c0 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f  odel == GAIA_XY_
178d0 5a 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20  Z)...    type = 
178e0 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a  GAIA_MULTIPOINTZ
178f0 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f  ;...else if (geo
17900 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
17910 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a  l == GAIA_XY_M).
17920 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49  ..    type = GAI
17930 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 4d 3b 0a 09  A_MULTIPOINTM;..
17940 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e  .else if (geom->
17950 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
17960 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09  = GAIA_XY_Z_M)..
17970 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41  .    type = GAIA
17980 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a 4d 3b 0a 09  _MULTIPOINTZM;..
17990 09 65 6c 73 65 0a 09 09 20 20 20 20 74 79 70 65  .else...    type
179a0 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49   = GAIA_MULTIPOI
179b0 4e 54 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c  NT;..    }..  el
179c0 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 65 63  se if (geom->Dec
179d0 6c 61 72 65 64 54 79 70 65 20 3d 3d 20 47 41 49  laredType == GAI
179e0 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
179f0 54 49 4f 4e 29 0a 09 20 20 20 20 7b 0a 09 09 69  TION)..    {...i
17a00 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69  f (geom->Dimensi
17a10 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
17a20 58 59 5f 5a 29 0a 09 09 20 20 20 20 74 79 70 65  XY_Z)...    type
17a30 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59   = GAIA_GEOMETRY
17a40 43 4f 4c 4c 45 43 54 49 4f 4e 5a 3b 0a 09 09 65  COLLECTIONZ;...e
17a50 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69  lse if (geom->Di
17a60 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
17a70 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20  GAIA_XY_M)...   
17a80 20 74 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f   type = GAIA_GEO
17a90 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 4d  METRYCOLLECTIONM
17aa0 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f  ;...else if (geo
17ab0 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
17ac0 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  l == GAIA_XY_Z_M
17ad0 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47  )...    type = G
17ae0 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
17af0 45 43 54 49 4f 4e 5a 4d 3b 0a 09 09 65 6c 73 65  ECTIONZM;...else
17b00 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41  ...    type = GA
17b10 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45  IA_GEOMETRYCOLLE
17b20 43 54 49 4f 4e 3b 0a 09 20 20 20 20 7d 0a 09 20  CTION;..    }.. 
17b30 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 69   else..    {...i
17b40 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69  f (geom->Dimensi
17b50 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
17b60 58 59 5f 5a 29 0a 09 09 20 20 20 20 74 79 70 65  XY_Z)...    type
17b70 20 3d 20 47 41 49 41 5f 50 4f 49 4e 54 5a 3b 0a   = GAIA_POINTZ;.
17b80 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d  ..else if (geom-
17b90 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
17ba0 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09  == GAIA_XY_M)...
17bb0 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f      type = GAIA_
17bc0 50 4f 49 4e 54 4d 3b 0a 09 09 65 6c 73 65 20 69  POINTM;...else i
17bd0 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69  f (geom->Dimensi
17be0 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
17bf0 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20 20 74 79  XY_Z_M)...    ty
17c00 70 65 20 3d 20 47 41 49 41 5f 50 4f 49 4e 54 5a  pe = GAIA_POINTZ
17c10 4d 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20  M;...else...    
17c20 74 79 70 65 20 3d 20 47 41 49 41 5f 50 4f 49 4e  type = GAIA_POIN
17c30 54 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20  T;..    }.      
17c40 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 6e  }.    else if (n
17c50 5f 70 6f 69 6e 74 73 20 3e 20 31 20 26 26 20 6e  _points > 1 && n
17c60 5f 6c 69 6e 65 73 74 72 69 6e 67 73 20 3d 3d 20  _linestrings == 
17c70 30 20 26 26 20 6e 5f 70 6f 6c 79 67 6f 6e 73 20  0 && n_polygons 
17c80 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20  == 0).      {.. 
17c90 20 69 66 20 28 67 65 6f 6d 2d 3e 44 65 63 6c 61   if (geom->Decla
17ca0 72 65 64 54 79 70 65 20 3d 3d 20 47 41 49 41 5f  redType == GAIA_
17cb0 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49  GEOMETRYCOLLECTI
17cc0 4f 4e 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20  ON)..    {...if 
17cd0 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
17ce0 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
17cf0 5f 5a 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d  _Z)...    type =
17d00 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f   GAIA_GEOMETRYCO
17d10 4c 4c 45 43 54 49 4f 4e 5a 3b 0a 09 09 65 6c 73  LLECTIONZ;...els
17d20 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  e if (geom->Dime
17d30 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
17d40 49 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20 74  IA_XY_M)...    t
17d50 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45  ype = GAIA_GEOME
17d60 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 4d 3b 0a  TRYCOLLECTIONM;.
17d70 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d  ..else if (geom-
17d80 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
17d90 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a  == GAIA_XY_Z_M).
17da0 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49  ..    type = GAI
17db0 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
17dc0 54 49 4f 4e 5a 4d 3b 0a 09 09 65 6c 73 65 0a 09  TIONZM;...else..
17dd0 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41  .    type = GAIA
17de0 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
17df0 49 4f 4e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  ION;..    }..  e
17e00 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 69 66 20  lse..    {...if 
17e10 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
17e20 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
17e30 5f 5a 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d  _Z)...    type =
17e40 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54   GAIA_MULTIPOINT
17e50 5a 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65  Z;...else if (ge
17e60 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  om->DimensionMod
17e70 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29  el == GAIA_XY_M)
17e80 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41  ...    type = GA
17e90 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 4d 3b 0a  IA_MULTIPOINTM;.
17ea0 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d  ..else if (geom-
17eb0 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
17ec0 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a  == GAIA_XY_Z_M).
17ed0 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49  ..    type = GAI
17ee0 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a 4d 3b 0a  A_MULTIPOINTZM;.
17ef0 09 09 65 6c 73 65 0a 09 09 20 20 20 20 74 79 70  ..else...    typ
17f00 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  e = GAIA_MULTIPO
17f10 49 4e 54 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20  INT;..    }.    
17f20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20    }.    else if 
17f30 28 6e 5f 70 6f 69 6e 74 73 20 3d 3d 20 30 20 26  (n_points == 0 &
17f40 26 20 6e 5f 6c 69 6e 65 73 74 72 69 6e 67 73 20  & n_linestrings 
17f50 3d 3d 20 31 20 26 26 20 6e 5f 70 6f 6c 79 67 6f  == 1 && n_polygo
17f60 6e 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b  ns == 0).      {
17f70 0a 09 20 20 69 66 20 28 67 65 6f 6d 2d 3e 44 65  ..  if (geom->De
17f80 63 6c 61 72 65 64 54 79 70 65 20 3d 3d 20 47 41  claredType == GA
17f90 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49  IA_MULTILINESTRI
17fa0 4e 47 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20  NG)..    {...if 
17fb0 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
17fc0 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
17fd0 5f 5a 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d  _Z)...    type =
17fe0 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53   GAIA_MULTILINES
17ff0 54 52 49 4e 47 5a 3b 0a 09 09 65 6c 73 65 20 69  TRINGZ;...else i
18000 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69  f (geom->Dimensi
18010 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
18020 58 59 5f 4d 29 0a 09 09 20 20 20 20 74 79 70 65  XY_M)...    type
18030 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e   = GAIA_MULTILIN
18040 45 53 54 52 49 4e 47 4d 3b 0a 09 09 65 6c 73 65  ESTRINGM;...else
18050 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e   if (geom->Dimen
18060 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
18070 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20 20  A_XY_Z_M)...    
18080 74 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54  type = GAIA_MULT
18090 49 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 3b 0a 09  ILINESTRINGZM;..
180a0 09 65 6c 73 65 0a 09 09 20 20 20 20 74 79 70 65  .else...    type
180b0 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e   = GAIA_MULTILIN
180c0 45 53 54 52 49 4e 47 3b 0a 09 20 20 20 20 7d 0a  ESTRING;..    }.
180d0 09 20 20 65 6c 73 65 20 69 66 20 28 67 65 6f 6d  .  else if (geom
180e0 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65 20 3d  ->DeclaredType =
180f0 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43  = GAIA_GEOMETRYC
18100 4f 4c 4c 45 43 54 49 4f 4e 29 0a 09 20 20 20 20  OLLECTION)..    
18110 7b 0a 09 09 69 66 20 28 67 65 6f 6d 2d 3e 44 69  {...if (geom->Di
18120 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
18130 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09 20 20 20  GAIA_XY_Z)...   
18140 20 74 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f   type = GAIA_GEO
18150 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a  METRYCOLLECTIONZ
18160 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f  ;...else if (geo
18170 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
18180 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a  l == GAIA_XY_M).
18190 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49  ..    type = GAI
181a0 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
181b0 54 49 4f 4e 4d 3b 0a 09 09 65 6c 73 65 20 69 66  TIONM;...else if
181c0 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f   (geom->Dimensio
181d0 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
181e0 59 5f 5a 5f 4d 29 0a 09 09 20 20 20 20 74 79 70  Y_Z_M)...    typ
181f0 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52  e = GAIA_GEOMETR
18200 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 4d 3b 0a 09  YCOLLECTIONZM;..
18210 09 65 6c 73 65 0a 09 09 20 20 20 20 74 79 70 65  .else...    type
18220 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59   = GAIA_GEOMETRY
18230 43 4f 4c 4c 45 43 54 49 4f 4e 3b 0a 09 20 20 20  COLLECTION;..   
18240 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20   }..  else..    
18250 7b 0a 09 09 69 66 20 28 67 65 6f 6d 2d 3e 44 69  {...if (geom->Di
18260 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
18270 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09 20 20 20  GAIA_XY_Z)...   
18280 20 74 79 70 65 20 3d 20 47 41 49 41 5f 4c 49 4e   type = GAIA_LIN
18290 45 53 54 52 49 4e 47 5a 3b 0a 09 09 65 6c 73 65  ESTRINGZ;...else
182a0 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e   if (geom->Dimen
182b0 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
182c0 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20 74 79  A_XY_M)...    ty
182d0 70 65 20 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54  pe = GAIA_LINEST
182e0 52 49 4e 47 4d 3b 0a 09 09 65 6c 73 65 20 69 66  RINGM;...else if
182f0 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f   (geom->Dimensio
18300 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
18310 59 5f 5a 5f 4d 29 0a 09 09 20 20 20 20 74 79 70  Y_Z_M)...    typ
18320 65 20 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54 52  e = GAIA_LINESTR
18330 49 4e 47 5a 4d 3b 0a 09 09 65 6c 73 65 0a 09 09  INGZM;...else...
18340 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f      type = GAIA_
18350 4c 49 4e 45 53 54 52 49 4e 47 3b 0a 09 20 20 20  LINESTRING;..   
18360 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65   }.      }.    e
18370 6c 73 65 20 69 66 20 28 6e 5f 70 6f 69 6e 74 73  lse if (n_points
18380 20 3d 3d 20 30 20 26 26 20 6e 5f 6c 69 6e 65 73   == 0 && n_lines
18390 74 72 69 6e 67 73 20 3e 20 31 20 26 26 20 6e 5f  trings > 1 && n_
183a0 70 6f 6c 79 67 6f 6e 73 20 3d 3d 20 30 29 0a 20  polygons == 0). 
183b0 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 67 65       {..  if (ge
183c0 6f 6d 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65  om->DeclaredType
183d0 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52   == GAIA_GEOMETR
183e0 59 43 4f 4c 4c 45 43 54 49 4f 4e 29 0a 09 20 20  YCOLLECTION)..  
183f0 20 20 7b 0a 09 09 69 66 20 28 67 65 6f 6d 2d 3e    {...if (geom->
18400 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
18410 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09 20  = GAIA_XY_Z)... 
18420 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f 47     type = GAIA_G
18430 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f  EOMETRYCOLLECTIO
18440 4e 5a 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 67  NZ;...else if (g
18450 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  eom->DimensionMo
18460 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d  del == GAIA_XY_M
18470 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47  )...    type = G
18480 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
18490 45 43 54 49 4f 4e 4d 3b 0a 09 09 65 6c 73 65 20  ECTIONM;...else 
184a0 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
184b0 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
184c0 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20 20 74  _XY_Z_M)...    t
184d0 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45  ype = GAIA_GEOME
184e0 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 4d 3b  TRYCOLLECTIONZM;
184f0 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 74 79  ...else...    ty
18500 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54  pe = GAIA_GEOMET
18510 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 3b 0a 09 20  RYCOLLECTION;.. 
18520 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20     }..  else..  
18530 20 20 7b 0a 09 09 69 66 20 28 67 65 6f 6d 2d 3e    {...if (geom->
18540 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
18550 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09 20  = GAIA_XY_Z)... 
18560 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f 4d     type = GAIA_M
18570 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 5a 3b  ULTILINESTRINGZ;
18580 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d  ...else if (geom
18590 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
185a0 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09   == GAIA_XY_M)..
185b0 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41  .    type = GAIA
185c0 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47  _MULTILINESTRING
185d0 4d 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65  M;...else if (ge
185e0 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  om->DimensionMod
185f0 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f  el == GAIA_XY_Z_
18600 4d 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20  M)...    type = 
18610 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54  GAIA_MULTILINEST
18620 52 49 4e 47 5a 4d 3b 0a 09 09 65 6c 73 65 0a 09  RINGZM;...else..
18630 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41  .    type = GAIA
18640 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47  _MULTILINESTRING
18650 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d  ;..    }.      }
18660 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 6e 5f  .    else if (n_
18670 70 6f 69 6e 74 73 20 3d 3d 20 30 20 26 26 20 6e  points == 0 && n
18680 5f 6c 69 6e 65 73 74 72 69 6e 67 73 20 3d 3d 20  _linestrings == 
18690 30 20 26 26 20 6e 5f 70 6f 6c 79 67 6f 6e 73 20  0 && n_polygons 
186a0 3d 3d 20 31 29 0a 20 20 20 20 20 20 7b 0a 09 20  == 1).      {.. 
186b0 20 69 66 20 28 67 65 6f 6d 2d 3e 44 65 63 6c 61   if (geom->Decla
186c0 72 65 64 54 79 70 65 20 3d 3d 20 47 41 49 41 5f  redType == GAIA_
186d0 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 29 0a 09 20  MULTIPOLYGON).. 
186e0 20 20 20 7b 0a 09 09 69 66 20 28 67 65 6f 6d 2d     {...if (geom-
186f0 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
18700 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09  == GAIA_XY_Z)...
18710 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f      type = GAIA_
18720 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a 3b 0a 09  MULTIPOLYGONZ;..
18730 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e  .else if (geom->
18740 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
18750 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09 20  = GAIA_XY_M)... 
18760 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f 4d     type = GAIA_M
18770 55 4c 54 49 50 4f 4c 59 47 4f 4e 4d 3b 0a 09 09  ULTIPOLYGONM;...
18780 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44  else if (geom->D
18790 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d  imensionModel ==
187a0 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09   GAIA_XY_Z_M)...
187b0 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f      type = GAIA_
187c0 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a 4d 3b 0a  MULTIPOLYGONZM;.
187d0 09 09 65 6c 73 65 0a 09 09 20 20 20 20 74 79 70  ..else...    typ
187e0 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  e = GAIA_MULTIPO
187f0 4c 59 47 4f 4e 3b 0a 09 20 20 20 20 7d 0a 09 20  LYGON;..    }.. 
18800 20 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e   else if (geom->
18810 44 65 63 6c 61 72 65 64 54 79 70 65 20 3d 3d 20  DeclaredType == 
18820 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
18830 4c 45 43 54 49 4f 4e 29 0a 09 20 20 20 20 7b 0a  LECTION)..    {.
18840 09 09 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  ..if (geom->Dime
18850 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
18860 49 41 5f 58 59 5f 5a 29 0a 09 09 20 20 20 20 74  IA_XY_Z)...    t
18870 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45  ype = GAIA_GEOME
18880 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 3b 0a  TRYCOLLECTIONZ;.
18890 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d  ..else if (geom-
188a0 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
188b0 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09  == GAIA_XY_M)...
188c0 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f      type = GAIA_
188d0 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49  GEOMETRYCOLLECTI
188e0 4f 4e 4d 3b 0a 09 09 65 6c 73 65 20 69 66 20 28  ONM;...else if (
188f0 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d  geom->DimensionM
18900 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f  odel == GAIA_XY_
18910 5a 5f 4d 29 0a 09 09 20 20 20 20 74 79 70 65 20  Z_M)...    type 
18920 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43  = GAIA_GEOMETRYC
18930 4f 4c 4c 45 43 54 49 4f 4e 5a 4d 3b 0a 09 09 65  OLLECTIONZM;...e
18940 6c 73 65 0a 09 09 20 20 20 20 74 79 70 65 20 3d  lse...    type =
18950 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f   GAIA_GEOMETRYCO
18960 4c 4c 45 43 54 49 4f 4e 3b 0a 09 20 20 20 20 7d  LLECTION;..    }
18970 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a  ..  else..    {.
18980 09 09 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  ..if (geom->Dime
18990 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
189a0 49 41 5f 58 59 5f 5a 29 0a 09 09 20 20 20 20 74  IA_XY_Z)...    t
189b0 79 70 65 20 3d 20 47 41 49 41 5f 50 4f 4c 59 47  ype = GAIA_POLYG
189c0 4f 4e 5a 3b 0a 09 09 65 6c 73 65 20 69 66 20 28  ONZ;...else if (
189d0 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d  geom->DimensionM
189e0 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f  odel == GAIA_XY_
189f0 4d 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20  M)...    type = 
18a00 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 4d 3b 0a 09  GAIA_POLYGONM;..
18a10 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e  .else if (geom->
18a20 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
18a30 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09  = GAIA_XY_Z_M)..
18a40 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41  .    type = GAIA
18a50 5f 50 4f 4c 59 47 4f 4e 5a 4d 3b 0a 09 09 65 6c  _POLYGONZM;...el
18a60 73 65 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20  se...    type = 
18a70 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 3b 0a 09 20  GAIA_POLYGON;.. 
18a80 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18a90 20 65 6c 73 65 20 69 66 20 28 6e 5f 70 6f 69 6e   else if (n_poin
18aa0 74 73 20 3d 3d 20 30 20 26 26 20 6e 5f 6c 69 6e  ts == 0 && n_lin
18ab0 65 73 74 72 69 6e 67 73 20 3d 3d 20 30 20 26 26  estrings == 0 &&
18ac0 20 6e 5f 70 6f 6c 79 67 6f 6e 73 20 3e 20 31 29   n_polygons > 1)
18ad0 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
18ae0 67 65 6f 6d 2d 3e 44 65 63 6c 61 72 65 64 54 79  geom->DeclaredTy
18af0 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45  pe == GAIA_GEOME
18b00 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 29 0a 09  TRYCOLLECTION)..
18b10 20 20 20 20 7b 0a 09 09 69 66 20 28 67 65 6f 6d      {...if (geom
18b20 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
18b30 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09   == GAIA_XY_Z)..
18b40 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41  .    type = GAIA
18b50 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
18b60 49 4f 4e 5a 3b 0a 09 09 65 6c 73 65 20 69 66 20  IONZ;...else if 
18b70 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
18b80 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
18b90 5f 4d 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d  _M)...    type =
18ba0 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f   GAIA_GEOMETRYCO
18bb0 4c 4c 45 43 54 49 4f 4e 4d 3b 0a 09 09 65 6c 73  LLECTIONM;...els
18bc0 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  e if (geom->Dime
18bd0 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
18be0 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20  IA_XY_Z_M)...   
18bf0 20 74 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f   type = GAIA_GEO
18c00 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a  METRYCOLLECTIONZ
18c10 4d 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20  M;...else...    
18c20 74 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d  type = GAIA_GEOM
18c30 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 3b 0a  ETRYCOLLECTION;.
18c40 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09  .    }..  else..
18c50 20 20 20 20 7b 0a 09 09 69 66 20 28 67 65 6f 6d      {...if (geom
18c60 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
18c70 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09   == GAIA_XY_Z)..
18c80 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41  .    type = GAIA
18c90 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a 3b 0a  _MULTIPOLYGONZ;.
18ca0 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d  ..else if (geom-
18cb0 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
18cc0 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09  == GAIA_XY_M)...
18cd0 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f      type = GAIA_
18ce0 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 4d 3b 0a 09  MULTIPOLYGONM;..
18cf0 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e  .else if (geom->
18d00 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
18d10 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09  = GAIA_XY_Z_M)..
18d20 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41  .    type = GAIA
18d30 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a 4d 3b  _MULTIPOLYGONZM;
18d40 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 74 79  ...else...    ty
18d50 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50  pe = GAIA_MULTIP
18d60 4f 4c 59 47 4f 4e 3b 0a 09 20 20 20 20 7d 0a 20  OLYGON;..    }. 
18d70 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a       }.    else.
18d80 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 67        {..  if (g
18d90 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  eom->DimensionMo
18da0 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a  del == GAIA_XY_Z
18db0 29 0a 09 20 20 20 20 20 20 74 79 70 65 20 3d 20  )..      type = 
18dc0 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
18dd0 4c 45 43 54 49 4f 4e 5a 3b 0a 09 20 20 65 6c 73  LECTIONZ;..  els
18de0 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  e if (geom->Dime
18df0 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
18e00 49 41 5f 58 59 5f 4d 29 0a 09 20 20 20 20 20 20  IA_XY_M)..      
18e10 74 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d  type = GAIA_GEOM
18e20 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 4d 3b  ETRYCOLLECTIONM;
18e30 0a 09 20 20 65 6c 73 65 20 69 66 20 28 67 65 6f  ..  else if (geo
18e40 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
18e50 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  l == GAIA_XY_Z_M
18e60 29 0a 09 20 20 20 20 20 20 74 79 70 65 20 3d 20  )..      type = 
18e70 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
18e80 4c 45 43 54 49 4f 4e 5a 4d 3b 0a 09 20 20 65 6c  LECTIONZM;..  el
18e90 73 65 0a 09 20 20 20 20 20 20 74 79 70 65 20 3d  se..      type =
18ea0 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f   GAIA_GEOMETRYCO
18eb0 4c 4c 45 43 54 49 4f 4e 3b 0a 20 20 20 20 20 20  LLECTION;.      
18ec0 7d 0a 2f 2a 20 61 6e 64 20 6e 6f 77 20 77 65 20  }./* and now we 
18ed0 63 6f 6d 70 75 74 65 20 74 68 65 20 73 69 7a 65  compute the size
18ee0 20 6f 66 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20   of BLOB */.    
18ef0 2a 73 69 7a 65 20 3d 20 34 34 3b 09 09 09 2f 2a  *size = 44;.../*
18f00 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a   header size */.
18f10 20 20 20 20 73 77 69 74 63 68 20 28 74 79 70 65      switch (type
18f20 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  ).      {.      
18f30 63 61 73 65 20 47 41 49 41 5f 50 4f 49 4e 54 3a  case GAIA_POINT:
18f40 0a 09 20 20 2a 73 69 7a 65 20 2b 3d 20 28 73 69  ..  *size += (si
18f50 7a 65 6f 66 20 28 64 6f 75 62 6c 65 29 20 2a 20  zeof (double) * 
18f60 32 29 3b 09 2f 2a 20 5b 78 2c 79 5d 20 63 6f 6f  2);./* [x,y] coo
18f70 72 64 73 20 2a 2f 0a 09 20 20 62 72 65 61 6b 3b  rds */..  break;
18f80 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41  .      case GAIA
18f90 5f 50 4f 49 4e 54 5a 3a 0a 09 20 20 2a 73 69 7a  _POINTZ:..  *siz
18fa0 65 20 2b 3d 20 28 73 69 7a 65 6f 66 20 28 64 6f  e += (sizeof (do
18fb0 75 62 6c 65 29 20 2a 20 33 29 3b 09 2f 2a 20 5b  uble) * 3);./* [
18fc0 78 2c 79 2c 7a 5d 20 63 6f 6f 72 64 73 20 2a 2f  x,y,z] coords */
18fd0 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
18fe0 20 63 61 73 65 20 47 41 49 41 5f 50 4f 49 4e 54   case GAIA_POINT
18ff0 4d 3a 0a 09 20 20 2a 73 69 7a 65 20 2b 3d 20 28  M:..  *size += (
19000 73 69 7a 65 6f 66 20 28 64 6f 75 62 6c 65 29 20  sizeof (double) 
19010 2a 20 33 29 3b 09 2f 2a 20 5b 78 2c 79 2c 6d 5d  * 3);./* [x,y,m]
19020 20 63 6f 6f 72 64 73 20 2a 2f 0a 09 20 20 62 72   coords */..  br
19030 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
19040 47 41 49 41 5f 50 4f 49 4e 54 5a 4d 3a 0a 09 20  GAIA_POINTZM:.. 
19050 20 2a 73 69 7a 65 20 2b 3d 20 28 73 69 7a 65 6f   *size += (sizeo
19060 66 20 28 64 6f 75 62 6c 65 29 20 2a 20 34 29 3b  f (double) * 4);
19070 09 2f 2a 20 5b 78 2c 79 2c 7a 2c 6d 5d 20 63 6f  ./* [x,y,z,m] co
19080 6f 72 64 73 20 2a 2f 0a 09 20 20 62 72 65 61 6b  ords */..  break
19090 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  ;.      case GAI
190a0 41 5f 4c 49 4e 45 53 54 52 49 4e 47 3a 0a 09 20  A_LINESTRING:.. 
190b0 20 2a 73 69 7a 65 20 2b 3d 20 28 34 20 2b 20 28   *size += (4 + (
190c0 38 20 2a 20 6c 69 6e 65 2d 3e 50 6f 69 6e 74 73  8 * line->Points
190d0 29 20 2b 20 31 36 29 3b 09 2f 2a 20 23 20 70 6f  ) + 16);./* # po
190e0 69 6e 74 73 20 2b 20 5b 78 2c 79 5d 20 66 6f 72  ints + [x,y] for
190f0 20 65 61 63 68 20 76 65 72 74 65 78 20 2a 2f 0a   each vertex */.
19100 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
19110 63 61 73 65 20 47 41 49 41 5f 4c 49 4e 45 53 54  case GAIA_LINEST
19120 52 49 4e 47 5a 3a 0a 09 20 20 2a 73 69 7a 65 20  RINGZ:..  *size 
19130 2b 3d 20 28 34 20 2b 20 28 31 32 20 2a 20 6c 69  += (4 + (12 * li
19140 6e 65 2d 3e 50 6f 69 6e 74 73 29 20 2b 20 32 34  ne->Points) + 24
19150 29 3b 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20 2b  );./* # points +
19160 20 5b 78 2c 79 2c 7a 5d 20 66 6f 72 20 65 61 63   [x,y,z] for eac
19170 68 20 76 65 72 74 65 78 20 2a 2f 0a 09 20 20 62  h vertex */..  b
19180 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
19190 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47   GAIA_LINESTRING
191a0 4d 3a 0a 09 20 20 2a 73 69 7a 65 20 2b 3d 20 28  M:..  *size += (
191b0 34 20 2b 20 28 31 36 20 2a 20 6c 69 6e 65 2d 3e  4 + (16 * line->
191c0 50 6f 69 6e 74 73 29 20 2b 20 31 36 29 3b 09 2f  Points) + 16);./
191d0 2a 20 23 20 70 6f 69 6e 74 73 20 2b 20 5b 78 2c  * # points + [x,
191e0 79 2c 6d 5d 20 66 6f 72 20 65 61 63 68 20 76 65  y,m] for each ve
191f0 72 74 65 78 20 2a 2f 0a 09 20 20 62 72 65 61 6b  rtex */..  break
19200 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  ;.      case GAI
19210 41 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 3a 0a  A_LINESTRINGZM:.
19220 09 20 20 2a 73 69 7a 65 20 2b 3d 20 28 34 20 2b  .  *size += (4 +
19230 20 28 32 30 20 2a 20 6c 69 6e 65 2d 3e 50 6f 69   (20 * line->Poi
19240 6e 74 73 29 20 2b 20 32 34 29 3b 09 2f 2a 20 23  nts) + 24);./* #
19250 20 70 6f 69 6e 74 73 20 2b 20 5b 78 2c 79 2c 7a   points + [x,y,z
19260 2c 6d 5d 20 66 6f 72 20 65 61 63 68 20 76 65 72  ,m] for each ver
19270 74 65 78 20 2a 2f 0a 09 20 20 62 72 65 61 6b 3b  tex */..  break;
19280 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41  .      case GAIA
19290 5f 50 4f 4c 59 47 4f 4e 3a 0a 09 20 20 72 6e 67  _POLYGON:..  rng
192a0 20 3d 20 70 6f 6c 79 67 2d 3e 45 78 74 65 72 69   = polyg->Exteri
192b0 6f 72 3b 0a 09 20 20 2a 73 69 7a 65 20 2b 3d 20  or;..  *size += 
192c0 28 38 20 2b 20 28 38 20 2a 20 72 6e 67 2d 3e 50  (8 + (8 * rng->P
192d0 6f 69 6e 74 73 29 20 2b 20 31 36 29 3b 09 2f 2a  oints) + 16);./*
192e0 20 23 20 72 69 6e 67 73 20 2b 20 23 20 70 6f 69   # rings + # poi
192f0 6e 74 73 20 2b 20 5b 78 2e 79 5d 20 61 72 72 61  nts + [x.y] arra
19300 79 20 2d 20 65 78 74 65 72 69 6f 72 20 72 69 6e  y - exterior rin
19310 67 20 2a 2f 0a 09 20 20 66 6f 72 20 28 69 62 20  g */..  for (ib 
19320 3d 20 30 3b 20 69 62 20 3c 20 70 6f 6c 79 67 2d  = 0; ib < polyg-
19330 3e 4e 75 6d 49 6e 74 65 72 69 6f 72 73 3b 20 69  >NumInteriors; i
19340 62 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09 72 6e  b++)..    {...rn
19350 67 20 3d 20 70 6f 6c 79 67 2d 3e 49 6e 74 65 72  g = polyg->Inter
19360 69 6f 72 73 20 2b 20 69 62 3b 0a 09 09 2a 73 69  iors + ib;...*si
19370 7a 65 20 2b 3d 20 28 34 20 2b 20 28 38 20 2a 20  ze += (4 + (8 * 
19380 72 6e 67 2d 3e 50 6f 69 6e 74 73 29 20 2b 20 31  rng->Points) + 1
19390 36 29 3b 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20  6);./* # points 
193a0 2b 20 5b 78 2c 79 5d 20 61 72 72 61 79 20 2d 20  + [x,y] array - 
193b0 69 6e 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f  interior ring */
193c0 0a 09 20 20 20 20 7d 0a 09 20 20 62 72 65 61 6b  ..    }..  break
193d0 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  ;.      case GAI
193e0 41 5f 50 4f 4c 59 47 4f 4e 5a 3a 0a 09 20 20 72  A_POLYGONZ:..  r
193f0 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e 45 78 74 65  ng = polyg->Exte
19400 72 69 6f 72 3b 0a 09 20 20 2a 73 69 7a 65 20 2b  rior;..  *size +
19410 3d 20 28 38 20 2b 20 28 31 32 20 2a 20 72 6e 67  = (8 + (12 * rng
19420 2d 3e 50 6f 69 6e 74 73 29 20 2b 20 32 34 29 3b  ->Points) + 24);
19430 09 2f 2a 20 23 20 72 69 6e 67 73 20 2b 20 23 20  ./* # rings + # 
19440 70 6f 69 6e 74 73 20 2b 20 5b 78 2c 79 2c 7a 5d  points + [x,y,z]
19450 20 61 72 72 61 79 20 2d 20 65 78 74 65 72 69 6f   array - exterio
19460 72 20 72 69 6e 67 20 2a 2f 0a 09 20 20 66 6f 72  r ring */..  for
19470 20 28 69 62 20 3d 20 30 3b 20 69 62 20 3c 20 70   (ib = 0; ib < p
19480 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74 65 72 69 6f  olyg->NumInterio
19490 72 73 3b 20 69 62 2b 2b 29 0a 09 20 20 20 20 7b  rs; ib++)..    {
194a0 0a 09 09 72 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e  ...rng = polyg->
194b0 49 6e 74 65 72 69 6f 72 73 20 2b 20 69 62 3b 0a  Interiors + ib;.
194c0 09 09 2a 73 69 7a 65 20 2b 3d 20 28 34 20 2b 20  ..*size += (4 + 
194d0 28 31 32 20 2a 20 72 6e 67 2d 3e 50 6f 69 6e 74  (12 * rng->Point
194e0 73 29 20 2b 20 32 34 29 3b 09 2f 2a 20 23 20 70  s) + 24);./* # p
194f0 6f 69 6e 74 73 20 2b 20 5b 78 2c 79 2c 7a 5d 20  oints + [x,y,z] 
19500 61 72 72 61 79 20 2d 20 69 6e 74 65 72 69 6f 72  array - interior
19510 20 72 69 6e 67 20 2a 2f 0a 09 20 20 20 20 7d 0a   ring */..    }.
19520 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
19530 63 61 73 65 20 47 41 49 41 5f 50 4f 4c 59 47 4f  case GAIA_POLYGO
19540 4e 4d 3a 0a 09 20 20 72 6e 67 20 3d 20 70 6f 6c  NM:..  rng = pol
19550 79 67 2d 3e 45 78 74 65 72 69 6f 72 3b 0a 09 20  yg->Exterior;.. 
19560 20 2a 73 69 7a 65 20 2b 3d 20 28 38 20 2b 20 28   *size += (8 + (
19570 31 36 20 2a 20 72 6e 67 2d 3e 50 6f 69 6e 74 73  16 * rng->Points
19580 29 20 2b 20 31 36 29 3b 09 2f 2a 20 23 20 72 69  ) + 16);./* # ri
19590 6e 67 73 20 2b 20 23 20 70 6f 69 6e 74 73 20 2b  ngs + # points +
195a0 20 5b 78 2c 79 2c 6d 5d 20 61 72 72 61 79 20 2d   [x,y,m] array -
195b0 20 65 78 74 65 72 69 6f 72 20 72 69 6e 67 20 2a   exterior ring *
195c0 2f 0a 09 20 20 66 6f 72 20 28 69 62 20 3d 20 30  /..  for (ib = 0
195d0 3b 20 69 62 20 3c 20 70 6f 6c 79 67 2d 3e 4e 75  ; ib < polyg->Nu
195e0 6d 49 6e 74 65 72 69 6f 72 73 3b 20 69 62 2b 2b  mInteriors; ib++
195f0 29 0a 09 20 20 20 20 7b 0a 09 09 72 6e 67 20 3d  )..    {...rng =
19600 20 70 6f 6c 79 67 2d 3e 49 6e 74 65 72 69 6f 72   polyg->Interior
19610 73 20 2b 20 69 62 3b 0a 09 09 2a 73 69 7a 65 20  s + ib;...*size 
19620 2b 3d 20 28 34 20 2b 20 28 31 36 20 2a 20 72 6e  += (4 + (16 * rn
19630 67 2d 3e 50 6f 69 6e 74 73 29 20 2b 20 31 36 29  g->Points) + 16)
19640 3b 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20 2b 20  ;./* # points + 
19650 5b 78 2c 79 2c 6d 5d 20 61 72 72 61 79 20 2d 20  [x,y,m] array - 
19660 69 6e 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f  interior ring */
19670 0a 09 20 20 20 20 7d 0a 09 20 20 62 72 65 61 6b  ..    }..  break
19680 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  ;.      case GAI
19690 41 5f 50 4f 4c 59 47 4f 4e 5a 4d 3a 0a 09 20 20  A_POLYGONZM:..  
196a0 72 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e 45 78 74  rng = polyg->Ext
196b0 65 72 69 6f 72 3b 0a 09 20 20 2a 73 69 7a 65 20  erior;..  *size 
196c0 2b 3d 20 28 38 20 2b 20 28 32 30 20 2a 20 72 6e  += (8 + (20 * rn
196d0 67 2d 3e 50 6f 69 6e 74 73 29 20 2b 20 32 34 29  g->Points) + 24)
196e0 3b 09 2f 2a 20 23 20 72 69 6e 67 73 20 2b 20 23  ;./* # rings + #
196f0 20 70 6f 69 6e 74 73 20 2b 20 5b 78 2c 79 2c 7a   points + [x,y,z
19700 2c 6d 5d 20 61 72 72 61 79 20 2d 20 65 78 74 65  ,m] array - exte
19710 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 20 20  rior ring */..  
19720 66 6f 72 20 28 69 62 20 3d 20 30 3b 20 69 62 20  for (ib = 0; ib 
19730 3c 20 70 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74 65  < polyg->NumInte
19740 72 69 6f 72 73 3b 20 69 62 2b 2b 29 0a 09 20 20  riors; ib++)..  
19750 20 20 7b 0a 09 09 72 6e 67 20 3d 20 70 6f 6c 79    {...rng = poly
19760 67 2d 3e 49 6e 74 65 72 69 6f 72 73 20 2b 20 69  g->Interiors + i
19770 62 3b 0a 09 09 2a 73 69 7a 65 20 2b 3d 20 28 34  b;...*size += (4
19780 20 2b 20 28 32 30 20 2a 20 72 6e 67 2d 3e 50 6f   + (20 * rng->Po
19790 69 6e 74 73 29 20 2b 20 32 34 29 3b 09 2f 2a 20  ints) + 24);./* 
197a0 23 20 70 6f 69 6e 74 73 20 2b 20 5b 78 2c 79 2c  # points + [x,y,
197b0 7a 2c 6d 5d 20 61 72 72 61 79 20 2d 20 69 6e 74  z,m] array - int
197c0 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 20  erior ring */.. 
197d0 20 20 20 7d 0a 09 20 20 62 72 65 61 6b 3b 0a 20     }..  break;. 
197e0 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 20       default:.. 
197f0 20 2f 2a 20 74 68 69 73 20 6f 6e 65 20 69 73 20   /* this one is 
19800 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 67 65 6f  not a simple geo
19810 6d 65 74 72 79 3b 20 73 68 6f 75 6c 64 20 62 65  metry; should be
19820 20 61 20 4d 55 4c 54 49 78 78 78 78 20 6f 72 20   a MULTIxxxx or 
19830 61 20 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  a GEOMETRYCOLLEC
19840 54 49 4f 4e 20 2a 2f 0a 09 20 20 2a 73 69 7a 65  TION */..  *size
19850 20 2b 3d 20 34 3b 09 09 2f 2a 20 23 20 65 6e 74   += 4;../* # ent
19860 69 74 69 65 73 20 2a 2f 0a 09 20 20 70 6f 69 6e  ities */..  poin
19870 74 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73 74 50  t = geom->FirstP
19880 6f 69 6e 74 3b 0a 09 20 20 77 68 69 6c 65 20 28  oint;..  while (
19890 70 6f 69 6e 74 29 0a 09 20 20 20 20 7b 0a 09 09  point)..    {...
198a0 2a 73 69 7a 65 20 2b 3d 20 35 3b 09 2f 2a 20 65  *size += 5;./* e
198b0 6e 74 69 74 79 20 68 65 61 64 65 72 20 2a 2f 0a  ntity header */.
198c0 09 09 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  ..if (geom->Dime
198d0 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
198e0 49 41 5f 58 59 5f 5a 0a 09 09 20 20 20 20 7c 7c  IA_XY_Z...    ||
198f0 20 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e   geom->Dimension
19900 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
19910 5f 4d 29 0a 09 09 20 20 20 20 2a 73 69 7a 65 20  _M)...    *size 
19920 2b 3d 20 28 73 69 7a 65 6f 66 20 28 64 6f 75 62  += (sizeof (doub
19930 6c 65 29 20 2a 20 33 29 3b 09 2f 2a 20 74 68 72  le) * 3);./* thr
19940 65 65 20 64 6f 75 62 6c 65 73 20 66 6f 72 20 65  ee doubles for e
19950 61 63 68 20 50 4f 49 4e 54 20 2a 2f 0a 09 09 65  ach POINT */...e
19960 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69  lse if (geom->Di
19970 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
19980 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20  GAIA_XY_Z_M)... 
19990 20 20 20 2a 73 69 7a 65 20 2b 3d 20 28 73 69 7a     *size += (siz
199a0 65 6f 66 20 28 64 6f 75 62 6c 65 29 20 2a 20 34  eof (double) * 4
199b0 29 3b 09 2f 2a 20 66 6f 75 72 20 64 6f 75 62 6c  );./* four doubl
199c0 65 73 20 66 6f 72 20 65 61 63 68 20 50 4f 49 4e  es for each POIN
199d0 54 20 2a 2f 0a 09 09 65 6c 73 65 0a 09 09 20 20  T */...else...  
199e0 20 20 2a 73 69 7a 65 20 2b 3d 20 28 73 69 7a 65    *size += (size
199f0 6f 66 20 28 64 6f 75 62 6c 65 29 20 2a 20 32 29  of (double) * 2)
19a00 3b 09 2f 2a 20 74 77 6f 20 64 6f 75 62 6c 65 73  ;./* two doubles
19a10 20 66 6f 72 20 65 61 63 68 20 50 4f 49 4e 54 20   for each POINT 
19a20 2a 2f 0a 09 09 70 6f 69 6e 74 20 3d 20 70 6f 69  */...point = poi
19a30 6e 74 2d 3e 4e 65 78 74 3b 0a 09 20 20 20 20 7d  nt->Next;..    }
19a40 0a 09 20 20 6c 69 6e 65 20 3d 20 67 65 6f 6d 2d  ..  line = geom-
19a50 3e 46 69 72 73 74 4c 69 6e 65 73 74 72 69 6e 67  >FirstLinestring
19a60 3b 0a 09 20 20 77 68 69 6c 65 20 28 6c 69 6e 65  ;..  while (line
19a70 29 0a 09 20 20 20 20 7b 0a 09 09 2a 73 69 7a 65  )..    {...*size
19a80 20 2b 3d 20 35 3b 09 2f 2a 20 65 6e 74 69 74 79   += 5;./* entity
19a90 20 68 65 61 64 65 72 20 2a 2f 0a 09 09 69 66 20   header */...if 
19aa0 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
19ab0 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
19ac0 5f 5a 29 0a 09 09 20 20 20 20 2a 73 69 7a 65 20  _Z)...    *size 
19ad0 2b 3d 20 28 34 20 2b 20 28 31 32 20 2a 20 6c 69  += (4 + (12 * li
19ae0 6e 65 2d 3e 50 6f 69 6e 74 73 29 20 2b 20 32 34  ne->Points) + 24
19af0 29 3b 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20 2b  );./* # points +
19b00 20 5b 78 2c 79 2c 7a 5d 20 66 6f 72 20 65 61 63   [x,y,z] for eac
19b10 68 20 76 65 72 74 65 78 20 2a 2f 0a 09 09 65 6c  h vertex */...el
19b20 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d  se if (geom->Dim
19b30 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
19b40 41 49 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20  AIA_XY_M)...    
19b50 2a 73 69 7a 65 20 2b 3d 20 28 34 20 2b 20 28 31  *size += (4 + (1
19b60 36 20 2a 20 6c 69 6e 65 2d 3e 50 6f 69 6e 74 73  6 * line->Points
19b70 29 20 2b 20 31 36 29 3b 09 2f 2a 20 23 20 70 6f  ) + 16);./* # po
19b80 69 6e 74 73 20 2b 20 5b 78 2c 79 2c 6d 5d 20 66  ints + [x,y,m] f
19b90 6f 72 20 65 61 63 68 20 76 65 72 74 65 78 20 2a  or each vertex *
19ba0 2f 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f  /...else if (geo
19bb0 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
19bc0 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  l == GAIA_XY_Z_M
19bd0 29 0a 09 09 20 20 20 20 2a 73 69 7a 65 20 2b 3d  )...    *size +=
19be0 20 28 34 20 2b 20 28 32 30 20 2a 20 6c 69 6e 65   (4 + (20 * line
19bf0 2d 3e 50 6f 69 6e 74 73 29 20 2b 20 32 34 29 3b  ->Points) + 24);
19c00 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20 2b 20 5b  ./* # points + [
19c10 78 2c 79 2c 7a 2c 6d 5d 20 66 6f 72 20 65 61 63  x,y,z,m] for eac
19c20 68 20 76 65 72 74 65 78 20 2a 2f 0a 09 09 65 6c  h vertex */...el
19c30 73 65 0a 09 09 20 20 20 20 2a 73 69 7a 65 20 2b  se...    *size +
19c40 3d 20 28 34 20 2b 20 28 38 20 2a 20 6c 69 6e 65  = (4 + (8 * line
19c50 2d 3e 50 6f 69 6e 74 73 29 20 2b 20 31 36 29 3b  ->Points) + 16);
19c60 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20 2b 20 5b  ./* # points + [
19c70 78 2c 79 5d 20 66 6f 72 20 65 61 63 68 20 76 65  x,y] for each ve
19c80 72 74 65 78 20 2a 2f 0a 09 09 6c 69 6e 65 20 3d  rtex */...line =
19c90 20 6c 69 6e 65 2d 3e 4e 65 78 74 3b 0a 09 20 20   line->Next;..  
19ca0 20 20 7d 0a 09 20 20 70 6f 6c 79 67 20 3d 20 67    }..  polyg = g
19cb0 65 6f 6d 2d 3e 46 69 72 73 74 50 6f 6c 79 67 6f  eom->FirstPolygo
19cc0 6e 3b 0a 09 20 20 77 68 69 6c 65 20 28 70 6f 6c  n;..  while (pol
19cd0 79 67 29 0a 09 20 20 20 20 7b 0a 09 09 2a 73 69  yg)..    {...*si
19ce0 7a 65 20 2b 3d 20 35 3b 09 2f 2a 20 65 6e 74 69  ze += 5;./* enti
19cf0 74 79 20 68 65 61 64 65 72 20 2a 2f 0a 09 09 72  ty header */...r
19d00 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e 45 78 74 65  ng = polyg->Exte
19d10 72 69 6f 72 3b 0a 09 09 69 66 20 28 67 65 6f 6d  rior;...if (geom
19d20 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
19d30 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09   == GAIA_XY_Z)..
19d40 09 20 20 20 20 2a 73 69 7a 65 20 2b 3d 20 28 38  .    *size += (8
19d50 20 2b 20 28 31 32 20 2a 20 72 6e 67 2d 3e 50 6f   + (12 * rng->Po
19d60 69 6e 74 73 29 20 2b 20 32 34 29 3b 09 2f 2a 20  ints) + 24);./* 
19d70 23 20 72 69 6e 67 73 20 2b 20 23 20 70 6f 69 6e  # rings + # poin
19d80 74 73 20 2b 20 5b 78 2c 79 2c 7a 5d 20 61 72 72  ts + [x,y,z] arr
19d90 61 79 20 2d 20 65 78 74 65 72 69 6f 72 20 72 69  ay - exterior ri
19da0 6e 67 20 2a 2f 0a 09 09 65 6c 73 65 20 69 66 20  ng */...else if 
19db0 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
19dc0 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
19dd0 5f 4d 29 0a 09 09 20 20 20 20 2a 73 69 7a 65 20  _M)...    *size 
19de0 2b 3d 20 28 38 20 2b 20 28 31 36 20 2a 20 72 6e  += (8 + (16 * rn
19df0 67 2d 3e 50 6f 69 6e 74 73 29 20 2b 20 31 36 29  g->Points) + 16)
19e00 3b 09 2f 2a 20 23 20 72 69 6e 67 73 20 2b 20 23  ;./* # rings + #
19e10 20 70 6f 69 6e 74 73 20 2b 20 5b 78 2c 79 2c 6d   points + [x,y,m
19e20 5d 20 61 72 72 61 79 20 2d 20 65 78 74 65 72 69  ] array - exteri
19e30 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 09 65 6c 73  or ring */...els
19e40 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  e if (geom->Dime
19e50 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
19e60 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20  IA_XY_Z_M)...   
19e70 20 2a 73 69 7a 65 20 2b 3d 20 28 38 20 2b 20 28   *size += (8 + (
19e80 32 30 20 2a 20 72 6e 67 2d 3e 50 6f 69 6e 74 73  20 * rng->Points
19e90 29 20 2b 20 32 34 29 3b 09 2f 2a 20 23 20 72 69  ) + 24);./* # ri
19ea0 6e 67 73 20 2b 20 23 20 70 6f 69 6e 74 73 20 2b  ngs + # points +
19eb0 20 5b 78 2c 79 2c 7a 2c 6d 5d 20 61 72 72 61 79   [x,y,z,m] array
19ec0 20 2d 20 65 78 74 65 72 69 6f 72 20 72 69 6e 67   - exterior ring
19ed0 20 2a 2f 0a 09 09 65 6c 73 65 0a 09 09 20 20 20   */...else...   
19ee0 20 2a 73 69 7a 65 20 2b 3d 20 28 38 20 2b 20 28   *size += (8 + (
19ef0 38 20 2a 20 72 6e 67 2d 3e 50 6f 69 6e 74 73 29  8 * rng->Points)
19f00 20 2b 20 31 36 29 3b 09 2f 2a 20 23 20 72 69 6e   + 16);./* # rin
19f10 67 73 20 2b 20 23 20 70 6f 69 6e 74 73 20 2b 20  gs + # points + 
19f20 5b 78 2c 79 5d 20 61 72 72 61 79 20 2d 20 65 78  [x,y] array - ex
19f30 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09  terior ring */..
19f40 09 66 6f 72 20 28 69 62 20 3d 20 30 3b 20 69 62  .for (ib = 0; ib
19f50 20 3c 20 70 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74   < polyg->NumInt
19f60 65 72 69 6f 72 73 3b 20 69 62 2b 2b 29 0a 09 09  eriors; ib++)...
19f70 20 20 7b 0a 09 09 20 20 20 20 20 20 72 6e 67 20    {...      rng 
19f80 3d 20 70 6f 6c 79 67 2d 3e 49 6e 74 65 72 69 6f  = polyg->Interio
19f90 72 73 20 2b 20 69 62 3b 0a 09 09 20 20 20 20 20  rs + ib;...     
19fa0 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e   if (geom->Dimen
19fb0 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
19fc0 41 5f 58 59 5f 5a 29 0a 09 09 09 20 20 2a 73 69  A_XY_Z)....  *si
19fd0 7a 65 20 2b 3d 20 28 34 20 2b 20 28 31 32 20 2a  ze += (4 + (12 *
19fe0 20 72 6e 67 2d 3e 50 6f 69 6e 74 73 29 20 2b 20   rng->Points) + 
19ff0 32 34 29 3b 09 2f 2a 20 23 20 70 6f 69 6e 74 73  24);./* # points
1a000 20 2b 20 5b 78 2c 79 2c 7a 5d 20 61 72 72 61 79   + [x,y,z] array
1a010 20 2d 20 69 6e 74 65 72 69 6f 72 20 72 69 6e 67   - interior ring
1a020 20 2a 2f 0a 09 09 20 20 20 20 20 20 65 6c 73 65   */...      else
1a030 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e   if (geom->Dimen
1a040 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
1a050 41 5f 58 59 5f 4d 29 0a 09 09 09 20 20 2a 73 69  A_XY_M)....  *si
1a060 7a 65 20 2b 3d 20 28 34 20 2b 20 28 31 36 20 2a  ze += (4 + (16 *
1a070 20 72 6e 67 2d 3e 50 6f 69 6e 74 73 29 20 2b 20   rng->Points) + 
1a080 31 36 29 3b 09 2f 2a 20 23 20 70 6f 69 6e 74 73  16);./* # points
1a090 20 2b 20 5b 78 2c 79 2c 6d 5d 20 61 72 72 61 79   + [x,y,m] array
1a0a0 20 2d 20 69 6e 74 65 72 69 6f 72 20 72 69 6e 67   - interior ring
1a0b0 20 2a 2f 0a 09 09 20 20 20 20 20 20 65 6c 73 65   */...      else
1a0c0 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e   if (geom->Dimen
1a0d0 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
1a0e0 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 09 20 20 2a  A_XY_Z_M)....  *
1a0f0 73 69 7a 65 20 2b 3d 20 28 34 20 2b 20 28 32 30  size += (4 + (20
1a100 20 2a 20 72 6e 67 2d 3e 50 6f 69 6e 74 73 29 20   * rng->Points) 
1a110 2b 20 32 34 29 3b 09 2f 2a 20 23 20 70 6f 69 6e  + 24);./* # poin
1a120 74 73 20 2b 20 5b 78 2c 79 2c 7a 2c 6d 5d 20 61  ts + [x,y,z,m] a
1a130 72 72 61 79 20 2d 20 69 6e 74 65 72 69 6f 72 20  rray - interior 
1a140 72 69 6e 67 20 2a 2f 0a 09 09 20 20 20 20 20 20  ring */...      
1a150 65 6c 73 65 0a 09 09 09 20 20 2a 73 69 7a 65 20  else....  *size 
1a160 2b 3d 20 28 34 20 2b 20 28 38 20 2a 20 72 6e 67  += (4 + (8 * rng
1a170 2d 3e 50 6f 69 6e 74 73 29 20 2b 20 31 36 29 3b  ->Points) + 16);
1a180 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20 2b 20 5b  ./* # points + [
1a190 78 2c 79 5d 20 61 72 72 61 79 20 2d 20 69 6e 74  x,y] array - int
1a1a0 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 09  erior ring */...
1a1b0 20 20 7d 0a 09 09 70 6f 6c 79 67 20 3d 20 70 6f    }...polyg = po
1a1c0 6c 79 67 2d 3e 4e 65 78 74 3b 0a 09 20 20 20 20  lyg->Next;..    
1a1d0 7d 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 2a  }.      };.    *
1a1e0 72 65 73 75 6c 74 20 3d 20 6d 61 6c 6c 6f 63 20  result = malloc 
1a1f0 28 2a 73 69 7a 65 29 3b 0a 20 20 20 20 70 74 72  (*size);.    ptr
1a200 20 3d 20 2a 72 65 73 75 6c 74 3b 0a 2f 2a 20 61   = *result;./* a
1a210 6e 64 20 66 69 6e 61 6c 6c 79 20 77 65 20 62 75  nd finally we bu
1a220 69 6c 64 20 74 68 65 20 42 4c 4f 42 20 2a 2f 0a  ild the BLOB */.
1a230 20 20 20 20 73 77 69 74 63 68 20 28 74 79 70 65      switch (type
1a240 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  ).      {.      
1a250 63 61 73 65 20 47 41 49 41 5f 50 4f 49 4e 54 3a  case GAIA_POINT:
1a260 0a 09 20 20 2a 70 74 72 20 3d 20 47 41 49 41 5f  ..  *ptr = GAIA_
1a270 4d 41 52 4b 5f 53 54 41 52 54 3b 09 2f 2a 20 53  MARK_START;./* S
1a280 54 41 52 54 20 73 69 67 6e 61 74 75 72 65 20 2a  TART signature *
1a290 2f 0a 09 20 20 2a 28 70 74 72 20 2b 20 31 29 20  /..  *(ptr + 1) 
1a2a0 3d 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e  = GAIA_LITTLE_EN
1a2b0 44 49 41 4e 3b 09 2f 2a 20 62 79 74 65 20 6f 72  DIAN;./* byte or
1a2c0 64 65 72 69 6e 67 20 2a 2f 0a 09 20 20 67 61 69  dering */..  gai
1a2d0 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 20 2b  aExport32 (ptr +
1a2e0 20 32 2c 20 67 65 6f 6d 2d 3e 53 72 69 64 2c 20   2, geom->Srid, 
1a2f0 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
1a300 09 2f 2a 20 74 68 65 20 53 52 49 44 20 2a 2f 0a  ./* the SRID */.
1a310 09 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20  .  gaiaExport64 
1a320 28 70 74 72 20 2b 20 36 2c 20 67 65 6f 6d 2d 3e  (ptr + 6, geom->
1a330 4d 69 6e 58 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  MinX, 1, endian_
1a340 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20  arch);./* MBR - 
1a350 6d 69 6e 69 6d 75 6d 20 58 20 2a 2f 0a 09 20 20  minimum X */..  
1a360 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74  gaiaExport64 (pt
1a370 72 20 2b 20 31 34 2c 20 67 65 6f 6d 2d 3e 4d 69  r + 14, geom->Mi
1a380 6e 59 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72  nY, 1, endian_ar
1a390 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 69  ch);./* MBR - mi
1a3a0 6e 69 6d 75 6d 20 59 20 2a 2f 0a 09 20 20 67 61  nimum Y */..  ga
1a3b0 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20  iaExport64 (ptr 
1a3c0 2b 20 32 32 2c 20 67 65 6f 6d 2d 3e 4d 61 78 58  + 22, geom->MaxX
1a3d0 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
1a3e0 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 61 78 69  );./* MBR - maxi
1a3f0 6d 75 6d 20 58 20 2a 2f 0a 09 20 20 67 61 69 61  mum X */..  gaia
1a400 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20  Export64 (ptr + 
1a410 33 30 2c 20 67 65 6f 6d 2d 3e 4d 61 78 59 2c 20  30, geom->MaxY, 
1a420 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
1a430 09 2f 2a 20 4d 42 52 20 2d 20 6d 61 78 69 6d 75  ./* MBR - maximu
1a440 6d 20 59 20 2a 2f 0a 09 20 20 2a 28 70 74 72 20  m Y */..  *(ptr 
1a450 2b 20 33 38 29 20 3d 20 47 41 49 41 5f 4d 41 52  + 38) = GAIA_MAR
1a460 4b 5f 4d 42 52 3b 09 2f 2a 20 4d 42 52 20 73 69  K_MBR;./* MBR si
1a470 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20 67 61  gnature */..  ga
1a480 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 20  iaExport32 (ptr 
1a490 2b 20 33 39 2c 20 47 41 49 41 5f 50 4f 49 4e 54  + 39, GAIA_POINT
1a4a0 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
1a4b0 29 3b 09 2f 2a 20 63 6c 61 73 73 20 50 4f 49 4e  );./* class POIN
1a4c0 54 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f  T */..  gaiaExpo
1a4d0 72 74 36 34 20 28 70 74 72 20 2b 20 34 33 2c 20  rt64 (ptr + 43, 
1a4e0 70 6f 69 6e 74 2d 3e 58 2c 20 31 2c 20 65 6e 64  point->X, 1, end
1a4f0 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 58 20  ian_arch);./* X 
1a500 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74  */..  gaiaExport
1a510 36 34 20 28 70 74 72 20 2b 20 35 31 2c 20 70 6f  64 (ptr + 51, po
1a520 69 6e 74 2d 3e 59 2c 20 31 2c 20 65 6e 64 69 61  int->Y, 1, endia
1a530 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 59 20 2a 2f  n_arch);./* Y */
1a540 0a 09 20 20 2a 28 70 74 72 20 2b 20 35 39 29 20  ..  *(ptr + 59) 
1a550 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 45 4e 44 3b  = GAIA_MARK_END;
1a560 09 2f 2a 20 45 4e 44 20 73 69 67 6e 61 74 75 72  ./* END signatur
1a570 65 20 2a 2f 0a 09 20 20 62 72 65 61 6b 3b 0a 20  e */..  break;. 
1a580 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 50       case GAIA_P
1a590 4f 49 4e 54 5a 3a 0a 09 20 20 2a 70 74 72 20 3d  OINTZ:..  *ptr =
1a5a0 20 47 41 49 41 5f 4d 41 52 4b 5f 53 54 41 52 54   GAIA_MARK_START
1a5b0 3b 09 2f 2a 20 53 54 41 52 54 20 73 69 67 6e 61  ;./* START signa
1a5c0 74 75 72 65 20 2a 2f 0a 09 20 20 2a 28 70 74 72  ture */..  *(ptr
1a5d0 20 2b 20 31 29 20 3d 20 47 41 49 41 5f 4c 49 54   + 1) = GAIA_LIT
1a5e0 54 4c 45 5f 45 4e 44 49 41 4e 3b 09 2f 2a 20 62  TLE_ENDIAN;./* b
1a5f0 79 74 65 20 6f 72 64 65 72 69 6e 67 20 2a 2f 0a  yte ordering */.
1a600 09 20 20 67 61 69 61 45 78 70 6f 72 74 33 32 20  .  gaiaExport32 
1a610 28 70 74 72 20 2b 20 32 2c 20 67 65 6f 6d 2d 3e  (ptr + 2, geom->
1a620 53 72 69 64 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  Srid, 1, endian_
1a630 61 72 63 68 29 3b 09 2f 2a 20 74 68 65 20 53 52  arch);./* the SR
1a640 49 44 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70  ID */..  gaiaExp
1a650 6f 72 74 36 34 20 28 70 74 72 20 2b 20 36 2c 20  ort64 (ptr + 6, 
1a660 67 65 6f 6d 2d 3e 4d 69 6e 58 2c 20 31 2c 20 65  geom->MinX, 1, e
1a670 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
1a680 4d 42 52 20 2d 20 6d 69 6e 69 6d 75 6d 20 58 20  MBR - minimum X 
1a690 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74  */..  gaiaExport
1a6a0 36 34 20 28 70 74 72 20 2b 20 31 34 2c 20 67 65  64 (ptr + 14, ge
1a6b0 6f 6d 2d 3e 4d 69 6e 59 2c 20 31 2c 20 65 6e 64  om->MinY, 1, end
1a6c0 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42  ian_arch);./* MB
1a6d0 52 20 2d 20 6d 69 6e 69 6d 75 6d 20 59 20 2a 2f  R - minimum Y */
1a6e0 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 36 34  ..  gaiaExport64
1a6f0 20 28 70 74 72 20 2b 20 32 32 2c 20 67 65 6f 6d   (ptr + 22, geom
1a700 2d 3e 4d 61 78 58 2c 20 31 2c 20 65 6e 64 69 61  ->MaxX, 1, endia
1a710 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20  n_arch);./* MBR 
1a720 2d 20 6d 61 78 69 6d 75 6d 20 58 20 2a 2f 0a 09  - maximum X */..
1a730 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28    gaiaExport64 (
1a740 70 74 72 20 2b 20 33 30 2c 20 67 65 6f 6d 2d 3e  ptr + 30, geom->
1a750 4d 61 78 59 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  MaxY, 1, endian_
1a760 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20  arch);./* MBR - 
1a770 6d 61 78 69 6d 75 6d 20 59 20 2a 2f 0a 09 20 20  maximum Y */..  
1a780 2a 28 70 74 72 20 2b 20 33 38 29 20 3d 20 47 41  *(ptr + 38) = GA
1a790 49 41 5f 4d 41 52 4b 5f 4d 42 52 3b 09 2f 2a 20  IA_MARK_MBR;./* 
1a7a0 4d 42 52 20 73 69 67 6e 61 74 75 72 65 20 2a 2f  MBR signature */
1a7b0 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 33 32  ..  gaiaExport32
1a7c0 20 28 70 74 72 20 2b 20 33 39 2c 20 47 41 49 41   (ptr + 39, GAIA
1a7d0 5f 50 4f 49 4e 54 5a 2c 20 31 2c 20 65 6e 64 69  _POINTZ, 1, endi
1a7e0 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 63 6c 61  an_arch);./* cla
1a7f0 73 73 20 50 4f 49 4e 54 20 58 59 5a 20 2a 2f 0a  ss POINT XYZ */.
1a800 09 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20  .  gaiaExport64 
1a810 28 70 74 72 20 2b 20 34 33 2c 20 70 6f 69 6e 74  (ptr + 43, point
1a820 2d 3e 58 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  ->X, 1, endian_a
1a830 72 63 68 29 3b 09 2f 2a 20 58 20 2a 2f 0a 09 20  rch);./* X */.. 
1a840 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70   gaiaExport64 (p
1a850 74 72 20 2b 20 35 31 2c 20 70 6f 69 6e 74 2d 3e  tr + 51, point->
1a860 59 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  Y, 1, endian_arc
1a870 68 29 3b 09 2f 2a 20 59 20 2a 2f 0a 09 20 20 67  h);./* Y */..  g
1a880 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
1a890 20 2b 20 35 39 2c 20 70 6f 69 6e 74 2d 3e 5a 2c   + 59, point->Z,
1a8a0 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
1a8b0 3b 09 2f 2a 20 5a 20 2a 2f 0a 09 20 20 2a 28 70  ;./* Z */..  *(p
1a8c0 74 72 20 2b 20 36 37 29 20 3d 20 47 41 49 41 5f  tr + 67) = GAIA_
1a8d0 4d 41 52 4b 5f 45 4e 44 3b 09 2f 2a 20 45 4e 44  MARK_END;./* END
1a8e0 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20   signature */.. 
1a8f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
1a900 73 65 20 47 41 49 41 5f 50 4f 49 4e 54 4d 3a 0a  se GAIA_POINTM:.
1a910 09 20 20 2a 70 74 72 20 3d 20 47 41 49 41 5f 4d  .  *ptr = GAIA_M
1a920 41 52 4b 5f 53 54 41 52 54 3b 09 2f 2a 20 53 54  ARK_START;./* ST
1a930 41 52 54 20 73 69 67 6e 61 74 75 72 65 20 2a 2f  ART signature */
1a940 0a 09 20 20 2a 28 70 74 72 20 2b 20 31 29 20 3d  ..  *(ptr + 1) =
1a950 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44   GAIA_LITTLE_END
1a960 49 41 4e 3b 09 2f 2a 20 62 79 74 65 20 6f 72 64  IAN;./* byte ord
1a970 65 72 69 6e 67 20 2a 2f 0a 09 20 20 67 61 69 61  ering */..  gaia
1a980 45 78 70 6f 72 74 33 32 20 28 70 74 72 20 2b 20  Export32 (ptr + 
1a990 32 2c 20 67 65 6f 6d 2d 3e 53 72 69 64 2c 20 31  2, geom->Srid, 1
1a9a0 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
1a9b0 2f 2a 20 74 68 65 20 53 52 49 44 20 2a 2f 0a 09  /* the SRID */..
1a9c0 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28    gaiaExport64 (
1a9d0 70 74 72 20 2b 20 36 2c 20 67 65 6f 6d 2d 3e 4d  ptr + 6, geom->M
1a9e0 69 6e 58 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  inX, 1, endian_a
1a9f0 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d  rch);./* MBR - m
1aa00 69 6e 69 6d 75 6d 20 58 20 2a 2f 0a 09 20 20 67  inimum X */..  g
1aa10 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
1aa20 20 2b 20 31 34 2c 20 67 65 6f 6d 2d 3e 4d 69 6e   + 14, geom->Min
1aa30 59 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  Y, 1, endian_arc
1aa40 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 69 6e  h);./* MBR - min
1aa50 69 6d 75 6d 20 59 20 2a 2f 0a 09 20 20 67 61 69  imum Y */..  gai
1aa60 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b  aExport64 (ptr +
1aa70 20 32 32 2c 20 67 65 6f 6d 2d 3e 4d 61 78 58 2c   22, geom->MaxX,
1aa80 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
1aa90 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 61 78 69 6d  ;./* MBR - maxim
1aaa0 75 6d 20 58 20 2a 2f 0a 09 20 20 67 61 69 61 45  um X */..  gaiaE
1aab0 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 33  xport64 (ptr + 3
1aac0 30 2c 20 67 65 6f 6d 2d 3e 4d 61 78 59 2c 20 31  0, geom->MaxY, 1
1aad0 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
1aae0 2f 2a 20 4d 42 52 20 2d 20 6d 61 78 69 6d 75 6d  /* MBR - maximum
1aaf0 20 59 20 2a 2f 0a 09 20 20 2a 28 70 74 72 20 2b   Y */..  *(ptr +
1ab00 20 33 38 29 20 3d 20 47 41 49 41 5f 4d 41 52 4b   38) = GAIA_MARK
1ab10 5f 4d 42 52 3b 09 2f 2a 20 4d 42 52 20 73 69 67  _MBR;./* MBR sig
1ab20 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20 67 61 69  nature */..  gai
1ab30 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 20 2b  aExport32 (ptr +
1ab40 20 33 39 2c 20 47 41 49 41 5f 50 4f 49 4e 54 4d   39, GAIA_POINTM
1ab50 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
1ab60 29 3b 09 2f 2a 20 63 6c 61 73 73 20 50 4f 49 4e  );./* class POIN
1ab70 54 20 58 59 4d 20 2a 2f 0a 09 20 20 67 61 69 61  T XYM */..  gaia
1ab80 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20  Export64 (ptr + 
1ab90 34 33 2c 20 70 6f 69 6e 74 2d 3e 58 2c 20 31 2c  43, point->X, 1,
1aba0 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
1abb0 2a 20 58 20 2a 2f 0a 09 20 20 67 61 69 61 45 78  * X */..  gaiaEx
1abc0 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 35 31  port64 (ptr + 51
1abd0 2c 20 70 6f 69 6e 74 2d 3e 59 2c 20 31 2c 20 65  , point->Y, 1, e
1abe0 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
1abf0 59 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f  Y */..  gaiaExpo
1ac00 72 74 36 34 20 28 70 74 72 20 2b 20 35 39 2c 20  rt64 (ptr + 59, 
1ac10 70 6f 69 6e 74 2d 3e 4d 2c 20 31 2c 20 65 6e 64  point->M, 1, end
1ac20 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 20  ian_arch);./* M 
1ac30 2a 2f 0a 09 20 20 2a 28 70 74 72 20 2b 20 36 37  */..  *(ptr + 67
1ac40 29 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 45 4e  ) = GAIA_MARK_EN
1ac50 44 3b 09 2f 2a 20 45 4e 44 20 73 69 67 6e 61 74  D;./* END signat
1ac60 75 72 65 20 2a 2f 0a 09 20 20 62 72 65 61 6b 3b  ure */..  break;
1ac70 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41  .      case GAIA
1ac80 5f 50 4f 49 4e 54 5a 4d 3a 0a 09 20 20 2a 70 74  _POINTZM:..  *pt
1ac90 72 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 53 54  r = GAIA_MARK_ST
1aca0 41 52 54 3b 09 2f 2a 20 53 54 41 52 54 20 73 69  ART;./* START si
1acb0 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20 2a 28  gnature */..  *(
1acc0 70 74 72 20 2b 20 31 29 20 3d 20 47 41 49 41 5f  ptr + 1) = GAIA_
1acd0 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 3b 09 2f  LITTLE_ENDIAN;./
1ace0 2a 20 62 79 74 65 20 6f 72 64 65 72 69 6e 67 20  * byte ordering 
1acf0 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74  */..  gaiaExport
1ad00 33 32 20 28 70 74 72 20 2b 20 32 2c 20 67 65 6f  32 (ptr + 2, geo
1ad10 6d 2d 3e 53 72 69 64 2c 20 31 2c 20 65 6e 64 69  m->Srid, 1, endi
1ad20 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 74 68 65  an_arch);./* the
1ad30 20 53 52 49 44 20 2a 2f 0a 09 20 20 67 61 69 61   SRID */..  gaia
1ad40 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20  Export64 (ptr + 
1ad50 36 2c 20 67 65 6f 6d 2d 3e 4d 69 6e 58 2c 20 31  6, geom->MinX, 1
1ad60 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
1ad70 2f 2a 20 4d 42 52 20 2d 20 6d 69 6e 69 6d 75 6d  /* MBR - minimum
1ad80 20 58 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70   X */..  gaiaExp
1ad90 6f 72 74 36 34 20 28 70 74 72 20 2b 20 31 34 2c  ort64 (ptr + 14,
1ada0 20 67 65 6f 6d 2d 3e 4d 69 6e 59 2c 20 31 2c 20   geom->MinY, 1, 
1adb0 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a  endian_arch);./*
1adc0 20 4d 42 52 20 2d 20 6d 69 6e 69 6d 75 6d 20 59   MBR - minimum Y
1add0 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72   */..  gaiaExpor
1ade0 74 36 34 20 28 70 74 72 20 2b 20 32 32 2c 20 67  t64 (ptr + 22, g
1adf0 65 6f 6d 2d 3e 4d 61 78 58 2c 20 31 2c 20 65 6e  eom->MaxX, 1, en
1ae00 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d  dian_arch);./* M
1ae10 42 52 20 2d 20 6d 61 78 69 6d 75 6d 20 58 20 2a  BR - maximum X *
1ae20 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 36  /..  gaiaExport6
1ae30 34 20 28 70 74 72 20 2b 20 33 30 2c 20 67 65 6f  4 (ptr + 30, geo
1ae40 6d 2d 3e 4d 61 78 59 2c 20 31 2c 20 65 6e 64 69  m->MaxY, 1, endi
1ae50 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52  an_arch);./* MBR
1ae60 20 2d 20 6d 61 78 69 6d 75 6d 20 59 20 2a 2f 0a   - maximum Y */.
1ae70 09 20 20 2a 28 70 74 72 20 2b 20 33 38 29 20 3d  .  *(ptr + 38) =
1ae80 20 47 41 49 41 5f 4d 41 52 4b 5f 4d 42 52 3b 09   GAIA_MARK_MBR;.
1ae90 2f 2a 20 4d 42 52 20 73 69 67 6e 61 74 75 72 65  /* MBR signature
1aea0 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72   */..  gaiaExpor
1aeb0 74 33 32 20 28 70 74 72 20 2b 20 33 39 2c 20 47  t32 (ptr + 39, G
1aec0 41 49 41 5f 50 4f 49 4e 54 5a 4d 2c 20 31 2c 20  AIA_POINTZM, 1, 
1aed0 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a  endian_arch);./*
1aee0 20 63 6c 61 73 73 20 50 4f 49 4e 54 20 58 59 5a   class POINT XYZ
1aef0 4d 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f  M */..  gaiaExpo
1af00 72 74 36 34 20 28 70 74 72 20 2b 20 34 33 2c 20  rt64 (ptr + 43, 
1af10 70 6f 69 6e 74 2d 3e 58 2c 20 31 2c 20 65 6e 64  point->X, 1, end
1af20 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 58 20  ian_arch);./* X 
1af30 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74  */..  gaiaExport
1af40 36 34 20 28 70 74 72 20 2b 20 35 31 2c 20 70 6f  64 (ptr + 51, po
1af50 69 6e 74 2d 3e 59 2c 20 31 2c 20 65 6e 64 69 61  int->Y, 1, endia
1af60 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 59 20 2a 2f  n_arch);./* Y */
1af70 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 36 34  ..  gaiaExport64
1af80 20 28 70 74 72 20 2b 20 35 39 2c 20 70 6f 69 6e   (ptr + 59, poin
1af90 74 2d 3e 5a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  t->Z, 1, endian_
1afa0 61 72 63 68 29 3b 09 2f 2a 20 4d 20 2a 2f 0a 09  arch);./* M */..
1afb0 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28    gaiaExport64 (
1afc0 70 74 72 20 2b 20 36 37 2c 20 70 6f 69 6e 74 2d  ptr + 67, point-
1afd0 3e 4d 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72  >M, 1, endian_ar
1afe0 63 68 29 3b 09 2f 2a 20 5a 20 2a 2f 0a 09 20 20  ch);./* Z */..  
1aff0 2a 28 70 74 72 20 2b 20 37 35 29 20 3d 20 47 41  *(ptr + 75) = GA
1b000 49 41 5f 4d 41 52 4b 5f 45 4e 44 3b 09 2f 2a 20  IA_MARK_END;./* 
1b010 45 4e 44 20 73 69 67 6e 61 74 75 72 65 20 2a 2f  END signature */
1b020 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
1b030 20 63 61 73 65 20 47 41 49 41 5f 4c 49 4e 45 53   case GAIA_LINES
1b040 54 52 49 4e 47 3a 0a 09 20 20 2a 70 74 72 20 3d  TRING:..  *ptr =
1b050 20 47 41 49 41 5f 4d 41 52 4b 5f 53 54 41 52 54   GAIA_MARK_START
1b060 3b 09 2f 2a 20 53 54 41 52 54 20 73 69 67 6e 61  ;./* START signa
1b070 74 75 72 65 20 2a 2f 0a 09 20 20 2a 28 70 74 72  ture */..  *(ptr
1b080 20 2b 20 31 29 20 3d 20 47 41 49 41 5f 4c 49 54   + 1) = GAIA_LIT
1b090 54 4c 45 5f 45 4e 44 49 41 4e 3b 09 2f 2a 20 62  TLE_ENDIAN;./* b
1b0a0 79 74 65 20 6f 72 64 65 72 69 6e 67 20 2a 2f 0a  yte ordering */.
1b0b0 09 20 20 67 61 69 61 45 78 70 6f 72 74 33 32 20  .  gaiaExport32 
1b0c0 28 70 74 72 20 2b 20 32 2c 20 67 65 6f 6d 2d 3e  (ptr + 2, geom->
1b0d0 53 72 69 64 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  Srid, 1, endian_
1b0e0 61 72 63 68 29 3b 09 2f 2a 20 74 68 65 20 53 52  arch);./* the SR
1b0f0 49 44 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70  ID */..  gaiaExp
1b100 6f 72 74 36 34 20 28 70 74 72 20 2b 20 36 2c 20  ort64 (ptr + 6, 
1b110 67 65 6f 6d 2d 3e 4d 69 6e 58 2c 20 31 2c 20 65  geom->MinX, 1, e
1b120 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
1b130 4d 42 52 20 2d 20 6d 69 6e 69 6d 75 6d 20 58 20  MBR - minimum X 
1b140 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74  */..  gaiaExport
1b150 36 34 20 28 70 74 72 20 2b 20 31 34 2c 20 67 65  64 (ptr + 14, ge
1b160 6f 6d 2d 3e 4d 69 6e 59 2c 20 31 2c 20 65 6e 64  om->MinY, 1, end
1b170 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42  ian_arch);./* MB
1b180 52 20 2d 20 6d 69 6e 69 6d 75 6d 20 59 20 2a 2f  R - minimum Y */
1b190 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 36 34  ..  gaiaExport64
1b1a0 20 28 70 74 72 20 2b 20 32 32 2c 20 67 65 6f 6d   (ptr + 22, geom
1b1b0 2d 3e 4d 61 78 58 2c 20 31 2c 20 65 6e 64 69 61  ->MaxX, 1, endia
1b1c0 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20  n_arch);./* MBR 
1b1d0 2d 20 6d 61 78 69 6d 75 6d 20 58 20 2a 2f 0a 09  - maximum X */..
1b1e0 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28    gaiaExport64 (
1b1f0 70 74 72 20 2b 20 33 30 2c 20 67 65 6f 6d 2d 3e  ptr + 30, geom->
1b200 4d 61 78 59 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  MaxY, 1, endian_
1b210 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20  arch);./* MBR - 
1b220 6d 61 78 69 6d 75 6d 20 59 20 2a 2f 0a 09 20 20  maximum Y */..  
1b230 2a 28 70 74 72 20 2b 20 33 38 29 20 3d 20 47 41  *(ptr + 38) = GA
1b240 49 41 5f 4d 41 52 4b 5f 4d 42 52 3b 09 2f 2a 20  IA_MARK_MBR;./* 
1b250 4d 42 52 20 73 69 67 6e 61 74 75 72 65 20 2a 2f  MBR signature */
1b260 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 33 32  ..  gaiaExport32
1b270 20 28 70 74 72 20 2b 20 33 39 2c 20 47 41 49 41   (ptr + 39, GAIA
1b280 5f 43 4f 4d 50 52 45 53 53 45 44 5f 4c 49 4e 45  _COMPRESSED_LINE
1b290 53 54 52 49 4e 47 2c 20 31 2c 20 65 6e 64 69 61  STRING, 1, endia
1b2a0 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 63 6c 61 73  n_arch);./* clas
1b2b0 73 20 4c 49 4e 45 53 54 52 49 4e 47 20 2a 2f 0a  s LINESTRING */.
1b2c0 09 20 20 67 61 69 61 45 78 70 6f 72 74 33 32 20  .  gaiaExport32 
1b2d0 28 70 74 72 20 2b 20 34 33 2c 20 6c 69 6e 65 2d  (ptr + 43, line-
1b2e0 3e 50 6f 69 6e 74 73 2c 20 31 2c 20 65 6e 64 69  >Points, 1, endi
1b2f0 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 23 20 70  an_arch);./* # p
1b300 6f 69 6e 74 73 20 2a 2f 0a 09 20 20 70 74 72 20  oints */..  ptr 
1b310 2b 3d 20 34 37 3b 0a 09 20 20 66 6f 72 20 28 69  += 47;..  for (i
1b320 76 20 3d 20 30 3b 20 69 76 20 3c 20 6c 69 6e 65  v = 0; iv < line
1b330 2d 3e 50 6f 69 6e 74 73 3b 20 69 76 2b 2b 29 0a  ->Points; iv++).
1b340 09 20 20 20 20 7b 0a 09 09 67 61 69 61 47 65 74  .    {...gaiaGet
1b350 50 6f 69 6e 74 20 28 6c 69 6e 65 2d 3e 43 6f 6f  Point (line->Coo
1b360 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 29  rds, iv, &x, &y)
1b370 3b 0a 09 09 69 66 20 28 69 76 20 3d 3d 20 30 20  ;...if (iv == 0 
1b380 7c 7c 20 69 76 20 3d 3d 20 28 6c 69 6e 65 2d 3e  || iv == (line->
1b390 50 6f 69 6e 74 73 20 2d 20 31 29 29 0a 09 09 20  Points - 1))... 
1b3a0 20 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20 66 69   {...      /* fi
1b3b0 72 73 74 20 61 6e 64 20 6c 61 73 74 20 76 65 72  rst and last ver
1b3c0 74 69 63 65 73 20 61 72 65 20 75 6e 63 6f 6d 70  tices are uncomp
1b3d0 72 65 73 73 65 64 20 2a 2f 0a 09 09 20 20 20 20  ressed */...    
1b3e0 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28    gaiaExport64 (
1b3f0 70 74 72 2c 20 78 2c 20 31 2c 20 65 6e 64 69 61  ptr, x, 1, endia
1b400 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20 20 20 20  n_arch);...     
1b410 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70   gaiaExport64 (p
1b420 74 72 20 2b 20 38 2c 20 79 2c 20 31 2c 20 65 6e  tr + 8, y, 1, en
1b430 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20  dian_arch);...  
1b440 20 20 20 20 70 74 72 20 2b 3d 20 31 36 3b 0a 09      ptr += 16;..
1b450 09 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 20 20  .  }...else...  
1b460 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20 63 6f 6d  {...      /* com
1b470 70 72 65 73 73 69 6e 67 20 61 6e 79 20 6f 74 68  pressing any oth
1b480 65 72 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  er intermediate 
1b490 76 65 72 74 65 78 20 2a 2f 0a 09 09 20 20 20 20  vertex */...    
1b4a0 20 20 66 78 20 3d 20 28 66 6c 6f 61 74 29 20 28    fx = (float) (
1b4b0 78 20 2d 20 6c 61 73 74 5f 78 29 3b 0a 09 09 20  x - last_x);... 
1b4c0 20 20 20 20 20 66 79 20 3d 20 28 66 6c 6f 61 74       fy = (float
1b4d0 29 20 28 79 20 2d 20 6c 61 73 74 5f 79 29 3b 0a  ) (y - last_y);.
1b4e0 09 09 20 20 20 20 20 20 67 61 69 61 45 78 70 6f  ..      gaiaExpo
1b4f0 72 74 46 33 32 20 28 70 74 72 2c 20 66 78 2c 20  rtF32 (ptr, fx, 
1b500 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
1b510 0a 09 09 20 20 20 20 20 20 67 61 69 61 45 78 70  ...      gaiaExp
1b520 6f 72 74 46 33 32 20 28 70 74 72 20 2b 20 34 2c  ortF32 (ptr + 4,
1b530 20 66 79 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61   fy, 1, endian_a
1b540 72 63 68 29 3b 0a 09 09 20 20 20 20 20 20 70 74  rch);...      pt
1b550 72 20 2b 3d 20 38 3b 0a 09 09 20 20 7d 0a 09 09  r += 8;...  }...
1b560 6c 61 73 74 5f 78 20 3d 20 78 3b 0a 09 09 6c 61  last_x = x;...la
1b570 73 74 5f 79 20 3d 20 79 3b 0a 09 20 20 20 20 7d  st_y = y;..    }
1b580 0a 09 20 20 2a 70 74 72 20 3d 20 47 41 49 41 5f  ..  *ptr = GAIA_
1b590 4d 41 52 4b 5f 45 4e 44 3b 09 2f 2a 20 45 4e 44  MARK_END;./* END
1b5a0 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20   signature */.. 
1b5b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
1b5c0 73 65 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49  se GAIA_LINESTRI
1b5d0 4e 47 5a 3a 0a 09 20 20 2a 70 74 72 20 3d 20 47  NGZ:..  *ptr = G
1b5e0 41 49 41 5f 4d 41 52 4b 5f 53 54 41 52 54 3b 09  AIA_MARK_START;.
1b5f0 2f 2a 20 53 54 41 52 54 20 73 69 67 6e 61 74 75  /* START signatu
1b600 72 65 20 2a 2f 0a 09 20 20 2a 28 70 74 72 20 2b  re */..  *(ptr +
1b610 20 31 29 20 3d 20 47 41 49 41 5f 4c 49 54 54 4c   1) = GAIA_LITTL
1b620 45 5f 45 4e 44 49 41 4e 3b 09 2f 2a 20 62 79 74  E_ENDIAN;./* byt
1b630 65 20 6f 72 64 65 72 69 6e 67 20 2a 2f 0a 09 20  e ordering */.. 
1b640 20 67 61 69 61 45 78 70 6f 72 74 33 32 20 28 70   gaiaExport32 (p
1b650 74 72 20 2b 20 32 2c 20 67 65 6f 6d 2d 3e 53 72  tr + 2, geom->Sr
1b660 69 64 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72  id, 1, endian_ar
1b670 63 68 29 3b 09 2f 2a 20 74 68 65 20 53 52 49 44  ch);./* the SRID
1b680 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72   */..  gaiaExpor
1b690 74 36 34 20 28 70 74 72 20 2b 20 36 2c 20 67 65  t64 (ptr + 6, ge
1b6a0 6f 6d 2d 3e 4d 69 6e 58 2c 20 31 2c 20 65 6e 64  om->MinX, 1, end
1b6b0 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42  ian_arch);./* MB
1b6c0 52 20 2d 20 6d 69 6e 69 6d 75 6d 20 58 20 2a 2f  R - minimum X */
1b6d0 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 36 34  ..  gaiaExport64
1b6e0 20 28 70 74 72 20 2b 20 31 34 2c 20 67 65 6f 6d   (ptr + 14, geom
1b6f0 2d 3e 4d 69 6e 59 2c 20 31 2c 20 65 6e 64 69 61  ->MinY, 1, endia
1b700 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20  n_arch);./* MBR 
1b710 2d 20 6d 69 6e 69 6d 75 6d 20 59 20 2a 2f 0a 09  - minimum Y */..
1b720 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28    gaiaExport64 (
1b730 70 74 72 20 2b 20 32 32 2c 20 67 65 6f 6d 2d 3e  ptr + 22, geom->
1b740 4d 61 78 58 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  MaxX, 1, endian_
1b750 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20  arch);./* MBR - 
1b760 6d 61 78 69 6d 75 6d 20 58 20 2a 2f 0a 09 20 20  maximum X */..  
1b770 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74  gaiaExport64 (pt
1b780 72 20 2b 20 33 30 2c 20 67 65 6f 6d 2d 3e 4d 61  r + 30, geom->Ma
1b790 78 59 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72  xY, 1, endian_ar
1b7a0 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 61  ch);./* MBR - ma
1b7b0 78 69 6d 75 6d 20 59 20 2a 2f 0a 09 20 20 2a 28  ximum Y */..  *(
1b7c0 70 74 72 20 2b 20 33 38 29 20 3d 20 47 41 49 41  ptr + 38) = GAIA
1b7d0 5f 4d 41 52 4b 5f 4d 42 52 3b 09 2f 2a 20 4d 42  _MARK_MBR;./* MB
1b7e0 52 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09  R signature */..
1b7f0 20 20 67 61 69 61 45 78 70 6f 72 74 33 32 20 28    gaiaExport32 (
1b800 70 74 72 20 2b 20 33 39 2c 20 47 41 49 41 5f 43  ptr + 39, GAIA_C
1b810 4f 4d 50 52 45 53 53 45 44 5f 4c 49 4e 45 53 54  OMPRESSED_LINEST
1b820 52 49 4e 47 5a 2c 20 31 2c 20 65 6e 64 69 61 6e  RINGZ, 1, endian
1b830 5f 61 72 63 68 29 3b 09 2f 2a 20 63 6c 61 73 73  _arch);./* class
1b840 20 4c 49 4e 45 53 54 52 49 4e 47 20 58 59 5a 20   LINESTRING XYZ 
1b850 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74  */..  gaiaExport
1b860 33 32 20 28 70 74 72 20 2b 20 34 33 2c 20 6c 69  32 (ptr + 43, li
1b870 6e 65 2d 3e 50 6f 69 6e 74 73 2c 20 31 2c 20 65  ne->Points, 1, e
1b880 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
1b890 23 20 70 6f 69 6e 74 73 20 2a 2f 0a 09 20 20 70  # points */..  p
1b8a0 74 72 20 2b 3d 20 34 37 3b 0a 09 20 20 66 6f 72  tr += 47;..  for
1b8b0 20 28 69 76 20 3d 20 30 3b 20 69 76 20 3c 20 6c   (iv = 0; iv < l
1b8c0 69 6e 65 2d 3e 50 6f 69 6e 74 73 3b 20 69 76 2b  ine->Points; iv+
1b8d0 2b 29 0a 09 20 20 20 20 7b 0a 09 09 67 61 69 61  +)..    {...gaia
1b8e0 47 65 74 50 6f 69 6e 74 58 59 5a 20 28 6c 69 6e  GetPointXYZ (lin
1b8f0 65 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26  e->Coords, iv, &
1b900 78 2c 20 26 79 2c 20 26 7a 29 3b 0a 09 09 69 66  x, &y, &z);...if
1b910 20 28 69 76 20 3d 3d 20 30 20 7c 7c 20 69 76 20   (iv == 0 || iv 
1b920 3d 3d 20 28 6c 69 6e 65 2d 3e 50 6f 69 6e 74 73  == (line->Points
1b930 20 2d 20 31 29 29 0a 09 09 20 20 7b 0a 09 09 20   - 1))...  {... 
1b940 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 61 6e       /* first an
1b950 64 20 6c 61 73 74 20 76 65 72 74 69 63 65 73 20  d last vertices 
1b960 61 72 65 20 75 6e 63 6f 6d 70 72 65 73 73 65 64  are uncompressed
1b970 20 2a 2f 0a 09 09 20 20 20 20 20 20 67 61 69 61   */...      gaia
1b980 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20 78  Export64 (ptr, x
1b990 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
1b9a0 29 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61 45  );...      gaiaE
1b9b0 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 38  xport64 (ptr + 8
1b9c0 2c 20 79 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  , y, 1, endian_a
1b9d0 72 63 68 29 3b 0a 09 09 20 20 20 20 20 20 67 61  rch);...      ga
1b9e0 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20  iaExport64 (ptr 
1b9f0 2b 20 31 36 2c 20 7a 2c 20 31 2c 20 65 6e 64 69  + 16, z, 1, endi
1ba00 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20 20 20  an_arch);...    
1ba10 20 20 70 74 72 20 2b 3d 20 32 34 3b 0a 09 09 20    ptr += 24;... 
1ba20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 20 20 7b 0a   }...else...  {.
1ba30 09 09 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70 72  ..      /* compr
1ba40 65 73 73 69 6e 67 20 61 6e 79 20 6f 74 68 65 72  essing any other
1ba50 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 76 65   intermediate ve
1ba60 72 74 65 78 20 2a 2f 0a 09 09 20 20 20 20 20 20  rtex */...      
1ba70 66 78 20 3d 20 28 66 6c 6f 61 74 29 20 28 78 20  fx = (float) (x 
1ba80 2d 20 6c 61 73 74 5f 78 29 3b 0a 09 09 20 20 20  - last_x);...   
1ba90 20 20 20 66 79 20 3d 20 28 66 6c 6f 61 74 29 20     fy = (float) 
1baa0 28 79 20 2d 20 6c 61 73 74 5f 79 29 3b 0a 09 09  (y - last_y);...
1bab0 20 20 20 20 20 20 66 7a 20 3d 20 28 66 6c 6f 61        fz = (floa
1bac0 74 29 20 28 7a 20 2d 20 6c 61 73 74 5f 7a 29 3b  t) (z - last_z);
1bad0 0a 09 09 20 20 20 20 20 20 67 61 69 61 45 78 70  ...      gaiaExp
1bae0 6f 72 74 46 33 32 20 28 70 74 72 2c 20 66 78 2c  ortF32 (ptr, fx,
1baf0 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
1bb00 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61 45 78  ;...      gaiaEx
1bb10 70 6f 72 74 46 33 32 20 28 70 74 72 20 2b 20 34  portF32 (ptr + 4
1bb20 2c 20 66 79 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  , fy, 1, endian_
1bb30 61 72 63 68 29 3b 0a 09 09 20 20 20 20 20 20 67  arch);...      g
1bb40 61 69 61 45 78 70 6f 72 74 46 33 32 20 28 70 74  aiaExportF32 (pt
1bb50 72 20 2b 20 38 2c 20 66 7a 2c 20 31 2c 20 65 6e  r + 8, fz, 1, en
1bb60 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20  dian_arch);...  
1bb70 20 20 20 20 70 74 72 20 2b 3d 20 31 32 3b 0a 09      ptr += 12;..
1bb80 09 20 20 7d 0a 09 09 6c 61 73 74 5f 78 20 3d 20  .  }...last_x = 
1bb90 78 3b 0a 09 09 6c 61 73 74 5f 79 20 3d 20 79 3b  x;...last_y = y;
1bba0 0a 09 09 6c 61 73 74 5f 7a 20 3d 20 7a 3b 0a 09  ...last_z = z;..
1bbb0 20 20 20 20 7d 0a 09 20 20 2a 70 74 72 20 3d 20      }..  *ptr = 
1bbc0 47 41 49 41 5f 4d 41 52 4b 5f 45 4e 44 3b 09 2f  GAIA_MARK_END;./
1bbd0 2a 20 45 4e 44 20 73 69 67 6e 61 74 75 72 65 20  * END signature 
1bbe0 2a 2f 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  */..  break;.   
1bbf0 20 20 20 63 61 73 65 20 47 41 49 41 5f 4c 49 4e     case GAIA_LIN
1bc00 45 53 54 52 49 4e 47 4d 3a 0a 09 20 20 2a 70 74  ESTRINGM:..  *pt
1bc10 72 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 53 54  r = GAIA_MARK_ST
1bc20 41 52 54 3b 09 2f 2a 20 53 54 41 52 54 20 73 69  ART;./* START si
1bc30 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20 2a 28  gnature */..  *(
1bc40 70 74 72 20 2b 20 31 29 20 3d 20 47 41 49 41 5f  ptr + 1) = GAIA_
1bc50 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 3b 09 2f  LITTLE_ENDIAN;./
1bc60 2a 20 62 79 74 65 20 6f 72 64 65 72 69 6e 67 20  * byte ordering 
1bc70 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74  */..  gaiaExport
1bc80 33 32 20 28 70 74 72 20 2b 20 32 2c 20 67 65 6f  32 (ptr + 2, geo
1bc90 6d 2d 3e 53 72 69 64 2c 20 31 2c 20 65 6e 64 69  m->Srid, 1, endi
1bca0 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 74 68 65  an_arch);./* the
1bcb0 20 53 52 49 44 20 2a 2f 0a 09 20 20 67 61 69 61   SRID */..  gaia
1bcc0 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20  Export64 (ptr + 
1bcd0 36 2c 20 67 65 6f 6d 2d 3e 4d 69 6e 58 2c 20 31  6, geom->MinX, 1
1bce0 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
1bcf0 2f 2a 20 4d 42 52 20 2d 20 6d 69 6e 69 6d 75 6d  /* MBR - minimum
1bd00 20 58 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70   X */..  gaiaExp
1bd10 6f 72 74 36 34 20 28 70 74 72 20 2b 20 31 34 2c  ort64 (ptr + 14,
1bd20 20 67 65 6f 6d 2d 3e 4d 69 6e 59 2c 20 31 2c 20   geom->MinY, 1, 
1bd30 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a  endian_arch);./*
1bd40 20 4d 42 52 20 2d 20 6d 69 6e 69 6d 75 6d 20 59   MBR - minimum Y
1bd50 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72   */..  gaiaExpor
1bd60 74 36 34 20 28 70 74 72 20 2b 20 32 32 2c 20 67  t64 (ptr + 22, g
1bd70 65 6f 6d 2d 3e 4d 61 78 58 2c 20 31 2c 20 65 6e  eom->MaxX, 1, en
1bd80 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d  dian_arch);./* M
1bd90 42 52 20 2d 20 6d 61 78 69 6d 75 6d 20 58 20 2a  BR - maximum X *
1bda0 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 36  /..  gaiaExport6
1bdb0 34 20 28 70 74 72 20 2b 20 33 30 2c 20 67 65 6f  4 (ptr + 30, geo
1bdc0 6d 2d 3e 4d 61 78 59 2c 20 31 2c 20 65 6e 64 69  m->MaxY, 1, endi
1bdd0 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52  an_arch);./* MBR
1bde0 20 2d 20 6d 61 78 69 6d 75 6d 20 59 20 2a 2f 0a   - maximum Y */.
1bdf0 09 20 20 2a 28 70 74 72 20 2b 20 33 38 29 20 3d  .  *(ptr + 38) =
1be00 20 47 41 49 41 5f 4d 41 52 4b 5f 4d 42 52 3b 09   GAIA_MARK_MBR;.
1be10 2f 2a 20 4d 42 52 20 73 69 67 6e 61 74 75 72 65  /* MBR signature
1be20 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72   */..  gaiaExpor
1be30 74 33 32 20 28 70 74 72 20 2b 20 33 39 2c 20 47  t32 (ptr + 39, G
1be40 41 49 41 5f 43 4f 4d 50 52 45 53 53 45 44 5f 4c  AIA_COMPRESSED_L
1be50 49 4e 45 53 54 52 49 4e 47 4d 2c 20 31 2c 20 65  INESTRINGM, 1, e
1be60 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
1be70 63 6c 61 73 73 20 4c 49 4e 45 53 54 52 49 4e 47  class LINESTRING
1be80 20 58 59 4d 20 2a 2f 0a 09 20 20 67 61 69 61 45   XYM */..  gaiaE
1be90 78 70 6f 72 74 33 32 20 28 70 74 72 20 2b 20 34  xport32 (ptr + 4
1bea0 33 2c 20 6c 69 6e 65 2d 3e 50 6f 69 6e 74 73 2c  3, line->Points,
1beb0 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
1bec0 3b 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20 2a 2f  ;./* # points */
1bed0 0a 09 20 20 70 74 72 20 2b 3d 20 34 37 3b 0a 09  ..  ptr += 47;..
1bee0 20 20 66 6f 72 20 28 69 76 20 3d 20 30 3b 20 69    for (iv = 0; i
1bef0 76 20 3c 20 6c 69 6e 65 2d 3e 50 6f 69 6e 74 73  v < line->Points
1bf00 3b 20 69 76 2b 2b 29 0a 09 20 20 20 20 7b 0a 09  ; iv++)..    {..
1bf10 09 67 61 69 61 47 65 74 50 6f 69 6e 74 58 59 4d  .gaiaGetPointXYM
1bf20 20 28 6c 69 6e 65 2d 3e 43 6f 6f 72 64 73 2c 20   (line->Coords, 
1bf30 69 76 2c 20 26 78 2c 20 26 79 2c 20 26 6d 29 3b  iv, &x, &y, &m);
1bf40 0a 09 09 69 66 20 28 69 76 20 3d 3d 20 30 20 7c  ...if (iv == 0 |
1bf50 7c 20 69 76 20 3d 3d 20 28 6c 69 6e 65 2d 3e 50  | iv == (line->P
1bf60 6f 69 6e 74 73 20 2d 20 31 29 29 0a 09 09 20 20  oints - 1))...  
1bf70 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20 66 69 72  {...      /* fir
1bf80 73 74 20 61 6e 64 20 6c 61 73 74 20 76 65 72 74  st and last vert
1bf90 69 63 65 73 20 61 72 65 20 75 6e 63 6f 6d 70 72  ices are uncompr
1bfa0 65 73 73 65 64 20 2a 2f 0a 09 09 20 20 20 20 20  essed */...     
1bfb0 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70   gaiaExport64 (p
1bfc0 74 72 2c 20 78 2c 20 31 2c 20 65 6e 64 69 61 6e  tr, x, 1, endian
1bfd0 5f 61 72 63 68 29 3b 0a 09 09 20 20 20 20 20 20  _arch);...      
1bfe0 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74  gaiaExport64 (pt
1bff0 72 20 2b 20 38 2c 20 79 2c 20 31 2c 20 65 6e 64  r + 8, y, 1, end
1c000 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20 20  ian_arch);...   
1c010 20 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20     gaiaExport64 
1c020 28 70 74 72 20 2b 20 31 36 2c 20 6d 2c 20 31 2c  (ptr + 16, m, 1,
1c030 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09   endian_arch);..
1c040 09 20 20 20 20 20 20 70 74 72 20 2b 3d 20 32 34  .      ptr += 24
1c050 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a 09  ;...  }...else..
1c060 09 20 20 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20  .  {...      /* 
1c070 63 6f 6d 70 72 65 73 73 69 6e 67 20 61 6e 79 20  compressing any 
1c080 6f 74 68 65 72 20 69 6e 74 65 72 6d 65 64 69 61  other intermedia
1c090 74 65 20 76 65 72 74 65 78 20 2a 2f 0a 09 09 20  te vertex */... 
1c0a0 20 20 20 20 20 66 78 20 3d 20 28 66 6c 6f 61 74       fx = (float
1c0b0 29 20 28 78 20 2d 20 6c 61 73 74 5f 78 29 3b 0a  ) (x - last_x);.
1c0c0 09 09 20 20 20 20 20 20 66 79 20 3d 20 28 66 6c  ..      fy = (fl
1c0d0 6f 61 74 29 20 28 79 20 2d 20 6c 61 73 74 5f 79  oat) (y - last_y
1c0e0 29 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61 45  );...      gaiaE
1c0f0 78 70 6f 72 74 46 33 32 20 28 70 74 72 2c 20 66  xportF32 (ptr, f
1c100 78 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  x, 1, endian_arc
1c110 68 29 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61  h);...      gaia
1c120 45 78 70 6f 72 74 46 33 32 20 28 70 74 72 20 2b  ExportF32 (ptr +
1c130 20 34 2c 20 66 79 2c 20 31 2c 20 65 6e 64 69 61   4, fy, 1, endia
1c140 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20 20 20 20  n_arch);...     
1c150 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70   gaiaExport64 (p
1c160 74 72 20 2b 20 38 2c 20 6d 2c 20 31 2c 20 65 6e  tr + 8, m, 1, en
1c170 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20  dian_arch);...  
1c180 20 20 20 20 70 74 72 20 2b 3d 20 31 36 3b 0a 09      ptr += 16;..
1c190 09 20 20 7d 0a 09 09 6c 61 73 74 5f 78 20 3d 20  .  }...last_x = 
1c1a0 78 3b 0a 09 09 6c 61 73 74 5f 79 20 3d 20 79 3b  x;...last_y = y;
1c1b0 0a 09 20 20 20 20 7d 0a 09 20 20 2a 70 74 72 20  ..    }..  *ptr 
1c1c0 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 45 4e 44 3b  = GAIA_MARK_END;
1c1d0 09 2f 2a 20 45 4e 44 20 73 69 67 6e 61 74 75 72  ./* END signatur
1c1e0 65 20 2a 2f 0a 09 20 20 62 72 65 61 6b 3b 0a 20  e */..  break;. 
1c1f0 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4c       case GAIA_L
1c200 49 4e 45 53 54 52 49 4e 47 5a 4d 3a 0a 09 20 20  INESTRINGZM:..  
1c210 2a 70 74 72 20 3d 20 47 41 49 41 5f 4d 41 52 4b  *ptr = GAIA_MARK
1c220 5f 53 54 41 52 54 3b 09 2f 2a 20 53 54 41 52 54  _START;./* START
1c230 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20   signature */.. 
1c240 20 2a 28 70 74 72 20 2b 20 31 29 20 3d 20 47 41   *(ptr + 1) = GA
1c250 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e  IA_LITTLE_ENDIAN
1c260 3b 09 2f 2a 20 62 79 74 65 20 6f 72 64 65 72 69  ;./* byte orderi
1c270 6e 67 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70  ng */..  gaiaExp
1c280 6f 72 74 33 32 20 28 70 74 72 20 2b 20 32 2c 20  ort32 (ptr + 2, 
1c290 67 65 6f 6d 2d 3e 53 72 69 64 2c 20 31 2c 20 65  geom->Srid, 1, e
1c2a0 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
1c2b0 74 68 65 20 53 52 49 44 20 2a 2f 0a 09 20 20 67  the SRID */..  g
1c2c0 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
1c2d0 20 2b 20 36 2c 20 67 65 6f 6d 2d 3e 4d 69 6e 58   + 6, geom->MinX
1c2e0 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
1c2f0 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 69 6e 69  );./* MBR - mini
1c300 6d 75 6d 20 58 20 2a 2f 0a 09 20 20 67 61 69 61  mum X */..  gaia
1c310 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20  Export64 (ptr + 
1c320 31 34 2c 20 67 65 6f 6d 2d 3e 4d 69 6e 59 2c 20  14, geom->MinY, 
1c330 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
1c340 09 2f 2a 20 4d 42 52 20 2d 20 6d 69 6e 69 6d 75  ./* MBR - minimu
1c350 6d 20 59 20 2a 2f 0a 09 20 20 67 61 69 61 45 78  m Y */..  gaiaEx
1c360 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 32 32  port64 (ptr + 22
1c370 2c 20 67 65 6f 6d 2d 3e 4d 61 78 58 2c 20 31 2c  , geom->MaxX, 1,
1c380 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
1c390 2a 20 4d 42 52 20 2d 20 6d 61 78 69 6d 75 6d 20  * MBR - maximum 
1c3a0 58 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f  X */..  gaiaExpo
1c3b0 72 74 36 34 20 28 70 74 72 20 2b 20 33 30 2c 20  rt64 (ptr + 30, 
1c3c0 67 65 6f 6d 2d 3e 4d 61 78 59 2c 20 31 2c 20 65  geom->MaxY, 1, e
1c3d0 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
1c3e0 4d 42 52 20 2d 20 6d 61 78 69 6d 75 6d 20 59 20  MBR - maximum Y 
1c3f0 2a 2f 0a 09 20 20 2a 28 70 74 72 20 2b 20 33 38  */..  *(ptr + 38
1c400 29 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 4d 42  ) = GAIA_MARK_MB
1c410 52 3b 09 2f 2a 20 4d 42 52 20 73 69 67 6e 61 74  R;./* MBR signat
1c420 75 72 65 20 2a 2f 0a 09 20 20 67 61 69 61 45 78  ure */..  gaiaEx
1c430 70 6f 72 74 33 32 20 28 70 74 72 20 2b 20 33 39  port32 (ptr + 39
1c440 2c 20 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45  , GAIA_COMPRESSE
1c450 44 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 2c 20  D_LINESTRINGZM, 
1c460 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
1c470 09 2f 2a 20 63 6c 61 73 73 20 4c 49 4e 45 53 54  ./* class LINEST
1c480 52 49 4e 47 20 58 59 5a 4d 20 2a 2f 0a 09 20 20  RING XYZM */..  
1c490 67 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74  gaiaExport32 (pt
1c4a0 72 20 2b 20 34 33 2c 20 6c 69 6e 65 2d 3e 50 6f  r + 43, line->Po
1c4b0 69 6e 74 73 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  ints, 1, endian_
1c4c0 61 72 63 68 29 3b 09 2f 2a 20 23 20 70 6f 69 6e  arch);./* # poin
1c4d0 74 73 20 2a 2f 0a 09 20 20 70 74 72 20 2b 3d 20  ts */..  ptr += 
1c4e0 34 37 3b 0a 09 20 20 66 6f 72 20 28 69 76 20 3d  47;..  for (iv =
1c4f0 20 30 3b 20 69 76 20 3c 20 6c 69 6e 65 2d 3e 50   0; iv < line->P
1c500 6f 69 6e 74 73 3b 20 69 76 2b 2b 29 0a 09 20 20  oints; iv++)..  
1c510 20 20 7b 0a 09 09 67 61 69 61 47 65 74 50 6f 69    {...gaiaGetPoi
1c520 6e 74 58 59 5a 4d 20 28 6c 69 6e 65 2d 3e 43 6f  ntXYZM (line->Co
1c530 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79  ords, iv, &x, &y
1c540 2c 20 26 7a 2c 20 26 6d 29 3b 0a 09 09 69 66 20  , &z, &m);...if 
1c550 28 69 76 20 3d 3d 20 30 20 7c 7c 20 69 76 20 3d  (iv == 0 || iv =
1c560 3d 20 28 6c 69 6e 65 2d 3e 50 6f 69 6e 74 73 20  = (line->Points 
1c570 2d 20 31 29 29 0a 09 09 20 20 7b 0a 09 09 20 20  - 1))...  {...  
1c580 20 20 20 20 2f 2a 20 66 69 72 73 74 20 61 6e 64      /* first and
1c590 20 6c 61 73 74 20 76 65 72 74 69 63 65 73 20 61   last vertices a
1c5a0 72 65 20 75 6e 63 6f 6d 70 72 65 73 73 65 64 20  re uncompressed 
1c5b0 2a 2f 0a 09 09 20 20 20 20 20 20 67 61 69 61 45  */...      gaiaE
1c5c0 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20 78 2c  xport64 (ptr, x,
1c5d0 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
1c5e0 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61 45 78  ;...      gaiaEx
1c5f0 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 38 2c  port64 (ptr + 8,
1c600 20 79 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72   y, 1, endian_ar
1c610 63 68 29 3b 0a 09 09 20 20 20 20 20 20 67 61 69  ch);...      gai
1c620 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b  aExport64 (ptr +
1c630 20 31 36 2c 20 7a 2c 20 31 2c 20 65 6e 64 69 61   16, z, 1, endia
1c640 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20 20 20 20  n_arch);...     
1c650 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70   gaiaExport64 (p
1c660 74 72 20 2b 20 32 34 2c 20 6d 2c 20 31 2c 20 65  tr + 24, m, 1, e
1c670 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20  ndian_arch);... 
1c680 20 20 20 20 20 70 74 72 20 2b 3d 20 33 32 3b 0a       ptr += 32;.
1c690 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 20  ..  }...else... 
1c6a0 20 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20 63 6f   {...      /* co
1c6b0 6d 70 72 65 73 73 69 6e 67 20 61 6e 79 20 6f 74  mpressing any ot
1c6c0 68 65 72 20 69 6e 74 65 72 6d 65 64 69 61 74 65  her intermediate
1c6d0 20 76 65 72 74 65 78 20 2a 2f 0a 09 09 20 20 20   vertex */...   
1c6e0 20 20 20 66 78 20 3d 20 28 66 6c 6f 61 74 29 20     fx = (float) 
1c6f0 28 78 20 2d 20 6c 61 73 74 5f 78 29 3b 0a 09 09  (x - last_x);...
1c700 20 20 20 20 20 20 66 79 20 3d 20 28 66 6c 6f 61        fy = (floa
1c710 74 29 20 28 79 20 2d 20 6c 61 73 74 5f 79 29 3b  t) (y - last_y);
1c720 0a 09 09 20 20 20 20 20 20 66 7a 20 3d 20 28 66  ...      fz = (f
1c730 6c 6f 61 74 29 20 28 7a 20 2d 20 6c 61 73 74 5f  loat) (z - last_
1c740 7a 29 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61  z);...      gaia
1c750 45 78 70 6f 72 74 46 33 32 20 28 70 74 72 2c 20  ExportF32 (ptr, 
1c760 66 78 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72  fx, 1, endian_ar
1c770 63 68 29 3b 0a 09 09 20 20 20 20 20 20 67 61 69  ch);...      gai
1c780 61 45 78 70 6f 72 74 46 33 32 20 28 70 74 72 20  aExportF32 (ptr 
1c790 2b 20 34 2c 20 66 79 2c 20 31 2c 20 65 6e 64 69  + 4, fy, 1, endi
1c7a0 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20 20 20  an_arch);...    
1c7b0 20 20 67 61 69 61 45 78 70 6f 72 74 46 33 32 20    gaiaExportF32 
1c7c0 28 70 74 72 20 2b 20 38 2c 20 66 7a 2c 20 31 2c  (ptr + 8, fz, 1,
1c7d0 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09   endian_arch);..
1c7e0 09 20 20 20 20 20 20 67 61 69 61 45 78 70 6f 72  .      gaiaExpor
1c7f0 74 36 34 20 28 70 74 72 20 2b 20 31 32 2c 20 6d  t64 (ptr + 12, m
1c800 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
1c810 29 3b 0a 09 09 20 20 20 20 20 20 70 74 72 20 2b  );...      ptr +
1c820 3d 20 32 30 3b 0a 09 09 20 20 7d 0a 09 09 6c 61  = 20;...  }...la
1c830 73 74 5f 78 20 3d 20 78 3b 0a 09 09 6c 61 73 74  st_x = x;...last
1c840 5f 79 20 3d 20 79 3b 0a 09 09 6c 61 73 74 5f 7a  _y = y;...last_z
1c850 20 3d 20 7a 3b 0a 09 20 20 20 20 7d 0a 09 20 20   = z;..    }..  
1c860 2a 70 74 72 20 3d 20 47 41 49 41 5f 4d 41 52 4b  *ptr = GAIA_MARK
1c870 5f 45 4e 44 3b 09 2f 2a 20 45 4e 44 20 73 69 67  _END;./* END sig
1c880 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20 62 72 65  nature */..  bre
1c890 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47  ak;.      case G
1c8a0 41 49 41 5f 50 4f 4c 59 47 4f 4e 3a 0a 09 20 20  AIA_POLYGON:..  
1c8b0 2a 70 74 72 20 3d 20 47 41 49 41 5f 4d 41 52 4b  *ptr = GAIA_MARK
1c8c0 5f 53 54 41 52 54 3b 09 2f 2a 20 53 54 41 52 54  _START;./* START
1c8d0 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20   signature */.. 
1c8e0 20 2a 28 70 74 72 20 2b 20 31 29 20 3d 20 47 41   *(ptr + 1) = GA
1c8f0 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e  IA_LITTLE_ENDIAN
1c900 3b 09 2f 2a 20 62 79 74 65 20 6f 72 64 65 72 69  ;./* byte orderi
1c910 6e 67 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70  ng */..  gaiaExp
1c920 6f 72 74 33 32 20 28 70 74 72 20 2b 20 32 2c 20  ort32 (ptr + 2, 
1c930 67 65 6f 6d 2d 3e 53 72 69 64 2c 20 31 2c 20 65  geom->Srid, 1, e
1c940 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
1c950 74 68 65 20 53 52 49 44 20 2a 2f 0a 09 20 20 67  the SRID */..  g
1c960 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
1c970 20 2b 20 36 2c 20 67 65 6f 6d 2d 3e 4d 69 6e 58   + 6, geom->MinX
1c980 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
1c990 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 69 6e 69  );./* MBR - mini
1c9a0 6d 75 6d 20 58 20 2a 2f 0a 09 20 20 67 61 69 61  mum X */..  gaia
1c9b0 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20  Export64 (ptr + 
1c9c0 31 34 2c 20 67 65 6f 6d 2d 3e 4d 69 6e 59 2c 20  14, geom->MinY, 
1c9d0 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
1c9e0 09 2f 2a 20 4d 42 52 20 2d 20 6d 69 6e 69 6d 75  ./* MBR - minimu
1c9f0 6d 20 59 20 2a 2f 0a 09 20 20 67 61 69 61 45 78  m Y */..  gaiaEx
1ca00 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 32 32  port64 (ptr + 22
1ca10 2c 20 67 65 6f 6d 2d 3e 4d 61 78 58 2c 20 31 2c  , geom->MaxX, 1,
1ca20 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
1ca30 2a 20 4d 42 52 20 2d 20 6d 61 78 69 6d 75 6d 20  * MBR - maximum 
1ca40 58 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f  X */..  gaiaExpo
1ca50 72 74 36 34 20 28 70 74 72 20 2b 20 33 30 2c 20  rt64 (ptr + 30, 
1ca60 67 65 6f 6d 2d 3e 4d 61 78 59 2c 20 31 2c 20 65  geom->MaxY, 1, e
1ca70 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
1ca80 4d 42 52 20 2d 20 6d 61 78 69 6d 75 6d 20 59 20  MBR - maximum Y 
1ca90 2a 2f 0a 09 20 20 2a 28 70 74 72 20 2b 20 33 38  */..  *(ptr + 38
1caa0 29 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 4d 42  ) = GAIA_MARK_MB
1cab0 52 3b 09 2f 2a 20 4d 42 52 20 73 69 67 6e 61 74  R;./* MBR signat
1cac0 75 72 65 20 2a 2f 0a 09 20 20 67 61 69 61 45 78  ure */..  gaiaEx
1cad0 70 6f 72 74 33 32 20 28 70 74 72 20 2b 20 33 39  port32 (ptr + 39
1cae0 2c 20 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45  , GAIA_COMPRESSE
1caf0 44 5f 50 4f 4c 59 47 4f 4e 2c 20 31 2c 20 65 6e  D_POLYGON, 1, en
1cb00 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 63  dian_arch);./* c
1cb10 6c 61 73 73 20 50 4f 4c 59 47 4f 4e 20 2a 2f 0a  lass POLYGON */.
1cb20 09 20 20 67 61 69 61 45 78 70 6f 72 74 33 32 20  .  gaiaExport32 
1cb30 28 70 74 72 20 2b 20 34 33 2c 20 70 6f 6c 79 67  (ptr + 43, polyg
1cb40 2d 3e 4e 75 6d 49 6e 74 65 72 69 6f 72 73 20 2b  ->NumInteriors +
1cb50 20 31 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72   1, 1, endian_ar
1cb60 63 68 29 3b 09 2f 2a 20 23 20 72 69 6e 67 73 20  ch);./* # rings 
1cb70 2a 2f 0a 09 20 20 72 6e 67 20 3d 20 70 6f 6c 79  */..  rng = poly
1cb80 67 2d 3e 45 78 74 65 72 69 6f 72 3b 0a 09 20 20  g->Exterior;..  
1cb90 67 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74  gaiaExport32 (pt
1cba0 72 20 2b 20 34 37 2c 20 72 6e 67 2d 3e 50 6f 69  r + 47, rng->Poi
1cbb0 6e 74 73 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  nts, 1, endian_a
1cbc0 72 63 68 29 3b 09 2f 2a 20 23 20 70 6f 69 6e 74  rch);./* # point
1cbd0 73 20 2d 20 65 78 74 65 72 69 6f 72 20 72 69 6e  s - exterior rin
1cbe0 67 20 2a 2f 0a 09 20 20 70 74 72 20 2b 3d 20 35  g */..  ptr += 5
1cbf0 31 3b 0a 09 20 20 66 6f 72 20 28 69 76 20 3d 20  1;..  for (iv = 
1cc00 30 3b 20 69 76 20 3c 20 72 6e 67 2d 3e 50 6f 69  0; iv < rng->Poi
1cc10 6e 74 73 3b 20 69 76 2b 2b 29 0a 09 20 20 20 20  nts; iv++)..    
1cc20 7b 0a 09 09 67 61 69 61 47 65 74 50 6f 69 6e 74  {...gaiaGetPoint
1cc30 20 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69   (rng->Coords, i
1cc40 76 2c 20 26 78 2c 20 26 79 29 3b 0a 09 09 69 66  v, &x, &y);...if
1cc50 20 28 69 76 20 3d 3d 20 30 20 7c 7c 20 69 76 20   (iv == 0 || iv 
1cc60 3d 3d 20 28 72 6e 67 2d 3e 50 6f 69 6e 74 73 20  == (rng->Points 
1cc70 2d 20 31 29 29 0a 09 09 20 20 7b 0a 09 09 20 20  - 1))...  {...  
1cc80 20 20 20 20 2f 2a 20 66 69 72 73 74 20 61 6e 64      /* first and
1cc90 20 6c 61 73 74 20 76 65 72 74 69 63 65 73 20 61   last vertices a
1cca0 72 65 20 75 6e 63 6f 6d 70 72 65 73 73 65 64 20  re uncompressed 
1ccb0 2a 2f 0a 09 09 20 20 20 20 20 20 67 61 69 61 45  */...      gaiaE
1ccc0 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20 78 2c  xport64 (ptr, x,
1ccd0 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
1cce0 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61 45 78  ;...      gaiaEx
1ccf0 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 38 2c  port64 (ptr + 8,
1cd00 20 79 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72   y, 1, endian_ar
1cd10 63 68 29 3b 0a 09 09 20 20 20 20 20 20 70 74 72  ch);...      ptr
1cd20 20 2b 3d 20 31 36 3b 0a 09 09 20 20 7d 0a 09 09   += 16;...  }...
1cd30 65 6c 73 65 0a 09 09 20 20 7b 0a 09 09 20 20 20  else...  {...   
1cd40 20 20 20 2f 2a 20 63 6f 6d 70 72 65 73 73 69 6e     /* compressin
1cd50 67 20 61 6e 79 20 6f 74 68 65 72 20 69 6e 74 65  g any other inte
1cd60 72 6d 65 64 69 61 74 65 20 76 65 72 74 65 78 20  rmediate vertex 
1cd70 2a 2f 0a 09 09 20 20 20 20 20 20 66 78 20 3d 20  */...      fx = 
1cd80 28 66 6c 6f 61 74 29 20 28 78 20 2d 20 6c 61 73  (float) (x - las
1cd90 74 5f 78 29 3b 0a 09 09 20 20 20 20 20 20 66 79  t_x);...      fy
1cda0 20 3d 20 28 66 6c 6f 61 74 29 20 28 79 20 2d 20   = (float) (y - 
1cdb0 6c 61 73 74 5f 79 29 3b 0a 09 09 20 20 20 20 20  last_y);...     
1cdc0 20 67 61 69 61 45 78 70 6f 72 74 46 33 32 20 28   gaiaExportF32 (
1cdd0 70 74 72 2c 20 66 78 2c 20 31 2c 20 65 6e 64 69  ptr, fx, 1, endi
1cde0 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20 20 20  an_arch);...    
1cdf0 20 20 67 61 69 61 45 78 70 6f 72 74 46 33 32 20    gaiaExportF32 
1ce00 28 70 74 72 20 2b 20 34 2c 20 66 79 2c 20 31 2c  (ptr + 4, fy, 1,
1ce10 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09   endian_arch);..
1ce20 09 20 20 20 20 20 20 70 74 72 20 2b 3d 20 38 3b  .      ptr += 8;
1ce30 0a 09 09 20 20 7d 0a 09 09 6c 61 73 74 5f 78 20  ...  }...last_x 
1ce40 3d 20 78 3b 0a 09 09 6c 61 73 74 5f 79 20 3d 20  = x;...last_y = 
1ce50 79 3b 0a 09 20 20 20 20 7d 0a 09 20 20 66 6f 72  y;..    }..  for
1ce60 20 28 69 62 20 3d 20 30 3b 20 69 62 20 3c 20 70   (ib = 0; ib < p
1ce70 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74 65 72 69 6f  olyg->NumInterio
1ce80 72 73 3b 20 69 62 2b 2b 29 0a 09 20 20 20 20 7b  rs; ib++)..    {
1ce90 0a 09 09 72 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e  ...rng = polyg->
1cea0 49 6e 74 65 72 69 6f 72 73 20 2b 20 69 62 3b 0a  Interiors + ib;.
1ceb0 09 09 67 61 69 61 45 78 70 6f 72 74 33 32 20 28  ..gaiaExport32 (
1cec0 70 74 72 2c 20 72 6e 67 2d 3e 50 6f 69 6e 74 73  ptr, rng->Points
1ced0 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
1cee0 29 3b 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20 2d  );./* # points -
1cef0 20 69 6e 74 65 72 69 6f 72 20 72 69 6e 67 20 2a   interior ring *
1cf00 2f 0a 09 09 70 74 72 20 2b 3d 20 34 3b 0a 09 09  /...ptr += 4;...
1cf10 66 6f 72 20 28 69 76 20 3d 20 30 3b 20 69 76 20  for (iv = 0; iv 
1cf20 3c 20 72 6e 67 2d 3e 50 6f 69 6e 74 73 3b 20 69  < rng->Points; i
1cf30 76 2b 2b 29 0a 09 09 20 20 7b 0a 09 09 20 20 20  v++)...  {...   
1cf40 20 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74 20     gaiaGetPoint 
1cf50 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76  (rng->Coords, iv
1cf60 2c 20 26 78 2c 20 26 79 29 3b 0a 09 09 20 20 20  , &x, &y);...   
1cf70 20 20 20 69 66 20 28 69 76 20 3d 3d 20 30 20 7c     if (iv == 0 |
1cf80 7c 20 69 76 20 3d 3d 20 28 72 6e 67 2d 3e 50 6f  | iv == (rng->Po
1cf90 69 6e 74 73 20 2d 20 31 29 29 0a 09 09 09 7b 0a  ints - 1))....{.
1cfa0 09 09 09 20 20 20 20 2f 2a 20 66 69 72 73 74 20  ...    /* first 
1cfb0 61 6e 64 20 6c 61 73 74 20 76 65 72 74 69 63 65  and last vertice
1cfc0 73 20 61 72 65 20 75 6e 63 6f 6d 70 72 65 73 73  s are uncompress
1cfd0 65 64 20 2a 2f 0a 09 09 09 20 20 20 20 67 61 69  ed */....    gai
1cfe0 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20  aExport64 (ptr, 
1cff0 78 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  x, 1, endian_arc
1d000 68 29 3b 0a 09 09 09 20 20 20 20 67 61 69 61 45  h);....    gaiaE
1d010 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 38  xport64 (ptr + 8
1d020 2c 20 79 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  , y, 1, endian_a
1d030 72 63 68 29 3b 0a 09 09 09 20 20 20 20 70 74 72  rch);....    ptr
1d040 20 2b 3d 20 31 36 3b 0a 09 09 09 7d 0a 09 09 20   += 16;....}... 
1d050 20 20 20 20 20 65 6c 73 65 0a 09 09 09 7b 0a 09       else....{..
1d060 09 09 20 20 20 20 2f 2a 20 63 6f 6d 70 72 65 73  ..    /* compres
1d070 73 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 69  sing any other i
1d080 6e 74 65 72 6d 65 64 69 61 74 65 20 76 65 72 74  ntermediate vert
1d090 65 78 20 2a 2f 0a 09 09 09 20 20 20 20 66 78 20  ex */....    fx 
1d0a0 3d 20 28 66 6c 6f 61 74 29 20 28 78 20 2d 20 6c  = (float) (x - l
1d0b0 61 73 74 5f 78 29 3b 0a 09 09 09 20 20 20 20 66  ast_x);....    f
1d0c0 79 20 3d 20 28 66 6c 6f 61 74 29 20 28 79 20 2d  y = (float) (y -
1d0d0 20 6c 61 73 74 5f 79 29 3b 0a 09 09 09 20 20 20   last_y);....   
1d0e0 20 67 61 69 61 45 78 70 6f 72 74 46 33 32 20 28   gaiaExportF32 (
1d0f0 70 74 72 2c 20 66 78 2c 20 31 2c 20 65 6e 64 69  ptr, fx, 1, endi
1d100 61 6e 5f 61 72 63 68 29 3b 0a 09 09 09 20 20 20  an_arch);....   
1d110 20 67 61 69 61 45 78 70 6f 72 74 46 33 32 20 28   gaiaExportF32 (
1d120 70 74 72 20 2b 20 34 2c 20 66 79 2c 20 31 2c 20  ptr + 4, fy, 1, 
1d130 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09  endian_arch);...
1d140 09 20 20 20 20 70 74 72 20 2b 3d 20 38 3b 0a 09  .    ptr += 8;..
1d150 09 09 7d 0a 09 09 20 20 20 20 20 20 6c 61 73 74  ..}...      last
1d160 5f 78 20 3d 20 78 3b 0a 09 09 20 20 20 20 20 20  _x = x;...      
1d170 6c 61 73 74 5f 79 20 3d 20 79 3b 0a 09 09 20 20  last_y = y;...  
1d180 7d 0a 09 20 20 20 20 7d 0a 09 20 20 2a 70 74 72  }..    }..  *ptr
1d190 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 45 4e 44   = GAIA_MARK_END
1d1a0 3b 09 2f 2a 20 45 4e 44 20 73 69 67 6e 61 74 75  ;./* END signatu
1d1b0 72 65 20 2a 2f 0a 09 20 20 62 72 65 61 6b 3b 0a  re */..  break;.
1d1c0 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
1d1d0 50 4f 4c 59 47 4f 4e 5a 3a 0a 09 20 20 2a 70 74  POLYGONZ:..  *pt
1d1e0 72 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 53 54  r = GAIA_MARK_ST
1d1f0 41 52 54 3b 09 2f 2a 20 53 54 41 52 54 20 73 69  ART;./* START si
1d200 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20 2a 28  gnature */..  *(
1d210 70 74 72 20 2b 20 31 29 20 3d 20 47 41 49 41 5f  ptr + 1) = GAIA_
1d220 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 3b 09 2f  LITTLE_ENDIAN;./
1d230 2a 20 62 79 74 65 20 6f 72 64 65 72 69 6e 67 20  * byte ordering 
1d240 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74  */..  gaiaExport
1d250 33 32 20 28 70 74 72 20 2b 20 32 2c 20 67 65 6f  32 (ptr + 2, geo
1d260 6d 2d 3e 53 72 69 64 2c 20 31 2c 20 65 6e 64 69  m->Srid, 1, endi
1d270 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 74 68 65  an_arch);./* the
1d280 20 53 52 49 44 20 2a 2f 0a 09 20 20 67 61 69 61   SRID */..  gaia
1d290 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20  Export64 (ptr + 
1d2a0 36 2c 20 67 65 6f 6d 2d 3e 4d 69 6e 58 2c 20 31  6, geom->MinX, 1
1d2b0 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
1d2c0 2f 2a 20 4d 42 52 20 2d 20 6d 69 6e 69 6d 75 6d  /* MBR - minimum
1d2d0 20 58 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70   X */..  gaiaExp
1d2e0 6f 72 74 36 34 20 28 70 74 72 20 2b 20 31 34 2c  ort64 (ptr + 14,
1d2f0 20 67 65 6f 6d 2d 3e 4d 69 6e 59 2c 20 31 2c 20   geom->MinY, 1, 
1d300 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a  endian_arch);./*
1d310 20 4d 42 52 20 2d 20 6d 69 6e 69 6d 75 6d 20 59   MBR - minimum Y
1d320 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72   */..  gaiaExpor
1d330 74 36 34 20 28 70 74 72 20 2b 20 32 32 2c 20 67  t64 (ptr + 22, g
1d340 65 6f 6d 2d 3e 4d 61 78 58 2c 20 31 2c 20 65 6e  eom->MaxX, 1, en
1d350 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d  dian_arch);./* M
1d360 42 52 20 2d 20 6d 61 78 69 6d 75 6d 20 58 20 2a  BR - maximum X *
1d370 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 36  /..  gaiaExport6
1d380 34 20 28 70 74 72 20 2b 20 33 30 2c 20 67 65 6f  4 (ptr + 30, geo
1d390 6d 2d 3e 4d 61 78 59 2c 20 31 2c 20 65 6e 64 69  m->MaxY, 1, endi
1d3a0 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52  an_arch);./* MBR
1d3b0 20 2d 20 6d 61 78 69 6d 75 6d 20 59 20 2a 2f 0a   - maximum Y */.
1d3c0 09 20 20 2a 28 70 74 72 20 2b 20 33 38 29 20 3d  .  *(ptr + 38) =
1d3d0 20 47 41 49 41 5f 4d 41 52 4b 5f 4d 42 52 3b 09   GAIA_MARK_MBR;.
1d3e0 2f 2a 20 4d 42 52 20 73 69 67 6e 61 74 75 72 65  /* MBR signature
1d3f0 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72   */..  gaiaExpor
1d400 74 33 32 20 28 70 74 72 20 2b 20 33 39 2c 20 47  t32 (ptr + 39, G
1d410 41 49 41 5f 43 4f 4d 50 52 45 53 53 45 44 5f 50  AIA_COMPRESSED_P
1d420 4f 4c 59 47 4f 4e 5a 2c 20 31 2c 20 65 6e 64 69  OLYGONZ, 1, endi
1d430 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 63 6c 61  an_arch);./* cla
1d440 73 73 20 50 4f 4c 59 47 4f 4e 20 58 59 5a 20 2a  ss POLYGON XYZ *
1d450 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 33  /..  gaiaExport3
1d460 32 20 28 70 74 72 20 2b 20 34 33 2c 20 70 6f 6c  2 (ptr + 43, pol
1d470 79 67 2d 3e 4e 75 6d 49 6e 74 65 72 69 6f 72 73  yg->NumInteriors
1d480 20 2b 20 31 2c 20 31 2c 20 65 6e 64 69 61 6e 5f   + 1, 1, endian_
1d490 61 72 63 68 29 3b 09 2f 2a 20 23 20 72 69 6e 67  arch);./* # ring
1d4a0 73 20 2a 2f 0a 09 20 20 72 6e 67 20 3d 20 70 6f  s */..  rng = po
1d4b0 6c 79 67 2d 3e 45 78 74 65 72 69 6f 72 3b 0a 09  lyg->Exterior;..
1d4c0 20 20 67 61 69 61 45 78 70 6f 72 74 33 32 20 28    gaiaExport32 (
1d4d0 70 74 72 20 2b 20 34 37 2c 20 72 6e 67 2d 3e 50  ptr + 47, rng->P
1d4e0 6f 69 6e 74 73 2c 20 31 2c 20 65 6e 64 69 61 6e  oints, 1, endian
1d4f0 5f 61 72 63 68 29 3b 09 2f 2a 20 23 20 70 6f 69  _arch);./* # poi
1d500 6e 74 73 20 2d 20 65 78 74 65 72 69 6f 72 20 72  nts - exterior r
1d510 69 6e 67 20 2a 2f 0a 09 20 20 70 74 72 20 2b 3d  ing */..  ptr +=
1d520 20 35 31 3b 0a 09 20 20 66 6f 72 20 28 69 76 20   51;..  for (iv 
1d530 3d 20 30 3b 20 69 76 20 3c 20 72 6e 67 2d 3e 50  = 0; iv < rng->P
1d540 6f 69 6e 74 73 3b 20 69 76 2b 2b 29 0a 09 20 20  oints; iv++)..  
1d550 20 20 7b 0a 09 09 67 61 69 61 47 65 74 50 6f 69    {...gaiaGetPoi
1d560 6e 74 58 59 5a 20 28 72 6e 67 2d 3e 43 6f 6f 72  ntXYZ (rng->Coor
1d570 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20  ds, iv, &x, &y, 
1d580 26 7a 29 3b 0a 09 09 69 66 20 28 69 76 20 3d 3d  &z);...if (iv ==
1d590 20 30 20 7c 7c 20 69 76 20 3d 3d 20 28 72 6e 67   0 || iv == (rng
1d5a0 2d 3e 50 6f 69 6e 74 73 20 2d 20 31 29 29 0a 09  ->Points - 1))..
1d5b0 09 20 20 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20  .  {...      /* 
1d5c0 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 76  first and last v
1d5d0 65 72 74 69 63 65 73 20 61 72 65 20 75 6e 63 6f  ertices are unco
1d5e0 6d 70 72 65 73 73 65 64 20 2a 2f 0a 09 09 20 20  mpressed */...  
1d5f0 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 36 34      gaiaExport64
1d600 20 28 70 74 72 2c 20 78 2c 20 31 2c 20 65 6e 64   (ptr, x, 1, end
1d610 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20 20  ian_arch);...   
1d620 20 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20     gaiaExport64 
1d630 28 70 74 72 20 2b 20 38 2c 20 79 2c 20 31 2c 20  (ptr + 8, y, 1, 
1d640 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09  endian_arch);...
1d650 20 20 20 20 20 20 67 61 69 61 45 78 70 6f 72 74        gaiaExport
1d660 36 34 20 28 70 74 72 20 2b 20 31 36 2c 20 7a 2c  64 (ptr + 16, z,
1d670 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
1d680 3b 0a 09 09 20 20 20 20 20 20 70 74 72 20 2b 3d  ;...      ptr +=
1d690 20 32 34 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73   24;...  }...els
1d6a0 65 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  e...  {...      
1d6b0 2f 2a 20 63 6f 6d 70 72 65 73 73 69 6e 67 20 61  /* compressing a
1d6c0 6e 79 20 6f 74 68 65 72 20 69 6e 74 65 72 6d 65  ny other interme
1d6d0 64 69 61 74 65 20 76 65 72 74 65 78 20 2a 2f 0a  diate vertex */.
1d6e0 09 09 20 20 20 20 20 20 66 78 20 3d 20 28 66 6c  ..      fx = (fl
1d6f0 6f 61 74 29 20 28 78 20 2d 20 6c 61 73 74 5f 78  oat) (x - last_x
1d700 29 3b 0a 09 09 20 20 20 20 20 20 66 79 20 3d 20  );...      fy = 
1d710 28 66 6c 6f 61 74 29 20 28 79 20 2d 20 6c 61 73  (float) (y - las
1d720 74 5f 79 29 3b 0a 09 09 20 20 20 20 20 20 66 7a  t_y);...      fz
1d730 20 3d 20 28 66 6c 6f 61 74 29 20 28 7a 20 2d 20   = (float) (z - 
1d740 6c 61 73 74 5f 7a 29 3b 0a 09 09 20 20 20 20 20  last_z);...     
1d750 20 67 61 69 61 45 78 70 6f 72 74 46 33 32 20 28   gaiaExportF32 (
1d760 70 74 72 2c 20 66 78 2c 20 31 2c 20 65 6e 64 69  ptr, fx, 1, endi
1d770 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20 20 20  an_arch);...    
1d780 20 20 67 61 69 61 45 78 70 6f 72 74 46 33 32 20    gaiaExportF32 
1d790 28 70 74 72 20 2b 20 34 2c 20 66 79 2c 20 31 2c  (ptr + 4, fy, 1,
1d7a0 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09   endian_arch);..
1d7b0 09 20 20 20 20 20 20 67 61 69 61 45 78 70 6f 72  .      gaiaExpor
1d7c0 74 46 33 32 20 28 70 74 72 20 2b 20 38 2c 20 66  tF32 (ptr + 8, f
1d7d0 7a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  z, 1, endian_arc
1d7e0 68 29 3b 0a 09 09 20 20 20 20 20 20 70 74 72 20  h);...      ptr 
1d7f0 2b 3d 20 31 32 3b 0a 09 09 20 20 7d 0a 09 09 6c  += 12;...  }...l
1d800 61 73 74 5f 78 20 3d 20 78 3b 0a 09 09 6c 61 73  ast_x = x;...las
1d810 74 5f 79 20 3d 20 79 3b 0a 09 09 6c 61 73 74 5f  t_y = y;...last_
1d820 7a 20 3d 20 7a 3b 0a 09 20 20 20 20 7d 0a 09 20  z = z;..    }.. 
1d830 20 66 6f 72 20 28 69 62 20 3d 20 30 3b 20 69 62   for (ib = 0; ib
1d840 20 3c 20 70 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74   < polyg->NumInt
1d850 65 72 69 6f 72 73 3b 20 69 62 2b 2b 29 0a 09 20  eriors; ib++).. 
1d860 20 20 20 7b 0a 09 09 72 6e 67 20 3d 20 70 6f 6c     {...rng = pol
1d870 79 67 2d 3e 49 6e 74 65 72 69 6f 72 73 20 2b 20  yg->Interiors + 
1d880 69 62 3b 0a 09 09 67 61 69 61 45 78 70 6f 72 74  ib;...gaiaExport
1d890 33 32 20 28 70 74 72 2c 20 72 6e 67 2d 3e 50 6f  32 (ptr, rng->Po
1d8a0 69 6e 74 73 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  ints, 1, endian_
1d8b0 61 72 63 68 29 3b 09 2f 2a 20 23 20 70 6f 69 6e  arch);./* # poin
1d8c0 74 73 20 2d 20 69 6e 74 65 72 69 6f 72 20 72 69  ts - interior ri
1d8d0 6e 67 20 2a 2f 0a 09 09 70 74 72 20 2b 3d 20 34  ng */...ptr += 4
1d8e0 3b 0a 09 09 66 6f 72 20 28 69 76 20 3d 20 30 3b  ;...for (iv = 0;
1d8f0 20 69 76 20 3c 20 72 6e 67 2d 3e 50 6f 69 6e 74   iv < rng->Point
1d900 73 3b 20 69 76 2b 2b 29 0a 09 09 20 20 7b 0a 09  s; iv++)...  {..
1d910 09 20 20 20 20 20 20 67 61 69 61 47 65 74 50 6f  .      gaiaGetPo
1d920 69 6e 74 58 59 5a 20 28 72 6e 67 2d 3e 43 6f 6f  intXYZ (rng->Coo
1d930 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c  rds, iv, &x, &y,
1d940 20 26 7a 29 3b 0a 09 09 20 20 20 20 20 20 69 66   &z);...      if
1d950 20 28 69 76 20 3d 3d 20 30 20 7c 7c 20 69 76 20   (iv == 0 || iv 
1d960 3d 3d 20 28 72 6e 67 2d 3e 50 6f 69 6e 74 73 20  == (rng->Points 
1d970 2d 20 31 29 29 0a 09 09 09 7b 0a 09 09 09 20 20  - 1))....{....  
1d980 20 20 2f 2a 20 66 69 72 73 74 20 61 6e 64 20 6c    /* first and l
1d990 61 73 74 20 76 65 72 74 69 63 65 73 20 61 72 65  ast vertices are
1d9a0 20 75 6e 63 6f 6d 70 72 65 73 73 65 64 20 2a 2f   uncompressed */
1d9b0 0a 09 09 09 20 20 20 20 67 61 69 61 45 78 70 6f  ....    gaiaExpo
1d9c0 72 74 36 34 20 28 70 74 72 2c 20 78 2c 20 31 2c  rt64 (ptr, x, 1,
1d9d0 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09   endian_arch);..
1d9e0 09 09 20 20 20 20 67 61 69 61 45 78 70 6f 72 74  ..    gaiaExport
1d9f0 36 34 20 28 70 74 72 20 2b 20 38 2c 20 79 2c 20  64 (ptr + 8, y, 
1da00 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
1da10 0a 09 09 09 20 20 20 20 67 61 69 61 45 78 70 6f  ....    gaiaExpo
1da20 72 74 36 34 20 28 70 74 72 20 2b 20 31 36 2c 20  rt64 (ptr + 16, 
1da30 7a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  z, 1, endian_arc
1da40 68 29 3b 0a 09 09 09 20 20 20 20 70 74 72 20 2b  h);....    ptr +
1da50 3d 20 32 34 3b 0a 09 09 09 7d 0a 09 09 20 20 20  = 24;....}...   
1da60 20 20 20 65 6c 73 65 0a 09 09 09 7b 0a 09 09 09     else....{....
1da70 20 20 20 20 2f 2a 20 63 6f 6d 70 72 65 73 73 69      /* compressi
1da80 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 69 6e 74  ng any other int
1da90 65 72 6d 65 64 69 61 74 65 20 76 65 72 74 65 78  ermediate vertex
1daa0 20 2a 2f 0a 09 09 09 20 20 20 20 66 78 20 3d 20   */....    fx = 
1dab0 28 66 6c 6f 61 74 29 20 28 78 20 2d 20 6c 61 73  (float) (x - las
1dac0 74 5f 78 29 3b 0a 09 09 09 20 20 20 20 66 79 20  t_x);....    fy 
1dad0 3d 20 28 66 6c 6f 61 74 29 20 28 79 20 2d 20 6c  = (float) (y - l
1dae0 61 73 74 5f 79 29 3b 0a 09 09 09 20 20 20 20 66  ast_y);....    f
1daf0 7a 20 3d 20 28 66 6c 6f 61 74 29 20 28 7a 20 2d  z = (float) (z -
1db00 20 6c 61 73 74 5f 7a 29 3b 0a 09 09 09 20 20 20   last_z);....   
1db10 20 67 61 69 61 45 78 70 6f 72 74 46 33 32 20 28   gaiaExportF32 (
1db20 70 74 72 2c 20 66 78 2c 20 31 2c 20 65 6e 64 69  ptr, fx, 1, endi
1db30 61 6e 5f 61 72 63 68 29 3b 0a 09 09 09 20 20 20  an_arch);....   
1db40 20 67 61 69 61 45 78 70 6f 72 74 46 33 32 20 28   gaiaExportF32 (
1db50 70 74 72 20 2b 20 34 2c 20 66 79 2c 20 31 2c 20  ptr + 4, fy, 1, 
1db60 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09  endian_arch);...
1db70 09 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 46  .    gaiaExportF
1db80 33 32 20 28 70 74 72 20 2b 20 38 2c 20 66 7a 2c  32 (ptr + 8, fz,
1db90 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
1dba0 3b 0a 09 09 09 20 20 20 20 70 74 72 20 2b 3d 20  ;....    ptr += 
1dbb0 31 32 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20  12;....}...     
1dbc0 20 6c 61 73 74 5f 78 20 3d 20 78 3b 0a 09 09 20   last_x = x;... 
1dbd0 20 20 20 20 20 6c 61 73 74 5f 79 20 3d 20 79 3b       last_y = y;
1dbe0 0a 09 09 20 20 20 20 20 20 6c 61 73 74 5f 7a 20  ...      last_z 
1dbf0 3d 20 7a 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20  = z;...  }..    
1dc00 7d 0a 09 20 20 2a 70 74 72 20 3d 20 47 41 49 41  }..  *ptr = GAIA
1dc10 5f 4d 41 52 4b 5f 45 4e 44 3b 09 2f 2a 20 45 4e  _MARK_END;./* EN
1dc20 44 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09  D signature */..
1dc30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
1dc40 61 73 65 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e  ase GAIA_POLYGON
1dc50 4d 3a 0a 09 20 20 2a 70 74 72 20 3d 20 47 41 49  M:..  *ptr = GAI
1dc60 41 5f 4d 41 52 4b 5f 53 54 41 52 54 3b 09 2f 2a  A_MARK_START;./*
1dc70 20 53 54 41 52 54 20 73 69 67 6e 61 74 75 72 65   START signature
1dc80 20 2a 2f 0a 09 20 20 2a 28 70 74 72 20 2b 20 31   */..  *(ptr + 1
1dc90 29 20 3d 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f  ) = GAIA_LITTLE_
1dca0 45 4e 44 49 41 4e 3b 09 2f 2a 20 62 79 74 65 20  ENDIAN;./* byte 
1dcb0 6f 72 64 65 72 69 6e 67 20 2a 2f 0a 09 20 20 67  ordering */..  g
1dcc0 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72  aiaExport32 (ptr
1dcd0 20 2b 20 32 2c 20 67 65 6f 6d 2d 3e 53 72 69 64   + 2, geom->Srid
1dce0 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
1dcf0 29 3b 09 2f 2a 20 74 68 65 20 53 52 49 44 20 2a  );./* the SRID *
1dd00 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 36  /..  gaiaExport6
1dd10 34 20 28 70 74 72 20 2b 20 36 2c 20 67 65 6f 6d  4 (ptr + 6, geom
1dd20 2d 3e 4d 69 6e 58 2c 20 31 2c 20 65 6e 64 69 61  ->MinX, 1, endia
1dd30 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20  n_arch);./* MBR 
1dd40 2d 20 6d 69 6e 69 6d 75 6d 20 58 20 2a 2f 0a 09  - minimum X */..
1dd50 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28    gaiaExport64 (
1dd60 70 74 72 20 2b 20 31 34 2c 20 67 65 6f 6d 2d 3e  ptr + 14, geom->
1dd70 4d 69 6e 59 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  MinY, 1, endian_
1dd80 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20  arch);./* MBR - 
1dd90 6d 69 6e 69 6d 75 6d 20 59 20 2a 2f 0a 09 20 20  minimum Y */..  
1dda0 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74  gaiaExport64 (pt
1ddb0 72 20 2b 20 32 32 2c 20 67 65 6f 6d 2d 3e 4d 61  r + 22, geom->Ma
1ddc0 78 58 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72  xX, 1, endian_ar
1ddd0 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 61  ch);./* MBR - ma
1dde0 78 69 6d 75 6d 20 58 20 2a 2f 0a 09 20 20 67 61  ximum X */..  ga
1ddf0 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20  iaExport64 (ptr 
1de00 2b 20 33 30 2c 20 67 65 6f 6d 2d 3e 4d 61 78 59  + 30, geom->MaxY
1de10 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
1de20 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 61 78 69  );./* MBR - maxi
1de30 6d 75 6d 20 59 20 2a 2f 0a 09 20 20 2a 28 70 74  mum Y */..  *(pt
1de40 72 20 2b 20 33 38 29 20 3d 20 47 41 49 41 5f 4d  r + 38) = GAIA_M
1de50 41 52 4b 5f 4d 42 52 3b 09 2f 2a 20 4d 42 52 20  ARK_MBR;./* MBR 
1de60 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20  signature */..  
1de70 67 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74  gaiaExport32 (pt
1de80 72 20 2b 20 33 39 2c 20 47 41 49 41 5f 43 4f 4d  r + 39, GAIA_COM
1de90 50 52 45 53 53 45 44 5f 50 4f 4c 59 47 4f 4e 4d  PRESSED_POLYGONM
1dea0 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
1deb0 29 3b 09 2f 2a 20 63 6c 61 73 73 20 50 4f 4c 59  );./* class POLY
1dec0 47 4f 4e 20 58 59 4d 20 2a 2f 0a 09 20 20 67 61  GON XYM */..  ga
1ded0 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 20  iaExport32 (ptr 
1dee0 2b 20 34 33 2c 20 70 6f 6c 79 67 2d 3e 4e 75 6d  + 43, polyg->Num
1def0 49 6e 74 65 72 69 6f 72 73 20 2b 20 31 2c 20 31  Interiors + 1, 1
1df00 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
1df10 2f 2a 20 23 20 72 69 6e 67 73 20 2a 2f 0a 09 20  /* # rings */.. 
1df20 20 72 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e 45 78   rng = polyg->Ex
1df30 74 65 72 69 6f 72 3b 0a 09 20 20 67 61 69 61 45  terior;..  gaiaE
1df40 78 70 6f 72 74 33 32 20 28 70 74 72 20 2b 20 34  xport32 (ptr + 4
1df50 37 2c 20 72 6e 67 2d 3e 50 6f 69 6e 74 73 2c 20  7, rng->Points, 
1df60 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
1df70 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20 2d 20 65  ./* # points - e
1df80 78 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a  xterior ring */.
1df90 09 20 20 70 74 72 20 2b 3d 20 35 31 3b 0a 09 20  .  ptr += 51;.. 
1dfa0 20 66 6f 72 20 28 69 76 20 3d 20 30 3b 20 69 76   for (iv = 0; iv
1dfb0 20 3c 20 72 6e 67 2d 3e 50 6f 69 6e 74 73 3b 20   < rng->Points; 
1dfc0 69 76 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09 67  iv++)..    {...g
1dfd0 61 69 61 47 65 74 50 6f 69 6e 74 58 59 4d 20 28  aiaGetPointXYM (
1dfe0 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c  rng->Coords, iv,
1dff0 20 26 78 2c 20 26 79 2c 20 26 6d 29 3b 0a 09 09   &x, &y, &m);...
1e000 69 66 20 28 69 76 20 3d 3d 20 30 20 7c 7c 20 69  if (iv == 0 || i
1e010 76 20 3d 3d 20 28 72 6e 67 2d 3e 50 6f 69 6e 74  v == (rng->Point
1e020 73 20 2d 20 31 29 29 0a 09 09 20 20 7b 0a 09 09  s - 1))...  {...
1e030 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 61        /* first a
1e040 6e 64 20 6c 61 73 74 20 76 65 72 74 69 63 65 73  nd last vertices
1e050 20 61 72 65 20 75 6e 63 6f 6d 70 72 65 73 73 65   are uncompresse
1e060 64 20 2a 2f 0a 09 09 20 20 20 20 20 20 67 61 69  d */...      gai
1e070 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20  aExport64 (ptr, 
1e080 78 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  x, 1, endian_arc
1e090 68 29 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61  h);...      gaia
1e0a0 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20  Export64 (ptr + 
1e0b0 38 2c 20 79 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  8, y, 1, endian_
1e0c0 61 72 63 68 29 3b 0a 09 09 20 20 20 20 20 20 67  arch);...      g
1e0d0 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
1e0e0 20 2b 20 31 36 2c 20 6d 2c 20 31 2c 20 65 6e 64   + 16, m, 1, end
1e0f0 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20 20  ian_arch);...   
1e100 20 20 20 70 74 72 20 2b 3d 20 32 34 3b 0a 09 09     ptr += 24;...
1e110 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 20 20 7b    }...else...  {
1e120 0a 09 09 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70  ...      /* comp
1e130 72 65 73 73 69 6e 67 20 61 6e 79 20 6f 74 68 65  ressing any othe
1e140 72 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 76  r intermediate v
1e150 65 72 74 65 78 20 2a 2f 0a 09 09 20 20 20 20 20  ertex */...     
1e160 20 66 78 20 3d 20 28 66 6c 6f 61 74 29 20 28 78   fx = (float) (x
1e170 20 2d 20 6c 61 73 74 5f 78 29 3b 0a 09 09 20 20   - last_x);...  
1e180 20 20 20 20 66 79 20 3d 20 28 66 6c 6f 61 74 29      fy = (float)
1e190 20 28 79 20 2d 20 6c 61 73 74 5f 79 29 3b 0a 09   (y - last_y);..
1e1a0 09 20 20 20 20 20 20 67 61 69 61 45 78 70 6f 72  .      gaiaExpor
1e1b0 74 46 33 32 20 28 70 74 72 2c 20 66 78 2c 20 31  tF32 (ptr, fx, 1
1e1c0 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  , endian_arch);.
1e1d0 09 09 20 20 20 20 20 20 67 61 69 61 45 78 70 6f  ..      gaiaExpo
1e1e0 72 74 46 33 32 20 28 70 74 72 20 2b 20 34 2c 20  rtF32 (ptr + 4, 
1e1f0 66 79 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72  fy, 1, endian_ar
1e200 63 68 29 3b 0a 09 09 20 20 20 20 20 20 67 61 69  ch);...      gai
1e210 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b  aExport64 (ptr +
1e220 20 38 2c 20 6d 2c 20 31 2c 20 65 6e 64 69 61 6e   8, m, 1, endian
1e230 5f 61 72 63 68 29 3b 0a 09 09 20 20 20 20 20 20  _arch);...      
1e240 70 74 72 20 2b 3d 20 31 36 3b 0a 09 09 20 20 7d  ptr += 16;...  }
1e250 0a 09 09 6c 61 73 74 5f 78 20 3d 20 78 3b 0a 09  ...last_x = x;..
1e260 09 6c 61 73 74 5f 79 20 3d 20 79 3b 0a 09 20 20  .last_y = y;..  
1e270 20 20 7d 0a 09 20 20 66 6f 72 20 28 69 62 20 3d    }..  for (ib =
1e280 20 30 3b 20 69 62 20 3c 20 70 6f 6c 79 67 2d 3e   0; ib < polyg->
1e290 4e 75 6d 49 6e 74 65 72 69 6f 72 73 3b 20 69 62  NumInteriors; ib
1e2a0 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09 72 6e 67  ++)..    {...rng
1e2b0 20 3d 20 70 6f 6c 79 67 2d 3e 49 6e 74 65 72 69   = polyg->Interi
1e2c0 6f 72 73 20 2b 20 69 62 3b 0a 09 09 67 61 69 61  ors + ib;...gaia
1e2d0 45 78 70 6f 72 74 33 32 20 28 70 74 72 2c 20 72  Export32 (ptr, r
1e2e0 6e 67 2d 3e 50 6f 69 6e 74 73 2c 20 31 2c 20 65  ng->Points, 1, e
1e2f0 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
1e300 23 20 70 6f 69 6e 74 73 20 2d 20 69 6e 74 65 72  # points - inter
1e310 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 09 70 74  ior ring */...pt
1e320 72 20 2b 3d 20 34 3b 0a 09 09 66 6f 72 20 28 69  r += 4;...for (i
1e330 76 20 3d 20 30 3b 20 69 76 20 3c 20 72 6e 67 2d  v = 0; iv < rng-
1e340 3e 50 6f 69 6e 74 73 3b 20 69 76 2b 2b 29 0a 09  >Points; iv++)..
1e350 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61 69  .  {...      gai
1e360 61 47 65 74 50 6f 69 6e 74 58 59 4d 20 28 72 6e  aGetPointXYM (rn
1e370 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26  g->Coords, iv, &
1e380 78 2c 20 26 79 2c 20 26 6d 29 3b 0a 09 09 20 20  x, &y, &m);...  
1e390 20 20 20 20 69 66 20 28 69 76 20 3d 3d 20 30 20      if (iv == 0 
1e3a0 7c 7c 20 69 76 20 3d 3d 20 28 72 6e 67 2d 3e 50  || iv == (rng->P
1e3b0 6f 69 6e 74 73 20 2d 20 31 29 29 0a 09 09 09 7b  oints - 1))....{
1e3c0 0a 09 09 09 20 20 20 20 2f 2a 20 66 69 72 73 74  ....    /* first
1e3d0 20 61 6e 64 20 6c 61 73 74 20 76 65 72 74 69 63   and last vertic
1e3e0 65 73 20 61 72 65 20 75 6e 63 6f 6d 70 72 65 73  es are uncompres
1e3f0 73 65 64 20 2a 2f 0a 09 09 09 20 20 20 20 67 61  sed */....    ga
1e400 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c  iaExport64 (ptr,
1e410 20 78 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72   x, 1, endian_ar
1e420 63 68 29 3b 0a 09 09 09 20 20 20 20 67 61 69 61  ch);....    gaia
1e430 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20  Export64 (ptr + 
1e440 38 2c 20 79 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  8, y, 1, endian_
1e450 61 72 63 68 29 3b 0a 09 09 09 20 20 20 20 67 61  arch);....    ga
1e460 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20  iaExport64 (ptr 
1e470 2b 20 31 36 2c 20 6d 2c 20 31 2c 20 65 6e 64 69  + 16, m, 1, endi
1e480 61 6e 5f 61 72 63 68 29 3b 0a 09 09 09 20 20 20  an_arch);....   
1e490 20 70 74 72 20 2b 3d 20 32 34 3b 0a 09 09 09 7d   ptr += 24;....}
1e4a0 0a 09 09 20 20 20 20 20 20 65 6c 73 65 0a 09 09  ...      else...
1e4b0 09 7b 0a 09 09 09 20 20 20 20 2f 2a 20 63 6f 6d  .{....    /* com
1e4c0 70 72 65 73 73 69 6e 67 20 61 6e 79 20 6f 74 68  pressing any oth
1e4d0 65 72 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  er intermediate 
1e4e0 76 65 72 74 65 78 20 2a 2f 0a 09 09 09 20 20 20  vertex */....   
1e4f0 20 66 78 20 3d 20 28 66 6c 6f 61 74 29 20 28 78   fx = (float) (x
1e500 20 2d 20 6c 61 73 74 5f 78 29 3b 0a 09 09 09 20   - last_x);.... 
1e510 20 20 20 66 79 20 3d 20 28 66 6c 6f 61 74 29 20     fy = (float) 
1e520 28 79 20 2d 20 6c 61 73 74 5f 79 29 3b 0a 09 09  (y - last_y);...
1e530 09 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 46  .    gaiaExportF
1e540 33 32 20 28 70 74 72 2c 20 66 78 2c 20 31 2c 20  32 (ptr, fx, 1, 
1e550 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09  endian_arch);...
1e560 09 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 46  .    gaiaExportF
1e570 33 32 20 28 70 74 72 20 2b 20 34 2c 20 66 79 2c  32 (ptr + 4, fy,
1e580 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
1e590 3b 0a 09 09 09 20 20 20 20 67 61 69 61 45 78 70  ;....    gaiaExp
1e5a0 6f 72 74 36 34 20 28 70 74 72 20 2b 20 38 2c 20  ort64 (ptr + 8, 
1e5b0 6d 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  m, 1, endian_arc
1e5c0 68 29 3b 0a 09 09 09 20 20 20 20 70 74 72 20 2b  h);....    ptr +
1e5d0 3d 20 31 36 3b 0a 09 09 09 7d 0a 09 09 20 20 20  = 16;....}...   
1e5e0 20 20 20 6c 61 73 74 5f 78 20 3d 20 78 3b 0a 09     last_x = x;..
1e5f0 09 20 20 20 20 20 20 6c 61 73 74 5f 79 20 3d 20  .      last_y = 
1e600 79 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a  y;...  }..    }.
1e610 09 20 20 2a 70 74 72 20 3d 20 47 41 49 41 5f 4d  .  *ptr = GAIA_M
1e620 41 52 4b 5f 45 4e 44 3b 09 2f 2a 20 45 4e 44 20  ARK_END;./* END 
1e630 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20  signature */..  
1e640 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
1e650 65 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 4d  e GAIA_POLYGONZM
1e660 3a 0a 09 20 20 2a 70 74 72 20 3d 20 47 41 49 41  :..  *ptr = GAIA
1e670 5f 4d 41 52 4b 5f 53 54 41 52 54 3b 09 2f 2a 20  _MARK_START;./* 
1e680 53 54 41 52 54 20 73 69 67 6e 61 74 75 72 65 20  START signature 
1e690 2a 2f 0a 09 20 20 2a 28 70 74 72 20 2b 20 31 29  */..  *(ptr + 1)
1e6a0 20 3d 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45   = GAIA_LITTLE_E
1e6b0 4e 44 49 41 4e 3b 09 2f 2a 20 62 79 74 65 20 6f  NDIAN;./* byte o
1e6c0 72 64 65 72 69 6e 67 20 2a 2f 0a 09 20 20 67 61  rdering */..  ga
1e6d0 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 20  iaExport32 (ptr 
1e6e0 2b 20 32 2c 20 67 65 6f 6d 2d 3e 53 72 69 64 2c  + 2, geom->Srid,
1e6f0 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
1e700 3b 09 2f 2a 20 74 68 65 20 53 52 49 44 20 2a 2f  ;./* the SRID */
1e710 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 36 34  ..  gaiaExport64
1e720 20 28 70 74 72 20 2b 20 36 2c 20 67 65 6f 6d 2d   (ptr + 6, geom-
1e730 3e 4d 69 6e 58 2c 20 31 2c 20 65 6e 64 69 61 6e  >MinX, 1, endian
1e740 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d  _arch);./* MBR -
1e750 20 6d 69 6e 69 6d 75 6d 20 58 20 2a 2f 0a 09 20   minimum X */.. 
1e760 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70   gaiaExport64 (p
1e770 74 72 20 2b 20 31 34 2c 20 67 65 6f 6d 2d 3e 4d  tr + 14, geom->M
1e780 69 6e 59 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  inY, 1, endian_a
1e790 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d  rch);./* MBR - m
1e7a0 69 6e 69 6d 75 6d 20 59 20 2a 2f 0a 09 20 20 67  inimum Y */..  g
1e7b0 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
1e7c0 20 2b 20 32 32 2c 20 67 65 6f 6d 2d 3e 4d 61 78   + 22, geom->Max
1e7d0 58 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  X, 1, endian_arc
1e7e0 68 29 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 61 78  h);./* MBR - max
1e7f0 69 6d 75 6d 20 58 20 2a 2f 0a 09 20 20 67 61 69  imum X */..  gai
1e800 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b  aExport64 (ptr +
1e810 20 33 30 2c 20 67 65 6f 6d 2d 3e 4d 61 78 59 2c   30, geom->MaxY,
1e820 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
1e830 3b 09 2f 2a 20 4d 42 52 20 2d 20 6d 61 78 69 6d  ;./* MBR - maxim
1e840 75 6d 20 59 20 2a 2f 0a 09 20 20 2a 28 70 74 72  um Y */..  *(ptr
1e850 20 2b 20 33 38 29 20 3d 20 47 41 49 41 5f 4d 41   + 38) = GAIA_MA
1e860 52 4b 5f 4d 42 52 3b 09 2f 2a 20 4d 42 52 20 73  RK_MBR;./* MBR s
1e870 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20 67  ignature */..  g
1e880 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72  aiaExport32 (ptr
1e890 20 2b 20 33 39 2c 20 47 41 49 41 5f 43 4f 4d 50   + 39, GAIA_COMP
1e8a0 52 45 53 53 45 44 5f 50 4f 4c 59 47 4f 4e 5a 4d  RESSED_POLYGONZM
1e8b0 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
1e8c0 29 3b 09 2f 2a 20 63 6c 61 73 73 20 50 4f 4c 59  );./* class POLY
1e8d0 47 4f 4e 20 2a 2f 0a 09 20 20 67 61 69 61 45 78  GON */..  gaiaEx
1e8e0 70 6f 72 74 33 32 20 28 70 74 72 20 2b 20 34 33  port32 (ptr + 43
1e8f0 2c 20 70 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74 65  , polyg->NumInte
1e900 72 69 6f 72 73 20 2b 20 31 2c 20 31 2c 20 65 6e  riors + 1, 1, en
1e910 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 23  dian_arch);./* #
1e920 20 72 69 6e 67 73 20 2a 2f 0a 09 20 20 72 6e 67   rings */..  rng
1e930 20 3d 20 70 6f 6c 79 67 2d 3e 45 78 74 65 72 69   = polyg->Exteri
1e940 6f 72 3b 0a 09 20 20 67 61 69 61 45 78 70 6f 72  or;..  gaiaExpor
1e950 74 33 32 20 28 70 74 72 20 2b 20 34 37 2c 20 72  t32 (ptr + 47, r
1e960 6e 67 2d 3e 50 6f 69 6e 74 73 2c 20 31 2c 20 65  ng->Points, 1, e
1e970 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
1e980 23 20 70 6f 69 6e 74 73 20 2d 20 65 78 74 65 72  # points - exter
1e990 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 20 20 70  ior ring */..  p
1e9a0 74 72 20 2b 3d 20 35 31 3b 0a 09 20 20 66 6f 72  tr += 51;..  for
1e9b0 20 28 69 76 20 3d 20 30 3b 20 69 76 20 3c 20 72   (iv = 0; iv < r
1e9c0 6e 67 2d 3e 50 6f 69 6e 74 73 3b 20 69 76 2b 2b  ng->Points; iv++
1e9d0 29 0a 09 20 20 20 20 7b 0a 09 09 67 61 69 61 47  )..    {...gaiaG
1e9e0 65 74 50 6f 69 6e 74 58 59 5a 4d 20 28 72 6e 67  etPointXYZM (rng
1e9f0 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78  ->Coords, iv, &x
1ea00 2c 20 26 79 2c 20 26 7a 2c 20 26 6d 29 3b 0a 09  , &y, &z, &m);..
1ea10 09 69 66 20 28 69 76 20 3d 3d 20 30 20 7c 7c 20  .if (iv == 0 || 
1ea20 69 76 20 3d 3d 20 28 72 6e 67 2d 3e 50 6f 69 6e  iv == (rng->Poin
1ea30 74 73 20 2d 20 31 29 29 0a 09 09 20 20 7b 0a 09  ts - 1))...  {..
1ea40 09 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20  .      /* first 
1ea50 61 6e 64 20 6c 61 73 74 20 76 65 72 74 69 63 65  and last vertice
1ea60 73 20 61 72 65 20 75 6e 63 6f 6d 70 72 65 73 73  s are uncompress
1ea70 65 64 20 2a 2f 0a 09 09 20 20 20 20 20 20 67 61  ed */...      ga
1ea80 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c  iaExport64 (ptr,
1ea90 20 78 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72   x, 1, endian_ar
1eaa0 63 68 29 3b 0a 09 09 20 20 20 20 20 20 67 61 69  ch);...      gai
1eab0 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b  aExport64 (ptr +
1eac0 20 38 2c 20 79 2c 20 31 2c 20 65 6e 64 69 61 6e   8, y, 1, endian
1ead0 5f 61 72 63 68 29 3b 0a 09 09 20 20 20 20 20 20  _arch);...      
1eae0 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74  gaiaExport64 (pt
1eaf0 72 20 2b 20 31 36 2c 20 7a 2c 20 31 2c 20 65 6e  r + 16, z, 1, en
1eb00 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20  dian_arch);...  
1eb10 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 36 34      gaiaExport64
1eb20 20 28 70 74 72 20 2b 20 32 34 2c 20 6d 2c 20 31   (ptr + 24, m, 1
1eb30 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  , endian_arch);.
1eb40 09 09 20 20 20 20 20 20 70 74 72 20 2b 3d 20 33  ..      ptr += 3
1eb50 32 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a  2;...  }...else.
1eb60 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 2f 2a  ..  {...      /*
1eb70 20 63 6f 6d 70 72 65 73 73 69 6e 67 20 61 6e 79   compressing any
1eb80 20 6f 74 68 65 72 20 69 6e 74 65 72 6d 65 64 69   other intermedi
1eb90 61 74 65 20 76 65 72 74 65 78 20 2a 2f 0a 09 09  ate vertex */...
1eba0 20 20 20 20 20 20 66 78 20 3d 20 28 66 6c 6f 61        fx = (floa
1ebb0 74 29 20 28 78 20 2d 20 6c 61 73 74 5f 78 29 3b  t) (x - last_x);
1ebc0 0a 09 09 20 20 20 20 20 20 66 79 20 3d 20 28 66  ...      fy = (f
1ebd0 6c 6f 61 74 29 20 28 79 20 2d 20 6c 61 73 74 5f  loat) (y - last_
1ebe0 79 29 3b 0a 09 09 20 20 20 20 20 20 66 7a 20 3d  y);...      fz =
1ebf0 20 28 66 6c 6f 61 74 29 20 28 7a 20 2d 20 6c 61   (float) (z - la
1ec00 73 74 5f 7a 29 3b 0a 09 09 20 20 20 20 20 20 67  st_z);...      g
1ec10 61 69 61 45 78 70 6f 72 74 46 33 32 20 28 70 74  aiaExportF32 (pt
1ec20 72 2c 20 66 78 2c 20 31 2c 20 65 6e 64 69 61 6e  r, fx, 1, endian
1ec30 5f 61 72 63 68 29 3b 0a 09 09 20 20 20 20 20 20  _arch);...      
1ec40 67 61 69 61 45 78 70 6f 72 74 46 33 32 20 28 70  gaiaExportF32 (p
1ec50 74 72 20 2b 20 34 2c 20 66 79 2c 20 31 2c 20 65  tr + 4, fy, 1, e
1ec60 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20  ndian_arch);... 
1ec70 20 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 46       gaiaExportF
1ec80 33 32 20 28 70 74 72 20 2b 20 38 2c 20 66 7a 2c  32 (ptr + 8, fz,
1ec90 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
1eca0 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61 45 78  ;...      gaiaEx
1ecb0 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 31 32  port64 (ptr + 12
1ecc0 2c 20 6d 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  , m, 1, endian_a
1ecd0 72 63 68 29 3b 0a 09 09 20 20 20 20 20 20 70 74  rch);...      pt
1ece0 72 20 2b 3d 20 32 30 3b 0a 09 09 20 20 7d 0a 09  r += 20;...  }..
1ecf0 09 6c 61 73 74 5f 78 20 3d 20 78 3b 0a 09 09 6c  .last_x = x;...l
1ed00 61 73 74 5f 79 20 3d 20 79 3b 0a 09 09 6c 61 73  ast_y = y;...las
1ed10 74 5f 7a 20 3d 20 7a 3b 0a 09 20 20 20 20 7d 0a  t_z = z;..    }.
1ed20 09 20 20 66 6f 72 20 28 69 62 20 3d 20 30 3b 20  .  for (ib = 0; 
1ed30 69 62 20 3c 20 70 6f 6c 79 67 2d 3e 4e 75 6d 49  ib < polyg->NumI
1ed40 6e 74 65 72 69 6f 72 73 3b 20 69 62 2b 2b 29 0a  nteriors; ib++).
1ed50 09 20 20 20 20 7b 0a 09 09 72 6e 67 20 3d 20 70  .    {...rng = p
1ed60 6f 6c 79 67 2d 3e 49 6e 74 65 72 69 6f 72 73 20  olyg->Interiors 
1ed70 2b 20 69 62 3b 0a 09 09 67 61 69 61 45 78 70 6f  + ib;...gaiaExpo
1ed80 72 74 33 32 20 28 70 74 72 2c 20 72 6e 67 2d 3e  rt32 (ptr, rng->
1ed90 50 6f 69 6e 74 73 2c 20 31 2c 20 65 6e 64 69 61  Points, 1, endia
1eda0 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 23 20 70 6f  n_arch);./* # po
1edb0 69 6e 74 73 20 2d 20 69 6e 74 65 72 69 6f 72 20  ints - interior 
1edc0 72 69 6e 67 20 2a 2f 0a 09 09 70 74 72 20 2b 3d  ring */...ptr +=
1edd0 20 34 3b 0a 09 09 66 6f 72 20 28 69 76 20 3d 20   4;...for (iv = 
1ede0 30 3b 20 69 76 20 3c 20 72 6e 67 2d 3e 50 6f 69  0; iv < rng->Poi
1edf0 6e 74 73 3b 20 69 76 2b 2b 29 0a 09 09 20 20 7b  nts; iv++)...  {
1ee00 0a 09 09 20 20 20 20 20 20 67 61 69 61 47 65 74  ...      gaiaGet
1ee10 50 6f 69 6e 74 58 59 5a 4d 20 28 72 6e 67 2d 3e  PointXYZM (rng->
1ee20 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20  Coords, iv, &x, 
1ee30 26 79 2c 20 26 7a 2c 20 26 6d 29 3b 0a 09 09 20  &y, &z, &m);... 
1ee40 20 20 20 20 20 69 66 20 28 69 76 20 3d 3d 20 30       if (iv == 0
1ee50 20 7c 7c 20 69 76 20 3d 3d 20 28 72 6e 67 2d 3e   || iv == (rng->
1ee60 50 6f 69 6e 74 73 20 2d 20 31 29 29 0a 09 09 09  Points - 1))....
1ee70 7b 0a 09 09 09 20 20 20 20 2f 2a 20 66 69 72 73  {....    /* firs
1ee80 74 20 61 6e 64 20 6c 61 73 74 20 76 65 72 74 69  t and last verti
1ee90 63 65 73 20 61 72 65 20 75 6e 63 6f 6d 70 72 65  ces are uncompre
1eea0 73 73 65 64 20 2a 2f 0a 09 09 09 20 20 20 20 67  ssed */....    g
1eeb0 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
1eec0 2c 20 78 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  , x, 1, endian_a
1eed0 72 63 68 29 3b 0a 09 09 09 20 20 20 20 67 61 69  rch);....    gai
1eee0 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b  aExport64 (ptr +
1eef0 20 38 2c 20 79 2c 20 31 2c 20 65 6e 64 69 61 6e   8, y, 1, endian
1ef00 5f 61 72 63 68 29 3b 0a 09 09 09 20 20 20 20 67  _arch);....    g
1ef10 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
1ef20 20 2b 20 31 36 2c 20 7a 2c 20 31 2c 20 65 6e 64   + 16, z, 1, end
1ef30 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 09 20 20  ian_arch);....  
1ef40 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28    gaiaExport64 (
1ef50 70 74 72 20 2b 20 32 34 2c 20 6d 2c 20 31 2c 20  ptr + 24, m, 1, 
1ef60 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09  endian_arch);...
1ef70 09 20 20 20 20 70 74 72 20 2b 3d 20 33 32 3b 0a  .    ptr += 32;.
1ef80 09 09 09 7d 0a 09 09 20 20 20 20 20 20 65 6c 73  ...}...      els
1ef90 65 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 2f 2a  e....{....    /*
1efa0 20 63 6f 6d 70 72 65 73 73 69 6e 67 20 61 6e 79   compressing any
1efb0 20 6f 74 68 65 72 20 69 6e 74 65 72 6d 65 64 69   other intermedi
1efc0 61 74 65 20 76 65 72 74 65 78 20 2a 2f 0a 09 09  ate vertex */...
1efd0 09 20 20 20 20 66 78 20 3d 20 28 66 6c 6f 61 74  .    fx = (float
1efe0 29 20 28 78 20 2d 20 6c 61 73 74 5f 78 29 3b 0a  ) (x - last_x);.
1eff0 09 09 09 20 20 20 20 66 79 20 3d 20 28 66 6c 6f  ...    fy = (flo
1f000 61 74 29 20 28 79 20 2d 20 6c 61 73 74 5f 79 29  at) (y - last_y)
1f010 3b 0a 09 09 09 20 20 20 20 66 7a 20 3d 20 28 66  ;....    fz = (f
1f020 6c 6f 61 74 29 20 28 7a 20 2d 20 6c 61 73 74 5f  loat) (z - last_
1f030 7a 29 3b 0a 09 09 09 20 20 20 20 67 61 69 61 45  z);....    gaiaE
1f040 78 70 6f 72 74 46 33 32 20 28 70 74 72 2c 20 66  xportF32 (ptr, f
1f050 78 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  x, 1, endian_arc
1f060 68 29 3b 0a 09 09 09 20 20 20 20 67 61 69 61 45  h);....    gaiaE
1f070 78 70 6f 72 74 46 33 32 20 28 70 74 72 20 2b 20  xportF32 (ptr + 
1f080 34 2c 20 66 79 2c 20 31 2c 20 65 6e 64 69 61 6e  4, fy, 1, endian
1f090 5f 61 72 63 68 29 3b 0a 09 09 09 20 20 20 20 67  _arch);....    g
1f0a0 61 69 61 45 78 70 6f 72 74 46 33 32 20 28 70 74  aiaExportF32 (pt
1f0b0 72 20 2b 20 38 2c 20 66 7a 2c 20 31 2c 20 65 6e  r + 8, fz, 1, en
1f0c0 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 09 20  dian_arch);.... 
1f0d0 20 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20     gaiaExport64 
1f0e0 28 70 74 72 20 2b 20 31 32 2c 20 6d 2c 20 31 2c  (ptr + 12, m, 1,
1f0f0 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09   endian_arch);..
1f100 09 09 20 20 20 20 70 74 72 20 2b 3d 20 32 30 3b  ..    ptr += 20;
1f110 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 6c 61  ....}...      la
1f120 73 74 5f 78 20 3d 20 78 3b 0a 09 09 20 20 20 20  st_x = x;...    
1f130 20 20 6c 61 73 74 5f 79 20 3d 20 79 3b 0a 09 09    last_y = y;...
1f140 20 20 20 20 20 20 6c 61 73 74 5f 7a 20 3d 20 7a        last_z = z
1f150 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09  ;...  }..    }..
1f160 20 20 2a 70 74 72 20 3d 20 47 41 49 41 5f 4d 41    *ptr = GAIA_MA
1f170 52 4b 5f 45 4e 44 3b 09 2f 2a 20 45 4e 44 20 73  RK_END;./* END s
1f180 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20 62  ignature */..  b
1f190 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61  reak;.      defa
1f1a0 75 6c 74 3a 0a 09 20 20 2f 2a 20 74 68 69 73 20  ult:..  /* this 
1f1b0 6f 6e 65 20 69 73 20 61 20 4d 55 4c 54 49 78 78  one is a MULTIxx
1f1c0 78 78 20 6f 72 20 61 20 47 45 4f 4d 45 54 52 59  xx or a GEOMETRY
1f1d0 43 4f 4c 4c 45 43 54 49 4f 4e 20 2d 20 62 75 69  COLLECTION - bui
1f1e0 6c 64 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 68  lding the main h
1f1f0 65 61 64 65 72 20 2a 2f 0a 09 20 20 2a 70 74 72  eader */..  *ptr
1f200 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 53 54 41   = GAIA_MARK_STA
1f210 52 54 3b 09 2f 2a 20 53 54 41 52 54 20 73 69 67  RT;./* START sig
1f220 6e 61 74 75 72 65 20 2a 2f 0a 09 20 20 2a 28 70  nature */..  *(p
1f230 74 72 20 2b 20 31 29 20 3d 20 47 41 49 41 5f 4c  tr + 1) = GAIA_L
1f240 49 54 54 4c 45 5f 45 4e 44 49 41 4e 3b 09 2f 2a  ITTLE_ENDIAN;./*
1f250 20 62 79 74 65 20 6f 72 64 65 72 69 6e 67 20 2a   byte ordering *
1f260 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 33  /..  gaiaExport3
1f270 32 20 28 70 74 72 20 2b 20 32 2c 20 67 65 6f 6d  2 (ptr + 2, geom
1f280 2d 3e 53 72 69 64 2c 20 31 2c 20 65 6e 64 69 61  ->Srid, 1, endia
1f290 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 74 68 65 20  n_arch);./* the 
1f2a0 53 52 49 44 20 2a 2f 0a 09 20 20 67 61 69 61 45  SRID */..  gaiaE
1f2b0 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 36  xport64 (ptr + 6
1f2c0 2c 20 67 65 6f 6d 2d 3e 4d 69 6e 58 2c 20 31 2c  , geom->MinX, 1,
1f2d0 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
1f2e0 2a 20 4d 42 52 20 2d 20 6d 69 6e 69 6d 75 6d 20  * MBR - minimum 
1f2f0 58 20 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f  X */..  gaiaExpo
1f300 72 74 36 34 20 28 70 74 72 20 2b 20 31 34 2c 20  rt64 (ptr + 14, 
1f310 67 65 6f 6d 2d 3e 4d 69 6e 59 2c 20 31 2c 20 65  geom->MinY, 1, e
1f320 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
1f330 4d 42 52 20 2d 20 6d 69 6e 69 6d 75 6d 20 59 20  MBR - minimum Y 
1f340 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74  */..  gaiaExport
1f350 36 34 20 28 70 74 72 20 2b 20 32 32 2c 20 67 65  64 (ptr + 22, ge
1f360 6f 6d 2d 3e 4d 61 78 58 2c 20 31 2c 20 65 6e 64  om->MaxX, 1, end
1f370 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42  ian_arch);./* MB
1f380 52 20 2d 20 6d 61 78 69 6d 75 6d 20 58 20 2a 2f  R - maximum X */
1f390 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 36 34  ..  gaiaExport64
1f3a0 20 28 70 74 72 20 2b 20 33 30 2c 20 67 65 6f 6d   (ptr + 30, geom
1f3b0 2d 3e 4d 61 78 59 2c 20 31 2c 20 65 6e 64 69 61  ->MaxY, 1, endia
1f3c0 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 42 52 20  n_arch);./* MBR 
1f3d0 2d 20 6d 61 78 69 6d 75 6d 20 59 20 2a 2f 0a 09  - maximum Y */..
1f3e0 20 20 2a 28 70 74 72 20 2b 20 33 38 29 20 3d 20    *(ptr + 38) = 
1f3f0 47 41 49 41 5f 4d 41 52 4b 5f 4d 42 52 3b 09 2f  GAIA_MARK_MBR;./
1f400 2a 20 4d 42 52 20 73 69 67 6e 61 74 75 72 65 20  * MBR signature 
1f410 2a 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74  */..  gaiaExport
1f420 33 32 20 28 70 74 72 20 2b 20 33 39 2c 20 74 79  32 (ptr + 39, ty
1f430 70 65 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72  pe, 1, endian_ar
1f440 63 68 29 3b 09 2f 2a 20 67 65 6f 6d 65 74 72 69  ch);./* geometri
1f450 63 20 63 6c 61 73 73 20 2a 2f 0a 09 20 20 67 61  c class */..  ga
1f460 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 20  iaExport32 (ptr 
1f470 2b 20 34 33 2c 20 65 6e 74 69 74 69 65 73 2c 20  + 43, entities, 
1f480 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
1f490 09 2f 2a 20 23 20 65 6e 74 69 74 69 65 73 20 2a  ./* # entities *
1f4a0 2f 0a 09 20 20 70 74 72 20 2b 3d 20 34 37 3b 0a  /..  ptr += 47;.
1f4b0 09 20 20 70 6f 69 6e 74 20 3d 20 67 65 6f 6d 2d  .  point = geom-
1f4c0 3e 46 69 72 73 74 50 6f 69 6e 74 3b 0a 09 20 20  >FirstPoint;..  
1f4d0 77 68 69 6c 65 20 28 70 6f 69 6e 74 29 0a 09 20  while (point).. 
1f4e0 20 20 20 7b 0a 09 09 2a 70 74 72 20 3d 20 47 41     {...*ptr = GA
1f4f0 49 41 5f 4d 41 52 4b 5f 45 4e 54 49 54 59 3b 09  IA_MARK_ENTITY;.
1f500 2f 2a 20 45 4e 54 49 54 59 20 73 69 67 6e 61 74  /* ENTITY signat
1f510 75 72 65 20 2a 2f 0a 09 09 69 66 20 28 67 65 6f  ure */...if (geo
1f520 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
1f530 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a  l == GAIA_XY_Z).
1f540 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61  ..  {...      ga
1f550 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 20  iaExport32 (ptr 
1f560 2b 20 31 2c 20 47 41 49 41 5f 50 4f 49 4e 54 5a  + 1, GAIA_POINTZ
1f570 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
1f580 29 3b 09 2f 2a 20 63 6c 61 73 73 20 50 4f 49 4e  );./* class POIN
1f590 54 20 58 59 5a 20 2a 2f 0a 09 09 20 20 20 20 20  T XYZ */...     
1f5a0 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70   gaiaExport64 (p
1f5b0 74 72 20 2b 20 35 2c 20 70 6f 69 6e 74 2d 3e 58  tr + 5, point->X
1f5c0 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
1f5d0 29 3b 09 2f 2a 20 58 20 2a 2f 0a 09 09 20 20 20  );./* X */...   
1f5e0 20 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20     gaiaExport64 
1f5f0 28 70 74 72 20 2b 20 31 33 2c 20 70 6f 69 6e 74  (ptr + 13, point
1f600 2d 3e 59 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  ->Y, 1, endian_a
1f610 72 63 68 29 3b 09 2f 2a 20 59 20 2a 2f 0a 09 09  rch);./* Y */...
1f620 20 20 20 20 20 20 67 61 69 61 45 78 70 6f 72 74        gaiaExport
1f630 36 34 20 28 70 74 72 20 2b 20 32 31 2c 20 70 6f  64 (ptr + 21, po
1f640 69 6e 74 2d 3e 5a 2c 20 31 2c 20 65 6e 64 69 61  int->Z, 1, endia
1f650 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 5a 20 2a 2f  n_arch);./* Z */
1f660 0a 09 09 20 20 20 20 20 20 70 74 72 20 2b 3d 20  ...      ptr += 
1f670 32 39 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65  29;...  }...else
1f680 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e   if (geom->Dimen
1f690 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
1f6a0 41 5f 58 59 5f 4d 29 0a 09 09 20 20 7b 0a 09 09  A_XY_M)...  {...
1f6b0 20 20 20 20 20 20 67 61 69 61 45 78 70 6f 72 74        gaiaExport
1f6c0 33 32 20 28 70 74 72 20 2b 20 31 2c 20 47 41 49  32 (ptr + 1, GAI
1f6d0 41 5f 50 4f 49 4e 54 4d 2c 20 31 2c 20 65 6e 64  A_POINTM, 1, end
1f6e0 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 63 6c  ian_arch);./* cl
1f6f0 61 73 73 20 50 4f 49 4e 54 20 58 59 4d 20 2a 2f  ass POINT XYM */
1f700 0a 09 09 20 20 20 20 20 20 67 61 69 61 45 78 70  ...      gaiaExp
1f710 6f 72 74 36 34 20 28 70 74 72 20 2b 20 35 2c 20  ort64 (ptr + 5, 
1f720 70 6f 69 6e 74 2d 3e 58 2c 20 31 2c 20 65 6e 64  point->X, 1, end
1f730 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 58 20  ian_arch);./* X 
1f740 2a 2f 0a 09 09 20 20 20 20 20 20 67 61 69 61 45  */...      gaiaE
1f750 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 31  xport64 (ptr + 1
1f760 33 2c 20 70 6f 69 6e 74 2d 3e 59 2c 20 31 2c 20  3, point->Y, 1, 
1f770 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a  endian_arch);./*
1f780 20 59 20 2a 2f 0a 09 09 20 20 20 20 20 20 67 61   Y */...      ga
1f790 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20  iaExport64 (ptr 
1f7a0 2b 20 32 31 2c 20 70 6f 69 6e 74 2d 3e 4d 2c 20  + 21, point->M, 
1f7b0 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
1f7c0 09 2f 2a 20 4d 20 2a 2f 0a 09 09 20 20 20 20 20  ./* M */...     
1f7d0 20 70 74 72 20 2b 3d 20 32 39 3b 0a 09 09 20 20   ptr += 29;...  
1f7e0 7d 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f  }...else if (geo
1f7f0 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
1f800 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  l == GAIA_XY_Z_M
1f810 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  )...  {...      
1f820 67 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74  gaiaExport32 (pt
1f830 72 20 2b 20 31 2c 20 47 41 49 41 5f 50 4f 49 4e  r + 1, GAIA_POIN
1f840 54 5a 4d 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  TZM, 1, endian_a
1f850 72 63 68 29 3b 09 2f 2a 20 63 6c 61 73 73 20 50  rch);./* class P
1f860 4f 49 4e 54 20 58 59 5a 4d 20 2a 2f 0a 09 09 20  OINT XYZM */... 
1f870 20 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 36       gaiaExport6
1f880 34 20 28 70 74 72 20 2b 20 35 2c 20 70 6f 69 6e  4 (ptr + 5, poin
1f890 74 2d 3e 58 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  t->X, 1, endian_
1f8a0 61 72 63 68 29 3b 09 2f 2a 20 58 20 2a 2f 0a 09  arch);./* X */..
1f8b0 09 20 20 20 20 20 20 67 61 69 61 45 78 70 6f 72  .      gaiaExpor
1f8c0 74 36 34 20 28 70 74 72 20 2b 20 31 33 2c 20 70  t64 (ptr + 13, p
1f8d0 6f 69 6e 74 2d 3e 59 2c 20 31 2c 20 65 6e 64 69  oint->Y, 1, endi
1f8e0 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 59 20 2a  an_arch);./* Y *
1f8f0 2f 0a 09 09 20 20 20 20 20 20 67 61 69 61 45 78  /...      gaiaEx
1f900 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 32 31  port64 (ptr + 21
1f910 2c 20 70 6f 69 6e 74 2d 3e 5a 2c 20 31 2c 20 65  , point->Z, 1, e
1f920 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
1f930 5a 20 2a 2f 0a 09 09 20 20 20 20 20 20 67 61 69  Z */...      gai
1f940 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20 2b  aExport64 (ptr +
1f950 20 32 39 2c 20 70 6f 69 6e 74 2d 3e 4d 2c 20 31   29, point->M, 1
1f960 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
1f970 2f 2a 20 4d 20 2a 2f 0a 09 09 20 20 20 20 20 20  /* M */...      
1f980 70 74 72 20 2b 3d 20 33 37 3b 0a 09 09 20 20 7d  ptr += 37;...  }
1f990 0a 09 09 65 6c 73 65 0a 09 09 20 20 7b 0a 09 09  ...else...  {...
1f9a0 20 20 20 20 20 20 67 61 69 61 45 78 70 6f 72 74        gaiaExport
1f9b0 33 32 20 28 70 74 72 20 2b 20 31 2c 20 47 41 49  32 (ptr + 1, GAI
1f9c0 41 5f 50 4f 49 4e 54 2c 20 31 2c 20 65 6e 64 69  A_POINT, 1, endi
1f9d0 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 63 6c 61  an_arch);./* cla
1f9e0 73 73 20 50 4f 49 4e 54 20 2a 2f 0a 09 09 20 20  ss POINT */...  
1f9f0 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 36 34      gaiaExport64
1fa00 20 28 70 74 72 20 2b 20 35 2c 20 70 6f 69 6e 74   (ptr + 5, point
1fa10 2d 3e 58 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  ->X, 1, endian_a
1fa20 72 63 68 29 3b 09 2f 2a 20 58 20 2a 2f 0a 09 09  rch);./* X */...
1fa30 20 20 20 20 20 20 67 61 69 61 45 78 70 6f 72 74        gaiaExport
1fa40 36 34 20 28 70 74 72 20 2b 20 31 33 2c 20 70 6f  64 (ptr + 13, po
1fa50 69 6e 74 2d 3e 59 2c 20 31 2c 20 65 6e 64 69 61  int->Y, 1, endia
1fa60 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 59 20 2a 2f  n_arch);./* Y */
1fa70 0a 09 09 20 20 20 20 20 20 70 74 72 20 2b 3d 20  ...      ptr += 
1fa80 32 31 3b 0a 09 09 20 20 7d 0a 09 09 70 6f 69 6e  21;...  }...poin
1fa90 74 20 3d 20 70 6f 69 6e 74 2d 3e 4e 65 78 74 3b  t = point->Next;
1faa0 0a 09 20 20 20 20 7d 0a 09 20 20 6c 69 6e 65 20  ..    }..  line 
1fab0 3d 20 67 65 6f 6d 2d 3e 46 69 72 73 74 4c 69 6e  = geom->FirstLin
1fac0 65 73 74 72 69 6e 67 3b 0a 09 20 20 77 68 69 6c  estring;..  whil
1fad0 65 20 28 6c 69 6e 65 29 0a 09 20 20 20 20 7b 0a  e (line)..    {.
1fae0 09 09 2a 70 74 72 20 3d 20 47 41 49 41 5f 4d 41  ..*ptr = GAIA_MA
1faf0 52 4b 5f 45 4e 54 49 54 59 3b 09 2f 2a 20 45 4e  RK_ENTITY;./* EN
1fb00 54 49 54 59 20 73 69 67 6e 61 74 75 72 65 20 2a  TITY signature *
1fb10 2f 0a 09 09 69 66 20 28 67 65 6f 6d 2d 3e 44 69  /...if (geom->Di
1fb20 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
1fb30 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09 20 20 20  GAIA_XY_Z)...   
1fb40 20 67 61 69 61 45 78 70 6f 72 74 33 32 20 28 70   gaiaExport32 (p
1fb50 74 72 20 2b 20 31 2c 20 47 41 49 41 5f 43 4f 4d  tr + 1, GAIA_COM
1fb60 50 52 45 53 53 45 44 5f 4c 49 4e 45 53 54 52 49  PRESSED_LINESTRI
1fb70 4e 47 5a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  NGZ, 1, endian_a
1fb80 72 63 68 29 3b 09 2f 2a 20 63 6c 61 73 73 20 4c  rch);./* class L
1fb90 49 4e 45 53 54 52 49 4e 47 20 58 59 5a 20 2a 2f  INESTRING XYZ */
1fba0 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d  ...else if (geom
1fbb0 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
1fbc0 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09   == GAIA_XY_M)..
1fbd0 09 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 33  .    gaiaExport3
1fbe0 32 20 28 70 74 72 20 2b 20 31 2c 20 47 41 49 41  2 (ptr + 1, GAIA
1fbf0 5f 43 4f 4d 50 52 45 53 53 45 44 5f 4c 49 4e 45  _COMPRESSED_LINE
1fc00 53 54 52 49 4e 47 4d 2c 20 31 2c 20 65 6e 64 69  STRINGM, 1, endi
1fc10 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 63 6c 61  an_arch);./* cla
1fc20 73 73 20 4c 49 4e 45 53 54 52 49 4e 47 20 58 59  ss LINESTRING XY
1fc30 4d 20 2a 2f 0a 09 09 65 6c 73 65 20 69 66 20 28  M */...else if (
1fc40 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d  geom->DimensionM
1fc50 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f  odel == GAIA_XY_
1fc60 5a 5f 4d 29 0a 09 09 20 20 20 20 67 61 69 61 45  Z_M)...    gaiaE
1fc70 78 70 6f 72 74 33 32 20 28 70 74 72 20 2b 20 31  xport32 (ptr + 1
1fc80 2c 20 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45  , GAIA_COMPRESSE
1fc90 44 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 2c 20  D_LINESTRINGZM, 
1fca0 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
1fcb0 09 2f 2a 20 63 6c 61 73 73 20 4c 49 4e 45 53 54  ./* class LINEST
1fcc0 52 49 4e 47 20 58 59 5a 4d 20 2a 2f 0a 09 09 65  RING XYZM */...e
1fcd0 6c 73 65 0a 09 09 20 20 20 20 67 61 69 61 45 78  lse...    gaiaEx
1fce0 70 6f 72 74 33 32 20 28 70 74 72 20 2b 20 31 2c  port32 (ptr + 1,
1fcf0 20 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45 44   GAIA_COMPRESSED
1fd00 5f 4c 49 4e 45 53 54 52 49 4e 47 2c 20 31 2c 20  _LINESTRING, 1, 
1fd10 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a  endian_arch);./*
1fd20 20 63 6c 61 73 73 20 4c 49 4e 45 53 54 52 49 4e   class LINESTRIN
1fd30 47 20 2a 2f 0a 09 09 67 61 69 61 45 78 70 6f 72  G */...gaiaExpor
1fd40 74 33 32 20 28 70 74 72 20 2b 20 35 2c 20 6c 69  t32 (ptr + 5, li
1fd50 6e 65 2d 3e 50 6f 69 6e 74 73 2c 20 31 2c 20 65  ne->Points, 1, e
1fd60 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
1fd70 23 20 70 6f 69 6e 74 73 20 2a 2f 0a 09 09 70 74  # points */...pt
1fd80 72 20 2b 3d 20 39 3b 0a 09 09 66 6f 72 20 28 69  r += 9;...for (i
1fd90 76 20 3d 20 30 3b 20 69 76 20 3c 20 6c 69 6e 65  v = 0; iv < line
1fda0 2d 3e 50 6f 69 6e 74 73 3b 20 69 76 2b 2b 29 0a  ->Points; iv++).
1fdb0 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 7a 20  ..  {...      z 
1fdc0 3d 20 30 2e 30 3b 0a 09 09 20 20 20 20 20 20 6d  = 0.0;...      m
1fdd0 20 3d 20 30 2e 30 3b 0a 09 09 20 20 20 20 20 20   = 0.0;...      
1fde0 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
1fdf0 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
1fe00 5f 58 59 5f 5a 29 0a 09 09 09 7b 0a 09 09 09 20  _XY_Z)....{.... 
1fe10 20 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74 58     gaiaGetPointX
1fe20 59 5a 20 28 6c 69 6e 65 2d 3e 43 6f 6f 72 64 73  YZ (line->Coords
1fe30 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26 7a  , iv, &x, &y, &z
1fe40 29 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20  );....}...      
1fe50 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44  else if (geom->D
1fe60 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d  imensionModel ==
1fe70 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09 09 7b   GAIA_XY_M)....{
1fe80 0a 09 09 09 20 20 20 20 67 61 69 61 47 65 74 50  ....    gaiaGetP
1fe90 6f 69 6e 74 58 59 4d 20 28 6c 69 6e 65 2d 3e 43  ointXYM (line->C
1fea0 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26  oords, iv, &x, &
1feb0 79 2c 20 26 6d 29 3b 0a 09 09 09 7d 0a 09 09 20  y, &m);....}... 
1fec0 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 67 65       else if (ge
1fed0 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  om->DimensionMod
1fee0 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f  el == GAIA_XY_Z_
1fef0 4d 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 67  M)....{....    g
1ff00 61 69 61 47 65 74 50 6f 69 6e 74 58 59 5a 4d 20  aiaGetPointXYZM 
1ff10 28 6c 69 6e 65 2d 3e 43 6f 6f 72 64 73 2c 20 69  (line->Coords, i
1ff20 76 2c 20 26 78 2c 20 26 79 2c 20 26 7a 2c 20 26  v, &x, &y, &z, &
1ff30 6d 29 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20  m);....}...     
1ff40 20 65 6c 73 65 0a 09 09 09 7b 0a 09 09 09 20 20   else....{....  
1ff50 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74 20 28    gaiaGetPoint (
1ff60 6c 69 6e 65 2d 3e 43 6f 6f 72 64 73 2c 20 69 76  line->Coords, iv
1ff70 2c 20 26 78 2c 20 26 79 29 3b 0a 09 09 09 7d 0a  , &x, &y);....}.
1ff80 09 09 20 20 20 20 20 20 69 66 20 28 69 76 20 3d  ..      if (iv =
1ff90 3d 20 30 20 7c 7c 20 69 76 20 3d 3d 20 28 6c 69  = 0 || iv == (li
1ffa0 6e 65 2d 3e 50 6f 69 6e 74 73 20 2d 20 31 29 29  ne->Points - 1))
1ffb0 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 2f 2a 20  ....{....    /* 
1ffc0 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 76  first and last v
1ffd0 65 72 74 69 63 65 73 20 61 72 65 20 75 6e 63 6f  ertices are unco
1ffe0 6d 70 72 65 73 73 65 64 20 2a 2f 0a 09 09 09 20  mpressed */.... 
1fff0 20 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20     gaiaExport64 
20000 28 70 74 72 2c 20 78 2c 20 31 2c 20 65 6e 64 69  (ptr, x, 1, endi
20010 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 58 20 2a  an_arch);./* X *
20020 2f 0a 09 09 09 20 20 20 20 67 61 69 61 45 78 70  /....    gaiaExp
20030 6f 72 74 36 34 20 28 70 74 72 20 2b 20 38 2c 20  ort64 (ptr + 8, 
20040 79 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  y, 1, endian_arc
20050 68 29 3b 09 2f 2a 20 59 20 2a 2f 0a 09 09 09 20  h);./* Y */.... 
20060 20 20 20 70 74 72 20 2b 3d 20 31 36 3b 0a 09 09     ptr += 16;...
20070 09 7d 0a 09 09 20 20 20 20 20 20 65 6c 73 65 0a  .}...      else.
20080 09 09 09 7b 0a 09 09 09 20 20 20 20 2f 2a 20 63  ...{....    /* c
20090 6f 6d 70 72 65 73 73 69 6e 67 20 61 6e 79 20 6f  ompressing any o
200a0 74 68 65 72 20 69 6e 74 65 72 6d 65 64 69 61 74  ther intermediat
200b0 65 20 76 65 72 74 65 78 20 2a 2f 0a 09 09 09 20  e vertex */.... 
200c0 20 20 20 66 78 20 3d 20 28 66 6c 6f 61 74 29 20     fx = (float) 
200d0 28 78 20 2d 20 6c 61 73 74 5f 78 29 3b 0a 09 09  (x - last_x);...
200e0 09 20 20 20 20 66 79 20 3d 20 28 66 6c 6f 61 74  .    fy = (float
200f0 29 20 28 79 20 2d 20 6c 61 73 74 5f 79 29 3b 0a  ) (y - last_y);.
20100 09 09 09 20 20 20 20 67 61 69 61 45 78 70 6f 72  ...    gaiaExpor
20110 74 46 33 32 20 28 70 74 72 2c 20 66 78 2c 20 31  tF32 (ptr, fx, 1
20120 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
20130 2f 2a 20 58 20 2a 2f 0a 09 09 09 20 20 20 20 67  /* X */....    g
20140 61 69 61 45 78 70 6f 72 74 46 33 32 20 28 70 74  aiaExportF32 (pt
20150 72 20 2b 20 34 2c 20 66 79 2c 20 31 2c 20 65 6e  r + 4, fy, 1, en
20160 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 59  dian_arch);./* Y
20170 20 2a 2f 0a 09 09 09 20 20 20 20 70 74 72 20 2b   */....    ptr +
20180 3d 20 38 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20  = 8;....}...    
20190 20 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65    if (geom->Dime
201a0 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
201b0 49 41 5f 58 59 5f 5a 29 0a 09 09 09 7b 0a 09 09  IA_XY_Z)....{...
201c0 09 20 20 20 20 69 66 20 28 69 76 20 3d 3d 20 30  .    if (iv == 0
201d0 20 7c 7c 20 69 76 20 3d 3d 20 28 6c 69 6e 65 2d   || iv == (line-
201e0 3e 50 6f 69 6e 74 73 20 2d 20 31 29 29 0a 09 09  >Points - 1))...
201f0 09 20 20 20 20 20 20 7b 0a 09 09 09 09 20 20 2f  .      {.....  /
20200 2a 20 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74  * first and last
20210 20 76 65 72 74 69 63 65 73 20 61 72 65 20 75 6e   vertices are un
20220 63 6f 6d 70 72 65 73 73 65 64 20 2a 2f 0a 09 09  compressed */...
20230 09 09 20 20 67 61 69 61 45 78 70 6f 72 74 36 34  ..  gaiaExport64
20240 20 28 70 74 72 2c 20 7a 2c 20 31 2c 20 65 6e 64   (ptr, z, 1, end
20250 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 5a 20  ian_arch);./* Z 
20260 2a 2f 0a 09 09 09 09 20 20 70 74 72 20 2b 3d 20  */.....  ptr += 
20270 38 3b 0a 09 09 09 20 20 20 20 20 20 7d 0a 09 09  8;....      }...
20280 09 20 20 20 20 65 6c 73 65 0a 09 09 09 20 20 20  .    else....   
20290 20 20 20 7b 0a 09 09 09 09 20 20 2f 2a 20 63 6f     {.....  /* co
202a0 6d 70 72 65 73 73 69 6e 67 20 61 6e 79 20 6f 74  mpressing any ot
202b0 68 65 72 20 69 6e 74 65 72 6d 65 64 69 61 74 65  her intermediate
202c0 20 76 65 72 74 65 78 20 2a 2f 0a 09 09 09 09 20   vertex */..... 
202d0 20 66 7a 20 3d 20 28 66 6c 6f 61 74 29 20 28 7a   fz = (float) (z
202e0 20 2d 20 6c 61 73 74 5f 7a 29 3b 0a 09 09 09 09   - last_z);.....
202f0 20 20 67 61 69 61 45 78 70 6f 72 74 46 33 32 20    gaiaExportF32 
20300 28 70 74 72 2c 20 66 7a 2c 20 31 2c 20 65 6e 64  (ptr, fz, 1, end
20310 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 5a 20  ian_arch);./* Z 
20320 2a 2f 0a 09 09 09 09 20 20 70 74 72 20 2b 3d 20  */.....  ptr += 
20330 34 3b 0a 09 09 09 20 20 20 20 20 20 7d 0a 09 09  4;....      }...
20340 09 7d 0a 09 09 20 20 20 20 20 20 69 66 20 28 67  .}...      if (g
20350 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  eom->DimensionMo
20360 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d  del == GAIA_XY_M
20370 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 67 61  )....{....    ga
20380 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c  iaExport64 (ptr,
20390 20 6d 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72   m, 1, endian_ar
203a0 63 68 29 3b 09 2f 2a 20 4d 20 2a 2f 0a 09 09 09  ch);./* M */....
203b0 20 20 20 20 70 74 72 20 2b 3d 20 38 3b 0a 09 09      ptr += 8;...
203c0 09 7d 0a 09 09 20 20 20 20 20 20 69 66 20 28 67  .}...      if (g
203d0 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  eom->DimensionMo
203e0 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a  del == GAIA_XY_Z
203f0 5f 4d 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20  _M)....{....    
20400 69 66 20 28 69 76 20 3d 3d 20 30 20 7c 7c 20 69  if (iv == 0 || i
20410 76 20 3d 3d 20 28 6c 69 6e 65 2d 3e 50 6f 69 6e  v == (line->Poin
20420 74 73 20 2d 20 31 29 29 0a 09 09 09 20 20 20 20  ts - 1))....    
20430 20 20 7b 0a 09 09 09 09 20 20 2f 2a 20 66 69 72    {.....  /* fir
20440 73 74 20 61 6e 64 20 6c 61 73 74 20 76 65 72 74  st and last vert
20450 69 63 65 73 20 61 72 65 20 75 6e 63 6f 6d 70 72  ices are uncompr
20460 65 73 73 65 64 20 2a 2f 0a 09 09 09 09 20 20 67  essed */.....  g
20470 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
20480 2c 20 7a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  , z, 1, endian_a
20490 72 63 68 29 3b 09 2f 2a 20 5a 20 2a 2f 0a 09 09  rch);./* Z */...
204a0 09 09 20 20 70 74 72 20 2b 3d 20 38 3b 0a 09 09  ..  ptr += 8;...
204b0 09 20 20 20 20 20 20 7d 0a 09 09 09 20 20 20 20  .      }....    
204c0 65 6c 73 65 0a 09 09 09 20 20 20 20 20 20 7b 0a  else....      {.
204d0 09 09 09 09 20 20 2f 2a 20 63 6f 6d 70 72 65 73  ....  /* compres
204e0 73 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 69  sing any other i
204f0 6e 74 65 72 6d 65 64 69 61 74 65 20 76 65 72 74  ntermediate vert
20500 65 78 20 2a 2f 0a 09 09 09 09 20 20 66 7a 20 3d  ex */.....  fz =
20510 20 28 66 6c 6f 61 74 29 20 28 7a 20 2d 20 6c 61   (float) (z - la
20520 73 74 5f 7a 29 3b 0a 09 09 09 09 20 20 67 61 69  st_z);.....  gai
20530 61 45 78 70 6f 72 74 46 33 32 20 28 70 74 72 2c  aExportF32 (ptr,
20540 20 66 7a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61   fz, 1, endian_a
20550 72 63 68 29 3b 09 2f 2a 20 5a 20 2a 2f 0a 09 09  rch);./* Z */...
20560 09 09 20 20 70 74 72 20 2b 3d 20 34 3b 0a 09 09  ..  ptr += 4;...
20570 09 20 20 20 20 20 20 7d 0a 09 09 09 20 20 20 20  .      }....    
20580 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74  gaiaExport64 (pt
20590 72 2c 20 6d 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  r, m, 1, endian_
205a0 61 72 63 68 29 3b 09 2f 2a 20 4d 20 2a 2f 0a 09  arch);./* M */..
205b0 09 09 20 20 20 20 70 74 72 20 2b 3d 20 38 3b 0a  ..    ptr += 8;.
205c0 09 09 09 7d 0a 09 09 20 20 20 20 20 20 6c 61 73  ...}...      las
205d0 74 5f 78 20 3d 20 78 3b 0a 09 09 20 20 20 20 20  t_x = x;...     
205e0 20 6c 61 73 74 5f 79 20 3d 20 79 3b 0a 09 09 20   last_y = y;... 
205f0 20 20 20 20 20 6c 61 73 74 5f 7a 20 3d 20 7a 3b       last_z = z;
20600 0a 09 09 20 20 7d 0a 09 09 6c 69 6e 65 20 3d 20  ...  }...line = 
20610 6c 69 6e 65 2d 3e 4e 65 78 74 3b 0a 09 20 20 20  line->Next;..   
20620 20 7d 0a 09 20 20 70 6f 6c 79 67 20 3d 20 67 65   }..  polyg = ge
20630 6f 6d 2d 3e 46 69 72 73 74 50 6f 6c 79 67 6f 6e  om->FirstPolygon
20640 3b 0a 09 20 20 77 68 69 6c 65 20 28 70 6f 6c 79  ;..  while (poly
20650 67 29 0a 09 20 20 20 20 7b 0a 09 09 2a 70 74 72  g)..    {...*ptr
20660 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 45 4e 54   = GAIA_MARK_ENT
20670 49 54 59 3b 09 2f 2a 20 45 4e 54 49 54 59 20 73  ITY;./* ENTITY s
20680 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 09 69 66  ignature */...if
20690 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f   (geom->Dimensio
206a0 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
206b0 59 5f 5a 29 0a 09 09 20 20 20 20 67 61 69 61 45  Y_Z)...    gaiaE
206c0 78 70 6f 72 74 33 32 20 28 70 74 72 20 2b 20 31  xport32 (ptr + 1
206d0 2c 20 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45  , GAIA_COMPRESSE
206e0 44 5f 50 4f 4c 59 47 4f 4e 5a 2c 20 31 2c 20 65  D_POLYGONZ, 1, e
206f0 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
20700 63 6c 61 73 73 20 50 4f 4c 59 47 4f 4e 20 58 59  class POLYGON XY
20710 5a 20 2a 2f 0a 09 09 65 6c 73 65 20 69 66 20 28  Z */...else if (
20720 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d  geom->DimensionM
20730 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f  odel == GAIA_XY_
20740 4d 29 0a 09 09 20 20 20 20 67 61 69 61 45 78 70  M)...    gaiaExp
20750 6f 72 74 33 32 20 28 70 74 72 20 2b 20 31 2c 20  ort32 (ptr + 1, 
20760 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45 44 5f  GAIA_COMPRESSED_
20770 50 4f 4c 59 47 4f 4e 4d 2c 20 31 2c 20 65 6e 64  POLYGONM, 1, end
20780 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 63 6c  ian_arch);./* cl
20790 61 73 73 20 50 4f 4c 59 47 4f 4e 20 58 59 4d 20  ass POLYGON XYM 
207a0 2a 2f 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65  */...else if (ge
207b0 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  om->DimensionMod
207c0 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f  el == GAIA_XY_Z_
207d0 4d 29 0a 09 09 20 20 20 20 67 61 69 61 45 78 70  M)...    gaiaExp
207e0 6f 72 74 33 32 20 28 70 74 72 20 2b 20 31 2c 20  ort32 (ptr + 1, 
207f0 47 41 49 41 5f 43 4f 4d 50 52 45 53 53 45 44 5f  GAIA_COMPRESSED_
20800 50 4f 4c 59 47 4f 4e 5a 4d 2c 20 31 2c 20 65 6e  POLYGONZM, 1, en
20810 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 63  dian_arch);./* c
20820 6c 61 73 73 20 50 4f 4c 59 47 4f 4e 20 58 59 5a  lass POLYGON XYZ
20830 4d 20 2a 2f 0a 09 09 65 6c 73 65 0a 09 09 20 20  M */...else...  
20840 20 20 67 61 69 61 45 78 70 6f 72 74 33 32 20 28    gaiaExport32 (
20850 70 74 72 20 2b 20 31 2c 20 47 41 49 41 5f 43 4f  ptr + 1, GAIA_CO
20860 4d 50 52 45 53 53 45 44 5f 50 4f 4c 59 47 4f 4e  MPRESSED_POLYGON
20870 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
20880 29 3b 09 2f 2a 20 63 6c 61 73 73 20 50 4f 4c 59  );./* class POLY
20890 47 4f 4e 20 2a 2f 0a 09 09 67 61 69 61 45 78 70  GON */...gaiaExp
208a0 6f 72 74 33 32 20 28 70 74 72 20 2b 20 35 2c 20  ort32 (ptr + 5, 
208b0 70 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74 65 72 69  polyg->NumInteri
208c0 6f 72 73 20 2b 20 31 2c 20 31 2c 20 65 6e 64 69  ors + 1, 1, endi
208d0 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 23 20 72  an_arch);./* # r
208e0 69 6e 67 73 20 2a 2f 0a 09 09 72 6e 67 20 3d 20  ings */...rng = 
208f0 70 6f 6c 79 67 2d 3e 45 78 74 65 72 69 6f 72 3b  polyg->Exterior;
20900 0a 09 09 67 61 69 61 45 78 70 6f 72 74 33 32 20  ...gaiaExport32 
20910 28 70 74 72 20 2b 20 39 2c 20 72 6e 67 2d 3e 50  (ptr + 9, rng->P
20920 6f 69 6e 74 73 2c 20 31 2c 20 65 6e 64 69 61 6e  oints, 1, endian
20930 5f 61 72 63 68 29 3b 09 2f 2a 20 23 20 70 6f 69  _arch);./* # poi
20940 6e 74 73 20 2d 20 65 78 74 65 72 69 6f 72 20 72  nts - exterior r
20950 69 6e 67 20 2a 2f 0a 09 09 70 74 72 20 2b 3d 20  ing */...ptr += 
20960 31 33 3b 0a 09 09 66 6f 72 20 28 69 76 20 3d 20  13;...for (iv = 
20970 30 3b 20 69 76 20 3c 20 72 6e 67 2d 3e 50 6f 69  0; iv < rng->Poi
20980 6e 74 73 3b 20 69 76 2b 2b 29 0a 09 09 20 20 7b  nts; iv++)...  {
20990 0a 09 09 20 20 20 20 20 20 7a 20 3d 20 30 2e 30  ...      z = 0.0
209a0 3b 0a 09 09 20 20 20 20 20 20 6d 20 3d 20 30 2e  ;...      m = 0.
209b0 30 3b 0a 09 09 20 20 20 20 20 20 69 66 20 28 67  0;...      if (g
209c0 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  eom->DimensionMo
209d0 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a  del == GAIA_XY_Z
209e0 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 67 61  )....{....    ga
209f0 69 61 47 65 74 50 6f 69 6e 74 58 59 5a 20 28 72  iaGetPointXYZ (r
20a00 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20  ng->Coords, iv, 
20a10 26 78 2c 20 26 79 2c 20 26 7a 29 3b 0a 09 09 09  &x, &y, &z);....
20a20 7d 0a 09 09 20 20 20 20 20 20 65 6c 73 65 20 69  }...      else i
20a30 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69  f (geom->Dimensi
20a40 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
20a50 58 59 5f 4d 29 0a 09 09 09 7b 0a 09 09 09 20 20  XY_M)....{....  
20a60 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74 58 59    gaiaGetPointXY
20a70 4d 20 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20  M (rng->Coords, 
20a80 69 76 2c 20 26 78 2c 20 26 79 2c 20 26 6d 29 3b  iv, &x, &y, &m);
20a90 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 65 6c  ....}...      el
20aa0 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d  se if (geom->Dim
20ab0 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
20ac0 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 09 7b  AIA_XY_Z_M)....{
20ad0 0a 09 09 09 20 20 20 20 67 61 69 61 47 65 74 50  ....    gaiaGetP
20ae0 6f 69 6e 74 58 59 5a 4d 20 28 72 6e 67 2d 3e 43  ointXYZM (rng->C
20af0 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26  oords, iv, &x, &
20b00 79 2c 20 26 7a 2c 20 26 6d 29 3b 0a 09 09 09 7d  y, &z, &m);....}
20b10 0a 09 09 20 20 20 20 20 20 65 6c 73 65 0a 09 09  ...      else...
20b20 09 7b 0a 09 09 09 20 20 20 20 67 61 69 61 47 65  .{....    gaiaGe
20b30 74 50 6f 69 6e 74 20 28 72 6e 67 2d 3e 43 6f 6f  tPoint (rng->Coo
20b40 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 29  rds, iv, &x, &y)
20b50 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 69  ;....}...      i
20b60 66 20 28 69 76 20 3d 3d 20 30 20 7c 7c 20 69 76  f (iv == 0 || iv
20b70 20 3d 3d 20 28 72 6e 67 2d 3e 50 6f 69 6e 74 73   == (rng->Points
20b80 20 2d 20 31 29 29 0a 09 09 09 7b 0a 09 09 09 20   - 1))....{.... 
20b90 20 20 20 2f 2a 20 66 69 72 73 74 20 61 6e 64 20     /* first and 
20ba0 6c 61 73 74 20 76 65 72 74 69 63 65 73 20 61 72  last vertices ar
20bb0 65 20 75 6e 63 6f 6d 70 72 65 73 73 65 64 20 2a  e uncompressed *
20bc0 2f 0a 09 09 09 20 20 20 20 67 61 69 61 45 78 70  /....    gaiaExp
20bd0 6f 72 74 36 34 20 28 70 74 72 2c 20 78 2c 20 31  ort64 (ptr, x, 1
20be0 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
20bf0 2f 2a 20 58 20 2d 20 65 78 74 65 72 69 6f 72 20  /* X - exterior 
20c00 72 69 6e 67 20 2a 2f 0a 09 09 09 20 20 20 20 67  ring */....    g
20c10 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
20c20 20 2b 20 38 2c 20 79 2c 20 31 2c 20 65 6e 64 69   + 8, y, 1, endi
20c30 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 59 20 2d  an_arch);./* Y -
20c40 20 65 78 74 65 72 69 6f 72 20 72 69 6e 67 20 2a   exterior ring *
20c50 2f 0a 09 09 09 20 20 20 20 70 74 72 20 2b 3d 20  /....    ptr += 
20c60 31 36 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20  16;....}...     
20c70 20 65 6c 73 65 0a 09 09 09 7b 0a 09 09 09 20 20   else....{....  
20c80 20 20 2f 2a 20 63 6f 6d 70 72 65 73 73 69 6e 67    /* compressing
20c90 20 61 6e 79 20 6f 74 68 65 72 20 69 6e 74 65 72   any other inter
20ca0 6d 65 64 69 61 74 65 20 76 65 72 74 65 78 20 2a  mediate vertex *
20cb0 2f 0a 09 09 09 20 20 20 20 66 78 20 3d 20 28 66  /....    fx = (f
20cc0 6c 6f 61 74 29 20 28 78 20 2d 20 6c 61 73 74 5f  loat) (x - last_
20cd0 78 29 3b 0a 09 09 09 20 20 20 20 66 79 20 3d 20  x);....    fy = 
20ce0 28 66 6c 6f 61 74 29 20 28 79 20 2d 20 6c 61 73  (float) (y - las
20cf0 74 5f 79 29 3b 0a 09 09 09 20 20 20 20 67 61 69  t_y);....    gai
20d00 61 45 78 70 6f 72 74 46 33 32 20 28 70 74 72 2c  aExportF32 (ptr,
20d10 20 66 78 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61   fx, 1, endian_a
20d20 72 63 68 29 3b 09 2f 2a 20 58 20 2a 2f 0a 09 09  rch);./* X */...
20d30 09 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 46  .    gaiaExportF
20d40 33 32 20 28 70 74 72 20 2b 20 34 2c 20 66 79 2c  32 (ptr + 4, fy,
20d50 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
20d60 3b 09 2f 2a 20 59 20 2a 2f 0a 09 09 09 20 20 20  ;./* Y */....   
20d70 20 70 74 72 20 2b 3d 20 38 3b 0a 09 09 09 7d 0a   ptr += 8;....}.
20d80 09 09 20 20 20 20 20 20 69 66 20 28 67 65 6f 6d  ..      if (geom
20d90 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
20da0 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09   == GAIA_XY_Z)..
20db0 09 09 7b 0a 09 09 09 20 20 20 20 69 66 20 28 69  ..{....    if (i
20dc0 76 20 3d 3d 20 30 20 7c 7c 20 69 76 20 3d 3d 20  v == 0 || iv == 
20dd0 28 72 6e 67 2d 3e 50 6f 69 6e 74 73 20 2d 20 31  (rng->Points - 1
20de0 29 29 0a 09 09 09 20 20 20 20 20 20 7b 0a 09 09  ))....      {...
20df0 09 09 20 20 2f 2a 20 66 69 72 73 74 20 61 6e 64  ..  /* first and
20e00 20 6c 61 73 74 20 76 65 72 74 69 63 65 73 20 61   last vertices a
20e10 72 65 20 75 6e 63 6f 6d 70 72 65 73 73 65 64 20  re uncompressed 
20e20 2a 2f 0a 09 09 09 09 20 20 67 61 69 61 45 78 70  */.....  gaiaExp
20e30 6f 72 74 36 34 20 28 70 74 72 2c 20 7a 2c 20 31  ort64 (ptr, z, 1
20e40 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
20e50 2f 2a 20 5a 20 2a 2f 0a 09 09 09 09 20 20 70 74  /* Z */.....  pt
20e60 72 20 2b 3d 20 38 3b 0a 09 09 09 20 20 20 20 20  r += 8;....     
20e70 20 7d 0a 09 09 09 20 20 20 20 65 6c 73 65 0a 09   }....    else..
20e80 09 09 20 20 20 20 20 20 7b 0a 09 09 09 09 20 20  ..      {.....  
20e90 2f 2a 20 63 6f 6d 70 72 65 73 73 69 6e 67 20 61  /* compressing a
20ea0 6e 79 20 6f 74 68 65 72 20 69 6e 74 65 72 6d 65  ny other interme
20eb0 64 69 61 74 65 20 76 65 72 74 65 78 20 2a 2f 0a  diate vertex */.
20ec0 09 09 09 09 20 20 66 7a 20 3d 20 28 66 6c 6f 61  ....  fz = (floa
20ed0 74 29 20 28 7a 20 2d 20 6c 61 73 74 5f 7a 29 3b  t) (z - last_z);
20ee0 0a 09 09 09 09 20 20 67 61 69 61 45 78 70 6f 72  .....  gaiaExpor
20ef0 74 46 33 32 20 28 70 74 72 2c 20 66 7a 2c 20 31  tF32 (ptr, fz, 1
20f00 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
20f10 2f 2a 20 5a 20 2a 2f 0a 09 09 09 09 20 20 70 74  /* Z */.....  pt
20f20 72 20 2b 3d 20 34 3b 0a 09 09 09 20 20 20 20 20  r += 4;....     
20f30 20 7d 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20   }....}...      
20f40 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
20f50 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
20f60 5f 58 59 5f 4d 29 0a 09 09 09 7b 0a 09 09 09 20  _XY_M)....{.... 
20f70 20 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20     gaiaExport64 
20f80 28 70 74 72 2c 20 6d 2c 20 31 2c 20 65 6e 64 69  (ptr, m, 1, endi
20f90 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 20 2a  an_arch);./* M *
20fa0 2f 0a 09 09 09 20 20 20 20 70 74 72 20 2b 3d 20  /....    ptr += 
20fb0 38 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20  8;....}...      
20fc0 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
20fd0 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
20fe0 5f 58 59 5f 5a 5f 4d 29 0a 09 09 09 7b 0a 09 09  _XY_Z_M)....{...
20ff0 09 20 20 20 20 69 66 20 28 69 76 20 3d 3d 20 30  .    if (iv == 0
21000 20 7c 7c 20 69 76 20 3d 3d 20 28 72 6e 67 2d 3e   || iv == (rng->
21010 50 6f 69 6e 74 73 20 2d 20 31 29 29 0a 09 09 09  Points - 1))....
21020 20 20 20 20 20 20 7b 0a 09 09 09 09 20 20 2f 2a        {.....  /*
21030 20 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20   first and last 
21040 76 65 72 74 69 63 65 73 20 61 72 65 20 75 6e 63  vertices are unc
21050 6f 6d 70 72 65 73 73 65 64 20 2a 2f 0a 09 09 09  ompressed */....
21060 09 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20  .  gaiaExport64 
21070 28 70 74 72 2c 20 7a 2c 20 31 2c 20 65 6e 64 69  (ptr, z, 1, endi
21080 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 5a 20 2a  an_arch);./* Z *
21090 2f 0a 09 09 09 09 20 20 70 74 72 20 2b 3d 20 38  /.....  ptr += 8
210a0 3b 0a 09 09 09 20 20 20 20 20 20 7d 0a 09 09 09  ;....      }....
210b0 20 20 20 20 65 6c 73 65 0a 09 09 09 20 20 20 20      else....    
210c0 20 20 7b 0a 09 09 09 09 20 20 2f 2a 20 63 6f 6d    {.....  /* com
210d0 70 72 65 73 73 69 6e 67 20 61 6e 79 20 6f 74 68  pressing any oth
210e0 65 72 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  er intermediate 
210f0 76 65 72 74 65 78 20 2a 2f 0a 09 09 09 09 20 20  vertex */.....  
21100 66 7a 20 3d 20 28 66 6c 6f 61 74 29 20 28 7a 20  fz = (float) (z 
21110 2d 20 6c 61 73 74 5f 7a 29 3b 0a 09 09 09 09 20  - last_z);..... 
21120 20 67 61 69 61 45 78 70 6f 72 74 46 33 32 20 28   gaiaExportF32 (
21130 70 74 72 2c 20 66 7a 2c 20 31 2c 20 65 6e 64 69  ptr, fz, 1, endi
21140 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 5a 20 2a  an_arch);./* Z *
21150 2f 0a 09 09 09 09 20 20 70 74 72 20 2b 3d 20 34  /.....  ptr += 4
21160 3b 0a 09 09 09 20 20 20 20 20 20 7d 0a 09 09 09  ;....      }....
21170 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 36 34      gaiaExport64
21180 20 28 70 74 72 2c 20 6d 2c 20 31 2c 20 65 6e 64   (ptr, m, 1, end
21190 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 20  ian_arch);./* M 
211a0 2a 2f 0a 09 09 09 20 20 20 20 70 74 72 20 2b 3d  */....    ptr +=
211b0 20 38 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20   8;....}...     
211c0 20 6c 61 73 74 5f 78 20 3d 20 78 3b 0a 09 09 20   last_x = x;... 
211d0 20 20 20 20 20 6c 61 73 74 5f 79 20 3d 20 79 3b       last_y = y;
211e0 0a 09 09 20 20 20 20 20 20 6c 61 73 74 5f 7a 20  ...      last_z 
211f0 3d 20 7a 3b 0a 09 09 20 20 7d 0a 09 09 66 6f 72  = z;...  }...for
21200 20 28 69 62 20 3d 20 30 3b 20 69 62 20 3c 20 70   (ib = 0; ib < p
21210 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74 65 72 69 6f  olyg->NumInterio
21220 72 73 3b 20 69 62 2b 2b 29 0a 09 09 20 20 7b 0a  rs; ib++)...  {.
21230 09 09 20 20 20 20 20 20 72 6e 67 20 3d 20 70 6f  ..      rng = po
21240 6c 79 67 2d 3e 49 6e 74 65 72 69 6f 72 73 20 2b  lyg->Interiors +
21250 20 69 62 3b 0a 09 09 20 20 20 20 20 20 67 61 69   ib;...      gai
21260 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 2c 20  aExport32 (ptr, 
21270 72 6e 67 2d 3e 50 6f 69 6e 74 73 2c 20 31 2c 20  rng->Points, 1, 
21280 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a  endian_arch);./*
21290 20 23 20 70 6f 69 6e 74 73 20 2d 20 69 6e 74 65   # points - inte
212a0 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 09 20  rior ring */... 
212b0 20 20 20 20 20 70 74 72 20 2b 3d 20 34 3b 0a 09       ptr += 4;..
212c0 09 20 20 20 20 20 20 66 6f 72 20 28 69 76 20 3d  .      for (iv =
212d0 20 30 3b 20 69 76 20 3c 20 72 6e 67 2d 3e 50 6f   0; iv < rng->Po
212e0 69 6e 74 73 3b 20 69 76 2b 2b 29 0a 09 09 09 7b  ints; iv++)....{
212f0 0a 09 09 09 20 20 20 20 7a 20 3d 20 30 2e 30 3b  ....    z = 0.0;
21300 0a 09 09 09 20 20 20 20 6d 20 3d 20 30 2e 30 3b  ....    m = 0.0;
21310 0a 09 09 09 20 20 20 20 69 66 20 28 67 65 6f 6d  ....    if (geom
21320 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
21330 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09   == GAIA_XY_Z)..
21340 09 09 20 20 20 20 20 20 7b 0a 09 09 09 09 20 20  ..      {.....  
21350 67 61 69 61 47 65 74 50 6f 69 6e 74 58 59 5a 20  gaiaGetPointXYZ 
21360 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76  (rng->Coords, iv
21370 2c 20 26 78 2c 20 26 79 2c 20 26 7a 29 3b 0a 09  , &x, &y, &z);..
21380 09 09 20 20 20 20 20 20 7d 0a 09 09 09 20 20 20  ..      }....   
21390 20 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e   else if (geom->
213a0 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
213b0 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09 09  = GAIA_XY_M)....
213c0 20 20 20 20 20 20 7b 0a 09 09 09 09 20 20 67 61        {.....  ga
213d0 69 61 47 65 74 50 6f 69 6e 74 58 59 4d 20 28 72  iaGetPointXYM (r
213e0 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20  ng->Coords, iv, 
213f0 26 78 2c 20 26 79 2c 20 26 6d 29 3b 0a 09 09 09  &x, &y, &m);....
21400 20 20 20 20 20 20 7d 0a 09 09 09 20 20 20 20 65        }....    e
21410 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69  lse if (geom->Di
21420 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
21430 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 09  GAIA_XY_Z_M)....
21440 20 20 20 20 20 20 7b 0a 09 09 09 09 20 20 67 61        {.....  ga
21450 69 61 47 65 74 50 6f 69 6e 74 58 59 5a 4d 20 28  iaGetPointXYZM (
21460 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c  rng->Coords, iv,
21470 20 26 78 2c 20 26 79 2c 20 26 7a 2c 0a 09 09 09   &x, &y, &z,....
21480 09 09 09 20 20 20 20 26 6d 29 3b 0a 09 09 09 20  ...    &m);.... 
21490 20 20 20 20 20 7d 0a 09 09 09 20 20 20 20 65 6c       }....    el
214a0 73 65 0a 09 09 09 20 20 20 20 20 20 7b 0a 09 09  se....      {...
214b0 09 09 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74  ..  gaiaGetPoint
214c0 20 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69   (rng->Coords, i
214d0 76 2c 20 26 78 2c 20 26 79 29 3b 0a 09 09 09 20  v, &x, &y);.... 
214e0 20 20 20 20 20 7d 0a 09 09 09 20 20 20 20 69 66       }....    if
214f0 20 28 69 76 20 3d 3d 20 30 20 7c 7c 20 69 76 20   (iv == 0 || iv 
21500 3d 3d 20 28 72 6e 67 2d 3e 50 6f 69 6e 74 73 20  == (rng->Points 
21510 2d 20 31 29 29 0a 09 09 09 20 20 20 20 20 20 7b  - 1))....      {
21520 0a 09 09 09 09 20 20 2f 2a 20 66 69 72 73 74 20  .....  /* first 
21530 61 6e 64 20 6c 61 73 74 20 76 65 72 74 69 63 65  and last vertice
21540 73 20 61 72 65 20 75 6e 63 6f 6d 70 72 65 73 73  s are uncompress
21550 65 64 20 2a 2f 0a 09 09 09 09 20 20 67 61 69 61  ed */.....  gaia
21560 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20 78  Export64 (ptr, x
21570 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
21580 29 3b 09 2f 2a 20 58 20 2d 20 69 6e 74 65 72 69  );./* X - interi
21590 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 09 09 09 20  or ring */..... 
215a0 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70   gaiaExport64 (p
215b0 74 72 20 2b 20 38 2c 20 79 2c 20 31 2c 20 65 6e  tr + 8, y, 1, en
215c0 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 59  dian_arch);./* Y
215d0 20 2d 20 69 6e 74 65 72 69 6f 72 20 72 69 6e 67   - interior ring
215e0 20 2a 2f 0a 09 09 09 09 20 20 70 74 72 20 2b 3d   */.....  ptr +=
215f0 20 31 36 3b 0a 09 09 09 20 20 20 20 20 20 7d 0a   16;....      }.
21600 09 09 09 20 20 20 20 65 6c 73 65 0a 09 09 09 20  ...    else.... 
21610 20 20 20 20 20 7b 0a 09 09 09 09 20 20 2f 2a 20       {.....  /* 
21620 63 6f 6d 70 72 65 73 73 69 6e 67 20 61 6e 79 20  compressing any 
21630 6f 74 68 65 72 20 69 6e 74 65 72 6d 65 64 69 61  other intermedia
21640 74 65 20 76 65 72 74 65 78 20 2a 2f 0a 09 09 09  te vertex */....
21650 09 20 20 66 78 20 3d 20 28 66 6c 6f 61 74 29 20  .  fx = (float) 
21660 28 78 20 2d 20 6c 61 73 74 5f 78 29 3b 0a 09 09  (x - last_x);...
21670 09 09 20 20 66 79 20 3d 20 28 66 6c 6f 61 74 29  ..  fy = (float)
21680 20 28 79 20 2d 20 6c 61 73 74 5f 79 29 3b 0a 09   (y - last_y);..
21690 09 09 09 20 20 67 61 69 61 45 78 70 6f 72 74 46  ...  gaiaExportF
216a0 33 32 20 28 70 74 72 2c 20 66 78 2c 20 31 2c 20  32 (ptr, fx, 1, 
216b0 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a  endian_arch);./*
216c0 20 58 20 2a 2f 0a 09 09 09 09 20 20 67 61 69 61   X */.....  gaia
216d0 45 78 70 6f 72 74 46 33 32 20 28 70 74 72 20 2b  ExportF32 (ptr +
216e0 20 34 2c 20 66 79 2c 20 31 2c 20 65 6e 64 69 61   4, fy, 1, endia
216f0 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 59 20 2a 2f  n_arch);./* Y */
21700 0a 09 09 09 09 20 20 70 74 72 20 2b 3d 20 38 3b  .....  ptr += 8;
21710 0a 09 09 09 20 20 20 20 20 20 7d 0a 09 09 09 20  ....      }.... 
21720 20 20 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d     if (geom->Dim
21730 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
21740 41 49 41 5f 58 59 5f 5a 29 0a 09 09 09 20 20 20  AIA_XY_Z)....   
21750 20 20 20 7b 0a 09 09 09 09 20 20 69 66 20 28 69     {.....  if (i
21760 76 20 3d 3d 20 30 20 7c 7c 20 69 76 20 3d 3d 20  v == 0 || iv == 
21770 28 72 6e 67 2d 3e 50 6f 69 6e 74 73 20 2d 20 31  (rng->Points - 1
21780 29 29 0a 09 09 09 09 20 20 20 20 7b 0a 09 09 09  )).....    {....
21790 09 09 2f 2a 20 66 69 72 73 74 20 61 6e 64 20 6c  ../* first and l
217a0 61 73 74 20 76 65 72 74 69 63 65 73 20 61 72 65  ast vertices are
217b0 20 75 6e 63 6f 6d 70 72 65 73 73 65 64 20 2a 2f   uncompressed */
217c0 0a 09 09 09 09 09 67 61 69 61 45 78 70 6f 72 74  ......gaiaExport
217d0 36 34 20 28 70 74 72 2c 20 7a 2c 20 31 2c 20 65  64 (ptr, z, 1, e
217e0 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
217f0 5a 20 2a 2f 0a 09 09 09 09 09 70 74 72 20 2b 3d  Z */......ptr +=
21800 20 38 3b 0a 09 09 09 09 20 20 20 20 7d 0a 09 09   8;.....    }...
21810 09 09 20 20 65 6c 73 65 0a 09 09 09 09 20 20 20  ..  else.....   
21820 20 7b 0a 09 09 09 09 09 2f 2a 20 63 6f 6d 70 72   {....../* compr
21830 65 73 73 69 6e 67 20 61 6e 79 20 6f 74 68 65 72  essing any other
21840 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 76 65   intermediate ve
21850 72 74 65 78 20 2a 2f 0a 09 09 09 09 09 66 7a 20  rtex */......fz 
21860 3d 20 28 66 6c 6f 61 74 29 20 28 7a 20 2d 20 6c  = (float) (z - l
21870 61 73 74 5f 7a 29 3b 0a 09 09 09 09 09 67 61 69  ast_z);......gai
21880 61 45 78 70 6f 72 74 46 33 32 20 28 70 74 72 2c  aExportF32 (ptr,
21890 20 66 7a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61   fz, 1, endian_a
218a0 72 63 68 29 3b 09 2f 2a 20 5a 20 2a 2f 0a 09 09  rch);./* Z */...
218b0 09 09 09 70 74 72 20 2b 3d 20 34 3b 0a 09 09 09  ...ptr += 4;....
218c0 09 20 20 20 20 7d 0a 09 09 09 20 20 20 20 20 20  .    }....      
218d0 7d 0a 09 09 09 20 20 20 20 69 66 20 28 67 65 6f  }....    if (geo
218e0 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
218f0 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a  l == GAIA_XY_M).
21900 09 09 09 20 20 20 20 20 20 7b 0a 09 09 09 09 20  ...      {..... 
21910 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70   gaiaExport64 (p
21920 74 72 2c 20 6d 2c 20 31 2c 20 65 6e 64 69 61 6e  tr, m, 1, endian
21930 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 20 2a 2f 0a  _arch);./* M */.
21940 09 09 09 09 20 20 70 74 72 20 2b 3d 20 38 3b 0a  ....  ptr += 8;.
21950 09 09 09 20 20 20 20 20 20 7d 0a 09 09 09 20 20  ...      }....  
21960 20 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65    if (geom->Dime
21970 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
21980 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 09 20 20  IA_XY_Z_M)....  
21990 20 20 20 20 7b 0a 09 09 09 09 20 20 69 66 20 28      {.....  if (
219a0 69 76 20 3d 3d 20 30 20 7c 7c 20 69 76 20 3d 3d  iv == 0 || iv ==
219b0 20 28 72 6e 67 2d 3e 50 6f 69 6e 74 73 20 2d 20   (rng->Points - 
219c0 31 29 29 0a 09 09 09 09 20 20 20 20 7b 0a 09 09  1)).....    {...
219d0 09 09 09 2f 2a 20 66 69 72 73 74 20 61 6e 64 20  .../* first and 
219e0 6c 61 73 74 20 76 65 72 74 69 63 65 73 20 61 72  last vertices ar
219f0 65 20 75 6e 63 6f 6d 70 72 65 73 73 65 64 20 2a  e uncompressed *
21a00 2f 0a 09 09 09 09 09 67 61 69 61 45 78 70 6f 72  /......gaiaExpor
21a10 74 36 34 20 28 70 74 72 2c 20 7a 2c 20 31 2c 20  t64 (ptr, z, 1, 
21a20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a  endian_arch);./*
21a30 20 5a 20 2a 2f 0a 09 09 09 09 09 70 74 72 20 2b   Z */......ptr +
21a40 3d 20 38 3b 0a 09 09 09 09 20 20 20 20 7d 0a 09  = 8;.....    }..
21a50 09 09 09 20 20 65 6c 73 65 0a 09 09 09 09 20 20  ...  else.....  
21a60 20 20 7b 0a 09 09 09 09 09 2f 2a 20 63 6f 6d 70    {....../* comp
21a70 72 65 73 73 69 6e 67 20 61 6e 79 20 6f 74 68 65  ressing any othe
21a80 72 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 76  r intermediate v
21a90 65 72 74 65 78 20 2a 2f 0a 09 09 09 09 09 66 7a  ertex */......fz
21aa0 20 3d 20 28 66 6c 6f 61 74 29 20 28 7a 20 2d 20   = (float) (z - 
21ab0 6c 61 73 74 5f 7a 29 3b 0a 09 09 09 09 09 67 61  last_z);......ga
21ac0 69 61 45 78 70 6f 72 74 46 33 32 20 28 70 74 72  iaExportF32 (ptr
21ad0 2c 20 66 7a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  , fz, 1, endian_
21ae0 61 72 63 68 29 3b 09 2f 2a 20 5a 20 2a 2f 0a 09  arch);./* Z */..
21af0 09 09 09 09 70 74 72 20 2b 3d 20 34 3b 0a 09 09  ....ptr += 4;...
21b00 09 09 20 20 20 20 7d 0a 09 09 09 09 20 20 67 61  ..    }.....  ga
21b10 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c  iaExport64 (ptr,
21b20 20 6d 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72   m, 1, endian_ar
21b30 63 68 29 3b 09 2f 2a 20 4d 20 2a 2f 0a 09 09 09  ch);./* M */....
21b40 09 20 20 70 74 72 20 2b 3d 20 38 3b 0a 09 09 09  .  ptr += 8;....
21b50 20 20 20 20 20 20 7d 0a 09 09 09 20 20 20 20 6c        }....    l
21b60 61 73 74 5f 78 20 3d 20 78 3b 0a 09 09 09 20 20  ast_x = x;....  
21b70 20 20 6c 61 73 74 5f 79 20 3d 20 79 3b 0a 09 09    last_y = y;...
21b80 09 20 20 20 20 6c 61 73 74 5f 7a 20 3d 20 7a 3b  .    last_z = z;
21b90 0a 09 09 09 7d 0a 09 09 20 20 7d 0a 09 09 70 6f  ....}...  }...po
21ba0 6c 79 67 20 3d 20 70 6f 6c 79 67 2d 3e 4e 65 78  lyg = polyg->Nex
21bb0 74 3b 0a 09 20 20 20 20 7d 0a 09 20 20 2a 70 74  t;..    }..  *pt
21bc0 72 20 3d 20 47 41 49 41 5f 4d 41 52 4b 5f 45 4e  r = GAIA_MARK_EN
21bd0 44 3b 09 2f 2a 20 45 4e 44 20 73 69 67 6e 61 74  D;./* END signat
21be0 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a  ure */.      };.
21bf0 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 63 6f  }..static int.co
21c00 75 6e 74 5f 65 6c 65 6d 65 6e 74 61 72 69 65 73  unt_elementaries
21c10 20 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74   (gaiaGeomCollPt
21c20 72 20 67 65 6f 29 0a 7b 0a 2f 2a 20 63 6f 75 6e  r geo).{./* coun
21c30 69 6e 74 20 68 6f 77 20 6d 61 6e 79 20 65 6c 65  int how many ele
21c40 6d 65 6e 74 61 72 79 20 69 74 65 6d 73 20 61 72  mentary items ar
21c50 65 20 74 68 65 72 65 20 2a 2f 0a 20 20 20 20 67  e there */.    g
21c60 61 69 61 50 6f 69 6e 74 50 74 72 20 70 74 3b 0a  aiaPointPtr pt;.
21c70 20 20 20 20 67 61 69 61 4c 69 6e 65 73 74 72 69      gaiaLinestri
21c80 6e 67 50 74 72 20 6c 6e 3b 0a 20 20 20 20 67 61  ngPtr ln;.    ga
21c90 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20 70 67 3b  iaPolygonPtr pg;
21ca0 0a 20 20 20 20 69 6e 74 20 70 74 73 20 3d 20 30  .    int pts = 0
21cb0 3b 0a 20 20 20 20 69 6e 74 20 6c 6e 73 20 3d 20  ;.    int lns = 
21cc0 30 3b 0a 20 20 20 20 69 6e 74 20 70 67 73 20 3d  0;.    int pgs =
21cd0 20 30 3b 0a 0a 20 20 20 20 70 74 20 3d 20 67 65   0;..    pt = ge
21ce0 6f 2d 3e 46 69 72 73 74 50 6f 69 6e 74 3b 0a 20  o->FirstPoint;. 
21cf0 20 20 20 77 68 69 6c 65 20 28 70 74 20 21 3d 20     while (pt != 
21d00 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20  NULL).      {.. 
21d10 20 2f 2a 20 63 6f 75 6e 74 69 6e 67 20 50 6f 69   /* counting Poi
21d20 6e 74 73 20 2a 2f 0a 09 20 20 70 74 73 2b 2b 3b  nts */..  pts++;
21d30 0a 09 20 20 70 74 20 3d 20 70 74 2d 3e 4e 65 78  ..  pt = pt->Nex
21d40 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 6c  t;.      }.    l
21d50 6e 20 3d 20 67 65 6f 2d 3e 46 69 72 73 74 4c 69  n = geo->FirstLi
21d60 6e 65 73 74 72 69 6e 67 3b 0a 20 20 20 20 77 68  nestring;.    wh
21d70 69 6c 65 20 28 6c 6e 20 21 3d 20 4e 55 4c 4c 29  ile (ln != NULL)
21d80 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 63  .      {..  /* c
21d90 6f 75 6e 74 69 6e 67 20 4c 69 6e 65 73 74 72 69  ounting Linestri
21da0 6e 67 20 2a 2f 0a 09 20 20 6c 6e 73 2b 2b 3b 0a  ng */..  lns++;.
21db0 09 20 20 6c 6e 20 3d 20 6c 6e 2d 3e 4e 65 78 74  .  ln = ln->Next
21dc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 67  ;.      }.    pg
21dd0 20 3d 20 67 65 6f 2d 3e 46 69 72 73 74 50 6f 6c   = geo->FirstPol
21de0 79 67 6f 6e 3b 0a 20 20 20 20 77 68 69 6c 65 20  ygon;.    while 
21df0 28 70 67 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  (pg != NULL).   
21e00 20 20 20 7b 0a 09 20 20 2f 2a 20 63 6f 75 6e 74     {..  /* count
21e10 69 6e 67 20 50 6f 6c 79 67 6f 6e 73 20 2a 2f 0a  ing Polygons */.
21e20 09 20 20 70 67 73 2b 2b 3b 0a 09 20 20 70 67 20  .  pgs++;..  pg 
21e30 3d 20 70 67 2d 3e 4e 65 78 74 3b 0a 20 20 20 20  = pg->Next;.    
21e40 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
21e50 74 73 20 2b 20 6c 6e 73 20 2b 20 70 67 73 3b 0a  ts + lns + pgs;.
21e60 7d 0a 0a 47 41 49 41 47 45 4f 5f 44 45 43 4c 41  }..GAIAGEO_DECLA
21e70 52 45 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50  RE gaiaGeomCollP
21e80 74 72 0a 67 61 69 61 46 72 6f 6d 57 6b 62 20 28  tr.gaiaFromWkb (
21e90 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
21ea0 68 61 72 20 2a 62 6c 6f 62 2c 20 75 6e 73 69 67  har *blob, unsig
21eb0 6e 65 64 20 69 6e 74 20 73 69 7a 65 29 0a 7b 0a  ned int size).{.
21ec0 2f 2a 20 64 65 63 6f 64 69 6e 67 20 66 72 6f 6d  /* decoding from
21ed0 20 57 4b 42 20 74 6f 20 47 45 4f 4d 45 54 52 59   WKB to GEOMETRY
21ee0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 79 70    */.    int typ
21ef0 65 3b 0a 20 20 20 20 69 6e 74 20 6c 69 74 74 6c  e;.    int littl
21f00 65 5f 65 6e 64 69 61 6e 3b 0a 20 20 20 20 67 61  e_endian;.    ga
21f10 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65  iaGeomCollPtr ge
21f20 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  o = NULL;.    in
21f30 74 20 65 6e 64 69 61 6e 5f 61 72 63 68 20 3d 20  t endian_arch = 
21f40 67 61 69 61 45 6e 64 69 61 6e 41 72 63 68 20 28  gaiaEndianArch (
21f50 29 3b 0a 20 20 20 20 69 66 20 28 73 69 7a 65 20  );.    if (size 
21f60 3c 20 35 29 0a 09 72 65 74 75 72 6e 20 4e 55 4c  < 5)..return NUL
21f70 4c 3b 0a 20 20 20 20 69 66 20 28 2a 28 62 6c 6f  L;.    if (*(blo
21f80 62 20 2b 20 30 29 20 3d 3d 20 30 78 30 31 29 0a  b + 0) == 0x01).
21f90 09 6c 69 74 74 6c 65 5f 65 6e 64 69 61 6e 20 3d  .little_endian =
21fa0 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44   GAIA_LITTLE_END
21fb0 49 41 4e 3b 0a 20 20 20 20 65 6c 73 65 0a 09 6c  IAN;.    else..l
21fc0 69 74 74 6c 65 5f 65 6e 64 69 61 6e 20 3d 20 47  ittle_endian = G
21fd0 41 49 41 5f 42 49 47 5f 45 4e 44 49 41 4e 3b 0a  AIA_BIG_ENDIAN;.
21fe0 20 20 20 20 74 79 70 65 20 3d 20 67 61 69 61 49      type = gaiaI
21ff0 6d 70 6f 72 74 33 32 20 28 62 6c 6f 62 20 2b 20  mport32 (blob + 
22000 31 2c 20 6c 69 74 74 6c 65 5f 65 6e 64 69 61 6e  1, little_endian
22010 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  , endian_arch);.
22020 20 20 20 20 69 66 20 28 74 79 70 65 20 3d 3d 20      if (type == 
22030 47 41 49 41 5f 50 4f 49 4e 54 5a 20 7c 7c 20 74  GAIA_POINTZ || t
22040 79 70 65 20 3d 3d 20 47 41 49 41 5f 4c 49 4e 45  ype == GAIA_LINE
22050 53 54 52 49 4e 47 5a 20 7c 7c 20 74 79 70 65 20  STRINGZ || type 
22060 3d 3d 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a  == GAIA_POLYGONZ
22070 0a 09 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49  ..|| type == GAI
22080 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a 20 7c 7c  A_MULTIPOINTZ ||
22090 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55   type == GAIA_MU
220a0 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 5a 0a 09  LTILINESTRINGZ..
220b0 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f  || type == GAIA_
220c0 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a 20 7c 7c  MULTIPOLYGONZ ||
220d0 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45   type == GAIA_GE
220e0 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
220f0 5a 0a 09 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41  Z..|| type == GA
22100 49 41 5f 47 45 4f 53 57 4b 42 5f 50 4f 49 4e 54  IA_GEOSWKB_POINT
22110 5a 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49  Z || type == GAI
22120 41 5f 47 45 4f 53 57 4b 42 5f 4c 49 4e 45 53 54  A_GEOSWKB_LINEST
22130 52 49 4e 47 5a 0a 09 7c 7c 20 74 79 70 65 20 3d  RINGZ..|| type =
22140 3d 20 47 41 49 41 5f 47 45 4f 53 57 4b 42 5f 50  = GAIA_GEOSWKB_P
22150 4f 4c 59 47 4f 4e 5a 20 7c 7c 20 74 79 70 65 20  OLYGONZ || type 
22160 3d 3d 20 47 41 49 41 5f 47 45 4f 53 57 4b 42 5f  == GAIA_GEOSWKB_
22170 4d 55 4c 54 49 50 4f 49 4e 54 5a 0a 09 7c 7c 20  MULTIPOINTZ..|| 
22180 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f  type == GAIA_GEO
22190 53 57 4b 42 5f 4d 55 4c 54 49 4c 49 4e 45 53 54  SWKB_MULTILINEST
221a0 52 49 4e 47 5a 0a 09 7c 7c 20 74 79 70 65 20 3d  RINGZ..|| type =
221b0 3d 20 47 41 49 41 5f 47 45 4f 53 57 4b 42 5f 4d  = GAIA_GEOSWKB_M
221c0 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a 0a 09 7c 7c  ULTIPOLYGONZ..||
221d0 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45   type == GAIA_GE
221e0 4f 53 57 4b 42 5f 47 45 4f 4d 45 54 52 59 43 4f  OSWKB_GEOMETRYCO
221f0 4c 4c 45 43 54 49 4f 4e 5a 29 0a 09 67 65 6f 20  LLECTIONZ)..geo 
22200 3d 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d 43  = gaiaAllocGeomC
22210 6f 6c 6c 58 59 5a 20 28 29 3b 0a 20 20 20 20 65  ollXYZ ();.    e
22220 6c 73 65 20 69 66 20 28 74 79 70 65 20 3d 3d 20  lse if (type == 
22230 47 41 49 41 5f 50 4f 49 4e 54 4d 20 7c 7c 20 74  GAIA_POINTM || t
22240 79 70 65 20 3d 3d 20 47 41 49 41 5f 4c 49 4e 45  ype == GAIA_LINE
22250 53 54 52 49 4e 47 4d 0a 09 20 20 20 20 20 7c 7c  STRINGM..     ||
22260 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 50 4f   type == GAIA_PO
22270 4c 59 47 4f 4e 4d 20 7c 7c 20 74 79 70 65 20 3d  LYGONM || type =
22280 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e  = GAIA_MULTIPOIN
22290 54 4d 0a 09 20 20 20 20 20 7c 7c 20 74 79 70 65  TM..     || type
222a0 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49   == GAIA_MULTILI
222b0 4e 45 53 54 52 49 4e 47 4d 20 7c 7c 20 74 79 70  NESTRINGM || typ
222c0 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50  e == GAIA_MULTIP
222d0 4f 4c 59 47 4f 4e 4d 0a 09 20 20 20 20 20 7c 7c  OLYGONM..     ||
222e0 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45   type == GAIA_GE
222f0 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
22300 4d 29 0a 09 67 65 6f 20 3d 20 67 61 69 61 41 6c  M)..geo = gaiaAl
22310 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 4d 20 28  locGeomCollXYM (
22320 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28  );.    else if (
22330 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 50 4f 49  type == GAIA_POI
22340 4e 54 5a 4d 20 7c 7c 20 74 79 70 65 20 3d 3d 20  NTZM || type == 
22350 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 5a  GAIA_LINESTRINGZ
22360 4d 0a 09 20 20 20 20 20 7c 7c 20 74 79 70 65 20  M..     || type 
22370 3d 3d 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a  == GAIA_POLYGONZ
22380 4d 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49  M || type == GAI
22390 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a 4d 0a 09  A_MULTIPOINTZM..
223a0 20 20 20 20 20 7c 7c 20 74 79 70 65 20 3d 3d 20       || type == 
223b0 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54  GAIA_MULTILINEST
223c0 52 49 4e 47 5a 4d 20 7c 7c 20 74 79 70 65 20 3d  RINGZM || type =
223d0 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59  = GAIA_MULTIPOLY
223e0 47 4f 4e 5a 4d 0a 09 20 20 20 20 20 7c 7c 20 74  GONZM..     || t
223f0 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d  ype == GAIA_GEOM
22400 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 4d  ETRYCOLLECTIONZM
22410 29 0a 09 67 65 6f 20 3d 20 67 61 69 61 41 6c 6c  )..geo = gaiaAll
22420 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 5a 4d 20 28  ocGeomCollXYZM (
22430 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 67 65 6f  );.    else..geo
22440 20 3d 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d   = gaiaAllocGeom
22450 43 6f 6c 6c 20 28 29 3b 0a 20 20 20 20 67 65 6f  Coll ();.    geo
22460 2d 3e 53 72 69 64 20 3d 20 30 3b 0a 20 20 20 20  ->Srid = 0;.    
22470 67 65 6f 2d 3e 65 6e 64 69 61 6e 5f 61 72 63 68  geo->endian_arch
22480 20 3d 20 28 63 68 61 72 29 20 65 6e 64 69 61 6e   = (char) endian
22490 5f 61 72 63 68 3b 0a 20 20 20 20 67 65 6f 2d 3e  _arch;.    geo->
224a0 65 6e 64 69 61 6e 20 3d 20 28 63 68 61 72 29 20  endian = (char) 
224b0 6c 69 74 74 6c 65 5f 65 6e 64 69 61 6e 3b 0a 20  little_endian;. 
224c0 20 20 20 67 65 6f 2d 3e 62 6c 6f 62 20 3d 20 62     geo->blob = b
224d0 6c 6f 62 3b 0a 20 20 20 20 67 65 6f 2d 3e 73 69  lob;.    geo->si
224e0 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 67  ze = size;.    g
224f0 65 6f 2d 3e 6f 66 66 73 65 74 20 3d 20 35 3b 0a  eo->offset = 5;.
22500 20 20 20 20 73 77 69 74 63 68 20 28 74 79 70 65      switch (type
22510 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  ).      {.      
22520 63 61 73 65 20 47 41 49 41 5f 50 4f 49 4e 54 3a  case GAIA_POINT:
22530 0a 09 20 20 50 61 72 73 65 57 6b 62 50 6f 69 6e  ..  ParseWkbPoin
22540 74 20 28 67 65 6f 29 3b 0a 09 20 20 62 72 65 61  t (geo);..  brea
22550 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41  k;.      case GA
22560 49 41 5f 50 4f 49 4e 54 5a 3a 0a 20 20 20 20 20  IA_POINTZ:.     
22570 20 63 61 73 65 20 47 41 49 41 5f 47 45 4f 53 57   case GAIA_GEOSW
22580 4b 42 5f 50 4f 49 4e 54 5a 3a 0a 09 20 20 50 61  KB_POINTZ:..  Pa
22590 72 73 65 57 6b 62 50 6f 69 6e 74 5a 20 28 67 65  rseWkbPointZ (ge
225a0 6f 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20  o);..  break;.  
225b0 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f      case GAIA_PO
225c0 49 4e 54 4d 3a 0a 09 20 20 50 61 72 73 65 57 6b  INTM:..  ParseWk
225d0 62 50 6f 69 6e 74 4d 20 28 67 65 6f 29 3b 0a 09  bPointM (geo);..
225e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
225f0 61 73 65 20 47 41 49 41 5f 50 4f 49 4e 54 5a 4d  ase GAIA_POINTZM
22600 3a 0a 09 20 20 50 61 72 73 65 57 6b 62 50 6f 69  :..  ParseWkbPoi
22610 6e 74 5a 4d 20 28 67 65 6f 29 3b 0a 09 20 20 62  ntZM (geo);..  b
22620 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
22630 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47   GAIA_LINESTRING
22640 3a 0a 09 20 20 50 61 72 73 65 57 6b 62 4c 69 6e  :..  ParseWkbLin
22650 65 20 28 67 65 6f 29 3b 0a 09 20 20 62 72 65 61  e (geo);..  brea
22660 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41  k;.      case GA
22670 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 3a 0a  IA_LINESTRINGZ:.
22680 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
22690 47 45 4f 53 57 4b 42 5f 4c 49 4e 45 53 54 52 49  GEOSWKB_LINESTRI
226a0 4e 47 5a 3a 0a 09 20 20 50 61 72 73 65 57 6b 62  NGZ:..  ParseWkb
226b0 4c 69 6e 65 5a 20 28 67 65 6f 29 3b 0a 09 20 20  LineZ (geo);..  
226c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
226d0 65 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e  e GAIA_LINESTRIN
226e0 47 4d 3a 0a 09 20 20 50 61 72 73 65 57 6b 62 4c  GM:..  ParseWkbL
226f0 69 6e 65 4d 20 28 67 65 6f 29 3b 0a 09 20 20 62  ineM (geo);..  b
22700 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
22710 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47   GAIA_LINESTRING
22720 5a 4d 3a 0a 09 20 20 50 61 72 73 65 57 6b 62 4c  ZM:..  ParseWkbL
22730 69 6e 65 5a 4d 20 28 67 65 6f 29 3b 0a 09 20 20  ineZM (geo);..  
22740 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
22750 65 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 3a 0a  e GAIA_POLYGON:.
22760 09 20 20 50 61 72 73 65 57 6b 62 50 6f 6c 79 67  .  ParseWkbPolyg
22770 6f 6e 20 28 67 65 6f 29 3b 0a 09 20 20 62 72 65  on (geo);..  bre
22780 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47  ak;.      case G
22790 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 3a 0a 20 20  AIA_POLYGONZ:.  
227a0 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 47 45      case GAIA_GE
227b0 4f 53 57 4b 42 5f 50 4f 4c 59 47 4f 4e 5a 3a 0a  OSWKB_POLYGONZ:.
227c0 09 20 20 50 61 72 73 65 57 6b 62 50 6f 6c 79 67  .  ParseWkbPolyg
227d0 6f 6e 5a 20 28 67 65 6f 29 3b 0a 09 20 20 62 72  onZ (geo);..  br
227e0 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
227f0 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 4d 3a 0a 09  GAIA_POLYGONM:..
22800 20 20 50 61 72 73 65 57 6b 62 50 6f 6c 79 67 6f    ParseWkbPolygo
22810 6e 4d 20 28 67 65 6f 29 3b 0a 09 20 20 62 72 65  nM (geo);..  bre
22820 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47  ak;.      case G
22830 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 4d 3a 0a 09  AIA_POLYGONZM:..
22840 20 20 50 61 72 73 65 57 6b 62 50 6f 6c 79 67 6f    ParseWkbPolygo
22850 6e 5a 4d 20 28 67 65 6f 29 3b 0a 09 20 20 62 72  nZM (geo);..  br
22860 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
22870 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 3a  GAIA_MULTIPOINT:
22880 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41  .      case GAIA
22890 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47  _MULTILINESTRING
228a0 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  :.      case GAI
228b0 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 3a 0a  A_MULTIPOLYGON:.
228c0 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
228d0 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49  GEOMETRYCOLLECTI
228e0 4f 4e 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47  ON:.      case G
228f0 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a 3a  AIA_MULTIPOINTZ:
22900 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41  .      case GAIA
22910 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47  _MULTILINESTRING
22920 5a 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47 41  Z:.      case GA
22930 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a  IA_MULTIPOLYGONZ
22940 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  :.      case GAI
22950 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
22960 54 49 4f 4e 5a 3a 0a 20 20 20 20 20 20 63 61 73  TIONZ:.      cas
22970 65 20 47 41 49 41 5f 47 45 4f 53 57 4b 42 5f 4d  e GAIA_GEOSWKB_M
22980 55 4c 54 49 50 4f 49 4e 54 5a 3a 0a 20 20 20 20  ULTIPOINTZ:.    
22990 20 20 63 61 73 65 20 47 41 49 41 5f 47 45 4f 53    case GAIA_GEOS
229a0 57 4b 42 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52  WKB_MULTILINESTR
229b0 49 4e 47 5a 3a 0a 20 20 20 20 20 20 63 61 73 65  INGZ:.      case
229c0 20 47 41 49 41 5f 47 45 4f 53 57 4b 42 5f 4d 55   GAIA_GEOSWKB_MU
229d0 4c 54 49 50 4f 4c 59 47 4f 4e 5a 3a 0a 20 20 20  LTIPOLYGONZ:.   
229e0 20 20 20 63 61 73 65 20 47 41 49 41 5f 47 45 4f     case GAIA_GEO
229f0 53 57 4b 42 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  SWKB_GEOMETRYCOL
22a00 4c 45 43 54 49 4f 4e 5a 3a 0a 20 20 20 20 20 20  LECTIONZ:.      
22a10 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50  case GAIA_MULTIP
22a20 4f 49 4e 54 4d 3a 0a 20 20 20 20 20 20 63 61 73  OINTM:.      cas
22a30 65 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45  e GAIA_MULTILINE
22a40 53 54 52 49 4e 47 4d 3a 0a 20 20 20 20 20 20 63  STRINGM:.      c
22a50 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  ase GAIA_MULTIPO
22a60 4c 59 47 4f 4e 4d 3a 0a 20 20 20 20 20 20 63 61  LYGONM:.      ca
22a70 73 65 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59  se GAIA_GEOMETRY
22a80 43 4f 4c 4c 45 43 54 49 4f 4e 4d 3a 0a 20 20 20  COLLECTIONM:.   
22a90 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c     case GAIA_MUL
22aa0 54 49 50 4f 49 4e 54 5a 4d 3a 0a 20 20 20 20 20  TIPOINTZM:.     
22ab0 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49   case GAIA_MULTI
22ac0 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 3a 0a 20 20  LINESTRINGZM:.  
22ad0 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55      case GAIA_MU
22ae0 4c 54 49 50 4f 4c 59 47 4f 4e 5a 4d 3a 0a 20 20  LTIPOLYGONZM:.  
22af0 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 47 45      case GAIA_GE
22b00 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
22b10 5a 4d 3a 0a 09 20 20 50 61 72 73 65 57 6b 62 47  ZM:..  ParseWkbG
22b20 65 6f 6d 65 74 72 79 20 28 67 65 6f 2c 20 31 29  eometry (geo, 1)
22b30 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;..  break;.    
22b40 20 20 64 65 66 61 75 6c 74 3a 0a 09 20 20 62 72    default:..  br
22b50 65 61 6b 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20  eak;.      };.  
22b60 20 20 67 61 69 61 4d 62 72 47 65 6f 6d 65 74 72    gaiaMbrGeometr
22b70 79 20 28 67 65 6f 29 3b 0a 20 20 20 20 73 77 69  y (geo);.    swi
22b80 74 63 68 20 28 74 79 70 65 29 0a 20 20 20 20 20  tch (type).     
22b90 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41   {.      case GA
22ba0 49 41 5f 50 4f 49 4e 54 3a 0a 20 20 20 20 20 20  IA_POINT:.      
22bb0 63 61 73 65 20 47 41 49 41 5f 50 4f 49 4e 54 5a  case GAIA_POINTZ
22bc0 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  :.      case GAI
22bd0 41 5f 47 45 4f 53 57 4b 42 5f 50 4f 49 4e 54 5a  A_GEOSWKB_POINTZ
22be0 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  :.      case GAI
22bf0 41 5f 50 4f 49 4e 54 4d 3a 0a 20 20 20 20 20 20  A_POINTM:.      
22c00 63 61 73 65 20 47 41 49 41 5f 50 4f 49 4e 54 5a  case GAIA_POINTZ
22c10 4d 3a 0a 09 20 20 67 65 6f 2d 3e 44 65 63 6c 61  M:..  geo->Decla
22c20 72 65 64 54 79 70 65 20 3d 20 47 41 49 41 5f 50  redType = GAIA_P
22c30 4f 49 4e 54 3b 0a 09 20 20 62 72 65 61 6b 3b 0a  OINT;..  break;.
22c40 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
22c50 4c 49 4e 45 53 54 52 49 4e 47 3a 0a 20 20 20 20  LINESTRING:.    
22c60 20 20 63 61 73 65 20 47 41 49 41 5f 4c 49 4e 45    case GAIA_LINE
22c70 53 54 52 49 4e 47 5a 3a 0a 20 20 20 20 20 20 63  STRINGZ:.      c
22c80 61 73 65 20 47 41 49 41 5f 47 45 4f 53 57 4b 42  ase GAIA_GEOSWKB
22c90 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 3a 0a 20 20  _LINESTRINGZ:.  
22ca0 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4c 49      case GAIA_LI
22cb0 4e 45 53 54 52 49 4e 47 4d 3a 0a 20 20 20 20 20  NESTRINGM:.     
22cc0 20 63 61 73 65 20 47 41 49 41 5f 4c 49 4e 45 53   case GAIA_LINES
22cd0 54 52 49 4e 47 5a 4d 3a 0a 09 20 20 67 65 6f 2d  TRINGZM:..  geo-
22ce0 3e 44 65 63 6c 61 72 65 64 54 79 70 65 20 3d 20  >DeclaredType = 
22cf0 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 3b  GAIA_LINESTRING;
22d00 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
22d10 20 63 61 73 65 20 47 41 49 41 5f 50 4f 4c 59 47   case GAIA_POLYG
22d20 4f 4e 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47  ON:.      case G
22d30 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 3a 0a 20 20  AIA_POLYGONZ:.  
22d40 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 47 45      case GAIA_GE
22d50 4f 53 57 4b 42 5f 50 4f 4c 59 47 4f 4e 5a 3a 0a  OSWKB_POLYGONZ:.
22d60 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
22d70 50 4f 4c 59 47 4f 4e 4d 3a 0a 20 20 20 20 20 20  POLYGONM:.      
22d80 63 61 73 65 20 47 41 49 41 5f 50 4f 4c 59 47 4f  case GAIA_POLYGO
22d90 4e 5a 4d 3a 0a 09 20 20 67 65 6f 2d 3e 44 65 63  NZM:..  geo->Dec
22da0 6c 61 72 65 64 54 79 70 65 20 3d 20 47 41 49 41  laredType = GAIA
22db0 5f 50 4f 4c 59 47 4f 4e 3b 0a 09 20 20 62 72 65  _POLYGON;..  bre
22dc0 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47  ak;.      case G
22dd0 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 3a 0a  AIA_MULTIPOINT:.
22de0 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
22df0 4d 55 4c 54 49 50 4f 49 4e 54 5a 3a 0a 20 20 20  MULTIPOINTZ:.   
22e00 20 20 20 63 61 73 65 20 47 41 49 41 5f 47 45 4f     case GAIA_GEO
22e10 53 57 4b 42 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a  SWKB_MULTIPOINTZ
22e20 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  :.      case GAI
22e30 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 4d 3a 0a 20  A_MULTIPOINTM:. 
22e40 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d       case GAIA_M
22e50 55 4c 54 49 50 4f 49 4e 54 5a 4d 3a 0a 09 20 20  ULTIPOINTZM:..  
22e60 67 65 6f 2d 3e 44 65 63 6c 61 72 65 64 54 79 70  geo->DeclaredTyp
22e70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  e = GAIA_MULTIPO
22e80 49 4e 54 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20  INT;..  break;. 
22e90 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d       case GAIA_M
22ea0 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 3a 0a  ULTILINESTRING:.
22eb0 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
22ec0 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 5a  MULTILINESTRINGZ
22ed0 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  :.      case GAI
22ee0 41 5f 47 45 4f 53 57 4b 42 5f 4d 55 4c 54 49 4c  A_GEOSWKB_MULTIL
22ef0 49 4e 45 53 54 52 49 4e 47 5a 3a 0a 20 20 20 20  INESTRINGZ:.    
22f00 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54    case GAIA_MULT
22f10 49 4c 49 4e 45 53 54 52 49 4e 47 4d 3a 0a 20 20  ILINESTRINGM:.  
22f20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55      case GAIA_MU
22f30 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 3a  LTILINESTRINGZM:
22f40 0a 09 20 20 67 65 6f 2d 3e 44 65 63 6c 61 72 65  ..  geo->Declare
22f50 64 54 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c  dType = GAIA_MUL
22f60 54 49 4c 49 4e 45 53 54 52 49 4e 47 3b 0a 09 20  TILINESTRING;.. 
22f70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
22f80 73 65 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c  se GAIA_MULTIPOL
22f90 59 47 4f 4e 3a 0a 20 20 20 20 20 20 63 61 73 65  YGON:.      case
22fa0 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47   GAIA_MULTIPOLYG
22fb0 4f 4e 5a 3a 0a 20 20 20 20 20 20 63 61 73 65 20  ONZ:.      case 
22fc0 47 41 49 41 5f 47 45 4f 53 57 4b 42 5f 4d 55 4c  GAIA_GEOSWKB_MUL
22fd0 54 49 50 4f 4c 59 47 4f 4e 5a 3a 0a 20 20 20 20  TIPOLYGONZ:.    
22fe0 20 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54    case GAIA_MULT
22ff0 49 50 4f 4c 59 47 4f 4e 4d 3a 0a 20 20 20 20 20  IPOLYGONM:.     
23000 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49   case GAIA_MULTI
23010 50 4f 4c 59 47 4f 4e 5a 4d 3a 0a 09 20 20 67 65  POLYGONZM:..  ge
23020 6f 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65 20  o->DeclaredType 
23030 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59  = GAIA_MULTIPOLY
23040 47 4f 4e 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20  GON;..  break;. 
23050 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 47       case GAIA_G
23060 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f  EOMETRYCOLLECTIO
23070 4e 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47 41  N:.      case GA
23080 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45  IA_GEOMETRYCOLLE
23090 43 54 49 4f 4e 5a 3a 0a 20 20 20 20 20 20 63 61  CTIONZ:.      ca
230a0 73 65 20 47 41 49 41 5f 47 45 4f 53 57 4b 42 5f  se GAIA_GEOSWKB_
230b0 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49  GEOMETRYCOLLECTI
230c0 4f 4e 5a 3a 0a 20 20 20 20 20 20 63 61 73 65 20  ONZ:.      case 
230d0 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
230e0 4c 45 43 54 49 4f 4e 4d 3a 0a 20 20 20 20 20 20  LECTIONM:.      
230f0 63 61 73 65 20 47 41 49 41 5f 47 45 4f 4d 45 54  case GAIA_GEOMET
23100 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 4d 3a 0a  RYCOLLECTIONZM:.
23110 09 20 20 67 65 6f 2d 3e 44 65 63 6c 61 72 65 64  .  geo->Declared
23120 54 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d  Type = GAIA_GEOM
23130 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 3b 0a  ETRYCOLLECTION;.
23140 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
23150 7d 0a 0a 2f 2a 20 73 61 6e 64 72 6f 20 32 30 32  }../* sandro 202
23160 34 2d 30 32 2d 32 34 3a 20 66 69 6e 61 6c 20 73  4-02-24: final s
23170 61 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20  anity check */. 
23180 20 20 20 69 66 20 28 63 6f 75 6e 74 5f 65 6c 65     if (count_ele
23190 6d 65 6e 74 61 72 69 65 73 20 28 67 65 6f 29 20  mentaries (geo) 
231a0 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20  == 0).      {.. 
231b0 20 2f 2a 20 74 68 69 73 20 69 73 20 61 6e 20 69   /* this is an i
231c0 6c 6c 65 67 61 6c 20 65 6d 70 74 79 20 47 65 6f  llegal empty Geo
231d0 6d 65 74 72 79 20 21 21 21 20 2a 2f 0a 09 20 20  metry !!! */..  
231e0 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c  gaiaFreeGeomColl
231f0 20 28 67 65 6f 29 3b 0a 09 20 20 72 65 74 75 72   (geo);..  retur
23200 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  n NULL;.      }.
23210 20 20 20 20 72 65 74 75 72 6e 20 67 65 6f 3b 0a      return geo;.
23220 7d 0a 0a 47 41 49 41 47 45 4f 5f 44 45 43 4c 41  }..GAIAGEO_DECLA
23230 52 45 20 63 68 61 72 20 2a 0a 67 61 69 61 54 6f  RE char *.gaiaTo
23240 48 65 78 57 6b 62 20 28 67 61 69 61 47 65 6f 6d  HexWkb (gaiaGeom
23250 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 29 0a 7b 0a  CollPtr geom).{.
23260 2f 2a 20 62 75 69 6c 64 73 20 74 68 65 20 68 65  /* builds the he
23270 78 61 64 65 63 69 6d 61 6c 20 57 4b 42 20 72 65  xadecimal WKB re
23280 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66 6f 72  presentation for
23290 20 74 68 69 73 20 47 45 4f 4d 45 54 52 59 20 2a   this GEOMETRY *
232a0 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  /.    unsigned c
232b0 68 61 72 20 2a 77 6b 62 20 3d 20 4e 55 4c 4c 3b  har *wkb = NULL;
232c0 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20  .    int size = 
232d0 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 68 65 78  0;.    char *hex
232e0 62 75 66 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  buf = NULL;.    
232f0 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20  int i;.    char 
23300 68 65 78 5b 31 36 5d 3b 0a 20 20 20 20 63 68 61  hex[16];.    cha
23310 72 20 2a 70 3b 0a 20 20 20 20 67 61 69 61 54 6f  r *p;.    gaiaTo
23320 57 6b 62 20 28 67 65 6f 6d 2c 20 26 77 6b 62 2c  Wkb (geom, &wkb,
23330 20 26 73 69 7a 65 29 3b 0a 20 20 20 20 69 66 20   &size);.    if 
23340 28 21 77 6b 62 29 0a 09 72 65 74 75 72 6e 20 4e  (!wkb)..return N
23350 55 4c 4c 3b 0a 20 20 20 20 68 65 78 62 75 66 20  ULL;.    hexbuf 
23360 3d 20 6d 61 6c 6c 6f 63 20 28 28 73 69 7a 65 20  = malloc ((size 
23370 2a 20 32 29 20 2b 20 31 29 3b 0a 20 20 20 20 70  * 2) + 1);.    p
23380 20 3d 20 68 65 78 62 75 66 3b 0a 20 20 20 20 66   = hexbuf;.    f
23390 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 73  or (i = 0; i < s
233a0 69 7a 65 3b 20 69 2b 2b 29 0a 20 20 20 20 20 20  ize; i++).      
233b0 7b 0a 09 20 20 73 70 72 69 6e 74 66 20 28 68 65  {..  sprintf (he
233c0 78 2c 20 22 25 30 32 58 22 2c 20 2a 28 77 6b 62  x, "%02X", *(wkb
233d0 20 2b 20 69 29 29 3b 0a 09 20 20 2a 70 2b 2b 20   + i));..  *p++ 
233e0 3d 20 68 65 78 5b 30 5d 3b 0a 09 20 20 2a 70 2b  = hex[0];..  *p+
233f0 2b 20 3d 20 68 65 78 5b 31 5d 3b 0a 20 20 20 20  + = hex[1];.    
23400 20 20 7d 0a 20 20 20 20 2a 70 20 3d 20 27 5c 30    }.    *p = '\0
23410 27 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 65  ';.    return he
23420 78 62 75 66 3b 0a 7d 0a 0a 47 41 49 41 47 45 4f  xbuf;.}..GAIAGEO
23430 5f 44 45 43 4c 41 52 45 20 76 6f 69 64 0a 67 61  _DECLARE void.ga
23440 69 61 54 6f 57 6b 62 20 28 67 61 69 61 47 65 6f  iaToWkb (gaiaGeo
23450 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 2c 20 75  mCollPtr geom, u
23460 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 72  nsigned char **r
23470 65 73 75 6c 74 2c 20 69 6e 74 20 2a 73 69 7a 65  esult, int *size
23480 29 0a 7b 0a 2f 2a 20 62 75 69 6c 64 73 20 74 68  ).{./* builds th
23490 65 20 57 4b 42 20 72 65 70 72 65 73 65 6e 74 61  e WKB representa
234a0 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 47 45  tion for this GE
234b0 4f 4d 45 54 52 59 20 2a 2f 0a 20 20 20 20 69 6e  OMETRY */.    in
234c0 74 20 69 62 3b 0a 20 20 20 20 69 6e 74 20 69 76  t ib;.    int iv
234d0 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a  ;.    double x;.
234e0 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
234f0 20 20 64 6f 75 62 6c 65 20 7a 20 3d 20 30 2e 30    double z = 0.0
23500 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 20 3d  ;.    double m =
23510 20 30 2e 30 3b 0a 20 20 20 20 69 6e 74 20 65 6e   0.0;.    int en
23520 74 69 74 69 65 73 20 3d 20 30 3b 0a 20 20 20 20  tities = 0;.    
23530 69 6e 74 20 6e 5f 70 6f 69 6e 74 73 20 3d 20 30  int n_points = 0
23540 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 6c 69 6e 65  ;.    int n_line
23550 73 74 72 69 6e 67 73 20 3d 20 30 3b 0a 20 20 20  strings = 0;.   
23560 20 69 6e 74 20 6e 5f 70 6f 6c 79 67 6f 6e 73 20   int n_polygons 
23570 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 79 70  = 0;.    int typ
23580 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  e;.    unsigned 
23590 63 68 61 72 20 2a 70 74 72 3b 0a 20 20 20 20 67  char *ptr;.    g
235a0 61 69 61 50 6f 69 6e 74 50 74 72 20 70 74 3b 0a  aiaPointPtr pt;.
235b0 20 20 20 20 67 61 69 61 4c 69 6e 65 73 74 72 69      gaiaLinestri
235c0 6e 67 50 74 72 20 6c 6e 3b 0a 20 20 20 20 67 61  ngPtr ln;.    ga
235d0 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20 70 67 3b  iaPolygonPtr pg;
235e0 0a 20 20 20 20 67 61 69 61 52 69 6e 67 50 74 72  .    gaiaRingPtr
235f0 20 72 6e 67 3b 0a 20 20 20 20 67 61 69 61 50 6f   rng;.    gaiaPo
23600 69 6e 74 50 74 72 20 70 6f 69 6e 74 20 3d 20 4e  intPtr point = N
23610 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 4c 69 6e  ULL;.    gaiaLin
23620 65 73 74 72 69 6e 67 50 74 72 20 6c 69 6e 65 20  estringPtr line 
23630 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61  = NULL;.    gaia
23640 50 6f 6c 79 67 6f 6e 50 74 72 20 70 6f 6c 79 67  PolygonPtr polyg
23650 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
23660 20 65 6e 64 69 61 6e 5f 61 72 63 68 20 3d 20 67   endian_arch = g
23670 61 69 61 45 6e 64 69 61 6e 41 72 63 68 20 28 29  aiaEndianArch ()
23680 3b 0a 20 20 20 20 67 61 69 61 4d 62 72 47 65 6f  ;.    gaiaMbrGeo
23690 6d 65 74 72 79 20 28 67 65 6f 6d 29 3b 0a 2f 2a  metry (geom);./*
236a0 20 68 6f 77 20 6d 61 6e 79 20 65 6e 74 69 74 69   how many entiti
236b0 65 73 2c 20 61 6e 64 20 6f 66 20 77 68 61 74 20  es, and of what 
236c0 6b 69 6e 64 2c 20 64 6f 20 77 65 20 68 61 76 65  kind, do we have
236d0 20 3f 20 2a 2f 0a 20 20 20 20 70 74 20 3d 20 67   ? */.    pt = g
236e0 65 6f 6d 2d 3e 46 69 72 73 74 50 6f 69 6e 74 3b  eom->FirstPoint;
236f0 0a 20 20 20 20 77 68 69 6c 65 20 28 70 74 29 0a  .    while (pt).
23700 20 20 20 20 20 20 7b 0a 09 20 20 70 6f 69 6e 74        {..  point
23710 20 3d 20 70 74 3b 0a 09 20 20 65 6e 74 69 74 69   = pt;..  entiti
23720 65 73 2b 2b 3b 0a 09 20 20 6e 5f 70 6f 69 6e 74  es++;..  n_point
23730 73 2b 2b 3b 0a 09 20 20 70 74 20 3d 20 70 74 2d  s++;..  pt = pt-
23740 3e 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  >Next;.      }. 
23750 20 20 20 6c 6e 20 3d 20 67 65 6f 6d 2d 3e 46 69     ln = geom->Fi
23760 72 73 74 4c 69 6e 65 73 74 72 69 6e 67 3b 0a 20  rstLinestring;. 
23770 20 20 20 77 68 69 6c 65 20 28 6c 6e 29 0a 20 20     while (ln).  
23780 20 20 20 20 7b 0a 09 20 20 6c 69 6e 65 20 3d 20      {..  line = 
23790 6c 6e 3b 0a 09 20 20 65 6e 74 69 74 69 65 73 2b  ln;..  entities+
237a0 2b 3b 0a 09 20 20 6e 5f 6c 69 6e 65 73 74 72 69  +;..  n_linestri
237b0 6e 67 73 2b 2b 3b 0a 09 20 20 6c 6e 20 3d 20 6c  ngs++;..  ln = l
237c0 6e 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  n->Next;.      }
237d0 0a 20 20 20 20 70 67 20 3d 20 67 65 6f 6d 2d 3e  .    pg = geom->
237e0 46 69 72 73 74 50 6f 6c 79 67 6f 6e 3b 0a 20 20  FirstPolygon;.  
237f0 20 20 77 68 69 6c 65 20 28 70 67 29 0a 20 20 20    while (pg).   
23800 20 20 20 7b 0a 09 20 20 70 6f 6c 79 67 20 3d 20     {..  polyg = 
23810 70 67 3b 0a 09 20 20 65 6e 74 69 74 69 65 73 2b  pg;..  entities+
23820 2b 3b 0a 09 20 20 6e 5f 70 6f 6c 79 67 6f 6e 73  +;..  n_polygons
23830 2b 2b 3b 0a 09 20 20 70 67 20 3d 20 70 67 2d 3e  ++;..  pg = pg->
23840 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
23850 20 20 2a 73 69 7a 65 20 3d 20 30 3b 0a 20 20 20    *size = 0;.   
23860 20 2a 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b   *result = NULL;
23870 0a 20 20 20 20 69 66 20 28 6e 5f 70 6f 69 6e 74  .    if (n_point
23880 73 20 3d 3d 20 30 20 26 26 20 6e 5f 70 6f 6c 79  s == 0 && n_poly
23890 67 6f 6e 73 20 3d 3d 20 30 20 26 26 20 6e 5f 6c  gons == 0 && n_l
238a0 69 6e 65 73 74 72 69 6e 67 73 20 3d 3d 20 30 29  inestrings == 0)
238b0 0a 09 72 65 74 75 72 6e 3b 0a 2f 2a 20 6f 6b 2c  ..return;./* ok,
238c0 20 77 65 20 63 61 6e 20 64 65 74 65 72 6d 69 6e   we can determin
238d0 65 20 74 68 65 20 67 65 6f 6d 65 74 72 79 20 63  e the geometry c
238e0 6c 61 73 73 20 2a 2f 0a 20 20 20 20 69 66 20 28  lass */.    if (
238f0 6e 5f 70 6f 69 6e 74 73 20 3d 3d 20 31 20 26 26  n_points == 1 &&
23900 20 6e 5f 6c 69 6e 65 73 74 72 69 6e 67 73 20 3d   n_linestrings =
23910 3d 20 30 20 26 26 20 6e 5f 70 6f 6c 79 67 6f 6e  = 0 && n_polygon
23920 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a  s == 0).      {.
23930 09 20 20 69 66 20 28 67 65 6f 6d 2d 3e 44 65 63  .  if (geom->Dec
23940 6c 61 72 65 64 54 79 70 65 20 3d 3d 20 47 41 49  laredType == GAI
23950 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 29 0a 09 20  A_MULTIPOINT).. 
23960 20 20 20 7b 0a 09 09 69 66 20 28 67 65 6f 6d 2d     {...if (geom-
23970 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
23980 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09  == GAIA_XY_Z)...
23990 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f      type = GAIA_
239a0 4d 55 4c 54 49 50 4f 49 4e 54 5a 3b 0a 09 09 65  MULTIPOINTZ;...e
239b0 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69  lse if (geom->Di
239c0 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
239d0 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20  GAIA_XY_M)...   
239e0 20 74 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c   type = GAIA_MUL
239f0 54 49 50 4f 49 4e 54 4d 3b 0a 09 09 65 6c 73 65  TIPOINTM;...else
23a00 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e   if (geom->Dimen
23a10 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
23a20 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20 20  A_XY_Z_M)...    
23a30 74 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54  type = GAIA_MULT
23a40 49 50 4f 49 4e 54 5a 4d 3b 0a 09 09 65 6c 73 65  IPOINTZM;...else
23a50 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41  ...    type = GA
23a60 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 3b 0a 09  IA_MULTIPOINT;..
23a70 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 20 69 66      }..  else if
23a80 20 28 67 65 6f 6d 2d 3e 44 65 63 6c 61 72 65 64   (geom->Declared
23a90 54 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f  Type == GAIA_GEO
23aa0 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 29  METRYCOLLECTION)
23ab0 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 67 65  ..    {...if (ge
23ac0 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  om->DimensionMod
23ad0 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29  el == GAIA_XY_Z)
23ae0 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41  ...    type = GA
23af0 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45  IA_GEOMETRYCOLLE
23b00 43 54 49 4f 4e 5a 3b 0a 09 09 65 6c 73 65 20 69  CTIONZ;...else i
23b10 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69  f (geom->Dimensi
23b20 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
23b30 58 59 5f 4d 29 0a 09 09 20 20 20 20 74 79 70 65  XY_M)...    type
23b40 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59   = GAIA_GEOMETRY
23b50 43 4f 4c 4c 45 43 54 49 4f 4e 4d 3b 0a 09 09 65  COLLECTIONM;...e
23b60 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69  lse if (geom->Di
23b70 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
23b80 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20  GAIA_XY_Z_M)... 
23b90 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f 47     type = GAIA_G
23ba0 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f  EOMETRYCOLLECTIO
23bb0 4e 5a 4d 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20  NZM;...else...  
23bc0 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f 47 45    type = GAIA_GE
23bd0 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
23be0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65  ;..    }..  else
23bf0 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 67 65  ..    {...if (ge
23c00 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  om->DimensionMod
23c10 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29  el == GAIA_XY_Z)
23c20 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41  ...    type = GA
23c30 49 41 5f 50 4f 49 4e 54 5a 3b 0a 09 09 65 6c 73  IA_POINTZ;...els
23c40 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  e if (geom->Dime
23c50 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
23c60 49 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20 74  IA_XY_M)...    t
23c70 79 70 65 20 3d 20 47 41 49 41 5f 50 4f 49 4e 54  ype = GAIA_POINT
23c80 4d 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65  M;...else if (ge
23c90 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  om->DimensionMod
23ca0 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f  el == GAIA_XY_Z_
23cb0 4d 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20  M)...    type = 
23cc0 47 41 49 41 5f 50 4f 49 4e 54 5a 4d 3b 0a 09 09  GAIA_POINTZM;...
23cd0 65 6c 73 65 0a 09 09 20 20 20 20 74 79 70 65 20  else...    type 
23ce0 3d 20 47 41 49 41 5f 50 4f 49 4e 54 3b 0a 09 20  = GAIA_POINT;.. 
23cf0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
23d00 20 65 6c 73 65 20 69 66 20 28 6e 5f 70 6f 69 6e   else if (n_poin
23d10 74 73 20 3e 20 31 20 26 26 20 6e 5f 6c 69 6e 65  ts > 1 && n_line
23d20 73 74 72 69 6e 67 73 20 3d 3d 20 30 20 26 26 20  strings == 0 && 
23d30 6e 5f 70 6f 6c 79 67 6f 6e 73 20 3d 3d 20 30 29  n_polygons == 0)
23d40 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
23d50 67 65 6f 6d 2d 3e 44 65 63 6c 61 72 65 64 54 79  geom->DeclaredTy
23d60 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45  pe == GAIA_GEOME
23d70 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 29 0a 09  TRYCOLLECTION)..
23d80 20 20 20 20 7b 0a 09 09 69 66 20 28 67 65 6f 6d      {...if (geom
23d90 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
23da0 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09   == GAIA_XY_Z)..
23db0 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41  .    type = GAIA
23dc0 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
23dd0 49 4f 4e 5a 3b 0a 09 09 65 6c 73 65 20 69 66 20  IONZ;...else if 
23de0 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
23df0 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
23e00 5f 4d 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d  _M)...    type =
23e10 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f   GAIA_GEOMETRYCO
23e20 4c 4c 45 43 54 49 4f 4e 4d 3b 0a 09 09 65 6c 73  LLECTIONM;...els
23e30 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  e if (geom->Dime
23e40 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
23e50 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20  IA_XY_Z_M)...   
23e60 20 74 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f   type = GAIA_GEO
23e70 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a  METRYCOLLECTIONZ
23e80 4d 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20  M;...else...    
23e90 74 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d  type = GAIA_GEOM
23ea0 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 3b 0a  ETRYCOLLECTION;.
23eb0 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09  .    }..  else..
23ec0 20 20 20 20 7b 0a 09 09 69 66 20 28 67 65 6f 6d      {...if (geom
23ed0 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
23ee0 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09   == GAIA_XY_Z)..
23ef0 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41  .    type = GAIA
23f00 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a 3b 0a 09 09  _MULTIPOINTZ;...
23f10 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44  else if (geom->D
23f20 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d  imensionModel ==
23f30 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09 20 20   GAIA_XY_M)...  
23f40 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f 4d 55    type = GAIA_MU
23f50 4c 54 49 50 4f 49 4e 54 4d 3b 0a 09 09 65 6c 73  LTIPOINTM;...els
23f60 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  e if (geom->Dime
23f70 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
23f80 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20  IA_XY_Z_M)...   
23f90 20 74 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c   type = GAIA_MUL
23fa0 54 49 50 4f 49 4e 54 5a 4d 3b 0a 09 09 65 6c 73  TIPOINTZM;...els
23fb0 65 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47  e...    type = G
23fc0 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 3b 0a  AIA_MULTIPOINT;.
23fd0 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20  .    }.      }. 
23fe0 20 20 20 65 6c 73 65 20 69 66 20 28 6e 5f 70 6f     else if (n_po
23ff0 69 6e 74 73 20 3d 3d 20 30 20 26 26 20 6e 5f 6c  ints == 0 && n_l
24000 69 6e 65 73 74 72 69 6e 67 73 20 3d 3d 20 31 20  inestrings == 1 
24010 26 26 20 6e 5f 70 6f 6c 79 67 6f 6e 73 20 3d 3d  && n_polygons ==
24020 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69   0).      {..  i
24030 66 20 28 67 65 6f 6d 2d 3e 44 65 63 6c 61 72 65  f (geom->Declare
24040 64 54 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55  dType == GAIA_MU
24050 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 29 0a 09  LTILINESTRING)..
24060 20 20 20 20 7b 0a 09 09 69 66 20 28 67 65 6f 6d      {...if (geom
24070 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
24080 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09   == GAIA_XY_Z)..
24090 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41  .    type = GAIA
240a0 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47  _MULTILINESTRING
240b0 5a 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65  Z;...else if (ge
240c0 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  om->DimensionMod
240d0 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29  el == GAIA_XY_M)
240e0 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41  ...    type = GA
240f0 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49  IA_MULTILINESTRI
24100 4e 47 4d 3b 0a 09 09 65 6c 73 65 20 69 66 20 28  NGM;...else if (
24110 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d  geom->DimensionM
24120 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f  odel == GAIA_XY_
24130 5a 5f 4d 29 0a 09 09 20 20 20 20 74 79 70 65 20  Z_M)...    type 
24140 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45  = GAIA_MULTILINE
24150 53 54 52 49 4e 47 5a 4d 3b 0a 09 09 65 6c 73 65  STRINGZM;...else
24160 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41  ...    type = GA
24170 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49  IA_MULTILINESTRI
24180 4e 47 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c  NG;..    }..  el
24190 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 65 63  se if (geom->Dec
241a0 6c 61 72 65 64 54 79 70 65 20 3d 3d 20 47 41 49  laredType == GAI
241b0 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
241c0 54 49 4f 4e 29 0a 09 20 20 20 20 7b 0a 09 09 69  TION)..    {...i
241d0 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69  f (geom->Dimensi
241e0 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
241f0 58 59 5f 5a 29 0a 09 09 20 20 20 20 74 79 70 65  XY_Z)...    type
24200 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59   = GAIA_GEOMETRY
24210 43 4f 4c 4c 45 43 54 49 4f 4e 5a 3b 0a 09 09 65  COLLECTIONZ;...e
24220 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69  lse if (geom->Di
24230 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
24240 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20  GAIA_XY_M)...   
24250 20 74 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f   type = GAIA_GEO
24260 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 4d  METRYCOLLECTIONM
24270 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f  ;...else if (geo
24280 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
24290 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  l == GAIA_XY_Z_M
242a0 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47  )...    type = G
242b0 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
242c0 45 43 54 49 4f 4e 5a 4d 3b 0a 09 09 65 6c 73 65  ECTIONZM;...else
242d0 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41  ...    type = GA
242e0 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45  IA_GEOMETRYCOLLE
242f0 43 54 49 4f 4e 3b 0a 09 20 20 20 20 7d 0a 09 20  CTION;..    }.. 
24300 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 69   else..    {...i
24310 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69  f (geom->Dimensi
24320 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
24330 58 59 5f 5a 29 0a 09 09 20 20 20 20 74 79 70 65  XY_Z)...    type
24340 20 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49   = GAIA_LINESTRI
24350 4e 47 5a 3b 0a 09 09 65 6c 73 65 20 69 66 20 28  NGZ;...else if (
24360 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d  geom->DimensionM
24370 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f  odel == GAIA_XY_
24380 4d 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20  M)...    type = 
24390 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 4d  GAIA_LINESTRINGM
243a0 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f  ;...else if (geo
243b0 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
243c0 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  l == GAIA_XY_Z_M
243d0 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47  )...    type = G
243e0 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 4d  AIA_LINESTRINGZM
243f0 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 74  ;...else...    t
24400 79 70 65 20 3d 20 47 41 49 41 5f 4c 49 4e 45 53  ype = GAIA_LINES
24410 54 52 49 4e 47 3b 0a 09 20 20 20 20 7d 0a 20 20  TRING;..    }.  
24420 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
24430 66 20 28 6e 5f 70 6f 69 6e 74 73 20 3d 3d 20 30  f (n_points == 0
24440 20 26 26 20 6e 5f 6c 69 6e 65 73 74 72 69 6e 67   && n_linestring
24450 73 20 3e 20 31 20 26 26 20 6e 5f 70 6f 6c 79 67  s > 1 && n_polyg
24460 6f 6e 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20  ons == 0).      
24470 7b 0a 09 20 20 69 66 20 28 67 65 6f 6d 2d 3e 44  {..  if (geom->D
24480 65 63 6c 61 72 65 64 54 79 70 65 20 3d 3d 20 47  eclaredType == G
24490 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
244a0 45 43 54 49 4f 4e 29 0a 09 20 20 20 20 7b 0a 09  ECTION)..    {..
244b0 09 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e  .if (geom->Dimen
244c0 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
244d0 41 5f 58 59 5f 5a 29 0a 09 09 20 20 20 20 74 79  A_XY_Z)...    ty
244e0 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54  pe = GAIA_GEOMET
244f0 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 3b 0a 09  RYCOLLECTIONZ;..
24500 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e  .else if (geom->
24510 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
24520 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09 20  = GAIA_XY_M)... 
24530 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f 47     type = GAIA_G
24540 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f  EOMETRYCOLLECTIO
24550 4e 4d 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 67  NM;...else if (g
24560 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  eom->DimensionMo
24570 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a  del == GAIA_XY_Z
24580 5f 4d 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d  _M)...    type =
24590 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f   GAIA_GEOMETRYCO
245a0 4c 4c 45 43 54 49 4f 4e 5a 4d 3b 0a 09 09 65 6c  LLECTIONZM;...el
245b0 73 65 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20  se...    type = 
245c0 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
245d0 4c 45 43 54 49 4f 4e 3b 0a 09 20 20 20 20 7d 0a  LECTION;..    }.
245e0 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09  .  else..    {..
245f0 09 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e  .if (geom->Dimen
24600 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
24610 41 5f 58 59 5f 5a 29 0a 09 09 20 20 20 20 74 79  A_XY_Z)...    ty
24620 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c  pe = GAIA_MULTIL
24630 49 4e 45 53 54 52 49 4e 47 5a 3b 0a 09 09 65 6c  INESTRINGZ;...el
24640 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d  se if (geom->Dim
24650 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
24660 41 49 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20  AIA_XY_M)...    
24670 74 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54  type = GAIA_MULT
24680 49 4c 49 4e 45 53 54 52 49 4e 47 4d 3b 0a 09 09  ILINESTRINGM;...
24690 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44  else if (geom->D
246a0 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d  imensionModel ==
246b0 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09   GAIA_XY_Z_M)...
246c0 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f      type = GAIA_
246d0 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 5a  MULTILINESTRINGZ
246e0 4d 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20  M;...else...    
246f0 74 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54  type = GAIA_MULT
24700 49 4c 49 4e 45 53 54 52 49 4e 47 3b 0a 09 20 20  ILINESTRING;..  
24710 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24720 65 6c 73 65 20 69 66 20 28 6e 5f 70 6f 69 6e 74  else if (n_point
24730 73 20 3d 3d 20 30 20 26 26 20 6e 5f 6c 69 6e 65  s == 0 && n_line
24740 73 74 72 69 6e 67 73 20 3d 3d 20 30 20 26 26 20  strings == 0 && 
24750 6e 5f 70 6f 6c 79 67 6f 6e 73 20 3d 3d 20 31 29  n_polygons == 1)
24760 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
24770 67 65 6f 6d 2d 3e 44 65 63 6c 61 72 65 64 54 79  geom->DeclaredTy
24780 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49  pe == GAIA_MULTI
24790 50 4f 4c 59 47 4f 4e 29 0a 09 20 20 20 20 7b 0a  POLYGON)..    {.
247a0 09 09 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  ..if (geom->Dime
247b0 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
247c0 49 41 5f 58 59 5f 5a 29 0a 09 09 20 20 20 20 74  IA_XY_Z)...    t
247d0 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49  ype = GAIA_MULTI
247e0 50 4f 4c 59 47 4f 4e 5a 3b 0a 09 09 65 6c 73 65  POLYGONZ;...else
247f0 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e   if (geom->Dimen
24800 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
24810 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20 74 79  A_XY_M)...    ty
24820 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50  pe = GAIA_MULTIP
24830 4f 4c 59 47 4f 4e 4d 3b 0a 09 09 65 6c 73 65 20  OLYGONM;...else 
24840 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
24850 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
24860 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20 20 74  _XY_Z_M)...    t
24870 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49  ype = GAIA_MULTI
24880 50 4f 4c 59 47 4f 4e 5a 4d 3b 0a 09 09 65 6c 73  POLYGONZM;...els
24890 65 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20 47  e...    type = G
248a0 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e  AIA_MULTIPOLYGON
248b0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65  ;..    }..  else
248c0 20 69 66 20 28 67 65 6f 6d 2d 3e 44 65 63 6c 61   if (geom->Decla
248d0 72 65 64 54 79 70 65 20 3d 3d 20 47 41 49 41 5f  redType == GAIA_
248e0 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49  GEOMETRYCOLLECTI
248f0 4f 4e 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20  ON)..    {...if 
24900 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
24910 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
24920 5f 5a 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d  _Z)...    type =
24930 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f   GAIA_GEOMETRYCO
24940 4c 4c 45 43 54 49 4f 4e 5a 3b 0a 09 09 65 6c 73  LLECTIONZ;...els
24950 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  e if (geom->Dime
24960 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
24970 49 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20 74  IA_XY_M)...    t
24980 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45  ype = GAIA_GEOME
24990 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 4d 3b 0a  TRYCOLLECTIONM;.
249a0 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d  ..else if (geom-
249b0 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
249c0 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a  == GAIA_XY_Z_M).
249d0 09 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49  ..    type = GAI
249e0 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
249f0 54 49 4f 4e 5a 4d 3b 0a 09 09 65 6c 73 65 0a 09  TIONZM;...else..
24a00 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41  .    type = GAIA
24a10 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
24a20 49 4f 4e 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65  ION;..    }..  e
24a30 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 69 66 20  lse..    {...if 
24a40 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
24a50 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
24a60 5f 5a 29 0a 09 09 20 20 20 20 74 79 70 65 20 3d  _Z)...    type =
24a70 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 3b 0a   GAIA_POLYGONZ;.
24a80 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d  ..else if (geom-
24a90 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
24aa0 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09  == GAIA_XY_M)...
24ab0 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f      type = GAIA_
24ac0 50 4f 4c 59 47 4f 4e 4d 3b 0a 09 09 65 6c 73 65  POLYGONM;...else
24ad0 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e   if (geom->Dimen
24ae0 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
24af0 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20 20  A_XY_Z_M)...    
24b00 74 79 70 65 20 3d 20 47 41 49 41 5f 50 4f 4c 59  type = GAIA_POLY
24b10 47 4f 4e 5a 4d 3b 0a 09 09 65 6c 73 65 0a 09 09  GONZM;...else...
24b20 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f      type = GAIA_
24b30 50 4f 4c 59 47 4f 4e 3b 0a 09 20 20 20 20 7d 0a  POLYGON;..    }.
24b40 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
24b50 20 69 66 20 28 6e 5f 70 6f 69 6e 74 73 20 3d 3d   if (n_points ==
24b60 20 30 20 26 26 20 6e 5f 6c 69 6e 65 73 74 72 69   0 && n_linestri
24b70 6e 67 73 20 3d 3d 20 30 20 26 26 20 6e 5f 70 6f  ngs == 0 && n_po
24b80 6c 79 67 6f 6e 73 20 3e 20 31 29 0a 20 20 20 20  lygons > 1).    
24b90 20 20 7b 0a 09 20 20 69 66 20 28 67 65 6f 6d 2d    {..  if (geom-
24ba0 3e 44 65 63 6c 61 72 65 64 54 79 70 65 20 3d 3d  >DeclaredType ==
24bb0 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f   GAIA_GEOMETRYCO
24bc0 4c 4c 45 43 54 49 4f 4e 29 0a 09 20 20 20 20 7b  LLECTION)..    {
24bd0 0a 09 09 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d  ...if (geom->Dim
24be0 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
24bf0 41 49 41 5f 58 59 5f 5a 29 0a 09 09 20 20 20 20  AIA_XY_Z)...    
24c00 74 79 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d  type = GAIA_GEOM
24c10 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 3b  ETRYCOLLECTIONZ;
24c20 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d  ...else if (geom
24c30 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
24c40 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09   == GAIA_XY_M)..
24c50 09 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41  .    type = GAIA
24c60 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
24c70 49 4f 4e 4d 3b 0a 09 09 65 6c 73 65 20 69 66 20  IONM;...else if 
24c80 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
24c90 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
24ca0 5f 5a 5f 4d 29 0a 09 09 20 20 20 20 74 79 70 65  _Z_M)...    type
24cb0 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59   = GAIA_GEOMETRY
24cc0 43 4f 4c 4c 45 43 54 49 4f 4e 5a 4d 3b 0a 09 09  COLLECTIONZM;...
24cd0 65 6c 73 65 0a 09 09 20 20 20 20 74 79 70 65 20  else...    type 
24ce0 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43  = GAIA_GEOMETRYC
24cf0 4f 4c 4c 45 43 54 49 4f 4e 3b 0a 09 20 20 20 20  OLLECTION;..    
24d00 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b  }..  else..    {
24d10 0a 09 09 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d  ...if (geom->Dim
24d20 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
24d30 41 49 41 5f 58 59 5f 5a 29 0a 09 09 20 20 20 20  AIA_XY_Z)...    
24d40 74 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54  type = GAIA_MULT
24d50 49 50 4f 4c 59 47 4f 4e 5a 3b 0a 09 09 65 6c 73  IPOLYGONZ;...els
24d60 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  e if (geom->Dime
24d70 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
24d80 49 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20 74  IA_XY_M)...    t
24d90 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49  ype = GAIA_MULTI
24da0 50 4f 4c 59 47 4f 4e 4d 3b 0a 09 09 65 6c 73 65  POLYGONM;...else
24db0 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e   if (geom->Dimen
24dc0 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
24dd0 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20 20  A_XY_Z_M)...    
24de0 74 79 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54  type = GAIA_MULT
24df0 49 50 4f 4c 59 47 4f 4e 5a 4d 3b 0a 09 09 65 6c  IPOLYGONZM;...el
24e00 73 65 0a 09 09 20 20 20 20 74 79 70 65 20 3d 20  se...    type = 
24e10 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f  GAIA_MULTIPOLYGO
24e20 4e 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20  N;..    }.      
24e30 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20  }.    else.     
24e40 20 7b 0a 09 20 20 69 66 20 28 67 65 6f 6d 2d 3e   {..  if (geom->
24e50 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
24e60 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09 20 20  = GAIA_XY_Z)..  
24e70 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f      type = GAIA_
24e80 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49  GEOMETRYCOLLECTI
24e90 4f 4e 5a 3b 0a 09 20 20 65 6c 73 65 20 69 66 20  ONZ;..  else if 
24ea0 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
24eb0 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
24ec0 5f 4d 29 0a 09 20 20 20 20 20 20 74 79 70 65 20  _M)..      type 
24ed0 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43  = GAIA_GEOMETRYC
24ee0 4f 4c 4c 45 43 54 49 4f 4e 4d 3b 0a 09 20 20 65  OLLECTIONM;..  e
24ef0 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69  lse if (geom->Di
24f00 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
24f10 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 20 20  GAIA_XY_Z_M)..  
24f20 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f      type = GAIA_
24f30 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49  GEOMETRYCOLLECTI
24f40 4f 4e 5a 4d 3b 0a 09 20 20 65 6c 73 65 0a 09 20  ONZM;..  else.. 
24f50 20 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41       type = GAIA
24f60 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
24f70 49 4f 4e 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a 20  ION;.      }./* 
24f80 61 6e 64 20 6e 6f 77 20 77 65 20 63 6f 6d 70 75  and now we compu
24f90 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 57  te the size of W
24fa0 4b 42 20 2a 2f 0a 20 20 20 20 2a 73 69 7a 65 20  KB */.    *size 
24fb0 3d 20 35 3b 09 09 09 2f 2a 20 68 65 61 64 65 72  = 5;.../* header
24fc0 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 66 20   size */.    if 
24fd0 28 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55  (type == GAIA_MU
24fe0 4c 54 49 50 4f 49 4e 54 20 7c 7c 20 74 79 70 65  LTIPOINT || type
24ff0 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49   == GAIA_MULTILI
25000 4e 45 53 54 52 49 4e 47 0a 09 7c 7c 20 74 79 70  NESTRING..|| typ
25010 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50  e == GAIA_MULTIP
25020 4f 4c 59 47 4f 4e 20 7c 7c 20 74 79 70 65 20 3d  OLYGON || type =
25030 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43  = GAIA_GEOMETRYC
25040 4f 4c 4c 45 43 54 49 4f 4e 0a 09 7c 7c 20 74 79  OLLECTION..|| ty
25050 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49  pe == GAIA_MULTI
25060 50 4f 49 4e 54 5a 20 7c 7c 20 74 79 70 65 20 3d  POINTZ || type =
25070 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45  = GAIA_MULTILINE
25080 53 54 52 49 4e 47 5a 0a 09 7c 7c 20 74 79 70 65  STRINGZ..|| type
25090 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f   == GAIA_MULTIPO
250a0 4c 59 47 4f 4e 5a 20 7c 7c 20 74 79 70 65 20 3d  LYGONZ || type =
250b0 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43  = GAIA_GEOMETRYC
250c0 4f 4c 4c 45 43 54 49 4f 4e 5a 0a 09 7c 7c 20 74  OLLECTIONZ..|| t
250d0 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54  ype == GAIA_MULT
250e0 49 50 4f 49 4e 54 4d 20 7c 7c 20 74 79 70 65 20  IPOINTM || type 
250f0 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e  == GAIA_MULTILIN
25100 45 53 54 52 49 4e 47 4d 0a 09 7c 7c 20 74 79 70  ESTRINGM..|| typ
25110 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50  e == GAIA_MULTIP
25120 4f 4c 59 47 4f 4e 4d 20 7c 7c 20 74 79 70 65 20  OLYGONM || type 
25130 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59  == GAIA_GEOMETRY
25140 43 4f 4c 4c 45 43 54 49 4f 4e 4d 0a 09 7c 7c 20  COLLECTIONM..|| 
25150 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c  type == GAIA_MUL
25160 54 49 50 4f 49 4e 54 5a 4d 20 7c 7c 20 74 79 70  TIPOINTZM || typ
25170 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c  e == GAIA_MULTIL
25180 49 4e 45 53 54 52 49 4e 47 5a 4d 0a 09 7c 7c 20  INESTRINGZM..|| 
25190 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c  type == GAIA_MUL
251a0 54 49 50 4f 4c 59 47 4f 4e 5a 4d 20 7c 7c 20 74  TIPOLYGONZM || t
251b0 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d  ype == GAIA_GEOM
251c0 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 4d  ETRYCOLLECTIONZM
251d0 29 0a 09 2a 73 69 7a 65 20 2b 3d 20 34 3b 0a 20  )..*size += 4;. 
251e0 20 20 20 70 6f 69 6e 74 20 3d 20 67 65 6f 6d 2d     point = geom-
251f0 3e 46 69 72 73 74 50 6f 69 6e 74 3b 0a 20 20 20  >FirstPoint;.   
25200 20 77 68 69 6c 65 20 28 70 6f 69 6e 74 29 0a 20   while (point). 
25210 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 74 79       {..  if (ty
25220 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49  pe == GAIA_MULTI
25230 50 4f 49 4e 54 20 7c 7c 20 74 79 70 65 20 3d 3d  POINT || type ==
25240 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53   GAIA_MULTILINES
25250 54 52 49 4e 47 0a 09 20 20 20 20 20 20 7c 7c 20  TRING..      || 
25260 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c  type == GAIA_MUL
25270 54 49 50 4f 4c 59 47 4f 4e 20 7c 7c 20 74 79 70  TIPOLYGON || typ
25280 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54  e == GAIA_GEOMET
25290 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 0a 09 20 20  RYCOLLECTION..  
252a0 20 20 20 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47      || type == G
252b0 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a 20  AIA_MULTIPOINTZ 
252c0 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f  || type == GAIA_
252d0 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 5a  MULTILINESTRINGZ
252e0 0a 09 20 20 20 20 20 20 7c 7c 20 74 79 70 65 20  ..      || type 
252f0 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c  == GAIA_MULTIPOL
25300 59 47 4f 4e 5a 20 7c 7c 20 74 79 70 65 20 3d 3d  YGONZ || type ==
25310 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f   GAIA_GEOMETRYCO
25320 4c 4c 45 43 54 49 4f 4e 5a 0a 09 20 20 20 20 20  LLECTIONZ..     
25330 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41   || type == GAIA
25340 5f 4d 55 4c 54 49 50 4f 49 4e 54 4d 20 7c 7c 20  _MULTIPOINTM || 
25350 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c  type == GAIA_MUL
25360 54 49 4c 49 4e 45 53 54 52 49 4e 47 4d 0a 09 20  TILINESTRINGM.. 
25370 20 20 20 20 20 7c 7c 20 74 79 70 65 20 3d 3d 20       || type == 
25380 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f  GAIA_MULTIPOLYGO
25390 4e 4d 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41  NM || type == GA
253a0 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45  IA_GEOMETRYCOLLE
253b0 43 54 49 4f 4e 4d 0a 09 20 20 20 20 20 20 7c 7c  CTIONM..      ||
253c0 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55   type == GAIA_MU
253d0 4c 54 49 50 4f 49 4e 54 5a 4d 20 7c 7c 20 74 79  LTIPOINTZM || ty
253e0 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49  pe == GAIA_MULTI
253f0 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 0a 09 20 20  LINESTRINGZM..  
25400 20 20 20 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47      || type == G
25410 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e  AIA_MULTIPOLYGON
25420 5a 4d 0a 09 20 20 20 20 20 20 7c 7c 20 74 79 70  ZM..      || typ
25430 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54  e == GAIA_GEOMET
25440 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 4d 29 0a  RYCOLLECTIONZM).
25450 09 20 20 20 20 20 20 2a 73 69 7a 65 20 2b 3d 20  .      *size += 
25460 35 3b 0a 09 20 20 69 66 20 28 67 65 6f 6d 2d 3e  5;..  if (geom->
25470 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
25480 3d 20 47 41 49 41 5f 58 59 5f 5a 0a 09 20 20 20  = GAIA_XY_Z..   
25490 20 20 20 7c 7c 20 67 65 6f 6d 2d 3e 44 69 6d 65     || geom->Dime
254a0 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
254b0 49 41 5f 58 59 5f 4d 29 0a 09 20 20 20 20 20 20  IA_XY_M)..      
254c0 2a 73 69 7a 65 20 2b 3d 20 28 73 69 7a 65 6f 66  *size += (sizeof
254d0 20 28 64 6f 75 62 6c 65 29 20 2a 20 33 29 3b 09   (double) * 3);.
254e0 2f 2a 20 74 68 72 65 65 20 64 6f 75 62 6c 65 73  /* three doubles
254f0 20 66 6f 72 20 65 61 63 68 20 50 4f 49 4e 54 20   for each POINT 
25500 2a 2f 0a 09 20 20 65 6c 73 65 20 69 66 20 28 67  */..  else if (g
25510 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  eom->DimensionMo
25520 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a  del == GAIA_XY_Z
25530 5f 4d 29 0a 09 20 20 20 20 20 20 2a 73 69 7a 65  _M)..      *size
25540 20 2b 3d 20 28 73 69 7a 65 6f 66 20 28 64 6f 75   += (sizeof (dou
25550 62 6c 65 29 20 2a 20 34 29 3b 09 2f 2a 20 66 6f  ble) * 4);./* fo
25560 75 72 20 64 6f 75 62 6c 65 73 20 66 6f 72 20 65  ur doubles for e
25570 61 63 68 20 50 4f 49 4e 54 20 2a 2f 0a 09 20 20  ach POINT */..  
25580 65 6c 73 65 0a 09 20 20 20 20 20 20 2a 73 69 7a  else..      *siz
25590 65 20 2b 3d 20 28 73 69 7a 65 6f 66 20 28 64 6f  e += (sizeof (do
255a0 75 62 6c 65 29 20 2a 20 32 29 3b 09 2f 2a 20 74  uble) * 2);./* t
255b0 77 6f 20 64 6f 75 62 6c 65 73 20 66 6f 72 20 65  wo doubles for e
255c0 61 63 68 20 50 4f 49 4e 54 20 2a 2f 0a 09 20 20  ach POINT */..  
255d0 70 6f 69 6e 74 20 3d 20 70 6f 69 6e 74 2d 3e 4e  point = point->N
255e0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
255f0 20 6c 69 6e 65 20 3d 20 67 65 6f 6d 2d 3e 46 69   line = geom->Fi
25600 72 73 74 4c 69 6e 65 73 74 72 69 6e 67 3b 0a 20  rstLinestring;. 
25610 20 20 20 77 68 69 6c 65 20 28 6c 69 6e 65 29 0a     while (line).
25620 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 74        {..  if (t
25630 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54  ype == GAIA_MULT
25640 49 50 4f 49 4e 54 20 7c 7c 20 74 79 70 65 20 3d  IPOINT || type =
25650 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45  = GAIA_MULTILINE
25660 53 54 52 49 4e 47 0a 09 20 20 20 20 20 20 7c 7c  STRING..      ||
25670 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55   type == GAIA_MU
25680 4c 54 49 50 4f 4c 59 47 4f 4e 20 7c 7c 20 74 79  LTIPOLYGON || ty
25690 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45  pe == GAIA_GEOME
256a0 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 0a 09 20  TRYCOLLECTION.. 
256b0 20 20 20 20 20 7c 7c 20 74 79 70 65 20 3d 3d 20       || type == 
256c0 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a  GAIA_MULTIPOINTZ
256d0 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41   || type == GAIA
256e0 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47  _MULTILINESTRING
256f0 5a 0a 09 20 20 20 20 20 20 7c 7c 20 74 79 70 65  Z..      || type
25700 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f   == GAIA_MULTIPO
25710 4c 59 47 4f 4e 5a 20 7c 7c 20 74 79 70 65 20 3d  LYGONZ || type =
25720 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43  = GAIA_GEOMETRYC
25730 4f 4c 4c 45 43 54 49 4f 4e 5a 0a 09 20 20 20 20  OLLECTIONZ..    
25740 20 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49    || type == GAI
25750 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 4d 20 7c 7c  A_MULTIPOINTM ||
25760 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55   type == GAIA_MU
25770 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 4d 0a 09  LTILINESTRINGM..
25780 20 20 20 20 20 20 7c 7c 20 74 79 70 65 20 3d 3d        || type ==
25790 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47   GAIA_MULTIPOLYG
257a0 4f 4e 4d 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47  ONM || type == G
257b0 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
257c0 45 43 54 49 4f 4e 4d 0a 09 20 20 20 20 20 20 7c  ECTIONM..      |
257d0 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d  | type == GAIA_M
257e0 55 4c 54 49 50 4f 49 4e 54 5a 4d 20 7c 7c 20 74  ULTIPOINTZM || t
257f0 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54  ype == GAIA_MULT
25800 49 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 0a 09 20  ILINESTRINGZM.. 
25810 20 20 20 20 20 7c 7c 20 74 79 70 65 20 3d 3d 20       || type == 
25820 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f  GAIA_MULTIPOLYGO
25830 4e 5a 4d 0a 09 20 20 20 20 20 20 7c 7c 20 74 79  NZM..      || ty
25840 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45  pe == GAIA_GEOME
25850 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 4d 29  TRYCOLLECTIONZM)
25860 0a 09 20 20 20 20 20 20 2a 73 69 7a 65 20 2b 3d  ..      *size +=
25870 20 35 3b 0a 09 20 20 69 66 20 28 67 65 6f 6d 2d   5;..  if (geom-
25880 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20  >DimensionModel 
25890 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 0a 09 20 20  == GAIA_XY_Z..  
258a0 20 20 20 20 7c 7c 20 67 65 6f 6d 2d 3e 44 69 6d      || geom->Dim
258b0 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
258c0 41 49 41 5f 58 59 5f 4d 29 0a 09 20 20 20 20 20  AIA_XY_M)..     
258d0 20 2a 73 69 7a 65 20 2b 3d 20 28 34 20 2b 20 28   *size += (4 + (
258e0 28 73 69 7a 65 6f 66 20 28 64 6f 75 62 6c 65 29  (sizeof (double)
258f0 20 2a 20 33 29 20 2a 20 6c 69 6e 65 2d 3e 50 6f   * 3) * line->Po
25900 69 6e 74 73 29 29 3b 09 2f 2a 20 23 20 70 6f 69  ints));./* # poi
25910 6e 74 73 20 2b 20 5b 78 2c 79 2c 7a 5d 20 66 6f  nts + [x,y,z] fo
25920 72 20 65 61 63 68 20 76 65 72 74 65 78 20 2a 2f  r each vertex */
25930 0a 09 20 20 65 6c 73 65 20 69 66 20 28 67 65 6f  ..  else if (geo
25940 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
25950 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  l == GAIA_XY_Z_M
25960 29 0a 09 20 20 20 20 20 20 2a 73 69 7a 65 20 2b  )..      *size +
25970 3d 20 28 34 20 2b 20 28 28 73 69 7a 65 6f 66 20  = (4 + ((sizeof 
25980 28 64 6f 75 62 6c 65 29 20 2a 20 34 29 20 2a 20  (double) * 4) * 
25990 6c 69 6e 65 2d 3e 50 6f 69 6e 74 73 29 29 3b 09  line->Points));.
259a0 2f 2a 20 23 20 70 6f 69 6e 74 73 20 2b 20 5b 78  /* # points + [x
259b0 2c 79 2c 7a 2c 6d 5d 20 66 6f 72 20 65 61 63 68  ,y,z,m] for each
259c0 20 76 65 72 74 65 78 20 2a 2f 0a 09 20 20 65 6c   vertex */..  el
259d0 73 65 0a 09 20 20 20 20 20 20 2a 73 69 7a 65 20  se..      *size 
259e0 2b 3d 20 28 34 20 2b 20 28 28 73 69 7a 65 6f 66  += (4 + ((sizeof
259f0 20 28 64 6f 75 62 6c 65 29 20 2a 20 32 29 20 2a   (double) * 2) *
25a00 20 6c 69 6e 65 2d 3e 50 6f 69 6e 74 73 29 29 3b   line->Points));
25a10 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20 2b 20 5b  ./* # points + [
25a20 78 2c 79 5d 20 66 6f 72 20 65 61 63 68 20 76 65  x,y] for each ve
25a30 72 74 65 78 20 2a 2f 0a 09 20 20 6c 69 6e 65 20  rtex */..  line 
25a40 3d 20 6c 69 6e 65 2d 3e 4e 65 78 74 3b 0a 20 20  = line->Next;.  
25a50 20 20 20 20 7d 0a 20 20 20 20 70 6f 6c 79 67 20      }.    polyg 
25a60 3d 20 67 65 6f 6d 2d 3e 46 69 72 73 74 50 6f 6c  = geom->FirstPol
25a70 79 67 6f 6e 3b 0a 20 20 20 20 77 68 69 6c 65 20  ygon;.    while 
25a80 28 70 6f 6c 79 67 29 0a 20 20 20 20 20 20 7b 0a  (polyg).      {.
25a90 09 20 20 69 66 20 28 74 79 70 65 20 3d 3d 20 47  .  if (type == G
25aa0 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 20 7c  AIA_MULTIPOINT |
25ab0 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d  | type == GAIA_M
25ac0 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 0a 09  ULTILINESTRING..
25ad0 20 20 20 20 20 20 7c 7c 20 74 79 70 65 20 3d 3d        || type ==
25ae0 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47   GAIA_MULTIPOLYG
25af0 4f 4e 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41  ON || type == GA
25b00 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45  IA_GEOMETRYCOLLE
25b10 43 54 49 4f 4e 0a 09 20 20 20 20 20 20 7c 7c 20  CTION..      || 
25b20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c  type == GAIA_MUL
25b30 54 49 50 4f 49 4e 54 5a 20 7c 7c 20 74 79 70 65  TIPOINTZ || type
25b40 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49   == GAIA_MULTILI
25b50 4e 45 53 54 52 49 4e 47 5a 0a 09 20 20 20 20 20  NESTRINGZ..     
25b60 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41   || type == GAIA
25b70 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a 20 7c  _MULTIPOLYGONZ |
25b80 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 47  | type == GAIA_G
25b90 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f  EOMETRYCOLLECTIO
25ba0 4e 5a 0a 09 20 20 20 20 20 20 7c 7c 20 74 79 70  NZ..      || typ
25bb0 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50  e == GAIA_MULTIP
25bc0 4f 49 4e 54 4d 20 7c 7c 20 74 79 70 65 20 3d 3d  OINTM || type ==
25bd0 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53   GAIA_MULTILINES
25be0 54 52 49 4e 47 4d 0a 09 20 20 20 20 20 20 7c 7c  TRINGM..      ||
25bf0 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55   type == GAIA_MU
25c00 4c 54 49 50 4f 4c 59 47 4f 4e 4d 20 7c 7c 20 74  LTIPOLYGONM || t
25c10 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d  ype == GAIA_GEOM
25c20 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 4d 0a  ETRYCOLLECTIONM.
25c30 09 20 20 20 20 20 20 7c 7c 20 74 79 70 65 20 3d  .      || type =
25c40 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e  = GAIA_MULTIPOIN
25c50 54 5a 4d 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47  TZM || type == G
25c60 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52  AIA_MULTILINESTR
25c70 49 4e 47 5a 4d 0a 09 20 20 20 20 20 20 7c 7c 20  INGZM..      || 
25c80 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c  type == GAIA_MUL
25c90 54 49 50 4f 4c 59 47 4f 4e 5a 4d 0a 09 20 20 20  TIPOLYGONZM..   
25ca0 20 20 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41     || type == GA
25cb0 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45  IA_GEOMETRYCOLLE
25cc0 43 54 49 4f 4e 5a 4d 29 0a 09 20 20 20 20 20 20  CTIONZM)..      
25cd0 2a 73 69 7a 65 20 2b 3d 20 35 3b 0a 09 20 20 72  *size += 5;..  r
25ce0 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e 45 78 74 65  ng = polyg->Exte
25cf0 72 69 6f 72 3b 0a 09 20 20 69 66 20 28 67 65 6f  rior;..  if (geo
25d00 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
25d10 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 0a 09  l == GAIA_XY_Z..
25d20 20 20 20 20 20 20 7c 7c 20 67 65 6f 6d 2d 3e 44        || geom->D
25d30 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d  imensionModel ==
25d40 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 20 20 20   GAIA_XY_M)..   
25d50 20 20 20 2a 73 69 7a 65 20 2b 3d 20 28 38 20 2b     *size += (8 +
25d60 20 28 28 73 69 7a 65 6f 66 20 28 64 6f 75 62 6c   ((sizeof (doubl
25d70 65 29 20 2a 20 33 29 20 2a 20 72 6e 67 2d 3e 50  e) * 3) * rng->P
25d80 6f 69 6e 74 73 29 29 3b 09 2f 2a 20 23 20 72 69  oints));./* # ri
25d90 6e 67 73 20 2b 20 23 20 70 6f 69 6e 74 73 20 2b  ngs + # points +
25da0 20 5b 78 2c 79 2c 7a 5d 20 61 72 72 61 79 20 2d   [x,y,z] array -
25db0 20 65 78 74 65 72 69 6f 72 20 72 69 6e 67 20 2a   exterior ring *
25dc0 2f 0a 09 20 20 65 6c 73 65 20 69 66 20 28 67 65  /..  else if (ge
25dd0 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  om->DimensionMod
25de0 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f  el == GAIA_XY_Z_
25df0 4d 29 0a 09 20 20 20 20 20 20 2a 73 69 7a 65 20  M)..      *size 
25e00 2b 3d 20 28 38 20 2b 20 28 28 73 69 7a 65 6f 66  += (8 + ((sizeof
25e10 20 28 64 6f 75 62 6c 65 29 20 2a 20 34 29 20 2a   (double) * 4) *
25e20 20 72 6e 67 2d 3e 50 6f 69 6e 74 73 29 29 3b 09   rng->Points));.
25e30 2f 2a 20 23 20 72 69 6e 67 73 20 2b 20 23 20 70  /* # rings + # p
25e40 6f 69 6e 74 73 20 2b 20 5b 78 2c 79 2c 7a 2c 6d  oints + [x,y,z,m
25e50 5d 20 61 72 72 61 79 20 2d 20 65 78 74 65 72 69  ] array - exteri
25e60 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 20 20 65 6c  or ring */..  el
25e70 73 65 0a 09 20 20 20 20 20 20 2a 73 69 7a 65 20  se..      *size 
25e80 2b 3d 20 28 38 20 2b 20 28 28 73 69 7a 65 6f 66  += (8 + ((sizeof
25e90 20 28 64 6f 75 62 6c 65 29 20 2a 20 32 29 20 2a   (double) * 2) *
25ea0 20 72 6e 67 2d 3e 50 6f 69 6e 74 73 29 29 3b 09   rng->Points));.
25eb0 2f 2a 20 23 20 72 69 6e 67 73 20 2b 20 23 20 70  /* # rings + # p
25ec0 6f 69 6e 74 73 20 2b 20 5b 78 2c 79 5d 20 61 72  oints + [x,y] ar
25ed0 72 61 79 20 2d 20 65 78 74 65 72 69 6f 72 20 72  ray - exterior r
25ee0 69 6e 67 20 2a 2f 0a 09 20 20 66 6f 72 20 28 69  ing */..  for (i
25ef0 62 20 3d 20 30 3b 20 69 62 20 3c 20 70 6f 6c 79  b = 0; ib < poly
25f00 67 2d 3e 4e 75 6d 49 6e 74 65 72 69 6f 72 73 3b  g->NumInteriors;
25f10 20 69 62 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09   ib++)..    {...
25f20 72 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e 49 6e 74  rng = polyg->Int
25f30 65 72 69 6f 72 73 20 2b 20 69 62 3b 0a 09 09 69  eriors + ib;...i
25f40 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69  f (geom->Dimensi
25f50 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
25f60 58 59 5f 5a 0a 09 09 20 20 20 20 7c 7c 20 67 65  XY_Z...    || ge
25f70 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  om->DimensionMod
25f80 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29  el == GAIA_XY_M)
25f90 0a 09 09 20 20 20 20 2a 73 69 7a 65 20 2b 3d 20  ...    *size += 
25fa0 28 34 20 2b 20 28 28 73 69 7a 65 6f 66 20 28 64  (4 + ((sizeof (d
25fb0 6f 75 62 6c 65 29 20 2a 20 33 29 20 2a 20 72 6e  ouble) * 3) * rn
25fc0 67 2d 3e 50 6f 69 6e 74 73 29 29 3b 09 2f 2a 20  g->Points));./* 
25fd0 23 20 70 6f 69 6e 74 73 20 2b 20 5b 78 2c 79 2c  # points + [x,y,
25fe0 7a 5d 20 61 72 72 61 79 20 2d 20 69 6e 74 65 72  z] array - inter
25ff0 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 09 65 6c  ior ring */...el
26000 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d  se if (geom->Dim
26010 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
26020 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20  AIA_XY_Z_M)...  
26030 20 20 2a 73 69 7a 65 20 2b 3d 20 28 34 20 2b 20    *size += (4 + 
26040 28 28 73 69 7a 65 6f 66 20 28 64 6f 75 62 6c 65  ((sizeof (double
26050 29 20 2a 20 34 29 20 2a 20 72 6e 67 2d 3e 50 6f  ) * 4) * rng->Po
26060 69 6e 74 73 29 29 3b 09 2f 2a 20 23 20 70 6f 69  ints));./* # poi
26070 6e 74 73 20 2b 20 5b 78 2c 79 2c 7a 2c 6d 5d 20  nts + [x,y,z,m] 
26080 61 72 72 61 79 20 2d 20 69 6e 74 65 72 69 6f 72  array - interior
26090 20 72 69 6e 67 20 2a 2f 0a 09 09 65 6c 73 65 0a   ring */...else.
260a0 09 09 20 20 20 20 2a 73 69 7a 65 20 2b 3d 20 28  ..    *size += (
260b0 34 20 2b 20 28 28 73 69 7a 65 6f 66 20 28 64 6f  4 + ((sizeof (do
260c0 75 62 6c 65 29 20 2a 20 32 29 20 2a 20 72 6e 67  uble) * 2) * rng
260d0 2d 3e 50 6f 69 6e 74 73 29 29 3b 09 2f 2a 20 23  ->Points));./* #
260e0 20 70 6f 69 6e 74 73 20 2b 20 5b 78 2c 79 5d 20   points + [x,y] 
260f0 61 72 72 61 79 20 2d 20 69 6e 74 65 72 69 6f 72  array - interior
26100 20 72 69 6e 67 20 2a 2f 0a 09 20 20 20 20 7d 0a   ring */..    }.
26110 09 20 20 70 6f 6c 79 67 20 3d 20 70 6f 6c 79 67  .  polyg = polyg
26120 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  ->Next;.      }.
26130 20 20 20 20 2a 72 65 73 75 6c 74 20 3d 20 6d 61      *result = ma
26140 6c 6c 6f 63 20 28 2a 73 69 7a 65 29 3b 0a 20 20  lloc (*size);.  
26150 20 20 70 74 72 20 3d 20 2a 72 65 73 75 6c 74 3b    ptr = *result;
26160 0a 2f 2a 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20  ./* and finally 
26170 77 65 20 62 75 69 6c 64 20 74 68 65 20 57 4b 42  we build the WKB
26180 20 2a 2f 0a 20 20 20 20 2a 70 74 72 20 3d 20 30   */.    *ptr = 0
26190 78 30 31 3b 09 09 2f 2a 20 6c 69 74 74 6c 65 20  x01;../* little 
261a0 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65  endian byte orde
261b0 72 20 2a 2f 0a 20 20 20 20 67 61 69 61 45 78 70  r */.    gaiaExp
261c0 6f 72 74 33 32 20 28 70 74 72 20 2b 20 31 2c 20  ort32 (ptr + 1, 
261d0 74 79 70 65 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  type, 1, endian_
261e0 61 72 63 68 29 3b 09 2f 2a 20 74 68 65 20 6d 61  arch);./* the ma
261f0 69 6e 20 43 4c 41 53 53 20 54 59 50 45 20 2a 2f  in CLASS TYPE */
26200 0a 20 20 20 20 70 74 72 20 2b 3d 20 35 3b 0a 20  .    ptr += 5;. 
26210 20 20 20 69 66 20 28 74 79 70 65 20 3d 3d 20 47     if (type == G
26220 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 20 7c  AIA_MULTIPOINT |
26230 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d  | type == GAIA_M
26240 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 0a 09  ULTILINESTRING..
26250 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f  || type == GAIA_
26260 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 20 7c 7c 20  MULTIPOLYGON || 
26270 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f  type == GAIA_GEO
26280 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 0a  METRYCOLLECTION.
26290 09 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41  .|| type == GAIA
262a0 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a 20 7c 7c 20  _MULTIPOINTZ || 
262b0 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c  type == GAIA_MUL
262c0 54 49 4c 49 4e 45 53 54 52 49 4e 47 5a 0a 09 7c  TILINESTRINGZ..|
262d0 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d  | type == GAIA_M
262e0 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a 20 7c 7c 20  ULTIPOLYGONZ || 
262f0 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f  type == GAIA_GEO
26300 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a  METRYCOLLECTIONZ
26310 0a 09 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49  ..|| type == GAI
26320 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 4d 20 7c 7c  A_MULTIPOINTM ||
26330 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55   type == GAIA_MU
26340 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 4d 0a 09  LTILINESTRINGM..
26350 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f  || type == GAIA_
26360 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 4d 20 7c 7c  MULTIPOLYGONM ||
26370 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45   type == GAIA_GE
26380 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
26390 4d 0a 09 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41  M..|| type == GA
263a0 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a 4d 20  IA_MULTIPOINTZM 
263b0 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f  || type == GAIA_
263c0 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 5a  MULTILINESTRINGZ
263d0 4d 0a 09 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41  M..|| type == GA
263e0 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a  IA_MULTIPOLYGONZ
263f0 4d 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49  M || type == GAI
26400 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
26410 54 49 4f 4e 5a 4d 29 0a 20 20 20 20 20 20 7b 0a  TIONZM).      {.
26420 09 20 20 67 61 69 61 45 78 70 6f 72 74 33 32 20  .  gaiaExport32 
26430 28 70 74 72 2c 20 65 6e 74 69 74 69 65 73 2c 20  (ptr, entities, 
26440 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
26450 09 2f 2a 20 69 74 27 73 20 61 20 63 6f 6c 6c 65  ./* it's a colle
26460 63 74 69 6f 6e 3b 20 23 20 65 6e 74 69 74 69 65  ction; # entitie
26470 73 20 2a 2f 0a 09 20 20 70 74 72 20 2b 3d 20 34  s */..  ptr += 4
26480 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 6f  ;.      }.    po
26490 69 6e 74 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73  int = geom->Firs
264a0 74 50 6f 69 6e 74 3b 0a 20 20 20 20 77 68 69 6c  tPoint;.    whil
264b0 65 20 28 70 6f 69 6e 74 29 0a 20 20 20 20 20 20  e (point).      
264c0 7b 0a 09 20 20 69 66 20 28 74 79 70 65 20 3d 3d  {..  if (type ==
264d0 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54   GAIA_MULTIPOINT
264e0 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41   || type == GAIA
264f0 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
26500 49 4f 4e 0a 09 20 20 20 20 20 20 7c 7c 20 74 79  ION..      || ty
26510 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49  pe == GAIA_MULTI
26520 50 4f 49 4e 54 5a 20 7c 7c 20 74 79 70 65 20 3d  POINTZ || type =
26530 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43  = GAIA_GEOMETRYC
26540 4f 4c 4c 45 43 54 49 4f 4e 5a 0a 09 20 20 20 20  OLLECTIONZ..    
26550 20 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49    || type == GAI
26560 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 4d 20 7c 7c  A_MULTIPOINTM ||
26570 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45   type == GAIA_GE
26580 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
26590 4d 0a 09 20 20 20 20 20 20 7c 7c 20 74 79 70 65  M..      || type
265a0 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f   == GAIA_MULTIPO
265b0 49 4e 54 5a 4d 20 7c 7c 20 74 79 70 65 20 3d 3d  INTZM || type ==
265c0 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f   GAIA_GEOMETRYCO
265d0 4c 4c 45 43 54 49 4f 4e 5a 4d 29 0a 09 20 20 20  LLECTIONZM)..   
265e0 20 7b 0a 09 09 2a 70 74 72 20 3d 20 30 78 30 31   {...*ptr = 0x01
265f0 3b 0a 09 09 2f 2a 20 69 74 27 73 20 61 20 63 6f  ;.../* it's a co
26600 6c 6c 65 63 74 69 6f 6e 3a 20 74 68 65 20 43 4c  llection: the CL
26610 41 53 53 20 54 59 50 45 20 66 6f 72 20 74 68 69  ASS TYPE for thi
26620 73 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 09 09 69  s element */...i
26630 66 20 28 74 79 70 65 20 3d 3d 20 47 41 49 41 5f  f (type == GAIA_
26640 4d 55 4c 54 49 50 4f 49 4e 54 5a 0a 09 09 20 20  MULTIPOINTZ...  
26650 20 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49    || type == GAI
26660 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
26670 54 49 4f 4e 5a 29 0a 09 09 20 20 20 20 67 61 69  TIONZ)...    gai
26680 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 20 2b  aExport32 (ptr +
26690 20 31 2c 20 47 41 49 41 5f 50 4f 49 4e 54 5a 2c   1, GAIA_POINTZ,
266a0 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
266b0 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 74 79 70  ;...else if (typ
266c0 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50  e == GAIA_MULTIP
266d0 4f 49 4e 54 4d 0a 09 09 09 20 7c 7c 20 74 79 70  OINTM.... || typ
266e0 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54  e == GAIA_GEOMET
266f0 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 4d 29 0a 09  RYCOLLECTIONM)..
26700 09 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 33  .    gaiaExport3
26710 32 20 28 70 74 72 20 2b 20 31 2c 20 47 41 49 41  2 (ptr + 1, GAIA
26720 5f 50 4f 49 4e 54 4d 2c 20 31 2c 20 65 6e 64 69  _POINTM, 1, endi
26730 61 6e 5f 61 72 63 68 29 3b 0a 09 09 65 6c 73 65  an_arch);...else
26740 20 69 66 20 28 74 79 70 65 20 3d 3d 20 47 41 49   if (type == GAI
26750 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a 4d 0a 09  A_MULTIPOINTZM..
26760 09 09 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41  .. || type == GA
26770 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45  IA_GEOMETRYCOLLE
26780 43 54 49 4f 4e 5a 4d 29 0a 09 09 20 20 20 20 67  CTIONZM)...    g
26790 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72  aiaExport32 (ptr
267a0 20 2b 20 31 2c 20 47 41 49 41 5f 50 4f 49 4e 54   + 1, GAIA_POINT
267b0 5a 4d 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72  ZM, 1, endian_ar
267c0 63 68 29 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20  ch);...else...  
267d0 20 20 67 61 69 61 45 78 70 6f 72 74 33 32 20 28    gaiaExport32 (
267e0 70 74 72 20 2b 20 31 2c 20 47 41 49 41 5f 50 4f  ptr + 1, GAIA_PO
267f0 49 4e 54 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  INT, 1, endian_a
26800 72 63 68 29 3b 0a 09 09 70 74 72 20 2b 3d 20 35  rch);...ptr += 5
26810 3b 0a 09 20 20 20 20 7d 0a 09 20 20 67 61 69 61  ;..    }..  gaia
26820 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20 70  Export64 (ptr, p
26830 6f 69 6e 74 2d 3e 58 2c 20 31 2c 20 65 6e 64 69  oint->X, 1, endi
26840 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 58 20 2a  an_arch);./* X *
26850 2f 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 36  /..  gaiaExport6
26860 34 20 28 70 74 72 20 2b 20 38 2c 20 70 6f 69 6e  4 (ptr + 8, poin
26870 74 2d 3e 59 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  t->Y, 1, endian_
26880 61 72 63 68 29 3b 09 2f 2a 20 59 20 2a 2f 0a 09  arch);./* Y */..
26890 20 20 70 74 72 20 2b 3d 20 31 36 3b 0a 09 20 20    ptr += 16;..  
268a0 69 66 20 28 74 79 70 65 20 3d 3d 20 47 41 49 41  if (type == GAIA
268b0 5f 50 4f 49 4e 54 5a 20 7c 7c 20 74 79 70 65 20  _POINTZ || type 
268c0 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49  == GAIA_MULTIPOI
268d0 4e 54 5a 0a 09 20 20 20 20 20 20 7c 7c 20 74 79  NTZ..      || ty
268e0 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45  pe == GAIA_GEOME
268f0 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 29 0a  TRYCOLLECTIONZ).
26900 09 20 20 20 20 7b 0a 09 09 67 61 69 61 45 78 70  .    {...gaiaExp
26910 6f 72 74 36 34 20 28 70 74 72 2c 20 70 6f 69 6e  ort64 (ptr, poin
26920 74 2d 3e 5a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  t->Z, 1, endian_
26930 61 72 63 68 29 3b 09 2f 2a 20 5a 20 2a 2f 0a 09  arch);./* Z */..
26940 09 70 74 72 20 2b 3d 20 38 3b 0a 09 20 20 20 20  .ptr += 8;..    
26950 7d 0a 09 20 20 69 66 20 28 74 79 70 65 20 3d 3d  }..  if (type ==
26960 20 47 41 49 41 5f 50 4f 49 4e 54 4d 20 7c 7c 20   GAIA_POINTM || 
26970 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c  type == GAIA_MUL
26980 54 49 50 4f 49 4e 54 4d 0a 09 20 20 20 20 20 20  TIPOINTM..      
26990 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f  || type == GAIA_
269a0 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49  GEOMETRYCOLLECTI
269b0 4f 4e 4d 29 0a 09 20 20 20 20 7b 0a 09 09 67 61  ONM)..    {...ga
269c0 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c  iaExport64 (ptr,
269d0 20 70 6f 69 6e 74 2d 3e 4d 2c 20 31 2c 20 65 6e   point->M, 1, en
269e0 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d  dian_arch);./* M
269f0 20 2a 2f 0a 09 09 70 74 72 20 2b 3d 20 38 3b 0a   */...ptr += 8;.
26a00 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 74 79  .    }..  if (ty
26a10 70 65 20 3d 3d 20 47 41 49 41 5f 50 4f 49 4e 54  pe == GAIA_POINT
26a20 5a 4d 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41  ZM || type == GA
26a30 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 5a 4d 0a  IA_MULTIPOINTZM.
26a40 09 20 20 20 20 20 20 7c 7c 20 74 79 70 65 20 3d  .      || type =
26a50 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43  = GAIA_GEOMETRYC
26a60 4f 4c 4c 45 43 54 49 4f 4e 5a 4d 29 0a 09 20 20  OLLECTIONZM)..  
26a70 20 20 7b 0a 09 09 67 61 69 61 45 78 70 6f 72 74    {...gaiaExport
26a80 36 34 20 28 70 74 72 2c 20 70 6f 69 6e 74 2d 3e  64 (ptr, point->
26a90 5a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  Z, 1, endian_arc
26aa0 68 29 3b 09 2f 2a 20 5a 20 2a 2f 0a 09 09 67 61  h);./* Z */...ga
26ab0 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20  iaExport64 (ptr 
26ac0 2b 20 38 2c 20 70 6f 69 6e 74 2d 3e 4d 2c 20 31  + 8, point->M, 1
26ad0 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
26ae0 2f 2a 20 4d 20 2a 2f 0a 09 09 70 74 72 20 2b 3d  /* M */...ptr +=
26af0 20 31 36 3b 0a 09 20 20 20 20 7d 0a 09 20 20 70   16;..    }..  p
26b00 6f 69 6e 74 20 3d 20 70 6f 69 6e 74 2d 3e 4e 65  oint = point->Ne
26b10 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
26b20 6c 69 6e 65 20 3d 20 67 65 6f 6d 2d 3e 46 69 72  line = geom->Fir
26b30 73 74 4c 69 6e 65 73 74 72 69 6e 67 3b 0a 20 20  stLinestring;.  
26b40 20 20 77 68 69 6c 65 20 28 6c 69 6e 65 29 0a 20    while (line). 
26b50 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 74 79       {..  if (ty
26b60 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49  pe == GAIA_MULTI
26b70 4c 49 4e 45 53 54 52 49 4e 47 20 7c 7c 20 74 79  LINESTRING || ty
26b80 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45  pe == GAIA_GEOME
26b90 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 0a 09 20  TRYCOLLECTION.. 
26ba0 20 20 20 20 20 7c 7c 20 74 79 70 65 20 3d 3d 20       || type == 
26bb0 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54  GAIA_MULTILINEST
26bc0 52 49 4e 47 5a 0a 09 20 20 20 20 20 20 7c 7c 20  RINGZ..      || 
26bd0 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f  type == GAIA_GEO
26be0 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a  METRYCOLLECTIONZ
26bf0 0a 09 20 20 20 20 20 20 7c 7c 20 74 79 70 65 20  ..      || type 
26c00 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e  == GAIA_MULTILIN
26c10 45 53 54 52 49 4e 47 4d 0a 09 20 20 20 20 20 20  ESTRINGM..      
26c20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f  || type == GAIA_
26c30 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49  GEOMETRYCOLLECTI
26c40 4f 4e 4d 0a 09 20 20 20 20 20 20 7c 7c 20 74 79  ONM..      || ty
26c50 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49  pe == GAIA_MULTI
26c60 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 0a 09 20 20  LINESTRINGZM..  
26c70 20 20 20 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47      || type == G
26c80 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
26c90 45 43 54 49 4f 4e 5a 4d 29 0a 09 20 20 20 20 7b  ECTIONZM)..    {
26ca0 0a 09 09 2a 70 74 72 20 3d 20 30 78 30 31 3b 0a  ...*ptr = 0x01;.
26cb0 09 09 2f 2a 20 69 74 27 73 20 61 20 63 6f 6c 6c  ../* it's a coll
26cc0 65 63 74 69 6f 6e 3a 20 74 68 65 20 43 4c 41 53  ection: the CLAS
26cd0 53 20 54 59 50 45 20 66 6f 72 20 74 68 69 73 20  S TYPE for this 
26ce0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 09 09 69 66 20  element */...if 
26cf0 28 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55  (type == GAIA_MU
26d00 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 5a 0a 09  LTILINESTRINGZ..
26d10 09 20 20 20 20 7c 7c 20 74 79 70 65 20 3d 3d 20  .    || type == 
26d20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
26d30 4c 45 43 54 49 4f 4e 5a 29 0a 09 09 20 20 20 20  LECTIONZ)...    
26d40 67 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74  gaiaExport32 (pt
26d50 72 20 2b 20 31 2c 20 47 41 49 41 5f 4c 49 4e 45  r + 1, GAIA_LINE
26d60 53 54 52 49 4e 47 5a 2c 20 31 2c 20 65 6e 64 69  STRINGZ, 1, endi
26d70 61 6e 5f 61 72 63 68 29 3b 0a 09 09 65 6c 73 65  an_arch);...else
26d80 20 69 66 20 28 74 79 70 65 20 3d 3d 20 47 41 49   if (type == GAI
26d90 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e  A_MULTILINESTRIN
26da0 47 4d 0a 09 09 09 20 7c 7c 20 74 79 70 65 20 3d  GM.... || type =
26db0 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43  = GAIA_GEOMETRYC
26dc0 4f 4c 4c 45 43 54 49 4f 4e 4d 29 0a 09 09 20 20  OLLECTIONM)...  
26dd0 20 20 67 61 69 61 45 78 70 6f 72 74 33 32 20 28    gaiaExport32 (
26de0 70 74 72 20 2b 20 31 2c 20 47 41 49 41 5f 4c 49  ptr + 1, GAIA_LI
26df0 4e 45 53 54 52 49 4e 47 4d 2c 20 31 2c 20 65 6e  NESTRINGM, 1, en
26e00 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 65 6c  dian_arch);...el
26e10 73 65 20 69 66 20 28 74 79 70 65 20 3d 3d 20 47  se if (type == G
26e20 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52  AIA_MULTILINESTR
26e30 49 4e 47 5a 4d 0a 09 09 09 20 7c 7c 20 74 79 70  INGZM.... || typ
26e40 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54  e == GAIA_GEOMET
26e50 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 4d 29 0a  RYCOLLECTIONZM).
26e60 09 09 20 20 20 20 67 61 69 61 45 78 70 6f 72 74  ..    gaiaExport
26e70 33 32 20 28 70 74 72 20 2b 20 31 2c 20 47 41 49  32 (ptr + 1, GAI
26e80 41 5f 4c 49 4e 45 53 54 52 49 4e 47 5a 4d 2c 20  A_LINESTRINGZM, 
26e90 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
26ea0 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 67 61  ...else...    ga
26eb0 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 20  iaExport32 (ptr 
26ec0 2b 20 31 2c 20 47 41 49 41 5f 4c 49 4e 45 53 54  + 1, GAIA_LINEST
26ed0 52 49 4e 47 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  RING, 1, endian_
26ee0 61 72 63 68 29 3b 0a 09 09 70 74 72 20 2b 3d 20  arch);...ptr += 
26ef0 35 3b 0a 09 20 20 20 20 7d 0a 09 20 20 67 61 69  5;..    }..  gai
26f00 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 2c 20  aExport32 (ptr, 
26f10 6c 69 6e 65 2d 3e 50 6f 69 6e 74 73 2c 20 31 2c  line->Points, 1,
26f20 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
26f30 2a 20 23 20 70 6f 69 6e 74 73 20 2a 2f 0a 09 20  * # points */.. 
26f40 20 70 74 72 20 2b 3d 20 34 3b 0a 09 20 20 66 6f   ptr += 4;..  fo
26f50 72 20 28 69 76 20 3d 20 30 3b 20 69 76 20 3c 20  r (iv = 0; iv < 
26f60 6c 69 6e 65 2d 3e 50 6f 69 6e 74 73 3b 20 69 76  line->Points; iv
26f70 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20  ++)..    {...if 
26f80 28 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4c 49  (type == GAIA_LI
26f90 4e 45 53 54 52 49 4e 47 5a 20 7c 7c 20 74 79 70  NESTRINGZ || typ
26fa0 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c  e == GAIA_MULTIL
26fb0 49 4e 45 53 54 52 49 4e 47 5a 0a 09 09 20 20 20  INESTRINGZ...   
26fc0 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41   || type == GAIA
26fd0 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
26fe0 49 4f 4e 5a 29 0a 09 09 20 20 7b 0a 09 09 20 20  IONZ)...  {...  
26ff0 20 20 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74      gaiaGetPoint
27000 58 59 5a 20 28 6c 69 6e 65 2d 3e 43 6f 6f 72 64  XYZ (line->Coord
27010 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26  s, iv, &x, &y, &
27020 7a 29 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65  z);...  }...else
27030 20 69 66 20 28 74 79 70 65 20 3d 3d 20 47 41 49   if (type == GAI
27040 41 5f 4c 49 4e 45 53 54 52 49 4e 47 4d 0a 09 09  A_LINESTRINGM...
27050 09 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49  . || type == GAI
27060 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e  A_MULTILINESTRIN
27070 47 4d 0a 09 09 09 20 7c 7c 20 74 79 70 65 20 3d  GM.... || type =
27080 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43  = GAIA_GEOMETRYC
27090 4f 4c 4c 45 43 54 49 4f 4e 4d 29 0a 09 09 20 20  OLLECTIONM)...  
270a0 7b 0a 09 09 20 20 20 20 20 20 67 61 69 61 47 65  {...      gaiaGe
270b0 74 50 6f 69 6e 74 58 59 4d 20 28 6c 69 6e 65 2d  tPointXYM (line-
270c0 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c  >Coords, iv, &x,
270d0 20 26 79 2c 20 26 6d 29 3b 0a 09 09 20 20 7d 0a   &y, &m);...  }.
270e0 09 09 65 6c 73 65 20 69 66 20 28 74 79 70 65 20  ..else if (type 
270f0 3d 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49  == GAIA_LINESTRI
27100 4e 47 5a 4d 0a 09 09 09 20 7c 7c 20 74 79 70 65  NGZM.... || type
27110 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49   == GAIA_MULTILI
27120 4e 45 53 54 52 49 4e 47 5a 4d 0a 09 09 09 20 7c  NESTRINGZM.... |
27130 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 47  | type == GAIA_G
27140 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f  EOMETRYCOLLECTIO
27150 4e 5a 4d 29 0a 09 09 20 20 7b 0a 09 09 20 20 20  NZM)...  {...   
27160 20 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74 58     gaiaGetPointX
27170 59 5a 4d 20 28 6c 69 6e 65 2d 3e 43 6f 6f 72 64  YZM (line->Coord
27180 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26  s, iv, &x, &y, &
27190 7a 2c 20 26 6d 29 3b 0a 09 09 20 20 7d 0a 09 09  z, &m);...  }...
271a0 65 6c 73 65 0a 09 09 20 20 7b 0a 09 09 20 20 20  else...  {...   
271b0 20 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74 20     gaiaGetPoint 
271c0 28 6c 69 6e 65 2d 3e 43 6f 6f 72 64 73 2c 20 69  (line->Coords, i
271d0 76 2c 20 26 78 2c 20 26 79 29 3b 0a 09 09 20 20  v, &x, &y);...  
271e0 7d 0a 09 09 67 61 69 61 45 78 70 6f 72 74 36 34  }...gaiaExport64
271f0 20 28 70 74 72 2c 20 78 2c 20 31 2c 20 65 6e 64   (ptr, x, 1, end
27200 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 58 20  ian_arch);./* X 
27210 2a 2f 0a 09 09 67 61 69 61 45 78 70 6f 72 74 36  */...gaiaExport6
27220 34 20 28 70 74 72 20 2b 20 38 2c 20 79 2c 20 31  4 (ptr + 8, y, 1
27230 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
27240 2f 2a 20 59 20 2a 2f 0a 09 09 70 74 72 20 2b 3d  /* Y */...ptr +=
27250 20 31 36 3b 0a 09 09 69 66 20 28 74 79 70 65 20   16;...if (type 
27260 3d 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49  == GAIA_LINESTRI
27270 4e 47 5a 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47  NGZ || type == G
27280 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52  AIA_MULTILINESTR
27290 49 4e 47 5a 0a 09 09 20 20 20 20 7c 7c 20 74 79  INGZ...    || ty
272a0 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45  pe == GAIA_GEOME
272b0 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 29 0a  TRYCOLLECTIONZ).
272c0 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61  ..  {...      ga
272d0 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c  iaExport64 (ptr,
272e0 20 7a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72   z, 1, endian_ar
272f0 63 68 29 3b 09 2f 2a 20 5a 20 2a 2f 0a 09 09 20  ch);./* Z */... 
27300 20 20 20 20 20 70 74 72 20 2b 3d 20 38 3b 0a 09       ptr += 8;..
27310 09 20 20 7d 0a 09 09 69 66 20 28 74 79 70 65 20  .  }...if (type 
27320 3d 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49  == GAIA_LINESTRI
27330 4e 47 4d 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47  NGM || type == G
27340 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52  AIA_MULTILINESTR
27350 49 4e 47 4d 0a 09 09 20 20 20 20 7c 7c 20 74 79  INGM...    || ty
27360 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45  pe == GAIA_GEOME
27370 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 4d 29 0a  TRYCOLLECTIONM).
27380 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61  ..  {...      ga
27390 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c  iaExport64 (ptr,
273a0 20 6d 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72   m, 1, endian_ar
273b0 63 68 29 3b 09 2f 2a 20 4d 20 2a 2f 0a 09 09 20  ch);./* M */... 
273c0 20 20 20 20 20 70 74 72 20 2b 3d 20 38 3b 0a 09       ptr += 8;..
273d0 09 20 20 7d 0a 09 09 69 66 20 28 74 79 70 65 20  .  }...if (type 
273e0 3d 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49  == GAIA_LINESTRI
273f0 4e 47 5a 4d 20 7c 7c 20 74 79 70 65 20 3d 3d 20  NGZM || type == 
27400 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54  GAIA_MULTILINEST
27410 52 49 4e 47 5a 4d 0a 09 09 20 20 20 20 7c 7c 20  RINGZM...    || 
27420 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f  type == GAIA_GEO
27430 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a  METRYCOLLECTIONZ
27440 4d 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20  M)...  {...     
27450 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70   gaiaExport64 (p
27460 74 72 2c 20 7a 2c 20 31 2c 20 65 6e 64 69 61 6e  tr, z, 1, endian
27470 5f 61 72 63 68 29 3b 09 2f 2a 20 5a 20 2a 2f 0a  _arch);./* Z */.
27480 09 09 20 20 20 20 20 20 67 61 69 61 45 78 70 6f  ..      gaiaExpo
27490 72 74 36 34 20 28 70 74 72 20 2b 20 38 2c 20 6d  rt64 (ptr + 8, m
274a0 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
274b0 29 3b 09 2f 2a 20 4d 20 2a 2f 0a 09 09 20 20 20  );./* M */...   
274c0 20 20 20 70 74 72 20 2b 3d 20 31 36 3b 0a 09 09     ptr += 16;...
274d0 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 6c 69    }..    }..  li
274e0 6e 65 20 3d 20 6c 69 6e 65 2d 3e 4e 65 78 74 3b  ne = line->Next;
274f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 6f 6c  .      }.    pol
27500 79 67 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73 74  yg = geom->First
27510 50 6f 6c 79 67 6f 6e 3b 0a 20 20 20 20 77 68 69  Polygon;.    whi
27520 6c 65 20 28 70 6f 6c 79 67 29 0a 20 20 20 20 20  le (polyg).     
27530 20 7b 0a 09 20 20 69 66 20 28 74 79 70 65 20 3d   {..  if (type =
27540 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59  = GAIA_MULTIPOLY
27550 47 4f 4e 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47  GON || type == G
27560 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
27570 45 43 54 49 4f 4e 0a 09 20 20 20 20 20 20 7c 7c  ECTION..      ||
27580 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55   type == GAIA_MU
27590 4c 54 49 50 4f 4c 59 47 4f 4e 5a 20 7c 7c 20 74  LTIPOLYGONZ || t
275a0 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d  ype == GAIA_GEOM
275b0 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 0a  ETRYCOLLECTIONZ.
275c0 09 20 20 20 20 20 20 7c 7c 20 74 79 70 65 20 3d  .      || type =
275d0 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59  = GAIA_MULTIPOLY
275e0 47 4f 4e 4d 20 7c 7c 20 74 79 70 65 20 3d 3d 20  GONM || type == 
275f0 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
27600 4c 45 43 54 49 4f 4e 4d 0a 09 20 20 20 20 20 20  LECTIONM..      
27610 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f  || type == GAIA_
27620 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a 4d 0a 09  MULTIPOLYGONZM..
27630 20 20 20 20 20 20 7c 7c 20 74 79 70 65 20 3d 3d        || type ==
27640 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f   GAIA_GEOMETRYCO
27650 4c 4c 45 43 54 49 4f 4e 5a 4d 29 0a 09 20 20 20  LLECTIONZM)..   
27660 20 7b 0a 09 09 2a 70 74 72 20 3d 20 30 78 30 31   {...*ptr = 0x01
27670 3b 0a 09 09 2f 2a 20 69 74 27 73 20 61 20 63 6f  ;.../* it's a co
27680 6c 6c 65 63 74 69 6f 6e 3a 20 74 68 65 20 43 4c  llection: the CL
27690 41 53 53 20 54 59 50 45 20 66 6f 72 20 74 68 69  ASS TYPE for thi
276a0 73 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 09 09 69  s element */...i
276b0 66 20 28 74 79 70 65 20 3d 3d 20 47 41 49 41 5f  f (type == GAIA_
276c0 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a 0a 09 09  MULTIPOLYGONZ...
276d0 20 20 20 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47      || type == G
276e0 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
276f0 45 43 54 49 4f 4e 5a 29 0a 09 09 20 20 20 20 67  ECTIONZ)...    g
27700 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72  aiaExport32 (ptr
27710 20 2b 20 31 2c 20 47 41 49 41 5f 50 4f 4c 59 47   + 1, GAIA_POLYG
27720 4f 4e 5a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  ONZ, 1, endian_a
27730 72 63 68 29 3b 0a 09 09 65 6c 73 65 20 69 66 20  rch);...else if 
27740 28 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55  (type == GAIA_MU
27750 4c 54 49 50 4f 4c 59 47 4f 4e 4d 0a 09 09 09 20  LTIPOLYGONM.... 
27760 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f  || type == GAIA_
27770 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49  GEOMETRYCOLLECTI
27780 4f 4e 4d 29 0a 09 09 20 20 20 20 67 61 69 61 45  ONM)...    gaiaE
27790 78 70 6f 72 74 33 32 20 28 70 74 72 20 2b 20 31  xport32 (ptr + 1
277a0 2c 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 4d 2c  , GAIA_POLYGONM,
277b0 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
277c0 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 74 79 70  ;...else if (typ
277d0 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50  e == GAIA_MULTIP
277e0 4f 4c 59 47 4f 4e 5a 4d 0a 09 09 09 20 7c 7c 20  OLYGONZM.... || 
277f0 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f  type == GAIA_GEO
27800 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a  METRYCOLLECTIONZ
27810 4d 29 0a 09 09 20 20 20 20 67 61 69 61 45 78 70  M)...    gaiaExp
27820 6f 72 74 33 32 20 28 70 74 72 20 2b 20 31 2c 20  ort32 (ptr + 1, 
27830 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 4d 2c 20  GAIA_POLYGONZM, 
27840 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
27850 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 67 61  ...else...    ga
27860 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 20  iaExport32 (ptr 
27870 2b 20 31 2c 20 47 41 49 41 5f 50 4f 4c 59 47 4f  + 1, GAIA_POLYGO
27880 4e 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  N, 1, endian_arc
27890 68 29 3b 0a 09 09 70 74 72 20 2b 3d 20 35 3b 0a  h);...ptr += 5;.
278a0 09 20 20 20 20 7d 0a 09 20 20 67 61 69 61 45 78  .    }..  gaiaEx
278b0 70 6f 72 74 33 32 20 28 70 74 72 2c 20 70 6f 6c  port32 (ptr, pol
278c0 79 67 2d 3e 4e 75 6d 49 6e 74 65 72 69 6f 72 73  yg->NumInteriors
278d0 20 2b 20 31 2c 20 31 2c 20 65 6e 64 69 61 6e 5f   + 1, 1, endian_
278e0 61 72 63 68 29 3b 09 2f 2a 20 23 20 72 69 6e 67  arch);./* # ring
278f0 73 20 2a 2f 0a 09 20 20 72 6e 67 20 3d 20 70 6f  s */..  rng = po
27900 6c 79 67 2d 3e 45 78 74 65 72 69 6f 72 3b 0a 09  lyg->Exterior;..
27910 20 20 67 61 69 61 45 78 70 6f 72 74 33 32 20 28    gaiaExport32 (
27920 70 74 72 20 2b 20 34 2c 20 72 6e 67 2d 3e 50 6f  ptr + 4, rng->Po
27930 69 6e 74 73 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  ints, 1, endian_
27940 61 72 63 68 29 3b 09 2f 2a 20 23 20 70 6f 69 6e  arch);./* # poin
27950 74 73 20 2d 20 65 78 74 65 72 69 6f 72 20 72 69  ts - exterior ri
27960 6e 67 20 2a 2f 0a 09 20 20 70 74 72 20 2b 3d 20  ng */..  ptr += 
27970 38 3b 0a 09 20 20 66 6f 72 20 28 69 76 20 3d 20  8;..  for (iv = 
27980 30 3b 20 69 76 20 3c 20 72 6e 67 2d 3e 50 6f 69  0; iv < rng->Poi
27990 6e 74 73 3b 20 69 76 2b 2b 29 0a 09 20 20 20 20  nts; iv++)..    
279a0 7b 0a 09 09 69 66 20 28 74 79 70 65 20 3d 3d 20  {...if (type == 
279b0 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 20 7c 7c  GAIA_POLYGONZ ||
279c0 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55   type == GAIA_MU
279d0 4c 54 49 50 4f 4c 59 47 4f 4e 5a 0a 09 09 20 20  LTIPOLYGONZ...  
279e0 20 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49    || type == GAI
279f0 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
27a00 54 49 4f 4e 5a 29 0a 09 09 20 20 7b 0a 09 09 20  TIONZ)...  {... 
27a10 20 20 20 20 20 67 61 69 61 47 65 74 50 6f 69 6e       gaiaGetPoin
27a20 74 58 59 5a 20 28 72 6e 67 2d 3e 43 6f 6f 72 64  tXYZ (rng->Coord
27a30 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26  s, iv, &x, &y, &
27a40 7a 29 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65  z);...  }...else
27a50 20 69 66 20 28 74 79 70 65 20 3d 3d 20 47 41 49   if (type == GAI
27a60 41 5f 50 4f 4c 59 47 4f 4e 4d 20 7c 7c 20 74 79  A_POLYGONM || ty
27a70 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49  pe == GAIA_MULTI
27a80 50 4f 4c 59 47 4f 4e 4d 0a 09 09 09 20 7c 7c 20  POLYGONM.... || 
27a90 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f  type == GAIA_GEO
27aa0 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 4d  METRYCOLLECTIONM
27ab0 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  )...  {...      
27ac0 67 61 69 61 47 65 74 50 6f 69 6e 74 58 59 4d 20  gaiaGetPointXYM 
27ad0 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76  (rng->Coords, iv
27ae0 2c 20 26 78 2c 20 26 79 2c 20 26 6d 29 3b 0a 09  , &x, &y, &m);..
27af0 09 20 20 7d 0a 09 09 65 6c 73 65 20 69 66 20 28  .  }...else if (
27b00 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 50 4f 4c  type == GAIA_POL
27b10 59 47 4f 4e 5a 4d 20 7c 7c 20 74 79 70 65 20 3d  YGONZM || type =
27b20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59  = GAIA_MULTIPOLY
27b30 47 4f 4e 5a 4d 0a 09 09 09 20 7c 7c 20 74 79 70  GONZM.... || typ
27b40 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54  e == GAIA_GEOMET
27b50 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 4d 29 0a  RYCOLLECTIONZM).
27b60 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61  ..  {...      ga
27b70 69 61 47 65 74 50 6f 69 6e 74 58 59 5a 4d 20 28  iaGetPointXYZM (
27b80 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c  rng->Coords, iv,
27b90 20 26 78 2c 20 26 79 2c 20 26 7a 2c 20 26 6d 29   &x, &y, &z, &m)
27ba0 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a 09  ;...  }...else..
27bb0 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61 69  .  {...      gai
27bc0 61 47 65 74 50 6f 69 6e 74 20 28 72 6e 67 2d 3e  aGetPoint (rng->
27bd0 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20  Coords, iv, &x, 
27be0 26 79 29 3b 0a 09 09 20 20 7d 0a 09 09 67 61 69  &y);...  }...gai
27bf0 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20  aExport64 (ptr, 
27c00 78 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  x, 1, endian_arc
27c10 68 29 3b 09 2f 2a 20 58 20 2d 20 65 78 74 65 72  h);./* X - exter
27c20 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 09 67 61  ior ring */...ga
27c30 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 20  iaExport64 (ptr 
27c40 2b 20 38 2c 20 79 2c 20 31 2c 20 65 6e 64 69 61  + 8, y, 1, endia
27c50 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 59 20 2d 20  n_arch);./* Y - 
27c60 65 78 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f  exterior ring */
27c70 0a 09 09 70 74 72 20 2b 3d 20 31 36 3b 0a 09 09  ...ptr += 16;...
27c80 69 66 20 28 74 79 70 65 20 3d 3d 20 47 41 49 41  if (type == GAIA
27c90 5f 50 4f 4c 59 47 4f 4e 5a 20 7c 7c 20 74 79 70  _POLYGONZ || typ
27ca0 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50  e == GAIA_MULTIP
27cb0 4f 4c 59 47 4f 4e 5a 0a 09 09 20 20 20 20 7c 7c  OLYGONZ...    ||
27cc0 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45   type == GAIA_GE
27cd0 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
27ce0 5a 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20  Z)...  {...     
27cf0 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70   gaiaExport64 (p
27d00 74 72 2c 20 7a 2c 20 31 2c 20 65 6e 64 69 61 6e  tr, z, 1, endian
27d10 5f 61 72 63 68 29 3b 09 2f 2a 20 5a 20 2d 20 65  _arch);./* Z - e
27d20 78 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a  xterior ring */.
27d30 09 09 20 20 20 20 20 20 70 74 72 20 2b 3d 20 38  ..      ptr += 8
27d40 3b 0a 09 09 20 20 7d 0a 09 09 69 66 20 28 74 79  ;...  }...if (ty
27d50 70 65 20 3d 3d 20 47 41 49 41 5f 50 4f 4c 59 47  pe == GAIA_POLYG
27d60 4f 4e 4d 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47  ONM || type == G
27d70 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e  AIA_MULTIPOLYGON
27d80 4d 0a 09 09 20 20 20 20 7c 7c 20 74 79 70 65 20  M...    || type 
27d90 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59  == GAIA_GEOMETRY
27da0 43 4f 4c 4c 45 43 54 49 4f 4e 4d 29 0a 09 09 20  COLLECTIONM)... 
27db0 20 7b 0a 09 09 20 20 20 20 20 20 67 61 69 61 45   {...      gaiaE
27dc0 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20 6d 2c  xport64 (ptr, m,
27dd0 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
27de0 3b 09 2f 2a 20 4d 20 2d 20 65 78 74 65 72 69 6f  ;./* M - exterio
27df0 72 20 72 69 6e 67 20 2a 2f 0a 09 09 20 20 20 20  r ring */...    
27e00 20 20 70 74 72 20 2b 3d 20 38 3b 0a 09 09 20 20    ptr += 8;...  
27e10 7d 0a 09 09 69 66 20 28 74 79 70 65 20 3d 3d 20  }...if (type == 
27e20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 4d 20 7c  GAIA_POLYGONZM |
27e30 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d  | type == GAIA_M
27e40 55 4c 54 49 50 4f 4c 59 47 4f 4e 5a 4d 0a 09 09  ULTIPOLYGONZM...
27e50 20 20 20 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47      || type == G
27e60 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
27e70 45 43 54 49 4f 4e 5a 4d 29 0a 09 09 20 20 7b 0a  ECTIONZM)...  {.
27e80 09 09 20 20 20 20 20 20 67 61 69 61 45 78 70 6f  ..      gaiaExpo
27e90 72 74 36 34 20 28 70 74 72 2c 20 7a 2c 20 31 2c  rt64 (ptr, z, 1,
27ea0 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
27eb0 2a 20 5a 20 2d 20 65 78 74 65 72 69 6f 72 20 72  * Z - exterior r
27ec0 69 6e 67 20 2a 2f 0a 09 09 20 20 20 20 20 20 67  ing */...      g
27ed0 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
27ee0 20 2b 20 38 2c 20 6d 2c 20 31 2c 20 65 6e 64 69   + 8, m, 1, endi
27ef0 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 20 2d  an_arch);./* M -
27f00 20 65 78 74 65 72 69 6f 72 20 72 69 6e 67 20 2a   exterior ring *
27f10 2f 0a 09 09 20 20 20 20 20 20 70 74 72 20 2b 3d  /...      ptr +=
27f20 20 31 36 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20   16;...  }..    
27f30 7d 0a 09 20 20 66 6f 72 20 28 69 62 20 3d 20 30  }..  for (ib = 0
27f40 3b 20 69 62 20 3c 20 70 6f 6c 79 67 2d 3e 4e 75  ; ib < polyg->Nu
27f50 6d 49 6e 74 65 72 69 6f 72 73 3b 20 69 62 2b 2b  mInteriors; ib++
27f60 29 0a 09 20 20 20 20 7b 0a 09 09 72 6e 67 20 3d  )..    {...rng =
27f70 20 70 6f 6c 79 67 2d 3e 49 6e 74 65 72 69 6f 72   polyg->Interior
27f80 73 20 2b 20 69 62 3b 0a 09 09 67 61 69 61 45 78  s + ib;...gaiaEx
27f90 70 6f 72 74 33 32 20 28 70 74 72 2c 20 72 6e 67  port32 (ptr, rng
27fa0 2d 3e 50 6f 69 6e 74 73 2c 20 31 2c 20 65 6e 64  ->Points, 1, end
27fb0 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 23 20  ian_arch);./* # 
27fc0 70 6f 69 6e 74 73 20 2d 20 69 6e 74 65 72 69 6f  points - interio
27fd0 72 20 72 69 6e 67 20 2a 2f 0a 09 09 70 74 72 20  r ring */...ptr 
27fe0 2b 3d 20 34 3b 0a 09 09 66 6f 72 20 28 69 76 20  += 4;...for (iv 
27ff0 3d 20 30 3b 20 69 76 20 3c 20 72 6e 67 2d 3e 50  = 0; iv < rng->P
28000 6f 69 6e 74 73 3b 20 69 76 2b 2b 29 0a 09 09 20  oints; iv++)... 
28010 20 7b 0a 09 09 20 20 20 20 20 20 69 66 20 28 74   {...      if (t
28020 79 70 65 20 3d 3d 20 47 41 49 41 5f 50 4f 4c 59  ype == GAIA_POLY
28030 47 4f 4e 5a 20 7c 7c 20 74 79 70 65 20 3d 3d 20  GONZ || type == 
28040 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f  GAIA_MULTIPOLYGO
28050 4e 5a 0a 09 09 09 20 20 7c 7c 20 74 79 70 65 20  NZ....  || type 
28060 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59  == GAIA_GEOMETRY
28070 43 4f 4c 4c 45 43 54 49 4f 4e 5a 29 0a 09 09 09  COLLECTIONZ)....
28080 7b 0a 09 09 09 20 20 20 20 67 61 69 61 47 65 74  {....    gaiaGet
28090 50 6f 69 6e 74 58 59 5a 20 28 72 6e 67 2d 3e 43  PointXYZ (rng->C
280a0 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26  oords, iv, &x, &
280b0 79 2c 20 26 7a 29 3b 0a 09 09 09 7d 0a 09 09 20  y, &z);....}... 
280c0 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 74 79       else if (ty
280d0 70 65 20 3d 3d 20 47 41 49 41 5f 50 4f 4c 59 47  pe == GAIA_POLYG
280e0 4f 4e 4d 0a 09 09 09 20 20 20 20 20 20 20 7c 7c  ONM....       ||
280f0 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55   type == GAIA_MU
28100 4c 54 49 50 4f 4c 59 47 4f 4e 4d 0a 09 09 09 20  LTIPOLYGONM.... 
28110 20 20 20 20 20 20 7c 7c 20 74 79 70 65 20 3d 3d        || type ==
28120 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f   GAIA_GEOMETRYCO
28130 4c 4c 45 43 54 49 4f 4e 4d 29 0a 09 09 09 7b 0a  LLECTIONM)....{.
28140 09 09 09 20 20 20 20 67 61 69 61 47 65 74 50 6f  ...    gaiaGetPo
28150 69 6e 74 58 59 4d 20 28 72 6e 67 2d 3e 43 6f 6f  intXYM (rng->Coo
28160 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c  rds, iv, &x, &y,
28170 20 26 6d 29 3b 0a 09 09 09 7d 0a 09 09 20 20 20   &m);....}...   
28180 20 20 20 65 6c 73 65 20 69 66 20 28 74 79 70 65     else if (type
28190 20 3d 3d 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e   == GAIA_POLYGON
281a0 5a 4d 0a 09 09 09 20 20 20 20 20 20 20 7c 7c 20  ZM....       || 
281b0 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c  type == GAIA_MUL
281c0 54 49 50 4f 4c 59 47 4f 4e 5a 4d 0a 09 09 09 20  TIPOLYGONZM.... 
281d0 20 20 20 20 20 20 7c 7c 20 74 79 70 65 20 3d 3d        || type ==
281e0 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f   GAIA_GEOMETRYCO
281f0 4c 4c 45 43 54 49 4f 4e 5a 4d 29 0a 09 09 09 7b  LLECTIONZM)....{
28200 0a 09 09 09 20 20 20 20 67 61 69 61 47 65 74 50  ....    gaiaGetP
28210 6f 69 6e 74 58 59 5a 4d 20 28 72 6e 67 2d 3e 43  ointXYZM (rng->C
28220 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26  oords, iv, &x, &
28230 79 2c 20 26 7a 2c 20 26 6d 29 3b 0a 09 09 09 7d  y, &z, &m);....}
28240 0a 09 09 20 20 20 20 20 20 65 6c 73 65 0a 09 09  ...      else...
28250 09 7b 0a 09 09 09 20 20 20 20 67 61 69 61 47 65  .{....    gaiaGe
28260 74 50 6f 69 6e 74 20 28 72 6e 67 2d 3e 43 6f 6f  tPoint (rng->Coo
28270 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 29  rds, iv, &x, &y)
28280 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 67  ;....}...      g
28290 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
282a0 2c 20 78 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61  , x, 1, endian_a
282b0 72 63 68 29 3b 09 2f 2a 20 58 20 2d 20 69 6e 74  rch);./* X - int
282c0 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 09  erior ring */...
282d0 20 20 20 20 20 20 67 61 69 61 45 78 70 6f 72 74        gaiaExport
282e0 36 34 20 28 70 74 72 20 2b 20 38 2c 20 79 2c 20  64 (ptr + 8, y, 
282f0 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
28300 09 2f 2a 20 59 20 2d 20 69 6e 74 65 72 69 6f 72  ./* Y - interior
28310 20 72 69 6e 67 20 2a 2f 0a 09 09 20 20 20 20 20   ring */...     
28320 20 70 74 72 20 2b 3d 20 31 36 3b 0a 09 09 20 20   ptr += 16;...  
28330 20 20 20 20 69 66 20 28 74 79 70 65 20 3d 3d 20      if (type == 
28340 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 5a 20 7c 7c  GAIA_POLYGONZ ||
28350 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55   type == GAIA_MU
28360 4c 54 49 50 4f 4c 59 47 4f 4e 5a 0a 09 09 09 20  LTIPOLYGONZ.... 
28370 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41   || type == GAIA
28380 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
28390 49 4f 4e 5a 29 0a 09 09 09 7b 0a 09 09 09 20 20  IONZ)....{....  
283a0 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28    gaiaExport64 (
283b0 70 74 72 2c 20 7a 2c 20 31 2c 20 65 6e 64 69 61  ptr, z, 1, endia
283c0 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 5a 20 2d 20  n_arch);./* Z - 
283d0 65 78 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f  exterior ring */
283e0 0a 09 09 09 20 20 20 20 70 74 72 20 2b 3d 20 38  ....    ptr += 8
283f0 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 69  ;....}...      i
28400 66 20 28 74 79 70 65 20 3d 3d 20 47 41 49 41 5f  f (type == GAIA_
28410 50 4f 4c 59 47 4f 4e 4d 20 7c 7c 20 74 79 70 65  POLYGONM || type
28420 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f   == GAIA_MULTIPO
28430 4c 59 47 4f 4e 4d 0a 09 09 09 20 20 7c 7c 20 74  LYGONM....  || t
28440 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d  ype == GAIA_GEOM
28450 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 4d 29  ETRYCOLLECTIONM)
28460 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 67 61 69  ....{....    gai
28470 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20  aExport64 (ptr, 
28480 6d 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  m, 1, endian_arc
28490 68 29 3b 09 2f 2a 20 4d 20 2d 20 65 78 74 65 72  h);./* M - exter
284a0 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 09 09 20  ior ring */.... 
284b0 20 20 20 70 74 72 20 2b 3d 20 38 3b 0a 09 09 09     ptr += 8;....
284c0 7d 0a 09 09 20 20 20 20 20 20 69 66 20 28 74 79  }...      if (ty
284d0 70 65 20 3d 3d 20 47 41 49 41 5f 50 4f 4c 59 47  pe == GAIA_POLYG
284e0 4f 4e 5a 4d 20 7c 7c 20 74 79 70 65 20 3d 3d 20  ONZM || type == 
284f0 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f  GAIA_MULTIPOLYGO
28500 4e 5a 4d 0a 09 09 09 20 20 7c 7c 20 74 79 70 65  NZM....  || type
28510 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52   == GAIA_GEOMETR
28520 59 43 4f 4c 4c 45 43 54 49 4f 4e 5a 4d 29 0a 09  YCOLLECTIONZM)..
28530 09 09 7b 0a 09 09 09 20 20 20 20 67 61 69 61 45  ..{....    gaiaE
28540 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20 7a 2c  xport64 (ptr, z,
28550 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
28560 3b 09 2f 2a 20 5a 20 2d 20 65 78 74 65 72 69 6f  ;./* Z - exterio
28570 72 20 72 69 6e 67 20 2a 2f 0a 09 09 09 20 20 20  r ring */....   
28580 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70   gaiaExport64 (p
28590 74 72 20 2b 20 38 2c 20 6d 2c 20 31 2c 20 65 6e  tr + 8, m, 1, en
285a0 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d  dian_arch);./* M
285b0 20 2d 20 65 78 74 65 72 69 6f 72 20 72 69 6e 67   - exterior ring
285c0 20 2a 2f 0a 09 09 09 20 20 20 20 70 74 72 20 2b   */....    ptr +
285d0 3d 20 31 36 3b 0a 09 09 09 7d 0a 09 09 20 20 7d  = 16;....}...  }
285e0 0a 09 20 20 20 20 7d 0a 09 20 20 70 6f 6c 79 67  ..    }..  polyg
285f0 20 3d 20 70 6f 6c 79 67 2d 3e 4e 65 78 74 3b 0a   = polyg->Next;.
28600 20 20 20 20 20 20 7d 0a 7d 0a 0a 47 41 49 41 47        }.}..GAIAG
28610 45 4f 5f 44 45 43 4c 41 52 45 20 69 6e 74 0a 67  EO_DECLARE int.g
28620 61 69 61 45 77 6b 62 47 65 74 50 6f 69 6e 74 20  aiaEwkbGetPoint 
28630 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72  (gaiaGeomCollPtr
28640 20 67 65 6f 6d 2c 20 75 6e 73 69 67 6e 65 64 20   geom, unsigned 
28650 63 68 61 72 20 2a 62 6c 6f 62 2c 0a 09 09 20 20  char *blob,...  
28660 69 6e 74 20 6f 66 66 73 65 74 2c 20 69 6e 74 20  int offset, int 
28670 62 6c 6f 62 5f 73 69 7a 65 2c 20 69 6e 74 20 65  blob_size, int e
28680 6e 64 69 61 6e 2c 20 69 6e 74 20 65 6e 64 69 61  ndian, int endia
28690 6e 5f 61 72 63 68 2c 0a 09 09 20 20 69 6e 74 20  n_arch,...  int 
286a0 64 69 6d 73 29 0a 7b 0a 2f 2a 20 64 65 63 6f 64  dims).{./* decod
286b0 65 73 20 61 20 50 4f 49 4e 54 20 66 72 6f 6d 20  es a POINT from 
286c0 50 6f 73 74 47 49 53 20 45 57 4b 42 20 62 69 6e  PostGIS EWKB bin
286d0 61 72 79 20 47 45 4f 4d 45 54 52 59 20 2a 2f 0a  ary GEOMETRY */.
286e0 20 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20      double x;.  
286f0 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20    double y;.    
28700 64 6f 75 62 6c 65 20 7a 3b 0a 20 20 20 20 64 6f  double z;.    do
28710 75 62 6c 65 20 6d 3b 0a 20 20 20 20 73 77 69 74  uble m;.    swit
28720 63 68 20 28 64 69 6d 73 29 0a 20 20 20 20 20 20  ch (dims).      
28730 7b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  {.      case GAI
28740 41 5f 58 59 5f 5a 5f 4d 3a 0a 09 20 20 69 66 20  A_XY_Z_M:..  if 
28750 28 62 6c 6f 62 5f 73 69 7a 65 20 3c 20 6f 66 66  (blob_size < off
28760 73 65 74 20 2b 20 33 32 29 0a 09 20 20 20 20 20  set + 32)..     
28770 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20 62   return -1;..  b
28780 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
28790 20 47 41 49 41 5f 58 59 5f 5a 3a 0a 20 20 20 20   GAIA_XY_Z:.    
287a0 20 20 63 61 73 65 20 47 41 49 41 5f 58 59 5f 4d    case GAIA_XY_M
287b0 3a 0a 09 20 20 69 66 20 28 62 6c 6f 62 5f 73 69  :..  if (blob_si
287c0 7a 65 20 3c 20 6f 66 66 73 65 74 20 2b 20 32 34  ze < offset + 24
287d0 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e 20  )..      return 
287e0 2d 31 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20  -1;..  break;.  
287f0 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 20 20      default:..  
28800 69 66 20 28 62 6c 6f 62 5f 73 69 7a 65 20 3c 20  if (blob_size < 
28810 6f 66 66 73 65 74 20 2b 20 31 36 29 0a 09 20 20  offset + 16)..  
28820 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09      return -1;..
28830 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
28840 0a 20 20 20 20 78 20 3d 20 67 61 69 61 49 6d 70  .    x = gaiaImp
28850 6f 72 74 36 34 20 28 62 6c 6f 62 20 2b 20 6f 66  ort64 (blob + of
28860 66 73 65 74 2c 20 65 6e 64 69 61 6e 2c 20 65 6e  fset, endian, en
28870 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20  dian_arch);.    
28880 6f 66 66 73 65 74 20 2b 3d 20 38 3b 0a 20 20 20  offset += 8;.   
28890 20 79 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36   y = gaiaImport6
288a0 34 20 28 62 6c 6f 62 20 2b 20 6f 66 66 73 65 74  4 (blob + offset
288b0 2c 20 65 6e 64 69 61 6e 2c 20 65 6e 64 69 61 6e  , endian, endian
288c0 5f 61 72 63 68 29 3b 0a 20 20 20 20 6f 66 66 73  _arch);.    offs
288d0 65 74 20 2b 3d 20 38 3b 0a 20 20 20 20 69 66 20  et += 8;.    if 
288e0 28 64 69 6d 73 20 3d 3d 20 47 41 49 41 5f 58 59  (dims == GAIA_XY
288f0 5f 5a 5f 4d 29 0a 20 20 20 20 20 20 7b 0a 09 20  _Z_M).      {.. 
28900 20 7a 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36   z = gaiaImport6
28910 34 20 28 62 6c 6f 62 20 2b 20 6f 66 66 73 65 74  4 (blob + offset
28920 2c 20 65 6e 64 69 61 6e 2c 20 65 6e 64 69 61 6e  , endian, endian
28930 5f 61 72 63 68 29 3b 0a 09 20 20 6f 66 66 73 65  _arch);..  offse
28940 74 20 2b 3d 20 38 3b 0a 09 20 20 6d 20 3d 20 67  t += 8;..  m = g
28950 61 69 61 49 6d 70 6f 72 74 36 34 20 28 62 6c 6f  aiaImport64 (blo
28960 62 20 2b 20 6f 66 66 73 65 74 2c 20 65 6e 64 69  b + offset, endi
28970 61 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29  an, endian_arch)
28980 3b 0a 09 20 20 6f 66 66 73 65 74 20 2b 3d 20 38  ;..  offset += 8
28990 3b 0a 09 20 20 67 61 69 61 41 64 64 50 6f 69 6e  ;..  gaiaAddPoin
289a0 74 54 6f 47 65 6f 6d 43 6f 6c 6c 58 59 5a 4d 20  tToGeomCollXYZM 
289b0 28 67 65 6f 6d 2c 20 78 2c 20 79 2c 20 7a 2c 20  (geom, x, y, z, 
289c0 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
289d0 65 6c 73 65 20 69 66 20 28 64 69 6d 73 20 3d 3d  else if (dims ==
289e0 20 47 41 49 41 5f 58 59 5f 5a 29 0a 20 20 20 20   GAIA_XY_Z).    
289f0 20 20 7b 0a 09 20 20 7a 20 3d 20 67 61 69 61 49    {..  z = gaiaI
28a00 6d 70 6f 72 74 36 34 20 28 62 6c 6f 62 20 2b 20  mport64 (blob + 
28a10 6f 66 66 73 65 74 2c 20 65 6e 64 69 61 6e 2c 20  offset, endian, 
28a20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 20  endian_arch);.. 
28a30 20 6f 66 66 73 65 74 20 2b 3d 20 38 3b 0a 09 20   offset += 8;.. 
28a40 20 67 61 69 61 41 64 64 50 6f 69 6e 74 54 6f 47   gaiaAddPointToG
28a50 65 6f 6d 43 6f 6c 6c 58 59 5a 20 28 67 65 6f 6d  eomCollXYZ (geom
28a60 2c 20 78 2c 20 79 2c 20 7a 29 3b 0a 20 20 20 20  , x, y, z);.    
28a70 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20    }.    else if 
28a80 28 64 69 6d 73 20 3d 3d 20 47 41 49 41 5f 58 59  (dims == GAIA_XY
28a90 5f 4d 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 6d  _M).      {..  m
28aa0 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34 20   = gaiaImport64 
28ab0 28 62 6c 6f 62 20 2b 20 6f 66 66 73 65 74 2c 20  (blob + offset, 
28ac0 65 6e 64 69 61 6e 2c 20 65 6e 64 69 61 6e 5f 61  endian, endian_a
28ad0 72 63 68 29 3b 0a 09 20 20 6f 66 66 73 65 74 20  rch);..  offset 
28ae0 2b 3d 20 38 3b 0a 09 20 20 67 61 69 61 41 64 64  += 8;..  gaiaAdd
28af0 50 6f 69 6e 74 54 6f 47 65 6f 6d 43 6f 6c 6c 58  PointToGeomCollX
28b00 59 4d 20 28 67 65 6f 6d 2c 20 78 2c 20 79 2c 20  YM (geom, x, y, 
28b10 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
28b20 65 6c 73 65 0a 09 67 61 69 61 41 64 64 50 6f 69  else..gaiaAddPoi
28b30 6e 74 54 6f 47 65 6f 6d 43 6f 6c 6c 20 28 67 65  ntToGeomColl (ge
28b40 6f 6d 2c 20 78 2c 20 79 29 3b 0a 20 20 20 20 72  om, x, y);.    r
28b50 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a  eturn offset;.}.
28b60 0a 47 41 49 41 47 45 4f 5f 44 45 43 4c 41 52 45  .GAIAGEO_DECLARE
28b70 20 69 6e 74 0a 67 61 69 61 45 77 6b 62 47 65 74   int.gaiaEwkbGet
28b80 4c 69 6e 65 73 74 72 69 6e 67 20 28 67 61 69 61  Linestring (gaia
28b90 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d  GeomCollPtr geom
28ba0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
28bb0 2a 62 6c 6f 62 2c 0a 09 09 20 20 20 20 20 20 20  *blob,...       
28bc0 69 6e 74 20 6f 66 66 73 65 74 2c 20 69 6e 74 20  int offset, int 
28bd0 62 6c 6f 62 5f 73 69 7a 65 2c 20 69 6e 74 20 65  blob_size, int e
28be0 6e 64 69 61 6e 2c 0a 09 09 20 20 20 20 20 20 20  ndian,...       
28bf0 69 6e 74 20 65 6e 64 69 61 6e 5f 61 72 63 68 2c  int endian_arch,
28c00 20 69 6e 74 20 64 69 6d 73 29 0a 7b 0a 2f 2a 20   int dims).{./* 
28c10 64 65 63 6f 64 65 73 20 61 20 4c 49 4e 45 53 54  decodes a LINEST
28c20 52 49 4e 47 20 66 72 6f 6d 20 50 6f 73 74 47 49  RING from PostGI
28c30 53 20 62 69 6e 61 72 79 20 47 45 4f 4d 45 54 52  S binary GEOMETR
28c40 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 70 6f  Y */.    int npo
28c50 69 6e 74 73 3b 0a 20 20 20 20 69 6e 74 20 69 76  ints;.    int iv
28c60 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a  ;.    double x;.
28c70 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
28c80 20 20 64 6f 75 62 6c 65 20 7a 3b 0a 20 20 20 20    double z;.    
28c90 64 6f 75 62 6c 65 20 6d 3b 0a 20 20 20 20 67 61  double m;.    ga
28ca0 69 61 4c 69 6e 65 73 74 72 69 6e 67 50 74 72 20  iaLinestringPtr 
28cb0 6c 6e 3b 0a 20 20 20 20 69 66 20 28 62 6c 6f 62  ln;.    if (blob
28cc0 5f 73 69 7a 65 20 3c 20 6f 66 66 73 65 74 20 2b  _size < offset +
28cd0 20 34 29 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a   4)..return -1;.
28ce0 20 20 20 20 6e 70 6f 69 6e 74 73 20 3d 20 67 61      npoints = ga
28cf0 69 61 49 6d 70 6f 72 74 33 32 20 28 62 6c 6f 62  iaImport32 (blob
28d00 20 2b 20 6f 66 66 73 65 74 2c 20 65 6e 64 69 61   + offset, endia
28d10 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  n, endian_arch);
28d20 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 34  .    offset += 4
28d30 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 64 69  ;.    switch (di
28d40 6d 73 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  ms).      {.    
28d50 20 20 63 61 73 65 20 47 41 49 41 5f 58 59 5f 5a    case GAIA_XY_Z
28d60 5f 4d 3a 0a 09 20 20 69 66 20 28 62 6c 6f 62 5f  _M:..  if (blob_
28d70 73 69 7a 65 20 3c 20 6f 66 66 73 65 74 20 2b 20  size < offset + 
28d80 28 33 32 20 2a 20 6e 70 6f 69 6e 74 73 29 29 0a  (32 * npoints)).
28d90 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
28da0 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;..  break;.    
28db0 20 20 63 61 73 65 20 47 41 49 41 5f 58 59 5f 5a    case GAIA_XY_Z
28dc0 3a 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49  :.      case GAI
28dd0 41 5f 58 59 5f 4d 3a 0a 09 20 20 69 66 20 28 62  A_XY_M:..  if (b
28de0 6c 6f 62 5f 73 69 7a 65 20 3c 20 6f 66 66 73 65  lob_size < offse
28df0 74 20 2b 20 28 32 34 20 2a 20 6e 70 6f 69 6e 74  t + (24 * npoint
28e00 73 29 29 0a 09 20 20 20 20 20 20 72 65 74 75 72  s))..      retur
28e10 6e 20 2d 31 3b 0a 09 20 20 62 72 65 61 6b 3b 0a  n -1;..  break;.
28e20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09        default:..
28e30 20 20 69 66 20 28 62 6c 6f 62 5f 73 69 7a 65 20    if (blob_size 
28e40 3c 20 6f 66 66 73 65 74 20 2b 20 28 31 36 20 2a  < offset + (16 *
28e50 20 6e 70 6f 69 6e 74 73 29 29 0a 09 20 20 20 20   npoints))..    
28e60 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20    return -1;..  
28e70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
28e80 20 20 20 6c 6e 20 3d 20 67 61 69 61 41 64 64 4c     ln = gaiaAddL
28e90 69 6e 65 73 74 72 69 6e 67 54 6f 47 65 6f 6d 43  inestringToGeomC
28ea0 6f 6c 6c 20 28 67 65 6f 6d 2c 20 6e 70 6f 69 6e  oll (geom, npoin
28eb0 74 73 29 3b 0a 20 20 20 20 66 6f 72 20 28 69 76  ts);.    for (iv
28ec0 20 3d 20 30 3b 20 69 76 20 3c 20 6e 70 6f 69 6e   = 0; iv < npoin
28ed0 74 73 3b 20 69 76 2b 2b 29 0a 20 20 20 20 20 20  ts; iv++).      
28ee0 7b 0a 09 20 20 78 20 3d 20 67 61 69 61 49 6d 70  {..  x = gaiaImp
28ef0 6f 72 74 36 34 20 28 62 6c 6f 62 20 2b 20 6f 66  ort64 (blob + of
28f00 66 73 65 74 2c 20 65 6e 64 69 61 6e 2c 20 65 6e  fset, endian, en
28f10 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 20 20 6f  dian_arch);..  o
28f20 66 66 73 65 74 20 2b 3d 20 38 3b 0a 09 20 20 79  ffset += 8;..  y
28f30 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34 20   = gaiaImport64 
28f40 28 62 6c 6f 62 20 2b 20 6f 66 66 73 65 74 2c 20  (blob + offset, 
28f50 65 6e 64 69 61 6e 2c 20 65 6e 64 69 61 6e 5f 61  endian, endian_a
28f60 72 63 68 29 3b 0a 09 20 20 6f 66 66 73 65 74 20  rch);..  offset 
28f70 2b 3d 20 38 3b 0a 09 20 20 69 66 20 28 64 69 6d  += 8;..  if (dim
28f80 73 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  s == GAIA_XY_Z_M
28f90 29 0a 09 20 20 20 20 7b 0a 09 09 7a 20 3d 20 67  )..    {...z = g
28fa0 61 69 61 49 6d 70 6f 72 74 36 34 20 28 62 6c 6f  aiaImport64 (blo
28fb0 62 20 2b 20 6f 66 66 73 65 74 2c 20 65 6e 64 69  b + offset, endi
28fc0 61 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29  an, endian_arch)
28fd0 3b 0a 09 09 6f 66 66 73 65 74 20 2b 3d 20 38 3b  ;...offset += 8;
28fe0 0a 09 09 6d 20 3d 20 67 61 69 61 49 6d 70 6f 72  ...m = gaiaImpor
28ff0 74 36 34 20 28 62 6c 6f 62 20 2b 20 6f 66 66 73  t64 (blob + offs
29000 65 74 2c 20 65 6e 64 69 61 6e 2c 20 65 6e 64 69  et, endian, endi
29010 61 6e 5f 61 72 63 68 29 3b 0a 09 09 6f 66 66 73  an_arch);...offs
29020 65 74 20 2b 3d 20 38 3b 0a 09 09 67 61 69 61 53  et += 8;...gaiaS
29030 65 74 50 6f 69 6e 74 58 59 5a 4d 20 28 6c 6e 2d  etPointXYZM (ln-
29040 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 78 2c 20  >Coords, iv, x, 
29050 79 2c 20 7a 2c 20 6d 29 3b 0a 09 20 20 20 20 7d  y, z, m);..    }
29060 0a 09 20 20 65 6c 73 65 20 69 66 20 28 64 69 6d  ..  else if (dim
29070 73 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a  s == GAIA_XY_Z).
29080 09 20 20 20 20 7b 0a 09 09 7a 20 3d 20 67 61 69  .    {...z = gai
29090 61 49 6d 70 6f 72 74 36 34 20 28 62 6c 6f 62 20  aImport64 (blob 
290a0 2b 20 6f 66 66 73 65 74 2c 20 65 6e 64 69 61 6e  + offset, endian
290b0 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  , endian_arch);.
290c0 09 09 6f 66 66 73 65 74 20 2b 3d 20 38 3b 0a 09  ..offset += 8;..
290d0 09 67 61 69 61 53 65 74 50 6f 69 6e 74 58 59 5a  .gaiaSetPointXYZ
290e0 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69 76   (ln->Coords, iv
290f0 2c 20 78 2c 20 79 2c 20 7a 29 3b 0a 09 20 20 20  , x, y, z);..   
29100 20 7d 0a 09 20 20 65 6c 73 65 20 69 66 20 28 64   }..  else if (d
29110 69 6d 73 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d  ims == GAIA_XY_M
29120 29 0a 09 20 20 20 20 7b 0a 09 09 6d 20 3d 20 67  )..    {...m = g
29130 61 69 61 49 6d 70 6f 72 74 36 34 20 28 62 6c 6f  aiaImport64 (blo
29140 62 20 2b 20 6f 66 66 73 65 74 2c 20 65 6e 64 69  b + offset, endi
29150 61 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29  an, endian_arch)
29160 3b 0a 09 09 6f 66 66 73 65 74 20 2b 3d 20 38 3b  ;...offset += 8;
29170 0a 09 09 67 61 69 61 53 65 74 50 6f 69 6e 74 58  ...gaiaSetPointX
29180 59 4d 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20  YM (ln->Coords, 
29190 69 76 2c 20 78 2c 20 79 2c 20 6d 29 3b 0a 09 20  iv, x, y, m);.. 
291a0 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20     }..  else..  
291b0 20 20 20 20 67 61 69 61 53 65 74 50 6f 69 6e 74      gaiaSetPoint
291c0 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69 76   (ln->Coords, iv
291d0 2c 20 78 2c 20 79 29 3b 0a 20 20 20 20 20 20 7d  , x, y);.      }
291e0 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 66 66 73  .    return offs
291f0 65 74 3b 0a 7d 0a 0a 47 41 49 41 47 45 4f 5f 44  et;.}..GAIAGEO_D
29200 45 43 4c 41 52 45 20 69 6e 74 0a 67 61 69 61 45  ECLARE int.gaiaE
29210 77 6b 62 47 65 74 50 6f 6c 79 67 6f 6e 20 28 67  wkbGetPolygon (g
29220 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67  aiaGeomCollPtr g
29230 65 6f 6d 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  eom, unsigned ch
29240 61 72 20 2a 62 6c 6f 62 2c 0a 09 09 20 20 20 20  ar *blob,...    
29250 69 6e 74 20 6f 66 66 73 65 74 2c 20 69 6e 74 20  int offset, int 
29260 62 6c 6f 62 5f 73 69 7a 65 2c 20 69 6e 74 20 65  blob_size, int e
29270 6e 64 69 61 6e 2c 0a 09 09 20 20 20 20 69 6e 74  ndian,...    int
29280 20 65 6e 64 69 61 6e 5f 61 72 63 68 2c 20 69 6e   endian_arch, in
29290 74 20 64 69 6d 73 29 0a 7b 0a 2f 2a 20 64 65 63  t dims).{./* dec
292a0 6f 64 65 73 20 61 20 50 4f 4c 59 47 4f 4e 20 66  odes a POLYGON f
292b0 72 6f 6d 20 50 6f 73 74 47 49 53 20 62 69 6e 61  rom PostGIS bina
292c0 72 79 20 47 45 4f 4d 45 54 52 59 20 2a 2f 0a 20  ry GEOMETRY */. 
292d0 20 20 20 69 6e 74 20 72 69 6e 67 73 3b 0a 20 20     int rings;.  
292e0 20 20 69 6e 74 20 6e 70 6f 69 6e 74 73 3b 0a 20    int npoints;. 
292f0 20 20 20 69 6e 74 20 69 76 3b 0a 20 20 20 20 69     int iv;.    i
29300 6e 74 20 69 62 3b 0a 20 20 20 20 64 6f 75 62 6c  nt ib;.    doubl
29310 65 20 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  e x;.    double 
29320 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 7a 3b  y;.    double z;
29330 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 3b 0a 20  .    double m;. 
29340 20 20 20 67 61 69 61 50 6f 6c 79 67 6f 6e 50 74     gaiaPolygonPt
29350 72 20 70 6f 6c 79 67 20 3d 20 4e 55 4c 4c 3b 0a  r polyg = NULL;.
29360 20 20 20 20 67 61 69 61 52 69 6e 67 50 74 72 20      gaiaRingPtr 
29370 72 6e 67 3b 0a 20 20 20 20 69 66 20 28 62 6c 6f  rng;.    if (blo
29380 62 5f 73 69 7a 65 20 3c 20 6f 66 66 73 65 74 20  b_size < offset 
29390 2b 20 34 29 0a 09 72 65 74 75 72 6e 20 2d 31 3b  + 4)..return -1;
293a0 0a 20 20 20 20 72 69 6e 67 73 20 3d 20 67 61 69  .    rings = gai
293b0 61 49 6d 70 6f 72 74 33 32 20 28 62 6c 6f 62 20  aImport32 (blob 
293c0 2b 20 6f 66 66 73 65 74 2c 20 65 6e 64 69 61 6e  + offset, endian
293d0 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  , endian_arch);.
293e0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 34 3b      offset += 4;
293f0 0a 20 20 20 20 66 6f 72 20 28 69 62 20 3d 20 30  .    for (ib = 0
29400 3b 20 69 62 20 3c 20 72 69 6e 67 73 3b 20 69 62  ; ib < rings; ib
29410 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  ++).      {..  i
29420 66 20 28 62 6c 6f 62 5f 73 69 7a 65 20 3c 20 6f  f (blob_size < o
29430 66 66 73 65 74 20 2b 20 34 29 0a 09 20 20 20 20  ffset + 4)..    
29440 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20    return -1;..  
29450 6e 70 6f 69 6e 74 73 20 3d 20 67 61 69 61 49 6d  npoints = gaiaIm
29460 70 6f 72 74 33 32 20 28 62 6c 6f 62 20 2b 20 6f  port32 (blob + o
29470 66 66 73 65 74 2c 20 65 6e 64 69 61 6e 2c 20 65  ffset, endian, e
29480 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 20 20  ndian_arch);..  
29490 6f 66 66 73 65 74 20 2b 3d 20 34 3b 0a 09 20 20  offset += 4;..  
294a0 73 77 69 74 63 68 20 28 64 69 6d 73 29 0a 09 20  switch (dims).. 
294b0 20 20 20 7b 0a 09 20 20 20 20 63 61 73 65 20 47     {..    case G
294c0 41 49 41 5f 58 59 5f 5a 5f 4d 3a 0a 09 09 69 66  AIA_XY_Z_M:...if
294d0 20 28 62 6c 6f 62 5f 73 69 7a 65 20 3c 20 6f 66   (blob_size < of
294e0 66 73 65 74 20 2b 20 28 33 32 20 2a 20 6e 70 6f  fset + (32 * npo
294f0 69 6e 74 73 29 29 0a 09 09 20 20 20 20 72 65 74  ints))...    ret
29500 75 72 6e 20 2d 31 3b 0a 09 09 62 72 65 61 6b 3b  urn -1;...break;
29510 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f  ..    case GAIA_
29520 58 59 5f 5a 3a 0a 09 20 20 20 20 63 61 73 65 20  XY_Z:..    case 
29530 47 41 49 41 5f 58 59 5f 4d 3a 0a 09 09 69 66 20  GAIA_XY_M:...if 
29540 28 62 6c 6f 62 5f 73 69 7a 65 20 3c 20 6f 66 66  (blob_size < off
29550 73 65 74 20 2b 20 28 32 34 20 2a 20 6e 70 6f 69  set + (24 * npoi
29560 6e 74 73 29 29 0a 09 09 20 20 20 20 72 65 74 75  nts))...    retu
29570 72 6e 20 2d 31 3b 0a 09 09 62 72 65 61 6b 3b 0a  rn -1;...break;.
29580 09 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 09  .    default:...
29590 69 66 20 28 62 6c 6f 62 5f 73 69 7a 65 20 3c 20  if (blob_size < 
295a0 6f 66 66 73 65 74 20 2b 20 28 31 36 20 2a 20 6e  offset + (16 * n
295b0 70 6f 69 6e 74 73 29 29 0a 09 09 20 20 20 20 72  points))...    r
295c0 65 74 75 72 6e 20 2d 31 3b 0a 09 09 62 72 65 61  eturn -1;...brea
295d0 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20  k;..    }..  if 
295e0 28 69 62 20 3d 3d 20 30 29 0a 09 20 20 20 20 7b  (ib == 0)..    {
295f0 0a 09 09 70 6f 6c 79 67 20 3d 20 67 61 69 61 41  ...polyg = gaiaA
29600 64 64 50 6f 6c 79 67 6f 6e 54 6f 47 65 6f 6d 43  ddPolygonToGeomC
29610 6f 6c 6c 20 28 67 65 6f 6d 2c 20 6e 70 6f 69 6e  oll (geom, npoin
29620 74 73 2c 20 72 69 6e 67 73 20 2d 20 31 29 3b 0a  ts, rings - 1);.
29630 09 09 72 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e 45  ..rng = polyg->E
29640 78 74 65 72 69 6f 72 3b 0a 09 20 20 20 20 7d 0a  xterior;..    }.
29650 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 72  .  else..      r
29660 6e 67 20 3d 20 67 61 69 61 41 64 64 49 6e 74 65  ng = gaiaAddInte
29670 72 69 6f 72 52 69 6e 67 20 28 70 6f 6c 79 67 2c  riorRing (polyg,
29680 20 69 62 20 2d 20 31 2c 20 6e 70 6f 69 6e 74 73   ib - 1, npoints
29690 29 3b 0a 09 20 20 66 6f 72 20 28 69 76 20 3d 20  );..  for (iv = 
296a0 30 3b 20 69 76 20 3c 20 6e 70 6f 69 6e 74 73 3b  0; iv < npoints;
296b0 20 69 76 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09   iv++)..    {...
296c0 78 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34  x = gaiaImport64
296d0 20 28 62 6c 6f 62 20 2b 20 6f 66 66 73 65 74 2c   (blob + offset,
296e0 20 65 6e 64 69 61 6e 2c 20 65 6e 64 69 61 6e 5f   endian, endian_
296f0 61 72 63 68 29 3b 0a 09 09 6f 66 66 73 65 74 20  arch);...offset 
29700 2b 3d 20 38 3b 0a 09 09 79 20 3d 20 67 61 69 61  += 8;...y = gaia
29710 49 6d 70 6f 72 74 36 34 20 28 62 6c 6f 62 20 2b  Import64 (blob +
29720 20 6f 66 66 73 65 74 2c 20 65 6e 64 69 61 6e 2c   offset, endian,
29730 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09   endian_arch);..
29740 09 6f 66 66 73 65 74 20 2b 3d 20 38 3b 0a 09 09  .offset += 8;...
29750 69 66 20 28 64 69 6d 73 20 3d 3d 20 47 41 49 41  if (dims == GAIA
29760 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 7b 0a 09  _XY_Z_M)...  {..
29770 09 20 20 20 20 20 20 7a 20 3d 20 67 61 69 61 49  .      z = gaiaI
29780 6d 70 6f 72 74 36 34 20 28 62 6c 6f 62 20 2b 20  mport64 (blob + 
29790 6f 66 66 73 65 74 2c 20 65 6e 64 69 61 6e 2c 20  offset, endian, 
297a0 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09  endian_arch);...
297b0 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
297c0 38 3b 0a 09 09 20 20 20 20 20 20 6d 20 3d 20 67  8;...      m = g
297d0 61 69 61 49 6d 70 6f 72 74 36 34 20 28 62 6c 6f  aiaImport64 (blo
297e0 62 20 2b 20 6f 66 66 73 65 74 2c 20 65 6e 64 69  b + offset, endi
297f0 61 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29  an, endian_arch)
29800 3b 0a 09 09 20 20 20 20 20 20 6f 66 66 73 65 74  ;...      offset
29810 20 2b 3d 20 38 3b 0a 09 09 20 20 20 20 20 20 67   += 8;...      g
29820 61 69 61 53 65 74 50 6f 69 6e 74 58 59 5a 4d 20  aiaSetPointXYZM 
29830 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76  (rng->Coords, iv
29840 2c 20 78 2c 20 79 2c 20 7a 2c 20 6d 29 3b 0a 09  , x, y, z, m);..
29850 09 20 20 7d 0a 09 09 65 6c 73 65 20 69 66 20 28  .  }...else if (
29860 64 69 6d 73 20 3d 3d 20 47 41 49 41 5f 58 59 5f  dims == GAIA_XY_
29870 5a 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20  Z)...  {...     
29880 20 7a 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36   z = gaiaImport6
29890 34 20 28 62 6c 6f 62 20 2b 20 6f 66 66 73 65 74  4 (blob + offset
298a0 2c 20 65 6e 64 69 61 6e 2c 20 65 6e 64 69 61 6e  , endian, endian
298b0 5f 61 72 63 68 29 3b 0a 09 09 20 20 20 20 20 20  _arch);...      
298c0 6f 66 66 73 65 74 20 2b 3d 20 38 3b 0a 09 09 20  offset += 8;... 
298d0 20 20 20 20 20 67 61 69 61 53 65 74 50 6f 69 6e       gaiaSetPoin
298e0 74 58 59 5a 20 28 72 6e 67 2d 3e 43 6f 6f 72 64  tXYZ (rng->Coord
298f0 73 2c 20 69 76 2c 20 78 2c 20 79 2c 20 7a 29 3b  s, iv, x, y, z);
29900 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 20 69 66  ...  }...else if
29910 20 28 64 69 6d 73 20 3d 3d 20 47 41 49 41 5f 58   (dims == GAIA_X
29920 59 5f 4d 29 0a 09 09 20 20 7b 0a 09 09 20 20 20  Y_M)...  {...   
29930 20 20 20 6d 20 3d 20 67 61 69 61 49 6d 70 6f 72     m = gaiaImpor
29940 74 36 34 20 28 62 6c 6f 62 20 2b 20 6f 66 66 73  t64 (blob + offs
29950 65 74 2c 20 65 6e 64 69 61 6e 2c 20 65 6e 64 69  et, endian, endi
29960 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20 20 20  an_arch);...    
29970 20 20 6f 66 66 73 65 74 20 2b 3d 20 38 3b 0a 09    offset += 8;..
29980 09 20 20 20 20 20 20 67 61 69 61 53 65 74 50 6f  .      gaiaSetPo
29990 69 6e 74 58 59 4d 20 28 72 6e 67 2d 3e 43 6f 6f  intXYM (rng->Coo
299a0 72 64 73 2c 20 69 76 2c 20 78 2c 20 79 2c 20 6d  rds, iv, x, y, m
299b0 29 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a  );...  }...else.
299c0 09 09 20 20 20 20 67 61 69 61 53 65 74 50 6f 69  ..    gaiaSetPoi
299d0 6e 74 20 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c  nt (rng->Coords,
299e0 20 69 76 2c 20 78 2c 20 79 29 3b 0a 09 20 20 20   iv, x, y);..   
299f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72   }.      }.    r
29a00 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a  eturn offset;.}.
29a10 0a 47 41 49 41 47 45 4f 5f 44 45 43 4c 41 52 45  .GAIAGEO_DECLARE
29a20 20 69 6e 74 0a 67 61 69 61 45 77 6b 62 47 65 74   int.gaiaEwkbGet
29a30 4d 75 6c 74 69 50 6f 69 6e 74 20 28 67 61 69 61  MultiPoint (gaia
29a40 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d  GeomCollPtr geom
29a50 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
29a60 2a 62 6c 6f 62 2c 0a 09 09 20 20 20 20 20 20 20  *blob,...       
29a70 69 6e 74 20 6f 66 66 73 65 74 2c 20 69 6e 74 20  int offset, int 
29a80 62 6c 6f 62 5f 73 69 7a 65 2c 20 69 6e 74 20 65  blob_size, int e
29a90 6e 64 69 61 6e 2c 20 69 6e 74 20 65 6e 64 69 61  ndian, int endia
29aa0 6e 5f 61 72 63 68 2c 0a 09 09 20 20 20 20 20 20  n_arch,...      
29ab0 20 69 6e 74 20 64 69 6d 73 29 0a 7b 0a 2f 2a 20   int dims).{./* 
29ac0 64 65 63 6f 64 65 73 20 61 20 4d 55 4c 54 49 50  decodes a MULTIP
29ad0 4f 49 4e 54 20 66 72 6f 6d 20 50 6f 73 74 47 49  OINT from PostGI
29ae0 53 20 45 57 4b 42 20 62 69 6e 61 72 79 20 47 45  S EWKB binary GE
29af0 4f 4d 45 54 52 59 20 2a 2f 0a 20 20 20 20 69 6e  OMETRY */.    in
29b00 74 20 65 6e 74 69 74 69 65 73 3b 0a 20 20 20 20  t entities;.    
29b10 69 6e 74 20 74 79 70 65 3b 0a 20 20 20 20 75 6e  int type;.    un
29b20 73 69 67 6e 65 64 20 63 68 61 72 20 78 74 79 70  signed char xtyp
29b30 65 5b 34 5d 3b 0a 20 20 20 20 69 6e 74 20 69 65  e[4];.    int ie
29b40 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 3b 0a 20  ;.    int off;. 
29b50 20 20 20 69 66 20 28 62 6c 6f 62 5f 73 69 7a 65     if (blob_size
29b60 20 3c 20 6f 66 66 73 65 74 20 2b 20 34 29 0a 09   < offset + 4)..
29b70 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 65  return -1;.    e
29b80 6e 74 69 74 69 65 73 20 3d 20 67 61 69 61 49 6d  ntities = gaiaIm
29b90 70 6f 72 74 33 32 20 28 62 6c 6f 62 20 2b 20 6f  port32 (blob + o
29ba0 66 66 73 65 74 2c 20 65 6e 64 69 61 6e 2c 20 65  ffset, endian, e
29bb0 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20  ndian_arch);.   
29bc0 20 6f 66 66 73 65 74 20 2b 3d 20 34 3b 0a 20 20   offset += 4;.  
29bd0 20 20 66 6f 72 20 28 69 65 20 3d 20 30 3b 20 69    for (ie = 0; i
29be0 65 20 3c 20 65 6e 74 69 74 69 65 73 3b 20 69 65  e < entities; ie
29bf0 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  ++).      {..  i
29c00 66 20 28 62 6c 6f 62 5f 73 69 7a 65 20 3c 20 6f  f (blob_size < o
29c10 66 66 73 65 74 20 2b 20 35 29 0a 09 20 20 20 20  ffset + 5)..    
29c20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20    return -1;..  
29c30 6d 65 6d 63 70 79 20 28 78 74 79 70 65 2c 20 62  memcpy (xtype, b
29c40 6c 6f 62 20 2b 20 6f 66 66 73 65 74 20 2b 20 31  lob + offset + 1
29c50 2c 20 34 29 3b 0a 09 20 20 69 66 20 28 65 6e 64  , 4);..  if (end
29c60 69 61 6e 29 0a 09 20 20 20 20 20 20 78 74 79 70  ian)..      xtyp
29c70 65 5b 33 5d 20 3d 20 30 78 30 30 3b 0a 09 20 20  e[3] = 0x00;..  
29c80 65 6c 73 65 0a 09 20 20 20 20 20 20 78 74 79 70  else..      xtyp
29c90 65 5b 30 5d 20 3d 20 30 78 30 30 3b 0a 09 20 20  e[0] = 0x00;..  
29ca0 74 79 70 65 20 3d 20 67 61 69 61 49 6d 70 6f 72  type = gaiaImpor
29cb0 74 33 32 20 28 78 74 79 70 65 2c 20 65 6e 64 69  t32 (xtype, endi
29cc0 61 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29  an, endian_arch)
29cd0 3b 0a 09 20 20 6f 66 66 73 65 74 20 2b 3d 20 35  ;..  offset += 5
29ce0 3b 0a 09 20 20 69 66 20 28 74 79 70 65 20 21 3d  ;..  if (type !=
29cf0 20 47 41 49 41 5f 50 4f 49 4e 54 29 0a 09 20 20   GAIA_POINT)..  
29d00 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09      return -1;..
29d10 20 20 6f 66 66 20 3d 0a 09 20 20 20 20 20 20 67    off =..      g
29d20 61 69 61 45 77 6b 62 47 65 74 50 6f 69 6e 74 20  aiaEwkbGetPoint 
29d30 28 67 65 6f 6d 2c 20 62 6c 6f 62 2c 20 6f 66 66  (geom, blob, off
29d40 73 65 74 2c 20 62 6c 6f 62 5f 73 69 7a 65 2c 20  set, blob_size, 
29d50 65 6e 64 69 61 6e 2c 0a 09 09 09 09 65 6e 64 69  endian,.....endi
29d60 61 6e 5f 61 72 63 68 2c 20 64 69 6d 73 29 3b 0a  an_arch, dims);.
29d70 09 20 20 69 66 20 28 6f 66 66 20 3c 20 30 29 0a  .  if (off < 0).
29d80 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
29d90 3b 0a 09 20 20 6f 66 66 73 65 74 20 3d 20 6f 66  ;..  offset = of
29da0 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72  f;.      }.    r
29db0 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a  eturn offset;.}.
29dc0 0a 47 41 49 41 47 45 4f 5f 44 45 43 4c 41 52 45  .GAIAGEO_DECLARE
29dd0 20 69 6e 74 0a 67 61 69 61 45 77 6b 62 47 65 74   int.gaiaEwkbGet
29de0 4d 75 6c 74 69 4c 69 6e 65 73 74 72 69 6e 67 20  MultiLinestring 
29df0 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72  (gaiaGeomCollPtr
29e00 20 67 65 6f 6d 2c 20 75 6e 73 69 67 6e 65 64 20   geom, unsigned 
29e10 63 68 61 72 20 2a 62 6c 6f 62 2c 0a 09 09 09 20  char *blob,.... 
29e20 20 20 20 69 6e 74 20 6f 66 66 73 65 74 2c 20 69     int offset, i
29e30 6e 74 20 62 6c 6f 62 5f 73 69 7a 65 2c 20 69 6e  nt blob_size, in
29e40 74 20 65 6e 64 69 61 6e 2c 0a 09 09 09 20 20 20  t endian,....   
29e50 20 69 6e 74 20 65 6e 64 69 61 6e 5f 61 72 63 68   int endian_arch
29e60 2c 20 69 6e 74 20 64 69 6d 73 29 0a 7b 0a 2f 2a  , int dims).{./*
29e70 20 64 65 63 6f 64 65 73 20 61 20 4d 55 4c 54 49   decodes a MULTI
29e80 4c 49 4e 45 53 54 52 49 4e 47 20 66 72 6f 6d 20  LINESTRING from 
29e90 50 6f 73 74 47 49 53 20 45 57 4b 42 20 62 69 6e  PostGIS EWKB bin
29ea0 61 72 79 20 47 45 4f 4d 45 54 52 59 20 2a 2f 0a  ary GEOMETRY */.
29eb0 20 20 20 20 69 6e 74 20 65 6e 74 69 74 69 65 73      int entities
29ec0 3b 0a 20 20 20 20 69 6e 74 20 74 79 70 65 3b 0a  ;.    int type;.
29ed0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
29ee0 72 20 78 74 79 70 65 5b 34 5d 3b 0a 20 20 20 20  r xtype[4];.    
29ef0 69 6e 74 20 69 65 3b 0a 20 20 20 20 69 6e 74 20  int ie;.    int 
29f00 6f 66 66 3b 0a 20 20 20 20 69 66 20 28 62 6c 6f  off;.    if (blo
29f10 62 5f 73 69 7a 65 20 3c 20 6f 66 66 73 65 74 20  b_size < offset 
29f20 2b 20 34 29 0a 09 72 65 74 75 72 6e 20 2d 31 3b  + 4)..return -1;
29f30 0a 20 20 20 20 65 6e 74 69 74 69 65 73 20 3d 20  .    entities = 
29f40 67 61 69 61 49 6d 70 6f 72 74 33 32 20 28 62 6c  gaiaImport32 (bl
29f50 6f 62 20 2b 20 6f 66 66 73 65 74 2c 20 65 6e 64  ob + offset, end
29f60 69 61 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  ian, endian_arch
29f70 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  );.    offset +=
29f80 20 34 3b 0a 20 20 20 20 66 6f 72 20 28 69 65 20   4;.    for (ie 
29f90 3d 20 30 3b 20 69 65 20 3c 20 65 6e 74 69 74 69  = 0; ie < entiti
29fa0 65 73 3b 20 69 65 2b 2b 29 0a 20 20 20 20 20 20  es; ie++).      
29fb0 7b 0a 09 20 20 69 66 20 28 62 6c 6f 62 5f 73 69  {..  if (blob_si
29fc0 7a 65 20 3c 20 6f 66 66 73 65 74 20 2b 20 35 29  ze < offset + 5)
29fd0 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ..      return -
29fe0 31 3b 0a 09 20 20 6d 65 6d 63 70 79 20 28 78 74  1;..  memcpy (xt
29ff0 79 70 65 2c 20 62 6c 6f 62 20 2b 20 6f 66 66 73  ype, blob + offs
2a000 65 74 20 2b 20 31 2c 20 34 29 3b 0a 09 20 20 69  et + 1, 4);..  i
2a010 66 20 28 65 6e 64 69 61 6e 29 0a 09 20 20 20 20  f (endian)..    
2a020 20 20 78 74 79 70 65 5b 33 5d 20 3d 20 30 78 30    xtype[3] = 0x0
2a030 30 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20  0;..  else..    
2a040 20 20 78 74 79 70 65 5b 30 5d 20 3d 20 30 78 30    xtype[0] = 0x0
2a050 30 3b 0a 09 20 20 74 79 70 65 20 3d 20 67 61 69  0;..  type = gai
2a060 61 49 6d 70 6f 72 74 33 32 20 28 78 74 79 70 65  aImport32 (xtype
2a070 2c 20 65 6e 64 69 61 6e 2c 20 65 6e 64 69 61 6e  , endian, endian
2a080 5f 61 72 63 68 29 3b 0a 09 20 20 6f 66 66 73 65  _arch);..  offse
2a090 74 20 2b 3d 20 35 3b 0a 09 20 20 69 66 20 28 74  t += 5;..  if (t
2a0a0 79 70 65 20 21 3d 20 47 41 49 41 5f 4c 49 4e 45  ype != GAIA_LINE
2a0b0 53 54 52 49 4e 47 29 0a 09 20 20 20 20 20 20 72  STRING)..      r
2a0c0 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20 6f 66 66  eturn -1;..  off
2a0d0 20 3d 0a 09 20 20 20 20 20 20 67 61 69 61 45 77   =..      gaiaEw
2a0e0 6b 62 47 65 74 4c 69 6e 65 73 74 72 69 6e 67 20  kbGetLinestring 
2a0f0 28 67 65 6f 6d 2c 20 62 6c 6f 62 2c 20 6f 66 66  (geom, blob, off
2a100 73 65 74 2c 20 62 6c 6f 62 5f 73 69 7a 65 2c 0a  set, blob_size,.
2a110 09 09 09 09 20 20 20 20 20 65 6e 64 69 61 6e 2c  ....     endian,
2a120 20 65 6e 64 69 61 6e 5f 61 72 63 68 2c 20 64 69   endian_arch, di
2a130 6d 73 29 3b 0a 09 20 20 69 66 20 28 6f 66 66 20  ms);..  if (off 
2a140 3c 20 30 29 0a 09 20 20 20 20 20 20 72 65 74 75  < 0)..      retu
2a150 72 6e 20 2d 31 3b 0a 09 20 20 6f 66 66 73 65 74  rn -1;..  offset
2a160 20 3d 20 6f 66 66 3b 0a 20 20 20 20 20 20 7d 0a   = off;.      }.
2a170 20 20 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65      return offse
2a180 74 3b 0a 7d 0a 0a 47 41 49 41 47 45 4f 5f 44 45  t;.}..GAIAGEO_DE
2a190 43 4c 41 52 45 20 69 6e 74 0a 67 61 69 61 45 77  CLARE int.gaiaEw
2a1a0 6b 62 47 65 74 4d 75 6c 74 69 50 6f 6c 79 67 6f  kbGetMultiPolygo
2a1b0 6e 20 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50  n (gaiaGeomCollP
2a1c0 74 72 20 67 65 6f 6d 2c 20 75 6e 73 69 67 6e 65  tr geom, unsigne
2a1d0 64 20 63 68 61 72 20 2a 62 6c 6f 62 2c 0a 09 09  d char *blob,...
2a1e0 09 20 69 6e 74 20 6f 66 66 73 65 74 2c 20 69 6e  . int offset, in
2a1f0 74 20 62 6c 6f 62 5f 73 69 7a 65 2c 20 69 6e 74  t blob_size, int
2a200 20 65 6e 64 69 61 6e 2c 20 69 6e 74 20 65 6e 64   endian, int end
2a210 69 61 6e 5f 61 72 63 68 2c 0a 09 09 09 20 69 6e  ian_arch,.... in
2a220 74 20 64 69 6d 73 29 0a 7b 0a 2f 2a 20 64 65 63  t dims).{./* dec
2a230 6f 64 65 73 20 61 20 4d 55 4c 54 49 50 4f 4c 59  odes a MULTIPOLY
2a240 47 4f 4e 20 66 72 6f 6d 20 50 6f 73 74 47 49 53  GON from PostGIS
2a250 20 45 57 4b 42 20 62 69 6e 61 72 79 20 47 45 4f   EWKB binary GEO
2a260 4d 45 54 52 59 20 2a 2f 0a 20 20 20 20 69 6e 74  METRY */.    int
2a270 20 65 6e 74 69 74 69 65 73 3b 0a 20 20 20 20 69   entities;.    i
2a280 6e 74 20 74 79 70 65 3b 0a 20 20 20 20 75 6e 73  nt type;.    uns
2a290 69 67 6e 65 64 20 63 68 61 72 20 78 74 79 70 65  igned char xtype
2a2a0 5b 34 5d 3b 0a 20 20 20 20 69 6e 74 20 69 65 3b  [4];.    int ie;
2a2b0 0a 20 20 20 20 69 6e 74 20 6f 66 66 3b 0a 20 20  .    int off;.  
2a2c0 20 20 69 66 20 28 62 6c 6f 62 5f 73 69 7a 65 20    if (blob_size 
2a2d0 3c 20 6f 66 66 73 65 74 20 2b 20 34 29 0a 09 72  < offset + 4)..r
2a2e0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 65 6e  eturn -1;.    en
2a2f0 74 69 74 69 65 73 20 3d 20 67 61 69 61 49 6d 70  tities = gaiaImp
2a300 6f 72 74 33 32 20 28 62 6c 6f 62 20 2b 20 6f 66  ort32 (blob + of
2a310 66 73 65 74 2c 20 65 6e 64 69 61 6e 2c 20 65 6e  fset, endian, en
2a320 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20  dian_arch);.    
2a330 6f 66 66 73 65 74 20 2b 3d 20 34 3b 0a 20 20 20  offset += 4;.   
2a340 20 66 6f 72 20 28 69 65 20 3d 20 30 3b 20 69 65   for (ie = 0; ie
2a350 20 3c 20 65 6e 74 69 74 69 65 73 3b 20 69 65 2b   < entities; ie+
2a360 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66  +).      {..  if
2a370 20 28 62 6c 6f 62 5f 73 69 7a 65 20 3c 20 6f 66   (blob_size < of
2a380 66 73 65 74 20 2b 20 35 29 0a 09 20 20 20 20 20  fset + 5)..     
2a390 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20 6d   return -1;..  m
2a3a0 65 6d 63 70 79 20 28 78 74 79 70 65 2c 20 62 6c  emcpy (xtype, bl
2a3b0 6f 62 20 2b 20 6f 66 66 73 65 74 20 2b 20 31 2c  ob + offset + 1,
2a3c0 20 34 29 3b 0a 09 20 20 69 66 20 28 65 6e 64 69   4);..  if (endi
2a3d0 61 6e 29 0a 09 20 20 20 20 20 20 78 74 79 70 65  an)..      xtype
2a3e0 5b 33 5d 20 3d 20 30 78 30 30 3b 0a 09 20 20 65  [3] = 0x00;..  e
2a3f0 6c 73 65 0a 09 20 20 20 20 20 20 78 74 79 70 65  lse..      xtype
2a400 5b 30 5d 20 3d 20 30 78 30 30 3b 0a 09 20 20 74  [0] = 0x00;..  t
2a410 79 70 65 20 3d 20 67 61 69 61 49 6d 70 6f 72 74  ype = gaiaImport
2a420 33 32 20 28 78 74 79 70 65 2c 20 65 6e 64 69 61  32 (xtype, endia
2a430 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  n, endian_arch);
2a440 0a 09 20 20 6f 66 66 73 65 74 20 2b 3d 20 35 3b  ..  offset += 5;
2a450 0a 09 20 20 69 66 20 28 74 79 70 65 20 21 3d 20  ..  if (type != 
2a460 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 29 0a 09 20  GAIA_POLYGON).. 
2a470 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
2a480 09 20 20 6f 66 66 20 3d 0a 09 20 20 20 20 20 20  .  off =..      
2a490 67 61 69 61 45 77 6b 62 47 65 74 50 6f 6c 79 67  gaiaEwkbGetPolyg
2a4a0 6f 6e 20 28 67 65 6f 6d 2c 20 62 6c 6f 62 2c 20  on (geom, blob, 
2a4b0 6f 66 66 73 65 74 2c 20 62 6c 6f 62 5f 73 69 7a  offset, blob_siz
2a4c0 65 2c 20 65 6e 64 69 61 6e 2c 0a 09 09 09 09 20  e, endian,..... 
2a4d0 20 65 6e 64 69 61 6e 5f 61 72 63 68 2c 20 64 69   endian_arch, di
2a4e0 6d 73 29 3b 0a 09 20 20 69 66 20 28 6f 66 66 20  ms);..  if (off 
2a4f0 3c 20 30 29 0a 09 20 20 20 20 20 20 72 65 74 75  < 0)..      retu
2a500 72 6e 20 2d 31 3b 0a 09 20 20 6f 66 66 73 65 74  rn -1;..  offset
2a510 20 3d 20 6f 66 66 3b 0a 20 20 20 20 20 20 7d 0a   = off;.      }.
2a520 20 20 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65      return offse
2a530 74 3b 0a 7d 0a 0a 47 41 49 41 47 45 4f 5f 44 45  t;.}..GAIAGEO_DE
2a540 43 4c 41 52 45 20 69 6e 74 0a 67 61 69 61 45 77  CLARE int.gaiaEw
2a550 6b 62 47 65 74 4d 75 6c 74 69 47 65 6f 6d 65 74  kbGetMultiGeomet
2a560 72 79 20 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c  ry (gaiaGeomColl
2a570 50 74 72 20 67 65 6f 6d 2c 20 75 6e 73 69 67 6e  Ptr geom, unsign
2a580 65 64 20 63 68 61 72 20 2a 62 6c 6f 62 2c 0a 09  ed char *blob,..
2a590 09 09 20 20 69 6e 74 20 6f 66 66 73 65 74 2c 20  ..  int offset, 
2a5a0 69 6e 74 20 62 6c 6f 62 5f 73 69 7a 65 2c 20 69  int blob_size, i
2a5b0 6e 74 20 65 6e 64 69 61 6e 2c 0a 09 09 09 20 20  nt endian,....  
2a5c0 69 6e 74 20 65 6e 64 69 61 6e 5f 61 72 63 68 2c  int endian_arch,
2a5d0 20 69 6e 74 20 64 69 6d 73 29 0a 7b 0a 2f 2a 20   int dims).{./* 
2a5e0 64 65 63 6f 64 65 73 20 61 20 4d 75 6c 74 69 47  decodes a MultiG
2a5f0 65 6f 6d 65 74 72 79 20 66 72 6f 6d 20 50 6f 73  eometry from Pos
2a600 74 47 49 53 20 45 57 4b 42 20 62 69 6e 61 72 79  tGIS EWKB binary
2a610 20 47 45 4f 4d 45 54 52 59 20 2a 2f 0a 20 20 20   GEOMETRY */.   
2a620 20 69 6e 74 20 65 6e 74 69 74 69 65 73 3b 0a 20   int entities;. 
2a630 20 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 20     int type;.   
2a640 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 78   unsigned char x
2a650 74 79 70 65 5b 34 5d 3b 0a 20 20 20 20 69 6e 74  type[4];.    int
2a660 20 69 65 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66   ie;.    int off
2a670 3b 0a 20 20 20 20 69 66 20 28 62 6c 6f 62 5f 73  ;.    if (blob_s
2a680 69 7a 65 20 3c 20 6f 66 66 73 65 74 20 2b 20 34  ize < offset + 4
2a690 29 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20  )..return -1;.  
2a6a0 20 20 65 6e 74 69 74 69 65 73 20 3d 20 67 61 69    entities = gai
2a6b0 61 49 6d 70 6f 72 74 33 32 20 28 62 6c 6f 62 20  aImport32 (blob 
2a6c0 2b 20 6f 66 66 73 65 74 2c 20 65 6e 64 69 61 6e  + offset, endian
2a6d0 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  , endian_arch);.
2a6e0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 34 3b      offset += 4;
2a6f0 0a 20 20 20 20 66 6f 72 20 28 69 65 20 3d 20 30  .    for (ie = 0
2a700 3b 20 69 65 20 3c 20 65 6e 74 69 74 69 65 73 3b  ; ie < entities;
2a710 20 69 65 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09   ie++).      {..
2a720 20 20 69 66 20 28 62 6c 6f 62 5f 73 69 7a 65 20    if (blob_size 
2a730 3c 20 6f 66 66 73 65 74 20 2b 20 35 29 0a 09 20  < offset + 5).. 
2a740 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
2a750 09 20 20 6d 65 6d 63 70 79 20 28 78 74 79 70 65  .  memcpy (xtype
2a760 2c 20 62 6c 6f 62 20 2b 20 6f 66 66 73 65 74 20  , blob + offset 
2a770 2b 20 31 2c 20 34 29 3b 0a 09 20 20 69 66 20 28  + 1, 4);..  if (
2a780 65 6e 64 69 61 6e 29 0a 09 20 20 20 20 20 20 78  endian)..      x
2a790 74 79 70 65 5b 33 5d 20 3d 20 30 78 30 30 3b 0a  type[3] = 0x00;.
2a7a0 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 78  .  else..      x
2a7b0 74 79 70 65 5b 30 5d 20 3d 20 30 78 30 30 3b 0a  type[0] = 0x00;.
2a7c0 09 20 20 74 79 70 65 20 3d 20 67 61 69 61 49 6d  .  type = gaiaIm
2a7d0 70 6f 72 74 33 32 20 28 78 74 79 70 65 2c 20 65  port32 (xtype, e
2a7e0 6e 64 69 61 6e 2c 20 65 6e 64 69 61 6e 5f 61 72  ndian, endian_ar
2a7f0 63 68 29 3b 0a 09 20 20 6f 66 66 73 65 74 20 2b  ch);..  offset +
2a800 3d 20 35 3b 0a 09 20 20 73 77 69 74 63 68 20 28  = 5;..  switch (
2a810 74 79 70 65 29 0a 09 20 20 20 20 7b 0a 09 20 20  type)..    {..  
2a820 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f 49 4e    case GAIA_POIN
2a830 54 3a 0a 09 09 6f 66 66 20 3d 0a 09 09 20 20 20  T:...off =...   
2a840 20 67 61 69 61 45 77 6b 62 47 65 74 50 6f 69 6e   gaiaEwkbGetPoin
2a850 74 20 28 67 65 6f 6d 2c 20 62 6c 6f 62 2c 20 6f  t (geom, blob, o
2a860 66 66 73 65 74 2c 20 62 6c 6f 62 5f 73 69 7a 65  ffset, blob_size
2a870 2c 20 65 6e 64 69 61 6e 2c 0a 09 09 09 09 20 20  , endian,.....  
2a880 20 20 20 20 65 6e 64 69 61 6e 5f 61 72 63 68 2c      endian_arch,
2a890 20 64 69 6d 73 29 3b 0a 09 09 69 66 20 28 6f 66   dims);...if (of
2a8a0 66 20 3c 20 30 29 0a 09 09 20 20 20 20 72 65 74  f < 0)...    ret
2a8b0 75 72 6e 20 2d 31 3b 0a 09 09 6f 66 66 73 65 74  urn -1;...offset
2a8c0 20 3d 20 6f 66 66 3b 0a 09 09 62 72 65 61 6b 3b   = off;...break;
2a8d0 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f  ..    case GAIA_
2a8e0 4c 49 4e 45 53 54 52 49 4e 47 3a 0a 09 09 6f 66  LINESTRING:...of
2a8f0 66 20 3d 0a 09 09 20 20 20 20 67 61 69 61 45 77  f =...    gaiaEw
2a900 6b 62 47 65 74 4c 69 6e 65 73 74 72 69 6e 67 20  kbGetLinestring 
2a910 28 67 65 6f 6d 2c 20 62 6c 6f 62 2c 20 6f 66 66  (geom, blob, off
2a920 73 65 74 2c 20 62 6c 6f 62 5f 73 69 7a 65 2c 0a  set, blob_size,.
2a930 09 09 09 09 09 20 20 20 65 6e 64 69 61 6e 2c 20  .....   endian, 
2a940 65 6e 64 69 61 6e 5f 61 72 63 68 2c 20 64 69 6d  endian_arch, dim
2a950 73 29 3b 0a 09 09 69 66 20 28 6f 66 66 20 3c 20  s);...if (off < 
2a960 30 29 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20  0)...    return 
2a970 2d 31 3b 0a 09 09 6f 66 66 73 65 74 20 3d 20 6f  -1;...offset = o
2a980 66 66 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20  ff;...break;..  
2a990 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f 4c 59    case GAIA_POLY
2a9a0 47 4f 4e 3a 0a 09 09 6f 66 66 20 3d 0a 09 09 20  GON:...off =... 
2a9b0 20 20 20 67 61 69 61 45 77 6b 62 47 65 74 50 6f     gaiaEwkbGetPo
2a9c0 6c 79 67 6f 6e 20 28 67 65 6f 6d 2c 20 62 6c 6f  lygon (geom, blo
2a9d0 62 2c 20 6f 66 66 73 65 74 2c 20 62 6c 6f 62 5f  b, offset, blob_
2a9e0 73 69 7a 65 2c 20 65 6e 64 69 61 6e 2c 0a 09 09  size, endian,...
2a9f0 09 09 09 65 6e 64 69 61 6e 5f 61 72 63 68 2c 20  ...endian_arch, 
2aa00 64 69 6d 73 29 3b 0a 09 09 69 66 20 28 6f 66 66  dims);...if (off
2aa10 20 3c 20 30 29 0a 09 09 20 20 20 20 72 65 74 75   < 0)...    retu
2aa20 72 6e 20 2d 31 3b 0a 09 09 6f 66 66 73 65 74 20  rn -1;...offset 
2aa30 3d 20 6f 66 66 3b 0a 09 09 62 72 65 61 6b 3b 0a  = off;...break;.
2aa40 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d  .    case GAIA_M
2aa50 55 4c 54 49 50 4f 49 4e 54 3a 0a 09 09 6f 66 66  ULTIPOINT:...off
2aa60 20 3d 0a 09 09 20 20 20 20 67 61 69 61 45 77 6b   =...    gaiaEwk
2aa70 62 47 65 74 4d 75 6c 74 69 50 6f 69 6e 74 20 28  bGetMultiPoint (
2aa80 67 65 6f 6d 2c 20 62 6c 6f 62 2c 20 6f 66 66 73  geom, blob, offs
2aa90 65 74 2c 20 62 6c 6f 62 5f 73 69 7a 65 2c 0a 09  et, blob_size,..
2aaa0 09 09 09 09 20 20 20 65 6e 64 69 61 6e 2c 20 65  ....   endian, e
2aab0 6e 64 69 61 6e 5f 61 72 63 68 2c 20 64 69 6d 73  ndian_arch, dims
2aac0 29 3b 0a 09 09 69 66 20 28 6f 66 66 20 3c 20 30  );...if (off < 0
2aad0 29 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 2d  )...    return -
2aae0 31 3b 0a 09 09 6f 66 66 73 65 74 20 3d 20 6f 66  1;...offset = of
2aaf0 66 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  f;...break;..   
2ab00 20 63 61 73 65 20 47 41 49 41 5f 4d 55 4c 54 49   case GAIA_MULTI
2ab10 4c 49 4e 45 53 54 52 49 4e 47 3a 0a 09 09 6f 66  LINESTRING:...of
2ab20 66 20 3d 0a 09 09 20 20 20 20 67 61 69 61 45 77  f =...    gaiaEw
2ab30 6b 62 47 65 74 4d 75 6c 74 69 4c 69 6e 65 73 74  kbGetMultiLinest
2ab40 72 69 6e 67 20 28 67 65 6f 6d 2c 20 62 6c 6f 62  ring (geom, blob
2ab50 2c 20 6f 66 66 73 65 74 2c 20 62 6c 6f 62 5f 73  , offset, blob_s
2ab60 69 7a 65 2c 0a 09 09 09 09 09 09 65 6e 64 69 61  ize,.......endia
2ab70 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 2c 20  n, endian_arch, 
2ab80 64 69 6d 73 29 3b 0a 09 09 69 66 20 28 6f 66 66  dims);...if (off
2ab90 20 3c 20 30 29 0a 09 09 20 20 20 20 72 65 74 75   < 0)...    retu
2aba0 72 6e 20 2d 31 3b 0a 09 09 6f 66 66 73 65 74 20  rn -1;...offset 
2abb0 3d 20 6f 66 66 3b 0a 09 09 62 72 65 61 6b 3b 0a  = off;...break;.
2abc0 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d  .    case GAIA_M
2abd0 55 4c 54 49 50 4f 4c 59 47 4f 4e 3a 0a 09 09 6f  ULTIPOLYGON:...o
2abe0 66 66 20 3d 0a 09 09 20 20 20 20 67 61 69 61 45  ff =...    gaiaE
2abf0 77 6b 62 47 65 74 4d 75 6c 74 69 50 6f 6c 79 67  wkbGetMultiPolyg
2ac00 6f 6e 20 28 67 65 6f 6d 2c 20 62 6c 6f 62 2c 20  on (geom, blob, 
2ac10 6f 66 66 73 65 74 2c 20 62 6c 6f 62 5f 73 69 7a  offset, blob_siz
2ac20 65 2c 0a 09 09 09 09 09 20 20 20 20 20 65 6e 64  e,......     end
2ac30 69 61 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  ian, endian_arch
2ac40 2c 20 64 69 6d 73 29 3b 0a 09 09 69 66 20 28 6f  , dims);...if (o
2ac50 66 66 20 3c 20 30 29 0a 09 09 20 20 20 20 72 65  ff < 0)...    re
2ac60 74 75 72 6e 20 2d 31 3b 0a 09 09 6f 66 66 73 65  turn -1;...offse
2ac70 74 20 3d 20 6f 66 66 3b 0a 09 09 62 72 65 61 6b  t = off;...break
2ac80 3b 0a 09 20 20 20 20 63 61 73 65 20 47 41 49 41  ;..    case GAIA
2ac90 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
2aca0 49 4f 4e 3a 0a 09 09 6f 66 66 20 3d 0a 09 09 20  ION:...off =... 
2acb0 20 20 20 67 61 69 61 45 77 6b 62 47 65 74 4d 75     gaiaEwkbGetMu
2acc0 6c 74 69 47 65 6f 6d 65 74 72 79 20 28 67 65 6f  ltiGeometry (geo
2acd0 6d 2c 20 62 6c 6f 62 2c 20 6f 66 66 73 65 74 2c  m, blob, offset,
2ace0 20 62 6c 6f 62 5f 73 69 7a 65 2c 0a 09 09 09 09   blob_size,.....
2acf0 09 20 20 20 20 20 20 65 6e 64 69 61 6e 2c 20 65  .      endian, e
2ad00 6e 64 69 61 6e 5f 61 72 63 68 2c 20 64 69 6d 73  ndian_arch, dims
2ad10 29 3b 0a 09 09 69 66 20 28 6f 66 66 20 3c 20 30  );...if (off < 0
2ad20 29 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 2d  )...    return -
2ad30 31 3b 0a 09 09 6f 66 66 73 65 74 20 3d 20 6f 66  1;...offset = of
2ad40 66 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  f;...break;..   
2ad50 20 64 65 66 61 75 6c 74 3a 09 09 2f 2a 20 75 6e   default:../* un
2ad60 65 78 70 65 63 74 65 64 3a 20 69 6e 76 61 6c 69  expected: invali
2ad70 64 20 45 57 4b 42 20 2a 2f 0a 09 09 72 65 74 75  d EWKB */...retu
2ad80 72 6e 20 2d 31 3b 0a 09 20 20 20 20 7d 3b 0a 20  rn -1;..    };. 
2ad90 20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72       }.    retur
2ada0 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 73 74 61  n offset;.}..sta
2adb0 74 69 63 20 69 6e 74 0a 70 61 72 73 65 48 65 78  tic int.parseHex
2adc0 45 77 6b 62 42 79 74 65 20 28 63 6f 6e 73 74 20  EwkbByte (const 
2add0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 68 69  unsigned char hi
2ade0 67 68 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  gh, const unsign
2adf0 65 64 20 63 68 61 72 20 6c 6f 77 2c 0a 09 09 20  ed char low,... 
2ae00 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2ae10 62 79 74 65 29 0a 7b 0a 2f 2a 20 70 61 72 73 69  byte).{./* parsi
2ae20 6e 67 20 61 6e 20 48 65 78 61 64 65 63 69 6d 61  ng an Hexadecima
2ae30 6c 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 75 6e  l byte */.    un
2ae40 73 69 67 6e 65 64 20 63 68 61 72 20 68 65 78 3b  signed char hex;
2ae50 0a 20 20 20 20 73 77 69 74 63 68 20 28 68 69 67  .    switch (hig
2ae60 68 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  h).      {.     
2ae70 20 63 61 73 65 20 27 30 27 3a 0a 09 20 20 68 65   case '0':..  he
2ae80 78 20 3d 20 31 36 20 2a 20 30 3b 0a 09 20 20 62  x = 16 * 0;..  b
2ae90 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
2aea0 20 27 31 27 3a 0a 09 20 20 68 65 78 20 3d 20 31   '1':..  hex = 1
2aeb0 36 20 2a 20 31 3b 0a 09 20 20 62 72 65 61 6b 3b  6 * 1;..  break;
2aec0 0a 20 20 20 20 20 20 63 61 73 65 20 27 32 27 3a  .      case '2':
2aed0 0a 09 20 20 68 65 78 20 3d 20 31 36 20 2a 20 32  ..  hex = 16 * 2
2aee0 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;..  break;.    
2aef0 20 20 63 61 73 65 20 27 33 27 3a 0a 09 20 20 68    case '3':..  h
2af00 65 78 20 3d 20 31 36 20 2a 20 33 3b 0a 09 20 20  ex = 16 * 3;..  
2af10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
2af20 65 20 27 34 27 3a 0a 09 20 20 68 65 78 20 3d 20  e '4':..  hex = 
2af30 31 36 20 2a 20 34 3b 0a 09 20 20 62 72 65 61 6b  16 * 4;..  break
2af40 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27 35 27  ;.      case '5'
2af50 3a 0a 09 20 20 68 65 78 20 3d 20 31 36 20 2a 20  :..  hex = 16 * 
2af60 35 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  5;..  break;.   
2af70 20 20 20 63 61 73 65 20 27 36 27 3a 0a 09 20 20     case '6':..  
2af80 68 65 78 20 3d 20 31 36 20 2a 20 36 3b 0a 09 20  hex = 16 * 6;.. 
2af90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
2afa0 73 65 20 27 37 27 3a 0a 09 20 20 68 65 78 20 3d  se '7':..  hex =
2afb0 20 31 36 20 2a 20 37 3b 0a 09 20 20 62 72 65 61   16 * 7;..  brea
2afc0 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27 38  k;.      case '8
2afd0 27 3a 0a 09 20 20 68 65 78 20 3d 20 31 36 20 2a  ':..  hex = 16 *
2afe0 20 38 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20   8;..  break;.  
2aff0 20 20 20 20 63 61 73 65 20 27 39 27 3a 0a 09 20      case '9':.. 
2b000 20 68 65 78 20 3d 20 31 36 20 2a 20 39 3b 0a 09   hex = 16 * 9;..
2b010 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
2b020 61 73 65 20 27 41 27 3a 0a 20 20 20 20 20 20 63  ase 'A':.      c
2b030 61 73 65 20 27 61 27 3a 0a 09 20 20 68 65 78 20  ase 'a':..  hex 
2b040 3d 20 31 36 20 2a 20 31 30 3b 0a 09 20 20 62 72  = 16 * 10;..  br
2b050 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
2b060 27 42 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20  'B':.      case 
2b070 27 62 27 3a 0a 09 20 20 68 65 78 20 3d 20 31 36  'b':..  hex = 16
2b080 20 2a 20 31 31 3b 0a 09 20 20 62 72 65 61 6b 3b   * 11;..  break;
2b090 0a 20 20 20 20 20 20 63 61 73 65 20 27 43 27 3a  .      case 'C':
2b0a0 0a 20 20 20 20 20 20 63 61 73 65 20 27 63 27 3a  .      case 'c':
2b0b0 0a 09 20 20 68 65 78 20 3d 20 31 36 20 2a 20 31  ..  hex = 16 * 1
2b0c0 32 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  2;..  break;.   
2b0d0 20 20 20 63 61 73 65 20 27 44 27 3a 0a 20 20 20     case 'D':.   
2b0e0 20 20 20 63 61 73 65 20 27 64 27 3a 0a 09 20 20     case 'd':..  
2b0f0 68 65 78 20 3d 20 31 36 20 2a 20 31 33 3b 0a 09  hex = 16 * 13;..
2b100 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
2b110 61 73 65 20 27 45 27 3a 0a 20 20 20 20 20 20 63  ase 'E':.      c
2b120 61 73 65 20 27 65 27 3a 0a 09 20 20 68 65 78 20  ase 'e':..  hex 
2b130 3d 20 31 36 20 2a 20 31 34 3b 0a 09 20 20 62 72  = 16 * 14;..  br
2b140 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
2b150 27 46 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20  'F':.      case 
2b160 27 66 27 3a 0a 09 20 20 68 65 78 20 3d 20 31 36  'f':..  hex = 16
2b170 20 2a 20 31 35 3b 0a 09 20 20 62 72 65 61 6b 3b   * 15;..  break;
2b180 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
2b190 09 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20  .  return 0;.   
2b1a0 20 20 20 7d 3b 0a 20 20 20 20 73 77 69 74 63 68     };.    switch
2b1b0 20 28 6c 6f 77 29 0a 20 20 20 20 20 20 7b 0a 20   (low).      {. 
2b1c0 20 20 20 20 20 63 61 73 65 20 27 30 27 3a 0a 09       case '0':..
2b1d0 20 20 68 65 78 20 2b 3d 20 30 3b 0a 09 20 20 62    hex += 0;..  b
2b1e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
2b1f0 20 27 31 27 3a 0a 09 20 20 68 65 78 20 2b 3d 20   '1':..  hex += 
2b200 31 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  1;..  break;.   
2b210 20 20 20 63 61 73 65 20 27 32 27 3a 0a 09 20 20     case '2':..  
2b220 68 65 78 20 2b 3d 20 32 3b 0a 09 20 20 62 72 65  hex += 2;..  bre
2b230 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27  ak;.      case '
2b240 33 27 3a 0a 09 20 20 68 65 78 20 2b 3d 20 33 3b  3':..  hex += 3;
2b250 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
2b260 20 63 61 73 65 20 27 34 27 3a 0a 09 20 20 68 65   case '4':..  he
2b270 78 20 2b 3d 20 34 3b 0a 09 20 20 62 72 65 61 6b  x += 4;..  break
2b280 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27 35 27  ;.      case '5'
2b290 3a 0a 09 20 20 68 65 78 20 2b 3d 20 35 3b 0a 09  :..  hex += 5;..
2b2a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
2b2b0 61 73 65 20 27 36 27 3a 0a 09 20 20 68 65 78 20  ase '6':..  hex 
2b2c0 2b 3d 20 36 3b 0a 09 20 20 62 72 65 61 6b 3b 0a  += 6;..  break;.
2b2d0 20 20 20 20 20 20 63 61 73 65 20 27 37 27 3a 0a        case '7':.
2b2e0 09 20 20 68 65 78 20 2b 3d 20 37 3b 0a 09 20 20  .  hex += 7;..  
2b2f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
2b300 65 20 27 38 27 3a 0a 09 20 20 68 65 78 20 2b 3d  e '8':..  hex +=
2b310 20 38 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20   8;..  break;.  
2b320 20 20 20 20 63 61 73 65 20 27 39 27 3a 0a 09 20      case '9':.. 
2b330 20 68 65 78 20 2b 3d 20 39 3b 0a 09 20 20 62 72   hex += 9;..  br
2b340 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
2b350 27 41 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20  'A':.      case 
2b360 27 61 27 3a 0a 09 20 20 68 65 78 20 2b 3d 20 31  'a':..  hex += 1
2b370 30 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  0;..  break;.   
2b380 20 20 20 63 61 73 65 20 27 42 27 3a 0a 20 20 20     case 'B':.   
2b390 20 20 20 63 61 73 65 20 27 62 27 3a 0a 09 20 20     case 'b':..  
2b3a0 68 65 78 20 2b 3d 20 31 31 3b 0a 09 20 20 62 72  hex += 11;..  br
2b3b0 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
2b3c0 27 43 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20  'C':.      case 
2b3d0 27 63 27 3a 0a 09 20 20 68 65 78 20 2b 3d 20 31  'c':..  hex += 1
2b3e0 32 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  2;..  break;.   
2b3f0 20 20 20 63 61 73 65 20 27 44 27 3a 0a 20 20 20     case 'D':.   
2b400 20 20 20 63 61 73 65 20 27 64 27 3a 0a 09 20 20     case 'd':..  
2b410 68 65 78 20 2b 3d 20 31 33 3b 0a 09 20 20 62 72  hex += 13;..  br
2b420 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
2b430 27 45 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20  'E':.      case 
2b440 27 65 27 3a 0a 09 20 20 68 65 78 20 2b 3d 20 31  'e':..  hex += 1
2b450 34 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  4;..  break;.   
2b460 20 20 20 63 61 73 65 20 27 46 27 3a 0a 20 20 20     case 'F':.   
2b470 20 20 20 63 61 73 65 20 27 66 27 3a 0a 09 20 20     case 'f':..  
2b480 68 65 78 20 2b 3d 20 31 35 3b 0a 09 20 20 62 72  hex += 15;..  br
2b490 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75  eak;.      defau
2b4a0 6c 74 3a 0a 09 20 20 72 65 74 75 72 6e 20 30 3b  lt:..  return 0;
2b4b0 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 2a 62  .      };.    *b
2b4c0 79 74 65 20 3d 20 68 65 78 3b 0a 20 20 20 20 72  yte = hex;.    r
2b4d0 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 47 41 49 41  eturn 1;.}..GAIA
2b4e0 47 45 4f 5f 44 45 43 4c 41 52 45 20 75 6e 73 69  GEO_DECLARE unsi
2b4f0 67 6e 65 64 20 63 68 61 72 20 2a 0a 67 61 69 61  gned char *.gaia
2b500 50 61 72 73 65 48 65 78 45 57 4b 42 20 28 63 6f  ParseHexEWKB (co
2b510 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
2b520 72 20 2a 62 6c 6f 62 5f 68 65 78 2c 20 69 6e 74  r *blob_hex, int
2b530 20 2a 62 6c 6f 62 5f 73 69 7a 65 29 0a 7b 0a 2f   *blob_size).{./
2b540 2a 20 70 61 72 73 69 6e 67 20 61 6e 20 48 65 78  * parsing an Hex
2b550 61 64 65 63 69 6d 61 6c 20 45 57 4b 42 20 47 65  adecimal EWKB Ge
2b560 6f 6d 65 74 72 79 20 2a 2f 0a 20 20 20 20 75 6e  ometry */.    un
2b570 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f  signed char *blo
2b580 62 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  b;.    unsigned 
2b590 63 68 61 72 20 2a 70 5f 6f 75 74 3b 0a 20 20 20  char *p_out;.   
2b5a0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
2b5b0 63 68 61 72 20 2a 70 5f 69 6e 3b 0a 20 20 20 20  char *p_in;.    
2b5c0 63 68 61 72 20 68 69 67 68 3b 0a 20 20 20 20 63  char high;.    c
2b5d0 68 61 72 20 6c 6f 77 3b 0a 20 20 20 20 75 6e 73  har low;.    uns
2b5e0 69 67 6e 65 64 20 63 68 61 72 20 68 65 78 3b 0a  igned char hex;.
2b5f0 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20      int size;.  
2b600 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
2b610 65 6e 20 28 28 63 6f 6e 73 74 20 63 68 61 72 20  en ((const char 
2b620 2a 29 20 62 6c 6f 62 5f 68 65 78 29 3b 0a 20 20  *) blob_hex);.  
2b630 20 20 73 69 7a 65 20 3d 20 6c 65 6e 20 2f 20 32    size = len / 2
2b640 3b 0a 20 20 20 20 69 66 20 28 73 69 7a 65 20 2a  ;.    if (size *
2b650 20 32 20 21 3d 20 6c 65 6e 29 0a 09 72 65 74 75   2 != len)..retu
2b660 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 62 6c 6f  rn NULL;.    blo
2b670 62 20 3d 20 6d 61 6c 6c 6f 63 20 28 73 69 7a 65  b = malloc (size
2b680 29 3b 0a 20 20 20 20 69 66 20 28 21 62 6c 6f 62  );.    if (!blob
2b690 29 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  )..return NULL;.
2b6a0 20 20 20 20 2a 62 6c 6f 62 5f 73 69 7a 65 20 3d      *blob_size =
2b6b0 20 73 69 7a 65 3b 0a 20 20 20 20 70 5f 69 6e 20   size;.    p_in 
2b6c0 3d 20 62 6c 6f 62 5f 68 65 78 3b 0a 20 20 20 20  = blob_hex;.    
2b6d0 70 5f 6f 75 74 20 3d 20 62 6c 6f 62 3b 0a 20 20  p_out = blob;.  
2b6e0 20 20 77 68 69 6c 65 20 28 2a 70 5f 69 6e 20 21    while (*p_in !
2b6f0 3d 20 27 5c 30 27 29 0a 20 20 20 20 20 20 7b 0a  = '\0').      {.
2b700 09 20 20 68 69 67 68 20 3d 20 2a 70 5f 69 6e 2b  .  high = *p_in+
2b710 2b 3b 0a 09 20 20 6c 6f 77 20 3d 20 2a 70 5f 69  +;..  low = *p_i
2b720 6e 2b 2b 3b 0a 09 20 20 69 66 20 28 21 70 61 72  n++;..  if (!par
2b730 73 65 48 65 78 45 77 6b 62 42 79 74 65 20 28 68  seHexEwkbByte (h
2b740 69 67 68 2c 20 6c 6f 77 2c 20 26 68 65 78 29 29  igh, low, &hex))
2b750 0a 09 20 20 20 20 7b 0a 09 09 66 72 65 65 20 28  ..    {...free (
2b760 62 6c 6f 62 29 3b 0a 09 09 72 65 74 75 72 6e 20  blob);...return 
2b770 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20  NULL;..    }..  
2b780 2a 70 5f 6f 75 74 2b 2b 20 3d 20 68 65 78 3b 0a  *p_out++ = hex;.
2b790 20 20 20 20 20 20 7d 0a 20 20 20 20 2a 62 6c 6f        }.    *blo
2b7a0 62 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20  b_size = size;. 
2b7b0 20 20 20 72 65 74 75 72 6e 20 62 6c 6f 62 3b 0a     return blob;.
2b7c0 7d 0a 0a 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50  }..gaiaGeomCollP
2b7d0 74 72 0a 67 61 69 61 46 72 6f 6d 45 57 4b 42 20  tr.gaiaFromEWKB 
2b7e0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
2b7f0 63 68 61 72 20 2a 69 6e 5f 62 75 66 66 65 72 29  char *in_buffer)
2b800 0a 7b 0a 2f 2a 20 63 72 65 61 74 65 73 20 61 20  .{./* creates a 
2b810 47 61 69 61 20 6f 77 6e 20 47 65 6f 6d 65 74 72  Gaia own Geometr
2b820 79 20 66 72 6f 6d 20 47 45 4f 53 2f 50 6f 73 74  y from GEOS/Post
2b830 47 49 53 20 45 57 4b 42 20 2a 2f 0a 20 20 20 20  GIS EWKB */.    
2b840 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
2b850 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 62 6c 6f  lob;.    int blo
2b860 62 5f 73 69 7a 65 3b 0a 20 20 20 20 75 6e 73 69  b_size;.    unsi
2b870 67 6e 65 64 20 63 68 61 72 20 78 74 79 70 65 5b  gned char xtype[
2b880 34 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  4];.    unsigned
2b890 20 63 68 61 72 20 78 64 69 6d 73 3b 0a 20 20 20   char xdims;.   
2b8a0 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 20 20 69   int type;.    i
2b8b0 6e 74 20 68 61 73 5f 7a 20 3d 20 30 3b 0a 20 20  nt has_z = 0;.  
2b8c0 20 20 69 6e 74 20 68 61 73 5f 6d 20 3d 20 30 3b    int has_m = 0;
2b8d0 0a 20 20 20 20 69 6e 74 20 64 69 6d 73 20 3d 20  .    int dims = 
2b8e0 47 41 49 41 5f 58 59 3b 0a 20 20 20 20 69 6e 74  GAIA_XY;.    int
2b8f0 20 73 72 69 64 3b 0a 20 20 20 20 69 6e 74 20 72   srid;.    int r
2b900 65 74 3b 0a 20 20 20 20 69 6e 74 20 65 6e 64 69  et;.    int endi
2b910 61 6e 3b 0a 20 20 20 20 69 6e 74 20 65 6e 64 69  an;.    int endi
2b920 61 6e 5f 61 72 63 68 20 3d 20 67 61 69 61 45 6e  an_arch = gaiaEn
2b930 64 69 61 6e 41 72 63 68 20 28 29 3b 0a 20 20 20  dianArch ();.   
2b940 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72   gaiaGeomCollPtr
2b950 20 67 65 6f 6d 20 3d 20 4e 55 4c 4c 3b 0a 20 20   geom = NULL;.  
2b960 20 20 62 6c 6f 62 20 3d 20 67 61 69 61 50 61 72    blob = gaiaPar
2b970 73 65 48 65 78 45 57 4b 42 20 28 69 6e 5f 62 75  seHexEWKB (in_bu
2b980 66 66 65 72 2c 20 26 62 6c 6f 62 5f 73 69 7a 65  ffer, &blob_size
2b990 29 3b 0a 20 20 20 20 69 66 20 28 21 62 6c 6f 62  );.    if (!blob
2b9a0 29 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  )..return NULL;.
2b9b0 20 20 20 20 69 66 20 28 62 6c 6f 62 5f 73 69 7a      if (blob_siz
2b9c0 65 20 3c 20 39 29 0a 20 20 20 20 20 20 7b 0a 09  e < 9).      {..
2b9d0 20 20 66 72 65 65 20 28 62 6c 6f 62 29 3b 0a 09    free (blob);..
2b9e0 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20    return NULL;. 
2b9f0 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 2a       }.    if (*
2ba00 28 62 6c 6f 62 20 2b 20 30 29 20 3d 3d 20 30 78  (blob + 0) == 0x
2ba10 30 31 29 0a 09 65 6e 64 69 61 6e 20 3d 20 31 3b  01)..endian = 1;
2ba20 0a 20 20 20 20 65 6c 73 65 0a 09 65 6e 64 69 61  .    else..endia
2ba30 6e 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 63 70  n = 0;.    memcp
2ba40 79 20 28 78 74 79 70 65 2c 20 62 6c 6f 62 20 2b  y (xtype, blob +
2ba50 20 31 2c 20 34 29 3b 0a 20 20 20 20 69 66 20 28   1, 4);.    if (
2ba60 65 6e 64 69 61 6e 29 0a 20 20 20 20 20 20 7b 0a  endian).      {.
2ba70 09 20 20 78 64 69 6d 73 20 3d 20 78 74 79 70 65  .  xdims = xtype
2ba80 5b 33 5d 3b 0a 09 20 20 78 74 79 70 65 5b 33 5d  [3];..  xtype[3]
2ba90 20 3d 20 30 78 30 30 3b 0a 20 20 20 20 20 20 7d   = 0x00;.      }
2baa0 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20  .    else.      
2bab0 7b 0a 09 20 20 78 64 69 6d 73 20 3d 20 78 74 79  {..  xdims = xty
2bac0 70 65 5b 30 5d 3b 0a 09 20 20 78 74 79 70 65 5b  pe[0];..  xtype[
2bad0 30 5d 20 3d 20 30 78 30 30 3b 0a 20 20 20 20 20  0] = 0x00;.     
2bae0 20 7d 0a 20 20 20 20 74 79 70 65 20 3d 20 67 61   }.    type = ga
2baf0 69 61 49 6d 70 6f 72 74 33 32 20 28 78 74 79 70  iaImport32 (xtyp
2bb00 65 2c 20 65 6e 64 69 61 6e 2c 20 65 6e 64 69 61  e, endian, endia
2bb10 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20 69 66 20  n_arch);.    if 
2bb20 28 78 64 69 6d 73 20 26 20 30 78 34 30 29 0a 09  (xdims & 0x40)..
2bb30 68 61 73 5f 6d 20 3d 20 31 3b 0a 20 20 20 20 69  has_m = 1;.    i
2bb40 66 20 28 78 64 69 6d 73 20 26 20 30 78 38 30 29  f (xdims & 0x80)
2bb50 0a 09 68 61 73 5f 7a 20 3d 20 31 3b 0a 20 20 20  ..has_z = 1;.   
2bb60 20 69 66 20 28 68 61 73 5f 6d 20 26 26 20 68 61   if (has_m && ha
2bb70 73 5f 7a 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  s_z).      {..  
2bb80 64 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 5a  dims = GAIA_XY_Z
2bb90 5f 4d 3b 0a 09 20 20 67 65 6f 6d 20 3d 20 67 61  _M;..  geom = ga
2bba0 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58  iaAllocGeomCollX
2bbb0 59 5a 4d 20 28 29 3b 0a 20 20 20 20 20 20 7d 0a  YZM ();.      }.
2bbc0 20 20 20 20 65 6c 73 65 20 69 66 20 28 68 61 73      else if (has
2bbd0 5f 6d 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 64  _m).      {..  d
2bbe0 69 6d 73 20 3d 20 47 41 49 41 5f 58 59 5f 4d 3b  ims = GAIA_XY_M;
2bbf0 0a 09 20 20 67 65 6f 6d 20 3d 20 67 61 69 61 41  ..  geom = gaiaA
2bc00 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 4d 20  llocGeomCollXYM 
2bc10 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ();.      }.    
2bc20 65 6c 73 65 20 69 66 20 28 68 61 73 5f 7a 29 0a  else if (has_z).
2bc30 20 20 20 20 20 20 7b 0a 09 20 20 64 69 6d 73 20        {..  dims 
2bc40 3d 20 47 41 49 41 5f 58 59 5f 5a 3b 0a 09 20 20  = GAIA_XY_Z;..  
2bc50 67 65 6f 6d 20 3d 20 67 61 69 61 41 6c 6c 6f 63  geom = gaiaAlloc
2bc60 47 65 6f 6d 43 6f 6c 6c 58 59 5a 20 28 29 3b 0a  GeomCollXYZ ();.
2bc70 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
2bc80 0a 20 20 20 20 20 20 7b 0a 09 20 20 64 69 6d 73  .      {..  dims
2bc90 20 3d 20 47 41 49 41 5f 58 59 3b 0a 09 20 20 67   = GAIA_XY;..  g
2bca0 65 6f 6d 20 3d 20 67 61 69 61 41 6c 6c 6f 63 47  eom = gaiaAllocG
2bcb0 65 6f 6d 43 6f 6c 6c 20 28 29 3b 0a 20 20 20 20  eomColl ();.    
2bcc0 20 20 7d 0a 20 20 20 20 73 72 69 64 20 3d 20 67    }.    srid = g
2bcd0 61 69 61 49 6d 70 6f 72 74 33 32 20 28 62 6c 6f  aiaImport32 (blo
2bce0 62 20 2b 20 35 2c 20 65 6e 64 69 61 6e 2c 20 65  b + 5, endian, e
2bcf0 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20  ndian_arch);.   
2bd00 20 67 65 6f 6d 2d 3e 53 72 69 64 20 3d 20 73 72   geom->Srid = sr
2bd10 69 64 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 6d  id;.    if (geom
2bd20 2d 3e 53 72 69 64 20 3c 3d 20 30 29 0a 09 67 65  ->Srid <= 0)..ge
2bd30 6f 6d 2d 3e 53 72 69 64 20 3d 20 30 3b 0a 20 20  om->Srid = 0;.  
2bd40 20 20 73 77 69 74 63 68 20 28 74 79 70 65 29 0a    switch (type).
2bd50 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 63 61        {.      ca
2bd60 73 65 20 47 41 49 41 5f 50 4f 49 4e 54 3a 0a 09  se GAIA_POINT:..
2bd70 20 20 72 65 74 20 3d 0a 09 20 20 20 20 20 20 67    ret =..      g
2bd80 61 69 61 45 77 6b 62 47 65 74 50 6f 69 6e 74 20  aiaEwkbGetPoint 
2bd90 28 67 65 6f 6d 2c 20 62 6c 6f 62 2c 20 39 2c 20  (geom, blob, 9, 
2bda0 62 6c 6f 62 5f 73 69 7a 65 2c 20 65 6e 64 69 61  blob_size, endia
2bdb0 6e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 2c 0a  n, endian_arch,.
2bdc0 09 09 09 09 64 69 6d 73 29 3b 0a 09 20 20 62 72  ....dims);..  br
2bdd0 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
2bde0 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 3a  GAIA_LINESTRING:
2bdf0 0a 09 20 20 72 65 74 20 3d 0a 09 20 20 20 20 20  ..  ret =..     
2be00 20 67 61 69 61 45 77 6b 62 47 65 74 4c 69 6e 65   gaiaEwkbGetLine
2be10 73 74 72 69 6e 67 20 28 67 65 6f 6d 2c 20 62 6c  string (geom, bl
2be20 6f 62 2c 20 39 2c 20 62 6c 6f 62 5f 73 69 7a 65  ob, 9, blob_size
2be30 2c 20 65 6e 64 69 61 6e 2c 0a 09 09 09 09 20 20  , endian,.....  
2be40 20 20 20 65 6e 64 69 61 6e 5f 61 72 63 68 2c 20     endian_arch, 
2be50 64 69 6d 73 29 3b 0a 09 20 20 62 72 65 61 6b 3b  dims);..  break;
2be60 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41  .      case GAIA
2be70 5f 50 4f 4c 59 47 4f 4e 3a 0a 09 20 20 72 65 74  _POLYGON:..  ret
2be80 20 3d 0a 09 20 20 20 20 20 20 67 61 69 61 45 77   =..      gaiaEw
2be90 6b 62 47 65 74 50 6f 6c 79 67 6f 6e 20 28 67 65  kbGetPolygon (ge
2bea0 6f 6d 2c 20 62 6c 6f 62 2c 20 39 2c 20 62 6c 6f  om, blob, 9, blo
2beb0 62 5f 73 69 7a 65 2c 20 65 6e 64 69 61 6e 2c 20  b_size, endian, 
2bec0 65 6e 64 69 61 6e 5f 61 72 63 68 2c 0a 09 09 09  endian_arch,....
2bed0 09 20 20 64 69 6d 73 29 3b 0a 09 20 20 62 72 65  .  dims);..  bre
2bee0 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c  ak;.      defaul
2bef0 74 3a 0a 09 20 20 72 65 74 20 3d 0a 09 20 20 20  t:..  ret =..   
2bf00 20 20 20 67 61 69 61 45 77 6b 62 47 65 74 4d 75     gaiaEwkbGetMu
2bf10 6c 74 69 47 65 6f 6d 65 74 72 79 20 28 67 65 6f  ltiGeometry (geo
2bf20 6d 2c 20 62 6c 6f 62 2c 20 39 2c 20 62 6c 6f 62  m, blob, 9, blob
2bf30 5f 73 69 7a 65 2c 20 65 6e 64 69 61 6e 2c 0a 09  _size, endian,..
2bf40 09 09 09 09 65 6e 64 69 61 6e 5f 61 72 63 68 2c  ....endian_arch,
2bf50 20 64 69 6d 73 29 3b 0a 09 20 20 62 72 65 61 6b   dims);..  break
2bf60 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 66  ;.      };.    f
2bf70 72 65 65 20 28 62 6c 6f 62 29 3b 0a 20 20 20 20  ree (blob);.    
2bf80 69 66 20 28 72 65 74 20 3c 20 30 29 0a 20 20 20  if (ret < 0).   
2bf90 20 20 20 7b 0a 09 20 20 2f 2a 20 69 6e 76 61 6c     {..  /* inval
2bfa0 69 64 20 45 57 4b 42 20 21 21 21 20 2a 2f 0a 09  id EWKB !!! */..
2bfb0 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f    gaiaFreeGeomCo
2bfc0 6c 6c 20 28 67 65 6f 6d 29 3b 0a 09 20 20 72 65  ll (geom);..  re
2bfd0 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 20  turn NULL;.     
2bfe0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 67 65   }.    return ge
2bff0 6f 6d 3b 0a 7d 0a 0a 47 41 49 41 47 45 4f 5f 44  om;.}..GAIAGEO_D
2c000 45 43 4c 41 52 45 20 76 6f 69 64 0a 67 61 69 61  ECLARE void.gaia
2c010 54 6f 45 57 4b 42 20 28 67 61 69 61 4f 75 74 42  ToEWKB (gaiaOutB
2c020 75 66 66 65 72 50 74 72 20 6f 75 74 5f 62 75 66  ufferPtr out_buf
2c030 2c 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74  , gaiaGeomCollPt
2c040 72 20 67 65 6f 6d 29 0a 7b 0a 2f 2a 20 70 72 69  r geom).{./* pri
2c050 6e 74 73 20 74 68 65 20 47 45 4f 53 2f 50 6f 73  nts the GEOS/Pos
2c060 74 47 49 53 20 45 57 4b 42 20 74 65 78 74 20 72  tGIS EWKB text r
2c070 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
2c080 20 63 75 72 72 65 6e 74 20 67 65 6f 6d 65 74 72   current geometr
2c090 79 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 62 75  y */.    char bu
2c0a0 66 5b 32 30 34 38 5d 3b 0a 20 20 20 20 75 6e 73  f[2048];.    uns
2c0b0 69 67 6e 65 64 20 63 68 61 72 20 65 6e 64 69 61  igned char endia
2c0c0 6e 5f 62 75 66 5b 31 36 5d 3b 0a 20 20 20 20 63  n_buf[16];.    c
2c0d0 68 61 72 20 62 79 74 65 5b 33 5d 3b 0a 20 20 20  har byte[3];.   
2c0e0 20 63 68 61 72 20 2a 70 74 72 3b 0a 20 20 20 20   char *ptr;.    
2c0f0 69 6e 74 20 73 69 7a 65 3b 0a 20 20 20 20 69 6e  int size;.    in
2c100 74 20 74 79 70 65 3b 0a 20 20 20 20 69 6e 74 20  t type;.    int 
2c110 65 6e 74 69 74 69 65 73 20 3d 20 30 3b 0a 20 20  entities = 0;.  
2c120 20 20 69 6e 74 20 6e 5f 70 6f 69 6e 74 73 20 3d    int n_points =
2c130 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 6c 69   0;.    int n_li
2c140 6e 65 73 74 72 69 6e 67 73 20 3d 20 30 3b 0a 20  nestrings = 0;. 
2c150 20 20 20 69 6e 74 20 6e 5f 70 6f 6c 79 67 6f 6e     int n_polygon
2c160 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  s = 0;.    int i
2c170 3b 0a 20 20 20 20 69 6e 74 20 69 76 3b 0a 20 20  ;.    int iv;.  
2c180 20 20 69 6e 74 20 69 62 3b 0a 20 20 20 20 64 6f    int ib;.    do
2c190 75 62 6c 65 20 78 3b 0a 20 20 20 20 64 6f 75 62  uble x;.    doub
2c1a0 6c 65 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65  le y;.    double
2c1b0 20 7a 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d   z;.    double m
2c1c0 3b 0a 20 20 20 20 69 6e 74 20 65 6e 64 69 61 6e  ;.    int endian
2c1d0 5f 61 72 63 68 20 3d 20 67 61 69 61 45 6e 64 69  _arch = gaiaEndi
2c1e0 61 6e 41 72 63 68 20 28 29 3b 0a 20 20 20 20 67  anArch ();.    g
2c1f0 61 69 61 50 6f 69 6e 74 50 74 72 20 70 74 3b 0a  aiaPointPtr pt;.
2c200 20 20 20 20 67 61 69 61 4c 69 6e 65 73 74 72 69      gaiaLinestri
2c210 6e 67 50 74 72 20 6c 6e 3b 0a 20 20 20 20 67 61  ngPtr ln;.    ga
2c220 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20 70 67 3b  iaPolygonPtr pg;
2c230 0a 20 20 20 20 67 61 69 61 52 69 6e 67 50 74 72  .    gaiaRingPtr
2c240 20 72 6e 67 3b 0a 20 20 20 20 67 61 69 61 50 6f   rng;.    gaiaPo
2c250 69 6e 74 50 74 72 20 70 6f 69 6e 74 20 3d 20 4e  intPtr point = N
2c260 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61 4c 69 6e  ULL;.    gaiaLin
2c270 65 73 74 72 69 6e 67 50 74 72 20 6c 69 6e 65 20  estringPtr line 
2c280 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61  = NULL;.    gaia
2c290 50 6f 6c 79 67 6f 6e 50 74 72 20 70 6f 6c 79 67  PolygonPtr polyg
2c2a0 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 20 70 72 65   = NULL;../* pre
2c2b0 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 72 65  computing the re
2c2c0 71 75 69 72 65 64 20 73 69 7a 65 20 2a 2f 0a 20  quired size */. 
2c2d0 20 20 20 73 69 7a 65 20 3d 20 35 3b 09 09 09 2f     size = 5;.../
2c2e0 2a 20 53 52 49 44 20 61 6e 64 20 74 65 72 6d 69  * SRID and termi
2c2f0 6e 61 74 69 6e 67 20 27 5c 30 27 20 2a 2f 0a 20  nating '\0' */. 
2c300 20 20 20 70 74 20 3d 20 67 65 6f 6d 2d 3e 46 69     pt = geom->Fi
2c310 72 73 74 50 6f 69 6e 74 3b 0a 20 20 20 20 77 68  rstPoint;.    wh
2c320 69 6c 65 20 28 70 74 29 0a 20 20 20 20 20 20 7b  ile (pt).      {
2c330 0a 09 20 20 70 6f 69 6e 74 20 3d 20 70 74 3b 0a  ..  point = pt;.
2c340 09 20 20 65 6e 74 69 74 69 65 73 2b 2b 3b 0a 09  .  entities++;..
2c350 20 20 6e 5f 70 6f 69 6e 74 73 2b 2b 3b 0a 09 20    n_points++;.. 
2c360 20 70 74 20 3d 20 70 74 2d 3e 4e 65 78 74 3b 0a   pt = pt->Next;.
2c370 20 20 20 20 20 20 7d 0a 20 20 20 20 6c 6e 20 3d        }.    ln =
2c380 20 67 65 6f 6d 2d 3e 46 69 72 73 74 4c 69 6e 65   geom->FirstLine
2c390 73 74 72 69 6e 67 3b 0a 20 20 20 20 77 68 69 6c  string;.    whil
2c3a0 65 20 28 6c 6e 29 0a 20 20 20 20 20 20 7b 0a 09  e (ln).      {..
2c3b0 20 20 6c 69 6e 65 20 3d 20 6c 6e 3b 0a 09 20 20    line = ln;..  
2c3c0 65 6e 74 69 74 69 65 73 2b 2b 3b 0a 09 20 20 6e  entities++;..  n
2c3d0 5f 6c 69 6e 65 73 74 72 69 6e 67 73 2b 2b 3b 0a  _linestrings++;.
2c3e0 09 20 20 6c 6e 20 3d 20 6c 6e 2d 3e 4e 65 78 74  .  ln = ln->Next
2c3f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 67  ;.      }.    pg
2c400 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73 74 50 6f   = geom->FirstPo
2c410 6c 79 67 6f 6e 3b 0a 20 20 20 20 77 68 69 6c 65  lygon;.    while
2c420 20 28 70 67 29 0a 20 20 20 20 20 20 7b 0a 09 20   (pg).      {.. 
2c430 20 70 6f 6c 79 67 20 3d 20 70 67 3b 0a 09 20 20   polyg = pg;..  
2c440 65 6e 74 69 74 69 65 73 2b 2b 3b 0a 09 20 20 6e  entities++;..  n
2c450 5f 70 6f 6c 79 67 6f 6e 73 2b 2b 3b 0a 09 20 20  _polygons++;..  
2c460 70 67 20 3d 20 70 67 2d 3e 4e 65 78 74 3b 0a 20  pg = pg->Next;. 
2c470 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6e       }.    if (n
2c480 5f 70 6f 69 6e 74 73 20 3d 3d 20 30 20 26 26 20  _points == 0 && 
2c490 6e 5f 70 6f 6c 79 67 6f 6e 73 20 3d 3d 20 30 20  n_polygons == 0 
2c4a0 26 26 20 6e 5f 6c 69 6e 65 73 74 72 69 6e 67 73  && n_linestrings
2c4b0 20 3d 3d 20 30 29 0a 09 72 65 74 75 72 6e 3b 0a   == 0)..return;.
2c4c0 2f 2a 20 6f 6b 2c 20 77 65 20 63 61 6e 20 64 65  /* ok, we can de
2c4d0 74 65 72 6d 69 6e 65 20 74 68 65 20 67 65 6f 6d  termine the geom
2c4e0 65 74 72 79 20 63 6c 61 73 73 20 2a 2f 0a 20 20  etry class */.  
2c4f0 20 20 69 66 20 28 6e 5f 70 6f 69 6e 74 73 20 3d    if (n_points =
2c500 3d 20 31 20 26 26 20 6e 5f 6c 69 6e 65 73 74 72  = 1 && n_linestr
2c510 69 6e 67 73 20 3d 3d 20 30 20 26 26 20 6e 5f 70  ings == 0 && n_p
2c520 6f 6c 79 67 6f 6e 73 20 3d 3d 20 30 29 0a 20 20  olygons == 0).  
2c530 20 20 20 20 7b 0a 09 20 20 69 66 20 28 67 65 6f      {..  if (geo
2c540 6d 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65 20  m->DeclaredType 
2c550 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49  == GAIA_MULTIPOI
2c560 4e 54 29 0a 09 20 20 20 20 20 20 74 79 70 65 20  NT)..      type 
2c570 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e  = GAIA_MULTIPOIN
2c580 54 3b 0a 09 20 20 65 6c 73 65 20 69 66 20 28 67  T;..  else if (g
2c590 65 6f 6d 2d 3e 44 65 63 6c 61 72 65 64 54 79 70  eom->DeclaredTyp
2c5a0 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54  e == GAIA_GEOMET
2c5b0 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 29 0a 09 20  RYCOLLECTION).. 
2c5c0 20 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41       type = GAIA
2c5d0 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
2c5e0 49 4f 4e 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20  ION;..  else..  
2c5f0 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f      type = GAIA_
2c600 50 4f 49 4e 54 3b 0a 20 20 20 20 20 20 7d 0a 20  POINT;.      }. 
2c610 20 20 20 65 6c 73 65 20 69 66 20 28 6e 5f 70 6f     else if (n_po
2c620 69 6e 74 73 20 3e 20 31 20 26 26 20 6e 5f 6c 69  ints > 1 && n_li
2c630 6e 65 73 74 72 69 6e 67 73 20 3d 3d 20 30 20 26  nestrings == 0 &
2c640 26 20 6e 5f 70 6f 6c 79 67 6f 6e 73 20 3d 3d 20  & n_polygons == 
2c650 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66  0).      {..  if
2c660 20 28 67 65 6f 6d 2d 3e 44 65 63 6c 61 72 65 64   (geom->Declared
2c670 54 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f  Type == GAIA_GEO
2c680 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 29  METRYCOLLECTION)
2c690 0a 09 20 20 20 20 20 20 74 79 70 65 20 3d 20 47  ..      type = G
2c6a0 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
2c6b0 45 43 54 49 4f 4e 3b 0a 09 20 20 65 6c 73 65 0a  ECTION;..  else.
2c6c0 09 20 20 20 20 20 20 74 79 70 65 20 3d 20 47 41  .      type = GA
2c6d0 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 3b 0a 20  IA_MULTIPOINT;. 
2c6e0 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20       }.    else 
2c6f0 69 66 20 28 6e 5f 70 6f 69 6e 74 73 20 3d 3d 20  if (n_points == 
2c700 30 20 26 26 20 6e 5f 6c 69 6e 65 73 74 72 69 6e  0 && n_linestrin
2c710 67 73 20 3d 3d 20 31 20 26 26 20 6e 5f 70 6f 6c  gs == 1 && n_pol
2c720 79 67 6f 6e 73 20 3d 3d 20 30 29 0a 20 20 20 20  ygons == 0).    
2c730 20 20 7b 0a 09 20 20 69 66 20 28 67 65 6f 6d 2d    {..  if (geom-
2c740 3e 44 65 63 6c 61 72 65 64 54 79 70 65 20 3d 3d  >DeclaredType ==
2c750 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53   GAIA_MULTILINES
2c760 54 52 49 4e 47 29 0a 09 20 20 20 20 20 20 74 79  TRING)..      ty
2c770 70 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c  pe = GAIA_MULTIL
2c780 49 4e 45 53 54 52 49 4e 47 3b 0a 09 20 20 65 6c  INESTRING;..  el
2c790 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 65 63  se if (geom->Dec
2c7a0 6c 61 72 65 64 54 79 70 65 20 3d 3d 20 47 41 49  laredType == GAI
2c7b0 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
2c7c0 54 49 4f 4e 29 0a 09 20 20 20 20 20 20 74 79 70  TION)..      typ
2c7d0 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52  e = GAIA_GEOMETR
2c7e0 59 43 4f 4c 4c 45 43 54 49 4f 4e 3b 0a 09 20 20  YCOLLECTION;..  
2c7f0 65 6c 73 65 0a 09 20 20 20 20 20 20 74 79 70 65  else..      type
2c800 20 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49   = GAIA_LINESTRI
2c810 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NG;.      }.    
2c820 65 6c 73 65 20 69 66 20 28 6e 5f 70 6f 69 6e 74  else if (n_point
2c830 73 20 3d 3d 20 30 20 26 26 20 6e 5f 6c 69 6e 65  s == 0 && n_line
2c840 73 74 72 69 6e 67 73 20 3e 20 31 20 26 26 20 6e  strings > 1 && n
2c850 5f 70 6f 6c 79 67 6f 6e 73 20 3d 3d 20 30 29 0a  _polygons == 0).
2c860 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 67        {..  if (g
2c870 65 6f 6d 2d 3e 44 65 63 6c 61 72 65 64 54 79 70  eom->DeclaredTyp
2c880 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54  e == GAIA_GEOMET
2c890 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 29 0a 09 20  RYCOLLECTION).. 
2c8a0 20 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41       type = GAIA
2c8b0 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
2c8c0 49 4f 4e 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20  ION;..  else..  
2c8d0 20 20 20 20 74 79 70 65 20 3d 20 47 41 49 41 5f      type = GAIA_
2c8e0 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 3b  MULTILINESTRING;
2c8f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  .      }.    els
2c900 65 20 69 66 20 28 6e 5f 70 6f 69 6e 74 73 20 3d  e if (n_points =
2c910 3d 20 30 20 26 26 20 6e 5f 6c 69 6e 65 73 74 72  = 0 && n_linestr
2c920 69 6e 67 73 20 3d 3d 20 30 20 26 26 20 6e 5f 70  ings == 0 && n_p
2c930 6f 6c 79 67 6f 6e 73 20 3d 3d 20 31 29 0a 20 20  olygons == 1).  
2c940 20 20 20 20 7b 0a 09 20 20 69 66 20 28 67 65 6f      {..  if (geo
2c950 6d 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65 20  m->DeclaredType 
2c960 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c  == GAIA_MULTIPOL
2c970 59 47 4f 4e 29 0a 09 20 20 20 20 20 20 74 79 70  YGON)..      typ
2c980 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  e = GAIA_MULTIPO
2c990 4c 59 47 4f 4e 3b 0a 09 20 20 65 6c 73 65 20 69  LYGON;..  else i
2c9a0 66 20 28 67 65 6f 6d 2d 3e 44 65 63 6c 61 72 65  f (geom->Declare
2c9b0 64 54 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45  dType == GAIA_GE
2c9c0 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e  OMETRYCOLLECTION
2c9d0 29 0a 09 20 20 20 20 20 20 74 79 70 65 20 3d 20  )..      type = 
2c9e0 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
2c9f0 4c 45 43 54 49 4f 4e 3b 0a 09 20 20 65 6c 73 65  LECTION;..  else
2ca00 0a 09 20 20 20 20 20 20 74 79 70 65 20 3d 20 47  ..      type = G
2ca10 41 49 41 5f 50 4f 4c 59 47 4f 4e 3b 0a 20 20 20  AIA_POLYGON;.   
2ca20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
2ca30 20 28 6e 5f 70 6f 69 6e 74 73 20 3d 3d 20 30 20   (n_points == 0 
2ca40 26 26 20 6e 5f 6c 69 6e 65 73 74 72 69 6e 67 73  && n_linestrings
2ca50 20 3d 3d 20 30 20 26 26 20 6e 5f 70 6f 6c 79 67   == 0 && n_polyg
2ca60 6f 6e 73 20 3e 20 31 29 0a 20 20 20 20 20 20 7b  ons > 1).      {
2ca70 0a 09 20 20 69 66 20 28 67 65 6f 6d 2d 3e 44 65  ..  if (geom->De
2ca80 63 6c 61 72 65 64 54 79 70 65 20 3d 3d 20 47 41  claredType == GA
2ca90 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45  IA_GEOMETRYCOLLE
2caa0 43 54 49 4f 4e 29 0a 09 20 20 20 20 20 20 74 79  CTION)..      ty
2cab0 70 65 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54  pe = GAIA_GEOMET
2cac0 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 3b 0a 09 20  RYCOLLECTION;.. 
2cad0 20 65 6c 73 65 0a 09 20 20 20 20 20 20 74 79 70   else..      typ
2cae0 65 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  e = GAIA_MULTIPO
2caf0 4c 59 47 4f 4e 3b 0a 20 20 20 20 20 20 7d 0a 20  LYGON;.      }. 
2cb00 20 20 20 65 6c 73 65 0a 09 74 79 70 65 20 3d 20     else..type = 
2cb10 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
2cb20 4c 45 43 54 49 4f 4e 3b 0a 2f 2a 20 61 6e 64 20  LECTION;./* and 
2cb30 6e 6f 77 20 77 65 20 63 6f 6d 70 75 74 65 20 74  now we compute t
2cb40 68 65 20 73 69 7a 65 20 6f 66 20 45 57 4b 42 20  he size of EWKB 
2cb50 2a 2f 0a 20 20 20 20 73 69 7a 65 20 2b 3d 20 31  */.    size += 1
2cb60 30 3b 09 09 09 2f 2a 20 68 65 61 64 65 72 20 73  0;.../* header s
2cb70 69 7a 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 74  ize */.    if (t
2cb80 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54  ype == GAIA_MULT
2cb90 49 50 4f 49 4e 54 20 7c 7c 20 74 79 70 65 20 3d  IPOINT || type =
2cba0 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45  = GAIA_MULTILINE
2cbb0 53 54 52 49 4e 47 0a 09 7c 7c 20 74 79 70 65 20  STRING..|| type 
2cbc0 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c  == GAIA_MULTIPOL
2cbd0 59 47 4f 4e 20 7c 7c 20 74 79 70 65 20 3d 3d 20  YGON || type == 
2cbe0 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
2cbf0 4c 45 43 54 49 4f 4e 29 0a 09 73 69 7a 65 20 2b  LECTION)..size +
2cc00 3d 20 38 3b 0a 20 20 20 20 70 6f 69 6e 74 20 3d  = 8;.    point =
2cc10 20 67 65 6f 6d 2d 3e 46 69 72 73 74 50 6f 69 6e   geom->FirstPoin
2cc20 74 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 70 6f  t;.    while (po
2cc30 69 6e 74 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  int).      {..  
2cc40 69 66 20 28 74 79 70 65 20 3d 3d 20 47 41 49 41  if (type == GAIA
2cc50 5f 4d 55 4c 54 49 50 4f 49 4e 54 20 7c 7c 20 74  _MULTIPOINT || t
2cc60 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54  ype == GAIA_MULT
2cc70 49 4c 49 4e 45 53 54 52 49 4e 47 0a 09 20 20 20  ILINESTRING..   
2cc80 20 20 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41     || type == GA
2cc90 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 20  IA_MULTIPOLYGON 
2cca0 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f  || type == GAIA_
2ccb0 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49  GEOMETRYCOLLECTI
2ccc0 4f 4e 29 0a 09 20 20 20 20 20 20 73 69 7a 65 20  ON)..      size 
2ccd0 2b 3d 20 31 30 3b 0a 09 20 20 69 66 20 28 67 65  += 10;..  if (ge
2cce0 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  om->DimensionMod
2ccf0 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 0a  el == GAIA_XY_Z.
2cd00 09 20 20 20 20 20 20 7c 7c 20 67 65 6f 6d 2d 3e  .      || geom->
2cd10 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
2cd20 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 20 20  = GAIA_XY_M)..  
2cd30 20 20 20 20 73 69 7a 65 20 2b 3d 20 34 38 3b 09      size += 48;.
2cd40 2f 2a 20 74 68 72 65 65 20 64 6f 75 62 6c 65 73  /* three doubles
2cd50 20 66 6f 72 20 65 61 63 68 20 50 4f 49 4e 54 20   for each POINT 
2cd60 2a 2f 0a 09 20 20 65 6c 73 65 20 69 66 20 28 67  */..  else if (g
2cd70 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  eom->DimensionMo
2cd80 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a  del == GAIA_XY_Z
2cd90 5f 4d 29 0a 09 20 20 20 20 20 20 73 69 7a 65 20  _M)..      size 
2cda0 2b 3d 20 36 34 3b 09 2f 2a 20 66 6f 75 72 20 64  += 64;./* four d
2cdb0 6f 75 62 6c 65 73 20 66 6f 72 20 65 61 63 68 20  oubles for each 
2cdc0 50 4f 49 4e 54 20 2a 2f 0a 09 20 20 65 6c 73 65  POINT */..  else
2cdd0 0a 09 20 20 20 20 20 20 73 69 7a 65 20 2b 3d 20  ..      size += 
2cde0 33 32 3b 09 2f 2a 20 74 77 6f 20 64 6f 75 62 6c  32;./* two doubl
2cdf0 65 73 20 66 6f 72 20 65 61 63 68 20 50 4f 49 4e  es for each POIN
2ce00 54 20 2a 2f 0a 09 20 20 70 6f 69 6e 74 20 3d 20  T */..  point = 
2ce10 70 6f 69 6e 74 2d 3e 4e 65 78 74 3b 0a 20 20 20  point->Next;.   
2ce20 20 20 20 7d 0a 20 20 20 20 6c 69 6e 65 20 3d 20     }.    line = 
2ce30 67 65 6f 6d 2d 3e 46 69 72 73 74 4c 69 6e 65 73  geom->FirstLines
2ce40 74 72 69 6e 67 3b 0a 20 20 20 20 77 68 69 6c 65  tring;.    while
2ce50 20 28 6c 69 6e 65 29 0a 20 20 20 20 20 20 7b 0a   (line).      {.
2ce60 09 20 20 69 66 20 28 74 79 70 65 20 3d 3d 20 47  .  if (type == G
2ce70 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 20 7c  AIA_MULTIPOINT |
2ce80 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d  | type == GAIA_M
2ce90 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 0a 09  ULTILINESTRING..
2cea0 20 20 20 20 20 20 7c 7c 20 74 79 70 65 20 3d 3d        || type ==
2ceb0 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47   GAIA_MULTIPOLYG
2cec0 4f 4e 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41  ON || type == GA
2ced0 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45  IA_GEOMETRYCOLLE
2cee0 43 54 49 4f 4e 29 0a 09 20 20 20 20 20 20 73 69  CTION)..      si
2cef0 7a 65 20 2b 3d 20 31 30 3b 0a 09 20 20 69 66 20  ze += 10;..  if 
2cf00 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
2cf10 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
2cf20 5f 5a 0a 09 20 20 20 20 20 20 7c 7c 20 67 65 6f  _Z..      || geo
2cf30 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
2cf40 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a  l == GAIA_XY_M).
2cf50 09 20 20 20 20 20 20 73 69 7a 65 20 2b 3d 20 38  .      size += 8
2cf60 20 2b 20 28 6c 69 6e 65 2d 3e 50 6f 69 6e 74 73   + (line->Points
2cf70 20 2a 20 34 38 29 3b 09 2f 2a 20 74 68 72 65 65   * 48);./* three
2cf80 20 64 6f 75 62 6c 65 73 20 66 6f 72 20 65 61 63   doubles for eac
2cf90 68 20 56 45 52 54 45 58 20 2a 2f 0a 09 20 20 65  h VERTEX */..  e
2cfa0 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69  lse if (geom->Di
2cfb0 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
2cfc0 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 20 20  GAIA_XY_Z_M)..  
2cfd0 20 20 20 20 73 69 7a 65 20 2b 3d 20 38 20 2b 20      size += 8 + 
2cfe0 28 6c 69 6e 65 2d 3e 50 6f 69 6e 74 73 20 2a 20  (line->Points * 
2cff0 36 34 29 3b 09 2f 2a 20 66 6f 75 72 20 64 6f 75  64);./* four dou
2d000 62 6c 65 73 20 66 6f 72 20 65 61 63 68 20 56 45  bles for each VE
2d010 52 54 45 58 20 2a 2f 0a 09 20 20 65 6c 73 65 0a  RTEX */..  else.
2d020 09 20 20 20 20 20 20 73 69 7a 65 20 2b 3d 20 38  .      size += 8
2d030 20 2b 20 28 6c 69 6e 65 2d 3e 50 6f 69 6e 74 73   + (line->Points
2d040 20 2a 20 33 32 29 3b 09 2f 2a 20 74 77 6f 20 64   * 32);./* two d
2d050 6f 75 62 6c 65 73 20 66 6f 72 20 65 61 63 68 20  oubles for each 
2d060 56 45 52 54 45 58 20 2a 2f 0a 09 20 20 6c 69 6e  VERTEX */..  lin
2d070 65 20 3d 20 6c 69 6e 65 2d 3e 4e 65 78 74 3b 0a  e = line->Next;.
2d080 20 20 20 20 20 20 7d 0a 20 20 20 20 70 6f 6c 79        }.    poly
2d090 67 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73 74 50  g = geom->FirstP
2d0a0 6f 6c 79 67 6f 6e 3b 0a 20 20 20 20 77 68 69 6c  olygon;.    whil
2d0b0 65 20 28 70 6f 6c 79 67 29 0a 20 20 20 20 20 20  e (polyg).      
2d0c0 7b 0a 09 20 20 69 66 20 28 74 79 70 65 20 3d 3d  {..  if (type ==
2d0d0 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54   GAIA_MULTIPOINT
2d0e0 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41   || type == GAIA
2d0f0 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47  _MULTILINESTRING
2d100 0a 09 20 20 20 20 20 20 7c 7c 20 74 79 70 65 20  ..      || type 
2d110 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 4c  == GAIA_MULTIPOL
2d120 59 47 4f 4e 20 7c 7c 20 74 79 70 65 20 3d 3d 20  YGON || type == 
2d130 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c  GAIA_GEOMETRYCOL
2d140 4c 45 43 54 49 4f 4e 29 0a 09 20 20 20 20 20 20  LECTION)..      
2d150 73 69 7a 65 20 2b 3d 20 31 30 3b 0a 09 20 20 72  size += 10;..  r
2d160 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e 45 78 74 65  ng = polyg->Exte
2d170 72 69 6f 72 3b 0a 09 20 20 69 66 20 28 67 65 6f  rior;..  if (geo
2d180 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
2d190 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 0a 09  l == GAIA_XY_Z..
2d1a0 20 20 20 20 20 20 7c 7c 20 67 65 6f 6d 2d 3e 44        || geom->D
2d1b0 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d  imensionModel ==
2d1c0 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 20 20 20   GAIA_XY_M)..   
2d1d0 20 20 20 73 69 7a 65 20 2b 3d 20 31 36 20 2b 20     size += 16 + 
2d1e0 28 72 6e 67 2d 3e 50 6f 69 6e 74 73 20 2a 20 34  (rng->Points * 4
2d1f0 38 29 3b 09 2f 2a 20 74 68 72 65 65 20 64 6f 75  8);./* three dou
2d200 62 6c 65 73 20 66 6f 72 20 65 61 63 68 20 56 45  bles for each VE
2d210 52 54 45 58 20 2a 2f 0a 09 20 20 65 6c 73 65 20  RTEX */..  else 
2d220 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
2d230 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
2d240 5f 58 59 5f 5a 5f 4d 29 0a 09 20 20 20 20 20 20  _XY_Z_M)..      
2d250 73 69 7a 65 20 2b 3d 20 31 36 20 2b 20 28 72 6e  size += 16 + (rn
2d260 67 2d 3e 50 6f 69 6e 74 73 20 2a 20 36 34 29 3b  g->Points * 64);
2d270 09 2f 2a 20 66 6f 75 72 20 64 6f 75 62 6c 65 73  ./* four doubles
2d280 20 66 6f 72 20 65 61 63 68 20 56 45 52 54 45 58   for each VERTEX
2d290 20 2a 2f 0a 09 20 20 65 6c 73 65 0a 09 20 20 20   */..  else..   
2d2a0 20 20 20 73 69 7a 65 20 2b 3d 20 31 36 20 2b 20     size += 16 + 
2d2b0 28 72 6e 67 2d 3e 50 6f 69 6e 74 73 20 2a 20 33  (rng->Points * 3
2d2c0 32 29 3b 09 2f 2a 20 74 77 6f 20 64 6f 75 62 6c  2);./* two doubl
2d2d0 65 73 20 66 6f 72 20 65 61 63 68 20 56 45 52 54  es for each VERT
2d2e0 45 58 20 2a 2f 0a 09 20 20 66 6f 72 20 28 69 62  EX */..  for (ib
2d2f0 20 3d 20 30 3b 20 69 62 20 3c 20 70 6f 6c 79 67   = 0; ib < polyg
2d300 2d 3e 4e 75 6d 49 6e 74 65 72 69 6f 72 73 3b 20  ->NumInteriors; 
2d310 69 62 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09 72  ib++)..    {...r
2d320 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e 49 6e 74 65  ng = polyg->Inte
2d330 72 69 6f 72 73 20 2b 20 69 62 3b 0a 09 09 69 66  riors + ib;...if
2d340 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f   (geom->Dimensio
2d350 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
2d360 59 5f 5a 0a 09 09 20 20 20 20 7c 7c 20 67 65 6f  Y_Z...    || geo
2d370 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
2d380 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a  l == GAIA_XY_M).
2d390 09 09 20 20 20 20 73 69 7a 65 20 2b 3d 20 38 20  ..    size += 8 
2d3a0 2b 20 28 72 6e 67 2d 3e 50 6f 69 6e 74 73 20 2a  + (rng->Points *
2d3b0 20 34 38 29 3b 09 2f 2a 20 74 68 72 65 65 20 64   48);./* three d
2d3c0 6f 75 62 6c 65 73 20 66 6f 72 20 65 61 63 68 20  oubles for each 
2d3d0 56 45 52 54 45 58 20 2a 2f 0a 09 09 65 6c 73 65  VERTEX */...else
2d3e0 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e   if (geom->Dimen
2d3f0 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
2d400 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20 20  A_XY_Z_M)...    
2d410 73 69 7a 65 20 2b 3d 20 38 20 2b 20 28 72 6e 67  size += 8 + (rng
2d420 2d 3e 50 6f 69 6e 74 73 20 2a 20 36 34 29 3b 09  ->Points * 64);.
2d430 2f 2a 20 66 6f 75 72 20 64 6f 75 62 6c 65 73 20  /* four doubles 
2d440 66 6f 72 20 65 61 63 68 20 56 45 52 54 45 58 20  for each VERTEX 
2d450 2a 2f 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20  */...else...    
2d460 73 69 7a 65 20 2b 3d 20 38 20 2b 20 28 72 6e 67  size += 8 + (rng
2d470 2d 3e 50 6f 69 6e 74 73 20 2a 20 33 32 29 3b 09  ->Points * 32);.
2d480 2f 2a 20 74 77 6f 20 64 6f 75 62 6c 65 73 20 66  /* two doubles f
2d490 6f 72 20 65 61 63 68 20 56 45 52 54 45 58 20 2a  or each VERTEX *
2d4a0 2f 0a 09 20 20 20 20 7d 0a 09 20 20 70 6f 6c 79  /..    }..  poly
2d4b0 67 20 3d 20 70 6f 6c 79 67 2d 3e 4e 65 78 74 3b  g = polyg->Next;
2d4c0 0a 20 20 20 20 20 20 7d 0a 2f 2a 20 61 6e 64 20  .      }./* and 
2d4d0 66 69 6e 61 6c 6c 79 20 77 65 20 62 75 69 6c 64  finally we build
2d4e0 20 74 68 65 20 45 57 4b 42 20 65 78 70 72 65 73   the EWKB expres
2d4f0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 74 72 20  sion */.    ptr 
2d500 3d 20 62 75 66 3b 0a 20 20 20 20 2a 70 74 72 2b  = buf;.    *ptr+
2d510 2b 20 3d 20 27 30 27 3b 09 09 2f 2a 20 6c 69 74  + = '0';../* lit
2d520 74 6c 65 20 65 6e 64 69 61 6e 20 62 79 74 65 20  tle endian byte 
2d530 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 2a 70 74  order */.    *pt
2d540 72 2b 2b 20 3d 20 27 31 27 3b 0a 20 20 20 20 67  r++ = '1';.    g
2d550 61 69 61 45 78 70 6f 72 74 33 32 20 28 65 6e 64  aiaExport32 (end
2d560 69 61 6e 5f 62 75 66 2c 20 74 79 70 65 2c 20 31  ian_buf, type, 1
2d570 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
2d580 2f 2a 20 74 68 65 20 6d 61 69 6e 20 43 4c 41 53  /* the main CLAS
2d590 53 20 54 59 50 45 20 2a 2f 0a 20 20 20 20 66 6f  S TYPE */.    fo
2d5a0 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 33 3b  r (i = 0; i < 3;
2d5b0 20 69 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20   i++).      {.. 
2d5c0 20 2f 2a 20 43 41 56 45 41 54 3a 20 74 68 65 20   /* CAVEAT: the 
2d5d0 34 74 68 20 62 79 74 65 20 69 6e 20 50 6f 73 74  4th byte in Post
2d5e0 47 49 53 20 65 6e 63 6f 64 65 73 20 4d 2f 5a 20  GIS encodes M/Z 
2d5f0 70 72 65 73 65 6e 63 65 20 21 21 21 21 20 2a 2f  presence !!!! */
2d600 0a 09 20 20 73 70 72 69 6e 74 66 20 28 62 79 74  ..  sprintf (byt
2d610 65 2c 20 22 25 30 32 58 22 2c 20 65 6e 64 69 61  e, "%02X", endia
2d620 6e 5f 62 75 66 5b 69 5d 29 3b 0a 09 20 20 2a 70  n_buf[i]);..  *p
2d630 74 72 2b 2b 20 3d 20 62 79 74 65 5b 30 5d 3b 0a  tr++ = byte[0];.
2d640 09 20 20 2a 70 74 72 2b 2b 20 3d 20 62 79 74 65  .  *ptr++ = byte
2d650 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a 20  [1];.      }./* 
2d660 6d 61 72 6b 69 6e 67 20 64 69 6d 65 6e 73 69 6f  marking dimensio
2d670 6e 73 20 61 6e 64 20 4d 2f 5a 20 70 72 65 73 65  ns and M/Z prese
2d680 6e 63 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 67  nce */.    if (g
2d690 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  eom->DimensionMo
2d6a0 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a  del == GAIA_XY_Z
2d6b0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a 70 74  ).      {..  *pt
2d6c0 72 2b 2b 20 3d 20 27 41 27 3b 0a 09 20 20 2a 70  r++ = 'A';..  *p
2d6d0 74 72 2b 2b 20 3d 20 27 30 27 3b 0a 20 20 20 20  tr++ = '0';.    
2d6e0 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20    }.    else if 
2d6f0 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
2d700 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
2d710 5f 4d 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a  _M).      {..  *
2d720 70 74 72 2b 2b 20 3d 20 27 36 27 3b 0a 09 20 20  ptr++ = '6';..  
2d730 2a 70 74 72 2b 2b 20 3d 20 27 30 27 3b 0a 20 20  *ptr++ = '0';.  
2d740 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
2d750 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69  f (geom->Dimensi
2d760 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
2d770 58 59 5f 5a 5f 4d 29 0a 20 20 20 20 20 20 7b 0a  XY_Z_M).      {.
2d780 09 20 20 2a 70 74 72 2b 2b 20 3d 20 27 45 27 3b  .  *ptr++ = 'E';
2d790 0a 09 20 20 2a 70 74 72 2b 2b 20 3d 20 27 30 27  ..  *ptr++ = '0'
2d7a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
2d7b0 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a 70  se.      {..  *p
2d7c0 74 72 2b 2b 20 3d 20 27 32 27 3b 0a 09 20 20 2a  tr++ = '2';..  *
2d7d0 70 74 72 2b 2b 20 3d 20 27 30 27 3b 0a 20 20 20  ptr++ = '0';.   
2d7e0 20 20 20 7d 0a 20 20 20 20 67 61 69 61 45 78 70     }.    gaiaExp
2d7f0 6f 72 74 33 32 20 28 65 6e 64 69 61 6e 5f 62 75  ort32 (endian_bu
2d800 66 2c 20 67 65 6f 6d 2d 3e 53 72 69 64 2c 20 31  f, geom->Srid, 1
2d810 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  , endian_arch);.
2d820 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20      for (i = 0; 
2d830 69 20 3c 20 34 3b 20 69 2b 2b 29 0a 20 20 20 20  i < 4; i++).    
2d840 20 20 7b 0a 09 20 20 73 70 72 69 6e 74 66 20 28    {..  sprintf (
2d850 62 79 74 65 2c 20 22 25 30 32 58 22 2c 20 65 6e  byte, "%02X", en
2d860 64 69 61 6e 5f 62 75 66 5b 69 5d 29 3b 0a 09 20  dian_buf[i]);.. 
2d870 20 2a 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b 30   *ptr++ = byte[0
2d880 5d 3b 0a 09 20 20 2a 70 74 72 2b 2b 20 3d 20 62  ];..  *ptr++ = b
2d890 79 74 65 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a  yte[1];.      }.
2d8a0 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 27 5c 30      *ptr++ = '\0
2d8b0 27 3b 0a 20 20 20 20 67 61 69 61 41 70 70 65 6e  ';.    gaiaAppen
2d8c0 64 54 6f 4f 75 74 42 75 66 66 65 72 20 28 6f 75  dToOutBuffer (ou
2d8d0 74 5f 62 75 66 2c 20 62 75 66 29 3b 0a 20 20 20  t_buf, buf);.   
2d8e0 20 70 74 72 20 3d 20 62 75 66 3b 0a 20 20 20 20   ptr = buf;.    
2d8f0 69 66 20 28 74 79 70 65 20 3d 3d 20 47 41 49 41  if (type == GAIA
2d900 5f 4d 55 4c 54 49 50 4f 49 4e 54 20 7c 7c 20 74  _MULTIPOINT || t
2d910 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54  ype == GAIA_MULT
2d920 49 4c 49 4e 45 53 54 52 49 4e 47 0a 09 7c 7c 20  ILINESTRING..|| 
2d930 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c  type == GAIA_MUL
2d940 54 49 50 4f 4c 59 47 4f 4e 20 7c 7c 20 74 79 70  TIPOLYGON || typ
2d950 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54  e == GAIA_GEOMET
2d960 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 29 0a 20 20  RYCOLLECTION).  
2d970 20 20 20 20 7b 0a 09 20 20 67 61 69 61 45 78 70      {..  gaiaExp
2d980 6f 72 74 33 32 20 28 65 6e 64 69 61 6e 5f 62 75  ort32 (endian_bu
2d990 66 2c 20 65 6e 74 69 74 69 65 73 2c 20 31 2c 20  f, entities, 1, 
2d9a0 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a  endian_arch);./*
2d9b0 20 69 74 27 73 20 61 20 63 6f 6c 6c 65 63 74 69   it's a collecti
2d9c0 6f 6e 3b 20 23 20 65 6e 74 69 74 69 65 73 20 2a  on; # entities *
2d9d0 2f 0a 09 20 20 66 6f 72 20 28 69 20 3d 20 30 3b  /..  for (i = 0;
2d9e0 20 69 20 3c 20 34 3b 20 69 2b 2b 29 0a 09 20 20   i < 4; i++)..  
2d9f0 20 20 7b 0a 09 09 73 70 72 69 6e 74 66 20 28 62    {...sprintf (b
2da00 79 74 65 2c 20 22 25 30 32 58 22 2c 20 65 6e 64  yte, "%02X", end
2da10 69 61 6e 5f 62 75 66 5b 69 5d 29 3b 0a 09 09 2a  ian_buf[i]);...*
2da20 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b 30 5d 3b  ptr++ = byte[0];
2da30 0a 09 09 2a 70 74 72 2b 2b 20 3d 20 62 79 74 65  ...*ptr++ = byte
2da40 5b 31 5d 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20  [1];..    }.    
2da50 20 20 7d 0a 20 20 20 20 70 6f 69 6e 74 20 3d 20    }.    point = 
2da60 67 65 6f 6d 2d 3e 46 69 72 73 74 50 6f 69 6e 74  geom->FirstPoint
2da70 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 70 6f 69  ;.    while (poi
2da80 6e 74 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  nt).      {..  i
2da90 66 20 28 28 70 74 72 20 2d 20 62 75 66 29 20 3e  f ((ptr - buf) >
2daa0 20 31 30 32 34 29 0a 09 20 20 20 20 7b 0a 09 09   1024)..    {...
2dab0 2f 2a 20 66 6c 75 73 68 69 6e 67 20 74 68 65 20  /* flushing the 
2dac0 69 6e 74 65 72 6e 61 6c 20 62 75 66 66 65 72 20  internal buffer 
2dad0 2a 2f 0a 09 09 2a 70 74 72 2b 2b 20 3d 20 27 5c  */...*ptr++ = '\
2dae0 30 27 3b 0a 09 09 67 61 69 61 41 70 70 65 6e 64  0';...gaiaAppend
2daf0 54 6f 4f 75 74 42 75 66 66 65 72 20 28 6f 75 74  ToOutBuffer (out
2db00 5f 62 75 66 2c 20 62 75 66 29 3b 0a 09 09 70 74  _buf, buf);...pt
2db10 72 20 3d 20 62 75 66 3b 0a 09 20 20 20 20 7d 0a  r = buf;..    }.
2db20 09 20 20 69 66 20 28 74 79 70 65 20 3d 3d 20 47  .  if (type == G
2db30 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 20 7c  AIA_MULTIPOINT |
2db40 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41 5f 47  | type == GAIA_G
2db50 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f  EOMETRYCOLLECTIO
2db60 4e 29 0a 09 20 20 20 20 7b 0a 09 09 2a 70 74 72  N)..    {...*ptr
2db70 2b 2b 20 3d 20 27 30 27 3b 0a 09 09 2a 70 74 72  ++ = '0';...*ptr
2db80 2b 2b 20 3d 20 27 31 27 3b 0a 09 09 2f 2a 20 69  ++ = '1';.../* i
2db90 74 27 73 20 61 20 63 6f 6c 6c 65 63 74 69 6f 6e  t's a collection
2dba0 3a 20 74 68 65 20 43 4c 41 53 53 20 54 59 50 45  : the CLASS TYPE
2dbb0 20 66 6f 72 20 74 68 69 73 20 65 6c 65 6d 65 6e   for this elemen
2dbc0 74 20 2a 2f 0a 09 09 67 61 69 61 45 78 70 6f 72  t */...gaiaExpor
2dbd0 74 33 32 20 28 65 6e 64 69 61 6e 5f 62 75 66 2c  t32 (endian_buf,
2dbe0 20 47 41 49 41 5f 50 4f 49 4e 54 2c 20 31 2c 20   GAIA_POINT, 1, 
2dbf0 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09  endian_arch);...
2dc00 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20  for (i = 0; i < 
2dc10 33 3b 20 69 2b 2b 29 0a 09 09 20 20 7b 0a 09 09  3; i++)...  {...
2dc20 20 20 20 20 20 20 2f 2a 20 43 41 56 45 41 54 3a        /* CAVEAT:
2dc30 20 74 68 65 20 34 74 68 20 62 79 74 65 20 69 6e   the 4th byte in
2dc40 20 50 6f 73 74 47 49 53 20 65 6e 63 6f 64 65 73   PostGIS encodes
2dc50 20 4d 2f 5a 20 70 72 65 73 65 6e 63 65 20 21 21   M/Z presence !!
2dc60 21 21 20 2a 2f 0a 09 09 20 20 20 20 20 20 73 70  !! */...      sp
2dc70 72 69 6e 74 66 20 28 62 79 74 65 2c 20 22 25 30  rintf (byte, "%0
2dc80 32 58 22 2c 20 65 6e 64 69 61 6e 5f 62 75 66 5b  2X", endian_buf[
2dc90 69 5d 29 3b 0a 09 09 20 20 20 20 20 20 2a 70 74  i]);...      *pt
2dca0 72 2b 2b 20 3d 20 62 79 74 65 5b 30 5d 3b 0a 09  r++ = byte[0];..
2dcb0 09 20 20 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20  .      *ptr++ = 
2dcc0 62 79 74 65 5b 31 5d 3b 0a 09 09 20 20 7d 0a 09  byte[1];...  }..
2dcd0 09 2f 2a 20 6d 61 72 6b 69 6e 67 20 4d 2f 5a 20  ./* marking M/Z 
2dce0 70 72 65 73 65 6e 63 65 20 2a 2f 0a 09 09 69 66  presence */...if
2dcf0 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f   (geom->Dimensio
2dd00 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
2dd10 59 5f 5a 29 0a 09 09 20 20 20 20 2a 70 74 72 2b  Y_Z)...    *ptr+
2dd20 2b 20 3d 20 27 38 27 3b 0a 09 09 65 6c 73 65 20  + = '8';...else 
2dd30 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
2dd40 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
2dd50 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20 2a 70 74  _XY_M)...    *pt
2dd60 72 2b 2b 20 3d 20 27 34 27 3b 0a 09 09 65 6c 73  r++ = '4';...els
2dd70 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  e if (geom->Dime
2dd80 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
2dd90 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 20  IA_XY_Z_M)...   
2dda0 20 2a 70 74 72 2b 2b 20 3d 20 27 43 27 3b 0a 09   *ptr++ = 'C';..
2ddb0 09 65 6c 73 65 0a 09 09 20 20 20 20 2a 70 74 72  .else...    *ptr
2ddc0 2b 2b 20 3d 20 27 30 27 3b 0a 09 09 2a 70 74 72  ++ = '0';...*ptr
2ddd0 2b 2b 20 3d 20 27 30 27 3b 0a 09 20 20 20 20 7d  ++ = '0';..    }
2dde0 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 36 34  ..  gaiaExport64
2ddf0 20 28 65 6e 64 69 61 6e 5f 62 75 66 2c 20 70 6f   (endian_buf, po
2de00 69 6e 74 2d 3e 58 2c 20 31 2c 20 65 6e 64 69 61  int->X, 1, endia
2de10 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 58 20 2a 2f  n_arch);./* X */
2de20 0a 09 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20  ..  for (i = 0; 
2de30 69 20 3c 20 38 3b 20 69 2b 2b 29 0a 09 20 20 20  i < 8; i++)..   
2de40 20 7b 0a 09 09 73 70 72 69 6e 74 66 20 28 62 79   {...sprintf (by
2de50 74 65 2c 20 22 25 30 32 58 22 2c 20 65 6e 64 69  te, "%02X", endi
2de60 61 6e 5f 62 75 66 5b 69 5d 29 3b 0a 09 09 2a 70  an_buf[i]);...*p
2de70 74 72 2b 2b 20 3d 20 62 79 74 65 5b 30 5d 3b 0a  tr++ = byte[0];.
2de80 09 09 2a 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b  ..*ptr++ = byte[
2de90 31 5d 3b 0a 09 20 20 20 20 7d 0a 09 20 20 67 61  1];..    }..  ga
2dea0 69 61 45 78 70 6f 72 74 36 34 20 28 65 6e 64 69  iaExport64 (endi
2deb0 61 6e 5f 62 75 66 2c 20 70 6f 69 6e 74 2d 3e 59  an_buf, point->Y
2dec0 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
2ded0 29 3b 09 2f 2a 20 59 20 2a 2f 0a 09 20 20 66 6f  );./* Y */..  fo
2dee0 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 38 3b  r (i = 0; i < 8;
2def0 20 69 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09 73   i++)..    {...s
2df00 70 72 69 6e 74 66 20 28 62 79 74 65 2c 20 22 25  printf (byte, "%
2df10 30 32 58 22 2c 20 65 6e 64 69 61 6e 5f 62 75 66  02X", endian_buf
2df20 5b 69 5d 29 3b 0a 09 09 2a 70 74 72 2b 2b 20 3d  [i]);...*ptr++ =
2df30 20 62 79 74 65 5b 30 5d 3b 0a 09 09 2a 70 74 72   byte[0];...*ptr
2df40 2b 2b 20 3d 20 62 79 74 65 5b 31 5d 3b 0a 09 20  ++ = byte[1];.. 
2df50 20 20 20 7d 0a 09 20 20 69 66 20 28 67 65 6f 6d     }..  if (geom
2df60 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
2df70 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09   == GAIA_XY_Z)..
2df80 20 20 20 20 7b 0a 09 09 67 61 69 61 45 78 70 6f      {...gaiaExpo
2df90 72 74 36 34 20 28 65 6e 64 69 61 6e 5f 62 75 66  rt64 (endian_buf
2dfa0 2c 20 70 6f 69 6e 74 2d 3e 5a 2c 20 31 2c 20 65  , point->Z, 1, e
2dfb0 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
2dfc0 5a 20 2a 2f 0a 09 09 66 6f 72 20 28 69 20 3d 20  Z */...for (i = 
2dfd0 30 3b 20 69 20 3c 20 38 3b 20 69 2b 2b 29 0a 09  0; i < 8; i++)..
2dfe0 09 20 20 7b 0a 09 09 20 20 20 20 20 20 73 70 72  .  {...      spr
2dff0 69 6e 74 66 20 28 62 79 74 65 2c 20 22 25 30 32  intf (byte, "%02
2e000 58 22 2c 20 65 6e 64 69 61 6e 5f 62 75 66 5b 69  X", endian_buf[i
2e010 5d 29 3b 0a 09 09 20 20 20 20 20 20 2a 70 74 72  ]);...      *ptr
2e020 2b 2b 20 3d 20 62 79 74 65 5b 30 5d 3b 0a 09 09  ++ = byte[0];...
2e030 20 20 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 62        *ptr++ = b
2e040 79 74 65 5b 31 5d 3b 0a 09 09 20 20 7d 0a 09 20  yte[1];...  }.. 
2e050 20 20 20 7d 0a 09 20 20 65 6c 73 65 20 69 66 20     }..  else if 
2e060 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e  (geom->Dimension
2e070 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59  Model == GAIA_XY
2e080 5f 4d 29 0a 09 20 20 20 20 7b 0a 09 09 67 61 69  _M)..    {...gai
2e090 61 45 78 70 6f 72 74 36 34 20 28 65 6e 64 69 61  aExport64 (endia
2e0a0 6e 5f 62 75 66 2c 20 70 6f 69 6e 74 2d 3e 4d 2c  n_buf, point->M,
2e0b0 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
2e0c0 3b 09 2f 2a 20 4d 20 2a 2f 0a 09 09 66 6f 72 20  ;./* M */...for 
2e0d0 28 69 20 3d 20 30 3b 20 69 20 3c 20 38 3b 20 69  (i = 0; i < 8; i
2e0e0 2b 2b 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20  ++)...  {...    
2e0f0 20 20 73 70 72 69 6e 74 66 20 28 62 79 74 65 2c    sprintf (byte,
2e100 20 22 25 30 32 58 22 2c 20 65 6e 64 69 61 6e 5f   "%02X", endian_
2e110 62 75 66 5b 69 5d 29 3b 0a 09 09 20 20 20 20 20  buf[i]);...     
2e120 20 2a 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b 30   *ptr++ = byte[0
2e130 5d 3b 0a 09 09 20 20 20 20 20 20 2a 70 74 72 2b  ];...      *ptr+
2e140 2b 20 3d 20 62 79 74 65 5b 31 5d 3b 0a 09 09 20  + = byte[1];... 
2e150 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73   }..    }..  els
2e160 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  e if (geom->Dime
2e170 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
2e180 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 20 20 20 20  IA_XY_Z_M)..    
2e190 7b 0a 09 09 67 61 69 61 45 78 70 6f 72 74 36 34  {...gaiaExport64
2e1a0 20 28 65 6e 64 69 61 6e 5f 62 75 66 2c 20 70 6f   (endian_buf, po
2e1b0 69 6e 74 2d 3e 5a 2c 20 31 2c 20 65 6e 64 69 61  int->Z, 1, endia
2e1c0 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 5a 20 2a 2f  n_arch);./* Z */
2e1d0 0a 09 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69  ...for (i = 0; i
2e1e0 20 3c 20 38 3b 20 69 2b 2b 29 0a 09 09 20 20 7b   < 8; i++)...  {
2e1f0 0a 09 09 20 20 20 20 20 20 73 70 72 69 6e 74 66  ...      sprintf
2e200 20 28 62 79 74 65 2c 20 22 25 30 32 58 22 2c 20   (byte, "%02X", 
2e210 65 6e 64 69 61 6e 5f 62 75 66 5b 69 5d 29 3b 0a  endian_buf[i]);.
2e220 09 09 20 20 20 20 20 20 2a 70 74 72 2b 2b 20 3d  ..      *ptr++ =
2e230 20 62 79 74 65 5b 30 5d 3b 0a 09 09 20 20 20 20   byte[0];...    
2e240 20 20 2a 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b    *ptr++ = byte[
2e250 31 5d 3b 0a 09 09 20 20 7d 0a 09 09 67 61 69 61  1];...  }...gaia
2e260 45 78 70 6f 72 74 36 34 20 28 65 6e 64 69 61 6e  Export64 (endian
2e270 5f 62 75 66 2c 20 70 6f 69 6e 74 2d 3e 4d 2c 20  _buf, point->M, 
2e280 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
2e290 09 2f 2a 20 4d 20 2a 2f 0a 09 09 66 6f 72 20 28  ./* M */...for (
2e2a0 69 20 3d 20 30 3b 20 69 20 3c 20 38 3b 20 69 2b  i = 0; i < 8; i+
2e2b0 2b 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20  +)...  {...     
2e2c0 20 73 70 72 69 6e 74 66 20 28 62 79 74 65 2c 20   sprintf (byte, 
2e2d0 22 25 30 32 58 22 2c 20 65 6e 64 69 61 6e 5f 62  "%02X", endian_b
2e2e0 75 66 5b 69 5d 29 3b 0a 09 09 20 20 20 20 20 20  uf[i]);...      
2e2f0 2a 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b 30 5d  *ptr++ = byte[0]
2e300 3b 0a 09 09 20 20 20 20 20 20 2a 70 74 72 2b 2b  ;...      *ptr++
2e310 20 3d 20 62 79 74 65 5b 31 5d 3b 0a 09 09 20 20   = byte[1];...  
2e320 7d 0a 09 20 20 20 20 7d 0a 09 20 20 70 6f 69 6e  }..    }..  poin
2e330 74 20 3d 20 70 6f 69 6e 74 2d 3e 4e 65 78 74 3b  t = point->Next;
2e340 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 6c 69 6e  .      }.    lin
2e350 65 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73 74 4c  e = geom->FirstL
2e360 69 6e 65 73 74 72 69 6e 67 3b 0a 20 20 20 20 77  inestring;.    w
2e370 68 69 6c 65 20 28 6c 69 6e 65 29 0a 20 20 20 20  hile (line).    
2e380 20 20 7b 0a 09 20 20 69 66 20 28 28 70 74 72 20    {..  if ((ptr 
2e390 2d 20 62 75 66 29 20 3e 20 31 30 32 34 29 0a 09  - buf) > 1024)..
2e3a0 20 20 20 20 7b 0a 09 09 2f 2a 20 66 6c 75 73 68      {.../* flush
2e3b0 69 6e 67 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ing the internal
2e3c0 20 62 75 66 66 65 72 20 2a 2f 0a 09 09 2a 70 74   buffer */...*pt
2e3d0 72 2b 2b 20 3d 20 27 5c 30 27 3b 0a 09 09 67 61  r++ = '\0';...ga
2e3e0 69 61 41 70 70 65 6e 64 54 6f 4f 75 74 42 75 66  iaAppendToOutBuf
2e3f0 66 65 72 20 28 6f 75 74 5f 62 75 66 2c 20 62 75  fer (out_buf, bu
2e400 66 29 3b 0a 09 09 70 74 72 20 3d 20 62 75 66 3b  f);...ptr = buf;
2e410 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 74  ..    }..  if (t
2e420 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54  ype == GAIA_MULT
2e430 49 4c 49 4e 45 53 54 52 49 4e 47 20 7c 7c 20 74  ILINESTRING || t
2e440 79 70 65 20 3d 3d 20 47 41 49 41 5f 47 45 4f 4d  ype == GAIA_GEOM
2e450 45 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 29 0a  ETRYCOLLECTION).
2e460 09 20 20 20 20 7b 0a 09 09 2a 70 74 72 2b 2b 20  .    {...*ptr++ 
2e470 3d 20 27 30 27 3b 0a 09 09 2a 70 74 72 2b 2b 20  = '0';...*ptr++ 
2e480 3d 20 27 31 27 3b 0a 09 09 2f 2a 20 69 74 27 73  = '1';.../* it's
2e490 20 61 20 63 6f 6c 6c 65 63 74 69 6f 6e 3a 20 74   a collection: t
2e4a0 68 65 20 43 4c 41 53 53 20 54 59 50 45 20 66 6f  he CLASS TYPE fo
2e4b0 72 20 74 68 69 73 20 65 6c 65 6d 65 6e 74 20 2a  r this element *
2e4c0 2f 0a 09 09 67 61 69 61 45 78 70 6f 72 74 33 32  /...gaiaExport32
2e4d0 20 28 65 6e 64 69 61 6e 5f 62 75 66 2c 20 47 41   (endian_buf, GA
2e4e0 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 2c 20 31  IA_LINESTRING, 1
2e4f0 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  , endian_arch);.
2e500 09 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20  ..for (i = 0; i 
2e510 3c 20 33 3b 20 69 2b 2b 29 0a 09 09 20 20 7b 0a  < 3; i++)...  {.
2e520 09 09 20 20 20 20 20 20 2f 2a 20 43 41 56 45 41  ..      /* CAVEA
2e530 54 3a 20 74 68 65 20 34 74 68 20 62 79 74 65 20  T: the 4th byte 
2e540 69 6e 20 50 6f 73 74 47 49 53 20 65 6e 63 6f 64  in PostGIS encod
2e550 65 73 20 4d 2f 5a 20 70 72 65 73 65 6e 63 65 20  es M/Z presence 
2e560 21 21 21 21 20 2a 2f 0a 09 09 20 20 20 20 20 20  !!!! */...      
2e570 73 70 72 69 6e 74 66 20 28 62 79 74 65 2c 20 22  sprintf (byte, "
2e580 25 30 32 58 22 2c 20 65 6e 64 69 61 6e 5f 62 75  %02X", endian_bu
2e590 66 5b 69 5d 29 3b 0a 09 09 20 20 20 20 20 20 2a  f[i]);...      *
2e5a0 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b 30 5d 3b  ptr++ = byte[0];
2e5b0 0a 09 09 20 20 20 20 20 20 2a 70 74 72 2b 2b 20  ...      *ptr++ 
2e5c0 3d 20 62 79 74 65 5b 31 5d 3b 0a 09 09 20 20 7d  = byte[1];...  }
2e5d0 0a 09 09 2f 2a 20 6d 61 72 6b 69 6e 67 20 4d 2f  .../* marking M/
2e5e0 5a 20 70 72 65 73 65 6e 63 65 20 2a 2f 0a 09 09  Z presence */...
2e5f0 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
2e600 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
2e610 5f 58 59 5f 5a 29 0a 09 09 20 20 20 20 2a 70 74  _XY_Z)...    *pt
2e620 72 2b 2b 20 3d 20 27 38 27 3b 0a 09 09 65 6c 73  r++ = '8';...els
2e630 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  e if (geom->Dime
2e640 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
2e650 49 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20 20 2a  IA_XY_M)...    *
2e660 70 74 72 2b 2b 20 3d 20 27 34 27 3b 0a 09 09 65  ptr++ = '4';...e
2e670 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69  lse if (geom->Di
2e680 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
2e690 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20  GAIA_XY_Z_M)... 
2e6a0 20 20 20 2a 70 74 72 2b 2b 20 3d 20 27 43 27 3b     *ptr++ = 'C';
2e6b0 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 2a 70  ...else...    *p
2e6c0 74 72 2b 2b 20 3d 20 27 30 27 3b 0a 09 09 2a 70  tr++ = '0';...*p
2e6d0 74 72 2b 2b 20 3d 20 27 30 27 3b 0a 09 20 20 20  tr++ = '0';..   
2e6e0 20 7d 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74   }..  gaiaExport
2e6f0 33 32 20 28 65 6e 64 69 61 6e 5f 62 75 66 2c 20  32 (endian_buf, 
2e700 6c 69 6e 65 2d 3e 50 6f 69 6e 74 73 2c 20 31 2c  line->Points, 1,
2e710 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
2e720 2a 20 23 20 70 6f 69 6e 74 73 20 2a 2f 0a 09 20  * # points */.. 
2e730 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c   for (i = 0; i <
2e740 20 34 3b 20 69 2b 2b 29 0a 09 20 20 20 20 7b 0a   4; i++)..    {.
2e750 09 09 73 70 72 69 6e 74 66 20 28 62 79 74 65 2c  ..sprintf (byte,
2e760 20 22 25 30 32 58 22 2c 20 65 6e 64 69 61 6e 5f   "%02X", endian_
2e770 62 75 66 5b 69 5d 29 3b 0a 09 09 2a 70 74 72 2b  buf[i]);...*ptr+
2e780 2b 20 3d 20 62 79 74 65 5b 30 5d 3b 0a 09 09 2a  + = byte[0];...*
2e790 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b 31 5d 3b  ptr++ = byte[1];
2e7a0 0a 09 20 20 20 20 7d 0a 09 20 20 66 6f 72 20 28  ..    }..  for (
2e7b0 69 76 20 3d 20 30 3b 20 69 76 20 3c 20 6c 69 6e  iv = 0; iv < lin
2e7c0 65 2d 3e 50 6f 69 6e 74 73 3b 20 69 76 2b 2b 29  e->Points; iv++)
2e7d0 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 28 70  ..    {...if ((p
2e7e0 74 72 20 2d 20 62 75 66 29 20 3e 20 31 30 32 34  tr - buf) > 1024
2e7f0 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  )...  {...      
2e800 2f 2a 20 66 6c 75 73 68 69 6e 67 20 74 68 65 20  /* flushing the 
2e810 69 6e 74 65 72 6e 61 6c 20 62 75 66 66 65 72 20  internal buffer 
2e820 2a 2f 0a 09 09 20 20 20 20 20 20 2a 70 74 72 2b  */...      *ptr+
2e830 2b 20 3d 20 27 5c 30 27 3b 0a 09 09 20 20 20 20  + = '\0';...    
2e840 20 20 67 61 69 61 41 70 70 65 6e 64 54 6f 4f 75    gaiaAppendToOu
2e850 74 42 75 66 66 65 72 20 28 6f 75 74 5f 62 75 66  tBuffer (out_buf
2e860 2c 20 62 75 66 29 3b 0a 09 09 20 20 20 20 20 20  , buf);...      
2e870 70 74 72 20 3d 20 62 75 66 3b 0a 09 09 20 20 7d  ptr = buf;...  }
2e880 0a 09 09 67 61 69 61 4c 69 6e 65 47 65 74 50 6f  ...gaiaLineGetPo
2e890 69 6e 74 20 28 6c 69 6e 65 2c 20 69 76 2c 20 26  int (line, iv, &
2e8a0 78 2c 20 26 79 2c 20 26 7a 2c 20 26 6d 29 3b 0a  x, &y, &z, &m);.
2e8b0 09 09 67 61 69 61 45 78 70 6f 72 74 36 34 20 28  ..gaiaExport64 (
2e8c0 65 6e 64 69 61 6e 5f 62 75 66 2c 20 78 2c 20 31  endian_buf, x, 1
2e8d0 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
2e8e0 2f 2a 20 58 20 2a 2f 0a 09 09 66 6f 72 20 28 69  /* X */...for (i
2e8f0 20 3d 20 30 3b 20 69 20 3c 20 38 3b 20 69 2b 2b   = 0; i < 8; i++
2e900 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  )...  {...      
2e910 73 70 72 69 6e 74 66 20 28 62 79 74 65 2c 20 22  sprintf (byte, "
2e920 25 30 32 58 22 2c 20 65 6e 64 69 61 6e 5f 62 75  %02X", endian_bu
2e930 66 5b 69 5d 29 3b 0a 09 09 20 20 20 20 20 20 2a  f[i]);...      *
2e940 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b 30 5d 3b  ptr++ = byte[0];
2e950 0a 09 09 20 20 20 20 20 20 2a 70 74 72 2b 2b 20  ...      *ptr++ 
2e960 3d 20 62 79 74 65 5b 31 5d 3b 0a 09 09 20 20 7d  = byte[1];...  }
2e970 0a 09 09 67 61 69 61 45 78 70 6f 72 74 36 34 20  ...gaiaExport64 
2e980 28 65 6e 64 69 61 6e 5f 62 75 66 2c 20 79 2c 20  (endian_buf, y, 
2e990 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
2e9a0 09 2f 2a 20 59 20 2a 2f 0a 09 09 66 6f 72 20 28  ./* Y */...for (
2e9b0 69 20 3d 20 30 3b 20 69 20 3c 20 38 3b 20 69 2b  i = 0; i < 8; i+
2e9c0 2b 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20  +)...  {...     
2e9d0 20 73 70 72 69 6e 74 66 20 28 62 79 74 65 2c 20   sprintf (byte, 
2e9e0 22 25 30 32 58 22 2c 20 65 6e 64 69 61 6e 5f 62  "%02X", endian_b
2e9f0 75 66 5b 69 5d 29 3b 0a 09 09 20 20 20 20 20 20  uf[i]);...      
2ea00 2a 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b 30 5d  *ptr++ = byte[0]
2ea10 3b 0a 09 09 20 20 20 20 20 20 2a 70 74 72 2b 2b  ;...      *ptr++
2ea20 20 3d 20 62 79 74 65 5b 31 5d 3b 0a 09 09 20 20   = byte[1];...  
2ea30 7d 0a 09 09 69 66 20 28 67 65 6f 6d 2d 3e 44 69  }...if (geom->Di
2ea40 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
2ea50 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09 20 20 7b  GAIA_XY_Z)...  {
2ea60 0a 09 09 20 20 20 20 20 20 67 61 69 61 45 78 70  ...      gaiaExp
2ea70 6f 72 74 36 34 20 28 65 6e 64 69 61 6e 5f 62 75  ort64 (endian_bu
2ea80 66 2c 20 7a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  f, z, 1, endian_
2ea90 61 72 63 68 29 3b 09 2f 2a 20 5a 20 2a 2f 0a 09  arch);./* Z */..
2eaa0 09 20 20 20 20 20 20 66 6f 72 20 28 69 20 3d 20  .      for (i = 
2eab0 30 3b 20 69 20 3c 20 38 3b 20 69 2b 2b 29 0a 09  0; i < 8; i++)..
2eac0 09 09 7b 0a 09 09 09 20 20 20 20 73 70 72 69 6e  ..{....    sprin
2ead0 74 66 20 28 62 79 74 65 2c 20 22 25 30 32 58 22  tf (byte, "%02X"
2eae0 2c 20 65 6e 64 69 61 6e 5f 62 75 66 5b 69 5d 29  , endian_buf[i])
2eaf0 3b 0a 09 09 09 20 20 20 20 2a 70 74 72 2b 2b 20  ;....    *ptr++ 
2eb00 3d 20 62 79 74 65 5b 30 5d 3b 0a 09 09 09 20 20  = byte[0];....  
2eb10 20 20 2a 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b    *ptr++ = byte[
2eb20 31 5d 3b 0a 09 09 09 7d 0a 09 09 20 20 7d 0a 09  1];....}...  }..
2eb30 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e  .else if (geom->
2eb40 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
2eb50 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09 20  = GAIA_XY_M)... 
2eb60 20 7b 0a 09 09 20 20 20 20 20 20 67 61 69 61 45   {...      gaiaE
2eb70 78 70 6f 72 74 36 34 20 28 65 6e 64 69 61 6e 5f  xport64 (endian_
2eb80 62 75 66 2c 20 6d 2c 20 31 2c 20 65 6e 64 69 61  buf, m, 1, endia
2eb90 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 4d 20 2a 2f  n_arch);./* M */
2eba0 0a 09 09 20 20 20 20 20 20 66 6f 72 20 28 69 20  ...      for (i 
2ebb0 3d 20 30 3b 20 69 20 3c 20 38 3b 20 69 2b 2b 29  = 0; i < 8; i++)
2ebc0 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 73 70 72  ....{....    spr
2ebd0 69 6e 74 66 20 28 62 79 74 65 2c 20 22 25 30 32  intf (byte, "%02
2ebe0 58 22 2c 20 65 6e 64 69 61 6e 5f 62 75 66 5b 69  X", endian_buf[i
2ebf0 5d 29 3b 0a 09 09 09 20 20 20 20 2a 70 74 72 2b  ]);....    *ptr+
2ec00 2b 20 3d 20 62 79 74 65 5b 30 5d 3b 0a 09 09 09  + = byte[0];....
2ec10 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 62 79 74      *ptr++ = byt
2ec20 65 5b 31 5d 3b 0a 09 09 09 7d 0a 09 09 20 20 7d  e[1];....}...  }
2ec30 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d  ...else if (geom
2ec40 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c  ->DimensionModel
2ec50 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29   == GAIA_XY_Z_M)
2ec60 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67  ...  {...      g
2ec70 61 69 61 45 78 70 6f 72 74 36 34 20 28 65 6e 64  aiaExport64 (end
2ec80 69 61 6e 5f 62 75 66 2c 20 7a 2c 20 31 2c 20 65  ian_buf, z, 1, e
2ec90 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
2eca0 5a 20 2a 2f 0a 09 09 20 20 20 20 20 20 66 6f 72  Z */...      for
2ecb0 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 38 3b 20   (i = 0; i < 8; 
2ecc0 69 2b 2b 29 0a 09 09 09 7b 0a 09 09 09 20 20 20  i++)....{....   
2ecd0 20 73 70 72 69 6e 74 66 20 28 62 79 74 65 2c 20   sprintf (byte, 
2ece0 22 25 30 32 58 22 2c 20 65 6e 64 69 61 6e 5f 62  "%02X", endian_b
2ecf0 75 66 5b 69 5d 29 3b 0a 09 09 09 20 20 20 20 2a  uf[i]);....    *
2ed00 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b 30 5d 3b  ptr++ = byte[0];
2ed10 0a 09 09 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d  ....    *ptr++ =
2ed20 20 62 79 74 65 5b 31 5d 3b 0a 09 09 09 7d 0a 09   byte[1];....}..
2ed30 09 20 20 20 20 20 20 67 61 69 61 45 78 70 6f 72  .      gaiaExpor
2ed40 74 36 34 20 28 65 6e 64 69 61 6e 5f 62 75 66 2c  t64 (endian_buf,
2ed50 20 6d 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72   m, 1, endian_ar
2ed60 63 68 29 3b 09 2f 2a 20 4d 20 2a 2f 0a 09 09 20  ch);./* M */... 
2ed70 20 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b       for (i = 0;
2ed80 20 69 20 3c 20 38 3b 20 69 2b 2b 29 0a 09 09 09   i < 8; i++)....
2ed90 7b 0a 09 09 09 20 20 20 20 73 70 72 69 6e 74 66  {....    sprintf
2eda0 20 28 62 79 74 65 2c 20 22 25 30 32 58 22 2c 20   (byte, "%02X", 
2edb0 65 6e 64 69 61 6e 5f 62 75 66 5b 69 5d 29 3b 0a  endian_buf[i]);.
2edc0 09 09 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20  ...    *ptr++ = 
2edd0 62 79 74 65 5b 30 5d 3b 0a 09 09 09 20 20 20 20  byte[0];....    
2ede0 2a 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b 31 5d  *ptr++ = byte[1]
2edf0 3b 0a 09 09 09 7d 0a 09 09 20 20 7d 0a 09 20 20  ;....}...  }..  
2ee00 20 20 7d 0a 09 20 20 6c 69 6e 65 20 3d 20 6c 69    }..  line = li
2ee10 6e 65 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20 20  ne->Next;.      
2ee20 7d 0a 20 20 20 20 70 6f 6c 79 67 20 3d 20 67 65  }.    polyg = ge
2ee30 6f 6d 2d 3e 46 69 72 73 74 50 6f 6c 79 67 6f 6e  om->FirstPolygon
2ee40 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 70 6f 6c  ;.    while (pol
2ee50 79 67 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69  yg).      {..  i
2ee60 66 20 28 28 70 74 72 20 2d 20 62 75 66 29 20 3e  f ((ptr - buf) >
2ee70 20 31 30 32 34 29 0a 09 20 20 20 20 7b 0a 09 09   1024)..    {...
2ee80 2f 2a 20 66 6c 75 73 68 69 6e 67 20 74 68 65 20  /* flushing the 
2ee90 69 6e 74 65 72 6e 61 6c 20 62 75 66 66 65 72 20  internal buffer 
2eea0 2a 2f 0a 09 09 2a 70 74 72 2b 2b 20 3d 20 27 5c  */...*ptr++ = '\
2eeb0 30 27 3b 0a 09 09 67 61 69 61 41 70 70 65 6e 64  0';...gaiaAppend
2eec0 54 6f 4f 75 74 42 75 66 66 65 72 20 28 6f 75 74  ToOutBuffer (out
2eed0 5f 62 75 66 2c 20 62 75 66 29 3b 0a 09 09 70 74  _buf, buf);...pt
2eee0 72 20 3d 20 62 75 66 3b 0a 09 20 20 20 20 7d 0a  r = buf;..    }.
2eef0 09 20 20 69 66 20 28 74 79 70 65 20 3d 3d 20 47  .  if (type == G
2ef00 41 49 41 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e  AIA_MULTIPOLYGON
2ef10 20 7c 7c 20 74 79 70 65 20 3d 3d 20 47 41 49 41   || type == GAIA
2ef20 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
2ef30 49 4f 4e 29 0a 09 20 20 20 20 7b 0a 09 09 2a 70  ION)..    {...*p
2ef40 74 72 2b 2b 20 3d 20 27 30 27 3b 0a 09 09 2a 70  tr++ = '0';...*p
2ef50 74 72 2b 2b 20 3d 20 27 31 27 3b 0a 09 09 2f 2a  tr++ = '1';.../*
2ef60 20 69 74 27 73 20 61 20 63 6f 6c 6c 65 63 74 69   it's a collecti
2ef70 6f 6e 3a 20 74 68 65 20 43 4c 41 53 53 20 54 59  on: the CLASS TY
2ef80 50 45 20 66 6f 72 20 74 68 69 73 20 65 6c 65 6d  PE for this elem
2ef90 65 6e 74 20 2a 2f 0a 09 09 67 61 69 61 45 78 70  ent */...gaiaExp
2efa0 6f 72 74 33 32 20 28 65 6e 64 69 61 6e 5f 62 75  ort32 (endian_bu
2efb0 66 2c 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 2c  f, GAIA_POLYGON,
2efc0 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
2efd0 3b 0a 09 09 66 6f 72 20 28 69 20 3d 20 30 3b 20  ;...for (i = 0; 
2efe0 69 20 3c 20 33 3b 20 69 2b 2b 29 0a 09 09 20 20  i < 3; i++)...  
2eff0 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20 43 41 56  {...      /* CAV
2f000 45 41 54 3a 20 74 68 65 20 34 74 68 20 62 79 74  EAT: the 4th byt
2f010 65 20 69 6e 20 50 6f 73 74 47 49 53 20 65 6e 63  e in PostGIS enc
2f020 6f 64 65 73 20 4d 2f 5a 20 70 72 65 73 65 6e 63  odes M/Z presenc
2f030 65 20 21 21 21 21 20 2a 2f 0a 09 09 20 20 20 20  e !!!! */...    
2f040 20 20 73 70 72 69 6e 74 66 20 28 62 79 74 65 2c    sprintf (byte,
2f050 20 22 25 30 32 58 22 2c 20 65 6e 64 69 61 6e 5f   "%02X", endian_
2f060 62 75 66 5b 69 5d 29 3b 0a 09 09 20 20 20 20 20  buf[i]);...     
2f070 20 2a 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b 30   *ptr++ = byte[0
2f080 5d 3b 0a 09 09 20 20 20 20 20 20 2a 70 74 72 2b  ];...      *ptr+
2f090 2b 20 3d 20 62 79 74 65 5b 31 5d 3b 0a 09 09 20  + = byte[1];... 
2f0a0 20 7d 0a 09 09 2f 2a 20 6d 61 72 6b 69 6e 67 20   }.../* marking 
2f0b0 4d 2f 5a 20 70 72 65 73 65 6e 63 65 20 2a 2f 0a  M/Z presence */.
2f0c0 09 09 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  ..if (geom->Dime
2f0d0 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
2f0e0 49 41 5f 58 59 5f 5a 29 0a 09 09 20 20 20 20 2a  IA_XY_Z)...    *
2f0f0 70 74 72 2b 2b 20 3d 20 27 38 27 3b 0a 09 09 65  ptr++ = '8';...e
2f100 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69  lse if (geom->Di
2f110 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
2f120 47 41 49 41 5f 58 59 5f 4d 29 0a 09 09 20 20 20  GAIA_XY_M)...   
2f130 20 2a 70 74 72 2b 2b 20 3d 20 27 34 27 3b 0a 09   *ptr++ = '4';..
2f140 09 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e  .else if (geom->
2f150 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
2f160 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09  = GAIA_XY_Z_M)..
2f170 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 27 43  .    *ptr++ = 'C
2f180 27 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20  ';...else...    
2f190 2a 70 74 72 2b 2b 20 3d 20 27 30 27 3b 0a 09 09  *ptr++ = '0';...
2f1a0 2a 70 74 72 2b 2b 20 3d 20 27 30 27 3b 0a 09 20  *ptr++ = '0';.. 
2f1b0 20 20 20 7d 0a 09 20 20 67 61 69 61 45 78 70 6f     }..  gaiaExpo
2f1c0 72 74 33 32 20 28 65 6e 64 69 61 6e 5f 62 75 66  rt32 (endian_buf
2f1d0 2c 20 70 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74 65  , polyg->NumInte
2f1e0 72 69 6f 72 73 20 2b 20 31 2c 20 31 2c 20 65 6e  riors + 1, 1, en
2f1f0 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 23  dian_arch);./* #
2f200 20 72 69 6e 67 73 20 2a 2f 0a 09 20 20 66 6f 72   rings */..  for
2f210 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 34 3b 20   (i = 0; i < 4; 
2f220 69 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09 73 70  i++)..    {...sp
2f230 72 69 6e 74 66 20 28 62 79 74 65 2c 20 22 25 30  rintf (byte, "%0
2f240 32 58 22 2c 20 65 6e 64 69 61 6e 5f 62 75 66 5b  2X", endian_buf[
2f250 69 5d 29 3b 0a 09 09 2a 70 74 72 2b 2b 20 3d 20  i]);...*ptr++ = 
2f260 62 79 74 65 5b 30 5d 3b 0a 09 09 2a 70 74 72 2b  byte[0];...*ptr+
2f270 2b 20 3d 20 62 79 74 65 5b 31 5d 3b 0a 09 20 20  + = byte[1];..  
2f280 20 20 7d 0a 09 20 20 72 6e 67 20 3d 20 70 6f 6c    }..  rng = pol
2f290 79 67 2d 3e 45 78 74 65 72 69 6f 72 3b 0a 09 20  yg->Exterior;.. 
2f2a0 20 67 61 69 61 45 78 70 6f 72 74 33 32 20 28 65   gaiaExport32 (e
2f2b0 6e 64 69 61 6e 5f 62 75 66 2c 20 72 6e 67 2d 3e  ndian_buf, rng->
2f2c0 50 6f 69 6e 74 73 2c 20 31 2c 20 65 6e 64 69 61  Points, 1, endia
2f2d0 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 23 20 70 6f  n_arch);./* # po
2f2e0 69 6e 74 73 20 2d 20 65 78 74 65 72 69 6f 72 20  ints - exterior 
2f2f0 72 69 6e 67 20 2a 2f 0a 09 20 20 66 6f 72 20 28  ring */..  for (
2f300 69 20 3d 20 30 3b 20 69 20 3c 20 34 3b 20 69 2b  i = 0; i < 4; i+
2f310 2b 29 0a 09 20 20 20 20 7b 0a 09 09 73 70 72 69  +)..    {...spri
2f320 6e 74 66 20 28 62 79 74 65 2c 20 22 25 30 32 58  ntf (byte, "%02X
2f330 22 2c 20 65 6e 64 69 61 6e 5f 62 75 66 5b 69 5d  ", endian_buf[i]
2f340 29 3b 0a 09 09 2a 70 74 72 2b 2b 20 3d 20 62 79  );...*ptr++ = by
2f350 74 65 5b 30 5d 3b 0a 09 09 2a 70 74 72 2b 2b 20  te[0];...*ptr++ 
2f360 3d 20 62 79 74 65 5b 31 5d 3b 0a 09 20 20 20 20  = byte[1];..    
2f370 7d 0a 09 20 20 66 6f 72 20 28 69 76 20 3d 20 30  }..  for (iv = 0
2f380 3b 20 69 76 20 3c 20 72 6e 67 2d 3e 50 6f 69 6e  ; iv < rng->Poin
2f390 74 73 3b 20 69 76 2b 2b 29 0a 09 20 20 20 20 7b  ts; iv++)..    {
2f3a0 0a 09 09 69 66 20 28 28 70 74 72 20 2d 20 62 75  ...if ((ptr - bu
2f3b0 66 29 20 3e 20 31 30 32 34 29 0a 09 09 20 20 7b  f) > 1024)...  {
2f3c0 0a 09 09 20 20 20 20 20 20 2f 2a 20 66 6c 75 73  ...      /* flus
2f3d0 68 69 6e 67 20 74 68 65 20 69 6e 74 65 72 6e 61  hing the interna
2f3e0 6c 20 62 75 66 66 65 72 20 2a 2f 0a 09 09 20 20  l buffer */...  
2f3f0 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 27 5c 30      *ptr++ = '\0
2f400 27 3b 0a 09 09 20 20 20 20 20 20 67 61 69 61 41  ';...      gaiaA
2f410 70 70 65 6e 64 54 6f 4f 75 74 42 75 66 66 65 72  ppendToOutBuffer
2f420 20 28 6f 75 74 5f 62 75 66 2c 20 62 75 66 29 3b   (out_buf, buf);
2f430 0a 09 09 20 20 20 20 20 20 70 74 72 20 3d 20 62  ...      ptr = b
2f440 75 66 3b 0a 09 09 20 20 7d 0a 09 09 67 61 69 61  uf;...  }...gaia
2f450 52 69 6e 67 47 65 74 50 6f 69 6e 74 20 28 72 6e  RingGetPoint (rn
2f460 67 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26  g, iv, &x, &y, &
2f470 7a 2c 20 26 6d 29 3b 0a 09 09 67 61 69 61 45 78  z, &m);...gaiaEx
2f480 70 6f 72 74 36 34 20 28 65 6e 64 69 61 6e 5f 62  port64 (endian_b
2f490 75 66 2c 20 78 2c 20 31 2c 20 65 6e 64 69 61 6e  uf, x, 1, endian
2f4a0 5f 61 72 63 68 29 3b 09 2f 2a 20 58 20 2d 20 65  _arch);./* X - e
2f4b0 78 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a  xterior ring */.
2f4c0 09 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20  ..for (i = 0; i 
2f4d0 3c 20 38 3b 20 69 2b 2b 29 0a 09 09 20 20 7b 0a  < 8; i++)...  {.
2f4e0 09 09 20 20 20 20 20 20 73 70 72 69 6e 74 66 20  ..      sprintf 
2f4f0 28 62 79 74 65 2c 20 22 25 30 32 58 22 2c 20 65  (byte, "%02X", e
2f500 6e 64 69 61 6e 5f 62 75 66 5b 69 5d 29 3b 0a 09  ndian_buf[i]);..
2f510 09 20 20 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20  .      *ptr++ = 
2f520 62 79 74 65 5b 30 5d 3b 0a 09 09 20 20 20 20 20  byte[0];...     
2f530 20 2a 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b 31   *ptr++ = byte[1
2f540 5d 3b 0a 09 09 20 20 7d 0a 09 09 67 61 69 61 45  ];...  }...gaiaE
2f550 78 70 6f 72 74 36 34 20 28 65 6e 64 69 61 6e 5f  xport64 (endian_
2f560 62 75 66 2c 20 79 2c 20 31 2c 20 65 6e 64 69 61  buf, y, 1, endia
2f570 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 59 20 2d 20  n_arch);./* Y - 
2f580 65 78 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f  exterior ring */
2f590 0a 09 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69  ...for (i = 0; i
2f5a0 20 3c 20 38 3b 20 69 2b 2b 29 0a 09 09 20 20 7b   < 8; i++)...  {
2f5b0 0a 09 09 20 20 20 20 20 20 73 70 72 69 6e 74 66  ...      sprintf
2f5c0 20 28 62 79 74 65 2c 20 22 25 30 32 58 22 2c 20   (byte, "%02X", 
2f5d0 65 6e 64 69 61 6e 5f 62 75 66 5b 69 5d 29 3b 0a  endian_buf[i]);.
2f5e0 09 09 20 20 20 20 20 20 2a 70 74 72 2b 2b 20 3d  ..      *ptr++ =
2f5f0 20 62 79 74 65 5b 30 5d 3b 0a 09 09 20 20 20 20   byte[0];...    
2f600 20 20 2a 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b    *ptr++ = byte[
2f610 31 5d 3b 0a 09 09 20 20 7d 0a 09 09 69 66 20 28  1];...  }...if (
2f620 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d  geom->DimensionM
2f630 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f  odel == GAIA_XY_
2f640 5a 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20  Z)...  {...     
2f650 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 65   gaiaExport64 (e
2f660 6e 64 69 61 6e 5f 62 75 66 2c 20 7a 2c 20 31 2c  ndian_buf, z, 1,
2f670 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f   endian_arch);./
2f680 2a 20 5a 20 2a 2f 0a 09 09 20 20 20 20 20 20 66  * Z */...      f
2f690 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 38  or (i = 0; i < 8
2f6a0 3b 20 69 2b 2b 29 0a 09 09 09 7b 0a 09 09 09 20  ; i++)....{.... 
2f6b0 20 20 20 73 70 72 69 6e 74 66 20 28 62 79 74 65     sprintf (byte
2f6c0 2c 20 22 25 30 32 58 22 2c 20 65 6e 64 69 61 6e  , "%02X", endian
2f6d0 5f 62 75 66 5b 69 5d 29 3b 0a 09 09 09 20 20 20  _buf[i]);....   
2f6e0 20 2a 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b 30   *ptr++ = byte[0
2f6f0 5d 3b 0a 09 09 09 20 20 20 20 2a 70 74 72 2b 2b  ];....    *ptr++
2f700 20 3d 20 62 79 74 65 5b 31 5d 3b 0a 09 09 09 7d   = byte[1];....}
2f710 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 20 69 66  ...  }...else if
2f720 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f   (geom->Dimensio
2f730 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58  nModel == GAIA_X
2f740 59 5f 4d 29 0a 09 09 20 20 7b 0a 09 09 20 20 20  Y_M)...  {...   
2f750 20 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20     gaiaExport64 
2f760 28 65 6e 64 69 61 6e 5f 62 75 66 2c 20 6d 2c 20  (endian_buf, m, 
2f770 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  1, endian_arch);
2f780 09 2f 2a 20 4d 20 2a 2f 0a 09 09 20 20 20 20 20  ./* M */...     
2f790 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c   for (i = 0; i <
2f7a0 20 38 3b 20 69 2b 2b 29 0a 09 09 09 7b 0a 09 09   8; i++)....{...
2f7b0 09 20 20 20 20 73 70 72 69 6e 74 66 20 28 62 79  .    sprintf (by
2f7c0 74 65 2c 20 22 25 30 32 58 22 2c 20 65 6e 64 69  te, "%02X", endi
2f7d0 61 6e 5f 62 75 66 5b 69 5d 29 3b 0a 09 09 09 20  an_buf[i]);.... 
2f7e0 20 20 20 2a 70 74 72 2b 2b 20 3d 20 62 79 74 65     *ptr++ = byte
2f7f0 5b 30 5d 3b 0a 09 09 09 20 20 20 20 2a 70 74 72  [0];....    *ptr
2f800 2b 2b 20 3d 20 62 79 74 65 5b 31 5d 3b 0a 09 09  ++ = byte[1];...
2f810 09 7d 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 20  .}...  }...else 
2f820 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
2f830 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
2f840 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 7b 0a 09  _XY_Z_M)...  {..
2f850 09 20 20 20 20 20 20 67 61 69 61 45 78 70 6f 72  .      gaiaExpor
2f860 74 36 34 20 28 65 6e 64 69 61 6e 5f 62 75 66 2c  t64 (endian_buf,
2f870 20 7a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72   z, 1, endian_ar
2f880 63 68 29 3b 09 2f 2a 20 5a 20 2a 2f 0a 09 09 20  ch);./* Z */... 
2f890 20 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b       for (i = 0;
2f8a0 20 69 20 3c 20 38 3b 20 69 2b 2b 29 0a 09 09 09   i < 8; i++)....
2f8b0 7b 0a 09 09 09 20 20 20 20 73 70 72 69 6e 74 66  {....    sprintf
2f8c0 20 28 62 79 74 65 2c 20 22 25 30 32 58 22 2c 20   (byte, "%02X", 
2f8d0 65 6e 64 69 61 6e 5f 62 75 66 5b 69 5d 29 3b 0a  endian_buf[i]);.
2f8e0 09 09 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20  ...    *ptr++ = 
2f8f0 62 79 74 65 5b 30 5d 3b 0a 09 09 09 20 20 20 20  byte[0];....    
2f900 2a 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b 31 5d  *ptr++ = byte[1]
2f910 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 67  ;....}...      g
2f920 61 69 61 45 78 70 6f 72 74 36 34 20 28 65 6e 64  aiaExport64 (end
2f930 69 61 6e 5f 62 75 66 2c 20 6d 2c 20 31 2c 20 65  ian_buf, m, 1, e
2f940 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
2f950 4d 20 2a 2f 0a 09 09 20 20 20 20 20 20 66 6f 72  M */...      for
2f960 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 38 3b 20   (i = 0; i < 8; 
2f970 69 2b 2b 29 0a 09 09 09 7b 0a 09 09 09 20 20 20  i++)....{....   
2f980 20 73 70 72 69 6e 74 66 20 28 62 79 74 65 2c 20   sprintf (byte, 
2f990 22 25 30 32 58 22 2c 20 65 6e 64 69 61 6e 5f 62  "%02X", endian_b
2f9a0 75 66 5b 69 5d 29 3b 0a 09 09 09 20 20 20 20 2a  uf[i]);....    *
2f9b0 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b 30 5d 3b  ptr++ = byte[0];
2f9c0 0a 09 09 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d  ....    *ptr++ =
2f9d0 20 62 79 74 65 5b 31 5d 3b 0a 09 09 09 7d 0a 09   byte[1];....}..
2f9e0 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 66  .  }..    }..  f
2f9f0 6f 72 20 28 69 62 20 3d 20 30 3b 20 69 62 20 3c  or (ib = 0; ib <
2fa00 20 70 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74 65 72   polyg->NumInter
2fa10 69 6f 72 73 3b 20 69 62 2b 2b 29 0a 09 20 20 20  iors; ib++)..   
2fa20 20 7b 0a 09 09 72 6e 67 20 3d 20 70 6f 6c 79 67   {...rng = polyg
2fa30 2d 3e 49 6e 74 65 72 69 6f 72 73 20 2b 20 69 62  ->Interiors + ib
2fa40 3b 0a 09 09 67 61 69 61 45 78 70 6f 72 74 33 32  ;...gaiaExport32
2fa50 20 28 65 6e 64 69 61 6e 5f 62 75 66 2c 20 72 6e   (endian_buf, rn
2fa60 67 2d 3e 50 6f 69 6e 74 73 2c 20 31 2c 20 65 6e  g->Points, 1, en
2fa70 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 23  dian_arch);./* #
2fa80 20 70 6f 69 6e 74 73 20 2d 20 69 6e 74 65 72 69   points - interi
2fa90 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 09 66 6f 72  or ring */...for
2faa0 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 34 3b 20   (i = 0; i < 4; 
2fab0 69 2b 2b 29 0a 09 09 20 20 7b 0a 09 09 20 20 20  i++)...  {...   
2fac0 20 20 20 73 70 72 69 6e 74 66 20 28 62 79 74 65     sprintf (byte
2fad0 2c 20 22 25 30 32 58 22 2c 20 65 6e 64 69 61 6e  , "%02X", endian
2fae0 5f 62 75 66 5b 69 5d 29 3b 0a 09 09 20 20 20 20  _buf[i]);...    
2faf0 20 20 2a 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b    *ptr++ = byte[
2fb00 30 5d 3b 0a 09 09 20 20 20 20 20 20 2a 70 74 72  0];...      *ptr
2fb10 2b 2b 20 3d 20 62 79 74 65 5b 31 5d 3b 0a 09 09  ++ = byte[1];...
2fb20 20 20 7d 0a 09 09 66 6f 72 20 28 69 76 20 3d 20    }...for (iv = 
2fb30 30 3b 20 69 76 20 3c 20 72 6e 67 2d 3e 50 6f 69  0; iv < rng->Poi
2fb40 6e 74 73 3b 20 69 76 2b 2b 29 0a 09 09 20 20 7b  nts; iv++)...  {
2fb50 0a 09 09 20 20 20 20 20 20 69 66 20 28 28 70 74  ...      if ((pt
2fb60 72 20 2d 20 62 75 66 29 20 3e 20 31 30 32 34 29  r - buf) > 1024)
2fb70 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 2f 2a 20  ....{....    /* 
2fb80 66 6c 75 73 68 69 6e 67 20 74 68 65 20 69 6e 74  flushing the int
2fb90 65 72 6e 61 6c 20 62 75 66 66 65 72 20 2a 2f 0a  ernal buffer */.
2fba0 09 09 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20  ...    *ptr++ = 
2fbb0 27 5c 30 27 3b 0a 09 09 09 20 20 20 20 67 61 69  '\0';....    gai
2fbc0 61 41 70 70 65 6e 64 54 6f 4f 75 74 42 75 66 66  aAppendToOutBuff
2fbd0 65 72 20 28 6f 75 74 5f 62 75 66 2c 20 62 75 66  er (out_buf, buf
2fbe0 29 3b 0a 09 09 09 20 20 20 20 70 74 72 20 3d 20  );....    ptr = 
2fbf0 62 75 66 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20  buf;....}...    
2fc00 20 20 67 61 69 61 52 69 6e 67 47 65 74 50 6f 69    gaiaRingGetPoi
2fc10 6e 74 20 28 72 6e 67 2c 20 69 76 2c 20 26 78 2c  nt (rng, iv, &x,
2fc20 20 26 79 2c 20 26 7a 2c 20 26 6d 29 3b 0a 09 09   &y, &z, &m);...
2fc30 20 20 20 20 20 20 67 61 69 61 45 78 70 6f 72 74        gaiaExport
2fc40 36 34 20 28 65 6e 64 69 61 6e 5f 62 75 66 2c 20  64 (endian_buf, 
2fc50 78 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  x, 1, endian_arc
2fc60 68 29 3b 09 2f 2a 20 58 20 2d 20 69 6e 74 65 72  h);./* X - inter
2fc70 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 09 20 20  ior ring */...  
2fc80 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20      for (i = 0; 
2fc90 69 20 3c 20 38 3b 20 69 2b 2b 29 0a 09 09 09 7b  i < 8; i++)....{
2fca0 0a 09 09 09 20 20 20 20 73 70 72 69 6e 74 66 20  ....    sprintf 
2fcb0 28 62 79 74 65 2c 20 22 25 30 32 58 22 2c 20 65  (byte, "%02X", e
2fcc0 6e 64 69 61 6e 5f 62 75 66 5b 69 5d 29 3b 0a 09  ndian_buf[i]);..
2fcd0 09 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 62  ..    *ptr++ = b
2fce0 79 74 65 5b 30 5d 3b 0a 09 09 09 20 20 20 20 2a  yte[0];....    *
2fcf0 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b 31 5d 3b  ptr++ = byte[1];
2fd00 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 67 61  ....}...      ga
2fd10 69 61 45 78 70 6f 72 74 36 34 20 28 65 6e 64 69  iaExport64 (endi
2fd20 61 6e 5f 62 75 66 2c 20 79 2c 20 31 2c 20 65 6e  an_buf, y, 1, en
2fd30 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 59  dian_arch);./* Y
2fd40 20 2d 20 69 6e 74 65 72 69 6f 72 20 72 69 6e 67   - interior ring
2fd50 20 2a 2f 0a 09 09 20 20 20 20 20 20 66 6f 72 20   */...      for 
2fd60 28 69 20 3d 20 30 3b 20 69 20 3c 20 38 3b 20 69  (i = 0; i < 8; i
2fd70 2b 2b 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20  ++)....{....    
2fd80 73 70 72 69 6e 74 66 20 28 62 79 74 65 2c 20 22  sprintf (byte, "
2fd90 25 30 32 58 22 2c 20 65 6e 64 69 61 6e 5f 62 75  %02X", endian_bu
2fda0 66 5b 69 5d 29 3b 0a 09 09 09 20 20 20 20 2a 70  f[i]);....    *p
2fdb0 74 72 2b 2b 20 3d 20 62 79 74 65 5b 30 5d 3b 0a  tr++ = byte[0];.
2fdc0 09 09 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20  ...    *ptr++ = 
2fdd0 62 79 74 65 5b 31 5d 3b 0a 09 09 09 7d 0a 09 09  byte[1];....}...
2fde0 20 20 20 20 20 20 69 66 20 28 67 65 6f 6d 2d 3e        if (geom->
2fdf0 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
2fe00 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09 09 09  = GAIA_XY_Z)....
2fe10 7b 0a 09 09 09 20 20 20 20 67 61 69 61 45 78 70  {....    gaiaExp
2fe20 6f 72 74 36 34 20 28 65 6e 64 69 61 6e 5f 62 75  ort64 (endian_bu
2fe30 66 2c 20 7a 2c 20 31 2c 20 65 6e 64 69 61 6e 5f  f, z, 1, endian_
2fe40 61 72 63 68 29 3b 09 2f 2a 20 5a 20 2a 2f 0a 09  arch);./* Z */..
2fe50 09 09 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30  ..    for (i = 0
2fe60 3b 20 69 20 3c 20 38 3b 20 69 2b 2b 29 0a 09 09  ; i < 8; i++)...
2fe70 09 20 20 20 20 20 20 7b 0a 09 09 09 09 20 20 73  .      {.....  s
2fe80 70 72 69 6e 74 66 20 28 62 79 74 65 2c 20 22 25  printf (byte, "%
2fe90 30 32 58 22 2c 20 65 6e 64 69 61 6e 5f 62 75 66  02X", endian_buf
2fea0 5b 69 5d 29 3b 0a 09 09 09 09 20 20 2a 70 74 72  [i]);.....  *ptr
2feb0 2b 2b 20 3d 20 62 79 74 65 5b 30 5d 3b 0a 09 09  ++ = byte[0];...
2fec0 09 09 20 20 2a 70 74 72 2b 2b 20 3d 20 62 79 74  ..  *ptr++ = byt
2fed0 65 5b 31 5d 3b 0a 09 09 09 20 20 20 20 20 20 7d  e[1];....      }
2fee0 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 65 6c  ....}...      el
2fef0 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d  se if (geom->Dim
2ff00 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
2ff10 41 49 41 5f 58 59 5f 4d 29 0a 09 09 09 7b 0a 09  AIA_XY_M)....{..
2ff20 09 09 20 20 20 20 67 61 69 61 45 78 70 6f 72 74  ..    gaiaExport
2ff30 36 34 20 28 65 6e 64 69 61 6e 5f 62 75 66 2c 20  64 (endian_buf, 
2ff40 6d 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63  m, 1, endian_arc
2ff50 68 29 3b 09 2f 2a 20 4d 20 2a 2f 0a 09 09 09 20  h);./* M */.... 
2ff60 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69     for (i = 0; i
2ff70 20 3c 20 38 3b 20 69 2b 2b 29 0a 09 09 09 20 20   < 8; i++)....  
2ff80 20 20 20 20 7b 0a 09 09 09 09 20 20 73 70 72 69      {.....  spri
2ff90 6e 74 66 20 28 62 79 74 65 2c 20 22 25 30 32 58  ntf (byte, "%02X
2ffa0 22 2c 20 65 6e 64 69 61 6e 5f 62 75 66 5b 69 5d  ", endian_buf[i]
2ffb0 29 3b 0a 09 09 09 09 20 20 2a 70 74 72 2b 2b 20  );.....  *ptr++ 
2ffc0 3d 20 62 79 74 65 5b 30 5d 3b 0a 09 09 09 09 20  = byte[0];..... 
2ffd0 20 2a 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b 31   *ptr++ = byte[1
2ffe0 5d 3b 0a 09 09 09 20 20 20 20 20 20 7d 0a 09 09  ];....      }...
2fff0 09 7d 0a 09 09 20 20 20 20 20 20 65 6c 73 65 20  .}...      else 
30000 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73  if (geom->Dimens
30010 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41  ionModel == GAIA
30020 5f 58 59 5f 5a 5f 4d 29 0a 09 09 09 7b 0a 09 09  _XY_Z_M)....{...
30030 09 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 36  .    gaiaExport6
30040 34 20 28 65 6e 64 69 61 6e 5f 62 75 66 2c 20 7a  4 (endian_buf, z
30050 2c 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  , 1, endian_arch
30060 29 3b 09 2f 2a 20 5a 20 2a 2f 0a 09 09 09 20 20  );./* Z */....  
30070 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20    for (i = 0; i 
30080 3c 20 38 3b 20 69 2b 2b 29 0a 09 09 09 20 20 20  < 8; i++)....   
30090 20 20 20 7b 0a 09 09 09 09 20 20 73 70 72 69 6e     {.....  sprin
300a0 74 66 20 28 62 79 74 65 2c 20 22 25 30 32 58 22  tf (byte, "%02X"
300b0 2c 20 65 6e 64 69 61 6e 5f 62 75 66 5b 69 5d 29  , endian_buf[i])
300c0 3b 0a 09 09 09 09 20 20 2a 70 74 72 2b 2b 20 3d  ;.....  *ptr++ =
300d0 20 62 79 74 65 5b 30 5d 3b 0a 09 09 09 09 20 20   byte[0];.....  
300e0 2a 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b 31 5d  *ptr++ = byte[1]
300f0 3b 0a 09 09 09 20 20 20 20 20 20 7d 0a 09 09 09  ;....      }....
30100 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 36 34      gaiaExport64
30110 20 28 65 6e 64 69 61 6e 5f 62 75 66 2c 20 6d 2c   (endian_buf, m,
30120 20 31 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29   1, endian_arch)
30130 3b 09 2f 2a 20 4d 20 2a 2f 0a 09 09 09 20 20 20  ;./* M */....   
30140 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c   for (i = 0; i <
30150 20 38 3b 20 69 2b 2b 29 0a 09 09 09 20 20 20 20   8; i++)....    
30160 20 20 7b 0a 09 09 09 09 20 20 73 70 72 69 6e 74    {.....  sprint
30170 66 20 28 62 79 74 65 2c 20 22 25 30 32 58 22 2c  f (byte, "%02X",
30180 20 65 6e 64 69 61 6e 5f 62 75 66 5b 69 5d 29 3b   endian_buf[i]);
30190 0a 09 09 09 09 20 20 2a 70 74 72 2b 2b 20 3d 20  .....  *ptr++ = 
301a0 62 79 74 65 5b 30 5d 3b 0a 09 09 09 09 20 20 2a  byte[0];.....  *
301b0 70 74 72 2b 2b 20 3d 20 62 79 74 65 5b 31 5d 3b  ptr++ = byte[1];
301c0 0a 09 09 09 20 20 20 20 20 20 7d 0a 09 09 09 7d  ....      }....}
301d0 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20  ...  }..    }.. 
301e0 20 70 6f 6c 79 67 20 3d 20 70 6f 6c 79 67 2d 3e   polyg = polyg->
301f0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 2f  Next;.      }../
30200 2a 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 74 68  * terminating th
30210 65 20 45 57 4b 42 20 73 74 72 69 6e 67 20 2a 2f  e EWKB string */
30220 0a 20 20 20 20 2a 70 74 72 20 3d 20 27 5c 30 27  .    *ptr = '\0'
30230 3b 0a 20 20 20 20 67 61 69 61 41 70 70 65 6e 64  ;.    gaiaAppend
30240 54 6f 4f 75 74 42 75 66 66 65 72 20 28 6f 75 74  ToOutBuffer (out
30250 5f 62 75 66 2c 20 62 75 66 29 3b 0a 7d 0a 0a 73  _buf, buf);.}..s
30260 74 61 74 69 63 20 69 6e 74 0a 63 68 65 63 6b 46  tatic int.checkF
30270 67 66 54 79 70 65 44 69 6d 73 20 28 69 6e 74 20  gfTypeDims (int 
30280 66 67 66 5f 74 79 70 65 2c 20 69 6e 74 20 66 67  fgf_type, int fg
30290 66 5f 64 69 6d 73 2c 20 69 6e 74 20 2a 74 79 70  f_dims, int *typ
302a0 65 2c 20 69 6e 74 20 2a 64 69 6d 73 29 0a 7b 0a  e, int *dims).{.
302b0 2f 2a 20 76 61 6c 69 64 61 74 69 6e 67 20 54 79  /* validating Ty
302c0 70 65 20 61 6e 64 20 63 6f 6f 72 64 69 6e 61 74  pe and coordinat
302d0 65 20 44 69 6d 65 6e 73 69 6f 6e 73 20 66 6f 72  e Dimensions for
302e0 20 61 6e 20 46 47 46 20 47 65 6f 6d 65 74 72 79   an FGF Geometry
302f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 20 3d 20   */.    int t = 
30300 2d 31 3b 0a 20 20 20 20 69 6e 74 20 64 20 3d 20  -1;.    int d = 
30310 2d 31 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28  -1;.    switch (
30320 66 67 66 5f 74 79 70 65 29 0a 20 20 20 20 20 20  fgf_type).      
30330 7b 0a 20 20 20 20 20 20 63 61 73 65 20 31 3a 0a  {.      case 1:.
30340 09 20 20 74 20 3d 20 47 41 49 41 5f 50 4f 49 4e  .  t = GAIA_POIN
30350 54 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  T;..  break;.   
30360 20 20 20 63 61 73 65 20 32 3a 0a 09 20 20 74 20     case 2:..  t 
30370 3d 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e  = GAIA_LINESTRIN
30380 47 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20  G;..  break;.   
30390 20 20 20 63 61 73 65 20 33 3a 0a 09 20 20 74 20     case 3:..  t 
303a0 3d 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 3b 0a  = GAIA_POLYGON;.
303b0 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
303c0 63 61 73 65 20 34 3a 0a 09 20 20 74 20 3d 20 47  case 4:..  t = G
303d0 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e 54 3b 0a  AIA_MULTIPOINT;.
303e0 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  .  break;.      
303f0 63 61 73 65 20 35 3a 0a 09 20 20 74 20 3d 20 47  case 5:..  t = G
30400 41 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52  AIA_MULTILINESTR
30410 49 4e 47 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20  ING;..  break;. 
30420 20 20 20 20 20 63 61 73 65 20 36 3a 0a 09 20 20       case 6:..  
30430 74 20 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f  t = GAIA_MULTIPO
30440 4c 59 47 4f 4e 3b 0a 09 20 20 62 72 65 61 6b 3b  LYGON;..  break;
30450 0a 20 20 20 20 20 20 63 61 73 65 20 37 3a 0a 09  .      case 7:..
30460 20 20 74 20 3d 20 47 41 49 41 5f 47 45 4f 4d 45    t = GAIA_GEOME
30470 54 52 59 43 4f 4c 4c 45 43 54 49 4f 4e 3b 0a 09  TRYCOLLECTION;..
30480 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
30490 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 66 67  ;.    switch (fg
304a0 66 5f 64 69 6d 73 29 0a 20 20 20 20 20 20 7b 0a  f_dims).      {.
304b0 20 20 20 20 20 20 63 61 73 65 20 30 3a 0a 09 20        case 0:.. 
304c0 20 64 20 3d 20 47 41 49 41 5f 58 59 3b 0a 09 20   d = GAIA_XY;.. 
304d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
304e0 73 65 20 31 3a 0a 09 20 20 64 20 3d 20 47 41 49  se 1:..  d = GAI
304f0 41 5f 58 59 5f 5a 3b 0a 09 20 20 62 72 65 61 6b  A_XY_Z;..  break
30500 3b 0a 20 20 20 20 20 20 63 61 73 65 20 32 3a 0a  ;.      case 2:.
30510 09 20 20 64 20 3d 20 47 41 49 41 5f 58 59 5f 4d  .  d = GAIA_XY_M
30520 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;..  break;.    
30530 20 20 63 61 73 65 20 33 3a 0a 09 20 20 64 20 3d    case 3:..  d =
30540 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 3b 0a 09 20   GAIA_XY_Z_M;.. 
30550 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 3b   break;.      };
30560 0a 20 20 20 20 69 66 20 28 74 20 3c 20 30 20 7c  .    if (t < 0 |
30570 7c 20 64 20 3c 20 30 29 0a 09 72 65 74 75 72 6e  | d < 0)..return
30580 20 30 3b 0a 20 20 20 20 2a 74 79 70 65 20 3d 20   0;.    *type = 
30590 74 3b 0a 20 20 20 20 2a 64 69 6d 73 20 3d 20 64  t;.    *dims = d
305a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
305b0 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 70 6f  }..static int.po
305c0 69 6e 74 46 72 6f 6d 46 67 66 20 28 67 61 69 61  intFromFgf (gaia
305d0 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d  GeomCollPtr geom
305e0 2c 20 69 6e 74 20 65 6e 64 69 61 6e 5f 61 72 63  , int endian_arc
305f0 68 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  h, const unsigne
30600 64 20 63 68 61 72 20 2a 62 6c 6f 62 2c 0a 09 20  d char *blob,.. 
30610 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e       unsigned in
30620 74 20 73 69 7a 65 2c 20 75 6e 73 69 67 6e 65 64  t size, unsigned
30630 20 69 6e 74 20 2a 63 6f 6e 73 75 6d 65 64 29 0a   int *consumed).
30640 7b 0a 2f 2a 20 64 65 63 6f 64 69 6e 67 20 61 20  {./* decoding a 
30650 50 4f 49 4e 54 20 47 65 6f 6d 65 74 72 79 20 66  POINT Geometry f
30660 72 6f 6d 20 46 47 46 20 20 2a 2f 0a 20 20 20 20  rom FGF  */.    
30670 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 64 6f  double x;.    do
30680 75 62 6c 65 20 79 3b 0a 20 20 20 20 64 6f 75 62  uble y;.    doub
30690 6c 65 20 7a 3b 0a 20 20 20 20 64 6f 75 62 6c 65  le z;.    double
306a0 20 6d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   m;.    unsigned
306b0 20 69 6e 74 20 73 7a 20 3d 20 73 69 7a 65 3b 0a   int sz = size;.
306c0 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
306d0 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20 62  ed char *ptr = b
306e0 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 74 3b 0a  lob;.    int t;.
306f0 20 20 20 20 69 6e 74 20 64 3b 0a 20 20 20 20 69      int d;.    i
30700 6e 74 20 67 65 6f 6d 5f 74 79 70 65 3b 0a 20 20  nt geom_type;.  
30710 20 20 69 6e 74 20 64 69 6d 73 3b 0a 20 20 20 20    int dims;.    
30720 69 6e 74 20 6e 64 69 6d 73 3b 0a 0a 2f 2a 20 63  int ndims;../* c
30730 68 65 63 6b 69 6e 67 20 47 65 6f 6d 65 74 72 79  hecking Geometry
30740 20 54 79 70 65 20 61 6e 64 20 44 69 6d 73 20 2a   Type and Dims *
30750 2f 0a 20 20 20 20 69 66 20 28 73 7a 20 3c 20 38  /.    if (sz < 8
30760 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20  )..return 0;.   
30770 20 74 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 33   t = gaiaImport3
30780 32 20 28 70 74 72 2c 20 47 41 49 41 5f 4c 49 54  2 (ptr, GAIA_LIT
30790 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65 6e 64 69  TLE_ENDIAN, endi
307a0 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20 64 20  an_arch);.    d 
307b0 3d 20 67 61 69 61 49 6d 70 6f 72 74 33 32 20 28  = gaiaImport32 (
307c0 70 74 72 20 2b 20 34 2c 20 47 41 49 41 5f 4c 49  ptr + 4, GAIA_LI
307d0 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65 6e 64  TTLE_ENDIAN, end
307e0 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20 69  ian_arch);.    i
307f0 66 20 28 21 63 68 65 63 6b 46 67 66 54 79 70 65  f (!checkFgfType
30800 44 69 6d 73 20 28 74 2c 20 64 2c 20 26 67 65 6f  Dims (t, d, &geo
30810 6d 5f 74 79 70 65 2c 20 26 64 69 6d 73 29 29 0a  m_type, &dims)).
30820 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69  .return 0;.    i
30830 66 20 28 67 65 6f 6d 5f 74 79 70 65 20 21 3d 20  f (geom_type != 
30840 47 41 49 41 5f 50 4f 49 4e 54 29 0a 09 72 65 74  GAIA_POINT)..ret
30850 75 72 6e 20 30 3b 0a 20 20 20 20 70 74 72 20 2b  urn 0;.    ptr +
30860 3d 20 38 3b 0a 20 20 20 20 73 7a 20 2d 3d 20 38  = 8;.    sz -= 8
30870 3b 0a 0a 20 20 20 20 69 66 20 28 64 69 6d 73 20  ;..    if (dims 
30880 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a  == GAIA_XY_Z_M).
30890 09 6e 64 69 6d 73 20 3d 20 34 3b 0a 20 20 20 20  .ndims = 4;.    
308a0 65 6c 73 65 20 69 66 20 28 64 69 6d 73 20 3d 3d  else if (dims ==
308b0 20 47 41 49 41 5f 58 59 5f 5a 20 7c 7c 20 64 69   GAIA_XY_Z || di
308c0 6d 73 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29  ms == GAIA_XY_M)
308d0 0a 09 6e 64 69 6d 73 20 3d 20 33 3b 0a 20 20 20  ..ndims = 3;.   
308e0 20 65 6c 73 65 0a 09 6e 64 69 6d 73 20 3d 20 32   else..ndims = 2
308f0 3b 0a 20 20 20 20 69 66 20 28 73 7a 20 3c 20 28  ;.    if (sz < (
30900 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6e  (unsigned int) n
30910 64 69 6d 73 20 2a 20 38 29 29 0a 09 72 65 74 75  dims * 8))..retu
30920 72 6e 20 30 3b 0a 20 20 20 20 69 66 20 28 63 6f  rn 0;.    if (co
30930 6e 73 75 6d 65 64 29 0a 09 2a 63 6f 6e 73 75 6d  nsumed)..*consum
30940 65 64 20 3d 20 38 20 2b 20 28 6e 64 69 6d 73 20  ed = 8 + (ndims 
30950 2a 20 38 29 3b 0a 20 20 20 20 69 66 20 28 64 69  * 8);.    if (di
30960 6d 73 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29  ms == GAIA_XY_Z)
30970 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 70  .      {..  /* p
30980 61 72 73 69 6e 67 20 61 20 50 4f 49 4e 54 20 5a  arsing a POINT Z
30990 20 2a 2f 0a 09 20 20 78 20 3d 20 67 61 69 61 49   */..  x = gaiaI
309a0 6d 70 6f 72 74 36 34 20 28 70 74 72 2c 20 47 41  mport64 (ptr, GA
309b0 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e  IA_LITTLE_ENDIAN
309c0 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  , endian_arch);.
309d0 09 20 20 79 20 3d 20 67 61 69 61 49 6d 70 6f 72  .  y = gaiaImpor
309e0 74 36 34 20 28 70 74 72 20 2b 20 38 2c 20 47 41  t64 (ptr + 8, GA
309f0 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e  IA_LITTLE_ENDIAN
30a00 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  , endian_arch);.
30a10 09 20 20 7a 20 3d 20 67 61 69 61 49 6d 70 6f 72  .  z = gaiaImpor
30a20 74 36 34 20 28 70 74 72 20 2b 20 31 36 2c 20 47  t64 (ptr + 16, G
30a30 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41  AIA_LITTLE_ENDIA
30a40 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  N, endian_arch);
30a50 0a 09 20 20 6d 20 3d 20 30 2e 30 3b 0a 20 20 20  ..  m = 0.0;.   
30a60 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
30a70 20 28 64 69 6d 73 20 3d 3d 20 47 41 49 41 5f 58   (dims == GAIA_X
30a80 59 5f 4d 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  Y_M).      {..  
30a90 2f 2a 20 70 61 72 73 69 6e 67 20 74 68 65 20 50  /* parsing the P
30aa0 4f 49 4e 54 4d 20 2a 2f 0a 09 20 20 78 20 3d 20  OINTM */..  x = 
30ab0 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28 70 74  gaiaImport64 (pt
30ac0 72 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45  r, GAIA_LITTLE_E
30ad0 4e 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72  NDIAN, endian_ar
30ae0 63 68 29 3b 0a 09 20 20 79 20 3d 20 67 61 69 61  ch);..  y = gaia
30af0 49 6d 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20  Import64 (ptr + 
30b00 38 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45  8, GAIA_LITTLE_E
30b10 4e 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72  NDIAN, endian_ar
30b20 63 68 29 3b 0a 09 20 20 6d 20 3d 20 67 61 69 61  ch);..  m = gaia
30b30 49 6d 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20  Import64 (ptr + 
30b40 31 36 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f  16, GAIA_LITTLE_
30b50 45 4e 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61  ENDIAN, endian_a
30b60 72 63 68 29 3b 0a 09 20 20 7a 20 3d 20 30 2e 30  rch);..  z = 0.0
30b70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
30b80 73 65 20 69 66 20 28 64 69 6d 73 20 3d 3d 20 47  se if (dims == G
30b90 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 20 20 20 20  AIA_XY_Z_M).    
30ba0 20 20 7b 0a 09 20 20 2f 2a 20 70 61 72 73 69 6e    {..  /* parsin
30bb0 67 20 74 68 65 20 50 4f 49 4e 54 5a 4d 20 2a 2f  g the POINTZM */
30bc0 0a 09 20 20 78 20 3d 20 67 61 69 61 49 6d 70 6f  ..  x = gaiaImpo
30bd0 72 74 36 34 20 28 70 74 72 2c 20 47 41 49 41 5f  rt64 (ptr, GAIA_
30be0 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65  LITTLE_ENDIAN, e
30bf0 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 20 20  ndian_arch);..  
30c00 79 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34  y = gaiaImport64
30c10 20 28 70 74 72 20 2b 20 38 2c 20 47 41 49 41 5f   (ptr + 8, GAIA_
30c20 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65  LITTLE_ENDIAN, e
30c30 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 20 20  ndian_arch);..  
30c40 7a 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34  z = gaiaImport64
30c50 20 28 70 74 72 20 2b 20 31 36 2c 20 47 41 49 41   (ptr + 16, GAIA
30c60 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20  _LITTLE_ENDIAN, 
30c70 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 20  endian_arch);.. 
30c80 20 6d 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36   m = gaiaImport6
30c90 34 20 28 70 74 72 20 2b 20 32 34 2c 20 47 41 49  4 (ptr + 24, GAI
30ca0 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c  A_LITTLE_ENDIAN,
30cb0 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20   endian_arch);. 
30cc0 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a       }.    else.
30cd0 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 70 61        {..  /* pa
30ce0 72 73 69 6e 67 20 74 68 65 20 50 4f 49 4e 54 20  rsing the POINT 
30cf0 2a 2f 0a 09 20 20 78 20 3d 20 67 61 69 61 49 6d  */..  x = gaiaIm
30d00 70 6f 72 74 36 34 20 28 70 74 72 2c 20 47 41 49  port64 (ptr, GAI
30d10 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c  A_LITTLE_ENDIAN,
30d20 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09   endian_arch);..
30d30 20 20 79 20 3d 20 67 61 69 61 49 6d 70 6f 72 74    y = gaiaImport
30d40 36 34 20 28 70 74 72 20 2b 20 38 2c 20 47 41 49  64 (ptr + 8, GAI
30d50 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c  A_LITTLE_ENDIAN,
30d60 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09   endian_arch);..
30d70 20 20 7a 20 3d 20 30 2e 30 3b 0a 09 20 20 6d 20    z = 0.0;..  m 
30d80 3d 20 30 2e 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  = 0.0;.      }..
30d90 20 20 20 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69      if (geom->Di
30da0 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20  mensionModel == 
30db0 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 67 61  GAIA_XY_Z_M)..ga
30dc0 69 61 41 64 64 50 6f 69 6e 74 54 6f 47 65 6f 6d  iaAddPointToGeom
30dd0 43 6f 6c 6c 58 59 5a 4d 20 28 67 65 6f 6d 2c 20  CollXYZM (geom, 
30de0 78 2c 20 79 2c 20 7a 2c 20 6d 29 3b 0a 20 20 20  x, y, z, m);.   
30df0 20 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e   else if (geom->
30e00 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d  DimensionModel =
30e10 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 09 67 61  = GAIA_XY_Z)..ga
30e20 69 61 41 64 64 50 6f 69 6e 74 54 6f 47 65 6f 6d  iaAddPointToGeom
30e30 43 6f 6c 6c 58 59 5a 20 28 67 65 6f 6d 2c 20 78  CollXYZ (geom, x
30e40 2c 20 79 2c 20 7a 29 3b 0a 20 20 20 20 65 6c 73  , y, z);.    els
30e50 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65  e if (geom->Dime
30e60 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41  nsionModel == GA
30e70 49 41 5f 58 59 5f 4d 29 0a 09 67 61 69 61 41 64  IA_XY_M)..gaiaAd
30e80 64 50 6f 69 6e 74 54 6f 47 65 6f 6d 43 6f 6c 6c  dPointToGeomColl
30e90 58 59 4d 20 28 67 65 6f 6d 2c 20 78 2c 20 79 2c  XYM (geom, x, y,
30ea0 20 6d 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09 67   m);.    else..g
30eb0 61 69 61 41 64 64 50 6f 69 6e 74 54 6f 47 65 6f  aiaAddPointToGeo
30ec0 6d 43 6f 6c 6c 20 28 67 65 6f 6d 2c 20 78 2c 20  mColl (geom, x, 
30ed0 79 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  y);.    return 1
30ee0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
30ef0 0a 73 65 74 46 67 66 56 65 72 74 65 78 20 28 69  .setFgfVertex (i
30f00 6e 74 20 64 69 6d 73 2c 20 64 6f 75 62 6c 65 20  nt dims, double 
30f10 2a 63 6f 6f 72 64 73 2c 20 69 6e 74 20 69 76 2c  *coords, int iv,
30f20 20 64 6f 75 62 6c 65 20 78 2c 20 64 6f 75 62 6c   double x, doubl
30f30 65 20 79 2c 20 64 6f 75 62 6c 65 20 7a 2c 0a 09  e y, double z,..
30f40 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6d 29 0a        double m).
30f50 7b 0a 2f 2a 20 73 65 74 74 69 6e 67 20 61 6e 20  {./* setting an 
30f60 46 47 46 20 76 65 72 74 65 78 20 61 63 63 6f 72  FGF vertex accor
30f70 69 67 6e 6c 79 20 74 6f 20 64 69 6d 65 6e 73 69  ignly to dimensi
30f80 6f 6e 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 64  ons */.    if (d
30f90 69 6d 73 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a  ims == GAIA_XY_Z
30fa0 5f 4d 29 0a 09 67 61 69 61 53 65 74 50 6f 69 6e  _M)..gaiaSetPoin
30fb0 74 58 59 5a 4d 20 28 63 6f 6f 72 64 73 2c 20 69  tXYZM (coords, i
30fc0 76 2c 20 78 2c 20 79 2c 20 7a 2c 20 6d 29 3b 0a  v, x, y, z, m);.
30fd0 20 20 20 20 69 66 20 28 64 69 6d 73 20 3d 3d 20      if (dims == 
30fe0 47 41 49 41 5f 58 59 5f 5a 29 0a 09 67 61 69 61  GAIA_XY_Z)..gaia
30ff0 53 65 74 50 6f 69 6e 74 58 59 5a 20 28 63 6f 6f  SetPointXYZ (coo
31000 72 64 73 2c 20 69 76 2c 20 78 2c 20 79 2c 20 7a  rds, iv, x, y, z
31010 29 3b 0a 20 20 20 20 69 66 20 28 64 69 6d 73 20  );.    if (dims 
31020 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 67  == GAIA_XY_M)..g
31030 61 69 61 53 65 74 50 6f 69 6e 74 58 59 4d 20 28  aiaSetPointXYM (
31040 63 6f 6f 72 64 73 2c 20 69 76 2c 20 78 2c 20 79  coords, iv, x, y
31050 2c 20 6d 29 3b 0a 20 20 20 20 69 66 20 28 64 69  , m);.    if (di
31060 6d 73 20 3d 3d 20 47 41 49 41 5f 58 59 29 0a 09  ms == GAIA_XY)..
31070 67 61 69 61 53 65 74 50 6f 69 6e 74 20 28 63 6f  gaiaSetPoint (co
31080 6f 72 64 73 2c 20 69 76 2c 20 78 2c 20 79 29 3b  ords, iv, x, y);
31090 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 6c  .}..static int.l
310a0 69 6e 65 73 74 72 69 6e 67 46 72 6f 6d 46 67 66  inestringFromFgf
310b0 20 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74   (gaiaGeomCollPt
310c0 72 20 67 65 6f 6d 2c 20 69 6e 74 20 65 6e 64 69  r geom, int endi
310d0 61 6e 5f 61 72 63 68 2c 0a 09 09 20 20 20 63 6f  an_arch,...   co
310e0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
310f0 72 20 2a 62 6c 6f 62 2c 20 75 6e 73 69 67 6e 65  r *blob, unsigne
31100 64 20 69 6e 74 20 73 69 7a 65 2c 0a 09 09 20 20  d int size,...  
31110 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 63   unsigned int *c
31120 6f 6e 73 75 6d 65 64 29 0a 7b 0a 2f 2a 20 64 65  onsumed).{./* de
31130 63 6f 64 69 6e 67 20 61 20 4c 49 4e 45 53 54 52  coding a LINESTR
31140 49 4e 47 20 47 65 6f 6d 65 74 72 79 20 66 72 6f  ING Geometry fro
31150 6d 20 46 47 46 20 20 2a 2f 0a 20 20 20 20 67 61  m FGF  */.    ga
31160 69 61 4c 69 6e 65 73 74 72 69 6e 67 50 74 72 20  iaLinestringPtr 
31170 6c 6e 3b 0a 20 20 20 20 69 6e 74 20 70 74 73 3b  ln;.    int pts;
31180 0a 20 20 20 20 69 6e 74 20 69 76 3b 0a 20 20 20  .    int iv;.   
31190 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 64   double x;.    d
311a0 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 64 6f 75  ouble y;.    dou
311b0 62 6c 65 20 7a 3b 0a 20 20 20 20 64 6f 75 62 6c  ble z;.    doubl
311c0 65 20 6d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  e m;.    unsigne
311d0 64 20 69 6e 74 20 6c 6e 5f 73 7a 3b 0a 20 20 20  d int ln_sz;.   
311e0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 73 7a   unsigned int sz
311f0 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 63 6f 6e   = size;.    con
31200 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
31210 20 2a 70 74 72 20 3d 20 62 6c 6f 62 3b 0a 20 20   *ptr = blob;.  
31220 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 69 6e 74    int t;.    int
31230 20 64 3b 0a 20 20 20 20 69 6e 74 20 67 65 6f 6d   d;.    int geom
31240 5f 74 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 64  _type;.    int d
31250 69 6d 73 3b 0a 20 20 20 20 69 6e 74 20 6e 64 69  ims;.    int ndi
31260 6d 73 3b 0a 0a 2f 2a 20 63 68 65 63 6b 69 6e 67  ms;../* checking
31270 20 47 65 6f 6d 65 74 72 79 20 54 79 70 65 20 61   Geometry Type a
31280 6e 64 20 44 69 6d 73 20 2a 2f 0a 20 20 20 20 69  nd Dims */.    i
31290 66 20 28 73 7a 20 3c 20 38 29 0a 09 72 65 74 75  f (sz < 8)..retu
312a0 72 6e 20 30 3b 0a 20 20 20 20 74 20 3d 20 67 61  rn 0;.    t = ga
312b0 69 61 49 6d 70 6f 72 74 33 32 20 28 70 74 72 2c  iaImport32 (ptr,
312c0 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44   GAIA_LITTLE_END
312d0 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  IAN, endian_arch
312e0 29 3b 0a 20 20 20 20 64 20 3d 20 67 61 69 61 49  );.    d = gaiaI
312f0 6d 70 6f 72 74 33 32 20 28 70 74 72 20 2b 20 34  mport32 (ptr + 4
31300 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e  , GAIA_LITTLE_EN
31310 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63  DIAN, endian_arc
31320 68 29 3b 0a 20 20 20 20 69 66 20 28 21 63 68 65  h);.    if (!che
31330 63 6b 46 67 66 54 79 70 65 44 69 6d 73 20 28 74  ckFgfTypeDims (t
31340 2c 20 64 2c 20 26 67 65 6f 6d 5f 74 79 70 65 2c  , d, &geom_type,
31350 20 26 64 69 6d 73 29 29 0a 09 72 65 74 75 72 6e   &dims))..return
31360 20 30 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 6d   0;.    if (geom
31370 5f 74 79 70 65 20 21 3d 20 47 41 49 41 5f 4c 49  _type != GAIA_LI
31380 4e 45 53 54 52 49 4e 47 29 0a 09 72 65 74 75 72  NESTRING)..retur
31390 6e 20 30 3b 0a 20 20 20 20 70 74 72 20 2b 3d 20  n 0;.    ptr += 
313a0 38 3b 0a 20 20 20 20 73 7a 20 2d 3d 20 38 3b 0a  8;.    sz -= 8;.
313b0 20 20 20 20 69 66 20 28 64 69 6d 73 20 3d 3d 20      if (dims == 
313c0 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 6e 64  GAIA_XY_Z_M)..nd
313d0 69 6d 73 20 3d 20 34 3b 0a 20 20 20 20 65 6c 73  ims = 4;.    els
313e0 65 20 69 66 20 28 64 69 6d 73 20 3d 3d 20 47 41  e if (dims == GA
313f0 49 41 5f 58 59 5f 5a 20 7c 7c 20 64 69 6d 73 20  IA_XY_Z || dims 
31400 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 6e  == GAIA_XY_M)..n
31410 64 69 6d 73 20 3d 20 33 3b 0a 20 20 20 20 65 6c  dims = 3;.    el
31420 73 65 0a 09 6e 64 69 6d 73 20 3d 20 32 3b 0a 0a  se..ndims = 2;..
31430 2f 2a 20 68 6f 77 20 6d 61 6e 79 20 70 6f 69 6e  /* how many poin
31440 74 73 20 61 72 65 20 74 68 65 72 65 20 3f 20 2a  ts are there ? *
31450 2f 0a 20 20 20 20 69 66 20 28 73 7a 20 3c 20 34  /.    if (sz < 4
31460 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20  )..return 0;.   
31470 20 70 74 73 20 3d 20 67 61 69 61 49 6d 70 6f 72   pts = gaiaImpor
31480 74 33 32 20 28 70 74 72 2c 20 47 41 49 41 5f 4c  t32 (ptr, GAIA_L
31490 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65 6e  ITTLE_ENDIAN, en
314a0 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20  dian_arch);.    
314b0 70 74 72 20 2b 3d 20 34 3b 0a 20 20 20 20 73 7a  ptr += 4;.    sz
314c0 20 2d 3d 20 34 3b 0a 20 20 20 20 6c 6e 5f 73 7a   -= 4;.    ln_sz
314d0 20 3d 20 70 74 73 20 2a 20 6e 64 69 6d 73 20 2a   = pts * ndims *
314e0 20 73 69 7a 65 6f 66 20 28 64 6f 75 62 6c 65 29   sizeof (double)
314f0 3b 0a 20 20 20 20 69 66 20 28 73 7a 20 3c 20 6c  ;.    if (sz < l
31500 6e 5f 73 7a 29 0a 09 72 65 74 75 72 6e 20 30 3b  n_sz)..return 0;
31510 0a 20 20 20 20 69 66 20 28 63 6f 6e 73 75 6d 65  .    if (consume
31520 64 29 0a 09 2a 63 6f 6e 73 75 6d 65 64 20 3d 20  d)..*consumed = 
31530 31 32 20 2b 20 28 70 74 73 20 2a 20 28 6e 64 69  12 + (pts * (ndi
31540 6d 73 20 2a 20 38 29 29 3b 0a 0a 20 20 20 20 6c  ms * 8));..    l
31550 6e 20 3d 20 67 61 69 61 41 64 64 4c 69 6e 65 73  n = gaiaAddLines
31560 74 72 69 6e 67 54 6f 47 65 6f 6d 43 6f 6c 6c 20  tringToGeomColl 
31570 28 67 65 6f 6d 2c 20 70 74 73 29 3b 0a 20 20 20  (geom, pts);.   
31580 20 69 66 20 28 64 69 6d 73 20 3d 3d 20 47 41 49   if (dims == GAI
31590 41 5f 58 59 5f 5a 29 0a 20 20 20 20 20 20 7b 0a  A_XY_Z).      {.
315a0 09 20 20 2f 2a 20 70 61 72 73 69 6e 67 20 74 68  .  /* parsing th
315b0 65 20 4c 49 4e 45 53 54 52 49 4e 47 5a 20 2a 2f  e LINESTRINGZ */
315c0 0a 09 20 20 66 6f 72 20 28 69 76 20 3d 20 30 3b  ..  for (iv = 0;
315d0 20 69 76 20 3c 20 70 74 73 3b 20 69 76 2b 2b 29   iv < pts; iv++)
315e0 0a 09 20 20 20 20 7b 0a 09 09 78 20 3d 20 67 61  ..    {...x = ga
315f0 69 61 49 6d 70 6f 72 74 36 34 20 28 70 74 72 2c  iaImport64 (ptr,
31600 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44   GAIA_LITTLE_END
31610 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  IAN, endian_arch
31620 29 3b 0a 09 09 79 20 3d 20 67 61 69 61 49 6d 70  );...y = gaiaImp
31630 6f 72 74 36 34 20 28 70 74 72 20 2b 20 38 2c 20  ort64 (ptr + 8, 
31640 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49  GAIA_LITTLE_ENDI
31650 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29  AN, endian_arch)
31660 3b 0a 09 09 7a 20 3d 20 67 61 69 61 49 6d 70 6f  ;...z = gaiaImpo
31670 72 74 36 34 20 28 70 74 72 20 2b 20 31 36 2c 20  rt64 (ptr + 16, 
31680 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49  GAIA_LITTLE_ENDI
31690 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29  AN, endian_arch)
316a0 3b 0a 09 09 6d 20 3d 20 30 2e 30 3b 0a 09 09 70  ;...m = 0.0;...p
316b0 74 72 20 2b 3d 20 32 34 3b 0a 09 09 73 65 74 46  tr += 24;...setF
316c0 67 66 56 65 72 74 65 78 20 28 64 69 6d 73 2c 20  gfVertex (dims, 
316d0 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20  ln->Coords, iv, 
316e0 78 2c 20 79 2c 20 7a 2c 20 6d 29 3b 0a 09 20 20  x, y, z, m);..  
316f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
31700 65 6c 73 65 20 69 66 20 28 64 69 6d 73 20 3d 3d  else if (dims ==
31710 20 47 41 49 41 5f 58 59 5f 4d 29 0a 20 20 20 20   GAIA_XY_M).    
31720 20 20 7b 0a 09 20 20 2f 2a 20 70 61 72 73 69 6e    {..  /* parsin
31730 67 20 74 68 65 20 4c 49 4e 45 53 54 52 49 4e 47  g the LINESTRING
31740 4d 20 2a 2f 0a 09 20 20 66 6f 72 20 28 69 76 20  M */..  for (iv 
31750 3d 20 30 3b 20 69 76 20 3c 20 70 74 73 3b 20 69  = 0; iv < pts; i
31760 76 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09 78 20  v++)..    {...x 
31770 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28  = gaiaImport64 (
31780 70 74 72 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45  ptr, GAIA_LITTLE
31790 5f 45 4e 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f  _ENDIAN, endian_
317a0 61 72 63 68 29 3b 0a 09 09 79 20 3d 20 67 61 69  arch);...y = gai
317b0 61 49 6d 70 6f 72 74 36 34 20 28 70 74 72 20 2b  aImport64 (ptr +
317c0 20 38 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f   8, GAIA_LITTLE_
317d0 45 4e 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61  ENDIAN, endian_a
317e0 72 63 68 29 3b 0a 09 09 6d 20 3d 20 67 61 69 61  rch);...m = gaia
317f0 49 6d 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20  Import64 (ptr + 
31800 31 36 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f  16, GAIA_LITTLE_
31810 45 4e 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61  ENDIAN, endian_a
31820 72 63 68 29 3b 0a 09 09 7a 20 3d 20 30 2e 30 3b  rch);...z = 0.0;
31830 0a 09 09 70 74 72 20 2b 3d 20 32 34 3b 0a 09 09  ...ptr += 24;...
31840 73 65 74 46 67 66 56 65 72 74 65 78 20 28 64 69  setFgfVertex (di
31850 6d 73 2c 20 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20  ms, ln->Coords, 
31860 69 76 2c 20 78 2c 20 79 2c 20 7a 2c 20 6d 29 3b  iv, x, y, z, m);
31870 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a  ..    }.      }.
31880 20 20 20 20 65 6c 73 65 20 69 66 20 28 64 69 6d      else if (dim
31890 73 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  s == GAIA_XY_Z_M
318a0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20  ).      {..  /* 
318b0 70 61 72 73 69 6e 67 20 74 68 65 20 4c 49 4e 45  parsing the LINE
318c0 53 54 52 49 4e 47 5a 4d 20 2a 2f 0a 09 20 20 66  STRINGZM */..  f
318d0 6f 72 20 28 69 76 20 3d 20 30 3b 20 69 76 20 3c  or (iv = 0; iv <
318e0 20 70 74 73 3b 20 69 76 2b 2b 29 0a 09 20 20 20   pts; iv++)..   
318f0 20 7b 0a 09 09 78 20 3d 20 67 61 69 61 49 6d 70   {...x = gaiaImp
31900 6f 72 74 36 34 20 28 70 74 72 2c 20 47 41 49 41  ort64 (ptr, GAIA
31910 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20  _LITTLE_ENDIAN, 
31920 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09  endian_arch);...
31930 79 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34  y = gaiaImport64
31940 20 28 70 74 72 20 2b 20 38 2c 20 47 41 49 41 5f   (ptr + 8, GAIA_
31950 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65  LITTLE_ENDIAN, e
31960 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 7a  ndian_arch);...z
31970 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34 20   = gaiaImport64 
31980 28 70 74 72 20 2b 20 31 36 2c 20 47 41 49 41 5f  (ptr + 16, GAIA_
31990 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65  LITTLE_ENDIAN, e
319a0 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 6d  ndian_arch);...m
319b0 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34 20   = gaiaImport64 
319c0 28 70 74 72 20 2b 20 32 34 2c 20 47 41 49 41 5f  (ptr + 24, GAIA_
319d0 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65  LITTLE_ENDIAN, e
319e0 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 70  ndian_arch);...p
319f0 74 72 20 2b 3d 20 33 32 3b 0a 09 09 73 65 74 46  tr += 32;...setF
31a00 67 66 56 65 72 74 65 78 20 28 64 69 6d 73 2c 20  gfVertex (dims, 
31a10 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20  ln->Coords, iv, 
31a20 78 2c 20 79 2c 20 7a 2c 20 6d 29 3b 0a 09 20 20  x, y, z, m);..  
31a30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
31a40 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20  else.      {..  
31a50 2f 2a 20 70 61 72 73 69 6e 67 20 74 68 65 20 4c  /* parsing the L
31a60 49 4e 45 53 54 52 49 4e 47 20 2a 2f 0a 09 20 20  INESTRING */..  
31a70 66 6f 72 20 28 69 76 20 3d 20 30 3b 20 69 76 20  for (iv = 0; iv 
31a80 3c 20 70 74 73 3b 20 69 76 2b 2b 29 0a 09 20 20  < pts; iv++)..  
31a90 20 20 7b 0a 09 09 78 20 3d 20 67 61 69 61 49 6d    {...x = gaiaIm
31aa0 70 6f 72 74 36 34 20 28 70 74 72 2c 20 47 41 49  port64 (ptr, GAI
31ab0 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c  A_LITTLE_ENDIAN,
31ac0 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09   endian_arch);..
31ad0 09 79 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36  .y = gaiaImport6
31ae0 34 20 28 70 74 72 20 2b 20 73 69 7a 65 6f 66 20  4 (ptr + sizeof 
31af0 28 64 6f 75 62 6c 65 29 2c 20 47 41 49 41 5f 4c  (double), GAIA_L
31b00 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 0a 09 09  ITTLE_ENDIAN,...
31b10 09 09 20 20 65 6e 64 69 61 6e 5f 61 72 63 68 29  ..  endian_arch)
31b20 3b 0a 09 09 7a 20 3d 20 30 2e 30 3b 0a 09 09 6d  ;...z = 0.0;...m
31b30 20 3d 20 30 2e 30 3b 0a 09 09 70 74 72 20 2b 3d   = 0.0;...ptr +=
31b40 20 31 36 3b 0a 09 09 73 65 74 46 67 66 56 65 72   16;...setFgfVer
31b50 74 65 78 20 28 64 69 6d 73 2c 20 6c 6e 2d 3e 43  tex (dims, ln->C
31b60 6f 6f 72 64 73 2c 20 69 76 2c 20 78 2c 20 79 2c  oords, iv, x, y,
31b70 20 7a 2c 20 6d 29 3b 0a 09 20 20 20 20 7d 0a 20   z, m);..    }. 
31b80 20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72       }.    retur
31b90 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  n 1;.}..static i
31ba0 6e 74 0a 70 6f 6c 79 67 6f 6e 46 72 6f 6d 46 67  nt.polygonFromFg
31bb0 66 20 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50  f (gaiaGeomCollP
31bc0 74 72 20 67 65 6f 6d 2c 20 69 6e 74 20 65 6e 64  tr geom, int end
31bd0 69 61 6e 5f 61 72 63 68 2c 0a 09 09 63 6f 6e 73  ian_arch,...cons
31be0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
31bf0 2a 62 6c 6f 62 2c 20 75 6e 73 69 67 6e 65 64 20  *blob, unsigned 
31c00 69 6e 74 20 73 69 7a 65 2c 0a 09 09 75 6e 73 69  int size,...unsi
31c10 67 6e 65 64 20 69 6e 74 20 2a 63 6f 6e 73 75 6d  gned int *consum
31c20 65 64 29 0a 7b 0a 2f 2a 20 64 65 63 6f 64 69 6e  ed).{./* decodin
31c30 67 20 61 20 50 4f 4c 59 47 4f 4e 20 47 65 6f 6d  g a POLYGON Geom
31c40 65 74 72 79 20 66 72 6f 6d 20 46 47 46 20 20 2a  etry from FGF  *
31c50 2f 0a 20 20 20 20 67 61 69 61 50 6f 6c 79 67 6f  /.    gaiaPolygo
31c60 6e 50 74 72 20 70 67 20 3d 20 4e 55 4c 4c 3b 0a  nPtr pg = NULL;.
31c70 20 20 20 20 67 61 69 61 52 69 6e 67 50 74 72 20      gaiaRingPtr 
31c80 72 6e 67 3b 0a 20 20 20 20 69 6e 74 20 72 69 6e  rng;.    int rin
31c90 67 73 3b 0a 20 20 20 20 69 6e 74 20 69 72 3b 0a  gs;.    int ir;.
31ca0 20 20 20 20 69 6e 74 20 70 74 73 3b 0a 20 20 20      int pts;.   
31cb0 20 69 6e 74 20 69 76 3b 0a 20 20 20 20 64 6f 75   int iv;.    dou
31cc0 62 6c 65 20 78 3b 0a 20 20 20 20 64 6f 75 62 6c  ble x;.    doubl
31cd0 65 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  e y;.    double 
31ce0 7a 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 3b  z;.    double m;
31cf0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
31d00 74 20 72 6e 67 5f 73 7a 3b 0a 20 20 20 20 75 6e  t rng_sz;.    un
31d10 73 69 67 6e 65 64 20 69 6e 74 20 73 7a 20 3d 20  signed int sz = 
31d20 73 69 7a 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  size;.    const 
31d30 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
31d40 74 72 20 3d 20 62 6c 6f 62 3b 0a 20 20 20 20 69  tr = blob;.    i
31d50 6e 74 20 74 3b 0a 20 20 20 20 69 6e 74 20 64 3b  nt t;.    int d;
31d60 0a 20 20 20 20 69 6e 74 20 67 65 6f 6d 5f 74 79  .    int geom_ty
31d70 70 65 3b 0a 20 20 20 20 69 6e 74 20 64 69 6d 73  pe;.    int dims
31d80 3b 0a 20 20 20 20 69 6e 74 20 6e 64 69 6d 73 3b  ;.    int ndims;
31d90 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
31da0 74 20 62 79 74 65 73 20 3d 20 30 3b 0a 0a 2f 2a  t bytes = 0;../*
31db0 20 63 68 65 63 6b 69 6e 67 20 47 65 6f 6d 65 74   checking Geomet
31dc0 72 79 20 54 79 70 65 20 61 6e 64 20 44 69 6d 73  ry Type and Dims
31dd0 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 7a 20 3c   */.    if (sz <
31de0 20 38 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20   8)..return 0;. 
31df0 20 20 20 74 20 3d 20 67 61 69 61 49 6d 70 6f 72     t = gaiaImpor
31e00 74 33 32 20 28 70 74 72 2c 20 47 41 49 41 5f 4c  t32 (ptr, GAIA_L
31e10 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65 6e  ITTLE_ENDIAN, en
31e20 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20  dian_arch);.    
31e30 64 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 33 32  d = gaiaImport32
31e40 20 28 70 74 72 20 2b 20 34 2c 20 47 41 49 41 5f   (ptr + 4, GAIA_
31e50 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65  LITTLE_ENDIAN, e
31e60 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20  ndian_arch);.   
31e70 20 69 66 20 28 21 63 68 65 63 6b 46 67 66 54 79   if (!checkFgfTy
31e80 70 65 44 69 6d 73 20 28 74 2c 20 64 2c 20 26 67  peDims (t, d, &g
31e90 65 6f 6d 5f 74 79 70 65 2c 20 26 64 69 6d 73 29  eom_type, &dims)
31ea0 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20  )..return 0;.   
31eb0 20 69 66 20 28 67 65 6f 6d 5f 74 79 70 65 20 21   if (geom_type !
31ec0 3d 20 47 41 49 41 5f 50 4f 4c 59 47 4f 4e 29 0a  = GAIA_POLYGON).
31ed0 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70  .return 0;.    p
31ee0 74 72 20 2b 3d 20 38 3b 0a 20 20 20 20 73 7a 20  tr += 8;.    sz 
31ef0 2d 3d 20 38 3b 0a 20 20 20 20 62 79 74 65 73 20  -= 8;.    bytes 
31f00 2b 3d 20 38 3b 0a 20 20 20 20 69 66 20 28 64 69  += 8;.    if (di
31f10 6d 73 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f  ms == GAIA_XY_Z_
31f20 4d 29 0a 09 6e 64 69 6d 73 20 3d 20 34 3b 0a 20  M)..ndims = 4;. 
31f30 20 20 20 65 6c 73 65 20 69 66 20 28 64 69 6d 73     else if (dims
31f40 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 20 7c 7c   == GAIA_XY_Z ||
31f50 20 64 69 6d 73 20 3d 3d 20 47 41 49 41 5f 58 59   dims == GAIA_XY
31f60 5f 4d 29 0a 09 6e 64 69 6d 73 20 3d 20 33 3b 0a  _M)..ndims = 3;.
31f70 20 20 20 20 65 6c 73 65 0a 09 6e 64 69 6d 73 20      else..ndims 
31f80 3d 20 32 3b 0a 0a 2f 2a 20 68 6f 77 20 6d 61 6e  = 2;../* how man
31f90 79 20 72 69 6e 67 73 20 61 72 65 20 74 68 65 72  y rings are ther
31fa0 65 20 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  e ? */.    if (s
31fb0 7a 20 3c 20 34 29 0a 09 72 65 74 75 72 6e 20 30  z < 4)..return 0
31fc0 3b 0a 20 20 20 20 72 69 6e 67 73 20 3d 20 67 61  ;.    rings = ga
31fd0 69 61 49 6d 70 6f 72 74 33 32 20 28 70 74 72 2c  iaImport32 (ptr,
31fe0 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44   GAIA_LITTLE_END
31ff0 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  IAN, endian_arch
32000 29 3b 0a 20 20 20 20 70 74 72 20 2b 3d 20 34 3b  );.    ptr += 4;
32010 0a 20 20 20 20 73 7a 20 2d 3d 20 34 3b 0a 20 20  .    sz -= 4;.  
32020 20 20 62 79 74 65 73 20 2b 3d 20 34 3b 0a 20 20    bytes += 4;.  
32030 20 20 69 66 20 28 72 69 6e 67 73 20 3c 20 31 29    if (rings < 1)
32040 0a 09 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20  ..return 0;..   
32050 20 66 6f 72 20 28 69 72 20 3d 20 30 3b 20 69 72   for (ir = 0; ir
32060 20 3c 20 72 69 6e 67 73 3b 20 69 72 2b 2b 29 0a   < rings; ir++).
32070 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 66 65        {..  /* fe
32080 74 63 68 69 6e 67 20 50 6f 6c 79 67 6f 6e 27 73  tching Polygon's
32090 20 72 69 6e 67 73 20 2a 2f 0a 09 20 20 69 66 20   rings */..  if 
320a0 28 73 7a 20 3c 20 34 29 0a 09 20 20 20 20 20 20  (sz < 4)..      
320b0 72 65 74 75 72 6e 20 30 3b 0a 09 20 20 70 74 73  return 0;..  pts
320c0 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 33 32 20   = gaiaImport32 
320d0 28 70 74 72 2c 20 47 41 49 41 5f 4c 49 54 54 4c  (ptr, GAIA_LITTL
320e0 45 5f 45 4e 44 49 41 4e 2c 20 65 6e 64 69 61 6e  E_ENDIAN, endian
320f0 5f 61 72 63 68 29 3b 0a 09 20 20 70 74 72 20 2b  _arch);..  ptr +
32100 3d 20 34 3b 0a 09 20 20 73 7a 20 2d 3d 20 34 3b  = 4;..  sz -= 4;
32110 0a 09 20 20 62 79 74 65 73 20 2b 3d 20 34 3b 0a  ..  bytes += 4;.
32120 09 20 20 72 6e 67 5f 73 7a 20 3d 20 70 74 73 20  .  rng_sz = pts 
32130 2a 20 6e 64 69 6d 73 20 2a 20 38 3b 0a 09 20 20  * ndims * 8;..  
32140 69 66 20 28 73 7a 20 3c 20 72 6e 67 5f 73 7a 29  if (sz < rng_sz)
32150 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ..      return 0
32160 3b 0a 09 20 20 62 79 74 65 73 20 2b 3d 20 72 6e  ;..  bytes += rn
32170 67 5f 73 7a 3b 0a 0a 09 20 20 69 66 20 28 69 72  g_sz;...  if (ir
32180 20 3d 3d 20 30 29 0a 09 20 20 20 20 7b 0a 09 09   == 0)..    {...
32190 2f 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  /* creating the 
321a0 50 6f 6c 79 67 6f 6e 20 2a 2f 0a 09 09 70 67 20  Polygon */...pg 
321b0 3d 20 67 61 69 61 41 64 64 50 6f 6c 79 67 6f 6e  = gaiaAddPolygon
321c0 54 6f 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d  ToGeomColl (geom
321d0 2c 20 70 74 73 2c 20 72 69 6e 67 73 20 2d 20 31  , pts, rings - 1
321e0 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20  );..    }..  if 
321f0 28 64 69 6d 73 20 3d 3d 20 47 41 49 41 5f 58 59  (dims == GAIA_XY
32200 5f 5a 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20  _Z)..    {.../* 
32210 50 4f 4c 59 47 4f 4e 5a 20 2a 2f 0a 09 09 69 66  POLYGONZ */...if
32220 20 28 69 72 20 3d 3d 20 30 29 0a 09 09 20 20 7b   (ir == 0)...  {
32230 0a 09 09 20 20 20 20 20 20 2f 2a 20 70 61 72 73  ...      /* pars
32240 69 6e 67 20 74 68 65 20 45 58 54 45 52 49 4f 52  ing the EXTERIOR
32250 20 52 49 4e 47 20 2a 2f 0a 09 09 20 20 20 20 20   RING */...     
32260 20 72 6e 67 20 3d 20 70 67 2d 3e 45 78 74 65 72   rng = pg->Exter
32270 69 6f 72 3b 0a 09 09 20 20 20 20 20 20 66 6f 72  ior;...      for
32280 20 28 69 76 20 3d 20 30 3b 20 69 76 20 3c 20 70   (iv = 0; iv < p
32290 74 73 3b 20 69 76 2b 2b 29 0a 09 09 09 7b 0a 09  ts; iv++)....{..
322a0 09 09 20 20 20 20 2f 2a 20 69 6e 73 65 72 74 69  ..    /* inserti
322b0 6e 67 20 76 65 72 74 69 63 65 73 20 69 6e 74 6f  ng vertices into
322c0 20 74 68 65 20 45 58 54 45 52 49 4f 52 20 52 69   the EXTERIOR Ri
322d0 6e 67 20 2a 2f 0a 09 09 09 20 20 20 20 78 20 3d  ng */....    x =
322e0 20 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28 70   gaiaImport64 (p
322f0 74 72 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f  tr, GAIA_LITTLE_
32300 45 4e 44 49 41 4e 2c 0a 09 09 09 09 09 20 20 20  ENDIAN,......   
32310 20 20 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b     endian_arch);
32320 0a 09 09 09 20 20 20 20 79 20 3d 20 67 61 69 61  ....    y = gaia
32330 49 6d 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20  Import64 (ptr + 
32340 38 2c 0a 09 09 09 09 09 20 20 20 20 20 20 47 41  8,......      GA
32350 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e  IA_LITTLE_ENDIAN
32360 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  , endian_arch);.
32370 09 09 09 20 20 20 20 7a 20 3d 20 67 61 69 61 49  ...    z = gaiaI
32380 6d 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 31  mport64 (ptr + 1
32390 36 2c 0a 09 09 09 09 09 20 20 20 20 20 20 47 41  6,......      GA
323a0 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e  IA_LITTLE_ENDIAN
323b0 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  , endian_arch);.
323c0 09 09 09 20 20 20 20 6d 20 3d 20 30 2e 30 3b 0a  ...    m = 0.0;.
323d0 09 09 09 20 20 20 20 70 74 72 20 2b 3d 20 32 34  ...    ptr += 24
323e0 3b 0a 09 09 09 20 20 20 20 73 65 74 46 67 66 56  ;....    setFgfV
323f0 65 72 74 65 78 20 28 64 69 6d 73 2c 20 72 6e 67  ertex (dims, rng
32400 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 78 2c  ->Coords, iv, x,
32410 20 79 2c 20 7a 2c 20 6d 29 3b 0a 09 09 09 7d 0a   y, z, m);....}.
32420 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 20  ..  }...else... 
32430 20 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20 70 61   {...      /* pa
32440 72 73 69 6e 67 20 61 6e 20 49 4e 54 45 52 49 4f  rsing an INTERIO
32450 52 20 52 49 4e 47 20 2a 2f 0a 09 09 20 20 20 20  R RING */...    
32460 20 20 72 6e 67 20 3d 20 67 61 69 61 41 64 64 49    rng = gaiaAddI
32470 6e 74 65 72 69 6f 72 52 69 6e 67 20 28 70 67 2c  nteriorRing (pg,
32480 20 69 72 20 2d 20 31 2c 20 70 74 73 29 3b 0a 09   ir - 1, pts);..
32490 09 20 20 20 20 20 20 66 6f 72 20 28 69 76 20 3d  .      for (iv =
324a0 20 30 3b 20 69 76 20 3c 20 70 74 73 3b 20 69 76   0; iv < pts; iv
324b0 2b 2b 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20  ++)....{....    
324c0 2f 2a 20 69 6e 73 65 72 74 69 6e 67 20 76 65 72  /* inserting ver
324d0 74 69 63 65 73 20 69 6e 74 6f 20 73 6f 6d 65 20  tices into some 
324e0 49 4e 54 45 52 49 4f 52 20 52 69 6e 67 20 2a 2f  INTERIOR Ring */
324f0 0a 09 09 09 20 20 20 20 78 20 3d 20 67 61 69 61  ....    x = gaia
32500 49 6d 70 6f 72 74 36 34 20 28 70 74 72 2c 20 47  Import64 (ptr, G
32510 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41  AIA_LITTLE_ENDIA
32520 4e 2c 0a 09 09 09 09 09 20 20 20 20 20 20 65 6e  N,......      en
32530 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 09 20  dian_arch);.... 
32540 20 20 20 79 20 3d 20 67 61 69 61 49 6d 70 6f 72     y = gaiaImpor
32550 74 36 34 20 28 70 74 72 20 2b 20 38 2c 0a 09 09  t64 (ptr + 8,...
32560 09 09 09 20 20 20 20 20 20 47 41 49 41 5f 4c 49  ...      GAIA_LI
32570 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65 6e 64  TTLE_ENDIAN, end
32580 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 09 20 20  ian_arch);....  
32590 20 20 7a 20 3d 20 67 61 69 61 49 6d 70 6f 72 74    z = gaiaImport
325a0 36 34 20 28 70 74 72 20 2b 20 31 36 2c 0a 09 09  64 (ptr + 16,...
325b0 09 09 09 20 20 20 20 20 20 47 41 49 41 5f 4c 49  ...      GAIA_LI
325c0 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65 6e 64  TTLE_ENDIAN, end
325d0 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 09 20 20  ian_arch);....  
325e0 20 20 6d 20 3d 20 30 2e 30 3b 0a 09 09 09 20 20    m = 0.0;....  
325f0 20 20 70 74 72 20 2b 3d 20 32 34 3b 0a 09 09 09    ptr += 24;....
32600 20 20 20 20 73 65 74 46 67 66 56 65 72 74 65 78      setFgfVertex
32610 20 28 64 69 6d 73 2c 20 72 6e 67 2d 3e 43 6f 6f   (dims, rng->Coo
32620 72 64 73 2c 20 69 76 2c 20 78 2c 20 79 2c 20 7a  rds, iv, x, y, z
32630 2c 20 6d 29 3b 0a 09 09 09 7d 0a 09 09 20 20 7d  , m);....}...  }
32640 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 20  ..    }..  else 
32650 69 66 20 28 64 69 6d 73 20 3d 3d 20 47 41 49 41  if (dims == GAIA
32660 5f 58 59 5f 4d 29 0a 09 20 20 20 20 7b 0a 09 09  _XY_M)..    {...
32670 2f 2a 20 50 4f 4c 59 47 4f 4e 4d 20 2a 2f 0a 09  /* POLYGONM */..
32680 09 69 66 20 28 69 72 20 3d 3d 20 30 29 0a 09 09  .if (ir == 0)...
32690 20 20 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20 70    {...      /* p
326a0 61 72 73 69 6e 67 20 74 68 65 20 45 58 54 45 52  arsing the EXTER
326b0 49 4f 52 20 52 49 4e 47 20 2a 2f 0a 09 09 20 20  IOR RING */...  
326c0 20 20 20 20 72 6e 67 20 3d 20 70 67 2d 3e 45 78      rng = pg->Ex
326d0 74 65 72 69 6f 72 3b 0a 09 09 20 20 20 20 20 20  terior;...      
326e0 66 6f 72 20 28 69 76 20 3d 20 30 3b 20 69 76 20  for (iv = 0; iv 
326f0 3c 20 70 74 73 3b 20 69 76 2b 2b 29 0a 09 09 09  < pts; iv++)....
32700 7b 0a 09 09 09 20 20 20 20 2f 2a 20 69 6e 73 65  {....    /* inse
32710 72 74 69 6e 67 20 76 65 72 74 69 63 65 73 20 69  rting vertices i
32720 6e 74 6f 20 74 68 65 20 45 58 54 45 52 49 4f 52  nto the EXTERIOR
32730 20 52 69 6e 67 20 2a 2f 0a 09 09 09 20 20 20 20   Ring */....    
32740 78 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34  x = gaiaImport64
32750 20 28 70 74 72 2c 20 47 41 49 41 5f 4c 49 54 54   (ptr, GAIA_LITT
32760 4c 45 5f 45 4e 44 49 41 4e 2c 0a 09 09 09 09 09  LE_ENDIAN,......
32770 20 20 20 20 20 20 65 6e 64 69 61 6e 5f 61 72 63        endian_arc
32780 68 29 3b 0a 09 09 09 20 20 20 20 79 20 3d 20 67  h);....    y = g
32790 61 69 61 49 6d 70 6f 72 74 36 34 20 28 70 74 72  aiaImport64 (ptr
327a0 20 2b 20 38 2c 0a 09 09 09 09 09 20 20 20 20 20   + 8,......     
327b0 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44   GAIA_LITTLE_END
327c0 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  IAN, endian_arch
327d0 29 3b 0a 09 09 09 20 20 20 20 6d 20 3d 20 67 61  );....    m = ga
327e0 69 61 49 6d 70 6f 72 74 36 34 20 28 70 74 72 20  iaImport64 (ptr 
327f0 2b 20 31 36 2c 0a 09 09 09 09 09 20 20 20 20 20  + 16,......     
32800 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44   GAIA_LITTLE_END
32810 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  IAN, endian_arch
32820 29 3b 0a 09 09 09 20 20 20 20 7a 20 3d 20 30 2e  );....    z = 0.
32830 30 3b 0a 09 09 09 20 20 20 20 70 74 72 20 2b 3d  0;....    ptr +=
32840 20 32 34 3b 0a 09 09 09 20 20 20 20 73 65 74 46   24;....    setF
32850 67 66 56 65 72 74 65 78 20 28 64 69 6d 73 2c 20  gfVertex (dims, 
32860 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c  rng->Coords, iv,
32870 20 78 2c 20 79 2c 20 7a 2c 20 6d 29 3b 0a 09 09   x, y, z, m);...
32880 09 7d 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a  .}...  }...else.
32890 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 2f 2a  ..  {...      /*
328a0 20 70 61 72 73 69 6e 67 20 61 6e 20 49 4e 54 45   parsing an INTE
328b0 52 49 4f 52 20 52 49 4e 47 20 2a 2f 0a 09 09 20  RIOR RING */... 
328c0 20 20 20 20 20 72 6e 67 20 3d 20 67 61 69 61 41       rng = gaiaA
328d0 64 64 49 6e 74 65 72 69 6f 72 52 69 6e 67 20 28  ddInteriorRing (
328e0 70 67 2c 20 69 72 20 2d 20 31 2c 20 70 74 73 29  pg, ir - 1, pts)
328f0 3b 0a 09 09 20 20 20 20 20 20 66 6f 72 20 28 69  ;...      for (i
32900 76 20 3d 20 30 3b 20 69 76 20 3c 20 70 74 73 3b  v = 0; iv < pts;
32910 20 69 76 2b 2b 29 0a 09 09 09 7b 0a 09 09 09 20   iv++)....{.... 
32920 20 20 20 2f 2a 20 69 6e 73 65 72 74 69 6e 67 20     /* inserting 
32930 76 65 72 74 69 63 65 73 20 69 6e 74 6f 20 73 6f  vertices into so
32940 6d 65 20 49 4e 54 45 52 49 4f 52 20 52 69 6e 67  me INTERIOR Ring
32950 20 2a 2f 0a 09 09 09 20 20 20 20 78 20 3d 20 67   */....    x = g
32960 61 69 61 49 6d 70 6f 72 74 36 34 20 28 70 74 72  aiaImport64 (ptr
32970 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e  , GAIA_LITTLE_EN
32980 44 49 41 4e 2c 0a 09 09 09 09 09 20 20 20 20 20  DIAN,......     
32990 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09   endian_arch);..
329a0 09 09 20 20 20 20 79 20 3d 20 67 61 69 61 49 6d  ..    y = gaiaIm
329b0 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 38 2c  port64 (ptr + 8,
329c0 0a 09 09 09 09 09 20 20 20 20 20 20 47 41 49 41  ......      GAIA
329d0 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20  _LITTLE_ENDIAN, 
329e0 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09  endian_arch);...
329f0 09 20 20 20 20 6d 20 3d 20 67 61 69 61 49 6d 70  .    m = gaiaImp
32a00 6f 72 74 36 34 20 28 70 74 72 20 2b 20 31 36 2c  ort64 (ptr + 16,
32a10 0a 09 09 09 09 09 20 20 20 20 20 20 47 41 49 41  ......      GAIA
32a20 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20  _LITTLE_ENDIAN, 
32a30 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09  endian_arch);...
32a40 09 20 20 20 20 7a 20 3d 20 30 2e 30 3b 0a 09 09  .    z = 0.0;...
32a50 09 20 20 20 20 70 74 72 20 2b 3d 20 32 34 3b 0a  .    ptr += 24;.
32a60 09 09 09 20 20 20 20 73 65 74 46 67 66 56 65 72  ...    setFgfVer
32a70 74 65 78 20 28 64 69 6d 73 2c 20 72 6e 67 2d 3e  tex (dims, rng->
32a80 43 6f 6f 72 64 73 2c 20 69 76 2c 20 78 2c 20 79  Coords, iv, x, y
32a90 2c 20 7a 2c 20 6d 29 3b 0a 09 09 09 7d 0a 09 09  , z, m);....}...
32aa0 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c    }..    }..  el
32ab0 73 65 20 69 66 20 28 64 69 6d 73 20 3d 3d 20 47  se if (dims == G
32ac0 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 20 20 20  AIA_XY_Z_M)..   
32ad0 20 7b 0a 09 09 2f 2a 20 50 4f 4c 59 47 4f 4e 5a   {.../* POLYGONZ
32ae0 4d 20 2a 2f 0a 09 09 69 66 20 28 69 72 20 3d 3d  M */...if (ir ==
32af0 20 30 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20   0)...  {...    
32b00 20 20 2f 2a 20 70 61 72 73 69 6e 67 20 74 68 65    /* parsing the
32b10 20 45 58 54 45 52 49 4f 52 20 52 49 4e 47 20 2a   EXTERIOR RING *
32b20 2f 0a 09 09 20 20 20 20 20 20 72 6e 67 20 3d 20  /...      rng = 
32b30 70 67 2d 3e 45 78 74 65 72 69 6f 72 3b 0a 09 09  pg->Exterior;...
32b40 20 20 20 20 20 20 66 6f 72 20 28 69 76 20 3d 20        for (iv = 
32b50 30 3b 20 69 76 20 3c 20 70 74 73 3b 20 69 76 2b  0; iv < pts; iv+
32b60 2b 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 2f  +)....{....    /
32b70 2a 20 69 6e 73 65 72 74 69 6e 67 20 76 65 72 74  * inserting vert
32b80 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 45 58  ices into the EX
32b90 54 45 52 49 4f 52 20 52 69 6e 67 20 2a 2f 0a 09  TERIOR Ring */..
32ba0 09 09 20 20 20 20 78 20 3d 20 67 61 69 61 49 6d  ..    x = gaiaIm
32bb0 70 6f 72 74 36 34 20 28 70 74 72 2c 20 47 41 49  port64 (ptr, GAI
32bc0 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c  A_LITTLE_ENDIAN,
32bd0 0a 09 09 09 09 09 20 20 20 20 20 20 65 6e 64 69  ......      endi
32be0 61 6e 5f 61 72 63 68 29 3b 0a 09 09 09 20 20 20  an_arch);....   
32bf0 20 79 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36   y = gaiaImport6
32c00 34 20 28 70 74 72 20 2b 20 38 2c 0a 09 09 09 09  4 (ptr + 8,.....
32c10 09 20 20 20 20 20 20 47 41 49 41 5f 4c 49 54 54  .      GAIA_LITT
32c20 4c 45 5f 45 4e 44 49 41 4e 2c 20 65 6e 64 69 61  LE_ENDIAN, endia
32c30 6e 5f 61 72 63 68 29 3b 0a 09 09 09 20 20 20 20  n_arch);....    
32c40 7a 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34  z = gaiaImport64
32c50 20 28 70 74 72 20 2b 20 31 36 2c 0a 09 09 09 09   (ptr + 16,.....
32c60 09 20 20 20 20 20 20 47 41 49 41 5f 4c 49 54 54  .      GAIA_LITT
32c70 4c 45 5f 45 4e 44 49 41 4e 2c 20 65 6e 64 69 61  LE_ENDIAN, endia
32c80 6e 5f 61 72 63 68 29 3b 0a 09 09 09 20 20 20 20  n_arch);....    
32c90 6d 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36 34  m = gaiaImport64
32ca0 20 28 70 74 72 20 2b 20 32 34 2c 0a 09 09 09 09   (ptr + 24,.....
32cb0 09 20 20 20 20 20 20 47 41 49 41 5f 4c 49 54 54  .      GAIA_LITT
32cc0 4c 45 5f 45 4e 44 49 41 4e 2c 20 65 6e 64 69 61  LE_ENDIAN, endia
32cd0 6e 5f 61 72 63 68 29 3b 0a 09 09 09 20 20 20 20  n_arch);....    
32ce0 70 74 72 20 2b 3d 20 33 32 3b 0a 09 09 09 20 20  ptr += 32;....  
32cf0 20 20 73 65 74 46 67 66 56 65 72 74 65 78 20 28    setFgfVertex (
32d00 64 69 6d 73 2c 20 72 6e 67 2d 3e 43 6f 6f 72 64  dims, rng->Coord
32d10 73 2c 20 69 76 2c 20 78 2c 20 79 2c 20 7a 2c 20  s, iv, x, y, z, 
32d20 6d 29 3b 0a 09 09 09 7d 0a 09 09 20 20 7d 0a 09  m);....}...  }..
32d30 09 65 6c 73 65 0a 09 09 20 20 7b 0a 09 09 20 20  .else...  {...  
32d40 20 20 20 20 2f 2a 20 70 61 72 73 69 6e 67 20 61      /* parsing a
32d50 6e 20 49 4e 54 45 52 49 4f 52 20 52 49 4e 47 20  n INTERIOR RING 
32d60 2a 2f 0a 09 09 20 20 20 20 20 20 72 6e 67 20 3d  */...      rng =
32d70 20 67 61 69 61 41 64 64 49 6e 74 65 72 69 6f 72   gaiaAddInterior
32d80 52 69 6e 67 20 28 70 67 2c 20 69 72 20 2d 20 31  Ring (pg, ir - 1
32d90 2c 20 70 74 73 29 3b 0a 09 09 20 20 20 20 20 20  , pts);...      
32da0 66 6f 72 20 28 69 76 20 3d 20 30 3b 20 69 76 20  for (iv = 0; iv 
32db0 3c 20 70 74 73 3b 20 69 76 2b 2b 29 0a 09 09 09  < pts; iv++)....
32dc0 7b 0a 09 09 09 20 20 20 20 2f 2a 20 69 6e 73 65  {....    /* inse
32dd0 72 74 69 6e 67 20 76 65 72 74 69 63 65 73 20 69  rting vertices i
32de0 6e 74 6f 20 73 6f 6d 65 20 49 4e 54 45 52 49 4f  nto some INTERIO
32df0 52 20 52 69 6e 67 20 2a 2f 0a 09 09 09 20 20 20  R Ring */....   
32e00 20 78 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36   x = gaiaImport6
32e10 34 20 28 70 74 72 2c 20 47 41 49 41 5f 4c 49 54  4 (ptr, GAIA_LIT
32e20 54 4c 45 5f 45 4e 44 49 41 4e 2c 0a 09 09 09 09  TLE_ENDIAN,.....
32e30 09 20 20 20 20 20 20 65 6e 64 69 61 6e 5f 61 72  .      endian_ar
32e40 63 68 29 3b 0a 09 09 09 20 20 20 20 79 20 3d 20  ch);....    y = 
32e50 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28 70 74  gaiaImport64 (pt
32e60 72 20 2b 20 38 2c 0a 09 09 09 09 09 20 20 20 20  r + 8,......    
32e70 20 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e    GAIA_LITTLE_EN
32e80 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63  DIAN, endian_arc
32e90 68 29 3b 0a 09 09 09 20 20 20 20 7a 20 3d 20 67  h);....    z = g
32ea0 61 69 61 49 6d 70 6f 72 74 36 34 20 28 70 74 72  aiaImport64 (ptr
32eb0 20 2b 20 31 36 2c 0a 09 09 09 09 09 20 20 20 20   + 16,......    
32ec0 20 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e    GAIA_LITTLE_EN
32ed0 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63  DIAN, endian_arc
32ee0 68 29 3b 0a 09 09 09 20 20 20 20 6d 20 3d 20 67  h);....    m = g
32ef0 61 69 61 49 6d 70 6f 72 74 36 34 20 28 70 74 72  aiaImport64 (ptr
32f00 20 2b 20 32 34 2c 0a 09 09 09 09 09 20 20 20 20   + 24,......    
32f10 20 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e    GAIA_LITTLE_EN
32f20 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63  DIAN, endian_arc
32f30 68 29 3b 0a 09 09 09 20 20 20 20 70 74 72 20 2b  h);....    ptr +
32f40 3d 20 33 32 3b 0a 09 09 09 20 20 20 20 73 65 74  = 32;....    set
32f50 46 67 66 56 65 72 74 65 78 20 28 64 69 6d 73 2c  FgfVertex (dims,
32f60 20 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76   rng->Coords, iv
32f70 2c 20 78 2c 20 79 2c 20 7a 2c 20 6d 29 3b 0a 09  , x, y, z, m);..
32f80 09 09 7d 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d  ..}...  }..    }
32f90 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a  ..  else..    {.
32fa0 09 09 2f 2a 20 50 4f 4c 59 47 4f 4e 20 2a 2f 0a  ../* POLYGON */.
32fb0 09 09 69 66 20 28 69 72 20 3d 3d 20 30 29 0a 09  ..if (ir == 0)..
32fc0 09 20 20 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20  .  {...      /* 
32fd0 70 61 72 73 69 6e 67 20 74 68 65 20 45 58 54 45  parsing the EXTE
32fe0 52 49 4f 52 20 52 49 4e 47 20 2a 2f 0a 09 09 20  RIOR RING */... 
32ff0 20 20 20 20 20 72 6e 67 20 3d 20 70 67 2d 3e 45       rng = pg->E
33000 78 74 65 72 69 6f 72 3b 0a 09 09 20 20 20 20 20  xterior;...     
33010 20 66 6f 72 20 28 69 76 20 3d 20 30 3b 20 69 76   for (iv = 0; iv
33020 20 3c 20 70 74 73 3b 20 69 76 2b 2b 29 0a 09 09   < pts; iv++)...
33030 09 7b 0a 09 09 09 20 20 20 20 2f 2a 20 69 6e 73  .{....    /* ins
33040 65 72 74 69 6e 67 20 76 65 72 74 69 63 65 73 20  erting vertices 
33050 69 6e 74 6f 20 74 68 65 20 45 58 54 45 52 49 4f  into the EXTERIO
33060 52 20 52 69 6e 67 20 2a 2f 0a 09 09 09 20 20 20  R Ring */....   
33070 20 78 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 36   x = gaiaImport6
33080 34 20 28 70 74 72 2c 20 47 41 49 41 5f 4c 49 54  4 (ptr, GAIA_LIT
33090 54 4c 45 5f 45 4e 44 49 41 4e 2c 0a 09 09 09 09  TLE_ENDIAN,.....
330a0 09 20 20 20 20 20 20 65 6e 64 69 61 6e 5f 61 72  .      endian_ar
330b0 63 68 29 3b 0a 09 09 09 20 20 20 20 79 20 3d 20  ch);....    y = 
330c0 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28 70 74  gaiaImport64 (pt
330d0 72 20 2b 20 38 2c 0a 09 09 09 09 09 20 20 20 20  r + 8,......    
330e0 20 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e    GAIA_LITTLE_EN
330f0 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63  DIAN, endian_arc
33100 68 29 3b 0a 09 09 09 20 20 20 20 7a 20 3d 20 30  h);....    z = 0
33110 2e 30 3b 0a 09 09 09 20 20 20 20 6d 20 3d 20 30  .0;....    m = 0
33120 2e 30 3b 0a 09 09 09 20 20 20 20 70 74 72 20 2b  .0;....    ptr +
33130 3d 20 31 36 3b 0a 09 09 09 20 20 20 20 73 65 74  = 16;....    set
33140 46 67 66 56 65 72 74 65 78 20 28 64 69 6d 73 2c  FgfVertex (dims,
33150 20 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76   rng->Coords, iv
33160 2c 20 78 2c 20 79 2c 20 7a 2c 20 6d 29 3b 0a 09  , x, y, z, m);..
33170 09 09 7d 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65  ..}...  }...else
33180 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 2f  ...  {...      /
33190 2a 20 70 61 72 73 69 6e 67 20 61 6e 20 49 4e 54  * parsing an INT
331a0 45 52 49 4f 52 20 52 49 4e 47 20 2a 2f 0a 09 09  ERIOR RING */...
331b0 20 20 20 20 20 20 72 6e 67 20 3d 20 67 61 69 61        rng = gaia
331c0 41 64 64 49 6e 74 65 72 69 6f 72 52 69 6e 67 20  AddInteriorRing 
331d0 28 70 67 2c 20 69 72 20 2d 20 31 2c 20 70 74 73  (pg, ir - 1, pts
331e0 29 3b 0a 09 09 20 20 20 20 20 20 66 6f 72 20 28  );...      for (
331f0 69 76 20 3d 20 30 3b 20 69 76 20 3c 20 70 74 73  iv = 0; iv < pts
33200 3b 20 69 76 2b 2b 29 0a 09 09 09 7b 0a 09 09 09  ; iv++)....{....
33210 20 20 20 20 2f 2a 20 69 6e 73 65 72 74 69 6e 67      /* inserting
33220 20 76 65 72 74 69 63 65 73 20 69 6e 74 6f 20 73   vertices into s
33230 6f 6d 65 20 49 4e 54 45 52 49 4f 52 20 52 69 6e  ome INTERIOR Rin
33240 67 20 2a 2f 0a 09 09 09 20 20 20 20 78 20 3d 20  g */....    x = 
33250 67 61 69 61 49 6d 70 6f 72 74 36 34 20 28 70 74  gaiaImport64 (pt
33260 72 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45  r, GAIA_LITTLE_E
33270 4e 44 49 41 4e 2c 0a 09 09 09 09 09 20 20 20 20  NDIAN,......    
33280 20 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a    endian_arch);.
33290 09 09 09 20 20 20 20 79 20 3d 20 67 61 69 61 49  ...    y = gaiaI
332a0 6d 70 6f 72 74 36 34 20 28 70 74 72 20 2b 20 38  mport64 (ptr + 8
332b0 2c 0a 09 09 09 09 09 20 20 20 20 20 20 47 41 49  ,......      GAI
332c0 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c  A_LITTLE_ENDIAN,
332d0 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09   endian_arch);..
332e0 09 09 20 20 20 20 7a 20 3d 20 30 2e 30 3b 0a 09  ..    z = 0.0;..
332f0 09 09 20 20 20 20 6d 20 3d 20 30 2e 30 3b 0a 09  ..    m = 0.0;..
33300 09 09 20 20 20 20 70 74 72 20 2b 3d 20 31 36 3b  ..    ptr += 16;
33310 0a 09 09 09 20 20 20 20 73 65 74 46 67 66 56 65  ....    setFgfVe
33320 72 74 65 78 20 28 64 69 6d 73 2c 20 72 6e 67 2d  rtex (dims, rng-
33330 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 78 2c 20  >Coords, iv, x, 
33340 79 2c 20 7a 2c 20 6d 29 3b 0a 09 09 09 7d 0a 09  y, z, m);....}..
33350 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 73  .  }..    }..  s
33360 7a 20 2d 3d 20 72 6e 67 5f 73 7a 3b 0a 20 20 20  z -= rng_sz;.   
33370 20 20 20 7d 0a 20 20 20 20 69 66 20 28 63 6f 6e     }.    if (con
33380 73 75 6d 65 64 29 0a 09 2a 63 6f 6e 73 75 6d 65  sumed)..*consume
33390 64 20 3d 20 62 79 74 65 73 3b 0a 20 20 20 20 72  d = bytes;.    r
333a0 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74  eturn 1;.}..stat
333b0 69 63 20 69 6e 74 0a 6d 75 6c 74 69 50 6f 69 6e  ic int.multiPoin
333c0 74 46 72 6f 6d 46 67 66 20 28 67 61 69 61 47 65  tFromFgf (gaiaGe
333d0 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 2c 20  omCollPtr geom, 
333e0 69 6e 74 20 65 6e 64 69 61 6e 5f 61 72 63 68 2c  int endian_arch,
333f0 0a 09 09 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ...   const unsi
33400 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62 2c  gned char *blob,
33410 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 73 69   unsigned int si
33420 7a 65 29 0a 7b 0a 2f 2a 20 64 65 63 6f 64 69 6e  ze).{./* decodin
33430 67 20 61 20 4d 55 4c 54 49 50 4f 49 4e 54 20 47  g a MULTIPOINT G
33440 65 6f 6d 65 74 72 79 20 66 72 6f 6d 20 46 47 46  eometry from FGF
33450 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 74 73    */.    int pts
33460 3b 0a 20 20 20 20 69 6e 74 20 69 70 74 3b 0a 20  ;.    int ipt;. 
33470 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
33480 73 7a 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 63  sz = size;.    c
33490 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
334a0 61 72 20 2a 70 74 72 20 3d 20 62 6c 6f 62 3b 0a  ar *ptr = blob;.
334b0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
334c0 20 63 6f 6e 73 75 6d 65 64 3b 0a 2f 2a 20 63 68   consumed;./* ch
334d0 65 63 6b 69 6e 67 20 47 65 6f 6d 65 74 72 79 20  ecking Geometry 
334e0 54 79 70 65 20 2a 2f 0a 20 20 20 20 69 66 20 28  Type */.    if (
334f0 73 7a 20 3c 20 34 29 0a 09 72 65 74 75 72 6e 20  sz < 4)..return 
33500 30 3b 0a 20 20 20 20 69 66 20 28 67 61 69 61 49  0;.    if (gaiaI
33510 6d 70 6f 72 74 33 32 20 28 70 74 72 2c 20 47 41  mport32 (ptr, GA
33520 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e  IA_LITTLE_ENDIAN
33530 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 20 21  , endian_arch) !
33540 3d 20 47 41 49 41 5f 4d 55 4c 54 49 50 4f 49 4e  = GAIA_MULTIPOIN
33550 54 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20  T)..return 0;.  
33560 20 20 70 74 72 20 2b 3d 20 34 3b 0a 20 20 20 20    ptr += 4;.    
33570 73 7a 20 2d 3d 20 34 3b 0a 2f 2a 20 68 6f 77 20  sz -= 4;./* how 
33580 6d 61 6e 79 20 70 6f 69 6e 74 73 20 61 72 65 20  many points are 
33590 74 68 65 72 65 20 3f 20 2a 2f 0a 20 20 20 20 69  there ? */.    i
335a0 66 20 28 73 7a 20 3c 20 34 29 0a 09 72 65 74 75  f (sz < 4)..retu
335b0 72 6e 20 30 3b 0a 20 20 20 20 70 74 73 20 3d 20  rn 0;.    pts = 
335c0 67 61 69 61 49 6d 70 6f 72 74 33 32 20 28 70 74  gaiaImport32 (pt
335d0 72 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45  r, GAIA_LITTLE_E
335e0 4e 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72  NDIAN, endian_ar
335f0 63 68 29 3b 0a 20 20 20 20 70 74 72 20 2b 3d 20  ch);.    ptr += 
33600 34 3b 0a 20 20 20 20 73 7a 20 2d 3d 20 34 3b 0a  4;.    sz -= 4;.
33610 20 20 20 20 69 66 20 28 70 74 73 20 3c 20 31 29      if (pts < 1)
33620 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ..return 0;.    
33630 66 6f 72 20 28 69 70 74 20 3d 20 30 3b 20 69 70  for (ipt = 0; ip
33640 74 20 3c 20 70 74 73 3b 20 69 70 74 2b 2b 29 0a  t < pts; ipt++).
33650 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 66 65        {..  /* fe
33660 74 63 68 69 6e 67 20 69 6e 64 69 76 69 64 75 61  tching individua
33670 6c 20 50 6f 69 6e 74 73 20 66 72 6f 6d 20 46 47  l Points from FG
33680 46 20 2a 2f 0a 09 20 20 69 66 20 28 21 70 6f 69  F */..  if (!poi
33690 6e 74 46 72 6f 6d 46 67 66 20 28 67 65 6f 6d 2c  ntFromFgf (geom,
336a0 20 65 6e 64 69 61 6e 5f 61 72 63 68 2c 20 70 74   endian_arch, pt
336b0 72 2c 20 73 7a 2c 20 26 63 6f 6e 73 75 6d 65 64  r, sz, &consumed
336c0 29 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e  ))..      return
336d0 20 30 3b 0a 09 20 20 70 74 72 20 2b 3d 20 63 6f   0;..  ptr += co
336e0 6e 73 75 6d 65 64 3b 0a 09 20 20 73 7a 20 2d 3d  nsumed;..  sz -=
336f0 20 63 6f 6e 73 75 6d 65 64 3b 0a 20 20 20 20 20   consumed;.     
33700 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b   }.    return 1;
33710 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 6d  .}..static int.m
33720 75 6c 74 69 4c 69 6e 65 73 74 72 69 6e 67 46 72  ultiLinestringFr
33730 6f 6d 46 67 66 20 28 67 61 69 61 47 65 6f 6d 43  omFgf (gaiaGeomC
33740 6f 6c 6c 50 74 72 20 67 65 6f 6d 2c 20 69 6e 74  ollPtr geom, int
33750 20 65 6e 64 69 61 6e 5f 61 72 63 68 2c 0a 09 09   endian_arch,...
33760 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  .const unsigned 
33770 63 68 61 72 20 2a 62 6c 6f 62 2c 20 75 6e 73 69  char *blob, unsi
33780 67 6e 65 64 20 69 6e 74 20 73 69 7a 65 29 0a 7b  gned int size).{
33790 0a 2f 2a 20 64 65 63 6f 64 69 6e 67 20 61 20 4d  ./* decoding a M
337a0 55 4c 54 49 4c 49 4e 45 53 54 52 49 4e 47 20 47  ULTILINESTRING G
337b0 65 6f 6d 65 74 72 79 20 66 72 6f 6d 20 46 47 46  eometry from FGF
337c0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 6e 73    */.    int lns
337d0 3b 0a 20 20 20 20 69 6e 74 20 69 6c 6e 3b 0a 20  ;.    int iln;. 
337e0 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
337f0 73 7a 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 63  sz = size;.    c
33800 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
33810 61 72 20 2a 70 74 72 20 3d 20 62 6c 6f 62 3b 0a  ar *ptr = blob;.
33820 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
33830 20 63 6f 6e 73 75 6d 65 64 3b 0a 2f 2a 20 63 68   consumed;./* ch
33840 65 63 6b 69 6e 67 20 47 65 6f 6d 65 74 72 79 20  ecking Geometry 
33850 54 79 70 65 20 2a 2f 0a 20 20 20 20 69 66 20 28  Type */.    if (
33860 73 7a 20 3c 20 34 29 0a 09 72 65 74 75 72 6e 20  sz < 4)..return 
33870 30 3b 0a 20 20 20 20 69 66 20 28 67 61 69 61 49  0;.    if (gaiaI
33880 6d 70 6f 72 74 33 32 0a 09 28 70 74 72 2c 20 47  mport32..(ptr, G
33890 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41  AIA_LITTLE_ENDIA
338a0 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 20  N, endian_arch) 
338b0 21 3d 20 47 41 49 41 5f 4d 55 4c 54 49 4c 49 4e  != GAIA_MULTILIN
338c0 45 53 54 52 49 4e 47 29 0a 09 72 65 74 75 72 6e  ESTRING)..return
338d0 20 30 3b 0a 20 20 20 20 70 74 72 20 2b 3d 20 34   0;.    ptr += 4
338e0 3b 0a 20 20 20 20 73 7a 20 2d 3d 20 34 3b 0a 2f  ;.    sz -= 4;./
338f0 2a 20 68 6f 77 20 6d 61 6e 79 20 6c 69 6e 65 73  * how many lines
33900 74 72 69 6e 67 73 20 61 72 65 20 74 68 65 72 65  trings are there
33910 20 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 7a   ? */.    if (sz
33920 20 3c 20 34 29 0a 09 72 65 74 75 72 6e 20 30 3b   < 4)..return 0;
33930 0a 20 20 20 20 6c 6e 73 20 3d 20 67 61 69 61 49  .    lns = gaiaI
33940 6d 70 6f 72 74 33 32 20 28 70 74 72 2c 20 47 41  mport32 (ptr, GA
33950 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e  IA_LITTLE_ENDIAN
33960 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a  , endian_arch);.
33970 20 20 20 20 70 74 72 20 2b 3d 20 34 3b 0a 20 20      ptr += 4;.  
33980 20 20 73 7a 20 2d 3d 20 34 3b 0a 20 20 20 20 69    sz -= 4;.    i
33990 66 20 28 6c 6e 73 20 3c 20 31 29 0a 09 72 65 74  f (lns < 1)..ret
339a0 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 20 28  urn 0;.    for (
339b0 69 6c 6e 20 3d 20 30 3b 20 69 6c 6e 20 3c 20 6c  iln = 0; iln < l
339c0 6e 73 3b 20 69 6c 6e 2b 2b 29 0a 20 20 20 20 20  ns; iln++).     
339d0 20 7b 0a 09 20 20 2f 2a 20 66 65 74 63 68 69 6e   {..  /* fetchin
339e0 67 20 69 6e 64 69 76 69 64 75 61 6c 20 4c 69 6e  g individual Lin
339f0 65 73 74 72 69 6e 67 73 20 66 72 6f 6d 20 46 47  estrings from FG
33a00 46 20 2a 2f 0a 09 20 20 69 66 20 28 21 6c 69 6e  F */..  if (!lin
33a10 65 73 74 72 69 6e 67 46 72 6f 6d 46 67 66 20 28  estringFromFgf (
33a20 67 65 6f 6d 2c 20 65 6e 64 69 61 6e 5f 61 72 63  geom, endian_arc
33a30 68 2c 20 70 74 72 2c 20 73 7a 2c 20 26 63 6f 6e  h, ptr, sz, &con
33a40 73 75 6d 65 64 29 29 0a 09 20 20 20 20 20 20 72  sumed))..      r
33a50 65 74 75 72 6e 20 30 3b 0a 09 20 20 70 74 72 20  eturn 0;..  ptr 
33a60 2b 3d 20 63 6f 6e 73 75 6d 65 64 3b 0a 09 20 20  += consumed;..  
33a70 73 7a 20 2d 3d 20 63 6f 6e 73 75 6d 65 64 3b 0a  sz -= consumed;.
33a80 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75        }.    retu
33a90 72 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn 1;.}..static 
33aa0 69 6e 74 0a 6d 75 6c 74 69 50 6f 6c 79 67 6f 6e  int.multiPolygon
33ab0 46 72 6f 6d 46 67 66 20 28 67 61 69 61 47 65 6f  FromFgf (gaiaGeo
33ac0 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 2c 20 69  mCollPtr geom, i
33ad0 6e 74 20 65 6e 64 69 61 6e 5f 61 72 63 68 2c 0a  nt endian_arch,.
33ae0 09 09 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  ..     const uns
33af0 69 67 6e 65 64 20 63 68 61 72 20 2a 62 6c 6f 62  igned char *blob
33b00 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 73  , unsigned int s
33b10 69 7a 65 29 0a 7b 0a 2f 2a 20 64 65 63 6f 64 69  ize).{./* decodi
33b20 6e 67 20 61 20 4d 55 4c 54 49 50 4f 4c 59 47 4f  ng a MULTIPOLYGO
33b30 4e 20 47 65 6f 6d 65 74 72 79 20 66 72 6f 6d 20  N Geometry from 
33b40 46 47 46 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  FGF  */.    int 
33b50 70 67 73 3b 0a 20 20 20 20 69 6e 74 20 69 70 67  pgs;.    int ipg
33b60 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
33b70 6e 74 20 73 7a 20 3d 20 73 69 7a 65 3b 0a 20 20  nt sz = size;.  
33b80 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
33b90 20 63 68 61 72 20 2a 70 74 72 20 3d 20 62 6c 6f   char *ptr = blo
33ba0 62 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  b;.    unsigned 
33bb0 69 6e 74 20 63 6f 6e 73 75 6d 65 64 3b 0a 2f 2a  int consumed;./*
33bc0 20 63 68 65 63 6b 69 6e 67 20 47 65 6f 6d 65 74   checking Geomet
33bd0 72 79 20 54 79 70 65 20 2a 2f 0a 20 20 20 20 69  ry Type */.    i
33be0 66 20 28 73 7a 20 3c 20 34 29 0a 09 72 65 74 75  f (sz < 4)..retu
33bf0 72 6e 20 30 3b 0a 20 20 20 20 69 66 20 28 67 61  rn 0;.    if (ga
33c00 69 61 49 6d 70 6f 72 74 33 32 0a 09 28 70 74 72  iaImport32..(ptr
33c10 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e  , GAIA_LITTLE_EN
33c20 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63  DIAN, endian_arc
33c30 68 29 20 21 3d 20 47 41 49 41 5f 4d 55 4c 54 49  h) != GAIA_MULTI
33c40 50 4f 4c 59 47 4f 4e 29 0a 09 72 65 74 75 72 6e  POLYGON)..return
33c50 20 30 3b 0a 20 20 20 20 70 74 72 20 2b 3d 20 34   0;.    ptr += 4
33c60 3b 0a 20 20 20 20 73 7a 20 2d 3d 20 34 3b 0a 2f  ;.    sz -= 4;./
33c70 2a 20 68 6f 77 20 6d 61 6e 79 20 70 6f 6c 79 67  * how many polyg
33c80 6f 6e 73 20 61 72 65 20 74 68 65 72 65 20 3f 20  ons are there ? 
33c90 2a 2f 0a 20 20 20 20 69 66 20 28 73 7a 20 3c 20  */.    if (sz < 
33ca0 34 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20  4)..return 0;.  
33cb0 20 20 70 67 73 20 3d 20 67 61 69 61 49 6d 70 6f    pgs = gaiaImpo
33cc0 72 74 33 32 20 28 70 74 72 2c 20 47 41 49 41 5f  rt32 (ptr, GAIA_
33cd0 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65  LITTLE_ENDIAN, e
33ce0 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20  ndian_arch);.   
33cf0 20 70 74 72 20 2b 3d 20 34 3b 0a 20 20 20 20 73   ptr += 4;.    s
33d00 7a 20 2d 3d 20 34 3b 0a 20 20 20 20 69 66 20 28  z -= 4;.    if (
33d10 70 67 73 20 3c 20 31 29 0a 09 72 65 74 75 72 6e  pgs < 1)..return
33d20 20 30 3b 0a 20 20 20 20 66 6f 72 20 28 69 70 67   0;.    for (ipg
33d30 20 3d 20 30 3b 20 69 70 67 20 3c 20 70 67 73 3b   = 0; ipg < pgs;
33d40 20 69 70 67 2b 2b 29 0a 20 20 20 20 20 20 7b 0a   ipg++).      {.
33d50 09 20 20 2f 2a 20 66 65 74 63 68 69 6e 67 20 69  .  /* fetching i
33d60 6e 64 69 76 69 64 75 61 6c 20 50 6f 6c 79 67 6f  ndividual Polygo
33d70 6e 73 20 66 72 6f 6d 20 46 47 46 20 2a 2f 0a 09  ns from FGF */..
33d80 20 20 69 66 20 28 21 70 6f 6c 79 67 6f 6e 46 72    if (!polygonFr
33d90 6f 6d 46 67 66 20 28 67 65 6f 6d 2c 20 65 6e 64  omFgf (geom, end
33da0 69 61 6e 5f 61 72 63 68 2c 20 70 74 72 2c 20 73  ian_arch, ptr, s
33db0 7a 2c 20 26 63 6f 6e 73 75 6d 65 64 29 29 0a 09  z, &consumed))..
33dc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
33dd0 09 20 20 70 74 72 20 2b 3d 20 63 6f 6e 73 75 6d  .  ptr += consum
33de0 65 64 3b 0a 09 20 20 73 7a 20 2d 3d 20 63 6f 6e  ed;..  sz -= con
33df0 73 75 6d 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  sumed;.      }. 
33e00 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a     return 1;.}..
33e10 73 74 61 74 69 63 20 69 6e 74 0a 67 65 6f 6d 43  static int.geomC
33e20 6f 6c 6c 65 63 74 69 6f 6e 46 72 6f 6d 46 67 66  ollectionFromFgf
33e30 20 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74   (gaiaGeomCollPt
33e40 72 20 67 65 6f 6d 2c 20 69 6e 74 20 65 6e 64 69  r geom, int endi
33e50 61 6e 5f 61 72 63 68 2c 0a 09 09 20 20 20 20 20  an_arch,...     
33e60 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
33e70 20 63 68 61 72 20 2a 62 6c 6f 62 2c 20 75 6e 73   char *blob, uns
33e80 69 67 6e 65 64 20 69 6e 74 20 73 69 7a 65 29 0a  igned int size).
33e90 7b 0a 2f 2a 20 64 65 63 6f 64 69 6e 67 20 61 20  {./* decoding a 
33ea0 20 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54   GEOMETRYCOLLECT
33eb0 49 4f 4e 20 47 65 6f 6d 65 74 72 79 20 66 72 6f  ION Geometry fro
33ec0 6d 20 46 47 46 20 20 2a 2f 0a 20 20 20 20 69 6e  m FGF  */.    in
33ed0 74 20 67 65 6f 6d 73 3b 0a 20 20 20 20 69 6e 74  t geoms;.    int
33ee0 20 69 67 3b 0a 20 20 20 20 69 6e 74 20 67 65 6f   ig;.    int geo
33ef0 6d 5f 74 79 70 65 3b 0a 20 20 20 20 75 6e 73 69  m_type;.    unsi
33f00 67 6e 65 64 20 69 6e 74 20 73 7a 20 3d 20 73 69  gned int sz = si
33f10 7a 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  ze;.    const un
33f20 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 74 72  signed char *ptr
33f30 20 3d 20 62 6c 6f 62 3b 0a 20 20 20 20 75 6e 73   = blob;.    uns
33f40 69 67 6e 65 64 20 69 6e 74 20 63 6f 6e 73 75 6d  igned int consum
33f50 65 64 3b 0a 2f 2a 20 63 68 65 63 6b 69 6e 67 20  ed;./* checking 
33f60 47 65 6f 6d 65 74 72 79 20 54 79 70 65 20 2a 2f  Geometry Type */
33f70 0a 20 20 20 20 69 66 20 28 73 7a 20 3c 20 34 29  .    if (sz < 4)
33f80 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ..return 0;.    
33f90 69 66 20 28 67 61 69 61 49 6d 70 6f 72 74 33 32  if (gaiaImport32
33fa0 0a 09 28 70 74 72 2c 20 47 41 49 41 5f 4c 49 54  ..(ptr, GAIA_LIT
33fb0 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65 6e 64 69  TLE_ENDIAN, endi
33fc0 61 6e 5f 61 72 63 68 29 20 21 3d 20 47 41 49 41  an_arch) != GAIA
33fd0 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43 54  _GEOMETRYCOLLECT
33fe0 49 4f 4e 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a  ION)..return 0;.
33ff0 20 20 20 20 70 74 72 20 2b 3d 20 34 3b 0a 20 20      ptr += 4;.  
34000 20 20 73 7a 20 2d 3d 20 34 3b 0a 2f 2a 20 68 6f    sz -= 4;./* ho
34010 77 20 6d 61 6e 79 20 69 6e 64 69 76 69 64 75 61  w many individua
34020 6c 20 47 65 6f 6d 65 74 72 69 65 73 20 61 72 65  l Geometries are
34030 20 74 68 65 72 65 20 3f 20 2a 2f 0a 20 20 20 20   there ? */.    
34040 69 66 20 28 73 7a 20 3c 20 34 29 0a 09 72 65 74  if (sz < 4)..ret
34050 75 72 6e 20 30 3b 0a 20 20 20 20 67 65 6f 6d 73  urn 0;.    geoms
34060 20 3d 20 67 61 69 61 49 6d 70 6f 72 74 33 32 20   = gaiaImport32 
34070 28 70 74 72 2c 20 47 41 49 41 5f 4c 49 54 54 4c  (ptr, GAIA_LITTL
34080 45 5f 45 4e 44 49 41 4e 2c 20 65 6e 64 69 61 6e  E_ENDIAN, endian
34090 5f 61 72 63 68 29 3b 0a 20 20 20 20 70 74 72 20  _arch);.    ptr 
340a0 2b 3d 20 34 3b 0a 20 20 20 20 73 7a 20 2d 3d 20  += 4;.    sz -= 
340b0 34 3b 0a 20 20 20 20 69 66 20 28 67 65 6f 6d 73  4;.    if (geoms
340c0 20 3c 20 31 29 0a 09 72 65 74 75 72 6e 20 30 3b   < 1)..return 0;
340d0 0a 20 20 20 20 66 6f 72 20 28 69 67 20 3d 20 30  .    for (ig = 0
340e0 3b 20 69 67 20 3c 20 67 65 6f 6d 73 3b 20 69 67  ; ig < geoms; ig
340f0 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f  ++).      {..  /
34100 2a 20 66 65 74 63 68 69 6e 67 20 69 6e 64 69 76  * fetching indiv
34110 69 64 75 61 6c 20 47 65 6f 6d 65 74 72 69 65 73  idual Geometries
34120 20 66 72 6f 6d 20 46 47 46 20 2a 2f 0a 09 20 20   from FGF */..  
34130 69 66 20 28 73 7a 20 3c 20 34 29 0a 09 20 20 20  if (sz < 4)..   
34140 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 20 20     return 0;..  
34150 67 65 6f 6d 5f 74 79 70 65 20 3d 20 67 61 69 61  geom_type = gaia
34160 49 6d 70 6f 72 74 33 32 20 28 70 74 72 2c 20 47  Import32 (ptr, G
34170 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41  AIA_LITTLE_ENDIA
34180 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  N, endian_arch);
34190 0a 09 20 20 73 77 69 74 63 68 20 28 67 65 6f 6d  ..  switch (geom
341a0 5f 74 79 70 65 29 0a 09 20 20 20 20 7b 0a 09 20  _type)..    {.. 
341b0 20 20 20 63 61 73 65 20 47 41 49 41 5f 50 4f 49     case GAIA_POI
341c0 4e 54 3a 0a 09 09 69 66 20 28 21 70 6f 69 6e 74  NT:...if (!point
341d0 46 72 6f 6d 46 67 66 20 28 67 65 6f 6d 2c 20 65  FromFgf (geom, e
341e0 6e 64 69 61 6e 5f 61 72 63 68 2c 20 70 74 72 2c  ndian_arch, ptr,
341f0 20 73 7a 2c 20 26 63 6f 6e 73 75 6d 65 64 29 29   sz, &consumed))
34200 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ...    return 0;
34210 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63  ...break;..    c
34220 61 73 65 20 47 41 49 41 5f 4c 49 4e 45 53 54 52  ase GAIA_LINESTR
34230 49 4e 47 3a 0a 09 09 69 66 20 28 21 6c 69 6e 65  ING:...if (!line
34240 73 74 72 69 6e 67 46 72 6f 6d 46 67 66 20 28 67  stringFromFgf (g
34250 65 6f 6d 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  eom, endian_arch
34260 2c 20 70 74 72 2c 20 73 7a 2c 20 26 63 6f 6e 73  , ptr, sz, &cons
34270 75 6d 65 64 29 29 0a 09 09 20 20 20 20 72 65 74  umed))...    ret
34280 75 72 6e 20 30 3b 0a 09 09 62 72 65 61 6b 3b 0a  urn 0;...break;.
34290 09 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 50  .    case GAIA_P
342a0 4f 4c 59 47 4f 4e 3a 0a 09 09 69 66 20 28 21 70  OLYGON:...if (!p
342b0 6f 6c 79 67 6f 6e 46 72 6f 6d 46 67 66 20 28 67  olygonFromFgf (g
342c0 65 6f 6d 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  eom, endian_arch
342d0 2c 20 70 74 72 2c 20 73 7a 2c 20 26 63 6f 6e 73  , ptr, sz, &cons
342e0 75 6d 65 64 29 29 0a 09 09 20 20 20 20 72 65 74  umed))...    ret
342f0 75 72 6e 20 30 3b 0a 09 09 62 72 65 61 6b 3b 0a  urn 0;...break;.
34300 09 20 20 20 20 64 65 66 61 75 6c 74 3a 09 09 2f  .    default:../
34310 2a 20 75 6e 73 75 70 70 6f 72 74 65 64 20 67 65  * unsupported ge
34320 6f 6d 65 74 72 79 20 74 79 70 65 20 2a 2f 0a 09  ometry type */..
34330 09 72 65 74 75 72 6e 20 30 3b 0a 09 09 62 72 65  .return 0;...bre
34340 61 6b 3b 0a 09 20 20 20 20 7d 3b 0a 09 20 20 70  ak;..    };..  p
34350 74 72 20 2b 3d 20 63 6f 6e 73 75 6d 65 64 3b 0a  tr += consumed;.
34360 09 20 20 73 7a 20 2d 3d 20 63 6f 6e 73 75 6d 65  .  sz -= consume
34370 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72  d;.      }.    r
34380 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 47 41 49 41  eturn 1;.}..GAIA
34390 47 45 4f 5f 44 45 43 4c 41 52 45 20 67 61 69 61  GEO_DECLARE gaia
343a0 47 65 6f 6d 43 6f 6c 6c 50 74 72 0a 67 61 69 61  GeomCollPtr.gaia
343b0 46 72 6f 6d 46 67 66 20 28 63 6f 6e 73 74 20 75  FromFgf (const u
343c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 6c  nsigned char *bl
343d0 6f 62 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ob, unsigned int
343e0 20 73 69 7a 65 29 0a 7b 0a 2f 2a 20 64 65 63 6f   size).{./* deco
343f0 64 69 6e 67 20 66 72 6f 6d 20 46 47 46 20 74 6f  ding from FGF to
34400 20 47 45 4f 4d 45 54 52 59 20 20 2a 2f 0a 20 20   GEOMETRY  */.  
34410 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74    gaiaGeomCollPt
34420 72 20 67 65 6f 6d 20 3d 20 4e 55 4c 4c 3b 0a 20  r geom = NULL;. 
34430 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 69 6e     int t;.    in
34440 74 20 64 3b 0a 20 20 20 20 69 6e 74 20 67 65 6f  t d;.    int geo
34450 6d 5f 74 79 70 65 3b 0a 20 20 20 20 69 6e 74 20  m_type;.    int 
34460 64 69 6d 73 3b 0a 20 20 20 20 69 6e 74 20 65 6e  dims;.    int en
34470 64 69 61 6e 5f 61 72 63 68 20 3d 20 67 61 69 61  dian_arch = gaia
34480 45 6e 64 69 61 6e 41 72 63 68 20 28 29 3b 0a 20  EndianArch ();. 
34490 20 20 20 69 66 20 28 73 69 7a 65 20 3c 20 31 36     if (size < 16
344a0 29 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  )..return NULL;.
344b0 0a 2f 2a 20 63 68 65 63 6b 69 6e 67 20 46 47 46  ./* checking FGF
344c0 20 74 79 70 65 20 61 6e 64 20 64 69 6d 65 6e 73   type and dimens
344d0 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 74 20 3d 20  ions */.    t = 
344e0 67 61 69 61 49 6d 70 6f 72 74 33 32 20 28 62 6c  gaiaImport32 (bl
344f0 6f 62 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f  ob, GAIA_LITTLE_
34500 45 4e 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61  ENDIAN, endian_a
34510 72 63 68 29 3b 0a 20 20 20 20 69 66 20 28 74 20  rch);.    if (t 
34520 3d 3d 20 31 20 7c 7c 20 74 20 3d 3d 20 32 20 7c  == 1 || t == 2 |
34530 7c 20 74 20 3d 3d 20 33 29 0a 20 20 20 20 20 20  | t == 3).      
34540 7b 0a 09 20 20 2f 2a 20 65 6c 65 6d 65 6e 74 61  {..  /* elementa
34550 72 79 3a 20 50 4f 49 4e 54 2c 20 4c 49 4e 45 53  ry: POINT, LINES
34560 54 52 49 4e 47 20 6f 72 20 50 4f 4c 59 47 4f 4e  TRING or POLYGON
34570 20 2a 2f 0a 09 20 20 64 20 3d 20 67 61 69 61 49   */..  d = gaiaI
34580 6d 70 6f 72 74 33 32 20 28 62 6c 6f 62 20 2b 20  mport32 (blob + 
34590 34 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45  4, GAIA_LITTLE_E
345a0 4e 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72  NDIAN, endian_ar
345b0 63 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ch);.      }.   
345c0 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20   else.      {.. 
345d0 20 2f 2a 20 6d 75 6c 74 69 70 6c 65 20 65 6c 65   /* multiple ele
345e0 6d 65 6e 74 73 20 2a 2f 0a 09 20 20 64 20 3d 20  ments */..  d = 
345f0 67 61 69 61 49 6d 70 6f 72 74 33 32 20 28 62 6c  gaiaImport32 (bl
34600 6f 62 20 2b 20 31 32 2c 20 47 41 49 41 5f 4c 49  ob + 12, GAIA_LI
34610 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65 6e 64  TTLE_ENDIAN, end
34620 69 61 6e 5f 61 72 63 68 29 3b 0a 20 20 20 20 20  ian_arch);.     
34630 20 7d 0a 20 20 20 20 69 66 20 28 21 63 68 65 63   }.    if (!chec
34640 6b 46 67 66 54 79 70 65 44 69 6d 73 20 28 74 2c  kFgfTypeDims (t,
34650 20 64 2c 20 26 67 65 6f 6d 5f 74 79 70 65 2c 20   d, &geom_type, 
34660 26 64 69 6d 73 29 29 0a 09 72 65 74 75 72 6e 20  &dims))..return 
34670 4e 55 4c 4c 3b 0a 0a 2f 2a 20 61 6c 6c 6f 63 61  NULL;../* alloca
34680 74 69 6e 67 20 61 20 47 61 69 61 20 47 65 6f 6d  ting a Gaia Geom
34690 65 74 72 79 20 61 63 63 6f 72 64 69 6e 67 6c 79  etry accordingly
346a0 20 74 6f 20 64 65 63 6c 61 72 65 64 20 44 69 6d   to declared Dim
346b0 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 64 69 6d  s */.    if (dim
346c0 73 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d  s == GAIA_XY_Z_M
346d0 29 0a 09 67 65 6f 6d 20 3d 20 67 61 69 61 41 6c  )..geom = gaiaAl
346e0 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 5a 4d 20  locGeomCollXYZM 
346f0 28 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 20  ();.    else if 
34700 28 64 69 6d 73 20 3d 3d 20 47 41 49 41 5f 58 59  (dims == GAIA_XY
34710 5f 5a 29 0a 09 67 65 6f 6d 20 3d 20 67 61 69 61  _Z)..geom = gaia
34720 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59 5a  AllocGeomCollXYZ
34730 20 28 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66   ();.    else if
34740 20 28 64 69 6d 73 20 3d 3d 20 47 41 49 41 5f 58   (dims == GAIA_X
34750 59 5f 4d 29 0a 09 67 65 6f 6d 20 3d 20 67 61 69  Y_M)..geom = gai
34760 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 58 59  aAllocGeomCollXY
34770 4d 20 28 29 3b 0a 20 20 20 20 65 6c 73 65 0a 09  M ();.    else..
34780 67 65 6f 6d 20 3d 20 67 61 69 61 41 6c 6c 6f 63  geom = gaiaAlloc
34790 47 65 6f 6d 43 6f 6c 6c 20 28 29 3b 0a 20 20 20  GeomColl ();.   
347a0 20 67 65 6f 6d 2d 3e 44 65 63 6c 61 72 65 64 54   geom->DeclaredT
347b0 79 70 65 20 3d 20 67 65 6f 6d 5f 74 79 70 65 3b  ype = geom_type;
347c0 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 67 65  ..    switch (ge
347d0 6f 6d 5f 74 79 70 65 29 0a 20 20 20 20 20 20 7b  om_type).      {
347e0 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41  .      case GAIA
347f0 5f 50 4f 49 4e 54 3a 0a 09 20 20 69 66 20 28 70  _POINT:..  if (p
34800 6f 69 6e 74 46 72 6f 6d 46 67 66 20 28 67 65 6f  ointFromFgf (geo
34810 6d 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 2c 20  m, endian_arch, 
34820 62 6c 6f 62 2c 20 73 69 7a 65 2c 20 4e 55 4c 4c  blob, size, NULL
34830 29 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e  ))..      return
34840 20 67 65 6f 6d 3b 0a 09 20 20 62 72 65 61 6b 3b   geom;..  break;
34850 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41  .      case GAIA
34860 5f 4c 49 4e 45 53 54 52 49 4e 47 3a 0a 09 20 20  _LINESTRING:..  
34870 69 66 20 28 6c 69 6e 65 73 74 72 69 6e 67 46 72  if (linestringFr
34880 6f 6d 46 67 66 20 28 67 65 6f 6d 2c 20 65 6e 64  omFgf (geom, end
34890 69 61 6e 5f 61 72 63 68 2c 20 62 6c 6f 62 2c 20  ian_arch, blob, 
348a0 73 69 7a 65 2c 20 4e 55 4c 4c 29 29 0a 09 20 20  size, NULL))..  
348b0 20 20 20 20 72 65 74 75 72 6e 20 67 65 6f 6d 3b      return geom;
348c0 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ..  break;.     
348d0 20 63 61 73 65 20 47 41 49 41 5f 50 4f 4c 59 47   case GAIA_POLYG
348e0 4f 4e 3a 0a 09 20 20 69 66 20 28 70 6f 6c 79 67  ON:..  if (polyg
348f0 6f 6e 46 72 6f 6d 46 67 66 20 28 67 65 6f 6d 2c  onFromFgf (geom,
34900 20 65 6e 64 69 61 6e 5f 61 72 63 68 2c 20 62 6c   endian_arch, bl
34910 6f 62 2c 20 73 69 7a 65 2c 20 4e 55 4c 4c 29 29  ob, size, NULL))
34920 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 67  ..      return g
34930 65 6f 6d 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20  eom;..  break;. 
34940 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f 4d       case GAIA_M
34950 55 4c 54 49 50 4f 49 4e 54 3a 0a 09 20 20 69 66  ULTIPOINT:..  if
34960 20 28 6d 75 6c 74 69 50 6f 69 6e 74 46 72 6f 6d   (multiPointFrom
34970 46 67 66 20 28 67 65 6f 6d 2c 20 65 6e 64 69 61  Fgf (geom, endia
34980 6e 5f 61 72 63 68 2c 20 62 6c 6f 62 2c 20 73 69  n_arch, blob, si
34990 7a 65 29 29 0a 09 20 20 20 20 20 20 72 65 74 75  ze))..      retu
349a0 72 6e 20 67 65 6f 6d 3b 0a 09 20 20 62 72 65 61  rn geom;..  brea
349b0 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47 41  k;.      case GA
349c0 49 41 5f 4d 55 4c 54 49 4c 49 4e 45 53 54 52 49  IA_MULTILINESTRI
349d0 4e 47 3a 0a 09 20 20 69 66 20 28 6d 75 6c 74 69  NG:..  if (multi
349e0 4c 69 6e 65 73 74 72 69 6e 67 46 72 6f 6d 46 67  LinestringFromFg
349f0 66 20 28 67 65 6f 6d 2c 20 65 6e 64 69 61 6e 5f  f (geom, endian_
34a00 61 72 63 68 2c 20 62 6c 6f 62 2c 20 73 69 7a 65  arch, blob, size
34a10 29 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e  ))..      return
34a20 20 67 65 6f 6d 3b 0a 09 20 20 62 72 65 61 6b 3b   geom;..  break;
34a30 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41  .      case GAIA
34a40 5f 4d 55 4c 54 49 50 4f 4c 59 47 4f 4e 3a 0a 09  _MULTIPOLYGON:..
34a50 20 20 69 66 20 28 6d 75 6c 74 69 50 6f 6c 79 67    if (multiPolyg
34a60 6f 6e 46 72 6f 6d 46 67 66 20 28 67 65 6f 6d 2c  onFromFgf (geom,
34a70 20 65 6e 64 69 61 6e 5f 61 72 63 68 2c 20 62 6c   endian_arch, bl
34a80 6f 62 2c 20 73 69 7a 65 29 29 0a 09 20 20 20 20  ob, size))..    
34a90 20 20 72 65 74 75 72 6e 20 67 65 6f 6d 3b 0a 09    return geom;..
34aa0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
34ab0 61 73 65 20 47 41 49 41 5f 47 45 4f 4d 45 54 52  ase GAIA_GEOMETR
34ac0 59 43 4f 4c 4c 45 43 54 49 4f 4e 3a 0a 09 20 20  YCOLLECTION:..  
34ad0 69 66 20 28 67 65 6f 6d 43 6f 6c 6c 65 63 74 69  if (geomCollecti
34ae0 6f 6e 46 72 6f 6d 46 67 66 20 28 67 65 6f 6d 2c  onFromFgf (geom,
34af0 20 65 6e 64 69 61 6e 5f 61 72 63 68 2c 20 62 6c   endian_arch, bl
34b00 6f 62 2c 20 73 69 7a 65 29 29 0a 09 20 20 20 20  ob, size))..    
34b10 20 20 72 65 74 75 72 6e 20 67 65 6f 6d 3b 0a 09    return geom;..
34b20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
34b30 3b 0a 20 20 20 20 67 61 69 61 46 72 65 65 47 65  ;.    gaiaFreeGe
34b40 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 29 3b 0a 20  omColl (geom);. 
34b50 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
34b60 7d 0a 0a 47 41 49 41 47 45 4f 5f 44 45 43 4c 41  }..GAIAGEO_DECLA
34b70 52 45 20 76 6f 69 64 0a 67 61 69 61 54 6f 46 67  RE void.gaiaToFg
34b80 66 20 28 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50  f (gaiaGeomCollP
34b90 74 72 20 67 65 6f 6d 2c 20 75 6e 73 69 67 6e 65  tr geom, unsigne
34ba0 64 20 63 68 61 72 20 2a 2a 72 65 73 75 6c 74 2c  d char **result,
34bb0 20 69 6e 74 20 2a 73 69 7a 65 29 0a 7b 0a 2f 2a   int *size).{./*
34bc0 20 62 75 69 6c 64 73 20 74 68 65 20 46 47 46 20   builds the FGF 
34bd0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66  representation f
34be0 6f 72 20 74 68 69 73 20 47 45 4f 4d 45 54 52 59  or this GEOMETRY
34bf0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 62 3b 0a   */.    int ib;.
34c00 20 20 20 20 69 6e 74 20 69 76 3b 0a 20 20 20 20      int iv;.    
34c10 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 64 6f  double x;.    do
34c20 75 62 6c 65 20 79 3b 0a 20 20 20 20 64 6f 75 62  uble y;.    doub
34c30 6c 65 20 7a 3b 0a 20 20 20 20 64 6f 75 62 6c 65  le z;.    double
34c40 20 6d 3b 0a 20 20 20 20 69 6e 74 20 65 6e 74 69   m;.    int enti
34c50 74 69 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ties = 0;.    in
34c60 74 20 6e 5f 70 6f 69 6e 74 73 20 3d 20 30 3b 0a  t n_points = 0;.
34c70 20 20 20 20 69 6e 74 20 6e 5f 6c 69 6e 65 73 74      int n_linest
34c80 72 69 6e 67 73 20 3d 20 30 3b 0a 20 20 20 20 69  rings = 0;.    i
34c90 6e 74 20 6e 5f 70 6f 6c 79 67 6f 6e 73 20 3d 20  nt n_polygons = 
34ca0 30 3b 0a 20 20 20 20 69 6e 74 20 74 79 70 65 3b  0;.    int type;
34cb0 0a 20 20 20 20 69 6e 74 20 6e 5f 63 6f 6f 72 64  .    int n_coord
34cc0 73 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 5f  s;.    int flag_
34cd0 64 69 6d 73 3b 0a 20 20 20 20 75 6e 73 69 67 6e  dims;.    unsign
34ce0 65 64 20 63 68 61 72 20 2a 70 74 72 3b 0a 20 20  ed char *ptr;.  
34cf0 20 20 69 6e 74 20 73 7a 20 3d 20 30 3b 0a 20 20    int sz = 0;.  
34d00 20 20 67 61 69 61 50 6f 69 6e 74 50 74 72 20 70    gaiaPointPtr p
34d10 74 3b 0a 20 20 20 20 67 61 69 61 4c 69 6e 65 73  t;.    gaiaLines
34d20 74 72 69 6e 67 50 74 72 20 6c 6e 3b 0a 20 20 20  tringPtr ln;.   
34d30 20 67 61 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20   gaiaPolygonPtr 
34d40 70 67 3b 0a 20 20 20 20 67 61 69 61 52 69 6e 67  pg;.    gaiaRing
34d50 50 74 72 20 72 6e 67 3b 0a 20 20 20 20 67 61 69  Ptr rng;.    gai
34d60 61 50 6f 69 6e 74 50 74 72 20 70 6f 69 6e 74 20  aPointPtr point 
34d70 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 61 69 61  = NULL;.    gaia
34d80 4c 69 6e 65 73 74 72 69 6e 67 50 74 72 20 6c 69  LinestringPtr li
34d90 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67  ne = NULL;.    g
34da0 61 69 61 50 6f 6c 79 67 6f 6e 50 74 72 20 70 6f  aiaPolygonPtr po
34db0 6c 79 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  lyg = NULL;.    
34dc0 69 6e 74 20 65 6e 64 69 61 6e 5f 61 72 63 68 20  int endian_arch 
34dd0 3d 20 67 61 69 61 45 6e 64 69 61 6e 41 72 63 68  = gaiaEndianArch
34de0 20 28 29 3b 0a 0a 20 20 20 20 67 61 69 61 4d 62   ();..    gaiaMb
34df0 72 47 65 6f 6d 65 74 72 79 20 28 67 65 6f 6d 29  rGeometry (geom)
34e00 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 67 65  ;.    switch (ge
34e10 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  om->DimensionMod
34e20 65 6c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f  el).      {..  /
34e30 2a 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 74 68  * determining th
34e40 65 20 44 69 6d 65 6e 73 69 6f 6e 73 20 2a 2f 0a  e Dimensions */.
34e50 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41 5f        case GAIA_
34e60 58 59 3a 0a 09 20 20 66 6c 61 67 5f 64 69 6d 73  XY:..  flag_dims
34e70 20 3d 20 30 3b 0a 09 20 20 6e 5f 63 6f 6f 72 64   = 0;..  n_coord
34e80 73 20 3d 20 32 3b 0a 09 20 20 62 72 65 61 6b 3b  s = 2;..  break;
34e90 0a 20 20 20 20 20 20 63 61 73 65 20 47 41 49 41  .      case GAIA
34ea0 5f 58 59 5f 5a 3a 0a 09 20 20 66 6c 61 67 5f 64  _XY_Z:..  flag_d
34eb0 69 6d 73 20 3d 20 31 3b 0a 09 20 20 6e 5f 63 6f  ims = 1;..  n_co
34ec0 6f 72 64 73 20 3d 20 33 3b 0a 09 20 20 62 72 65  ords = 3;..  bre
34ed0 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 47  ak;.      case G
34ee0 41 49 41 5f 58 59 5f 4d 3a 0a 09 20 20 66 6c 61  AIA_XY_M:..  fla
34ef0 67 5f 64 69 6d 73 20 3d 20 32 3b 0a 09 20 20 6e  g_dims = 2;..  n
34f00 5f 63 6f 6f 72 64 73 20 3d 20 33 3b 0a 09 20 20  _coords = 3;..  
34f10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
34f20 65 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 3a 0a 09  e GAIA_XY_Z_M:..
34f30 20 20 66 6c 61 67 5f 64 69 6d 73 20 3d 20 33 3b    flag_dims = 3;
34f40 0a 09 20 20 6e 5f 63 6f 6f 72 64 73 20 3d 20 34  ..  n_coords = 4
34f50 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;..  break;.    
34f60 20 20 64 65 66 61 75 6c 74 3a 0a 09 20 20 6e 5f    default:..  n_
34f70 63 6f 6f 72 64 73 20 3d 20 30 3b 0a 09 20 20 62  coords = 0;..  b
34f80 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a  reak;.      }./*
34f90 20 68 6f 77 20 6d 61 6e 79 20 65 6e 74 69 74 69   how many entiti
34fa0 65 73 2c 20 61 6e 64 20 6f 66 20 77 68 61 74 20  es, and of what 
34fb0 6b 69 6e 64 2c 20 64 6f 20 77 65 20 68 61 76 65  kind, do we have
34fc0 20 3f 20 2a 2f 0a 20 20 20 20 70 74 20 3d 20 67   ? */.    pt = g
34fd0 65 6f 6d 2d 3e 46 69 72 73 74 50 6f 69 6e 74 3b  eom->FirstPoint;
34fe0 0a 20 20 20 20 77 68 69 6c 65 20 28 70 74 29 0a  .    while (pt).
34ff0 20 20 20 20 20 20 7b 0a 09 20 20 70 6f 69 6e 74        {..  point
35000 20 3d 20 70 74 3b 0a 09 20 20 65 6e 74 69 74 69   = pt;..  entiti
35010 65 73 2b 2b 3b 0a 09 20 20 6e 5f 70 6f 69 6e 74  es++;..  n_point
35020 73 2b 2b 3b 0a 09 20 20 70 74 20 3d 20 70 74 2d  s++;..  pt = pt-
35030 3e 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  >Next;.      }. 
35040 20 20 20 6c 6e 20 3d 20 67 65 6f 6d 2d 3e 46 69     ln = geom->Fi
35050 72 73 74 4c 69 6e 65 73 74 72 69 6e 67 3b 0a 20  rstLinestring;. 
35060 20 20 20 77 68 69 6c 65 20 28 6c 6e 29 0a 20 20     while (ln).  
35070 20 20 20 20 7b 0a 09 20 20 6c 69 6e 65 20 3d 20      {..  line = 
35080 6c 6e 3b 0a 09 20 20 65 6e 74 69 74 69 65 73 2b  ln;..  entities+
35090 2b 3b 0a 09 20 20 6e 5f 6c 69 6e 65 73 74 72 69  +;..  n_linestri
350a0 6e 67 73 2b 2b 3b 0a 09 20 20 6c 6e 20 3d 20 6c  ngs++;..  ln = l
350b0 6e 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  n->Next;.      }
350c0 0a 20 20 20 20 70 67 20 3d 20 67 65 6f 6d 2d 3e  .    pg = geom->
350d0 46 69 72 73 74 50 6f 6c 79 67 6f 6e 3b 0a 20 20  FirstPolygon;.  
350e0 20 20 77 68 69 6c 65 20 28 70 67 29 0a 20 20 20    while (pg).   
350f0 20 20 20 7b 0a 09 20 20 70 6f 6c 79 67 20 3d 20     {..  polyg = 
35100 70 67 3b 0a 09 20 20 65 6e 74 69 74 69 65 73 2b  pg;..  entities+
35110 2b 3b 0a 09 20 20 6e 5f 70 6f 6c 79 67 6f 6e 73  +;..  n_polygons
35120 2b 2b 3b 0a 09 20 20 70 67 20 3d 20 70 67 2d 3e  ++;..  pg = pg->
35130 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
35140 20 20 2a 73 69 7a 65 20 3d 20 30 3b 0a 20 20 20    *size = 0;.   
35150 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 2a 72 65   sz = 0;.    *re
35160 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  sult = NULL;.   
35170 20 69 66 20 28 6e 5f 70 6f 69 6e 74 73 20 3d 3d   if (n_points ==
35180 20 30 20 26 26 20 6e 5f 70 6f 6c 79 67 6f 6e 73   0 && n_polygons
35190 20 3d 3d 20 30 20 26 26 20 6e 5f 6c 69 6e 65 73   == 0 && n_lines
351a0 74 72 69 6e 67 73 20 3d 3d 20 30 29 0a 09 72 65  trings == 0)..re
351b0 74 75 72 6e 3b 0a 2f 2a 20 6f 6b 2c 20 77 65 20  turn;./* ok, we 
351c0 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20 74 68  can determine th
351d0 65 20 67 65 6f 6d 65 74 72 79 20 63 6c 61 73 73  e geometry class
351e0 20 2a 2f 0a 20 20 20 20 69 66 20 28 6e 5f 70 6f   */.    if (n_po
351f0 69 6e 74 73 20 3d 3d 20 31 20 26 26 20 6e 5f 6c  ints == 1 && n_l
35200 69 6e 65 73 74 72 69 6e 67 73 20 3d 3d 20 30 20  inestrings == 0 
35210 26 26 20 6e 5f 70 6f 6c 79 67 6f 6e 73 20 3d 3d  && n_polygons ==
35220 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69   0).      {..  i
35230 66 20 28 67 65 6f 6d 2d 3e 44 65 63 6c 61 72 65  f (geom->Declare
35240 64 54 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55  dType == GAIA_MU
35250 4c 54 49 50 4f 49 4e 54 29 0a 09 20 20 20 20 20  LTIPOINT)..     
35260 20 74 79 70 65 20 3d 20 34 3b 0a 09 20 20 65 6c   type = 4;..  el
35270 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 65 63  se if (geom->Dec
35280 6c 61 72 65 64 54 79 70 65 20 3d 3d 20 47 41 49  laredType == GAI
35290 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45 43  A_GEOMETRYCOLLEC
352a0 54 49 4f 4e 29 0a 09 20 20 20 20 20 20 74 79 70  TION)..      typ
352b0 65 20 3d 20 37 3b 0a 09 20 20 65 6c 73 65 0a 09  e = 7;..  else..
352c0 20 20 20 20 20 20 74 79 70 65 20 3d 20 31 3b 0a        type = 1;.
352d0 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65        }.    else
352e0 20 69 66 20 28 6e 5f 70 6f 69 6e 74 73 20 3e 20   if (n_points > 
352f0 31 20 26 26 20 6e 5f 6c 69 6e 65 73 74 72 69 6e  1 && n_linestrin
35300 67 73 20 3d 3d 20 30 20 26 26 20 6e 5f 70 6f 6c  gs == 0 && n_pol
35310 79 67 6f 6e 73 20 3d 3d 20 30 29 0a 20 20 20 20  ygons == 0).    
35320 20 20 7b 0a 09 20 20 69 66 20 28 67 65 6f 6d 2d    {..  if (geom-
35330 3e 44 65 63 6c 61 72 65 64 54 79 70 65 20 3d 3d  >DeclaredType ==
35340 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f   GAIA_GEOMETRYCO
35350 4c 4c 45 43 54 49 4f 4e 29 0a 09 20 20 20 20 20  LLECTION)..     
35360 20 74 79 70 65 20 3d 20 37 3b 0a 09 20 20 65 6c   type = 7;..  el
35370 73 65 0a 09 20 20 20 20 20 20 74 79 70 65 20 3d  se..      type =
35380 20 34 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   4;.      }.    
35390 65 6c 73 65 20 69 66 20 28 6e 5f 70 6f 69 6e 74  else if (n_point
353a0 73 20 3d 3d 20 30 20 26 26 20 6e 5f 6c 69 6e 65  s == 0 && n_line
353b0 73 74 72 69 6e 67 73 20 3d 3d 20 31 20 26 26 20  strings == 1 && 
353c0 6e 5f 70 6f 6c 79 67 6f 6e 73 20 3d 3d 20 30 29  n_polygons == 0)
353d0 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28  .      {..  if (
353e0 67 65 6f 6d 2d 3e 44 65 63 6c 61 72 65 64 54 79  geom->DeclaredTy
353f0 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c 54 49  pe == GAIA_MULTI
35400 4c 49 4e 45 53 54 52 49 4e 47 29 0a 09 20 20 20  LINESTRING)..   
35410 20 20 20 74 79 70 65 20 3d 20 35 3b 0a 09 20 20     type = 5;..  
35420 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44  else if (geom->D
35430 65 63 6c 61 72 65 64 54 79 70 65 20 3d 3d 20 47  eclaredType == G
35440 41 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c  AIA_GEOMETRYCOLL
35450 45 43 54 49 4f 4e 29 0a 09 20 20 20 20 20 20 74  ECTION)..      t
35460 79 70 65 20 3d 20 37 3b 0a 09 20 20 65 6c 73 65  ype = 7;..  else
35470 0a 09 20 20 20 20 20 20 74 79 70 65 20 3d 20 32  ..      type = 2
35480 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c  ;.      }.    el
35490 73 65 20 69 66 20 28 6e 5f 70 6f 69 6e 74 73 20  se if (n_points 
354a0 3d 3d 20 30 20 26 26 20 6e 5f 6c 69 6e 65 73 74  == 0 && n_linest
354b0 72 69 6e 67 73 20 3e 20 31 20 26 26 20 6e 5f 70  rings > 1 && n_p
354c0 6f 6c 79 67 6f 6e 73 20 3d 3d 20 30 29 0a 20 20  olygons == 0).  
354d0 20 20 20 20 7b 0a 09 20 20 69 66 20 28 67 65 6f      {..  if (geo
354e0 6d 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65 20  m->DeclaredType 
354f0 3d 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59  == GAIA_GEOMETRY
35500 43 4f 4c 4c 45 43 54 49 4f 4e 29 0a 09 20 20 20  COLLECTION)..   
35510 20 20 20 74 79 70 65 20 3d 20 37 3b 0a 09 20 20     type = 7;..  
35520 65 6c 73 65 0a 09 20 20 20 20 20 20 74 79 70 65  else..      type
35530 20 3d 20 35 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 5;.      }.  
35540 20 20 65 6c 73 65 20 69 66 20 28 6e 5f 70 6f 69    else if (n_poi
35550 6e 74 73 20 3d 3d 20 30 20 26 26 20 6e 5f 6c 69  nts == 0 && n_li
35560 6e 65 73 74 72 69 6e 67 73 20 3d 3d 20 30 20 26  nestrings == 0 &
35570 26 20 6e 5f 70 6f 6c 79 67 6f 6e 73 20 3d 3d 20  & n_polygons == 
35580 31 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66  1).      {..  if
35590 20 28 67 65 6f 6d 2d 3e 44 65 63 6c 61 72 65 64   (geom->Declared
355a0 54 79 70 65 20 3d 3d 20 47 41 49 41 5f 4d 55 4c  Type == GAIA_MUL
355b0 54 49 50 4f 4c 59 47 4f 4e 29 0a 09 20 20 20 20  TIPOLYGON)..    
355c0 20 20 74 79 70 65 20 3d 20 36 3b 0a 09 20 20 65    type = 6;..  e
355d0 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 65  lse if (geom->De
355e0 63 6c 61 72 65 64 54 79 70 65 20 3d 3d 20 47 41  claredType == GA
355f0 49 41 5f 47 45 4f 4d 45 54 52 59 43 4f 4c 4c 45  IA_GEOMETRYCOLLE
35600 43 54 49 4f 4e 29 0a 09 20 20 20 20 20 20 74 79  CTION)..      ty
35610 70 65 20 3d 20 37 3b 0a 09 20 20 65 6c 73 65 0a  pe = 7;..  else.
35620 09 20 20 20 20 20 20 74 79 70 65 20 3d 20 33 3b  .      type = 3;
35630 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  .      }.    els
35640 65 20 69 66 20 28 6e 5f 70 6f 69 6e 74 73 20 3d  e if (n_points =
35650 3d 20 30 20 26 26 20 6e 5f 6c 69 6e 65 73 74 72  = 0 && n_linestr
35660 69 6e 67 73 20 3d 3d 20 30 20 26 26 20 6e 5f 70  ings == 0 && n_p
35670 6f 6c 79 67 6f 6e 73 20 3e 20 31 29 0a 20 20 20  olygons > 1).   
35680 20 20 20 7b 0a 09 20 20 69 66 20 28 67 65 6f 6d     {..  if (geom
35690 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65 20 3d  ->DeclaredType =
356a0 3d 20 47 41 49 41 5f 47 45 4f 4d 45 54 52 59 43  = GAIA_GEOMETRYC
356b0 4f 4c 4c 45 43 54 49 4f 4e 29 0a 09 20 20 20 20  OLLECTION)..    
356c0 20 20 74 79 70 65 20 3d 20 37 3b 0a 09 20 20 65    type = 7;..  e
356d0 6c 73 65 0a 09 20 20 20 20 20 20 74 79 70 65 20  lse..      type 
356e0 3d 20 36 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 6;.      }.   
356f0 20 65 6c 73 65 0a 09 74 79 70 65 20 3d 20 37 3b   else..type = 7;
35700 0a 2f 2a 20 61 6e 64 20 6e 6f 77 20 77 65 20 63  ./* and now we c
35710 6f 6d 70 75 74 65 20 74 68 65 20 73 69 7a 65 20  ompute the size 
35720 6f 66 20 46 47 46 20 2a 2f 0a 20 20 20 20 69 66  of FGF */.    if
35730 20 28 74 79 70 65 20 3d 3d 20 34 20 7c 7c 20 74   (type == 4 || t
35740 79 70 65 20 3d 3d 20 35 20 7c 7c 20 74 79 70 65  ype == 5 || type
35750 20 3d 3d 20 36 20 7c 7c 20 74 79 70 65 20 3d 3d   == 6 || type ==
35760 20 37 29 0a 09 73 7a 20 2b 3d 20 38 3b 0a 20 20   7)..sz += 8;.  
35770 20 20 70 6f 69 6e 74 20 3d 20 67 65 6f 6d 2d 3e    point = geom->
35780 46 69 72 73 74 50 6f 69 6e 74 3b 0a 20 20 20 20  FirstPoint;.    
35790 77 68 69 6c 65 20 28 70 6f 69 6e 74 29 0a 20 20  while (point).  
357a0 20 20 20 20 7b 0a 09 20 20 73 7a 20 2b 3d 20 28      {..  sz += (
357b0 38 20 2b 20 28 6e 5f 63 6f 6f 72 64 73 20 2a 20  8 + (n_coords * 
357c0 38 29 29 3b 09 2f 2a 20 74 68 65 20 73 69 7a 65  8));./* the size
357d0 20 6f 66 20 65 61 63 68 20 50 4f 49 4e 54 20 2a   of each POINT *
357e0 2f 0a 09 20 20 70 6f 69 6e 74 20 3d 20 70 6f 69  /..  point = poi
357f0 6e 74 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20 20  nt->Next;.      
35800 7d 0a 20 20 20 20 6c 69 6e 65 20 3d 20 67 65 6f  }.    line = geo
35810 6d 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74 72 69  m->FirstLinestri
35820 6e 67 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 6c  ng;.    while (l
35830 69 6e 65 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ine).      {..  
35840 73 7a 20 2b 3d 20 28 31 32 20 2b 20 28 28 6e 5f  sz += (12 + ((n_
35850 63 6f 6f 72 64 73 20 2a 20 38 29 20 2a 20 6c 69  coords * 8) * li
35860 6e 65 2d 3e 50 6f 69 6e 74 73 29 29 3b 09 2f 2a  ne->Points));./*
35870 20 23 20 70 6f 69 6e 74 73 20 2b 20 5b 78 2c 79   # points + [x,y
35880 5d 20 66 6f 72 20 65 61 63 68 20 76 65 72 74 65  ] for each verte
35890 78 20 2a 2f 0a 09 20 20 6c 69 6e 65 20 3d 20 6c  x */..  line = l
358a0 69 6e 65 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20  ine->Next;.     
358b0 20 7d 0a 20 20 20 20 70 6f 6c 79 67 20 3d 20 67   }.    polyg = g
358c0 65 6f 6d 2d 3e 46 69 72 73 74 50 6f 6c 79 67 6f  eom->FirstPolygo
358d0 6e 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 70 6f  n;.    while (po
358e0 6c 79 67 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  lyg).      {..  
358f0 72 6e 67 20 3d 20 70 6f 6c 79 67 2d 3e 45 78 74  rng = polyg->Ext
35900 65 72 69 6f 72 3b 0a 09 20 20 73 7a 20 2b 3d 20  erior;..  sz += 
35910 28 31 36 20 2b 20 28 28 6e 5f 63 6f 6f 72 64 73  (16 + ((n_coords
35920 20 2a 20 38 29 20 2a 20 72 6e 67 2d 3e 50 6f 69   * 8) * rng->Poi
35930 6e 74 73 29 29 3b 09 2f 2a 20 23 20 72 69 6e 67  nts));./* # ring
35940 73 20 2b 20 23 20 70 6f 69 6e 74 73 20 2b 20 5b  s + # points + [
35950 78 2e 79 5d 20 61 72 72 61 79 20 2d 20 65 78 74  x.y] array - ext
35960 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09 20  erior ring */.. 
35970 20 66 6f 72 20 28 69 62 20 3d 20 30 3b 20 69 62   for (ib = 0; ib
35980 20 3c 20 70 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74   < polyg->NumInt
35990 65 72 69 6f 72 73 3b 20 69 62 2b 2b 29 0a 09 20  eriors; ib++).. 
359a0 20 20 20 7b 0a 09 09 72 6e 67 20 3d 20 70 6f 6c     {...rng = pol
359b0 79 67 2d 3e 49 6e 74 65 72 69 6f 72 73 20 2b 20  yg->Interiors + 
359c0 69 62 3b 0a 09 09 73 7a 20 2b 3d 20 28 34 20 2b  ib;...sz += (4 +
359d0 20 28 28 6e 5f 63 6f 6f 72 64 73 20 2a 20 38 29   ((n_coords * 8)
359e0 20 2a 20 72 6e 67 2d 3e 50 6f 69 6e 74 73 29 29   * rng->Points))
359f0 3b 09 2f 2a 20 23 20 70 6f 69 6e 74 73 20 2b 20  ;./* # points + 
35a00 5b 78 2c 79 5d 20 61 72 72 61 79 20 2d 20 69 6e  [x,y] array - in
35a10 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09  terior ring */..
35a20 20 20 20 20 7d 0a 09 20 20 70 6f 6c 79 67 20 3d      }..  polyg =
35a30 20 70 6f 6c 79 67 2d 3e 4e 65 78 74 3b 0a 20 20   polyg->Next;.  
35a40 20 20 20 20 7d 0a 20 20 20 20 2a 73 69 7a 65 20      }.    *size 
35a50 3d 20 73 7a 3b 0a 20 20 20 20 70 74 72 20 3d 20  = sz;.    ptr = 
35a60 6d 61 6c 6c 6f 63 20 28 73 7a 29 3b 0a 20 20 20  malloc (sz);.   
35a70 20 2a 72 65 73 75 6c 74 20 3d 20 70 74 72 3b 0a   *result = ptr;.
35a80 2f 2a 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 77  /* and finally w
35a90 65 20 62 75 69 6c 64 20 74 68 65 20 46 47 46 20  e build the FGF 
35aa0 2a 2f 0a 20 20 20 20 69 66 20 28 74 79 70 65 20  */.    if (type 
35ab0 3d 3d 20 34 20 7c 7c 20 74 79 70 65 20 3d 3d 20  == 4 || type == 
35ac0 35 20 7c 7c 20 74 79 70 65 20 3d 3d 20 36 20 7c  5 || type == 6 |
35ad0 7c 20 74 79 70 65 20 3d 3d 20 37 29 0a 20 20 20  | type == 7).   
35ae0 20 20 20 7b 0a 09 20 20 67 61 69 61 45 78 70 6f     {..  gaiaExpo
35af0 72 74 33 32 20 28 70 74 72 2c 20 74 79 70 65 2c  rt32 (ptr, type,
35b00 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44   GAIA_LITTLE_END
35b10 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  IAN, endian_arch
35b20 29 3b 09 2f 2a 20 47 65 6f 6d 65 74 72 79 20 54  );./* Geometry T
35b30 79 70 65 20 2a 2f 0a 09 20 20 70 74 72 20 2b 3d  ype */..  ptr +=
35b40 20 34 3b 0a 09 20 20 67 61 69 61 45 78 70 6f 72   4;..  gaiaExpor
35b50 74 33 32 20 28 70 74 72 2c 20 65 6e 74 69 74 69  t32 (ptr, entiti
35b60 65 73 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f  es, GAIA_LITTLE_
35b70 45 4e 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61  ENDIAN, endian_a
35b80 72 63 68 29 3b 09 2f 2a 20 69 74 27 73 20 61 20  rch);./* it's a 
35b90 63 6f 6c 6c 65 63 74 69 6f 6e 3b 20 23 20 65 6e  collection; # en
35ba0 74 69 74 69 65 73 20 2a 2f 0a 09 20 20 70 74 72  tities */..  ptr
35bb0 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 7d 0a 20   += 4;.      }. 
35bc0 20 20 20 70 6f 69 6e 74 20 3d 20 67 65 6f 6d 2d     point = geom-
35bd0 3e 46 69 72 73 74 50 6f 69 6e 74 3b 0a 20 20 20  >FirstPoint;.   
35be0 20 77 68 69 6c 65 20 28 70 6f 69 6e 74 29 0a 20   while (point). 
35bf0 20 20 20 20 20 7b 0a 09 20 20 67 61 69 61 45 78       {..  gaiaEx
35c00 70 6f 72 74 33 32 20 28 70 74 72 2c 20 31 2c 20  port32 (ptr, 1, 
35c10 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49  GAIA_LITTLE_ENDI
35c20 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29  AN, endian_arch)
35c30 3b 09 2f 2a 20 74 68 65 20 43 4c 41 53 53 20 54  ;./* the CLASS T
35c40 59 50 45 20 66 6f 72 20 74 68 69 73 20 65 6c 65  YPE for this ele
35c50 6d 65 6e 74 20 2a 2f 0a 09 20 20 70 74 72 20 2b  ment */..  ptr +
35c60 3d 20 34 3b 0a 09 20 20 67 61 69 61 45 78 70 6f  = 4;..  gaiaExpo
35c70 72 74 33 32 20 28 70 74 72 2c 20 66 6c 61 67 5f  rt32 (ptr, flag_
35c80 64 69 6d 73 2c 20 47 41 49 41 5f 4c 49 54 54 4c  dims, GAIA_LITTL
35c90 45 5f 45 4e 44 49 41 4e 2c 20 65 6e 64 69 61 6e  E_ENDIAN, endian
35ca0 5f 61 72 63 68 29 3b 09 2f 2a 20 74 68 65 20 43  _arch);./* the C
35cb0 6f 6f 72 64 44 69 6d 65 6e 73 69 6f 6e 20 66 6c  oordDimension fl
35cc0 61 67 20 2a 2f 0a 09 20 20 70 74 72 20 2b 3d 20  ag */..  ptr += 
35cd0 34 3b 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74  4;..  gaiaExport
35ce0 36 34 20 28 70 74 72 2c 20 70 6f 69 6e 74 2d 3e  64 (ptr, point->
35cf0 58 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45  X, GAIA_LITTLE_E
35d00 4e 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72  NDIAN, endian_ar
35d10 63 68 29 3b 09 2f 2a 20 58 20 2a 2f 0a 09 20 20  ch);./* X */..  
35d20 70 74 72 20 2b 3d 20 38 3b 0a 09 20 20 67 61 69  ptr += 8;..  gai
35d30 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20  aExport64 (ptr, 
35d40 70 6f 69 6e 74 2d 3e 59 2c 20 47 41 49 41 5f 4c  point->Y, GAIA_L
35d50 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65 6e  ITTLE_ENDIAN, en
35d60 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 59  dian_arch);./* Y
35d70 20 2a 2f 0a 09 20 20 70 74 72 20 2b 3d 20 38 3b   */..  ptr += 8;
35d80 0a 09 20 20 69 66 20 28 66 6c 61 67 5f 64 69 6d  ..  if (flag_dim
35d90 73 20 3d 3d 20 31 29 0a 09 20 20 20 20 7b 0a 09  s == 1)..    {..
35da0 09 2f 2a 20 58 59 5a 20 2a 2f 0a 09 09 67 61 69  ./* XYZ */...gai
35db0 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20  aExport64 (ptr, 
35dc0 70 6f 69 6e 74 2d 3e 5a 2c 20 47 41 49 41 5f 4c  point->Z, GAIA_L
35dd0 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65 6e  ITTLE_ENDIAN, en
35de0 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 70 74  dian_arch);...pt
35df0 72 20 2b 3d 20 38 3b 0a 09 20 20 20 20 7d 0a 09  r += 8;..    }..
35e00 20 20 65 6c 73 65 20 69 66 20 28 66 6c 61 67 5f    else if (flag_
35e10 64 69 6d 73 20 3d 3d 20 32 29 0a 09 20 20 20 20  dims == 2)..    
35e20 7b 0a 09 09 2f 2a 58 59 4d 20 2a 2f 0a 09 09 67  {.../*XYM */...g
35e30 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
35e40 2c 20 70 6f 69 6e 74 2d 3e 4d 2c 20 47 41 49 41  , point->M, GAIA
35e50 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20  _LITTLE_ENDIAN, 
35e60 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09  endian_arch);...
35e70 70 74 72 20 2b 3d 20 38 3b 0a 09 20 20 20 20 7d  ptr += 8;..    }
35e80 0a 09 20 20 65 6c 73 65 20 69 66 20 28 66 6c 61  ..  else if (fla
35e90 67 5f 64 69 6d 73 20 3d 3d 20 33 29 0a 09 20 20  g_dims == 3)..  
35ea0 20 20 7b 0a 09 09 2f 2a 20 58 59 5a 4d 20 2a 2f    {.../* XYZM */
35eb0 0a 09 09 67 61 69 61 45 78 70 6f 72 74 36 34 20  ...gaiaExport64 
35ec0 28 70 74 72 2c 20 70 6f 69 6e 74 2d 3e 5a 2c 20  (ptr, point->Z, 
35ed0 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49  GAIA_LITTLE_ENDI
35ee0 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29  AN, endian_arch)
35ef0 3b 0a 09 09 70 74 72 20 2b 3d 20 38 3b 0a 09 09  ;...ptr += 8;...
35f00 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74  gaiaExport64 (pt
35f10 72 2c 20 70 6f 69 6e 74 2d 3e 4d 2c 20 47 41 49  r, point->M, GAI
35f20 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c  A_LITTLE_ENDIAN,
35f30 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09   endian_arch);..
35f40 09 70 74 72 20 2b 3d 20 38 3b 0a 09 20 20 20 20  .ptr += 8;..    
35f50 7d 0a 09 20 20 70 6f 69 6e 74 20 3d 20 70 6f 69  }..  point = poi
35f60 6e 74 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20 20  nt->Next;.      
35f70 7d 0a 20 20 20 20 6c 69 6e 65 20 3d 20 67 65 6f  }.    line = geo
35f80 6d 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74 72 69  m->FirstLinestri
35f90 6e 67 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 6c  ng;.    while (l
35fa0 69 6e 65 29 0a 20 20 20 20 20 20 7b 0a 09 20 20  ine).      {..  
35fb0 67 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74  gaiaExport32 (pt
35fc0 72 2c 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49  r, GAIA_LINESTRI
35fd0 4e 47 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f  NG, GAIA_LITTLE_
35fe0 45 4e 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61  ENDIAN, endian_a
35ff0 72 63 68 29 3b 09 2f 2a 20 74 68 65 20 43 4c 41  rch);./* the CLA
36000 53 53 20 54 59 50 45 20 66 6f 72 20 74 68 69 73  SS TYPE for this
36010 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 09 20 20 70   element */..  p
36020 74 72 20 2b 3d 20 34 3b 0a 09 20 20 67 61 69 61  tr += 4;..  gaia
36030 45 78 70 6f 72 74 33 32 20 28 70 74 72 2c 20 66  Export32 (ptr, f
36040 6c 61 67 5f 64 69 6d 73 2c 20 47 41 49 41 5f 4c  lag_dims, GAIA_L
36050 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65 6e  ITTLE_ENDIAN, en
36060 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 74  dian_arch);./* t
36070 68 65 20 43 6f 6f 72 64 44 69 6d 65 6e 73 69 6f  he CoordDimensio
36080 6e 20 66 6c 61 67 20 2a 2f 0a 09 20 20 70 74 72  n flag */..  ptr
36090 20 2b 3d 20 34 3b 0a 09 20 20 67 61 69 61 45 78   += 4;..  gaiaEx
360a0 70 6f 72 74 33 32 20 28 70 74 72 2c 20 6c 69 6e  port32 (ptr, lin
360b0 65 2d 3e 50 6f 69 6e 74 73 2c 20 47 41 49 41 5f  e->Points, GAIA_
360c0 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65  LITTLE_ENDIAN, e
360d0 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20  ndian_arch);./* 
360e0 23 20 70 6f 69 6e 74 73 20 2a 2f 0a 09 20 20 70  # points */..  p
360f0 74 72 20 2b 3d 20 34 3b 0a 09 20 20 66 6f 72 20  tr += 4;..  for 
36100 28 69 76 20 3d 20 30 3b 20 69 76 20 3c 20 6c 69  (iv = 0; iv < li
36110 6e 65 2d 3e 50 6f 69 6e 74 73 3b 20 69 76 2b 2b  ne->Points; iv++
36120 29 0a 09 20 20 20 20 7b 0a 09 09 7a 20 3d 20 30  )..    {...z = 0
36130 2e 30 3b 0a 09 09 6d 20 3d 20 30 2e 30 3b 0a 09  .0;...m = 0.0;..
36140 09 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e  .if (geom->Dimen
36150 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49  sionModel == GAI
36160 41 5f 58 59 5f 5a 29 0a 09 09 20 20 7b 0a 09 09  A_XY_Z)...  {...
36170 20 20 20 20 20 20 67 61 69 61 47 65 74 50 6f 69        gaiaGetPoi
36180 6e 74 58 59 5a 20 28 6c 69 6e 65 2d 3e 43 6f 6f  ntXYZ (line->Coo
36190 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c  rds, iv, &x, &y,
361a0 20 26 7a 29 3b 0a 09 09 20 20 7d 0a 09 09 65 6c   &z);...  }...el
361b0 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d  se if (geom->Dim
361c0 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
361d0 41 49 41 5f 58 59 5f 4d 29 0a 09 09 20 20 7b 0a  AIA_XY_M)...  {.
361e0 09 09 20 20 20 20 20 20 67 61 69 61 47 65 74 50  ..      gaiaGetP
361f0 6f 69 6e 74 58 59 4d 20 28 6c 69 6e 65 2d 3e 43  ointXYM (line->C
36200 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26  oords, iv, &x, &
36210 79 2c 20 26 6d 29 3b 0a 09 09 20 20 7d 0a 09 09  y, &m);...  }...
36220 65 6c 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44  else if (geom->D
36230 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d  imensionModel ==
36240 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09   GAIA_XY_Z_M)...
36250 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61 69 61    {...      gaia
36260 47 65 74 50 6f 69 6e 74 58 59 5a 4d 20 28 6c 69  GetPointXYZM (li
36270 6e 65 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20  ne->Coords, iv, 
36280 26 78 2c 20 26 79 2c 20 26 7a 2c 20 26 6d 29 3b  &x, &y, &z, &m);
36290 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09  ...  }...else...
362a0 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61 69 61    {...      gaia
362b0 47 65 74 50 6f 69 6e 74 20 28 6c 69 6e 65 2d 3e  GetPoint (line->
362c0 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20  Coords, iv, &x, 
362d0 26 79 29 3b 0a 09 09 20 20 7d 0a 09 09 67 61 69  &y);...  }...gai
362e0 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20  aExport64 (ptr, 
362f0 78 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45  x, GAIA_LITTLE_E
36300 4e 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72  NDIAN, endian_ar
36310 63 68 29 3b 09 2f 2a 20 58 20 2a 2f 0a 09 09 70  ch);./* X */...p
36320 74 72 20 2b 3d 20 38 3b 0a 09 09 67 61 69 61 45  tr += 8;...gaiaE
36330 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20 79 2c  xport64 (ptr, y,
36340 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44   GAIA_LITTLE_END
36350 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  IAN, endian_arch
36360 29 3b 09 2f 2a 20 59 20 2a 2f 0a 09 09 70 74 72  );./* Y */...ptr
36370 20 2b 3d 20 38 3b 0a 09 09 69 66 20 28 66 6c 61   += 8;...if (fla
36380 67 5f 64 69 6d 73 20 3d 3d 20 31 29 0a 09 09 20  g_dims == 1)... 
36390 20 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20 58 59   {...      /* XY
363a0 5a 20 2a 2f 0a 09 09 20 20 20 20 20 20 67 61 69  Z */...      gai
363b0 61 45 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20  aExport64 (ptr, 
363c0 7a 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45  z, GAIA_LITTLE_E
363d0 4e 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72  NDIAN, endian_ar
363e0 63 68 29 3b 0a 09 09 20 20 20 20 20 20 70 74 72  ch);...      ptr
363f0 20 2b 3d 20 38 3b 0a 09 09 20 20 7d 0a 09 09 65   += 8;...  }...e
36400 6c 73 65 20 69 66 20 28 66 6c 61 67 5f 64 69 6d  lse if (flag_dim
36410 73 20 3d 3d 20 32 29 0a 09 09 20 20 7b 0a 09 09  s == 2)...  {...
36420 20 20 20 20 20 20 2f 2a 58 59 4d 20 2a 2f 0a 09        /*XYM */..
36430 09 20 20 20 20 20 20 67 61 69 61 45 78 70 6f 72  .      gaiaExpor
36440 74 36 34 20 28 70 74 72 2c 20 6d 2c 20 47 41 49  t64 (ptr, m, GAI
36450 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c  A_LITTLE_ENDIAN,
36460 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09   endian_arch);..
36470 09 20 20 20 20 20 20 70 74 72 20 2b 3d 20 38 3b  .      ptr += 8;
36480 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 20 69 66  ...  }...else if
36490 20 28 66 6c 61 67 5f 64 69 6d 73 20 3d 3d 20 33   (flag_dims == 3
364a0 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20  )...  {...      
364b0 2f 2a 20 58 59 5a 4d 20 2a 2f 0a 09 09 20 20 20  /* XYZM */...   
364c0 20 20 20 67 61 69 61 45 78 70 6f 72 74 36 34 20     gaiaExport64 
364d0 28 70 74 72 2c 20 7a 2c 20 47 41 49 41 5f 4c 49  (ptr, z, GAIA_LI
364e0 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65 6e 64  TTLE_ENDIAN, end
364f0 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20 20  ian_arch);...   
36500 20 20 20 70 74 72 20 2b 3d 20 38 3b 0a 09 09 20     ptr += 8;... 
36510 20 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 36       gaiaExport6
36520 34 20 28 70 74 72 2c 20 6d 2c 20 47 41 49 41 5f  4 (ptr, m, GAIA_
36530 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65  LITTLE_ENDIAN, e
36540 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09 09 20  ndian_arch);... 
36550 20 20 20 20 20 70 74 72 20 2b 3d 20 38 3b 0a 09       ptr += 8;..
36560 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 6c  .  }..    }..  l
36570 69 6e 65 20 3d 20 6c 69 6e 65 2d 3e 4e 65 78 74  ine = line->Next
36580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 70 6f  ;.      }.    po
36590 6c 79 67 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73  lyg = geom->Firs
365a0 74 50 6f 6c 79 67 6f 6e 3b 0a 20 20 20 20 77 68  tPolygon;.    wh
365b0 69 6c 65 20 28 70 6f 6c 79 67 29 0a 20 20 20 20  ile (polyg).    
365c0 20 20 7b 0a 09 20 20 67 61 69 61 45 78 70 6f 72    {..  gaiaExpor
365d0 74 33 32 20 28 70 74 72 2c 20 47 41 49 41 5f 50  t32 (ptr, GAIA_P
365e0 4f 4c 59 47 4f 4e 2c 20 47 41 49 41 5f 4c 49 54  OLYGON, GAIA_LIT
365f0 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65 6e 64 69  TLE_ENDIAN, endi
36600 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 74 68 65  an_arch);./* the
36610 20 43 4c 41 53 53 20 54 59 50 45 20 66 6f 72 20   CLASS TYPE for 
36620 74 68 69 73 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  this element */.
36630 09 20 20 70 74 72 20 2b 3d 20 34 3b 0a 09 20 20  .  ptr += 4;..  
36640 67 61 69 61 45 78 70 6f 72 74 33 32 20 28 70 74  gaiaExport32 (pt
36650 72 2c 20 66 6c 61 67 5f 64 69 6d 73 2c 20 47 41  r, flag_dims, GA
36660 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e  IA_LITTLE_ENDIAN
36670 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 09  , endian_arch);.
36680 2f 2a 20 74 68 65 20 43 6f 6f 72 64 44 69 6d 65  /* the CoordDime
36690 6e 73 69 6f 6e 20 66 6c 61 67 20 2a 2f 0a 09 20  nsion flag */.. 
366a0 20 70 74 72 20 2b 3d 20 34 3b 0a 09 20 20 67 61   ptr += 4;..  ga
366b0 69 61 45 78 70 6f 72 74 33 32 20 28 70 74 72 2c  iaExport32 (ptr,
366c0 20 70 6f 6c 79 67 2d 3e 4e 75 6d 49 6e 74 65 72   polyg->NumInter
366d0 69 6f 72 73 20 2b 20 31 2c 20 47 41 49 41 5f 4c  iors + 1, GAIA_L
366e0 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 20 65 6e  ITTLE_ENDIAN, en
366f0 64 69 61 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 23  dian_arch);./* #
36700 20 72 69 6e 67 73 20 2a 2f 0a 09 20 20 70 74 72   rings */..  ptr
36710 20 2b 3d 20 34 3b 0a 09 20 20 72 6e 67 20 3d 20   += 4;..  rng = 
36720 70 6f 6c 79 67 2d 3e 45 78 74 65 72 69 6f 72 3b  polyg->Exterior;
36730 0a 09 20 20 67 61 69 61 45 78 70 6f 72 74 33 32  ..  gaiaExport32
36740 20 28 70 74 72 2c 20 72 6e 67 2d 3e 50 6f 69 6e   (ptr, rng->Poin
36750 74 73 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f  ts, GAIA_LITTLE_
36760 45 4e 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61  ENDIAN, endian_a
36770 72 63 68 29 3b 09 2f 2a 20 23 20 70 6f 69 6e 74  rch);./* # point
36780 73 20 2d 20 65 78 74 65 72 69 6f 72 20 72 69 6e  s - exterior rin
36790 67 20 2a 2f 0a 09 20 20 70 74 72 20 2b 3d 20 34  g */..  ptr += 4
367a0 3b 0a 09 20 20 66 6f 72 20 28 69 76 20 3d 20 30  ;..  for (iv = 0
367b0 3b 20 69 76 20 3c 20 72 6e 67 2d 3e 50 6f 69 6e  ; iv < rng->Poin
367c0 74 73 3b 20 69 76 2b 2b 29 0a 09 20 20 20 20 7b  ts; iv++)..    {
367d0 0a 09 09 7a 20 3d 20 30 2e 30 3b 0a 09 09 6d 20  ...z = 0.0;...m 
367e0 3d 20 30 2e 30 3b 0a 09 09 69 66 20 28 67 65 6f  = 0.0;...if (geo
367f0 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65  m->DimensionMode
36800 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a  l == GAIA_XY_Z).
36810 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61  ..  {...      ga
36820 69 61 47 65 74 50 6f 69 6e 74 58 59 5a 20 28 72  iaGetPointXYZ (r
36830 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20  ng->Coords, iv, 
36840 26 78 2c 20 26 79 2c 20 26 7a 29 3b 0a 09 09 20  &x, &y, &z);... 
36850 20 7d 0a 09 09 65 6c 73 65 20 69 66 20 28 67 65   }...else if (ge
36860 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64  om->DimensionMod
36870 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29  el == GAIA_XY_M)
36880 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67  ...  {...      g
36890 61 69 61 47 65 74 50 6f 69 6e 74 58 59 4d 20 28  aiaGetPointXYM (
368a0 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c  rng->Coords, iv,
368b0 20 26 78 2c 20 26 79 2c 20 26 6d 29 3b 0a 09 09   &x, &y, &m);...
368c0 20 20 7d 0a 09 09 65 6c 73 65 20 69 66 20 28 67    }...else if (g
368d0 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  eom->DimensionMo
368e0 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a  del == GAIA_XY_Z
368f0 5f 4d 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20  _M)...  {...    
36900 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74 58 59    gaiaGetPointXY
36910 5a 4d 20 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c  ZM (rng->Coords,
36920 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26 7a 2c   iv, &x, &y, &z,
36930 20 26 6d 29 3b 0a 09 09 20 20 7d 0a 09 09 65 6c   &m);...  }...el
36940 73 65 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20  se...  {...     
36950 20 67 61 69 61 47 65 74 50 6f 69 6e 74 20 28 72   gaiaGetPoint (r
36960 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20  ng->Coords, iv, 
36970 26 78 2c 20 26 79 29 3b 0a 09 09 20 20 7d 0a 09  &x, &y);...  }..
36980 09 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70  .gaiaExport64 (p
36990 74 72 2c 20 78 2c 20 47 41 49 41 5f 4c 49 54 54  tr, x, GAIA_LITT
369a0 4c 45 5f 45 4e 44 49 41 4e 2c 20 65 6e 64 69 61  LE_ENDIAN, endia
369b0 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 58 20 2d 20  n_arch);./* X - 
369c0 65 78 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f  exterior ring */
369d0 0a 09 09 70 74 72 20 2b 3d 20 38 3b 0a 09 09 67  ...ptr += 8;...g
369e0 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
369f0 2c 20 79 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45  , y, GAIA_LITTLE
36a00 5f 45 4e 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f  _ENDIAN, endian_
36a10 61 72 63 68 29 3b 09 2f 2a 20 59 20 2d 20 65 78  arch);./* Y - ex
36a20 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09  terior ring */..
36a30 09 70 74 72 20 2b 3d 20 38 3b 0a 09 09 69 66 20  .ptr += 8;...if 
36a40 28 66 6c 61 67 5f 64 69 6d 73 20 3d 3d 20 31 29  (flag_dims == 1)
36a50 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 2f  ...  {...      /
36a60 2a 20 58 59 5a 20 2a 2f 0a 09 09 20 20 20 20 20  * XYZ */...     
36a70 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70   gaiaExport64 (p
36a80 74 72 2c 20 7a 2c 20 47 41 49 41 5f 4c 49 54 54  tr, z, GAIA_LITT
36a90 4c 45 5f 45 4e 44 49 41 4e 2c 20 65 6e 64 69 61  LE_ENDIAN, endia
36aa0 6e 5f 61 72 63 68 29 3b 0a 09 09 20 20 20 20 20  n_arch);...     
36ab0 20 70 74 72 20 2b 3d 20 38 3b 0a 09 09 20 20 7d   ptr += 8;...  }
36ac0 0a 09 09 65 6c 73 65 20 69 66 20 28 66 6c 61 67  ...else if (flag
36ad0 5f 64 69 6d 73 20 3d 3d 20 32 29 0a 09 09 20 20  _dims == 2)...  
36ae0 7b 0a 09 09 20 20 20 20 20 20 2f 2a 58 59 4d 20  {...      /*XYM 
36af0 2a 2f 0a 09 09 20 20 20 20 20 20 67 61 69 61 45  */...      gaiaE
36b00 78 70 6f 72 74 36 34 20 28 70 74 72 2c 20 6d 2c  xport64 (ptr, m,
36b10 20 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44   GAIA_LITTLE_END
36b20 49 41 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68  IAN, endian_arch
36b30 29 3b 0a 09 09 20 20 20 20 20 20 70 74 72 20 2b  );...      ptr +
36b40 3d 20 38 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73  = 8;...  }...els
36b50 65 20 69 66 20 28 66 6c 61 67 5f 64 69 6d 73 20  e if (flag_dims 
36b60 3d 3d 20 33 29 0a 09 09 20 20 7b 0a 09 09 20 20  == 3)...  {...  
36b70 20 20 20 20 2f 2a 20 58 59 5a 4d 20 2a 2f 0a 09      /* XYZM */..
36b80 09 20 20 20 20 20 20 67 61 69 61 45 78 70 6f 72  .      gaiaExpor
36b90 74 36 34 20 28 70 74 72 2c 20 7a 2c 20 47 41 49  t64 (ptr, z, GAI
36ba0 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c  A_LITTLE_ENDIAN,
36bb0 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a 09   endian_arch);..
36bc0 09 20 20 20 20 20 20 70 74 72 20 2b 3d 20 38 3b  .      ptr += 8;
36bd0 0a 09 09 20 20 20 20 20 20 67 61 69 61 45 78 70  ...      gaiaExp
36be0 6f 72 74 36 34 20 28 70 74 72 2c 20 6d 2c 20 47  ort64 (ptr, m, G
36bf0 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41  AIA_LITTLE_ENDIA
36c00 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  N, endian_arch);
36c10 0a 09 09 20 20 20 20 20 20 70 74 72 20 2b 3d 20  ...      ptr += 
36c20 38 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a  8;...  }..    }.
36c30 09 20 20 66 6f 72 20 28 69 62 20 3d 20 30 3b 20  .  for (ib = 0; 
36c40 69 62 20 3c 20 70 6f 6c 79 67 2d 3e 4e 75 6d 49  ib < polyg->NumI
36c50 6e 74 65 72 69 6f 72 73 3b 20 69 62 2b 2b 29 0a  nteriors; ib++).
36c60 09 20 20 20 20 7b 0a 09 09 72 6e 67 20 3d 20 70  .    {...rng = p
36c70 6f 6c 79 67 2d 3e 49 6e 74 65 72 69 6f 72 73 20  olyg->Interiors 
36c80 2b 20 69 62 3b 0a 09 09 67 61 69 61 45 78 70 6f  + ib;...gaiaExpo
36c90 72 74 33 32 20 28 70 74 72 2c 20 72 6e 67 2d 3e  rt32 (ptr, rng->
36ca0 50 6f 69 6e 74 73 2c 20 31 2c 20 65 6e 64 69 61  Points, 1, endia
36cb0 6e 5f 61 72 63 68 29 3b 09 2f 2a 20 23 20 70 6f  n_arch);./* # po
36cc0 69 6e 74 73 20 2d 20 69 6e 74 65 72 69 6f 72 20  ints - interior 
36cd0 72 69 6e 67 20 2a 2f 0a 09 09 70 74 72 20 2b 3d  ring */...ptr +=
36ce0 20 34 3b 0a 09 09 66 6f 72 20 28 69 76 20 3d 20   4;...for (iv = 
36cf0 30 3b 20 69 76 20 3c 20 72 6e 67 2d 3e 50 6f 69  0; iv < rng->Poi
36d00 6e 74 73 3b 20 69 76 2b 2b 29 0a 09 09 20 20 7b  nts; iv++)...  {
36d10 0a 09 09 20 20 20 20 20 20 7a 20 3d 20 30 2e 30  ...      z = 0.0
36d20 3b 0a 09 09 20 20 20 20 20 20 6d 20 3d 20 30 2e  ;...      m = 0.
36d30 30 3b 0a 09 09 20 20 20 20 20 20 69 66 20 28 67  0;...      if (g
36d40 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f  eom->DimensionMo
36d50 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a  del == GAIA_XY_Z
36d60 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 67 61  )....{....    ga
36d70 69 61 47 65 74 50 6f 69 6e 74 58 59 5a 20 28 72  iaGetPointXYZ (r
36d80 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20  ng->Coords, iv, 
36d90 26 78 2c 20 26 79 2c 20 26 7a 29 3b 0a 09 09 09  &x, &y, &z);....
36da0 7d 0a 09 09 20 20 20 20 20 20 65 6c 73 65 20 69  }...      else i
36db0 66 20 28 67 65 6f 6d 2d 3e 44 69 6d 65 6e 73 69  f (geom->Dimensi
36dc0 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f  onModel == GAIA_
36dd0 58 59 5f 4d 29 0a 09 09 09 7b 0a 09 09 09 20 20  XY_M)....{....  
36de0 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74 58 59    gaiaGetPointXY
36df0 4d 20 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20  M (rng->Coords, 
36e00 69 76 2c 20 26 78 2c 20 26 79 2c 20 26 6d 29 3b  iv, &x, &y, &m);
36e10 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 65 6c  ....}...      el
36e20 73 65 20 69 66 20 28 67 65 6f 6d 2d 3e 44 69 6d  se if (geom->Dim
36e30 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47  ensionModel == G
36e40 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 09 7b  AIA_XY_Z_M)....{
36e50 0a 09 09 09 20 20 20 20 67 61 69 61 47 65 74 50  ....    gaiaGetP
36e60 6f 69 6e 74 58 59 5a 4d 20 28 72 6e 67 2d 3e 43  ointXYZM (rng->C
36e70 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26  oords, iv, &x, &
36e80 79 2c 20 26 7a 2c 20 26 6d 29 3b 0a 09 09 09 7d  y, &z, &m);....}
36e90 0a 09 09 20 20 20 20 20 20 65 6c 73 65 0a 09 09  ...      else...
36ea0 09 7b 0a 09 09 09 20 20 20 20 67 61 69 61 47 65  .{....    gaiaGe
36eb0 74 50 6f 69 6e 74 20 28 72 6e 67 2d 3e 43 6f 6f  tPoint (rng->Coo
36ec0 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 29  rds, iv, &x, &y)
36ed0 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 67  ;....}...      g
36ee0 61 69 61 45 78 70 6f 72 74 36 34 20 28 70 74 72  aiaExport64 (ptr
36ef0 2c 20 78 2c 20 47 41 49 41 5f 4c 49 54 54 4c 45  , x, GAIA_LITTLE
36f00 5f 45 4e 44 49 41 4e 2c 20 65 6e 64 69 61 6e 5f  _ENDIAN, endian_
36f10 61 72 63 68 29 3b 09 2f 2a 20 58 20 2d 20 69 6e  arch);./* X - in
36f20 74 65 72 69 6f 72 20 72 69 6e 67 20 2a 2f 0a 09  terior ring */..
36f30 09 20 20 20 20 20 20 70 74 72 20 2b 3d 20 38 3b  .      ptr += 8;
36f40 0a 09 09 20 20 20 20 20 20 67 61 69 61 45 78 70  ...      gaiaExp
36f50 6f 72 74 36 34 20 28 70 74 72 2c 20 79 2c 20 47  ort64 (ptr, y, G
36f60 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41  AIA_LITTLE_ENDIA
36f70 4e 2c 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b  N, endian_arch);
36f80 09 2f 2a 20 59 20 2d 20 69 6e 74 65 72 69 6f 72  ./* Y - interior
36f90 20 72 69 6e 67 20 2a 2f 0a 09 09 20 20 20 20 20   ring */...     
36fa0 20 70 74 72 20 2b 3d 20 38 3b 0a 09 09 20 20 20   ptr += 8;...   
36fb0 20 20 20 69 66 20 28 66 6c 61 67 5f 64 69 6d 73     if (flag_dims
36fc0 20 3d 3d 20 31 29 0a 09 09 09 7b 0a 09 09 09 20   == 1)....{.... 
36fd0 20 20 20 2f 2a 20 58 59 5a 20 2a 2f 0a 09 09 09     /* XYZ */....
36fe0 20 20 20 20 67 61 69 61 45 78 70 6f 72 74 36 34      gaiaExport64
36ff0 20 28 70 74 72 2c 20 7a 2c 20 47 41 49 41 5f 4c   (ptr, z, GAIA_L
37000 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 0a 09 09  ITTLE_ENDIAN,...
37010 09 09 09 20 20 65 6e 64 69 61 6e 5f 61 72 63 68  ...  endian_arch
37020 29 3b 0a 09 09 09 20 20 20 20 70 74 72 20 2b 3d  );....    ptr +=
37030 20 38 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20   8;....}...     
37040 20 65 6c 73 65 20 69 66 20 28 66 6c 61 67 5f 64   else if (flag_d
37050 69 6d 73 20 3d 3d 20 32 29 0a 09 09 09 7b 0a 09  ims == 2)....{..
37060 09 09 20 20 20 20 2f 2a 58 59 4d 20 2a 2f 0a 09  ..    /*XYM */..
37070 09 09 20 20 20 20 67 61 69 61 45 78 70 6f 72 74  ..    gaiaExport
37080 36 34 20 28 70 74 72 2c 20 6d 2c 20 47 41 49 41  64 (ptr, m, GAIA
37090 5f 4c 49 54 54 4c 45 5f 45 4e 44 49 41 4e 2c 0a  _LITTLE_ENDIAN,.
370a0 09 09 09 09 09 20 20 65 6e 64 69 61 6e 5f 61 72  .....  endian_ar
370b0 63 68 29 3b 0a 09 09 09 20 20 20 20 70 74 72 20  ch);....    ptr 
370c0 2b 3d 20 38 3b 0a 09 09 09 7d 0a 09 09 20 20 20  += 8;....}...   
370d0 20 20 20 65 6c 73 65 20 69 66 20 28 66 6c 61 67     else if (flag
370e0 5f 64 69 6d 73 20 3d 3d 20 33 29 0a 09 09 09 7b  _dims == 3)....{
370f0 0a 09 09 09 20 20 20 20 2f 2a 20 58 59 5a 4d 20  ....    /* XYZM 
37100 2a 2f 0a 09 09 09 20 20 20 20 67 61 69 61 45 78  */....    gaiaEx
37110 70 6f 72 74 36 34 20 28 70 74 72 2c 20 7a 2c 20  port64 (ptr, z, 
37120 47 41 49 41 5f 4c 49 54 54 4c 45 5f 45 4e 44 49  GAIA_LITTLE_ENDI
37130 41 4e 2c 0a 09 09 09 09 09 20 20 65 6e 64 69 61  AN,......  endia
37140 6e 5f 61 72 63 68 29 3b 0a 09 09 09 20 20 20 20  n_arch);....    
37150 70 74 72 20 2b 3d 20 38 3b 0a 09 09 09 20 20 20  ptr += 8;....   
37160 20 67 61 69 61 45 78 70 6f 72 74 36 34 20 28 70   gaiaExport64 (p
37170 74 72 2c 20 6d 2c 20 47 41 49 41 5f 4c 49 54 54  tr, m, GAIA_LITT
37180 4c 45 5f 45 4e 44 49 41 4e 2c 0a 09 09 09 09 09  LE_ENDIAN,......
37190 20 20 65 6e 64 69 61 6e 5f 61 72 63 68 29 3b 0a    endian_arch);.
371a0 09 09 09 20 20 20 20 70 74 72 20 2b 3d 20 38 3b  ...    ptr += 8;
371b0 0a 09 09 09 7d 0a 09 09 20 20 7d 0a 09 20 20 20  ....}...  }..   
371c0 20 7d 0a 09 20 20 70 6f 6c 79 67 20 3d 20 70 6f   }..  polyg = po
371d0 6c 79 67 2d 3e 4e 65 78 74 3b 0a 20 20 20 20 20  lyg->Next;.     
371e0 20 7d 0a 7d 0a                                    }.}.