Das Ganze ist mir wieder ein Rätsel und ich komme nicht weiter.
Ich habe ein OSD, welches ich cOsdProvider::NewOsd erstelle, mir eine Pixmap erzeuge, diese fülle und dann das OSD darstelle.
Das funktioniert auch soweit ganz gut, aber wenn ich das OSD schliesse, dann bekomme ich es kein zweites Mal auf. Mit einer Flut von Debug-Ausgaben kann ich sehen, daß dieselben Methoden durchlaufen werden. NewOsd, Pixmap füllen und so weiter. Aber es wird einfach nichts mehr dargestellt. Navigiere ich blind durch das nicht-dargestellte OSD, dann werden auch die entsprechenden Aktionen durchgeführt, aber es ist eben nicht sichtbar.
Ich habe mir in verschiedenen Plugins (u.a. dem osddemo) soweit alles mal angeschaut, was ich evt. vergessen haben könnte, aber ich finde nichts oder ich übersehe das Offensichtliche.
Der Code sieht (alles rausgeworfen, was intern gebraucht wird und erstmal nichts mit dem OSD zu tun hat) so aus:
OsdTest::OsdTest() {
osd = nullptr;
pixmap = nullptr;
}
OsdTest::~OsdTest() {
delete osd;
osd = nullptr;
pixmap = nullptr;
}
void OsdTest::Show() {
osd = cOsdProvider::NewOsd(0, 0);
int mw, mh;
double ph;
cDevice::PrimaryDevice()->GetOsdSize(mw, mh, ph);
tArea Area = {0, 0, mw - 1, mh - 1, 32};
osd->SetAreas(&Area, 1);
cRect rect(0, 0, mw, mh);
pixmap = osd->CreatePixmap(0, rect, rect);
}
eOSState OsdTest::ProcessKey(eKeys Key) {
eOSState state = cOsdObject::ProcessKey(Key);
if (state == osUnknown) {
if (Key == kBack) {
return osEnd;
}
}
return state;
}
void OsdTest::readOsdUpdate() {
cSize recImageSize(osdUpdate->width, osdUpdate->height);
cPoint recPoint(0, 0);
const cImage recImage(recImageSize);
auto *data2 = const_cast<tColor *>(recImage.Data());
// fill data2 with useful data
pixmap->DrawImage(recPoint, recImage);
osd->Flush();
}
Alles anzeigen
Ob mit oder OpenGLOSD macht keinen Unterschied. Die "normalen" VDR Menus funktionieren auch problemlos, aber mein OSD eben nur genau einmal.
Schliesse ich das nicht-sichbare OSD mit Back/Exit, dann wird auch der Destruktor aufgerufen. Also eigentlich scheint das Objekt da zu sein.
edit: Die Quelltextformatierung korrigiert.
Füge ich in Show() folgendes ein:
dann sehe ich sowohl beim ersten Aufruf, als auch bei allen nächsten genau die Grauschattierung. Also wird das OSD dargestellt, nur die Pixmap nicht.
Ich muss mal weiter experimentieren. Laut Doku muss man die Pixmap nicht löschen, aber ich meine, das hätte ich auch schon versucht.