--- nono/wx/wxvideomonitor.h 2026/04/29 17:04:28 1.1.1.1 +++ nono/wx/wxvideomonitor.h 2026/04/29 17:05:08 1.1.1.7 @@ -1,71 +1,103 @@ // // nono -// Copyright (C) 2019 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt +// + +// +// ビデオ系モニターウィンドウ // #pragma once -#include "object.h" #include "wxsubwindow.h" +#include "wxscrollbar.h" +#include + +class LunaRenderer; -// // LUNA ビットマップパネル -// -class WXLunaBitmapPanel : public wxScrolledWindow +class WXLunaBitmapPanel : public WXBitmapPanel { - typedef wxScrolledWindow inherited; + using inherited = WXBitmapPanel; public: WXLunaBitmapPanel(wxWindow *parent); - virtual ~WXLunaBitmapPanel(); + virtual ~WXLunaBitmapPanel() override; + + bool Layout() override; + + void EnablePlane(int plane, bool value); + void EnablePalette(bool value); private: void OnSize(wxSizeEvent& event); - void OnPaint(wxPaintEvent& event); - void OnScrollWin(wxScrollWinEvent& event); + void OnScroll(wxScrollEvent& event); + void OnTimer(wxTimerEvent& event); + void OnPaletteChanged(wxCommandEvent& event); + void Draw(); + void GenPalette(); + + LunaRenderer *renderer {}; + std::array pal {}; + uint32 planemask {}; + bool apply_palette {}; - const uint8 *src = NULL; // Bitmap デバイス内のバッファを指す - uint8 *bmpbuf = NULL; // 裏バッファ + Rect view {}; // ビュー矩形 - int view_x = 0; // ビューの表示開始 X 座標 - int view_y = 0; // ビューの表示開始 Y 座標 - int view_width = 0; // ビュー幅 - int view_height = 0; // ビュー高さ - - // 縦は1ドットずつ処理出来るので特筆することはない。 - // 横は少なくともバイト(8ドット)単位に制限したほうが実装が楽。 - // 今はロングワード単位で描画しているため 32ドット単位としている。 static const int virtual_width = 2048; // 仮想画面幅 [pixel] static const int virtual_height = 1024; // 仮想画面高さ [pixel] - static const int width_per_unit = 32; // 横スクロール単位 [pixel] - static const int height_per_unit = 1; // 縦スクロール単位 [pixel] - static_assert(virtual_width % width_per_unit == 0, ""); - static_assert(virtual_height % height_per_unit == 0, ""); + + WXScrollBar *vscroll {}; + WXScrollBar *hscroll {}; + + // タイマー + wxTimer timer {}; // イベントテーブル wxDECLARE_EVENT_TABLE(); }; -// // LUNA ビットマップウィンドウ -// class WXLunaBitmapWindow : public WXSubWindow { - typedef WXSubWindow inherited; + using inherited = WXSubWindow; + + public: + // コントロールパネルに表示するプレーン数 + static const int NPLANES = 4; + public: - WXLunaBitmapWindow(wxWindow *parent, wxWindowID id, const wxString& name); - virtual ~WXLunaBitmapWindow(); + WXLunaBitmapWindow(wxWindow *parent, const wxString& name); + virtual ~WXLunaBitmapWindow() override; + + void FontChanged() override; private: - // タイマーイベント - void OnTimer(wxTimerEvent& event); + void OnPlane(wxCommandEvent& event); + void DoPlane(int plane, bool value); + void OnApplyPalette(wxCommandEvent& event); + void DoApplyPalette(bool value); + + // コントロールパネル + std::array planesw {}; + wxCheckBox *applysw {}; // グラフィックパネル - WXLunaBitmapPanel *panel = NULL; - - // タイマー - wxTimer timer; + WXLunaBitmapPanel *viewpanel {}; // イベントテーブル wxDECLARE_EVENT_TABLE(); + + // 状態の二次記憶域。 + // サブウィンドウは今のところ開いてる時だけオブジェクトが存在している + // タイプだが、このウィンドウを閉じてまた開くとさっきの状態が継続して + // いてほしいので、ここでその状況を真似する。 + // ただしこっちはあくまで補助用で、コントロールの値のほうが一次情報。 + static std::array sticky_plane; + static bool sticky_apply; + + // sticky_used が false ならまだ一度も使われていない (次のコンストラクタ + // で初期化する)、true なら前回の値が入っている。 + static bool sticky_used; };