#ifndef BIDI_H
#define BIDI_H
#include <qstring.h>
class RenderArena;
namespace khtml {
class RenderBlock;
class RenderObject;
class InlineBox;
class BidiContext {
public:
BidiContext(unsigned char level, QChar::Direction embedding, BidiContext *parent = 0, bool override = false);
~BidiContext();
void ref() const;
void deref() const;
unsigned char level;
bool override : 1;
QChar::Direction dir : 5;
QChar::Direction basicDir : 5;
BidiContext *parent;
mutable int count;
};
struct BidiRun {
BidiRun(int _start, int _stop, RenderObject *_obj, BidiContext *context, QChar::Direction dir)
: start( _start ), stop( _stop ), obj( _obj ), box(0), nextRun(0)
{
if(dir == QChar::DirON) dir = context->dir;
level = context->level;
if( level % 2 ) {
if(dir == QChar::DirL || dir == QChar::DirAN || dir == QChar::DirEN)
level++;
} else {
if( dir == QChar::DirR )
level++;
else if( dir == QChar::DirAN || dir == QChar::DirEN)
level += 2;
}
}
void detach(RenderArena* renderArena);
void* operator new(size_t sz, RenderArena* renderArena) throw();
void operator delete(void* ptr, size_t sz);
private:
void* operator new(size_t sz) throw();
public:
int start;
int stop;
RenderObject *obj;
InlineBox* box;
uchar level;
bool compact : 1;
BidiRun* nextRun;
};
struct BidiIterator;
struct BidiState;
};
#endif