--- nono/wx/wxlcdwindow.cpp 2026/04/29 17:05:12 1.1.1.6 +++ nono/wx/wxlcdwindow.cpp 2026/04/29 17:05:31 1.1.1.9 @@ -5,44 +5,75 @@ // // -// LUNA LCD パネル +// LUNA LCD パネル、モニタ // #include "wxlcdwindow.h" #include "wxcolor.h" #include "wxuimessage.h" #include "lcd.h" +#include "monitor.h" -// パネルの大きさ (定数) -// N はとりあえずの倍率。 -#define N (2) -#define PANEL_WIDTH ((N) * (5 + 1) * 16 + 1) -#define PANEL_HEIGHT ((N) * (8 + 1) * 2 + 1) +// +// LUNA 前面 LCD パネル +// +// BitmapPanel の継承で十分だが FontChanged() に連動させるため、 +// TextPanel からの継承としている。 +// +// 全体図。横16文字 x 縦2行 +// □ は1キャラクタ分。5x8ピクセル。 +// _ は1ピクセル分のアキ。 // -// LUNA LCD パネル +// +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +f +// 横 _□_□_□_□_□_□_□_□_□_□_□_□_□_□_□_□_ +// _□_□_□_□_□_□_□_□_□_□_□_□_□_□_□_□_ // +// 1 2 +// 縦 _□_□_ // コンストラクタ WXLCDPanel::WXLCDPanel(wxWindow *parent) - : inherited(parent, wxSize(PANEL_WIDTH, PANEL_HEIGHT)) + : inherited(parent) { - ddram = gLCD->GetDDRAM(); + u_width = 5 * 16 + 17; + u_height = 8 * 2 + 3; + + lcd = GetLCDDevice(); + ddram = lcd->GetDDRAM(); // VM からの通知を受け取る WXUIMessage::Connect(UIMessage::LCD, this, wxCommandEventHandler(WXLCDPanel::OnLCDChanged)); + FontChanged(); SetBitmapBGColor(UD_CREAM); + Fill(); } // デストラクタ WXLCDPanel::~WXLCDPanel() { - WXUIMessage::Disconnect(UIMessage::LCD, + WXUIMessage::Disconnect(UIMessage::LCD, this, wxCommandEventHandler(WXLCDPanel::OnLCDChanged)); } +// フォントサイズ変更通知 +void +WXLCDPanel::FontChanged() +{ + inherited::FontChanged(); + + // このパネル内の描画の基本単位。 + // 12, 16, 24 を 2, 3, 4 にする。 + unit = (font_height + 5) / 6; + + // コントロールの大きさを変更 + wxSize size(u_width * unit, u_height * unit); + SetClientSize(size); + SetMinClientSize(size); +} + // LCD 状態変更イベント (UIMessage) void WXLCDPanel::OnLCDChanged(wxCommandEvent& event) @@ -69,15 +100,17 @@ WXLCDPanel::DrawChar(int x, int y, uint8 const Color pal[2] = { UD_YELLOW_GREEN, UD_BROWN }; const uint8 *font; - font = gLCD->GetFont(ch); + font = lcd->GetFont(ch); BitmapI1 src(font, 5, 8); - bitmap.DrawScaleUp((1 + x * 6) * N, (1 + y * 9) * N, N, src, pal); + int dx = (1 + x * 6) * unit; + int dy = (1 + y * 9) * unit; + bitmap.DrawBitmapI1Scale(dx, dy, src, pal, unit); } // -// LCD ウィンドウ +// LUNA 前面 LCD ウィンドウ // // コンストラクタ @@ -96,17 +129,33 @@ WXLCDWindow::~WXLCDWindow() // -// LCD キャラクタパネル +// モニタの LCD キャラクタ部パネル // -#define PAD (1) -#define CP_WIDTH (N * (PAD + 6 * (16 + 1 + 16) + PAD)) -#define CP_HEIGHT (N * (PAD + 9 * 8 + PAD)) +// BitmapPanel の継承で十分だが FontChanged() に連動させるため、 +// TextPanel からの継承としている。 +// +// 全体図。横16文字 + 横16文字の2段組。 +// □ は1キャラクタ分。5x8ピクセル。 +// _ は1ピクセル分のアキ。 +// +// 余白 +// +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +f +0 +1 +f +// 横 _□_□_□_□_□_□_□_□_□_□_□_□_□_□_□_□□□_□ … □_ +// +// 00 10 20 30 40 50 60 70 +// 縦 _□_□_□_□_□_□_□_□_ // コンストラクタ WXLCDCharPanel::WXLCDCharPanel(wxWindow *parent) - : inherited(parent, wxSize(CP_WIDTH, CP_HEIGHT)) + : inherited(parent) { + lcd = GetLCDDevice(); + + u_width = 5 * 33 + 32; // 横 5px * (32+1)文字、余白が計 32 + u_height = 8 * 8 + 9; // 縦 8px * 8行、余白が計 9 + + FontChanged(); } // デストラクタ @@ -114,6 +163,22 @@ WXLCDCharPanel::~WXLCDCharPanel() { } +// フォントサイズ変更通知 +void +WXLCDCharPanel::FontChanged() +{ + inherited::FontChanged(); + + // このパネル内の描画の基本単位。 + // 12, 16, 24 を 2, 3, 4 にする。 + unit = (font_height + 5) / 6; + + // コントロールの大きさを変更 + wxSize size(u_width * unit, u_height * unit); + SetClientSize(size); + SetMinClientSize(size); +} + // バックグラウンドバッファに描画 void WXLCDCharPanel::Draw() @@ -125,22 +190,25 @@ WXLCDCharPanel::Draw() // モードはサポートしていないので今の所全部 5x8 としてある。 // cx, cy はこの文字の左上座標 (スケール前) - int cx = PAD; - int cy = PAD; + int cx = 1; + int cy = 1; for (int ch = 0; ch < 256; ch++) { - const uint8 *font = gLCD->GetFont(ch); + const uint8 *font = lcd->GetFont(ch); BitmapI1 src(font, 5, 8); - bitmap.DrawScaleUp(cx * N, cy * N, N, src, pal); + bitmap.DrawBitmapI1Scale(cx * unit, cy * unit, src, pal, unit); cx += 6; if (ch % 16 == 15) { - // 行折り返し - cx -= 6 * 16; - cy += 9; - // 0x80 以降は右側に作る if (ch == 127) { - cx += 6 * (16 + 1/*中央の余白*/); + // 0x80 以降は右側に作る。 + // 余白も含めた 6px ずつ加算してきたが中間のアキは計 5px + // なので、過剰分の 1 引く必要がある。 + cx += 5 - 1; cy = 1; + } else { + // 行折り返し + cx -= 6 * 16; + cy += 9; } } } @@ -153,7 +221,7 @@ WXLCDCharPanel::Draw() // コンストラクタ WXLCDMonitor::WXLCDMonitor(wxWindow *parent) - : inherited(parent, wxID_ANY, _("LCD")) + : inherited(parent, wxID_ANY, "LCD (HD44780)") { // +------------+ // | TextScreen |