//
// SimpleLASiExample.cpp
//

#include <iostream>
#include <stdexcept>
#include <LASi.h>

using namespace LASi;
using namespace std;

int main(const int argc, char* const argv[]) 
{
  try {
    PostscriptDocument doc;

    double xAdvance,yMinimum,yMaximum,lineSpacing,yDelta;
    //
    // Set font to generic "serif":
    //
    doc.osBody() << setFont("serif") << setFontSize(18) << endl;
    //
    // "Hello" in formal Arabic, English, Hebrew, and Hindi.
    //
    // See http://eyegene.ophthy.med.umich.edu/unicode/fontguide/
    // if you need fonts for these scripts:
    //
    char testString[]="السلام عليكم Hello שלום नमस्ते";
    //
    // Get string dimensions:
    //
    doc.get_dimensions(testString,&lineSpacing,&xAdvance,&yMinimum,&yMaximum);
    //
    // cerr << endl;
    // cerr << "X-ADVANCE  : " << xAdvance << endl;
    // cerr << "Y-MINIMUM  : " << yMinimum << endl;
    // cerr << "Y-MAXIMUM  : " << yMaximum << endl;
    // cerr << "LINESPACING: " << lineSpacing << endl;
    //
    
    //
    // Draw a rectangle showing the bounding box of the string:
    //
    yDelta=yMaximum-yMinimum;
    doc.osBody() << "gsave newpath" << endl;
    doc.osBody() << "1.00 0.00 0.00 setrgbcolor" << endl;
    doc.osBody() << "100 600 moveto" << endl;
    doc.osBody() << 0 << " " << yMinimum << " rmoveto " << endl;
    doc.osBody() << 0 << " " << yDelta << " rlineto " << endl;
    doc.osBody() << xAdvance << " " << 0 << " rlineto " << endl;
    doc.osBody() << 0 << " " << -yDelta << " rlineto " << endl;
    doc.osBody() << "closepath" << endl;
    doc.osBody() << "stroke grestore" << endl;

    //
    // Show the string:
    //
    doc.osBody() << "100 600 moveto" << endl;
    doc.osBody() << show(testString);

    //
    // Advance to the next line:
    //
    doc.osBody() << "100 600 moveto" << endl;
    doc.osBody() << "0 " << -lineSpacing << " rmoveto" << endl;
    //
    // Print the test string again:
    //
    doc.osBody() << show(testString);

    //
    // Postscript showpage:
    //
    doc.osBody() << "showpage" << endl;
    
    doc.write(cout);
    
  } catch (runtime_error& e) {
  
    cerr << e.what() << endl;
    return 1;
    
  }

  return 0;
  
}