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 mousex,int mousey)
{
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;
}
}
}
|