Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Bridge.C






 

 

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

class Body {

public:

void Ref();

void Unref();

int RefCount();

private:

};

 

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

class Handle {

public:

Handle& operator=(const Handle& other);

private:

Body* _body;

};

 

Handle& Handle:: operator= (const Handle& other) {

other._body-> Ref();

_body-> Unref();

 

if (_body-> RefCount() == 0) {

delete _body;

}

_body = other._body;

 

return *this;

}

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

 

#include " Geom.H"

#include " math.h"

class Window;

 

class View {

public:

DrawOn(Window*);

};

 

class WindowImp;

struct Display;

typedef unsigned int Drawable;

typedef struct XXX { int y; } *GC;

extern XDrawRectangle(

Display*,

Drawable,

GC,

int,

int,

unsigned int,

unsigned int

);

 

struct PPOINTL {

Coord x;

Coord y;

};

const int GPI_ERROR = 1;

 

typedef int HPS;

int GpiBeginPath(HPS, unsigned long);

int GpiSetCurrentPosition(HPS, PPOINTL*);

int GpiPolyLine(HPS, unsigned long, PPOINTL*);

int GpiEndPath(HPS);

void ReportError();

void GpiStrokePath(HPS, unsigned long, unsigned long);

class WindowSystemFactory {

public:

static WindowSystemFactory* Instance();

WindowImp* MakeWindowImp();

};

 

class Window {

public:

Window(View* contents);

 

// requests handled by window

virtual void DrawContents();

 

virtual void Open();

virtual void Close();

virtual void Iconify();

virtual void Deiconify();

 

// requests forwarded to implementation

virtual void SetOrigin(const Point& at);

virtual void SetExtent(const Point& extent);

virtual void Raise();

virtual void Lower();

 

virtual void DrawLine(const Point&, const Point&);

virtual void DrawRect(const Point&, const Point&);

virtual void DrawPolygon(const Point[], int n);

virtual void DrawText(const char*, const Point&);

 

protected:

WindowImp* GetWindowImp();

View* GetView();

 

private:

WindowImp* _imp;

View* _contents; // the window's contents

};

 

class WindowImp {

public:

virtual void ImpTop() = 0;

virtual void ImpBottom() = 0;

virtual void ImpSetExtent(const Point&) = 0;

virtual void ImpSetOrigin(const Point&) = 0;

virtual void DeviceRect(Coord, Coord, Coord, Coord) = 0;

virtual void DeviceText(const char*, Coord, Coord) = 0;

virtual void DeviceBitmap(const char*, Coord, Coord) = 0;

// lots more functions for drawing on windows...

protected:

WindowImp();

};

 

class ApplicationWindow: public Window {

public:

//...

virtual void DrawContents();

};

 

void ApplicationWindow:: DrawContents () {

GetView()-> DrawOn(this);

}

 

class IconWindow: public Window {

public:

//...

virtual void DrawContents();

private:

const char* _bitmapName;

};

 

void IconWindow:: DrawContents() {

WindowImp* imp = GetWindowImp();

if (imp! = 0) {

imp-> DeviceBitmap(_bitmapName, 0.0, 0.0);

}

}

 

void Window:: DrawRect (const Point& p1, const Point& p2) {

WindowImp* imp = GetWindowImp();

imp-> DeviceRect(p1.X(), p1.Y(), p2.X(), p2.Y());

}

 

class XWindowImp: public WindowImp {

public:

XWindowImp();

 

virtual void DeviceRect(Coord, Coord, Coord, Coord);

// remainder of public interface...

private:

// lots of X window system-specific state, including:

Display* _dpy;

Drawable _winid; // window id

GC _gc; // window graphic context

};

 

class PMWindowImp: public WindowImp {

public:

PMWindowImp();

virtual void DeviceRect(Coord, Coord, Coord, Coord);

 

// remainder of public interface...

private:

// lots of PM window system-specific state, including:

HPS _hps;

};

 

void XWindowImp:: DeviceRect (

Coord x0, Coord y0, Coord x1, Coord y1

) {

int x = round(min(x0, x1));

int y = round(min(y0, y1));

int w = round(abs(x0 - x1));

int h = round(abs(y0 - y1));

XDrawRectangle(_dpy, _winid, _gc, x, y, w, h);

}

 

void PMWindowImp:: DeviceRect (

Coord x0, Coord y0, Coord x1, Coord y1

) {

Coord left = min(x0, x1);

Coord right = max(x0, x1);

Coord bottom = min(y0, y1);

Coord top = max(y0, y1);

 

PPOINTL point[4];

 

point[0].x = left; point[0].y = top;

point[1].x = right; point[1].y = top;

point[2].x = right; point[2].y = bottom;

point[3].x = left; point[3].y = bottom;

 

if (

(GpiBeginPath(_hps, 1L) == false) ||

(GpiSetCurrentPosition(_hps, & point[3]) == false) ||

(GpiPolyLine(_hps, 4L, point) == GPI_ERROR) ||

(GpiEndPath(_hps) == false)

) {

// report error

 

} else {

GpiStrokePath(_hps, 1L, 0L);

}

}

 

WindowImp* Window:: GetWindowImp () {

if (_imp == 0) {

_imp = WindowSystemFactory:: Instance()-> MakeWindowImp();

}

return _imp;

}


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.014 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал