Annotation of nono/wx/wxvideomonitor.cpp, revision 1.1.1.1

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2019 [email protected]
                      4: //
                      5: 
                      6: #include "wxheader.h"
                      7: #include "wxvideomonitor.h"
                      8: #include "bitmap.h"
                      9: 
                     10: //
                     11: // LUNA ビットマップパネル
                     12: //
                     13: 
                     14: // イベントテーブル
                     15: wxBEGIN_EVENT_TABLE(WXLunaBitmapPanel, inherited)
                     16:        EVT_PAINT(WXLunaBitmapPanel::OnPaint)
                     17:        EVT_SIZE(WXLunaBitmapPanel::OnSize)
                     18:        EVT_SCROLLWIN(WXLunaBitmapPanel::OnScrollWin)
                     19: wxEND_EVENT_TABLE()
                     20: 
                     21: // コンストラクタ
                     22: WXLunaBitmapPanel::WXLunaBitmapPanel(wxWindow *parent)
                     23:        : inherited(parent, wxID_ANY, wxDefaultPosition,
                     24:                wxSize(512, 384))       // 初期値は適当
                     25: {
                     26:        src = gBitmap->GetBuf();
                     27: 
                     28:        // 仮想キャンバスサイズを設定
                     29:        SetVirtualSize(virtual_width, virtual_height);
                     30:        // スクロールバーを設定
                     31:        SetScrollRate(width_per_unit, height_per_unit);
                     32:        SetScrollbars(width_per_unit, height_per_unit,
                     33:                virtual_width / width_per_unit,
                     34:                virtual_height / height_per_unit);
                     35: }
                     36: 
                     37: // デストラクタ
                     38: WXLunaBitmapPanel::~WXLunaBitmapPanel()
                     39: {
                     40:        if (bmpbuf) {
                     41:                delete bmpbuf;
                     42:        }
                     43: }
                     44: 
                     45: // サイズ変更イベント
                     46: void
                     47: WXLunaBitmapPanel::OnSize(wxSizeEvent& event)
                     48: {
                     49:        // Mac ではウィンドウ作成時に 0 以下の値が来ることがある
                     50:        // GTK では 1 で来ることがある
                     51:        wxSize size = event.GetSize();
                     52:        if (size.x <= 1 || size.y <= 1) {
                     53:                return;
                     54:        }
                     55: 
                     56:        view_width = size.x;
                     57:        view_height = size.y;
                     58: 
                     59:        // BMP バッファを持っていれば一旦解放
                     60:        if (bmpbuf) {
                     61:                delete bmpbuf;
                     62:                bmpbuf = NULL;
                     63:        }
                     64: 
                     65:        // BMP バッファ作成
                     66:        // 正しく描かれなかった時に分かりやすいよう初期値は濃いグレーにしておく
                     67:        bmpbuf = new uint8 [view_width * view_height * 3];
                     68:        memset(bmpbuf, 0x70, view_width * view_height * 3);
                     69: }
                     70: 
                     71: // スクロールイベント
                     72: void
                     73: WXLunaBitmapPanel::OnScrollWin(wxScrollWinEvent& event)
                     74: {
                     75:        int orient = event.GetOrientation();
                     76:        int pos = event.GetPosition();
                     77: 
                     78:        if (orient == wxHORIZONTAL) {
                     79:                view_x = pos * width_per_unit;
                     80:        } else {
                     81:                view_y = pos * height_per_unit;
                     82:        }
                     83: }
                     84: 
                     85: // XXX 実際にはこの辺かどこかで更新チェックをしないといけない。
                     86: // 今は毎回全描画しているので画面サイズが大きくなると重くなる。
                     87: 
                     88: // 描画イベント (UI スレッドから呼ばれる)
                     89: void
                     90: WXLunaBitmapPanel::OnPaint(wxPaintEvent& event)
                     91: {
                     92:        // 更新があれば、ここで裏バッファに描画
                     93:        Draw();
                     94:        // バッファから wxBitmap を作成
                     95:        wxImage image(view_width, view_height, bmpbuf, true);
                     96:        wxBitmap bitmap(image);
                     97: 
                     98:        // 実画面 DC にコピー
                     99:        wxPaintDC dstDC(this);
                    100:        dstDC.DrawBitmap(bitmap, 0, 0);
                    101: }
                    102: 
                    103: // ビットマッププレーンの内容をパネルのバックグラウンドバッファに描画する
                    104: void
                    105: WXLunaBitmapPanel::Draw()
                    106: {
                    107:        int width = std::min(2048, view_width);
                    108:        int height = std::min(1024, view_height);
                    109:        // X 方向は32bit(ロングワード)単位で処理
                    110:        int x_offset = view_x / width_per_unit;
                    111: 
                    112:        for (int y = 0; y < height; y++) {
                    113:                const uint32 *s = (uint32 *)&src[(view_y + y) * 256];
                    114:                uint8 *d = &bmpbuf[y * (width * 3)];
                    115: 
                    116:                // dst を1ラインクリアしてから..
                    117:                memset(d, 0, width * 3);
                    118:                // ON になってるドットだけ打っていく
                    119:                for (int x = 0; x < width / 32; x++) {
                    120:                        uint32 srcdata = s[x_offset + x];
                    121:                        for (int i = 0; srcdata != 0; srcdata <<= 1, i++) {
                    122:                                uint8 dst;
                    123:                                if ((int32)srcdata < 0) {
                    124:                                        dst = 0xff;
                    125:                                } else {
                    126:                                        dst = 0;
                    127:                                }
                    128:                                d[(x * 32 + i) * 3 + 0] = dst;
                    129:                                d[(x * 32 + i) * 3 + 1] = dst;
                    130:                                d[(x * 32 + i) * 3 + 2] = dst;
                    131:                        }
                    132:                }
                    133:        }
                    134: }
                    135: 
                    136: //
                    137: // LUNA ビットマップウィンドウ
                    138: //
                    139: 
                    140: // イベントテーブル
                    141: wxBEGIN_EVENT_TABLE(WXLunaBitmapWindow, inherited)
                    142:        EVT_TIMER(wxID_ANY, WXLunaBitmapWindow::OnTimer)
                    143: wxEND_EVENT_TABLE()
                    144: 
                    145: // コンストラクタ
                    146: WXLunaBitmapWindow::WXLunaBitmapWindow(wxWindow *parent, wxWindowID id,
                    147:        const wxString& name)
                    148:        : inherited(parent, id, name,
                    149:                inherited::DEFAULT_STYLE | wxRESIZE_BORDER)
                    150: {
                    151:        panel = new WXLunaBitmapPanel(this);
                    152: 
                    153:        // 大きさをそれに固定
                    154:        Layout();
                    155:        Fit();
                    156: 
                    157:        // 更新タイマーは適当な短さにしておく
                    158:        timer.SetOwner(this);
                    159:        timer.Start(10);
                    160: }
                    161: 
                    162: // デストラクタ
                    163: WXLunaBitmapWindow::~WXLunaBitmapWindow()
                    164: {
                    165: }
                    166: 
                    167: // タイマーイベント
                    168: void
                    169: WXLunaBitmapWindow::OnTimer(wxTimerEvent& event)
                    170: {
                    171:        // モニタースクリーンを更新して、更新があれば画面を再描画
                    172:        panel->Refresh();
                    173: }

unix.superglobalmegacorp.com

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