ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > Farbe rausfinden mit Basic | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
28.07.2003, 10:16 Uhr chkamiga Posts: [Ex-Mitglied] |
Wie bekomme ich raus wo in der Farbpallette der Workbench z.B rot ist? Ich benutze Maxon Basic und die Library Funktionen kann ich noch nicht richtig anwenden, nur mit Subs komme ich klar. [ - Ändern - Antworten - Zitieren - Direktlink - ] |
28.07.2003, 21:34 Uhr Holger Posts: 8116 Nutzer |
Ich fürchte, ohne Library-Funktionen wird das nicht gehen. Ich fürchte auch, daß es kaum noch Maxon-Basic Benutzer geben wird, die Dir damit helfen können. Um es mit den Worten des Seelenklempners zu sagen :"kann Dir zwar nicht helfen, aber gut, daß wir darüber gesprochen haben".:( mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
28.07.2003, 22:12 Uhr chkamiga Posts: [Ex-Mitglied] |
Schon klar das das ohne Library Funktionen nicht geht. Ich möchte ja wissen wie ich das mit Library machen kann. Prinzipiell ist das mit anderen Basics auf dem Amiga ja das gleiche. [ - Ändern - Antworten - Zitieren - Direktlink - ] |
29.07.2003, 14:26 Uhr Holger Posts: 8116 Nutzer |
Vermutlich schon, aber gerade die Art und Weise, wie man Library-Funktionen aufruft ist wahrscheinlich unterschiedlich. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
29.07.2003, 19:38 Uhr mrbbc Posts: 101 Nutzer |
Normalerweise setzt man bei seiner Anwendung die Farben so wie man sie braucht und am Ende wieder zurück auf den Systemstandard. Bei GFA- und Omicron-Basic war es so, dass man im Grunde auch alle Betriebssystemfunktionen verwenden konnte. Wenn das bei Maxon auch der Fall ist, brauchst du nur eine OS-Referenz. -- it obvisiously seems to have been hard to write [ - Antworten - Zitieren - Direktlink - ] |
30.07.2003, 08:50 Uhr chkamiga Posts: [Ex-Mitglied] |
Es gibt aber auch eine Library Funktion mit der man die Farbe rausfinden kann. Weiss denn niemand wie die unter Basic Funktioniert? [ - Ändern - Antworten - Zitieren - Direktlink - ] |
31.07.2003, 17:40 Uhr Holger Posts: 8116 Nutzer |
Zitat:So etwas moechte ich auf _meiner_ Workbench nicht erleben.:nuke: mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
31.07.2003, 21:16 Uhr kadi Posts: 1528 Nutzer |
Ist MAXON Basic nicht kompatibel zu AmigaBasic und/oder HiSoft Basic? Das Beispiel habe ich, weil AmigaBasic unter Amithlon nicht mehr läuft in HisoftBasic testen können. Vieleicht ist das Basic Listing ja trotzdem irgendwie hilfreich. Es liest die RGB-Werte eines 32 Farbenscreens mit hilfe der GetRGB4 Funktion ein, rechnet sie in die merkwürdigen AmigaBasic PALETTE Werte (die komischerweise von 0,00 bis 1.00 gehen) um und zeichnet mit RectFill eine kleine Box in der Farbe. DEFINT A-Z REM $INCLUDE Graphics.bh REM $INCLUDE Intuition.bh 'DECLARE FUNKTION ViewPortAddress&() LIBRARY :REM AmigaBasic ;-) 'DECLARE FUNKTION GetRGB4&() LIBRARY LIBRARY OPEN "graphics.library" LIBRARY OPEN "intuition.library" SCREEN 1,320,200,5,1 WINDOW 2, "Bitte Taste drücken",,1,1 vp&=ViewPortAddress&(WINDOW(7)) cm&=PEEKL(vp&+4):rp&=WINDOW(8) n1=0:n2=15:GOSUB farbesuchen n1=16:n2=31:GOSUB farbesuchen WINDOW CLOSE 2 SCREEN CLOSE 2 LIBRARY CLOSE END farbesuchen: CLS:y=0 FOR i=n1 TO n2 farb=GetRGB4& (cm&,i) r=INT(farb/2^8):r1!=1/15*r rest=farb MOD 2^8 g=INT(rest/2^4):g1!=1/15*g b=rest MOD 2^4 :b1!=1/15*b PRINT "palette";:PRINT USING"###";i; PRINT USING ",#.##";r1!,g1!,b1! CALL SetAPen&(rp&,i) CALL RectFill&(rp&,240,y,310,y+8) y=y+8:CALL SetAPen&(rp&,1) NEXT i taste:ta$=INKEY$:IF ta$="" THEN taste RETURN Allerdings hast du dann nur die PALETTE RGB Werte. Wenn du ermitteln willst welche der Workbenchfarben ROT ist, dann musst du die Farbwerte ja noch auswerten. Ich meine "PALETTE 1,1.00,0.00,0.00" ist ja ROT und "PALETTE1,0.93,0.19,0.05" würde man immernoch als ROT ansehen. Du musst also noch auswerten was ein für deine Zwecke geeignetes ROT ist und was nicht. Ab OS3.5 muss es irgendwo im OS Routinen geben, die PENs sharen und verwalten, wie man das programmiert weiß ich leicher überhaupt nicht. [ Dieser Beitrag wurde von kadi am 31.07.2003 editiert. ] [ - Antworten - Zitieren - Direktlink - ] |
01.08.2003, 11:06 Uhr chkamiga Posts: [Ex-Mitglied] |
Zitat: Ja, diese Funktion ist mir schon bekannt, es ist mir aber zu kompliziert die Farbe damit zu berechnen. Es gibt direkt eine Funktion mit der sich eine Farbe rausfinden lässt. Und ich würde gerne wissen wie das geht. [ - Ändern - Antworten - Zitieren - Direktlink - ] |
01.08.2003, 12:57 Uhr kadi Posts: 1528 Nutzer |
> Ja, diese Funktion ist mir schon bekannt, es ist mir aber zu > kompliziert die Farbe damit zu berechnen. Es gibt direkt eine > Funktion > mit der sich eine Farbe rausfinden lässt. Und ich würde gerne > wissen wie das geht. Wenn du prinzipiell doch die Librarys in BASIC programmieren kannst - und weißt wie das geht, dann suchst du also nur die passende OS-Routine für Pensharing? Ich glaube fast alle Beteiligten in diesem Thread haben das missverstanden und glaubten du brauchst auch Hilfe dabei, wie man Librarys prinzipiell in BASIC anwenden kann. Hast du mal nach so Stichworten wie "amiga pensharing graphics.library" bei GOOGLE-Groups gesucht? Die Funktion die du suchst heißt vieleicht: ObtainBestPenA(colormap,red,green,blue,taglist) von OS3.0 V39 Ermitteln des Farbwertes, der am besten mit dem übergebenen Farbwert übereinstimmt... Colormap zeigt auf die colormap, in der ein passendes Farbregister ermittelt werden soll. red-green-blue Anteil als 32Bit Werte Taglist ist ein Zeiger auf eine Tagliste, die wietere Einträge enthält Die Tagliste enthält Einträge zur Präzision der Farbe, keine ahnung wie die Struktur aufgebaut ist, danach musst du dann noch googeln... Das Ergebnis der Funktion ist der Ermittelte Farbregister, das mit ReleasePen() wieder freigegeben werden muß. ~0, falls kein passendes Farbregister gefunden wurde und auch kein freies mehr zur Verfügung steht. Allerdings vermute ich das es in OS3.5 was besseres gibt...??? VIeleicht hilft dir die Info, damit du googeln kannst. [ - Antworten - Zitieren - Direktlink - ] |
01.08.2003, 14:11 Uhr tokai Posts: 1071 Nutzer |
@kadi: Um himmels willen, das funktioniert mit maxonbasic nie. In BlitzBasic2 konnte man SystemLibrary-Funktionen direkt verwenden, aber ich glaube kaum das sich das auch auf MaxonBasic anwenden lässt. -- the truth is in there. [ - Antworten - Zitieren - Direktlink - ] |
01.08.2003, 16:07 Uhr chkamiga Posts: [Ex-Mitglied] |
Ja, ich kann nicht alle Library Funktionen unter Basic benutzen, insbesondere Funktion nicht. Da gibts immer ein Absturz bei mir, irgendwas mache ich Falsch. Ja, das ist die Funktion die ich meine, habe aber keine ahnung wie man eine Taglist unter Basic macht und wie man die Funktion richtig anwendet. Das mit Google wird nichts bringen, da wird kein Basic Source Code zu Finden sein nur für C und so. [ Dieser Beitrag wurde von chkamiga am 01.08.2003 editiert. ] [ - Ändern - Antworten - Zitieren - Direktlink - ] |
01.08.2003, 16:34 Uhr CeaBear Posts: 5 Nutzer |
Zitat: Hi chkamiga, vielleicht hilft dir die Analyse von dem pmdevbas.lha unter der URL: http://www.boing.nu/scripts/pm/down.pl Übrigens innerhalb von 2 Minuten mit Google gefunden! Es erscheint mir MaxonBasic zu sein (keine Ahnung). Im Modul Layout.bas sah es auch nach einer TagList aus (habs aber nur überflogen), aber ich konnte dich nicht mehr leiden sehen. *fg* Du solltest vielleicht trotzdem mal das Grundprinzip des Library-Systems studieren.. Viel Glück! [ - Antworten - Zitieren - Direktlink - ] |
01.08.2003, 17:55 Uhr chkamiga Posts: [Ex-Mitglied] |
Ja, schön und gut aber der Sourcecode dort hat nichts mit ObtainBestPen zu tun. Ich müsste schon direkt ein Beispiel Code für ObtainBestPen haben. Wie eine Taglist aussieht weiss ich ja. [ - Ändern - Antworten - Zitieren - Direktlink - ] |
01.08.2003, 20:09 Uhr kadi Posts: 1528 Nutzer |
Also in MaxonBasic musst du das in etwa so programmieren: rr&=255*2^24 gg&=255*2^24 bb&=0*2^24 :REM gibts n << Linksshift Operator? so gehts nicht. TAGLIST VARPTR(tags&(0)), _ OBP_Precision&, PRECISION_GUI&, _ OBP_FailIfBad&, FALSE&, _ TAG_DONE& bp&=ObtainBestPenA&(cm&,rr&,gg&,bb&,VARPTR(tags&(0))) PRINT"bestpen=";bp& Ein kleines Problem ist da aber noch, nämlich die sache mit den 32Bit Werten für RGB. ObtainBestPen erwartet 32Bit Werte, wenn man jetzt rr&=255 eingibt, klappt es nicht. In C würde man einen SHIFT Operator anwenden und es mit <<24 shiften. Aber wie macht man das in Basic? 255*2^24 müsste man rechnen, aber das geht nicht wegen der Vorzeichenbehaftung von & Variablen...da muss noch einer helfen...oder du weißt weiter... [ - Antworten - Zitieren - Direktlink - ] |
01.08.2003, 20:22 Uhr kadi Posts: 1528 Nutzer |
Neee, das obige klappt nicht, total daneben, sorry, ich weiß nicht wie man das macht... [ - Antworten - Zitieren - Direktlink - ] |
01.08.2003, 21:59 Uhr chkamiga Posts: [Ex-Mitglied] |
So daneben ist das gar nicht. Ich kann zwar nur bis 127 gehen, alles was darüber ist gibt nen Überlauf, aber für die dunklen Farben Funktioniert es. So bin ich doch schon ein Stück weiter Danke [ - Ändern - Antworten - Zitieren - Direktlink - ] |
01.08.2003, 22:41 Uhr Holger Posts: 8116 Nutzer |
Zitat:Die Werte nach links zu shiften ist ohnehin nicht der richtige Weg. Es ist zwar relativ egal, weil Systeme mit höherer Farbauslösung als 24Bit noch ziemlich lange aus sich warten lassen werden, trotzdem ist ein 32Bit-Wert ein 32Bit-Wert und sollte als solcher behandelt werden. Wenn man also den maximalen Wert haben will, sollte man nicht 255 nach links shiften, sondern alle Bits setzen. Und das geht natürlich ziemlich einfach: [code] rr&=-1 gg&=-1 bb&=0 TAGLIST VARPTR(tags&(0)), _ OBP_Precision&, PRECISION_GUI&, _ OBP_FailIfBad&, FALSE&, _ TAG_DONE& bp&=ObtainBestPenA&(cm&,rr&,gg&,bb&,VARPTR(tags&(0))) PRINT"bestpen=";bp& [/quote] Für beliebige Werte wird's natürlich kniffliger. Aber bevor ich da jetzt Gehirnschmalz reinstecke, teilt mir erst mal mit, ob das mit dem Rot so funktioniert. Weil ich kann's ja nicht testen. Aber wenn's so funktioniert, basteln wir auch eine allgemeine Funktion dafür. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
01.08.2003, 22:51 Uhr kadi Posts: 1528 Nutzer |
Ich vergaß zu erwähnen, das die Funktion die PENs auch reserviert, das heißt, du musst die PENs mit CALL ReleasePen&(cm&,n) wieder freigeben. Bei dir geht das? Mit HighSoft Basic irgendwie nicht. Nur Rot scheint zu funktionieren, Grün und Blau wird ignoriert... Deshalb vermutete ich, das da noch wo anders was nicht stimmt... Gehts vieleicht wenn du anstatt a& a# verwendest? Oder gibts in Basic auch ULONG Variablen ohne Vorzeichenbehaftung? Hab alles vergessen... Leider hab ich nur zu OS1.3 Zeiten bischen mit AmigaBasic rumprogrammiert - und mal ganz davon abgesehen, das ich alles wieder vergessen hab, hatte OS1.3 diese Funktionen auch noch garnicht. [ - Antworten - Zitieren - Direktlink - ] |
01.08.2003, 23:20 Uhr Holger Posts: 8116 Nutzer |
Zitat:Ja, natürlich nicht vergessen. Ist nur problematisch, wenn BASIC wegen Laufzeitfehler aussteigt. Aber wenn das Programm erst einmal fertig ist, sollte auch ordentlich aufgeräumt werden. Zitat:Fragen, über Fragen. Also, hier ist erst einmal die Routine, die RGB-Werte zwischen 0..255 inkl. in die 32Bit-Werte konvertiert, wenn es denn mit dem zweier-komplement so hinhaut, wie ich dachte. code:rem r&, g&, b& sollten die werte im bereich 0..255 enthalten if r&<128 then rr&=r&*16843009 else rr&=(r&-255)*16843009-1 if g&<128 then gg&=g&*16843009 else gg&=(g&-255)*16843009-1 if b&<128 then bb&=b&*16843009 else bb&=(b&-255)*16843009-1 TAGLIST VARPTR(tags&(0)), _ OBP_Precision&, PRECISION_GUI&, _ OBP_FailIfBad&, FALSE&, _ TAG_DONE& bp&=ObtainBestPenA&(cm&,rr&,gg&,bb&,VARPTR(tags&(0))) PRINT"bestpen=";bp& rem Pen hier benutzen ReleasePen&(cm&,bp&) Hoffentlich habe ich die basic-syntax richtig hinbekommen, ist schon ziemlich lange her. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
01.08.2003, 23:37 Uhr kadi Posts: 1528 Nutzer |
Ja, mit -1 gehts auch. Aber mit den Shiftwerten auch! Ich kann sie im Taschenrechner ausrechnen, zum Beispiel: 255*2^24=4278190080 rr&=4278190080 print rr& -16777216 bepe&=ObtainBestPenA&(cm&,0,-1677721,0,0) findet auch das Blau... Also "rr&=4278190080" geht, aber "rr&=255*2^24" geht nicht, wegen Arithmetic overflow Error. Keine Ahnung was man da macht, ist zu lange her. [ - Antworten - Zitieren - Direktlink - ] |
01.08.2003, 23:41 Uhr kadi Posts: 1528 Nutzer |
@ Holger: Oh, cool, kann der chkamiga mal testen :-) [ - Antworten - Zitieren - Direktlink - ] |
02.08.2003, 00:20 Uhr Holger Posts: 8116 Nutzer |
Zitat:Jein. Der in diesem Code enthaltene Algorithmus löst zwei Probleme. Das eine ist die Sache mit dem Overflow. Bei Programmiersprachen, die den overflow ignorieren, liefern die mit if..then..else benutzenten Alternativen die gleichen 32Bit-Werte. Das zweite ist die Sache mit dem theoretisch korrekten Wert. Die Dokumentation des AmigaOS weist die 32Bit Werte als Bruch aus, anders gesagt, wenn man den 8Bit-Wert 0xa0 haben will, lautet der korrekte 32Bit-Wert 0xa0a0a0a0 und nicht 0xa0000000. I.A. macht das keinen Unterschied und shiften geht schneller(1), aber wenn shiften sowieso nicht geht, wie bei Basic, und man ohnehin multiplizieren muß, warum dann nicht gleich richtig? Deshalb wird in dem Beispiel nicht mit 2^24 multipliziert, sondern mit 16843009 (0x01010101). Dann erhält man auch gleich den formal richtigen Wert. (1) Man kann jetzt natürlich streiten, ob so ein Unterschied jemals relevant wird, da bislang jede Grafikhardware maximal 24Bit, also 8Bit pro Farbkomponenten darstellt. Aber schon, wenn man diese Werte tatsächlich als Brüche auffassen und z.B. einer 3D-Hardware als float übergeben würde, könnten sich sehr schnell sichtbare Differenzen ergeben. -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
02.08.2003, 11:55 Uhr chkamiga Posts: [Ex-Mitglied] |
Funktioniert Das Entgültige Programm sieht nun so aus: LIBRARY "graphics.library" DECLARE FUNCTION ObtainBestPenA& LIBRARY 'cm&, r&, g&, b&, tags& DECLARE SUB ReleasePen LIBRARY 'cm&, ExtendedNoden& DIM tags&(10) sWindow& = WINDOW(7) sScreen& = PEEKL(sWindow& + 46) sViewPort& = sScreen& + 44 cm& = PEEKL(sViewPort& + 4) r&=255 g&=255 b&=0 IF r&<128 THEN rr&=r&*16843009 ELSE rr&=(r&-255)*16843009-1 IF g&<128 THEN gg&=g&*16843009 ELSE gg&=(g&-255)*16843009-1 IF b&<128 THEN bb&=b&*16843009 ELSE bb&=(b&-255)*16843009-1 TAGLIST VARPTR(tags&(0)), _ OBP_Precision&, PRECISION_GUI&, _ OBP_FailIfBad&, FALSE&, _ TAG_DONE& bp&=ObtainBestPenA&(cm&,rr&,gg&,bb&,VARPTR(tags&(0))) COLOR bp&:PRINT"bestpen=";bp& ReleasePen cm&,bp& Vielen Dank an alle. Ihr seid echt nett hier. [ - Ändern - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > Farbe rausfinden mit Basic | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |