ROOT logo
// $Id: GTSurf.cxx 2088 2008-11-23 20:26:46Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#include "GTSurf.h"
#include "GTSurf.c7"

#include <GTS/GTS.h>

#include <TMath.h>

/**************************************************************************/
/**************************************************************************/

namespace GTS {

  void vertex_dumper(GtsVertex* v) {
    printf("(%4.2f,%4.2f,%4.2f)", v->p.x, v->p.y, v->p.z);
  }

  void segment_dumper(GtsSegment* s) {
    vertex_dumper(s->v1); cout<<"-"; vertex_dumper(s->v2);
  }


  void triangle_dumper(GtsTriangle* t, int* n) {
    cout <<"Tring #"<< *n <<"\t";
    segment_dumper(&t->e1->segment); cout<<" . ";
    segment_dumper(&t->e2->segment); cout<<" . ";
    segment_dumper(&t->e3->segment); cout<<"\n";
    ++(*n);
  }

  void strip_dumper(GSList* tl, int* n) {
    cout <<"Strip #"<< *n <<endl;
    int num = 0;
    g_slist_foreach(tl, (GFunc)triangle_dumper, &num);
    ++(*n);
  }


  int face_inverter(GtsFace* f, int* dum) {
    GtsEdge* egg = f->triangle.e1;
    f->triangle.e1 = f->triangle.e2;
    f->triangle.e2 = egg;
    return 0;
  }
} // gts slurping namespace

/**************************************************************************/
/**************************************************************************/

ClassImp(GTSurf);

void GTSurf::_init()
{
  // Override settings from ZGlass
  bUseDispList = true;

  pSurf = 0;
  mVerts = mEdges = mFaces = 0;
}

/**************************************************************************/

void GTSurf::ReplaceSurface(GTS::GtsSurface* new_surf)
{
  using namespace GTS;

  if(pSurf) {
    gts_object_destroy (GTS_OBJECT (pSurf));
  }
  pSurf = new_surf;
  mStampReqTring = Stamp(FID());
}

GTS::GtsSurface* GTSurf::CopySurface()
{
  using namespace GTS;

  GtsSurface* s = 0;
  ReadLock();
  if(pSurf) {
    s = MakeDefaultSurface();
    gts_surface_copy(s, pSurf);
  }
  ReadUnlock();
  return s;
}

/**************************************************************************/

void GTSurf::Load()
{
  using namespace GTS;

  FILE* fp = fopen(mFile.Data(), "r");
  if(!fp) {
    ISerr(GForm("GTS::Surface::Load Cant' open %s", mFile.Data()));
    return;
  }
  GtsSurface* s = MakeDefaultSurface();
  if(s==0) {
    ISerr(GForm("GTS::Surface::Load gts_surface_new failed ..."));
    fclose(fp);
    return;
  }
  GtsFile* gsf = gts_file_new(fp);
  if( gts_surface_read(s, gsf) != 0 ) {
    ISerr(GForm("GTS::Surface::Load gts_surface_read failed ..."));
    gts_object_destroy (GTS_OBJECT (s));
    gts_file_destroy(gsf);
    fclose(fp);
    return;
  }
  gts_file_destroy(gsf);
  fclose(fp);

  ReplaceSurface(s);
}

void GTSurf::Save()
{
  using namespace GTS;

  if(pSurf) {
    FILE* fp = fopen(mFile.Data(), "w");
    if(!fp) {
      ISerr(GForm("GTS::Surface::Save Cant' open %s", mFile.Data()));
      return;
    }
    gts_surface_write(pSurf, fp);
    fclose(fp);
  }
}

/**************************************************************************/

namespace {
  using namespace GTS;
  void copy_stats(SGTSRange& d, GtsRange& s) {
    d.SetMin(s.min);  d.SetMax(s.max);
    d.SetAvg(s.mean); d.SetSigma(s.stddev);
  }
}

void GTSurf::CalcStats()
{
  using namespace GTS;

  if(pSurf == 0)
    return;

  mVerts = gts_surface_vertex_number(pSurf);
  mEdges = gts_surface_edge_number(pSurf);
  mFaces = gts_surface_face_number(pSurf);

  GtsSurfaceQualityStats stats;
  // pSurf->CalcStats(mFaceQuality, mFaceArea, mEdgeLength, mEdgeAngle);
  gts_surface_quality_stats(pSurf, &stats);
  copy_stats(mFaceQuality, stats.face_quality);
  copy_stats(mFaceArea,    stats.face_area);
  copy_stats(mEdgeLength,  stats.edge_length);
  copy_stats(mEdgeAngle,   stats.edge_angle);

  Stamp(FID());
}

void GTSurf::PrintStats()
{
  if(pSurf) {
    GTS::gts_surface_print_stats(pSurf, stdout);
  }
}

/**************************************************************************/

void GTSurf::Destroy()
{
  using namespace GTS;

  if(pSurf == 0)
    return;

  gts_object_destroy (GTS_OBJECT (pSurf));
  pSurf = 0;
  mStampReqTring = Stamp(FID());
}

void GTSurf::Invert()
{
  using namespace GTS;

  if(pSurf) {
    gts_surface_foreach_face(pSurf, (GtsFunc)face_inverter, 0);
    mStampReqTring = Stamp(FID());
  }
}

/**************************************************************************/

namespace {
  void vertex_scaler(GtsVertex* v, Double_t* s) {
    v->p.x *= *s; v->p.y *= *s; v->p.z *= *s;
  }
}

void GTSurf::Rescale(Double_t s)
{
  using namespace GTS;

  if(pSurf) {
    gts_surface_foreach_vertex(pSurf, (GtsFunc)vertex_scaler, &s);
    mStampReqTring = Stamp(FID());
  }
}

/**************************************************************************/

namespace {
using namespace GTS;
GtsVertex* mid_edge_splitter(GtsEdge *e, GtsVertexClass *k, gpointer /*d*/)
{
  GtsPoint &a = e->segment.v1->p, &b = e->segment.v2->p;
  return gts_vertex_new(k, a.x + 0.5*(b.x - a.x),
                           a.y + 0.5*(b.y - a.y),
                           a.z + 0.5*(b.z - a.z));
}
}

void GTSurf::Tessellate(UInt_t order, Bool_t mid_edge)
{
  if(pSurf == 0)
    return;

  while(order--)
    gts_surface_tessellate(pSurf, mid_edge ? mid_edge_splitter : 0, 0);

  mStampReqTring = Stamp(FID());
}

void GTSurf::GenerateSphere(UInt_t order)
{
  if(pSurf)
    gts_object_destroy (GTS_OBJECT (pSurf));
  pSurf = MakeDefaultSurface();

  gts_surface_generate_sphere(pSurf, order);

  mStampReqTring = Stamp(FID());
}

void GTSurf::GenerateTriangle(Double_t s)
{
  if(pSurf)
    gts_object_destroy (GTS_OBJECT (pSurf));
  pSurf = MakeDefaultSurface();

  const Double_t sqrt3 = TMath::Sqrt(3);
  GtsVertex * v[3];
  v[0] = gts_vertex_new(pSurf->vertex_class, -s*0.5, -s*sqrt3/6, 0);
  v[1] = gts_vertex_new(pSurf->vertex_class,  s*0.5, -s*sqrt3/6, 0);
  v[2] = gts_vertex_new(pSurf->vertex_class,  0,      s*sqrt3/3, 0);

  GtsEdge * e[3];
  e[0] = gts_edge_new(pSurf->edge_class, v[0], v[1]);
  e[1] = gts_edge_new(pSurf->edge_class, v[1], v[2]);
  e[2] = gts_edge_new(pSurf->edge_class, v[2], v[0]);

  GtsFace * f = gts_face_new(pSurf->face_class, e[0], e[1], e[2]);
  gts_surface_add_face(pSurf, f);

  mStampReqTring = Stamp(FID());
}

/**************************************************************************/
/**************************************************************************/

#include <TRandom3.h>
#include <TVector3.h>

namespace {

class Legend
{
protected:
  Double_t         mCosMPhi, mSinMPhi; // Buffers during evaluation

public:
  Int_t            mL;
  vector<Double_t> mC;

  Legend(Int_t max_l,  Double_t abs_scale, Double_t pow_scale) :
    mL(max_l), mC((max_l+1)*(max_l+1))
  {
    using namespace TMath;

    TRandom3 rnd(0);

    for(int l=0; l<=mL; ++l) {
      Double_t fl   = 0.25*(2*l + 1)/Pi();
      Double_t fpow = abs_scale * Power(1.0/(l + 1), pow_scale);

      Double_t& l0 = Coff(l, 0);

      l0  = Sqrt(fl);
      l0 *= fpow * (2*rnd.Rndm() - 1);
      // printf("l=%d 0=-%.6f", l, l0);

      for(int m=1; m<=l; ++m) {
	fl /= (l+m)*(l-m+1);

	Double_t& lpos = Coff(l,  m);
	Double_t& lneg = Coff(l, -m);

	lpos  = Sqrt(fl);
	lneg  = (m % 2) ? -lpos : lpos;
	lpos *= fpow * (2*rnd.Rndm() - 1);
	lneg *= fpow * (2*rnd.Rndm() - 1);
	// printf(" %d=%-.6f %d=%-.6f", m, lpos, -m, lneg);
      }
      // printf("\n");
    }
  }

  inline Double_t& Coff(int l, int m) { return mC[l*l + l + m]; }

  inline Double_t  SumM(int l, int m)
  {
    if(m == 0) {
      return mC[l*l + l];
    } else {
      int idx = l*l + l - m;
      return mC[idx + 2*m] * mCosMPhi + mC[idx] * mSinMPhi;
    }
  }

  //----------------------------------------------------------------

  void vertex_displacer(GTS::GtsVertex* v)
  {
    TVector3 vec(v->p.x, v->p.y, v->p.z);

    Double_t phi = vec.Phi();
    Double_t x   = vec.CosTheta();

    Double_t somx2 = TMath::Sqrt((1.0-x)*(1.0+x));
    Double_t fact  = 1;
    Double_t Pmm   = 1;

    Double_t sum = 1;

    for(int m=0; m<=mL; ++m) {
      mCosMPhi = TMath::Cos(m*phi);
      mSinMPhi = TMath::Sin(m*phi);

      sum += Pmm * SumM(m, m);

      if(m < mL) {
	Double_t Pam = Pmm;
	Double_t Pbm = x*(2*m+1)*Pam;

	sum += Pbm * SumM(m+1, m);

	for(int l=m+2; l<=mL; ++l) {
	  Double_t Plm = (x*(2*l-1)*Pbm - (l+m-1)*Pam) / (l-m);

	  sum += Plm * SumM(l, m);

	  Pam = Pbm;
	  Pbm = Plm;
	}
      }

      // Calc Pm,m+1
      Pmm  *= -fact*somx2;
      fact +=  2.0;
    }

    vec *= sum;

    v->p.x = vec.x(); v->p.y = vec.y(); v->p.z = vec.z();
  }

  static void s_vertex_displacer(GTS::GtsVertex* v, Legend* ud)
  {
    ud->vertex_displacer(v);
  }

}; // endclass Legend

} // end namespace

/**************************************************************************/

void GTSurf::Legendrofy(Int_t max_l, Double_t abs_scale, Double_t pow_scale)
{
  if(pSurf == 0)
    return;

  Legend leg(max_l, abs_scale, pow_scale);
  leg.Coff(0,0) = 0;

  GTS::gts_surface_foreach_vertex(pSurf,
				  (GTS::GtsFunc)Legend::s_vertex_displacer,
				  &leg);

  mStampReqTring = Stamp(FID());
}


// Original LegendreP
/*
Double_t LegendreP(int l, int m, Double_t x)
{
  void nrerror(char error_text[]);
  Double_t fact,pll,pmm,pmmp1,somx2;
  int i,ll;

  if (m < 0 || m > l || TMath::Abs(x) > 1.0)
    throw(Exc_t("LegendreP: bad arguments."));
  pmm=1.0;
  if (m > 0) {
    somx2=sqrt((1.0-x)*(1.0+x));
    fact=1.0;
    for (i=1;i<=m;i++) {
      pmm *= -fact*somx2;
      fact += 2.0;
    }
  }
  if (l == m)
    return pmm;
  else {
    pmmp1=x*(2*m+1)*pmm;
    if (l == (m+1))
      return pmmp1;
    else {
      for (ll=m+2;ll<=l;ll++) {
	pll=(x*(2*ll-1)*pmmp1-(ll+m-1)*pmm)/(ll-m);
	pmm=pmmp1;
	pmmp1=pll;
      }
      return pll;
    }
  }
}
*/

/**************************************************************************/

namespace {

using namespace GTS;

struct extring_arg {
  map<GtsVertex*, int> m_map;
  int                  m_count;
  FILE*                m_out;

  extring_arg() : m_count(0), m_out(0) {}
};

void trivi_vdump(GtsVertex* v, extring_arg* arg) {
  arg->m_map[v] = arg->m_count;
  ++arg->m_count;
  fprintf(arg->m_out, "%lf %lf %lf\n", v->p.x, v->p.y, v->p.z);
}

void trivi_fdump(GtsFace* f, extring_arg* arg) {
  GtsVertex *a, *b, *c;
  gts_triangle_vertices(&f->triangle, &a, &b, &c);
  fprintf(arg->m_out, "%d %d %d\n", arg->m_map[a], arg->m_map[b], arg->m_map[c]);
}

}

void GTSurf::ExportTring(const Text_t* fname)
{
  // Dumps vertices/triangles in a trivial format.

  if(pSurf == 0)
    return;

  using namespace GTS;

  FILE* f = (fname) ? fopen(fname, "w") : stdout;

  fprintf(f, "%u %u\n", gts_surface_vertex_number(pSurf),
                        gts_surface_face_number(pSurf));

  extring_arg arg;
  arg.m_out = f;

  gts_surface_foreach_vertex(pSurf, (GtsFunc) trivi_vdump, &arg);
  gts_surface_foreach_face  (pSurf, (GtsFunc) trivi_fdump, &arg);

  if (fname) fclose(f);
}
 GTSurf.cxx:1
 GTSurf.cxx:2
 GTSurf.cxx:3
 GTSurf.cxx:4
 GTSurf.cxx:5
 GTSurf.cxx:6
 GTSurf.cxx:7
 GTSurf.cxx:8
 GTSurf.cxx:9
 GTSurf.cxx:10
 GTSurf.cxx:11
 GTSurf.cxx:12
 GTSurf.cxx:13
 GTSurf.cxx:14
 GTSurf.cxx:15
 GTSurf.cxx:16
 GTSurf.cxx:17
 GTSurf.cxx:18
 GTSurf.cxx:19
 GTSurf.cxx:20
 GTSurf.cxx:21
 GTSurf.cxx:22
 GTSurf.cxx:23
 GTSurf.cxx:24
 GTSurf.cxx:25
 GTSurf.cxx:26
 GTSurf.cxx:27
 GTSurf.cxx:28
 GTSurf.cxx:29
 GTSurf.cxx:30
 GTSurf.cxx:31
 GTSurf.cxx:32
 GTSurf.cxx:33
 GTSurf.cxx:34
 GTSurf.cxx:35
 GTSurf.cxx:36
 GTSurf.cxx:37
 GTSurf.cxx:38
 GTSurf.cxx:39
 GTSurf.cxx:40
 GTSurf.cxx:41
 GTSurf.cxx:42
 GTSurf.cxx:43
 GTSurf.cxx:44
 GTSurf.cxx:45
 GTSurf.cxx:46
 GTSurf.cxx:47
 GTSurf.cxx:48
 GTSurf.cxx:49
 GTSurf.cxx:50
 GTSurf.cxx:51
 GTSurf.cxx:52
 GTSurf.cxx:53
 GTSurf.cxx:54
 GTSurf.cxx:55
 GTSurf.cxx:56
 GTSurf.cxx:57
 GTSurf.cxx:58
 GTSurf.cxx:59
 GTSurf.cxx:60
 GTSurf.cxx:61
 GTSurf.cxx:62
 GTSurf.cxx:63
 GTSurf.cxx:64
 GTSurf.cxx:65
 GTSurf.cxx:66
 GTSurf.cxx:67
 GTSurf.cxx:68
 GTSurf.cxx:69
 GTSurf.cxx:70
 GTSurf.cxx:71
 GTSurf.cxx:72
 GTSurf.cxx:73
 GTSurf.cxx:74
 GTSurf.cxx:75
 GTSurf.cxx:76
 GTSurf.cxx:77
 GTSurf.cxx:78
 GTSurf.cxx:79
 GTSurf.cxx:80
 GTSurf.cxx:81
 GTSurf.cxx:82
 GTSurf.cxx:83
 GTSurf.cxx:84
 GTSurf.cxx:85
 GTSurf.cxx:86
 GTSurf.cxx:87
 GTSurf.cxx:88
 GTSurf.cxx:89
 GTSurf.cxx:90
 GTSurf.cxx:91
 GTSurf.cxx:92
 GTSurf.cxx:93
 GTSurf.cxx:94
 GTSurf.cxx:95
 GTSurf.cxx:96
 GTSurf.cxx:97
 GTSurf.cxx:98
 GTSurf.cxx:99
 GTSurf.cxx:100
 GTSurf.cxx:101
 GTSurf.cxx:102
 GTSurf.cxx:103
 GTSurf.cxx:104
 GTSurf.cxx:105
 GTSurf.cxx:106
 GTSurf.cxx:107
 GTSurf.cxx:108
 GTSurf.cxx:109
 GTSurf.cxx:110
 GTSurf.cxx:111
 GTSurf.cxx:112
 GTSurf.cxx:113
 GTSurf.cxx:114
 GTSurf.cxx:115
 GTSurf.cxx:116
 GTSurf.cxx:117
 GTSurf.cxx:118
 GTSurf.cxx:119
 GTSurf.cxx:120
 GTSurf.cxx:121
 GTSurf.cxx:122
 GTSurf.cxx:123
 GTSurf.cxx:124
 GTSurf.cxx:125
 GTSurf.cxx:126
 GTSurf.cxx:127
 GTSurf.cxx:128
 GTSurf.cxx:129
 GTSurf.cxx:130
 GTSurf.cxx:131
 GTSurf.cxx:132
 GTSurf.cxx:133
 GTSurf.cxx:134
 GTSurf.cxx:135
 GTSurf.cxx:136
 GTSurf.cxx:137
 GTSurf.cxx:138
 GTSurf.cxx:139
 GTSurf.cxx:140
 GTSurf.cxx:141
 GTSurf.cxx:142
 GTSurf.cxx:143
 GTSurf.cxx:144
 GTSurf.cxx:145
 GTSurf.cxx:146
 GTSurf.cxx:147
 GTSurf.cxx:148
 GTSurf.cxx:149
 GTSurf.cxx:150
 GTSurf.cxx:151
 GTSurf.cxx:152
 GTSurf.cxx:153
 GTSurf.cxx:154
 GTSurf.cxx:155
 GTSurf.cxx:156
 GTSurf.cxx:157
 GTSurf.cxx:158
 GTSurf.cxx:159
 GTSurf.cxx:160
 GTSurf.cxx:161
 GTSurf.cxx:162
 GTSurf.cxx:163
 GTSurf.cxx:164
 GTSurf.cxx:165
 GTSurf.cxx:166
 GTSurf.cxx:167
 GTSurf.cxx:168
 GTSurf.cxx:169
 GTSurf.cxx:170
 GTSurf.cxx:171
 GTSurf.cxx:172
 GTSurf.cxx:173
 GTSurf.cxx:174
 GTSurf.cxx:175
 GTSurf.cxx:176
 GTSurf.cxx:177
 GTSurf.cxx:178
 GTSurf.cxx:179
 GTSurf.cxx:180
 GTSurf.cxx:181
 GTSurf.cxx:182
 GTSurf.cxx:183
 GTSurf.cxx:184
 GTSurf.cxx:185
 GTSurf.cxx:186
 GTSurf.cxx:187
 GTSurf.cxx:188
 GTSurf.cxx:189
 GTSurf.cxx:190
 GTSurf.cxx:191
 GTSurf.cxx:192
 GTSurf.cxx:193
 GTSurf.cxx:194
 GTSurf.cxx:195
 GTSurf.cxx:196
 GTSurf.cxx:197
 GTSurf.cxx:198
 GTSurf.cxx:199
 GTSurf.cxx:200
 GTSurf.cxx:201
 GTSurf.cxx:202
 GTSurf.cxx:203
 GTSurf.cxx:204
 GTSurf.cxx:205
 GTSurf.cxx:206
 GTSurf.cxx:207
 GTSurf.cxx:208
 GTSurf.cxx:209
 GTSurf.cxx:210
 GTSurf.cxx:211
 GTSurf.cxx:212
 GTSurf.cxx:213
 GTSurf.cxx:214
 GTSurf.cxx:215
 GTSurf.cxx:216
 GTSurf.cxx:217
 GTSurf.cxx:218
 GTSurf.cxx:219
 GTSurf.cxx:220
 GTSurf.cxx:221
 GTSurf.cxx:222
 GTSurf.cxx:223
 GTSurf.cxx:224
 GTSurf.cxx:225
 GTSurf.cxx:226
 GTSurf.cxx:227
 GTSurf.cxx:228
 GTSurf.cxx:229
 GTSurf.cxx:230
 GTSurf.cxx:231
 GTSurf.cxx:232
 GTSurf.cxx:233
 GTSurf.cxx:234
 GTSurf.cxx:235
 GTSurf.cxx:236
 GTSurf.cxx:237
 GTSurf.cxx:238
 GTSurf.cxx:239
 GTSurf.cxx:240
 GTSurf.cxx:241
 GTSurf.cxx:242
 GTSurf.cxx:243
 GTSurf.cxx:244
 GTSurf.cxx:245
 GTSurf.cxx:246
 GTSurf.cxx:247
 GTSurf.cxx:248
 GTSurf.cxx:249
 GTSurf.cxx:250
 GTSurf.cxx:251
 GTSurf.cxx:252
 GTSurf.cxx:253
 GTSurf.cxx:254
 GTSurf.cxx:255
 GTSurf.cxx:256
 GTSurf.cxx:257
 GTSurf.cxx:258
 GTSurf.cxx:259
 GTSurf.cxx:260
 GTSurf.cxx:261
 GTSurf.cxx:262
 GTSurf.cxx:263
 GTSurf.cxx:264
 GTSurf.cxx:265
 GTSurf.cxx:266
 GTSurf.cxx:267
 GTSurf.cxx:268
 GTSurf.cxx:269
 GTSurf.cxx:270
 GTSurf.cxx:271
 GTSurf.cxx:272
 GTSurf.cxx:273
 GTSurf.cxx:274
 GTSurf.cxx:275
 GTSurf.cxx:276
 GTSurf.cxx:277
 GTSurf.cxx:278
 GTSurf.cxx:279
 GTSurf.cxx:280
 GTSurf.cxx:281
 GTSurf.cxx:282
 GTSurf.cxx:283
 GTSurf.cxx:284
 GTSurf.cxx:285
 GTSurf.cxx:286
 GTSurf.cxx:287
 GTSurf.cxx:288
 GTSurf.cxx:289
 GTSurf.cxx:290
 GTSurf.cxx:291
 GTSurf.cxx:292
 GTSurf.cxx:293
 GTSurf.cxx:294
 GTSurf.cxx:295
 GTSurf.cxx:296
 GTSurf.cxx:297
 GTSurf.cxx:298
 GTSurf.cxx:299
 GTSurf.cxx:300
 GTSurf.cxx:301
 GTSurf.cxx:302
 GTSurf.cxx:303
 GTSurf.cxx:304
 GTSurf.cxx:305
 GTSurf.cxx:306
 GTSurf.cxx:307
 GTSurf.cxx:308
 GTSurf.cxx:309
 GTSurf.cxx:310
 GTSurf.cxx:311
 GTSurf.cxx:312
 GTSurf.cxx:313
 GTSurf.cxx:314
 GTSurf.cxx:315
 GTSurf.cxx:316
 GTSurf.cxx:317
 GTSurf.cxx:318
 GTSurf.cxx:319
 GTSurf.cxx:320
 GTSurf.cxx:321
 GTSurf.cxx:322
 GTSurf.cxx:323
 GTSurf.cxx:324
 GTSurf.cxx:325
 GTSurf.cxx:326
 GTSurf.cxx:327
 GTSurf.cxx:328
 GTSurf.cxx:329
 GTSurf.cxx:330
 GTSurf.cxx:331
 GTSurf.cxx:332
 GTSurf.cxx:333
 GTSurf.cxx:334
 GTSurf.cxx:335
 GTSurf.cxx:336
 GTSurf.cxx:337
 GTSurf.cxx:338
 GTSurf.cxx:339
 GTSurf.cxx:340
 GTSurf.cxx:341
 GTSurf.cxx:342
 GTSurf.cxx:343
 GTSurf.cxx:344
 GTSurf.cxx:345
 GTSurf.cxx:346
 GTSurf.cxx:347
 GTSurf.cxx:348
 GTSurf.cxx:349
 GTSurf.cxx:350
 GTSurf.cxx:351
 GTSurf.cxx:352
 GTSurf.cxx:353
 GTSurf.cxx:354
 GTSurf.cxx:355
 GTSurf.cxx:356
 GTSurf.cxx:357
 GTSurf.cxx:358
 GTSurf.cxx:359
 GTSurf.cxx:360
 GTSurf.cxx:361
 GTSurf.cxx:362
 GTSurf.cxx:363
 GTSurf.cxx:364
 GTSurf.cxx:365
 GTSurf.cxx:366
 GTSurf.cxx:367
 GTSurf.cxx:368
 GTSurf.cxx:369
 GTSurf.cxx:370
 GTSurf.cxx:371
 GTSurf.cxx:372
 GTSurf.cxx:373
 GTSurf.cxx:374
 GTSurf.cxx:375
 GTSurf.cxx:376
 GTSurf.cxx:377
 GTSurf.cxx:378
 GTSurf.cxx:379
 GTSurf.cxx:380
 GTSurf.cxx:381
 GTSurf.cxx:382
 GTSurf.cxx:383
 GTSurf.cxx:384
 GTSurf.cxx:385
 GTSurf.cxx:386
 GTSurf.cxx:387
 GTSurf.cxx:388
 GTSurf.cxx:389
 GTSurf.cxx:390
 GTSurf.cxx:391
 GTSurf.cxx:392
 GTSurf.cxx:393
 GTSurf.cxx:394
 GTSurf.cxx:395
 GTSurf.cxx:396
 GTSurf.cxx:397
 GTSurf.cxx:398
 GTSurf.cxx:399
 GTSurf.cxx:400
 GTSurf.cxx:401
 GTSurf.cxx:402
 GTSurf.cxx:403
 GTSurf.cxx:404
 GTSurf.cxx:405
 GTSurf.cxx:406
 GTSurf.cxx:407
 GTSurf.cxx:408
 GTSurf.cxx:409
 GTSurf.cxx:410
 GTSurf.cxx:411
 GTSurf.cxx:412
 GTSurf.cxx:413
 GTSurf.cxx:414
 GTSurf.cxx:415
 GTSurf.cxx:416
 GTSurf.cxx:417
 GTSurf.cxx:418
 GTSurf.cxx:419
 GTSurf.cxx:420
 GTSurf.cxx:421
 GTSurf.cxx:422
 GTSurf.cxx:423
 GTSurf.cxx:424
 GTSurf.cxx:425
 GTSurf.cxx:426
 GTSurf.cxx:427
 GTSurf.cxx:428
 GTSurf.cxx:429
 GTSurf.cxx:430
 GTSurf.cxx:431
 GTSurf.cxx:432
 GTSurf.cxx:433
 GTSurf.cxx:434
 GTSurf.cxx:435
 GTSurf.cxx:436
 GTSurf.cxx:437
 GTSurf.cxx:438
 GTSurf.cxx:439
 GTSurf.cxx:440
 GTSurf.cxx:441
 GTSurf.cxx:442
 GTSurf.cxx:443
 GTSurf.cxx:444
 GTSurf.cxx:445
 GTSurf.cxx:446
 GTSurf.cxx:447
 GTSurf.cxx:448
 GTSurf.cxx:449
 GTSurf.cxx:450
 GTSurf.cxx:451
 GTSurf.cxx:452
 GTSurf.cxx:453
 GTSurf.cxx:454
 GTSurf.cxx:455
 GTSurf.cxx:456
 GTSurf.cxx:457
 GTSurf.cxx:458
 GTSurf.cxx:459
 GTSurf.cxx:460
 GTSurf.cxx:461
 GTSurf.cxx:462
 GTSurf.cxx:463
 GTSurf.cxx:464
 GTSurf.cxx:465
 GTSurf.cxx:466
 GTSurf.cxx:467
 GTSurf.cxx:468
 GTSurf.cxx:469
 GTSurf.cxx:470
 GTSurf.cxx:471
 GTSurf.cxx:472
 GTSurf.cxx:473
 GTSurf.cxx:474
 GTSurf.cxx:475
 GTSurf.cxx:476
 GTSurf.cxx:477
 GTSurf.cxx:478
 GTSurf.cxx:479
 GTSurf.cxx:480
 GTSurf.cxx:481
 GTSurf.cxx:482
 GTSurf.cxx:483
 GTSurf.cxx:484
 GTSurf.cxx:485
 GTSurf.cxx:486
 GTSurf.cxx:487
 GTSurf.cxx:488
 GTSurf.cxx:489
 GTSurf.cxx:490
 GTSurf.cxx:491
 GTSurf.cxx:492
 GTSurf.cxx:493
 GTSurf.cxx:494
 GTSurf.cxx:495
 GTSurf.cxx:496
 GTSurf.cxx:497
 GTSurf.cxx:498
 GTSurf.cxx:499
 GTSurf.cxx:500