|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: //
1.1.1.7 root 8: // LUNA LCD パネル、モニタ
1.1 root 9: //
10:
11: #include "wxlcdwindow.h"
12: #include "wxcolor.h"
1.1.1.4 root 13: #include "wxuimessage.h"
1.1 root 14: #include "lcd.h"
1.1.1.9 root 15: #include "monitor.h"
1.1 root 16:
1.1.1.7 root 17: //
18: // LUNA 前面 LCD パネル
19: //
1.1 root 20:
1.1.1.7 root 21: // BitmapPanel の継承で十分だが FontChanged() に連動させるため、
22: // TextPanel からの継承としている。
23: //
24: // 全体図。横16文字 x 縦2行
25: // □ は1キャラクタ分。5x8ピクセル。
26: // _ は1ピクセル分のアキ。
1.1 root 27: //
1.1.1.7 root 28: // +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +f
29: // 横 _□_□_□_□_□_□_□_□_□_□_□_□_□_□_□_□_
30: // _□_□_□_□_□_□_□_□_□_□_□_□_□_□_□_□_
1.1 root 31: //
1.1.1.7 root 32: // 1 2
33: // 縦 _□_□_
1.1 root 34:
35: // コンストラクタ
36: WXLCDPanel::WXLCDPanel(wxWindow *parent)
1.1.1.7 root 37: : inherited(parent)
1.1 root 38: {
1.1.1.10! root 39: SetName("LCDPanel");
! 40:
1.1.1.7 root 41: u_width = 5 * 16 + 17;
42: u_height = 8 * 2 + 3;
43:
44: lcd = GetLCDDevice();
45: ddram = lcd->GetDDRAM();
1.1 root 46:
1.1.1.4 root 47: // VM からの通知を受け取る
48: WXUIMessage::Connect(UIMessage::LCD, this,
49: wxCommandEventHandler(WXLCDPanel::OnLCDChanged));
1.1.1.5 root 50:
1.1.1.7 root 51: FontChanged();
1.1.1.5 root 52: SetBitmapBGColor(UD_CREAM);
1.1.1.7 root 53: Fill();
1.1 root 54: }
55:
56: // デストラクタ
57: WXLCDPanel::~WXLCDPanel()
58: {
1.1.1.7 root 59: WXUIMessage::Disconnect(UIMessage::LCD, this,
1.1.1.4 root 60: wxCommandEventHandler(WXLCDPanel::OnLCDChanged));
1.1 root 61: }
62:
1.1.1.7 root 63: // フォントサイズ変更通知
64: void
65: WXLCDPanel::FontChanged()
66: {
67: inherited::FontChanged();
68:
69: // このパネル内の描画の基本単位。
70: // 12, 16, 24 を 2, 3, 4 にする。
71: unit = (font_height + 5) / 6;
72: wxSize size(u_width * unit, u_height * unit);
1.1.1.10! root 73:
! 74: // バックバッファのサイズを固定。
! 75: SetMinBitmapSize(size);
! 76:
! 77: // コントロールの大きさを変更。
! 78: SetSize(size);
! 79: SetMinSize(size);
1.1.1.7 root 80: }
81:
1.1.1.4 root 82: // LCD 状態変更イベント (UIMessage)
1.1 root 83: void
1.1.1.4 root 84: WXLCDPanel::OnLCDChanged(wxCommandEvent& event)
1.1 root 85: {
1.1.1.4 root 86: Refresh();
1.1 root 87: }
88:
89: // バックグラウンドバッファに描画
90: void
1.1.1.5 root 91: WXLCDPanel::Draw()
1.1 root 92: {
93: for (int y = 0; y < 2; y++) {
94: for (int x = 0; x < 16; x++) {
95: uint8 ch = ddram[0x40 * y + x];
1.1.1.5 root 96: DrawChar(x, y, ch);
1.1 root 97: }
98: }
99: }
100:
101: // 1文字描画
102: void
1.1.1.5 root 103: WXLCDPanel::DrawChar(int x, int y, uint8 ch)
1.1 root 104: {
1.1.1.5 root 105: const Color pal[2] = { UD_YELLOW_GREEN, UD_BROWN };
1.1 root 106: const uint8 *font;
107:
1.1.1.7 root 108: font = lcd->GetFont(ch);
1.1.1.5 root 109: BitmapI1 src(font, 5, 8);
1.1 root 110:
1.1.1.8 root 111: int dx = (1 + x * 6) * unit;
112: int dy = (1 + y * 9) * unit;
113: bitmap.DrawBitmapI1Scale(dx, dy, src, pal, unit);
1.1 root 114: }
115:
1.1.1.5 root 116:
1.1 root 117: //
1.1.1.7 root 118: // LUNA 前面 LCD ウィンドウ
1.1 root 119: //
120:
121: // コンストラクタ
1.1.1.3 root 122: WXLCDWindow::WXLCDWindow(wxWindow *parent)
123: : inherited(parent, wxID_ANY, _("Front LCD"))
1.1 root 124: {
1.1.1.10! root 125: new WXLCDPanel(this);
! 126: Fit();
1.1 root 127: }
128:
129: // デストラクタ
130: WXLCDWindow::~WXLCDWindow()
131: {
132: }
133:
1.1.1.5 root 134:
1.1 root 135: //
1.1.1.7 root 136: // モニタの LCD キャラクタ部パネル
1.1 root 137: //
138:
1.1.1.7 root 139: // BitmapPanel の継承で十分だが FontChanged() に連動させるため、
140: // TextPanel からの継承としている。
141: //
142: // 全体図。横16文字 + 横16文字の2段組。
143: // □ は1キャラクタ分。5x8ピクセル。
144: // _ は1ピクセル分のアキ。
145: //
146: // 余白
147: // +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +f +0 +1 +f
148: // 横 _□_□_□_□_□_□_□_□_□_□_□_□_□_□_□_□□□_□ … □_
149: //
150: // 00 10 20 30 40 50 60 70
151: // 縦 _□_□_□_□_□_□_□_□_
1.1 root 152:
153: // コンストラクタ
154: WXLCDCharPanel::WXLCDCharPanel(wxWindow *parent)
1.1.1.7 root 155: : inherited(parent)
1.1 root 156: {
1.1.1.10! root 157: SetName("LCDCharPanel");
! 158:
1.1.1.7 root 159: lcd = GetLCDDevice();
160:
161: u_width = 5 * 33 + 32; // 横 5px * (32+1)文字、余白が計 32
162: u_height = 8 * 8 + 9; // 縦 8px * 8行、余白が計 9
163:
164: FontChanged();
1.1 root 165: }
166:
167: // デストラクタ
168: WXLCDCharPanel::~WXLCDCharPanel()
169: {
170: }
171:
1.1.1.7 root 172: // フォントサイズ変更通知
173: void
174: WXLCDCharPanel::FontChanged()
175: {
176: inherited::FontChanged();
177:
178: // このパネル内の描画の基本単位。
179: // 12, 16, 24 を 2, 3, 4 にする。
180: unit = (font_height + 5) / 6;
181: wxSize size(u_width * unit, u_height * unit);
1.1.1.10! root 182:
! 183: // バックバッファのサイズを固定。
! 184: SetMinBitmapSize(size);
! 185:
! 186: // コントロールの大きさを変更。
! 187: SetSize(size);
! 188: SetMinSize(size);
1.1.1.7 root 189: }
190:
1.1 root 191: // バックグラウンドバッファに描画
192: void
1.1.1.5 root 193: WXLCDCharPanel::Draw()
1.1 root 194: {
1.1.1.5 root 195: const Color pal[2] = { UD_WHITE, UD_BLACK };
1.1 root 196:
197: // フォントは 5x8 (最下行はカーソル用に空けてあるので実際は 5x7)。
198: // 実際には 0xe0 以降には 5x10 フォントが混在しているのだが、その
199: // モードはサポートしていないので今の所全部 5x8 としてある。
200:
1.1.1.2 root 201: // cx, cy はこの文字の左上座標 (スケール前)
1.1.1.7 root 202: int cx = 1;
203: int cy = 1;
1.1.1.2 root 204: for (int ch = 0; ch < 256; ch++) {
1.1.1.7 root 205: const uint8 *font = lcd->GetFont(ch);
1.1.1.5 root 206: BitmapI1 src(font, 5, 8);
1.1.1.8 root 207: bitmap.DrawBitmapI1Scale(cx * unit, cy * unit, src, pal, unit);
1.1.1.2 root 208:
209: cx += 6;
210: if (ch % 16 == 15) {
211: if (ch == 127) {
1.1.1.7 root 212: // 0x80 以降は右側に作る。
213: // 余白も含めた 6px ずつ加算してきたが中間のアキは計 5px
214: // なので、過剰分の 1 引く必要がある。
215: cx += 5 - 1;
1.1.1.2 root 216: cy = 1;
1.1.1.7 root 217: } else {
218: // 行折り返し
219: cx -= 6 * 16;
220: cy += 9;
1.1.1.2 root 221: }
222: }
1.1 root 223: }
224: }
225:
1.1.1.5 root 226:
1.1 root 227: //
228: // LCD モニタウィンドウ
229: //
230:
231: // コンストラクタ
1.1.1.3 root 232: WXLCDMonitor::WXLCDMonitor(wxWindow *parent)
1.1.1.7 root 233: : inherited(parent, wxID_ANY, "LCD (HD44780)")
1.1 root 234: {
1.1.1.5 root 235: // +------------+
236: // | TextScreen |
237: // +------------+
238: // | CharPanel |
239: // +------------+
240:
241: // 上段、テキストスクリーン
1.1.1.6 root 242: monpanel = new WXMonitorPanel(this, gMonitorManager->Get(ID_MONITOR_LCD));
1.1.1.5 root 243: // 下辺は CharPanel の上余白が隣接しているため、自分のほうは付けない。
244: monpanel->SetPadding(-1, -1, -1, 0);
1.1 root 245:
1.1.1.5 root 246: // 下段、キャラクタパネル
1.1 root 247: chrpanel = new WXLCDCharPanel(this);
248:
1.1.1.10! root 249: // 空き地用。
! 250: space = new WXBitmapPanel(this);
1.1 root 251:
1.1.1.10! root 252: SetAutoLayout(true);
! 253: FontChanged();
1.1 root 254: }
255:
256: // デストラクタ
257: WXLCDMonitor::~WXLCDMonitor()
258: {
259: }
1.1.1.10! root 260:
! 261: void
! 262: WXLCDMonitor::FontChanged()
! 263: {
! 264: monpanel->FontChanged();
! 265: chrpanel->FontChanged();
! 266:
! 267: const wxSize& monsize = monpanel->GetSize();
! 268: const wxSize& chrsize = chrpanel->GetSize();
! 269: wxSize size(std::max(monsize.x, chrsize.x), monsize.y + chrsize.y);
! 270: SetClientSize(size);
! 271: }
! 272:
! 273: bool
! 274: WXLCDMonitor::Layout()
! 275: {
! 276: // inherited::Layout() は(実質何もしないので)、呼ばずに自力で行う。
! 277:
! 278: wxSize client = GetClientSize();
! 279: const wxSize& monsize = monpanel->GetSize();
! 280: const wxSize& chrsize = chrpanel->GetSize();
! 281:
! 282: // コントロールを配置。
! 283: monpanel->SetSize(0, 0, monsize.x, monsize.y);
! 284: chrpanel->SetSize(0, monsize.y, chrsize.x, chrsize.y);
! 285:
! 286: // monpanel と chrpanel はフォントサイズによる拡大倍率が違うため
! 287: // フォントサイズを変更した時に相似にならず、現状では必ずどちらかが
! 288: // 大きい (がどちらかは固定されない) という状態になる。
! 289: // そこで小さい方のコントロールの右に空き地が出来てしまう。そのままだと
! 290: // GTK3 のウィンドウ下地色が見えてしまうため、BGPANEL 色のパネルを敷く。
! 291:
! 292: if (monsize.x < chrsize.x) {
! 293: // 上が小さいので、右上に空き地を置く。
! 294: space->SetSize(monsize.x, 0, client.x - monsize.x, monsize.y);
! 295: } else {
! 296: // 下が小さいので、左下に空き地を置く。
! 297: space->SetSize(chrsize.x, monsize.y, client.x - chrsize.x, chrsize.y);
! 298: }
! 299:
! 300: return true;
! 301: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.