amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Truecolor Icons (PNG) auf AOS/MOS [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

30.03.2004, 20:41 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Hallo, ich sollte auf Anregung in meim Programm PNG icons Support einbauen und wollte wissen, ob es überhaupt Möglich ist mit der Icon Library diese einzulesen, da diese Library meines wissens nach nur für Palettenbasierende Icons gedacht ist, vor allem wie man die Alphamaske ansprechen kann, da die Masken normalerweise ja nur 1 Bit Tiefe haben. Auf OS3.x soll der Powericons Patch benutzt werden, dazu meine nächste Frage, würde das ganze dan ebenso auf MOS laufen, oder geht das dort anders? (habe von MOS keine Ahnung).

Am vernünftigsten würde ich das ganze über das PNG Datatype machen, aber leider ist soweit ich das sehe damit nicht möglich Alphamasken einzulesen, oder irre ich mich da?

danke

Darius

[ - Antworten - Zitieren - Direktlink - ]

31.03.2004, 11:11 Uhr

Solar
Posts: 3680
Nutzer
PNG ist palettenbasierend...

[ - Antworten - Zitieren - Direktlink - ]

31.03.2004, 22:07 Uhr

Mazze
Posts: 263
Nutzer
Ich habe vor kurzem mal was mit libpng gemacht und da waren sowohl paletten- als auch truecolor Modi dabei.

[ - Antworten - Zitieren - Direktlink - ]

31.03.2004, 23:21 Uhr

Georg
Posts: 107
Nutzer
Zitat:
Original von DariusBrewka:
Hallo, ich sollte auf Anregung in meim Programm PNG icons Support einbauen und wollte wissen, ob es überhaupt Möglich ist mit der Icon Library diese einzulesen

Wenn du die eingelesenen Icons dann später mit DrawIconState()
(benötigt icon.library von OS 3.5 oder größer, vorher gab's diese
Funktion nicht) renderst, dann sollte das gehen.




[ - Antworten - Zitieren - Direktlink - ]

31.03.2004, 23:24 Uhr

Georg
Posts: 107
Nutzer
Zitat:
Original von Mazze:
Ich habe vor kurzem mal was mit libpng gemacht und da waren sowohl paletten- als auch truecolor Modi dabei.


Genau so ist es. Ein Besonderheit bei den Paletten-Modi ist übrigens,
daß jedem Palette Eintrag ein unterschiedlicher Alpha-Wert zugewiesen
sein kann. D. h. auch ein paletten-PNG Image kann im Gegensatz zu GIF
und Co. theoretisch mehr als nur ne 1 Bit Maske haben.

[ - Antworten - Zitieren - Direktlink - ]

01.04.2004, 10:59 Uhr

gni
Posts: 1106
Nutzer
Zitat:
DariusBrewka:
Hallo, ich sollte auf Anregung in meim Programm PNG icons Support einbauen und wollte wissen, ob es überhaupt Möglich ist mit der Icon Library diese einzulesen, da diese Library meines wissens nach nur für Palettenbasierende Icons gedacht ist, vor allem wie man die Alphamaske ansprechen kann, da die Masken normalerweise ja nur 1 Bit Tiefe haben.

Da die PNG Icons per Patch realisert werden (AOS 3.x), sollte alles transparent sein. Speziellen Support (was immer das sein soll) würde ich nicht machen.

[ - Antworten - Zitieren - Direktlink - ]

05.04.2004, 03:04 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Hmm, ich möchte die Icons nicht malen, sondern die Daten haben und zwar mit Alpha Maske, ich bin mir ziemlich sicher, das DrawIconState die nicht hergibt, sondern wenn überhaupt das Ikon direkt mit dem Hintergrund verknüpft. Ich muss die Ikons ggf verkleinern, da hilft es mir nicht wenn ich die mittels DrawIconState zeichen kann, da ich dann die Maske nicht habe (oder irre ich mich da?).

Anders ausgedrückt möchte ich so etwas haben, wie eine RGBA BitPlane

Ahso, konnte nicht früher antworten, da mein System völlig zerstört war

[ - Antworten - Zitieren - Direktlink - ]

05.04.2004, 09:23 Uhr

thomas
Posts: 7716
Nutzer

Ich weiß ja nicht, wie vollständig PowerIcons ist, aber probier doch mal IconControl() mit ICONTROLA_GetImageData und ICONTROLA_GetImageMask.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

05.04.2004, 13:23 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Hmm, GetImageData ist so vermute ich für 8 Bit Icons gedacht, da ich keine Funktion finde, welche die Tiefe angibt. Ausserdem steht in den AutoDocs, dass GetImageData für Palettenbasierende Icons gedacht ist.

GetImageMask wird wohl keine AlphaMasken zurückgeben, jedenfalls wird nur ein PlanePointer zurückgegeben (lt. Autodocs)

Ich habe auch einen gewissen Erfolg bisher (wenn ich mich auf Standardmasken beschränke, Alphakanal ist nicht so wichtig), nur bei PNG icons geht das mit den Masken (über GetImageMask) nicht so richtig.

[ - Antworten - Zitieren - Direktlink - ]

05.04.2004, 14:39 Uhr

thomas
Posts: 7716
Nutzer

Ich verstehe nicht, warum du so sehr am Wortlaut der Autodocs festhältst. Du wirst da mit Sicherheit nichts über Truecolor-Icons und Alpha-Masken finden. AmigaOS kann nur Paletten-Icons mit 8 Bit Farbtiefe. PowerIcons ist ein Patch, der alle diese Funktionen umbiegt. Wenn du irgendwo Doku darüber findest, dann höchstens in der PowerIcons-Anleitung. Wenn dort nichts steht, hilft nur ausprobieren.

Als Umgehung, wenn du nichts findest, könntest du den Hintergrund auf Icon-Größe vergrößern, dann mit DrawIconState hineinzeichnen und dann alles zusammen verkleinern.

Gruß Thomas
--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

05.04.2004, 23:45 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Nuja, so einfach ist das nicht da ich die Icons nicht einfach so verkleinere (d.h. durch einfaches weglassen von Zeilen/Spalten), sonderen ggf. einen Filter anwende d.h. würde ich dann das ganze zurückzeichnen so würde man schon einen Block sehen.

[ - Antworten - Zitieren - Direktlink - ]

06.04.2004, 12:35 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von thomas:
Ich verstehe nicht, warum du so sehr am Wortlaut der Autodocs festhältst. Du wirst da mit Sicherheit nichts über Truecolor-Icons und Alpha-Masken finden.

Weil PowerIcons sich ebenfalls an genau den selben Autodocs orientiert. Hast Du schon mal etwas von Kompatibilität gehört?
Wenn in den Autodocs steht, daß Funktion xyz eine 1Bit-Maske zurückliefert, dann wird auch die gepatchte Version von xyz eine 1Bit-Maske zurückliefern, weil alles andere nicht funktionieren würde.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

06.04.2004, 12:42 Uhr

Holger
Posts: 8116
Nutzer
@DariusBrewka:
Hast Du mal getestet, was DrawIconState macht, wenn Du in eine RGBA-BitMap zeichnen läßt?
Werden Alpha-Werte übertragen, oder wird der Alpha-Wert mit einer Konstante überschrieben?
In beiden Fällen könnte man etwas daraus machen.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

06.04.2004, 19:01 Uhr

Georg
Posts: 107
Nutzer
Zitat:
Original von DariusBrewka:

Am vernünftigsten würde ich das ganze über das PNG Datatype machen, aber leider ist soweit ich das sehe damit nicht möglich Alphamasken einzulesen, oder irre ich mich da?


Theoretisch müßte das schon gehen. Aber dann muß das der entsprechende PNG DataType auch unterstützen. Und auch dann könnte ich auf die Schnelle nicht sagen, wie genau man den Alpha-Channel abfragen kann. Picture.datatype und Co. sind nicht gerade gut dokumentiert. Möglicherweise geht's über das Abfragen von (BitMapHeader.bmh_Masking == mskHasAlpha) zum Feststellen ob ein alpha channel da ist, und dann
das Einlesen der Grafikdaten inkl. AlphaChannel in nen chunkybuffer per PDTM_READPIXELARRAY(PBPAFMT_RGBA|PBPAFMT_ARGB).

Ansonsten einfach was auf Basis von libpng zusammen basteln. Wie das geht kannst du von den AROS Sourcen (insbesondere AROS/workbench/classes/datatypes/png/directaccess.c) abschauen. Dessen png.datatype und PNG Icon support basiert darauf.

[ - Antworten - Zitieren - Direktlink - ]

06.04.2004, 23:28 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
@Holger

Im Moment zeichne ich in eine WB Friendly Bitmap, was auch ganz gut geht (bis auf den Alphakanal), habe auch versucht eine ARGB Bitmap zu nehmen, aber da ist DrawImageState immer abgeschmiert, was aber auch daran liegen könnte, dass ich mich mit Cybergraphix bisher noch nie so richtig beschäftigen musste (d.h. 32 Bit Bitmaps).
Andererseits wie werden denn die neuen Alphawerte berechnet, wenn ich mittels DrawImageState offscreen Bitmap zeichne und wenn ich ganz normale Icons mit 1 Bit Maske in eine ARGB Bitmap mittels DrawImageState zeichne, wird dann auch ein AlphaKanal erzeugt, der entweder für jedes Pixel 0x00 oder 0xff ist?

@Georg

Das mit PNG und den Datatypes habe ich soweit ich mich erinnern kann schonmal getestet und es war nicht möglich, andererseits ist das so eine Sache mit den PNG Icons, denn mein Programm ist eigentlich für Icons ausgelegt (wegen den ToolTypes), und es gibt einen Patch (PowerIcons) den die meisten die das PNG Icons Feature brauchen sowieso installiert haben dürften, dieser erledigt auch die Berechnung des selected Images.

Ich habe bisher die Berechnung der Masken für Icons per Hand erledigt, da ich nur OS3.1 hatte, nun unter OS3.5 habe ich das umgestellt und die Masken mittels IconControl besorgt und daraus AlphaWerte erstellt, da mein Tool jetzt intern im ARGB Format arbeitet. Wenn ich normale Icons einlade sieht auch alles schön aus, bei PNG Icons wird jedoch nur die obere linke Ecke (8 x 8 Pixel) dargestellt, was aber nicht daran liegt das die Bilddaten fehlen würden, denn wenn ich die AlphaWerte auf 255 Festsetze wird das ganze Icon gezeichnet, d.h. es ist nur die Maske der PNG Icons Falsch. Wie auch immer, ich habe eine Mail an den Author des PowerIcon Patches geschrieben, vieleicht hilfts weiter.

Danke

[ - Antworten - Zitieren - Direktlink - ]

07.04.2004, 18:18 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von DariusBrewka:
Im Moment zeichne ich in eine WB Friendly Bitmap, was auch ganz gut geht (bis auf den Alphakanal), habe auch versucht eine ARGB Bitmap zu nehmen, aber da ist DrawImageState immer abgeschmiert, was aber auch daran liegen könnte, dass ich mich mit Cybergraphix bisher noch nie so richtig beschäftigen musste (d.h. 32 Bit Bitmaps).
Andererseits wie werden denn die neuen Alphawerte berechnet, wenn ich mittels DrawImageState offscreen Bitmap zeichne und wenn ich ganz normale Icons mit 1 Bit Maske in eine ARGB Bitmap mittels DrawImageState zeichne, wird dann auch ein AlphaKanal erzeugt, der entweder für jedes Pixel 0x00 oder 0xff ist?


Das war ja meine Frage. Ich dachte, Du könntest es schneller testen, wenn Du im Prinzip den dazu schon notwendigen Code schon hast. Aber wenn Du mit 32Bit-BitMaps Probleme hast, dann wühle ich mal in meiner Code-Rumpelkiste...
Ich würde erwarten, dass bei 1Bit-Masken die Werte auf Opaque (ähm 0xff?) gesetzt werden, wenn die Maske 1 ist, und die anderen Werte _nicht angefaßt werden_, also transparent bleiben, wenn man sie vorher auch entsprechend initialisiert hat.
Versuch macht kluch...

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

07.04.2004, 23:49 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
@Holger

Das mit der 32 Bit Bitplane hat sich erledigt, lag nur daran daß ich ein Paar Tags bei DrawImageState nicht gesetzt habe und er wohl den Speicher überschrieben hat, wie auch immer sind die Alpha Werte wenn ich mittels DrawImageState in diese Bitmap schreibe alle 0, was ich auch erwartet habe, da er den Hintergrund und Vordergrund mischt und dann dann in die BitPlane schriebt. Ohne Alphawerte wäre es auch gangbar, wenn die Normale 1Bit Maske korrekt wäre, aber wenn ich diese benutze scheint nur ein ca. 16*16 Pixel Block zu existieren wo alle Bits gesetzt sind, alle anderen sind 0. Mit Normalen Icons funktioniert alles Tadellos.

Wie auch immer, ich habe bei der Autorin? von PowerIcons nachgefragt, mal sehen was draus wird, es dürfte nicht so schwer sein auch die Alphawerte in Bit Maps hineinzuschreiben.

gruss

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Truecolor Icons (PNG) auf AOS/MOS [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.