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

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"
                     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.7 ! root       38:        u_width  = 5 * 16 + 17;
        !            39:        u_height = 8 * 2 + 3;
        !            40: 
        !            41:        lcd = GetLCDDevice();
        !            42:        ddram = lcd->GetDDRAM();
1.1       root       43: 
1.1.1.4   root       44:        // VM からの通知を受け取る
                     45:        WXUIMessage::Connect(UIMessage::LCD, this,
                     46:                wxCommandEventHandler(WXLCDPanel::OnLCDChanged));
1.1.1.5   root       47: 
1.1.1.7 ! root       48:        FontChanged();
1.1.1.5   root       49:        SetBitmapBGColor(UD_CREAM);
1.1.1.7 ! root       50:        Fill();
1.1       root       51: }
                     52: 
                     53: // デストラクタ
                     54: WXLCDPanel::~WXLCDPanel()
                     55: {
1.1.1.7 ! root       56:        WXUIMessage::Disconnect(UIMessage::LCD, this,
1.1.1.4   root       57:                wxCommandEventHandler(WXLCDPanel::OnLCDChanged));
1.1       root       58: }
                     59: 
1.1.1.7 ! root       60: // フォントサイズ変更通知
        !            61: void
        !            62: WXLCDPanel::FontChanged()
        !            63: {
        !            64:        inherited::FontChanged();
        !            65: 
        !            66:        // このパネル内の描画の基本単位。
        !            67:        // 12, 16, 24 を 2, 3, 4 にする。
        !            68:        unit = (font_height + 5) / 6;
        !            69: 
        !            70:        // コントロールの大きさを変更
        !            71:        wxSize size(u_width * unit, u_height * unit);
        !            72:        SetClientSize(size);
        !            73:        SetMinClientSize(size);
        !            74: }
        !            75: 
1.1.1.4   root       76: // LCD 状態変更イベント (UIMessage)
1.1       root       77: void
1.1.1.4   root       78: WXLCDPanel::OnLCDChanged(wxCommandEvent& event)
1.1       root       79: {
1.1.1.4   root       80:        Refresh();
1.1       root       81: }
                     82: 
                     83: // バックグラウンドバッファに描画
                     84: void
1.1.1.5   root       85: WXLCDPanel::Draw()
1.1       root       86: {
                     87:        for (int y = 0; y < 2; y++) {
                     88:                for (int x = 0; x < 16; x++) {
                     89:                        uint8 ch = ddram[0x40 * y + x];
1.1.1.5   root       90:                        DrawChar(x, y, ch);
1.1       root       91:                }
                     92:        }
                     93: }
                     94: 
                     95: // 1文字描画
                     96: void
1.1.1.5   root       97: WXLCDPanel::DrawChar(int x, int y, uint8 ch)
1.1       root       98: {
1.1.1.5   root       99:        const Color pal[2] = { UD_YELLOW_GREEN, UD_BROWN };
1.1       root      100:        const uint8 *font;
                    101: 
1.1.1.7 ! root      102:        font = lcd->GetFont(ch);
1.1.1.5   root      103:        BitmapI1 src(font, 5, 8);
1.1       root      104: 
1.1.1.7 ! root      105:        bitmap.DrawScaleUp((1 + x * 6) * unit, (1 + y * 9) * unit, unit, src, pal);
1.1       root      106: }
                    107: 
1.1.1.5   root      108: 
1.1       root      109: //
1.1.1.7 ! root      110: // LUNA 前面 LCD ウィンドウ
1.1       root      111: //
                    112: 
                    113: // コンストラクタ
1.1.1.3   root      114: WXLCDWindow::WXLCDWindow(wxWindow *parent)
                    115:        : inherited(parent, wxID_ANY, _("Front LCD"))
1.1       root      116: {
                    117:        panel = new WXLCDPanel(this);
                    118: 
1.1.1.5   root      119:        DoSize();
1.1       root      120: }
                    121: 
                    122: // デストラクタ
                    123: WXLCDWindow::~WXLCDWindow()
                    124: {
                    125: }
                    126: 
1.1.1.5   root      127: 
1.1       root      128: //
1.1.1.7 ! root      129: // モニタの LCD キャラクタ部パネル
1.1       root      130: //
                    131: 
1.1.1.7 ! root      132: // BitmapPanel の継承で十分だが FontChanged() に連動させるため、
        !           133: // TextPanel からの継承としている。
        !           134: //
        !           135: // 全体図。横16文字 + 横16文字の2段組。
        !           136: // □ は1キャラクタ分。5x8ピクセル。
        !           137: // _  は1ピクセル分のアキ。
        !           138: //
        !           139: //                                                   余白
        !           140: //     +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +f  +0 +1    +f
        !           141: // 横 _□_□_□_□_□_□_□_□_□_□_□_□_□_□_□_□□□_□ … □_
        !           142: //
        !           143: //     00 10 20 30 40 50 60 70
        !           144: // 縦 _□_□_□_□_□_□_□_□_
1.1       root      145: 
                    146: // コンストラクタ
                    147: WXLCDCharPanel::WXLCDCharPanel(wxWindow *parent)
