ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > BitMap und Farbe setzen | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
10.09.2009, 16:11 Uhr eliotmc Posts: 925 Nutzer |
Hallo, ich probiere mich gerade ein wenig in die System Grafikfunktionen einzuarbeiten und hände irgendwie fest. Hier einfach mal mein Beispiel Code: C code:#include <exec/types.h> #include <clib/alib_protos.h> #include <graphics/rpattr.h> #include <intuition/intuitionbase.h> #include <graphics/gfxbase.h> #include <graphics/gfxmacros.h> #include <graphics/gfx.h> #include <cybergraphx/cybergraphics.h> #include <stdio.h> #include <proto/muimaster.h> #include <proto/graphics.h> #include <proto/intuition.h> #include <proto/exec.h> #include <proto/dos.h> #include <proto/utility.h> /***********************************************************************************/ struct GfxBase *GfxBase; struct IntuitionBase *IntuitionBase; /***********************************************************************************/ enum{ MSG_ERROR_NOERROR = 0, MSG_ERROR_GRAPHICS, MSG_ERROR_INTUITION, MSG_ERROR_SCREEN, }; STRPTR TAB_ERRORS[] = { "", "Unable to open 'graphics.library'!", "Unable to open 'intuition.library'!", "Unable to open screen!", }; ULONG colortable[]= { 16L<<16, 0x00000000,0x00000000,0x00000000, 0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA, 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 0x66666666,0x88888888,0xBBBBBBBB, 0x00000000,0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF,0x00000000, 0xFFFFFFFF,0x00000000,0x00000000, 0x00000000,0xFFFFFFFF,0x00000000, 0xFFFFFFFF,0x00000000,0xFFFFFFFF, 0xAAAAAAAA,0x55555555,0x00000000, 0xEEEEEEEE,0x77777777,0x44444444, 0x44444444,0x55555555,0xAAAAAAAA, 0x77777777,0x44444444,0xFFFFFFFF, 0xEEEEEEEE,0x11111111,0x66666666, 0x11111111,0x99999999,0x33333333, 0xFFFFFFFF,0x00000000,0x00000000, 0x00000000}; /***********************************************************************************/ //50 ticks=second LONG getBestPen(const struct Screen* screen, int r, int g, int b){ return ObtainBestPen(screen->ViewPort.ColorMap, r,g,b,OBP_Precision, PRECISION_EXACT,TAG_DONE); } int main( void ) { struct Screen *screen; struct RastPort *rp=NULL; int result; LONG pen=1L; struct BitMap *myBitMap; struct RastPort myRp; // int resultPixel=88; // int i=0; result = MSG_ERROR_GRAPHICS; if( (GfxBase = (struct GfxBase *) OpenLibrary( "graphics.library", 39 ) ) ) { result = MSG_ERROR_INTUITION; if( (IntuitionBase = (struct IntuitionBase *) OpenLibrary( "intuition.library", 39 ) ) ) { result = MSG_ERROR_SCREEN; if( (screen = (struct Screen*) OpenScreenTags( NULL, SA_Width, 320, SA_Height, 240, SA_Depth, 16, SA_Title, "Test", SA_ShowTitle,FALSE, SA_Colors32,colortable, TAG_DONE ) ) ) { VPrintf("Okn",&result); rp=&screen->RastPort; SetDrMd(rp,JAM1); //Farbe setzen SetAPen(rp,2L); //Bildschirm füllen mit Pen SetRast(rp,2L); pen = ObtainBestPen(screen->ViewPort.ColorMap, 0xFFFFFFFF,0x00000000,0x00000000, OBP_Precision, PRECISION_EXACT,TAG_DONE); printf("Pen: %lin",pen); SetAPen(rp,pen); //SetBPen(rp,1L); SetOPen(rp,pen); //Rect malen RectFill(rp,10,10,20,20); //Malt einen Pixel WritePixel(rp,200,150); //Bewegt den Cursor zur Position Move(rp, 0,50); //Zeichnet eine Linie Draw(rp,320,50); //Zeichnet eine Ellipse DrawEllipse(rp,100,100,10,20); //Zeichnet einen Kreis DrawCircle(rp, 70,70,20); //Füllt eine Fläche Flood(rp,1,100,100); Delay( 5 * 50 ); //Und jetzt mit einer BitMap myBitMap= AllocBitMap(320, 240, 32, BMF_CLEAR|BMF_DISPLAYABLE|SHIFT_PIXFMT(PIXFMT_ARGB32)|BMF_SPECIALFMT, NULL); InitRastPort(&myRp); myRp.BitMap = myBitMap; SetRGB4(&screen->ViewPort, 7, 0xFFFFFFFF, 0x00000000, 0x00000000); pen = ObtainBestPen(screen->ViewPort.ColorMap, 0xFFFFFFFF,0x00000000,0x00000000,OBP_Precision, PRECISION_IMAGE,TAG_DONE); printf("Pen: %lin",pen); SetAPen(&myRp, 15); RectFill(&myRp,10,10,50,50); BltBitMapRastPort(myBitMap, 0, 0, rp, 0, 0, 320, 240, 0xc0); Delay( 5 * 50 ); result = MSG_ERROR_NOERROR; CloseScreen( screen ); FreeBitMap(myBitMap); } CloseLibrary( &IntuitionBase->LibNode ); } CloseLibrary( &GfxBase->LibNode ); } if( result ) { VPrintf( TAB_ERRORS[ result ], &result ); result = 20; } return( result ); } Mein Problem ist folgendes: ObtainBestPen liefert mir immer den Pen 0, obwohl der genwünschte Pen exisitert! Und wie kann ich bei einem BitMap den Pen setzen? Vieln Dank für eure Hilfe! -- regards eliot http://www.exception-dev.de [ - Antworten - Zitieren - Direktlink - ] |
10.09.2009, 16:18 Uhr AGSzabo Posts: 1663 Nutzer |
ich kenn mich mit c nicht aus aber kann es sein dass du statt setrgb4 eine funktion mit mehr bits brauchst? den pen setzen kannst du nur mit einem rastport. und probiers evtl mal mit PRECISION_EXACT -- Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110 [ Dieser Beitrag wurde von AGSzabo am 10.09.2009 um 16:21 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
10.09.2009, 19:15 Uhr eliotmc Posts: 925 Nutzer |
So, hier das ganze nochmal ein wenig aufgeräumter: C code:#include <exec/types.h> #include <clib/alib_protos.h> #include <graphics/rpattr.h> #include <intuition/intuitionbase.h> #include <graphics/gfxbase.h> #include <graphics/gfxmacros.h> #include <graphics/gfx.h> #include <cybergraphx/cybergraphics.h> #include <stdio.h> #include <proto/muimaster.h> #include <proto/graphics.h> #include <proto/intuition.h> #include <proto/exec.h> #include <proto/dos.h> #include <proto/utility.h> /***********************************************************************************/ struct GfxBase *GfxBase; struct IntuitionBase *IntuitionBase; /***********************************************************************************/ enum{ MSG_ERROR_NOERROR = 0, MSG_ERROR_GRAPHICS, MSG_ERROR_INTUITION, MSG_ERROR_SCREEN, }; STRPTR TAB_ERRORS[] = { "", "Unable to open 'graphics.library'!", "Unable to open 'intuition.library'!", "Unable to open screen!", }; /***********************************************************************************/ //50 ticks=second int main( void ) { struct Screen *screen; struct RastPort *rp=NULL; int result; LONG pen=1L; struct BitMap *myBitMap; struct RastPort myRp; result = MSG_ERROR_GRAPHICS; if( (GfxBase = (struct GfxBase *) OpenLibrary( "graphics.library", 39 ) ) ) { result = MSG_ERROR_INTUITION; if( (IntuitionBase = (struct IntuitionBase *) OpenLibrary( "intuition.library", 39 ) ) ) { result = MSG_ERROR_SCREEN; if( (screen = (struct Screen*) OpenScreenTags( NULL, SA_Width, 320, SA_Height, 240, SA_Depth, 16, SA_Title, "Test", SA_ShowTitle,FALSE, TAG_DONE ) ) ) { VPrintf("Okn",&result); rp=&screen->RastPort; //Farbe setzen pen = ObtainBestPen(screen->ViewPort.ColorMap, 0x00000000, 0x00000000, 0x00000000, OBP_Precision, PRECISION_EXACT,TAG_DONE); printf("pen: %lin",pen); SetRGB32(&screen->ViewPort,pen,0x00000000,0x00000000,0x00000000); SetAPen(rp,pen); SetOPen(rp,pen); //Bildschirm füllen mit Pen SetRast(rp,pen); //Zeichnet Rect SetRGB32(&screen->ViewPort,pen,0xFFFFFFFF,0x00000000,0x00000000); RectFill(rp,10,10,20,20); //Zeichnet einen Pixel WritePixel(rp,200,150); //Bewegt den Cursor zur Position Move(rp, 0,50); //Zeichnet eine Linie Draw(rp,320,50); //Zeichnet eine Ellipse DrawEllipse(rp,100,100,10,20); //Zeichnet einen Kreis DrawCircle(rp, 70,70,20); //Füllt eine Fläche Flood(rp,1,100,100); Delay( 5 * 50 ); //Und jetzt mit einer BitMap myBitMap= AllocBitMap(320, 240, 32, BMF_CLEAR|BMF_DISPLAYABLE|SHIFT_PIXFMT(PIXFMT_ARGB32)|BMF_SPECIALFMT, screen->RastPort.BitMap); InitRastPort(&myRp); myRp.BitMap = myBitMap; RectFill(&myRp,10,10,50,50); BltBitMapRastPort(myBitMap, 0, 0, rp, 0, 0, 320, 240, 0xc0); Delay( 5 * 50 ); FreeBitMap(myBitMap); ReleasePen(screen->ViewPort.ColorMap, pen); result = MSG_ERROR_NOERROR; CloseScreen( screen ); } CloseLibrary( &IntuitionBase->LibNode ); } CloseLibrary( &GfxBase->LibNode ); } if( result ) { VPrintf( TAB_ERRORS[ result ], &result ); result = 20; } return( result ); } Mien konkretes Problem: Wie kann ich den Pen oder die Farbe bei mienem BitMap setzen? -- regards eliot http://www.exception-dev.de [ - Antworten - Zitieren - Direktlink - ] |
10.09.2009, 20:02 Uhr eliotmc Posts: 925 Nutzer |
Hallo, folgendes geht leider auch nicht: C code:myBitMap= AllocBitMap(320, 240, 32, BMF_CLEAR|BMF_DISPLAYABLE|SHIFT_PIXFMT(PIXFMT_ARGB32)|BMF_SPECIALFMT, NULL); InitRastPort(&myRp); SetRPAttrs(&myRp,RPTAG_PenMode,FALSE,TAG_DONE); SetRPAttrs(&myRp, RPTAG_FgColor,0xFFFFFF,TAG_DONE); SetRPAttrs(&myRp, RPTAG_BgColor,0xFFFFFF,TAG_DONE); Es muss doch einen Weg geben die Farben zum Zeichnen bei einem BitMap zu setzen!? -- regards eliot http://www.exception-dev.de [ Dieser Beitrag wurde von eliotmc am 10.09.2009 um 21:08 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
11.09.2009, 13:25 Uhr Holger Posts: 8116 Nutzer |
@eliotmc: Bei eigenen Screens musst Du auch Pen-Sharing aktivieren, wenn Du es benutzen willst, also SA_SharePens, TRUE oder so ähnlich. Sonst sind ohnehin alle Pens exklusiv für Dich reserviert. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
11.09.2009, 13:32 Uhr Holger Posts: 8116 Nutzer |
Nachtrag: Wenn Du ohnehin eine Farbtabelle angibst, kannst Du natürlich auch auf Pen-Sharing ganz verzichten. Dann nimm einfach die Pen-Nummer, die Du ja kennst, und lass ObtainPen(...) ganz weg. Zitat:Das sieht mir ganz nach Dingen aus, die Du keinesfalls tun solltest, wenn Du die graphics.library mit Mindestversion 39 öffnest. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
11.09.2009, 13:35 Uhr Holger Posts: 8116 Nutzer |
Zitat:Das hatte ich noch übersehen: Auf einer BitMap kannst Du keinen Pen setzen, weil Operationen auf BitMaps keinen Pen benutzen. Wie man auf einem RastPort den Pen setzt, weißt Du ja. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
11.09.2009, 13:54 Uhr thomas Posts: 7718 Nutzer |
@eliotmc: Ich denke, dein größter Fehler ist SA_Depth,16 und die falschen Annahmen über den Screen, der dabei herauskommt. OpenScreen sucht sich nicht einen passenden Bildschirmmodus zu deinen Dimensionen, sondern es nimmt den Modus, den du angegeben hast. Da du keinen Modus angegeben hast, ist der Default PAL:Lores oder NTSC:Lores bzw. der entsprechende FakeNative-Modus unter OS4. In jedem Fall bekommst du einen <=8 Bit CLUT-Modus. Unter AGA würde der Bildschirm gar nicht geöffnet, weil eine Tiefe größer als 8 nicht möglich ist. Picasso96 verzeiht diesen Fehler offenbar, aber begrenzt die Tiefe auf 8. Im folgenden legst du dann eine 32bit Truecolor-Bitmap an und versuchst diese auf den Screen zu kopieren. Die Konvertierung von Truecolor auf CLUT wird von Picaso96 nicht unterstützt, deshalb passiert bei BltBitMapRastPort einfach nichts. Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
18.09.2009, 20:41 Uhr eliotmc Posts: 925 Nutzer |
Hallo, erstmal vieln Dank für die vielen Ratschläge. Leider bin ich immer noch nicht richtig weiter. So sieht der Code jetzt aus: c code:#include <exec/types.h> #include <clib/alib_protos.h> #include <graphics/rpattr.h> #include <intuition/intuitionbase.h> #include <graphics/gfxbase.h> #include <graphics/gfxmacros.h> #include <graphics/gfx.h> #include <cybergraphx/cybergraphics.h> #include <stdio.h> #include <proto/muimaster.h> #include <proto/graphics.h> #include <proto/intuition.h> #include <proto/exec.h> #include <proto/dos.h> #include <proto/utility.h> /***********************************************************************************/ struct GfxBase *GfxBase; struct IntuitionBase *IntuitionBase; /***********************************************************************************/ enum{ MSG_ERROR_NOERROR = 0, MSG_ERROR_GRAPHICS, MSG_ERROR_INTUITION, MSG_ERROR_SCREEN, }; STRPTR TAB_ERRORS[] = { "", "Unable to open 'graphics.library'!", "Unable to open 'intuition.library'!", "Unable to open screen!", }; /***********************************************************************************/ //50 ticks=second int main( void ) { struct Screen *screen; struct RastPort *rp=NULL; int result; LONG pen=1L; struct BitMap *myBitMap; struct RastPort myRp; result = MSG_ERROR_GRAPHICS; if( (GfxBase = (struct GfxBase *) OpenLibrary( "graphics.library", 39 ) ) ) { result = MSG_ERROR_INTUITION; if( (IntuitionBase = (struct IntuitionBase *) OpenLibrary( "intuition.library", 39 ) ) ) { result = MSG_ERROR_SCREEN; if( (screen = (struct Screen*) OpenScreenTags( NULL, SA_Width, 1280, SA_Height, 1024, SA_Depth, 32, SA_Title, "Test", SA_ShowTitle,FALSE, SA_Quiet,TRUE, SA_Exclusive, TRUE, TAG_DONE ) ) ) { VPrintf("Okn",&result); rp=&screen->RastPort; //Get a pen and set color pen = ObtainBestPen(screen->ViewPort.ColorMap, 0x00000000, 0x00000000, 0x00000000, OBP_Precision, PRECISION_EXACT,TAG_DONE); SetRGB32(&screen->ViewPort,pen,0x00000000,0x00000000,0x00000000); SetAPen(rp,pen); SetOPen(rp,pen); //Fills screen SetRast(rp,pen); SetRGB32(&screen->ViewPort,pen,0xFFFFFFFF,0x00000000,0x00000000); //Drwas a rectangle RectFill(rp,10,10,20,20); //Draws a pixel WritePixel(rp,200,150); //Moves gfx cursor to position Move(rp, 0,50); //Draws a line Draw(rp,320,50); //Draws a elipse DrawEllipse(rp,100,100,10,20); //Zeichnet einen Kreis DrawCircle(rp, 70,70,20); //Fills a shape Flood(rp,1,100,100); //Wait for 2 seconds Delay( 2 * 50 ); // ReleasePen(screen->ViewPort.ColorMap, pen); //Create bitmap myBitMap= AllocBitMap(320, 240, 32, BMF_CLEAR|BMF_DISPLAYABLE|SHIFT_PIXFMT(PIXFMT_ARGB32)|BMF_SPECIALFMT, //screen->RastPort.BitMap); NULL); InitRastPort(&myRp); SetRPAttrs(&myRp,RPTAG_PenMode,FALSE,TAG_DONE); SetRPAttrs(&myRp,RPTAG_AlphaMode,TRUE,TAG_DONE); SetRPAttrs(&myRp, RPTAG_FgColor,0xFFFFFFFF,TAG_DONE); SetRPAttrs(&myRp, RPTAG_BgColor,0xFFFFFFFF,TAG_DONE); myRp.BitMap = myBitMap; //SetRGB32(&screen->ViewPort,pen,0x00000000,0x00000000,0x00000000); //RectFill(&myRp,0,0,320,240); //SetRGB32(&screen->ViewPort,pen,0xFFFFFFFF,0x00000000,0x00000000); RectFill(&myRp,10,10,50,50); //Blitting bitmap to screen BltBitMapRastPort(myBitMap, 0, 0, rp, 0, 0, 320, 240, 0xc0); Delay( 2 * 50 ); FreeBitMap(myBitMap); result = MSG_ERROR_NOERROR; CloseScreen( screen ); } CloseLibrary( &IntuitionBase->LibNode ); } CloseLibrary( &GfxBase->LibNode ); } if( result ) { VPrintf( TAB_ERRORS[ result ], &result ); result = 20; } return( result ); } Wie kann ich bei dem Bitmap Rastport (myrp) die Farbe setzen, so dass ich zeichnen kann (und zwar in meiner genwüscnhten Farbe). Das SetRPAttrs(&myRp, RPTAG_FgColor,0xFFFFFFFF,TAG_DONE); SetRPAttrs(&myRp, RPTAG_BgColor,0xFFFFFFFF,TAG_DONE); scheint nicht zu funktionieren (oder ich nutze es falsch). -- regards eliot http://www.exception-dev.de [ - Antworten - Zitieren - Direktlink - ] |
18.09.2009, 22:09 Uhr eliotmc Posts: 925 Nutzer |
Hallo, wenn ich SetRPAttrs nach dem Zuweisen der Bitmap zum Rastport aufrufe, funktioniert alles! -- regards eliot http://www.exception-dev.de [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > BitMap und Farbe setzen | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |