summaryrefslogtreecommitdiff
path: root/inputmethods/dasher/DasherView.cpp
blob: 8e32cf1932e69622730fc0673cd0f2cd51ddc0ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// DasherView.cpp
//
/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2001-2002 David Ward
//
/////////////////////////////////////////////////////////////////////////////

#include "DasherView.h"
using namespace Dasher;


CDasherView::CDasherView(CDasherScreen* DasherScreen, CDasherModel& DasherModel, Opts::ScreenOrientations Orientation)
  : m_Screen(DasherScreen), m_DasherModel(DasherModel), ScreenOrientation(Orientation), ColourMode(false)
{
//	XYScale = (double)m_Screen->GetHeight() / m_Screen->GetWidth();
}


void CDasherView::ChangeOrientation(Dasher::Opts::ScreenOrientations Orientation)
{
	ScreenOrientation = Orientation;
	Render();
}


void CDasherView::FlushAt(int ,int ) 
{
	m_DasherModel.Flush(0,0);
}

int CDasherView::RecursiveRender(CDasherNode* Render, myint y1,myint y2,int mostleft, bool text)
{
	// symbol CurChar = Render->Symbol();
	int Color;

	if (ColourMode==true) {
	  Color = Render->Colour();
	} else {
	  Color = Render->Phase()%3; 
	}

	if (RenderNode(Render->Symbol(), Color, Render->Cscheme(), y1, y2, mostleft, Render->m_bForce, text))
		RenderGroups(Render, y1, y2, text);
	else
		Render->Kill();
	
	CDasherNode** const Children=Render->Children();
	if (!Children)
	  return 0;
	int norm=DasherModel().Normalization();
		for (unsigned int i=1; i<Render->Chars(); i++) {
		if (Children[i]->Alive()) {
			myint Range=y2-y1;
			myint newy1=y1+(Range*Children[i]->Lbnd())/norm;
			myint newy2=y1+(Range*Children[i]->Hbnd())/norm;
			RecursiveRender(Children[i], newy1, newy2, mostleft, text);
		}
	}
	return 1;


}


void CDasherView::RenderGroups(CDasherNode* Render, myint y1, myint y2, bool text)
{
	CDasherNode** Children = Render->Children();
	if (!Children)
		return;
	int current=0;
	int lower=0;
	int upper=0;
	myint range=y2-y1;
	for (unsigned int i=1; i<Render->Chars(); i++) {
		int g=Children[i]->Group();
		if (g!=current) {
			lower=upper;
			upper=i;
			
			if (current!=0) {
				myint lbnd=Children[lower]->Lbnd();
				myint hbnd=Children[upper]->Lbnd();
				myint newy1=y1+(range*lbnd)/m_DasherModel.Normalization();
				myint newy2=y1+(range*hbnd)/m_DasherModel.Normalization();
				int mostleft;
				bool force;
				RenderNode(0,current-1,Opts::Groups,newy1,newy2,mostleft,force,text);
			}
			current=g;
		}
	}
}