1.1.1.7 ! root      148:        : inherited(parent)
1.1       root      149: {
1.1.1.7 ! root      150:        lcd = GetLCDDevice();
        !           151: 
        !           152:        u_width  = 5 * 33 + 32; // 横 5px * (32+1)文字、余白が計 32
        !           153:        u_height = 8 * 8 + 9;   // 縦 8px * 8行、余白が計 9
        !           154: 
        !           155:        FontChanged();
1.1       root      156: }
                    157: 
                    158: // デストラクタ
                    159: WXLCDCharPanel::~WXLCDCharPanel()
                    160: {
                    161: }
                    162: 
1.1.1.7 ! root      163: // フォントサイズ変更通知
        !           164: void
        !           165: WXLCDCharPanel::FontChanged()
        !           166: {
        !           167:        inherited::FontChanged();
        !           168: 
        !           169:        // このパネル内の描画の基本単位。
        !           170:        // 12, 16, 24 を 2, 3, 4 にする。
        !           171:        unit = (font_height + 5) / 6;
        !           172: 
        !           173:        // コントロールの大きさを変更
        !           174:        wxSize size(u_width * unit, u_height * unit);
        !           175:        SetClientSize(size);
        !           176:        SetMinClientSize(size);
        !           177: }
        !           178: 
1.1       root      179: // バックグラウンドバッファに描画
                    180: void
1.1.1.5   root      181: WXLCDCharPanel::Draw()
1.1       root      182: {
1.1.1.5   root      183:        const Color pal[2] = { UD_WHITE, UD_BLACK };
1.1       root      184: 
                    185:        // フォントは 5x8 (最下行はカーソル用に空けてあるので実際は 5x7)。
                    186:        // 実際には 0xe0 以降には 5x10 フォントが混在しているのだが、その
                    187:        // モードはサポートしていないので今の所全部 5x8 としてある。
                    188: 
1.1.1.2   root      189:        // cx, cy はこの文字の左上座標 (スケール前)
1.1.1.7 ! root      190:        int cx = 1;
        !           191:        int cy = 1;
1.1.1.2   root      192:        for (int ch = 0; ch < 256; ch++) {
1.1.1.7 ! root      193:                const uint8 *font = lcd->GetFont(ch);
1.1.1.5   root      194:                BitmapI1 src(font, 5, 8);
1.1.1.7 ! root      195:                bitmap.DrawScaleUp(cx * unit, cy * unit, unit, src, pal);
1.1.1.2   root      196: 
                    197:                cx += 6;
                    198:                if (ch % 16 == 15) {
                    199:                        if (ch == 127) {
1.1.1.7 ! root      200:                                // 0x80 以降は右側に作る。
        !           201:                                // 余白も含めた 6px ずつ加算してきたが中間のアキは計 5px
        !           202:                                // なので、過剰分の 1 引く必要がある。
        !           203:                                cx += 5 - 1;
1.1.1.2   root      204:                                cy = 1;
1.1.1.7 ! root      205:                        } else {
        !           206:                                // 行折り返し
        !           207:                                cx -= 6 * 16;
        !           208:                                cy += 9;
1.1.1.2   root      209:                        }
                    210:                }
1.1       root      211:        }
                    212: }
                    213: 
1.1.1.5   root      214: 
1.1       root      215: //
                    216: // LCD モニタウィンドウ
                    217: //
                    218: 
                    219: // コンストラクタ
1.1.1.3   root      220: WXLCDMonitor::WXLCDMonitor(wxWindow *parent)
1.1.1.7 ! root      221:        : inherited(parent, wxID_ANY, "LCD (HD44780)")
1.1       root      222: {
1.1.1.5   root      223:        // +------------+
                    224:        // | TextScreen |
                    225:        // +------------+
                    226:        // | CharPanel  |
                    227:        // +------------+
                    228:        auto *topsizer = new wxBoxSizer(wxVERTICAL);
                    229: 
                    230:        // 上段、テキストスクリーン
1.1.1.6   root      231:        monpanel = new WXMonitorPanel(this, gMonitorManager->Get(ID_MONITOR_LCD));
1.1.1.5   root      232:        // 下辺は CharPanel の上余白が隣接しているため、自分のほうは付けない。
                    233:        monpanel->SetPadding(-1, -1, -1, 0);
                    234:        topsizer->Add(monpanel, 0, wxEXPAND);
1.1       root      235: 
1.1.1.5   root      236:        // 下段、キャラクタパネル
1.1       root      237:        chrpanel = new WXLCDCharPanel(this);
1.1.1.5   root      238:        topsizer->Add(chrpanel, 0, wxEXPAND);
1.1       root      239: 
                    240:        SetSizer(topsizer);
                    241: 
                    242:        // 大きさをそれに固定
1.1.1.5   root      243:        SetClientSize(GetSizer()->GetMinSize());
1.1       root      244: }
                    245: 
                    246: // デストラクタ
                    247: WXLCDMonitor::~WXLCDMonitor()
                    248: {
                    249: }

unix.superglobalmegacorp.com

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