[c++] 'CreatePixmap' mehrmals vorhanden

  • Mal wieder eine Frage von einem unwissenden…


    Bei dem skin flatPlus ist mir im Quellcode aufgefallen, dass CreatePixmap dreim al vorhanden ist und mit dem selben Code gefüllt ist. In baserender .h unter public: und die anderen beiden .h unter private:

    Ich frage mich nun nach dem Sinn des ganzen. Wäre es nicht einfacher das nur in einer .h zu haben?


    Wer kennt sich da aus. Wie kompliziert wäre das?

  • Sind aber doch drei verschiedene Rückgabewerte, oder?

    MyVDR: yaVDR-Ansible (Ubuntu 20) - softhddevice-openglosd (ffmpeg 2.8) - epgd/epg2vdr - skindesigner estuary4vdr (adaptiert) - 1920x1080@50 Hz | kodi 18 - inputstream + amazon vod
    Aerocube M40 | 300W | ASRock H61M-GE | Intel G530 | Asus ENGT520 | 2 x TT-budget S2-3200 | ASRock Smart Remote (CIR) | 4 GB RAM | 120 GB SSD | 3 TB HDD

  • Sind alle gleich. Am Ende:

    Code
    return osd->CreatePixmap(Layer, ViewPort, SafeDrawPort);
  • Ahhh sorry!

    Das waren die Klassennamen, nicht die Rückgabetypen 🙈


    Wenn die Implementierungen wirklich exakt gleich sind, müsste man das in eine eigene Klasse auslagern können und die drei bisherigen Aufrufstellen rufen dann alle die neue Methode.


    Viel Erfolg!

    MyVDR: yaVDR-Ansible (Ubuntu 20) - softhddevice-openglosd (ffmpeg 2.8) - epgd/epg2vdr - skindesigner estuary4vdr (adaptiert) - 1920x1080@50 Hz | kodi 18 - inputstream + amazon vod
    Aerocube M40 | 300W | ASRock H61M-GE | Intel G530 | Asus ENGT520 | 2 x TT-budget S2-3200 | ASRock Smart Remote (CIR) | 4 GB RAM | 120 GB SSD | 3 TB HDD

  • Hab alle ausse in baserender auskommentiert. Klappt natürlich nicht:

  • Ich sehe keinen dringenden Grund, das zu machen. M.E. würde es das ganze komplizieren und ist den Aufwand nicht wert.


    Wenn sich die Klassen cComplexContent, cFlatBaseRender und cTextScroll von einer gemeinsamen Klasse ableiten würden, könntest du das einfach da einbauen, aber das sind eigenständige Klassen.


    Ansonsten könntest du eine neue Klasse für die pixmap erstellen, darin die Methode ::CreatePixmap einbauen und von den anderen aufrufen lassen.

    Die Notwendigkeit darin sehe ich aber nicht. Ganz sauber sind doppelte Codeabschnitte aber natürlich auch nicht.


    Gruß

    Andreas

  • Gut, dann werde ich das wohl so lassen. Ist nur blöd bei Änderungen; die muss man dann drei mal machen

  • Ist nur blöd bei Änderungen; die muss man dann drei mal machen

    Ich bin da auch immer bestrebt, redundanten Code zu beseitigen. In Deinem Fall bedeutet das aber, man muss sich richtig gut überlegen, wie man das macht. Durch die Vererbung ist das nicht ganz trivial.

    Möglich wäre z.B. so eine Lösung, wie bei skinnopacity. Da ist diese Funktion in eine helpers Datei ausgelagert. Das bedeutet aber auch, man muss diese Funktion etwas anpassen und auch den Aufruf in allen Dateien wo sie vorkommt, und das sind fast alle.

    So wie ich das gesehen habe, gibt es in skinflatplus auch noch mehr redundanten Code. Wenn man das angehen will, sollte man sich insgesamt mal überlegen, ob da grundsätzlich eine Überarbeitung sinnvoll wäre.


    Grüße

    kamel5

    VDR 2.6.6: ASUS Prime X470-PRO, Ryzen 7 5700X, 64GB, 6TB HD, GT1030, Fedora 39 Kernel 6.8 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

    Einmal editiert, zuletzt von kamel5 ()

  • Das ist auch meine Intention. Aber ich bekomme das leider nicht so ohne weiteres hin. Ich dachte eigentlich dass die baserender.c mehr oider weniger der helpers in skinnopacity entspricht. Da ist das CreatPixmap ja auch implementiert, bis auf die zwei Parameter OSD und Name. Wenn ich die nicht verwende, müsste doch eigentlich alles passen? Die zwei Parameter nachzurüsten wäre aber auch nicht das Problem. Die vorkommen kann man ja suchen...


    Ich würde auch gerne eine tools.[ch] erstellen um da einige Sachen auszulagern. Oder in die baserender. Das raucht mir schon die Birne. Ich schaue mir auch die Quellen von sjinnopacity usw. an für Anregungen. Aber mit dem ganzen C-Zeug stehe ich irgendwie auf Kriegsfuß

  • Ich dachte eigentlich dass die baserender.c mehr oider weniger der helpers in skinnopacity entspricht.

    Das kann man nicht 1:1 vergleichen, ist aber auch nicht weiter schlimm.

    Ich würde auch gerne eine tools.[ch] erstellen um da einige Sachen auszulagern.

    Im Prinzip kannst Du dafür auch die flat.[c,h] benutzen. da gibt es bereits am Ende "zentrale" Funktionen und sie ist schon überall inkludiert.

    Aber mit dem ganzen C-Zeug stehe ich irgendwie auf Kriegsfuß

    Aller Anfang ist schwer. :) Ich habe da auch vor einiger Zeit bei 0 angefangen.


    Ich würde die Funktion CreatePixmap ohne Klasse erweitert um den Parameter "osd" in der flat.[c,h] Datei am Ende unterbringen. Den Parameter Name brauchst Du nicht, den habe ich nur fürs Debugging drin.

    Dann würde ich die Funktion CreatePixmap in den anderen Dateien, es sind baserender.[c,h], complexcontent.[c,h] und textscroller.[c,h] entfernen. Und dann noch in allen Dateien wo CreatePixmap benutzt wird, den Parameter "osd" nachtragen. Ist halt Fleißarbeit. Und wenn man was vergessen hat, meckert der Compiler schon rum.


    Grüße

    kamel5

    VDR 2.6.6: ASUS Prime X470-PRO, Ryzen 7 5700X, 64GB, 6TB HD, GT1030, Fedora 39 Kernel 6.8 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

  • Vielen Dank für die Tipps. Werde ich gleich mal testen ;)

  • Schade:

    Da muss ich wohl auch ohne Klasse in die flat auslagern...


  • Pixmap = CreatePixmap(osd, 1, Position, PositionDraw);

    ^~~ | Osd

    Es steht ja im Prinzip da. In der Datei textscroller.c musst Du Osd anstelle von osd benutzen. Das muss immer zu dem passen, was in der entsprechenden Datei benutzt wird.


    Grüße

    kamel5

    VDR 2.6.6: ASUS Prime X470-PRO, Ryzen 7 5700X, 64GB, 6TB HD, GT1030, Fedora 39 Kernel 6.8 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

  • Hab noch ne Weile getestet und gebaut. Scheint zu laufen! Zumindest in meiner Virtualbox.

    Ich denke ich werde das noch ein wenig bereinigen (Habe alten Code nur auskommentiert) und ins git stellen. Vielen Dank für die Unterstützung!


    Kommen bestimmt noch mehr Fragen von mir wenn ich wieder Zeit zum Basteln habe


    :portal3

  • Noch was, das ich nicht verstehe:

    Die meisten Pixmaps werden mit CreatePixmap() erzeugt. Aber in displaymenu.c gibt es einige aufrufe von

    osd->CreatePixmap


    Das müsste doch einfach durch CreatePixmap zu ersetzen sein? (Natürlich mit dem zusätzlichen Parameter osd)


    Beispiel:

    menuPixmap = osd->CreatePixmap(1, cRect(0, menuTop, menuWidth, scrollBarHeight));

    zu

    menuPixmap = CreatePixmap(osd, 1, cRect(0, menuTop, menuWidth, scrollBarHeight));



  • Beides ist legitim und kann benutzt werden. CreatePixmap() hat hier gegenüber "osd->CreatePixmap" den Vorteil, das da noch Prüfungen eingebaut sind.

    Und ja, Du kannst das im Prinzip ersetzen. Also ausprobieren.


    Grüße

    kamel5

    VDR 2.6.6: ASUS Prime X470-PRO, Ryzen 7 5700X, 64GB, 6TB HD, GT1030, Fedora 39 Kernel 6.8 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

  • Danke, genau das dachte ich mir auch schon. Teste es dann ab Donnerstag wenn wieder Zeit ist

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!