// @(#)root/graf:$Name: $:$Id: TLatex.h,v 1.11 2003/05/08 16:55:25 brun Exp $
// Author: Nicolas Brun 07/08/98
/*************************************************************************
* Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
* All rights reserved. *
* *
* For the licensing terms see $ROOTSYS/LICENSE. *
* For the list of contributors see $ROOTSYS/README/CREDITS. *
*************************************************************************/
#ifndef ROOT_TLatex
#define ROOT_TLatex
#ifndef ROOT_Riosfwd
#include "Riosfwd.h"
#endif
#ifndef ROOT_TText
#include "TText.h"
#endif
#ifndef ROOT_TAttLine
#include "TAttLine.h"
#endif
#ifndef ROOT_TMath
#include "TMath.h"
#endif
//////////////////////////////////////////////////////////////////////////
// //
// TLatex //
// //
// The Latex-style text processor class //
// //
//////////////////////////////////////////////////////////////////////////
struct FormSize_t {
Double_t width,dessus,dessous;
};
struct TextSpec_t {
Double_t angle,size;
Int_t color,font;
};
// compute size of a portion of a formula
class FormSize {
private:
Double_t width, dessus, dessous;
public:
FormSize() { width=0; dessus=0; dessous=0; } // constructeur par defaut
FormSize(Double_t x, Double_t y1, Double_t y2) { width=x; dessus=y1; dessous=y2; } // constructeur
virtual ~FormSize() {} //destructeur
FormSize(const FormSize& form) {width=form.width; dessus=form.dessus; dessous=form.dessous;}
// definition of operators + and +=
FormSize operator+(FormSize f)
{ return FormSize(f.Width()+width,TMath::Max(f.Dessus(),dessus),TMath::Max(f.Dessous(),dessous)); }
void operator+=(FormSize f)
{ width += f.Width(); dessus = TMath::Max(dessus,f.Dessus()); dessous = TMath::Max(dessous,f.Dessous()); }
inline void Set(Double_t x, Double_t y1, Double_t y2) { width=x; dessus=y1; dessous=y2; }
FormSize add_Dessus(FormSize f)
{ return FormSize(f.Width()+width,f.Height()+dessus,dessous); }
FormSize add_Dessous(FormSize f)
{ return FormSize(f.Width()+width,dessus,f.Height()+dessous); }
FormSize add_DessusDessous(FormSize f1, FormSize f2)
{ return FormSize(width+TMath::Max(f1.Width(),f2.Width()),dessus+f1.Dessus(),dessous+f2.Dessous()); }
// return members
inline Double_t Width() { return width; }
inline Double_t Dessus() { return dessus; }
inline Double_t Dessous() { return dessous; }
inline Double_t Height() { return dessus+dessous; }
};
class TLatex : public TText, public TAttLine {
protected:
Double_t fFactorSize; //!Relative size of subscripts and superscripts
Double_t fFactorPos; //!Relative position of subscripts and superscripts
Int_t fLimitFactorSize; // lower bound for subscripts/superscripts size
const Char_t *fError; //!error code
Bool_t fShow; //!is true during the second pass (Painting)
FormSize_t *fTabSize; //!array of values for the different zones
Double_t fOriginSize; // Font size of the starting font
Int_t fTabMax; //!Maximum allocation for array fTabSize;
Int_t fPos; //!Current position in array fTabSize;
//Text analysis and painting
FormSize Analyse(Double_t x, Double_t y, TextSpec_t spec, const Char_t* t,Int_t length);
FormSize Anal1(TextSpec_t spec, const Char_t* t,Int_t length);
void DrawLine(Double_t x1, Double_t y1, Double_t x2, Double_t y2, TextSpec_t spec);
void DrawCircle(Double_t x1, Double_t y1, Double_t r, TextSpec_t spec);
void DrawParenthesis(Double_t x1, Double_t y1, Double_t r1, Double_t r2, Double_t phimin, Double_t phimax, TextSpec_t spec);
FormSize FirstParse(Double_t angle, Double_t size, const Char_t *text);
void Savefs(FormSize *fs);
FormSize Readfs();
Int_t CheckLatexSyntax(TString &text) ;
public:
// TLatex status bits
enum { kTextNDC = BIT(14) };
TLatex();
TLatex(Double_t x, Double_t y, const char *text);
TLatex(const TLatex &text);
virtual ~TLatex();
void Copy(TObject &text) const;
TLatex *DrawLatex(Double_t x, Double_t y, const char *text);
Double_t GetHeight() const;
Double_t GetXsize();
Double_t GetYsize();
void GetBoundingBox(UInt_t &w, UInt_t &h);
virtual void Paint(Option_t *option="");
virtual void PaintLatex(Double_t x, Double_t y, Double_t angle, Double_t size, const char *text);
virtual void SavePrimitive(ofstream &out, Option_t *option);
virtual void SetIndiceSize(Double_t factorSize);
virtual void SetLimitIndiceSize(Int_t limitFactorSize);
ClassDef(TLatex,2) //The Latex-style text processor class
};
#endif
syntax highlighted by Code2HTML, v. 0.9.1