--- nono/wx/wxvideomonitor.cpp 2026/04/29 17:04:28 1.1 +++ nono/wx/wxvideomonitor.cpp 2026/04/29 17:04:56 1.1.1.5 @@ -1,11 +1,12 @@ // // nono -// Copyright (C) 2019 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // -#include "wxheader.h" #include "wxvideomonitor.h" -#include "bitmap.h" +#include "wxbitmapbuf.h" +#include "lunafb.h" // // LUNA ビットマップパネル @@ -23,7 +24,7 @@ WXLunaBitmapPanel::WXLunaBitmapPanel(wxW : inherited(parent, wxID_ANY, wxDefaultPosition, wxSize(512, 384)) // 初期値は適当 { - src = gBitmap->GetBuf(); + src = gLunafb->GetBuf(); // 仮想キャンバスサイズを設定 SetVirtualSize(virtual_width, virtual_height); @@ -37,9 +38,6 @@ WXLunaBitmapPanel::WXLunaBitmapPanel(wxW // デストラクタ WXLunaBitmapPanel::~WXLunaBitmapPanel() { - if (bmpbuf) { - delete bmpbuf; - } } // サイズ変更イベント @@ -48,7 +46,7 @@ WXLunaBitmapPanel::OnSize(wxSizeEvent& e { // Mac ではウィンドウ作成時に 0 以下の値が来ることがある // GTK では 1 で来ることがある - wxSize size = event.GetSize(); + const wxSize& size = event.GetSize(); if (size.x <= 1 || size.y <= 1) { return; } @@ -56,16 +54,13 @@ WXLunaBitmapPanel::OnSize(wxSizeEvent& e view_width = size.x; view_height = size.y; - // BMP バッファを持っていれば一旦解放 - if (bmpbuf) { - delete bmpbuf; - bmpbuf = NULL; - } - // BMP バッファ作成 - // 正しく描かれなかった時に分かりやすいよう初期値は濃いグレーにしておく - bmpbuf = new uint8 [view_width * view_height * 3]; - memset(bmpbuf, 0x70, view_width * view_height * 3); + bmpbuf.resize(view_width * view_height * 3); + // 正しく描かれなかった時に分かりやすいよう初期値は濃いグレーにしておく。 + // としたいところだが、このバッファはわりと大きくて更にリサイズする時は + // 連続して頻繁にリサイズが起きることになるので、この無駄な塗りつぶしは + // デバッグ目的以外では止めておく。 + //std::fill(bmpbuf.begin(), bmpbuf.end(), 0x70); } // スクロールイベント @@ -92,7 +87,7 @@ WXLunaBitmapPanel::OnPaint(wxPaintEvent& // 更新があれば、ここで裏バッファに描画 Draw(); // バッファから wxBitmap を作成 - wxImage image(view_width, view_height, bmpbuf, true); + wxImage image(view_width, view_height, &bmpbuf[0], true); wxBitmap bitmap(image); // 実画面 DC にコピー @@ -110,7 +105,7 @@ WXLunaBitmapPanel::Draw() int x_offset = view_x / width_per_unit; for (int y = 0; y < height; y++) { - const uint32 *s = (uint32 *)&src[(view_y + y) * 256]; + const uint32 *s = (const uint32 *)&src[(view_y + y) * 256]; uint8 *d = &bmpbuf[y * (width * 3)]; // dst を1ラインクリアしてから.. @@ -143,20 +138,18 @@ wxBEGIN_EVENT_TABLE(WXLunaBitmapWindow, wxEND_EVENT_TABLE() // コンストラクタ -WXLunaBitmapWindow::WXLunaBitmapWindow(wxWindow *parent, wxWindowID id, - const wxString& name) - : inherited(parent, id, name, +WXLunaBitmapWindow::WXLunaBitmapWindow(wxWindow *parent, const wxString& name) + : inherited(parent, wxID_ANY, name, inherited::DEFAULT_STYLE | wxRESIZE_BORDER) { panel = new WXLunaBitmapPanel(this); // 大きさをそれに固定 - Layout(); Fit(); - // 更新タイマーは適当な短さにしておく + // 更新タイマーはモニターパネル同様の 30Hz にしておく。 timer.SetOwner(this); - timer.Start(10); + timer.Start(33); } // デストラクタ