Annotation of nono/wx/wxlcdwindow.cpp, revision 1.1.1.11

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.