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

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: }

unix.superglobalmegacorp.com

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