Open-Source-Software-Entwicklung und Downloads

Browse Subversion Repository

Contents of /trunk/teraterm/ttptek/tekesc.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3221 - (show annotations) (download) (as text)
Tue Mar 24 09:37:20 2009 UTC (15 years, 2 months ago) by maya
File MIME type: text/x-csrc
File size: 24800 byte(s)
CVS から SVN へ移行: trunk に集約
1 /* Tera Term
2 Copyright(C) 1994-1998 T. Teranishi
3 All rights reserved. */
4
5 /* TTTEK.DLL, TEK escape sequences */
6 #include "teraterm.h"
7 #include "tttypes.h"
8 #include "tektypes.h"
9 #include "ttcommon.h"
10 #include <math.h>
11 #include <string.h>
12
13 #include "tekesc.h"
14
15 void Log1Byte(PComVar cv, BYTE b)
16 {
17 ((PCHAR)(cv->LogBuf))[cv->LogPtr] = b;
18 cv->LogPtr++;
19 if (cv->LogPtr >= InBuffSize)
20 cv->LogPtr = cv->LogPtr - InBuffSize;
21 if (cv->LCount >= InBuffSize)
22 {
23 cv->LCount = InBuffSize;
24 cv->LStart = cv->LogPtr;
25 }
26 else cv->LCount++;
27 }
28
29 void ChangeTextSize(PTEKVar tk, PTTSet ts)
30 {
31 SelectObject(tk->MemDC,tk->TEKFont[tk->TextSize]);
32 tk->FontWidth = tk->FW[tk->TextSize];
33 tk->FontHeight = tk->FH[tk->TextSize];
34
35 if (tk->Active) TEKChangeCaret(tk, ts);
36 }
37
38 void BackSpace(PTEKVar tk, PComVar cv)
39 {
40 tk->CaretX = tk->CaretX - tk->FontWidth;
41 if (tk->CaretX < 0) tk->CaretX = 0;
42 if (cv->HLogBuf != NULL) Log1Byte(cv,BS);
43 }
44
45 void LineFeed(PTEKVar tk, PComVar cv)
46 {
47 tk->CaretY = tk->CaretY + tk->FontHeight;
48 if (tk->CaretY > tk->ScreenHeight)
49 {
50 tk->CaretY = tk->FontHeight;
51 if ((tk->CaretOffset==0) || (tk->CaretX < tk->CaretOffset))
52 {
53 tk->CaretOffset = tk->ScreenWidth >> 1;
54 tk->CaretX = tk->CaretX + tk->CaretOffset;
55 if (tk->CaretX >= tk->ScreenWidth)
56 tk->CaretX = tk->CaretOffset;
57 }
58 else {
59 tk->CaretX = tk->CaretX - tk->CaretOffset;
60 tk->CaretOffset = 0;
61 }
62 }
63 if (cv->HLogBuf != NULL) Log1Byte(cv,LF);
64 }
65
66 void CarriageReturn(PTEKVar tk, PComVar cv)
67 {
68 tk->CaretX = tk->CaretOffset;
69 if (cv->HLogBuf != NULL) Log1Byte(cv,CR);
70 }
71
72 void Tab(PTEKVar tk, PComVar cv)
73 {
74 if (cv->HLogBuf != NULL) Log1Byte(cv,HT);
75 tk->CaretX = tk->CaretX + (tk->FontWidth << 3);
76 if (tk->CaretX >= tk->ScreenWidth)
77 {
78 CarriageReturn(tk,cv);
79 LineFeed(tk,cv);
80 }
81 }
82
83 void EnterVectorMode(PTEKVar tk)
84 {
85 tk->MoveFlag = TRUE;
86 tk->Drawing = FALSE;
87 tk->DispMode = IdVectorMode;
88 }
89
90 void EnterMarkerMode(PTEKVar tk)
91 {
92 tk->MoveFlag = TRUE;
93 tk->Drawing = FALSE;
94 tk->DispMode = IdMarkerMode;
95 }
96
97 void EnterPlotMode(PTEKVar tk)
98 {
99 if (tk->DispMode == IdAlphaMode)
100 tk->CaretOffset = 0;
101
102 tk->PlotX =
103 (int)((float)(tk->CaretX) / (float)(tk->ScreenWidth) *
104 (float)(ViewSizeX));
105 tk->PlotY =
106 (int)((float)(tk->ScreenHeight-1-tk->CaretY) /
107 (float)(tk->ScreenHeight) * (float)(ViewSizeY));
108 tk->DispMode = IdPlotMode;
109 tk->JustAfterRS = TRUE;
110 }
111
112 void EnterAlphaMode(PTEKVar tk)
113 {
114 if ((tk->DispMode == IdVectorMode) ||
115 (tk->DispMode == IdPlotMode))
116 tk->CaretOffset = 0;
117
118 tk->DispMode = IdAlphaMode;
119 tk->Drawing = FALSE;
120 }
121
122 void EnterUnknownMode(PTEKVar tk)
123 {
124 if ((tk->DispMode == IdVectorMode) ||
125 (tk->DispMode == IdPlotMode))
126 tk->CaretOffset = 0;
127
128 tk->DispMode = IdUnknownMode;
129 }
130
131 void TEKMoveTo(PTEKVar tk, PTTSet ts, int X, int Y, BOOL Draw)
132 {
133 HDC DC;
134 HPEN OldPen;
135
136 if (Draw)
137 {
138 DC = GetDC(tk->HWin);
139 OldPen = SelectObject(DC,tk->Pen);
140 SetBkColor(DC,ts->TEKColor[1]);
141 SetBkMode(DC, 1);
142 if ((tk->CaretX == X) && (tk->CaretY==Y))
143 {
144 SetPixel(DC,X,Y,tk->PenColor);
145 SetPixel(tk->MemDC,X,Y,tk->MemPenColor);
146 }
147 else {
148 MoveToEx(DC,tk->CaretX,tk->CaretY,NULL);
149 LineTo(DC,X,Y);
150 MoveToEx(tk->MemDC,tk->CaretX,tk->CaretY,NUL);
151 LineTo(tk->MemDC,X,Y);
152 }
153 SelectObject(DC,OldPen);
154 ReleaseDC(tk->HWin,DC);
155 }
156 tk->CaretX = X;
157 tk->CaretY = Y;
158 }
159
160 void DrawMarker(PTEKVar tk)
161 {
162 BYTE b;
163 RECT R;
164 HFONT OldFont;
165 COLORREF OldColor;
166
167 switch (tk->MarkerType) {
168 case 0: b = 0xb7; break;
169 case 1: b = '+'; break;
170 case 2: b = 0xc5; break;
171 case 3: b = '*'; break;
172 case 4: b = 'o'; break;
173 case 5: b = 0xb4; break;
174 case 6: b = 'O'; break;
175 case 7: b = 0xe0; break;
176 case 8: b = 0xc6; break;
177 case 9: b = 0xa8; break;
178 case 10: b = 0xa7; break;
179 default:
180 b = '+';
181 }
182 OldFont = SelectObject(tk->MemDC,tk->MarkerFont);
183 OldColor = SetTextColor(tk->MemDC,tk->PenColor);
184 SetTextAlign(tk->MemDC,TA_CENTER | TA_BOTTOM | TA_NOUPDATECP);
185 ExtTextOut(tk->MemDC,tk->CaretX,tk->CaretY+tk->MarkerH/2,
186 0,NULL,&b,1,NULL);
187 SetTextAlign(tk->MemDC,TA_LEFT | TA_BOTTOM | TA_NOUPDATECP);
188 SelectObject(tk->MemDC,OldFont);
189 SetTextColor(tk->MemDC,OldColor);
190 R.left = tk->CaretX- tk->MarkerW;
191 R.right = tk->CaretX + tk->MarkerW;
192 R.top = tk->CaretY - tk->MarkerH;
193 R.bottom = tk->CaretY + tk->MarkerH;
194 InvalidateRect(tk->HWin,&R,FALSE);
195 }
196
197 void Draw(PTEKVar tk, PComVar cv, PTTSet ts, BYTE b)
198 {
199 int X, Y;
200
201 if (! tk->Drawing)
202 {
203 tk->LoXReceive = FALSE;
204 tk->LoCount = 0;
205 tk->Drawing = TRUE;
206 if (tk->DispMode==IdMarkerMode)
207 {
208 tk->MoveFlag = TRUE;
209 tk->MarkerFlag = TRUE;
210 }
211 else
212 tk->MarkerFlag = FALSE;
213 }
214
215 if (b<=0x1f)
216 {
217 CommInsert1Byte(cv,b);
218 return;
219 }
220 else if ((b>=0x20) && (b<=0x3f))
221 {
222 if (tk->LoCount==0)
223 tk->HiY = b - 0x20;
224 else
225 tk->HiX = b - 0x20;
226 }
227 else if ((b>=0x40) && (b<=0x5f))
228 {
229 tk->LoX = b - 0x40;
230 tk->LoXReceive = TRUE;
231 }
232 else if ((b>=0x60) && (b<=0x7f))
233 {
234 tk->LoA = tk->LoB;
235 tk->LoB = b - 0x60;
236 tk->LoCount++;
237 }
238
239 if (! tk->LoXReceive) return;
240
241 tk->Drawing = FALSE;
242 tk->ParseMode = ModeFirst;
243
244 if (tk->LoCount > 1)
245 tk->Extra = tk->LoA;
246 if (tk->LoCount > 0)
247 tk->LoY = tk->LoB;
248
249 X = (int)((float)(tk->HiX*128 + tk->LoX*4 + (tk->Extra & 3)) /
250 (float)(ViewSizeX) * (float)(tk->ScreenWidth));
251 Y = tk->ScreenHeight - 1 -
252 (int)((float)(tk->HiY * 128 + tk->LoY * 4 + tk->Extra / 4) /
253 (float)(ViewSizeY) * (float)(tk->ScreenHeight));
254 TEKMoveTo(tk,ts,X,Y,! tk->MoveFlag);
255 tk->MoveFlag = FALSE;
256 if (tk->MarkerFlag)
257 DrawMarker(tk);
258 tk->MarkerFlag = FALSE;
259 }
260
261 void Plot(PTEKVar tk, PTTSet ts, BYTE b)
262 {
263 int X, Y;
264
265 X = 0;
266 Y = 0;
267 switch (b) {
268 case 'A': X = 4; break;
269 case 'B': X = -4; break;
270 case 'D': Y = 4; break;
271 case 'E':
272 X = 4;
273 Y = 4;
274 break;
275 case 'F':
276 X = -4;
277 Y = 4;
278 break;
279 case 'H': Y = -4; break;
280 case 'I':
281 X = 4;
282 Y = -4;
283 break;
284 case 'J':
285 X = -4;
286 Y = -4;
287 break;
288 default:
289 return;
290 }
291 tk->PlotX = tk->PlotX + X;
292 if (tk->PlotX < 0) tk->PlotX = 0;
293 if (tk->PlotX >= ViewSizeX)
294 tk->PlotX = ViewSizeX - 1;
295 tk->PlotY = tk->PlotY + Y;
296 if (tk->PlotY < 0) tk->PlotY = 0;
297 if (tk->PlotY >= ViewSizeY)
298 tk->PlotY = ViewSizeY - 1;
299 X = (int)((float)(tk->PlotX) / (float)(ViewSizeX) *
300 (float)(tk->ScreenWidth));
301 Y = tk->ScreenHeight - 1 -
302 (int)((float)(tk->PlotY) / (float)(ViewSizeY) *
303 (float)(tk->ScreenHeight));
304 TEKMoveTo(tk,ts,X,Y,tk->PenDown);
305 }
306
307 void DispChar(PTEKVar tk, PComVar cv, BYTE b)
308 {
309 int Dx[2];
310 RECT R;
311
312 Dx[0] = tk->FontWidth;
313 Dx[1] = tk->FontWidth;
314 ExtTextOut(tk->MemDC,tk->CaretX,tk->CaretY,0,NULL,&b,1,&Dx[0]);
315 R.left = tk->CaretX;
316 R.right = tk->CaretX + tk->FontWidth;
317 R.top = tk->CaretY - tk->FontHeight;
318 R.bottom = tk->CaretY;
319 InvalidateRect(tk->HWin,&R,FALSE);
320 tk->CaretX = R.right;
321
322 if (cv->HLogBuf != NULL) Log1Byte(cv,b);
323
324 if (tk->CaretX > tk->ScreenWidth - tk->FontWidth)
325 {
326 CarriageReturn(tk,cv);
327 LineFeed(tk,cv);
328 }
329 }
330
331 void TEKBeep(PTTSet ts)
332 {
333 if (ts->Beep!=0)
334 MessageBeep(0);
335 }
336
337 void ParseFirst(PTEKVar tk, PTTSet ts, PComVar cv, BYTE b)
338 {
339 if (tk->DispMode == IdAlphaMode)
340 {
341 switch (b) {
342 case 0x07: TEKBeep(ts); break;
343 case 0x08: BackSpace(tk,cv); break;
344 case 0x09: Tab(tk,cv); break;
345 case 0x0a: LineFeed(tk,cv); break;
346 case 0x0b:
347 case 0x0c: break;
348 case 0x0d:
349 CarriageReturn(tk,cv);
350 if (ts->CRReceive==IdCRLF)
351 CommInsert1Byte(cv,0x0A);
352 break;
353 case 0x18:
354 if (ts->AutoWinSwitch > 0)
355 tk->ChangeEmu = IdVT; /* Enter VT Mode */
356 break;
357 case 0x19:
358 case 0x1a: break;
359 case 0x1b:
360 tk->ParseMode = ModeEscape;
361 return;
362 case 0x1c: EnterMarkerMode(tk); break;
363 case 0x1d: EnterVectorMode(tk); break;
364 case 0x1e: EnterPlotMode(tk); break;
365 case 0x1f: break;
366 case 0x7f: if (tk->Drawing) Draw(tk,cv,ts,b); break;
367 default:
368 if (b<=0x06) break;
369 if ((b>=0x0e) && (b<=0x17)) break;
370 if (tk->Drawing) Draw(tk,cv,ts,b);
371 else DispChar(tk,cv,b);
372 }
373 }
374 else if ((tk->DispMode==IdVectorMode) ||
375 (tk->DispMode==IdMarkerMode))
376 {
377 switch (b) {
378 case 0x07:
379 if (tk->MoveFlag)
380 tk->MoveFlag = FALSE;
381 else
382 TEKBeep(ts);
383 break;
384 case 0x0d:
385 CommInsert1Byte(cv,0x0d);
386 EnterAlphaMode(tk); /* EnterAlphaMode */
387 break;
388 case 0x18:
389 if (ts->AutoWinSwitch > 0)
390 tk->ChangeEmu = IdVT; /* Enter VT Mode */
391 break;
392 case 0x19:
393 case 0x1a: break;
394 case 0x1b:
395 tk->ParseMode = ModeEscape;
396 return;
397 case 0x1c: EnterMarkerMode(tk); break;
398 case 0x1d: EnterVectorMode(tk); break;
399 case 0x1e: EnterPlotMode(tk); break;
400 case 0x1f: EnterAlphaMode(tk); break;
401 default:
402 if (b<=0x06) break;
403 if ((b>=0x08) && (b<=0x0c)) break;
404 if ((b>=0x0e) && (b<=0x17)) break;
405 Draw(tk,cv,ts,b);
406 }
407 }
408 else if (tk->DispMode==IdPlotMode)
409 {
410 switch (b) {
411 case 0x07: TEKBeep(ts); break;
412 case 0x0d:
413 CommInsert1Byte(cv,0x0d);
414 EnterAlphaMode(tk); /* EnterAlphaMode */
415 break;
416 case 0x18:
417 if (ts->AutoWinSwitch > 0)
418 tk->ChangeEmu = IdVT; /* Enter VT Mode */
419 break;
420 case 0x19:
421 case 0x1a: break;
422 case 0x1b:
423 tk->ParseMode = ModeEscape;
424 return;
425 case 0x1c: EnterMarkerMode(tk); break;
426 case 0x1d: EnterVectorMode(tk); break;
427 case 0x1e: EnterPlotMode(tk); break;
428 case 0x1f: EnterAlphaMode(tk); break; /* EnterAlphaMode */
429 case 0x7f: break;
430 default:
431 if (b<=0x06) break;
432 if ((b>=0x08) && (b<=0x0c)) break;
433 if ((b>=0x0e) && (b<=0x17)) break;
434
435 if (tk->JustAfterRS)
436 {
437 if (b==0x20)
438 tk->PenDown = FALSE;
439 else if (b=='P')
440 tk->PenDown = TRUE;
441 else
442 EnterUnknownMode(tk);
443 tk->JustAfterRS = FALSE;
444 }
445 else
446 Plot(tk,ts,b);
447 }
448 }
449 else {
450 switch (b) {
451 case 0x1f: EnterAlphaMode(tk); break;
452 }
453 }
454
455 tk->ParseMode = ModeFirst;
456 }
457
458 void SelectCode(PTEKVar tk, PTTSet ts, BYTE b)
459 {
460 switch (b) {
461 case ' ':
462 if (tk->SelectCodeFlag == '#')
463 tk->SelectCodeFlag = b;
464 return;
465 case '!':
466 if (tk->SelectCodeFlag == '%')
467 tk->SelectCodeFlag = b;
468 return;
469 case '0': break;
470 case '1':
471 case '2':
472 if ((tk->SelectCodeFlag == ' ') ||
473 (tk->SelectCodeFlag == '!'))
474 tk->ChangeEmu = IdVT; /* enter VT mode */
475 break;
476 case '3':
477 if (tk->SelectCodeFlag == '!')
478 tk->ChangeEmu = IdVT; /* enter VT mode */
479 break;
480 case '5':
481 if (tk->SelectCodeFlag == ' ')
482 tk->ChangeEmu = IdVT; /* enter VT mode */
483 break;
484 default:
485 if (b <= US) return;
486 }
487 if ((0x20<=b) && (b<0x7f)) tk->ParseMode = ModeFirst;
488 tk->SelectCodeFlag = 0;
489 if (ts->AutoWinSwitch == 0) tk->ChangeEmu = 0;
490 }
491
492 COLORREF ColorIndex(COLORREF Fore, COLORREF Back, WORD w)
493 {
494 switch (w) {
495 case 1: return Fore;
496 case 2: return RGB(255, 0, 0); /* Red */
497 case 3: return RGB( 0,255, 0); /* Green */
498 case 4: return RGB( 0, 0,255); /* Blue */
499 case 5: return RGB( 0,255,255); /* Cyan */
500 case 6: return RGB(255, 0,255); /* Magenta */
501 case 7: return RGB(255,255, 0); /* Yellow */
502 case 8: return RGB(255,128, 0); /* Orange */
503 case 9: return RGB(128,255, 0); /* Green-Yellow */
504 case 10: return RGB( 0,255,128); /* Green-Cyan */
505 case 11: return RGB( 0,128,255); /* Blue-Cyan */
506 case 12: return RGB(128, 0,255); /* Blue-Magenta */
507 case 13: return RGB(255, 0,128); /* Red-Magenta */
508 case 14: return RGB( 85, 85, 85); /* Dark gray */
509 case 15: return RGB(170,170,170); /* Light gray */
510 }
511 return Back;
512 }
513
514 void SetLineIndex(PTEKVar tk, PTTSet ts, WORD w)
515 // change graphic color
516 {
517 HDC TempDC;
518
519 tk->PenColor = ColorIndex(ts->TEKColor[0],ts->TEKColor[1],w);
520 TempDC = GetDC(tk->HWin);
521 tk->PenColor = GetNearestColor(TempDC,tk->PenColor);
522 ReleaseDC(tk->HWin,TempDC);
523 if (ts->TEKColorEmu > 0)
524 tk->MemPenColor = tk->PenColor;
525 else
526 if (tk->PenColor == ts->TEKColor[1])
527 tk->MemPenColor = tk->MemBackColor;
528 else
529 tk->MemPenColor = tk->MemForeColor;
530
531 DeleteObject(tk->Pen);
532 tk->Pen = CreatePen(tk->ps,1,tk->PenColor);
533
534 SelectObject(tk->MemDC, tk->OldMemPen);
535 DeleteObject(tk->MemPen);
536 tk->MemPen = CreatePen(tk->ps,1,tk->MemPenColor);
537 tk->OldMemPen = SelectObject(tk->MemDC,tk->MemPen);
538 }
539
540 void SetTextIndex(PTEKVar tk, PTTSet ts, WORD w)
541 // change text color
542 {
543 HDC TempDC;
544
545 tk->TextColor = ColorIndex(ts->TEKColor[0],ts->TEKColor[1],w);
546 TempDC = GetDC(tk->HWin);
547 tk->TextColor = GetNearestColor(TempDC,tk->TextColor);
548 ReleaseDC(tk->HWin,TempDC);
549 if (ts->TEKColorEmu > 0)
550 tk->MemTextColor = tk->TextColor;
551 else
552 if (tk->TextColor == ts->TEKColor[1])
553 tk->MemTextColor = tk->MemBackColor;
554 else
555 tk->MemTextColor = tk->MemForeColor;
556
557 SetTextColor(tk->MemDC, tk->MemTextColor);
558 }
559
560 void SetColorIndex(PTEKVar tk, PTTSet ts, WORD w)
561 // change color for text & graphics
562 {
563 SetLineIndex(tk,ts,w);
564 SetTextIndex(tk,ts,w);
565 }
566
567 void SetLineStyle(PTEKVar tk, BYTE b)
568 {
569 switch (b) {
570 case 0: tk->ps = PS_SOLID; break;
571 case 1: tk->ps = PS_DOT; break;
572 case 2: tk->ps = PS_DASHDOT; break;
573 case 3: tk->ps = PS_DASH; break;
574 case 4: tk->ps = PS_DASH; break;
575 case 5: tk->ps = PS_DASHDOTDOT; break;
576 case 6: tk->ps = PS_DASHDOT; break;
577 case 7: tk->ps = PS_DASH; break;
578 case 8: tk->ps = PS_DASHDOTDOT; break;
579 default:
580 tk->ps = PS_SOLID;
581 }
582 if (tk->Pen != NULL) DeleteObject(tk->Pen);
583 tk->Pen = CreatePen(tk->ps,1,tk->PenColor);
584
585 SelectObject(tk->MemDC, tk->OldMemPen);
586 if (tk->MemPen != NULL) DeleteObject(tk->MemPen);
587 tk->MemPen = CreatePen(tk->ps,1,tk->MemPenColor);
588 tk->OldMemPen = SelectObject(tk->MemDC,tk->MemPen);
589 }
590
591 void TwoOpCode(PTEKVar tk, PTTSet ts, PComVar cv, BYTE b)
592 {
593 double Re;
594
595 if (tk->OpCount == 2)
596 {
597 tk->OpCount--;
598 tk->Op2OC = b << 8;
599 return;
600 }
601 else if (tk->OpCount == 1)
602 {
603 if (b <= 0x1a) return;
604 else if ((b>=0x1b) && (b<=0x1f))
605 {
606 CommInsert1Byte(cv,b);
607 tk->ParseMode = ModeFirst;
608 return;
609 }
610 else {
611 tk->OpCount--;
612 tk->Op2OC = tk->Op2OC + b;
613 switch (tk->Op2OC) {
614 case IdMove: tk->PrmCountMax = 0; break;
615 case IdDraw: tk->PrmCountMax = 0; break;
616 case IdDrawMarker: tk->PrmCountMax = 0; break;
617 case IdGraphText: tk->PrmCountMax = 1; break;
618 case IdSetDialogVisibility: tk->PrmCountMax = 1; break;
619 case IdSetGraphTextSize: tk->PrmCountMax = 3; break;
620 case IdSetWriteMode: tk->PrmCountMax = 1; break;
621 case IdSetLineIndex: tk->PrmCountMax = 1; break;
622 case IdSetMarkerType: tk->PrmCountMax = 1; break;
623 case IdSetCharPath: tk->PrmCountMax = 1; break;
624 case IdSetPrecision: tk->PrmCountMax = 1; break;
625 case IdSetRotation: tk->PrmCountMax = 2; break;
626 case IdSetTextIndex: tk->PrmCountMax = 1; break;
627 case IdSetLineStyle: tk->PrmCountMax = 1; break;
628 default:
629 tk->PrmCountMax = 0;
630 }
631 memset(tk->Prm2OC,0,sizeof(tk->Prm2OC));
632 tk->PrmCount = 0;
633 if (tk->PrmCountMax > 0) return;
634 }
635 }
636
637 if (tk->PrmCount < tk->PrmCountMax)
638 {
639 if (b <= 0x1a) return;
640 else if ((b>=0x1b) && (b<=0x1f))
641 {
642 CommInsert1Byte(cv,b);
643 tk->PrmCount = tk->PrmCountMax;
644 tk->ParseMode = ModeFirst;
645 }
646 else if ((b>=0x20) && (b<=0x2f))
647 { /* LoI (minus) */
648 tk->Prm2OC[tk->PrmCount] =
649 - (tk->Prm2OC[tk->PrmCount]*16 + b - 0x20);
650 tk->PrmCount++;
651 }
652 else if ((b>=0x30) && (b<=0x3f))
653 { /* LoI (plus) */
654 tk->Prm2OC[tk->PrmCount] =
655 tk->Prm2OC[tk->PrmCount]*16 + b - 0x30;
656 tk->PrmCount++;
657 }
658 else if ((b>=0x40) && (b<=0x7f))
659 tk->Prm2OC[tk->PrmCount] =
660 tk->Prm2OC[tk->PrmCount]*64 + b - 0x40;
661 }
662
663 if (tk->PrmCount < tk->PrmCountMax) return;
664
665 switch (tk->Op2OC) {
666 case IdMove:
667 tk->LoXReceive = FALSE;
668 tk->LoCount = 0;
669 tk->Drawing = TRUE;
670 tk->MoveFlag = TRUE;
671 tk->MarkerFlag = FALSE;
672 break;
673 case IdDraw:
674 tk->LoXReceive = FALSE;
675 tk->LoCount = 0;
676 tk->Drawing = TRUE;
677 tk->MoveFlag = FALSE;
678 tk->MarkerFlag = FALSE;
679 break;
680 case IdDrawMarker:
681 tk->LoXReceive = FALSE;
682 tk->LoCount = 0;
683 tk->Drawing = TRUE;
684 tk->MoveFlag = TRUE;
685 tk->MarkerFlag = TRUE;
686 break;
687 case IdGraphText:
688 tk->GTCount = 0;
689 tk->GTLen = tk->Prm2OC[0];
690 if (tk->GTLen>0)
691 tk->ParseMode = ModeGT;
692 else
693 tk->ParseMode = ModeFirst;
694 return;
695 case IdSetDialogVisibility: break;
696 case IdSetGraphTextSize:
697 tk->GTWidth = tk->Prm2OC[0];
698 tk->GTHeight = tk->Prm2OC[1];
699 tk->GTSpacing = tk->Prm2OC[2];
700 if ((tk->GTWidth==0) &&
701 (tk->GTHeight==0) &&
702 (tk->GTSpacing==0))
703 {
704 tk->GTWidth=39;
705 tk->GTHeight=59;
706 tk->GTSpacing=12;
707 }
708 if (tk->GTWidth<=0) tk->GTWidth=39;
709 if (tk->GTHeight<=0) tk->GTWidth=59;
710 if (tk->GTSpacing<=0) tk->GTSpacing=0;
711 break;
712 case IdSetWriteMode: break;
713 case IdSetLineIndex:
714 SetLineIndex(tk,ts,tk->Prm2OC[0]);
715 break;
716 case IdSetMarkerType:
717 tk->MarkerType = tk->Prm2OC[0];
718 break;
719 case IdSetCharPath: break;
720 case IdSetPrecision: break;
721 case IdSetRotation:
722 Re = (double)tk->Prm2OC[0] *
723 pow(2.0,(double)tk->Prm2OC[1]);
724 Re = fmod(Re,360.0);
725 if (Re<0) Re = Re + 360.0;
726 if (Re<45.0)
727 tk->GTAngle=0;
728 else if (Re<135.0)
729 tk->GTAngle = 1;
730 else if (Re<315.0)
731 tk->GTAngle = 2;
732 else
733 tk->GTAngle = 3;
734 break;
735 case IdSetTextIndex:
736 SetTextIndex(tk,ts,tk->Prm2OC[0]);
737 break;
738 case IdSetLineStyle:
739 SetLineStyle(tk,(BYTE)(tk->Prm2OC[0]));
740 break;
741 }
742
743 tk->ParseMode = ModeFirst;
744 }
745
746 void EscPage(PTEKVar tk) /* Clear Screen and enter ALPHAMODE */
747 {
748 RECT R;
749
750 SetLineStyle(tk,0);
751 GetClientRect(tk->HWin,&R);
752 FillRect(tk->MemDC,&R,tk->MemBackGround);
753 InvalidateRect(tk->HWin,&R,FALSE);
754 UpdateWindow(tk->HWin);
755 EnterAlphaMode(tk);
756 tk->CaretX = 0;
757 tk->CaretOffset = 0;
758 tk->CaretY = 0;
759 }
760
761 void TEKEscape(PTEKVar tk, PTTSet ts, PComVar cv, BYTE b)
762 {
763 switch (b) {
764 case 0x00: return;
765 case 0x0a: return;
766 case 0x0c: EscPage(tk); break;
767 case 0x0d: return;
768 case 0x1a:
769 tk->GIN = TRUE;
770 /* Capture mouse */
771 SetCapture(tk->HWin);
772 EnterAlphaMode(tk);
773 break;
774 case 0x1b: return;
775 case 0x1c:
776 case 0x1d:
777 case 0x1e:
778 case 0x1f:
779 CommInsert1Byte(cv,b); break;
780 case '#':
781 tk->ParseMode = ModeSelectCode;
782 tk->SelectCodeFlag = b;
783 return;
784 case '%':
785 tk->ParseMode = ModeSelectCode;
786 tk->SelectCodeFlag = b;
787 return;
788 case '2':
789 if (ts->AutoWinSwitch > 0)
790 tk->ChangeEmu = IdVT; /* Enter VT Mode */
791 break;
792 case '[':
793 tk->CSCount = 0;
794 tk->ParseMode = ModeCS;
795 return;
796 case 0x7f: return;
797 default:
798 if ((b>='8') && (b<=';'))
799 {
800 if (tk->TextSize != b-0x38)
801 {
802 tk->TextSize = b-0x38;
803 ChangeTextSize(tk,ts);
804 }
805 break;
806 }
807 else if ((b>='I') && (b<='Z'))
808 {
809 tk->ParseMode = Mode2OC;
810 tk->OpCount = 2;
811 TwoOpCode(tk,ts,cv,b);
812 return;
813 }
814 else if ((b>=0x60) && (b<=0x6f))
815 {
816 SetLineStyle(tk,(BYTE)((b-0x60) & 7));
817 break;
818 }
819 }
820 tk->ParseMode = ModeFirst;
821 }
822
823 void CSSetAttr(PTEKVar tk, PTTSet ts)
824 {
825 int i, P;
826
827 for (i=1 ; i<=tk->NParam ; i++)
828 {
829 P = tk->Param[i];
830 if (P<0) P = 0;
831 switch (P) {
832 /* Clear */
833 case 0:
834 SetColorIndex(tk,ts,1);
835 break;
836 /* Bold */
837 case 1:
838 break;
839 /* Under line */
840 case 4:
841 break;
842 /* Blink */
843 case 5:
844 break;
845 /* Reverse */
846 case 7:
847 break;
848 /* Bold off */
849 case 22:
850 break;
851 /* Under line off */
852 case 24:
853 break;
854 /* Blink off */
855 case 25:
856 break;
857 /* Reverse off */
858 case 27:
859 break;
860 // colors for text & graphics
861 case 30: SetColorIndex(tk,ts,0); break;
862 case 31: SetColorIndex(tk,ts,2); break;
863 case 32: SetColorIndex(tk,ts,3); break;
864 case 33: SetColorIndex(tk,ts,7); break;
865 case 34: SetColorIndex(tk,ts,4); break;
866 case 35: SetColorIndex(tk,ts,6); break;
867 case 36: SetColorIndex(tk,ts,5); break;
868 case 37: SetColorIndex(tk,ts,1); break;
869 case 39: SetColorIndex(tk,ts,1); break;
870 }
871 }
872 }
873
874 void ParseCS(PTEKVar tk, PTTSet ts, PComVar cv)
875 {
876 #define IntCharMax 5
877 int i = 0;
878 BYTE IntChar[IntCharMax+1];
879 int ICount = 0;
880 BOOL FirstPrm = TRUE;
881 BYTE Prv = 0;
882 BOOL MoveToVT;
883 BYTE b;
884
885 tk->NParam = 1;
886 tk->Param[1] = -1;
887 do {
888 b = tk->CSBuff[i++];
889 if ((b>=0x20) && (b<=0x2F))
890 {
891 if (ICount<IntCharMax) ICount++;
892 IntChar[ICount] = b;
893 }
894 else if ((b>=0x30) && (b<=0x39))
895 {
896 if (tk->Param[tk->NParam] < 0)
897 tk->Param[tk->NParam] = 0;
898 if (tk->Param[tk->NParam]<1000)
899 tk->Param[tk->NParam] = tk->Param[tk->NParam]*10 + b - 0x30;
900 }
901 else if (b==0x3B)
902 {
903 if (tk->NParam < NParamMax)
904 {
905 tk->NParam++;
906 tk->Param[tk->NParam] = -1;
907 }
908 }
909 else if ((b>=0x3C) && (b<=0x3F))
910 {
911 if (FirstPrm) Prv = b;
912 }
913 FirstPrm = FALSE;
914 } while ((i<tk->CSCount) &&
915 ! ((b>=0x40) && (b<=0x7E)));
916
917 MoveToVT = FALSE;
918 if ((b>=0x40) && (b<=0x7E))
919 {
920 switch (ICount) {
921 /* no intermediate char */
922 case 0:
923 switch (Prv) {
924 /* no private parameters */
925 case 0:
926 switch (b) {
927 case 'm': CSSetAttr(tk,ts); break;
928 default: MoveToVT = TRUE;
929 }
930 break;
931 case '?':
932 // ignore ^[?38h (select TEK mode)
933 if ((b!='h') || (tk->Param[1]!=38))
934 MoveToVT = TRUE;
935 break;
936 default:
937 MoveToVT = TRUE;
938 }
939 break;
940 default:
941 MoveToVT = TRUE;
942 } /* end of switch (Icount) */
943 }
944 else
945 MoveToVT = TRUE;
946
947 if ((ts->AutoWinSwitch>0) && MoveToVT)
948 {
949 for (i=tk->CSCount-1 ; i>=0; i--)
950 CommInsert1Byte(cv,tk->CSBuff[i]);
951 CommInsert1Byte(cv,0x5B);
952 CommInsert1Byte(cv,0x1B);
953 tk->ChangeEmu = IdVT;
954 }
955 tk->ParseMode = ModeFirst;
956 }
957
958 void ControlSequence(PTEKVar tk, PTTSet ts, PComVar cv, BYTE b)
959 {
960 switch (b) {
961 case 0x1B:
962 case 0x1C:
963 case 0x1D:
964 case 0x1E:
965 case 0x1F:
966 CommInsert1Byte(cv,b); break;
967 default:
968 if (tk->CSCount < sizeof(tk->CSBuff))
969 {
970 tk->CSBuff[tk->CSCount++] = b;
971 if ((b>=0x40) && (b<=0x7E))
972 ParseCS(tk,ts,cv);
973 return;
974 }
975 }
976 tk->ParseMode = ModeFirst;
977 }
978
979 void GraphText(PTEKVar tk, PTTSet ts, PComVar cv, BYTE b)
980 {
981 int i, Dx[80];
982 HFONT TempFont, TempOld;
983 LOGFONT lf;
984 RECT R;
985 int W, H;
986 TEXTMETRIC Metrics;
987
988 switch (b) {
989 case 0x1B:
990 case 0x1C:
991 case 0x1D:
992 case 0x1E:
993 case 0x1F:
994 CommInsert1Byte(cv,b); break;
995 default:
996 tk->GTBuff[tk->GTCount++] = b;
997 if ((tk->GTCount>=sizeof(tk->GTBuff)) ||
998 (tk->GTCount>=tk->GTLen))
999 {
1000 memcpy(&lf,&tk->TEKlf,sizeof(lf));
1001 switch (tk->GTAngle) {
1002 case 0: lf.lfEscapement = 0; break;
1003 case 1: lf.lfEscapement = 900; break;
1004 case 2: lf.lfEscapement = 1800; break;
1005 case 3: lf.lfEscapement = 2700; break;
1006 }
1007 W = (int)((float)tk->GTWidth / (float)ViewSizeX *
1008 (float)tk->ScreenWidth);
1009 H = (int)((float)tk->GTHeight / (float)ViewSizeY *
1010 (float)tk->ScreenHeight);
1011 lf.lfWidth = W;
1012 lf.lfHeight = H;
1013 TempFont = CreateFontIndirect(&lf);
1014 TempOld = SelectObject(tk->MemDC,TempFont);
1015 W = (int)((float)(tk->GTWidth + tk->GTSpacing) /
1016 (float)ViewSizeX *
1017 (float)tk->ScreenWidth);
1018 GetTextMetrics(tk->MemDC, &Metrics);
1019 if (W < Metrics.tmAveCharWidth)
1020 W = Metrics.tmAveCharWidth;
1021 H = Metrics.tmHeight;
1022 for (i=0; i <= tk->GTLen; i++)
1023 Dx[i] = W;
1024 SetTextAlign(tk->MemDC,TA_LEFT | TA_BASELINE | TA_NOUPDATECP);
1025 ExtTextOut(tk->MemDC,tk->CaretX,tk->CaretY,0,NULL,tk->GTBuff,tk->GTLen,&Dx[0]);
1026 SetTextAlign(tk->MemDC,TA_LEFT | TA_BOTTOM | TA_NOUPDATECP);
1027 SelectObject(tk->MemDC,TempOld);
1028 DeleteObject(TempFont);
1029 switch (tk->GTAngle) {
1030 case 0:
1031 R.left = tk->CaretX;
1032 R.top = tk->CaretY - H;
1033 R.right = tk->CaretX + tk->GTLen*W;
1034 R.bottom = tk->CaretY + H;
1035 tk->CaretX = R.right;
1036 break;
1037 case 1:
1038 R.left = tk->CaretX - H;
1039 R.top = tk->CaretY - tk->GTLen*W;
1040 R.right = tk->CaretX + H;
1041 R.bottom = tk->CaretY;
1042 tk->CaretY = R.top;
1043 break;
1044 case 2:
1045 R.left = tk->CaretX - tk->GTLen*W;
1046 R.top = tk->CaretY - H;
1047 R.right = tk->CaretX;
1048 R.bottom = tk->CaretY + H;
1049 tk->CaretX = R.left;
1050 break;
1051 case 3:
1052 R.left = tk->CaretX - H;
1053 R.top = tk->CaretY;
1054 R.right = tk->CaretX + H;
1055 R.bottom = tk->CaretY + tk->GTLen*W;
1056 tk->CaretY = R.bottom;
1057 break;
1058 }
1059 InvalidateRect(tk->HWin,&R,FALSE);
1060 break;
1061 }
1062 return;
1063 }
1064 tk->ParseMode = ModeFirst;
1065 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26