amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > SetRGB4CM() ohne Wirkung [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2018-11-20, 19:32 h

thyslo
Posts: 6
User
Hallo Amiga-Programmierer,

in einem Programm, das ab OS2.04 laufen soll, öffne ich einen Bildschirm. Einen Workbench clone, der aber mindestens 3 Bitplanes / 8 Farben haben soll:
C++ code:
m_pScreen = OpenScreenTags(NULL,
      SA_Width, pWbScreen->Width,
      SA_Height, pWbScreen->Height,
      SA_Depth, screenDepth, // min. 3; ansonsten den Wert der Workbench
      SA_Overscan, OSCAN_TEXT,
      SA_AutoScroll, TRUE,
      SA_Pens, (ULONG)pWbDrawInfo->dri_Pens,
      SA_Font, (ULONG) &m_TextAttr,
      SA_DisplayID, wbScreenModeId,
      SA_Title, m_Title.C_str(),
      TAG_DONE);

Nach dem Öffnen will ich die Pens 4 – 7 mit bestimmten Farben belegen:
C++ code:
pColorMap = m_pScreen ->ViewPort.ColorMap;
// Starting with color number 4 as 0..3 are system reserved
int colorNum = 4;

// Red for 'deleted'
m_RedPen = colorNum++;
SetRGB4CM(pColorMap, m_RedPen, 15, 11, 12);

// Yellow for 'changed'
m_YellowPen = colorNum++;
SetRGB4CM(pColorMap, m_YellowPen, 16, 16, 12);

// Green for 'added'
m_GreenPen = colorNum++;
SetRGB4CM(pColorMap, m_GreenPen, 12, 16, 12);

// Another grey for the background of the line numbers
m_GreyPen = colorNum++;
SetRGB4CM(pColorMap, m_GreyPen, 10, 10, 10);

Anschließend öffne ich ein Window auf dem Screen und schreibe einen Text mit IntuiText(). Dabei benutze ich einen der gesetzten Pens, z.B. für Rot m_RedPen = 4.
Leider wird der Text in einer anderen Farbe ausgegeben, einem kräftigen Blau, das ich gar nicht gesetzt habe.

Kann es sein, dass ich die Pens 4-7 evtl. gar nicht frei belegen darf?

Oder sieht vielleicht jemand einen anderen Fehler in den Beispielen?

Nachtrag: Ich entwickle das Programm unter OS3.9 mit WinUAE und einer 24-Bit-Workbench. Ich habe einmal testweise, anstatt einen eigenen Screen zu öffnen, mit LockPubScreen() den Workbench-Screen benutzt und mit ObtainBestPen() die gewünschten Pens geholt, damit hat es funktioniert. Aber warum funktioniert SetRGB4() auf dem eigenen Screen nicht?

Grüße und danke fürs Durchlesen,
thyslo

[ - Answer - Quote - Direct link - ]

2018-11-20, 20:11 h

thomas
Posts: 7716
User
Du hast da eine ganze Menge Denkfehler drin:

1. SetRGB4CM setzt, wie des CM im Namen andeutet, nur die Farbe in der ColorMap. Die ColorMap ist aber nur eine Struktur irgendwo im Speicher, ohne Bezug auf das Display. Wenn du die Farbe direkt in der aktuellen Anzeige ändern möchtest, musst du SetRGB4 benutzen, das auf dem ViewPort arbeitet.

2. SetRGB4 setzt vier Bits pro Farbkomponente. Mit vier Bits kann man nur 16 verschiedene Werte darstellen, nämlich die Zahlen 0 bis 15. Deine Werte für Yellow 16,16,12 ergeben deshalb eigentlich 0,0,12, also ein leicht abgedunkeltes Blau. Genauso ist dein Grün eigentlich violett.

3. du arbeitest mit einem 24bit- oder Truecolor-Bildschirm. Bei Truecolor hat jedes Pixel seine eigene Farbe. Eine Änderung der Palette hat erstmal keinen Effekt. Während man auf einem Palette-basierten Bildschirm mit der Änderung eines Pens sofort alle Pixel mit diesem Pen ändert, wird auf einem Truecolor-Bildschirm die Farbe eines Pens erst beim Zeichnen verwendet, nicht bei bereits bestehenden Pixeln.

Als Nebeneffekt reicht auf einem Truecolor-Bildschirm ein einziger Pen für alle Zeichenoperationen aus. Du weist diesem Pen einfach die gewünschte RGB-Farbe zu und zeichnest dann.

4. in einem RTG-System gibt es nicht nur Farbtiefe, sondern auch Pixelformat. Wenn du den Workbench-Screen klonst, klonst du auch dessen Pixelformat. D.h. wenn du eine 24bit-Workbench klonst, ist dein Klon auch 24bit, selbst wenn du die Farbtiefe auf 8 Farben begrenzt. Das Pixelformat von Screens wird durch die ModeID bestimmt.

5. Zum Klonen der Workbench kann man einfach SA_LikeWorkbench benutzen.
--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Answer - Quote - Direct link - ]

2018-11-20, 20:20 h

thyslo
Posts: 6
User
@thomas:
Danke für deine schnelle und ausführliche Antwort!

Zu SA_LikeWorkbench: das kann ich, glaube ich, nicht benutzen, wenn das Programm OS2.04-kompatibel bleiben soll.

Die anderen Hinweise werden mir morgen, wenn ich weiter mache, bestimmt helfen:-)

[ - Answer - Quote - Direct link - ]

2018-11-20, 21:17 h

thyslo
Posts: 6
User
Zitat:
Original von thomas:
1. SetRGB4CM setzt, wie des CM im Namen andeutet, nur die Farbe in der ColorMap. Die ColorMap ist aber nur eine Struktur irgendwo im Speicher, ohne Bezug auf das Display. Wenn du die Farbe direkt in der aktuellen Anzeige ändern möchtest, musst du SetRGB4 benutzen, das auf dem ViewPort arbeitet.

2. SetRGB4 setzt vier Bits pro Farbkomponente. Mit vier Bits kann man nur 16 verschiedene Werte darstellen, nämlich die Zahlen 0 bis 15. Deine Werte für Yellow 16,16,12 ergeben deshalb eigentlich 0,0,12, also ein leicht abgedunkeltes Blau. Genauso ist dein Grün eigentlich violett.


Die beiden Hinweise haben's gebracht. 2) ist mir schon etwas peinlich, da les' ich vorher noch die Autodocs, wo direkt 0-15 drin steht.

Das geändert, und die SetRGB-Aufrufe geändert in
code:
SetRGB4(&m_pScreen->ViewPort, m_RedPen, 15, 11, 12);
// ...


Und nun funktioniert es.

Danke und beste Grüße!
thyslo

[ Dieser Beitrag wurde von thyslo am 20.11.2018 um 21:30 Uhr geändert. ]

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > SetRGB4CM() ohne Wirkung [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.