Rev 17826 |
Rev 18987 |
Go to most recent revision |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/*
For general Scribus (>=1.3.2) copyright and licensing information please refer
to the COPYING file provided with the program. Following this notice may exist
a copyright and/or license notice that predates the release of Scribus 1.3.2
for which a new license (GPL+exception) is in place.
*/
#ifndef SCTEXTSTRUCT_H
#define SCTEXTSTRUCT_H
#ifdef HAVE_CONFIG_H
#include "scconfig.h"
#endif
#include "scribusapi.h"
#include <QString>
#include "scfonts.h"
#include "style.h"
#include "styles/charstyle.h"
#include "styles/paragraphstyle.h"
class PageItem;
class Mark;
class ScribusDoc;
/* Struktur fuer Pageitem Text */
/*
* sctext.h
* Scribus
*
* Created by Andreas Vox on 29.07.05.
* Copyright 2005 under GPL2. All rights reserved.
*
*/
// from charstlye.h ScStyleFlags
enum LayoutFlags {
ScLayout_None = 0,
ScLayout_HyphenationPossible=128, //Hyphenation possible here (Soft Hyphen)
ScLayout_DropCap = 2048,
ScLayout_SuppressSpace = 4096,//internal use in PageItem (Suppresses spaces when in Block alignment)
ScLayout_SoftHyphenVisible=8192, //Soft Hyphen visible at line end
ScLayout_StartOfLine = 16384
};
/**
* This struct stores a positioned glyph. This is the result of the layout process.
* If a char gets translated to more than one glyph, a linked list is built.
*/
struct SCRIBUS_API GlyphLayout {
float xadvance;
float yadvance;
float xoffset;
float yoffset;
double scaleV;
double scaleH;
uint glyph;
GlyphLayout* more;
GlyphLayout() : xadvance(0.0f), yadvance(0.0f), xoffset(0.0f), yoffset(0.0f),
scaleV(1.0), scaleH(1.0), glyph(0), more(NULL)
{ }
GlyphLayout(const GlyphLayout& o) : xadvance(o.xadvance), yadvance(o.yadvance), xoffset(o.xoffset), yoffset(o.yoffset),
scaleV(o.scaleH), scaleH(o.scaleV), glyph(o.glyph), more(NULL)
{ }
virtual ~GlyphLayout()
{ }
double wide() const
{
double ret = 0;
for(const GlyphLayout* p=this; p; p=p->more)
ret += p->xadvance;
return ret;
}
GlyphLayout* last()
{
if (more)
return more->last();
else
return this;
}
void shrink()
{
if (more) {
more->shrink();
delete more;
more = NULL;
}
}
void grow()
{
if (!more) {
more = new GlyphLayout();
}
}
virtual void growWithTabLayout();
};
struct SCRIBUS_API TabLayout : public GlyphLayout
{
QChar fillChar;
};
class SCRIBUS_API ScText : public CharStyle
{
public:
ParagraphStyle* parstyle; // only for parseps
GlyphLayout glyph;
float PtransX;
float PtransY;
float PRot;
float PDx;
int embedded;
Mark* mark;
QChar ch;
ScText() :
CharStyle(),
parstyle(NULL), glyph(),
PtransX(0.0f), PtransY(0.0f), PRot(0.0f), PDx(0.0f), embedded(0), mark(NULL), ch() {}
ScText(const ScText& other) :
CharStyle(other),
parstyle(NULL), glyph(other.glyph),
PtransX(other.PtransX), PtransY(other.PtransY), PRot(other.PRot), PDx(other.PDx),
embedded(other.embedded), mark(NULL), ch(other.ch)
{
glyph.more = NULL;
GlyphLayout *layout = &glyph;
const GlyphLayout *otherLayout = &other.glyph;
while (otherLayout->more)
{
layout->more = new GlyphLayout(*otherLayout->more);
layout = layout->more;
otherLayout = otherLayout->more;
}
if (other.parstyle)
parstyle = new ParagraphStyle(*other.parstyle);
if (other.mark)
setNewMark(other.mark);
}
~ScText();
bool hasObject(ScribusDoc *doc) const;
//returns true if given MRK is found, if MRK is NULL then any mark returns true
bool hasMark(Mark * MRK = NULL) const;
QList<PageItem*> getGroupedItems(ScribusDoc *doc);
PageItem* getItem(ScribusDoc *doc);
private:
void setNewMark(Mark* mrk);
};
/** @brief First Line Offset Policy
* Set wether the first line offset is based on max glyph height
* or some of predefined height.
* I put a prefix because it could easily conflict
*/
enum FirstLineOffsetPolicy
{
FLOPRealGlyphHeight = 0, // Historical
FLOPFontAscent = 1,
FLOPLineSpacing = 2,
FLOPBaselineGrid = 3
};
#endif // SCTEXTSTRUCT_H