DEUTSCHE VERSION |
|
Links | | | Forums | | | Comments | | | Report news |
Chat | | | Polls | | | Newsticker | | | Archive |
amiga-news.de Forum > Programmierung > Kreis Zeichnen ohne graphics.library | [ - Search - New posts - Register - Login - ] |
1 2 -3- 4 5 | [ - Post reply - ] |
2008-04-01, 19:00 h Der_Wanderer Posts: 1229 User |
BMF_SPECIALFMT = 0x80 Probiers mal damit. Einfach weglassen geht nicht. Sonst wäre es ja nicht da! -- Thilo Köhler, Author von: HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr... Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2008-04-01, 19:12 h MaikG Posts: 5172 User |
>BMF_SPECIALFMT = 0x80 >Probiers mal damit. Einfach weglassen geht nicht. Sonst wäre es ja nicht da! Und woher kommt diese Konstante? Ja, OS4 kann so die Bitmap Allocieren. Aber die Zeichenfunktionen (cgx) machen jetzt falsch Farben. Unter OS3 geht AllocBitmap jetzt nicht mehr. [ - Answer - Quote - Direct link - ] |
2008-04-01, 20:52 h Blackbird Posts: 634 User |
Zitat: wie wäre es damit: Auszug aus der cybergraphics.h ------------------------------ /* * * graphics.library/AllocBitMap() extended flags * * */ #ifndef BMB_SPECIALFMT #define BMB_SPECIALFMT (7UL) #define BMF_SPECIALFMT (1UL << BMB_SPECIALFMT) #endif /* BMB_SPECIALFMT */ -- regards Blackbird Have a look at: http://www.blackbird-net.de Skins for PlayCD OS3.9 BlackShoot, Zombies Apocalypse, GalagaWars, VcdImager-Gui,PerfectPaint [ - Answer - Quote - Direct link - ] |
2008-04-01, 21:17 h MaikG Posts: 5172 User |
Hab schon bei per google gesehen das man da was Shiften muss. bm& = AllocBitMap&(1600, 1200, 24, BMF_SPECIALFMT||(24<<PIXFMT_RGB24&), NULL&) Das geht unter OS3. Unter OS4 geht das anzeigen, wenn man das für jede Bitmap angibt. Ja, aber sobald man denn druckt kommt nur müll raus. Obwohl unter OS4 Turboprint zumindest mit dem Grafic Publisher läuft. Also irgendwas OS4 fähig zu machen ist ja schlimmer als etwas für OS1.3 :-( [ - Answer - Quote - Direct link - ] |
2008-04-01, 22:58 h Der_Wanderer Posts: 1229 User |
Also so wie ich dir geposted habe funktioniert es unter OS3 und OS4. Drucken habe ich aber nicht probiert. Dass man darauf mit OS Funktionen nicht zeichnen kann, haben wir hier ja lang und breit erörtert. Da wird vermutlich nur in schwarz drauf gezeichnet. Unter OS4/MOS/AROS würde es aber gehen, wenn man den Penless Mode benutzt. -- Thilo Köhler, Author von: HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr... Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2008-04-02, 00:10 h MaikG Posts: 5172 User |
>Dass man darauf mit OS Funktionen nicht zeichnen kann, >haben wir hier ja lang und breit erörtert. Ja, ist auch nicht das Problem, da ich die CGX Funktionen benutze. >Da wird vermutlich nur in schwarz drauf gezeichnet. >Unter OS4/MOS/AROS würde es aber gehen, wenn man den Penless Mode >benutzt. Nicht direkt, du hast Farben die du nutzen kannst. Leider unterscheiden die sich bei CGX/P96. Schwarz ist aber immer 1 und weiss 2. Man könnte jetzt aber mit Pen 1-255 einen Punkt malen, per cgx auslesen und wüsste so welche farben auf diesem Screen zur verfügung stehen. [ - Answer - Quote - Direct link - ] |
2008-04-02, 00:57 h Der_Wanderer Posts: 1229 User |
> Ja, ist auch nicht das Problem, da ich die CGX Funktionen benutze. > ..., du hast Farben die du nutzen kannst. Leider > unterscheiden die sich bei CGX/P96. > Schwarz ist aber immer 1 und weiss 2. Mensch MaikG, du bist echt ein harter Fall... Bitte lese den Thread nochmal genau durch, und mache dir klar was Colormap vs. Hi/True Color bedeutet, also ein Pen vs. RGB Farben sind. -- Thilo Köhler, Author von: HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr... Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2008-04-02, 01:48 h Mad_Dog Posts: 1944 User |
Zitat: Und ich dachte, ich hätte das Pen-Sharing Konzept Einsteigerfreundlich erklärt: http://w3.norman-interactive.com/C-Kurs_8_5.html. Falls in meinem C-Kurs was nicht klar sein sollte, bin ich jederzeit für konstruktive Kritik offen. Nochmal kurz das "Pen-Konzept für Dummies": Ein Pen kann man sich vorstellen wie einen Buntstift. Alle Stifte sind nummeriert. Mit ObtainBestPen() kann man die Nummer des Stiftes ermitteln, die am besten zur gewünschten Farbe passt. Allerdings haben die AmigaOS-Pens im Gegensatz zu Buntstiften keine feste Farbe, sondern die Farbe eines Stiftes kann sich ändern. Wenn man also z.B. schreibt SetAPen(rp, 2L) und dies beim ersten Programmlauf schwarz sein sollte, kann man sich nicht sicher sein, daß dies beim nächsten Programmlauf ebenfalls wieder so sein wird. Pen Nr. 2 ist zwar einer der Pens, die von der Workbench gesetzt werden, aber es kann ja durchaus sein, daß der User eine andere Farbeinstellung wählt. Dann kann Pen Nr. 2 z.B. auch lila-blass-blau oder sonst was sein. Was anderes ist es, wenn man Grafik-Funktionen verwendet, die einen RGB-Wert als Eingabeparameter erwarten, wie z.B. die CybergraphX-Funktion WriteRGBPixel(): Zitat: -- http://www.norman-interactive.com [ Dieser Beitrag wurde von Mad_Dog am 02.04.2008 um 01:49 Uhr geändert. ] [ - Answer - Quote - Direct link - ] |
2008-04-02, 10:32 h MaikG Posts: 5172 User |
>Mensch MaikG, du bist echt ein harter Fall... >Bitte lese den Thread nochmal genau durch, und mache dir klar was >Colormap vs. Hi/True Color bedeutet, also ein Pen vs. RGB Farben >sind. Ich hab das doch verstanden! Trotzdem kann ich auf einer nicht angezeigten 24 Bit BitMap Text schreiben und auch SetAPen verwenden. Das geht unter OS3-CGX, OS4 und UAE-P96. Das OptainBestBen und konsorten nicht gehen ist klar. [ - Answer - Quote - Direct link - ] |
2008-04-03, 18:51 h Holger Posts: 8116 User |
Zitat:Wenn Du jetzt gesagt hättest, dass es CGX-Funktionen gibt, die einen Puffer statt einer BitMap akzeptieren, hätte man das vielleicht so stehen lassen können (Abgesehen von der Sinnlosigkeit Deines Statements, weil es ja gerade darum ging, dass man unter AmigaOS3.x ohne cybergraphics oder picasso96 keine 24 Bit-BitMaps anlegen kann). Da Du allerdings jetzt mit einem RastPort kommst, der definitiv einen Pointer auf eine BitMap benötigt und keinesfalls Deinen von Hand erzeugten Custom-Buffer akzeptiert, muss man Dich doch für den Unsinn abwatschen. Bleiben wir also dabei: Zitat:Was hat der AGA-Chipsatz mit dem Druckertreiber zu tun? Zitat:Tataaaa! Sind wir am Ende doch einer Meinung... Bleibt nur noch die Frage, was Deine Behauptung, man könne eine TrueColor-BitMap von Hand anlegen, uns hier für einen Nutzen gebracht hat bzw. gebracht hätte, wenn sie richtig gewesen wäre. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2008-04-03, 18:59 h Holger Posts: 8116 User |
Zitat:Du weißt aber nicht, wo die Farben herkommen, und solange Du diesbezüglich keine Spezifikation hast, kannst Du Dich nicht darauf verlassen. Auch das Ausprobieren ist nicht akzeptabel, da Du ja nicht weißt, ob sich diese Farben nicht zwischendurch ändern. Vielleicht sind es ja bei fehlender ColorMap zufällig die des zuletzt benutzten Screens und ändern sich, je nachdem, welcher Screen gerade vorne ist oder welche Anwendung den letzten Zeichenbefehl ausgeführt hat. Würde Dir das gefallen? mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2008-04-03, 19:08 h kev Posts: 56 User |
Wird bei p96 eine BitMap *ohne* Friend alloziert, so erhält die neue BitMap eine ColorMap bei der alle Farben 0 sind. Ausnahme ist die Hintergrundfarbe, die wird von der Workbench übernommen. Bei Verwendung eines "Friends" wird die Farbtabelle des Friends, resp. des Screens, übernommen. Daher Änderungen an der Bildschirmpalette führen auch zu Änderungen an der ColorMap der BitMap(s). Soweit ich weiß, gibt es nur unter p96/OS4 die Möglichkeit eine eigene ColorMap für die BitMap anzulegen. [ - Answer - Quote - Direct link - ] |
2008-04-03, 19:29 h Der_Wanderer Posts: 1229 User |
Da haben wir schon die erste Inkonsistenz. Auch der Pen 0 malt auf meinem System mit der Farbe schwarz, so wie alle Pens, wenn eine 24bit Bitmap keine Colormap hat. Wie man eine Colormap anlegt bzw. an eine Bitmap anhägnt weiss ich nicht. Als alternative gibt es aber in OS4, MOS, AROS den sog. "penless" Modus, bei dem man per SetRastPortAttrs() eine RGB Farbe definiert, die anschliessende von den Zeichenfunktion genutzt werden. Das wäre eigentlich die Lösung für MaikG. Allerdings geht das nicht unter OS3, es sei den AfAOS ist installiert. Aber selbst dann geht es nicht, weil es in Afa OS nur ein Hack ist und ohne Screen wird trotzdem schwarz gezeichnet. Dazu müsste man den Picasso Treiber ändern. Vielleicht wird das ja aber bald gemacht ;-) -- Thilo Köhler, Author von: HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr... Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2008-04-03, 21:35 h MaikG Posts: 5172 User |
>Du weißt aber nicht, wo die Farben herkommen, >und solange Du diesbezüglich keine Spezifikation hast, >kannst Du Dich nicht darauf verlassen. Schon, da es aber eine Colormap/Penzuordnung bei CGX Screens gibt welche immer gleich ist, es sei denn man spezifiziert SA_FullPalette&,TRUE& gehe davon aus das die Farben immer gleich sind. Also in der FastMem bitmap. P96 macht da wieder die ausnahme weil es nicht wirklich cgx kompatibel ist. >Wird bei p96 eine BitMap *ohne* Friend alloziert, so erhält die >neue BitMap eine ColorMap bei der alle Farben 0 sind. Ich habe friend nicht angegeben und trotzdem farben unter OS4 und UAE. Nur sind das nicht die selben wie bei CGX. [ - Answer - Quote - Direct link - ] |
2008-04-04, 10:09 h Holger Posts: 8116 User |
Zitat:Dann wird die ColorMap von beiden Screens genutzt? Was passiert, wenn der friend-Bildschirm geschlossen wird? Zitat:Na ja, das war ja auch das Fazit dieses Threads: ohne existierenden Screen geht's eben nicht. Bleibt also nur Screen öffnen, wie schon gesagt zur Not auch nicht-ziehbar hinter einen anderen geklebt, so dass man ihn definitiv niemals sehen kann, oder eine friend-BitMap anlegen, was auch einen existierenden Screen voraussetzt. Natürlich ist man im ersten Fall auf darstellbare BitMap-Formate beschränkt, bzw. hat im zweiten Fall gar keine Kontrolle über das Format... Zitat:Selbst wenn es ein AfA mit angepassten P96 oder was auch immer gibt, mit dem das geht, ist das nicht mehr AOS3.x. Da iirc Maiks Wunsch war, ein AOS3.x ohne Erweiterungen zu unterstützen, fällt das dann raus. Ansonsten würde ich, was das angeht, eher auf die Portierung der Portierung von Cairo nach Aros nach AOS3.x warten mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2008-04-04, 11:33 h Der_Wanderer Posts: 1229 User |
Auf einem nackten OS3.x geht es soweiso nicht mit OS Befehlen. Zusammenfasend würde ich MaikG folgendes empfehlen: Die "Bitmap" einfach als ARGB PixelArray (also simpler, formloser Speicherblock) mit AllocMem(höhe*breite*4byte,MEMF_ANY) allocieren und alles selbst hineinzeichnen. Erfordert zwar höheren Implementierungsaufwand, funktioniert dann aber garantiert überall, zumindest eben die Grafik zu erstellen. Wie man dann zum printer.device kommt, weiss ich nicht, aber wenn es Pixelarrays akzeptiert umso besser. Im schlimmsten Fall kann man mit WritePixelArray() das ganze in eine True Color Bitmap übertragen. Das malen im PixelArray hat den Vorteil, dass man das Pixelformat garantieren kann, was man bei einer Bitmap, die mit einem Screen verbunden ist, nicht machen kann. (nur mit einer Bitmap ohne Screen, aber auf die kann man ja nicht verlässlich mit OS Funktionen zeichnen). Erleichtert würde das ganze natürlich durch einen Port von Cairo oder zumindest mit ttengine.library für Text, da Text wohl am schwierigsten wäre, selbst zu implementieren. BTW; weis jemand den Status der Cairo Portierung? Würde mich auch brennend interessieren. -- Thilo Köhler, Author von: HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr... Homepage: http://www.hd-rec.de [ Dieser Beitrag wurde von Der_Wanderer am 04.04.2008 um 12:20 Uhr geändert. ] [ - Answer - Quote - Direct link - ] |
2008-04-04, 12:58 h kev Posts: 56 User |
@ Holger Die Farbtabelle wird zusammen mit der letzten BitMap, von der sie benutzt wird, gelöscht. [ - Answer - Quote - Direct link - ] |
2008-04-04, 16:23 h Mad_Dog Posts: 1944 User |
Ich habe den Bresenham mal entsprechend aufgebohrt. Aber irgendetwas ist noch faul, entweder in diesen Includes selbst oder in meinem Demoprogramm. Trotzdem hier mal mein Zwischenergebnis: c code:/* * bresenham.h * * Grafikfunktionen zum Zeichnen von Linien und Keisen mit Hilfe des * Bresenham Algorithmus. * * Autor: Norman Walter * Datum: 30.3.2008 * */ #ifndef BRESENHAM_H #define BRESENHAM_H #include <exec/types.h> #include <cybergraphx/cybergraphics.h> #include <proto/exec.h> #include <clib/cybergraphics_protos.h> #define SGN(x) (x > 0) ? 1 : (x < 0) ? -1 : 0 /* * struct raster_bitmap * * In dieser Struktur sind die Parameter für das Bitmap zusammengefasst. * Nachdem mit Hilfe der Funktion AllocRasterBitmap eine Instanz dieser Struktur * erzeugt wurde, zeigt der Zeiger *data auf den Speicherbereich, in dem das * eigentliche Bitmap mit der Größe size Byte liegt. * * Die Funktionen ClearRaster, setpixel, rasterLine und rasterCircle schreiben * ihre Daten in diesen Speicherbereich. Der Zeiger *date kann anschließend * mit Hilfe der Funktion WritePixelArray8 aus der graphics.library in einen * RastPort geschrieben werden. * */ struct raster_bitmap { unsigned int width; // Breite des Bitmaps unsigned int height; // Höhe des Bitmaps UBYTE Depth; // Farbtiefe in Bit ULONG PixFmt; // Das Pixelformat (RGB, ARGB...) UBYTE BytesPerPixel; // Bytes pro Pixel ULONG BytesPerRow; // Bytes pro Zeile des Bitmaps UBYTE color; // Aktuelle Pen Nummer UBYTE Alpha; // Alpha der Zeichenfarbe UBYTE Red; // Rotanteil der Zeichenfarbe UBYTE Green; // Grünanteil der Zeichenfarbe UBYTE Blue; // Blauanteil der Zeichenfarbe ULONG size; // Größe des bitmapy in Byte UBYTE *data; // Bilddaten des Bitmaps }; /* * AllocRaster * * Legt eine raster_bitmap-Struktur an und initialisiert diese * * Eingabe: unsigned int width - Breite des Bitmaps in Pixel * unsigned int height - Höhe des Bitmaps in Pixel * * Rückgabe: ein Zeiger auf eine raster_bitmap Struktur * */ struct raster_bitmap * AllocRasterBitmap(unsigned int width, unsigned int height, ULONG PixFmt); /* * FreeRasterBitmap * * Gibt den Speicher einer raster_bitmap Struktur wieder frei. * * Einganbe: struct raster_bitmap *bm - Zeiger auf raster_bitmap Struktur * */ void FreeRasterBitmap(struct raster_bitmap *bm); /* * rasterLine * * Zeichnet eine Linie von xstart, ystart nach xend, yend in der angegebenen * raster_bitmap Struktur bm. * * Eingabe: struct raster_bitmap *bm - Zeiger auf raster_bitmal Struktur * int xstart,ystart - Koordinaten des Anfangspunkts der Linie * int xend, yend - Koordinaten des Endpunkts der Linie * */ void rasterLine(struct raster_bitmap *bm,int xstart,int ystart,int xend,int yend); /* * ClearRaster * * Löscht den Inhalt des raster_bitmap bm mit der aktuellen Farbe. * * Eingabe: struct raster_bitmap *bm - Zeiger auf raster_bitmal Struktur * */ void ClearRaster(struct raster_bitmap *bm); /* * SetColor * * Stellt die Zeichenfarbe des raster_bitmap für Zeichenoperationen ein. * * Eingabe: struct raster_bitmap *bm - Zeiger auf raster_bitmal Struktur * UBYTE col - Pen Nr. * */ void SetColor(struct raster_bitmap *bm, UBYTE col); void SetColorRGBA(struct raster_bitmap *bm, UBYTE r, UBYTE g, UBYTE b, UBYTE a); /* * setpixel * * Setzt den Bildpunkt x,y in der Farbe des eingestellten Pens. * * Eingabe: struct raster_bitmap *bm - Zeiger auf raster_bitmal Struktur * unsigned int x,y - Koordinaten des Bildpunkts * */ void setpixel(struct raster_bitmap *bm, unsigned int x, unsigned int y); /* * rasterCircle * * Zeichnet einen Kreis mit Radius radius um den Kreismittelpunkt x0,y0. * * Eingabe: struct raster_bitmap *bm - Zeiger auf raster_bitmal Struktur * int y0,y0 - Koordinaten des Kreismittelpunks. * int radius - Radius des Kreises * */ void rasterCircle(struct raster_bitmap *bm, int x0, int y0, int radius); #endif c code:--/* * bresenham.c * * Autor: Norman Walter * Datum: 30.3.2008 * */ #ifndef BRESENHAM_H #include "bresenham.h" #endif struct raster_bitmap * AllocRasterBitmap(unsigned int width, unsigned int height, ULONG PixFmt) { struct raster_bitmap *bm; bm = (struct raster_bitmap *)AllocVec(sizeof(struct raster_bitmap),NULL); bm->width = width; bm->height = height; bm->PixFmt = PixFmt; switch (PixFmt) { case PIXFMT_RGB24: case PIXFMT_BGR24: bm->Depth = 24; bm->BytesPerPixel = 3; break; case PIXFMT_ARGB32: case PIXFMT_BGRA32: case PIXFMT_RGBA32: bm->Depth = 32; bm->BytesPerPixel = 4; break; default: bm->Depth = 8; bm->BytesPerPixel = 1; } bm->BytesPerRow = bm->width * bm->BytesPerPixel; bm->size = bm->BytesPerRow * bm->height; bm->color = 1; // RGBA-Komponenten für die Zeichenfarbe setzen bm->Alpha = 0xFF; bm->Red = 0xFF; bm->Green = 0xFF; bm->Blue = 0xFF; bm->data = (UBYTE *)AllocVec(bm->size, MEMF_CLEAR); return bm; } void FreeRasterBitmap(struct raster_bitmap *bm) { FreeVec(bm->data); FreeVec(bm); } void ClearRaster(struct raster_bitmap *bm) { ULONG x,y; for (x=0; x < bm->width; x++) { for (y=0; y < bm->height; y++) { setpixel(bm,x,y); } } } void SetColor(struct raster_bitmap *bm, UBYTE col) { bm->color = col; } void SetColorRGBA(struct raster_bitmap *bm, UBYTE r, UBYTE g, UBYTE b, UBYTE a) { bm->Red = r; bm->Green = g; bm->Blue = b; bm->Alpha = a; } void setpixel(struct raster_bitmap *bm, unsigned int x, unsigned int y) { ULONG pos = bm->width * y + x; if (x >= 0 && x < bm->width && y >= 0 && y < bm->height) { switch (bm->PixFmt) { case PIXFMT_RGB24: bm->data[pos] = bm->Red; bm->data[pos + 1] = bm->Green; bm->data[pos + 2] = bm->Blue; break; case PIXFMT_BGR24: bm->data[pos] = bm->Blue; bm->data[pos + 1] = bm->Green; bm->data[pos + 2] = bm->Red; break; case PIXFMT_RGBA32: bm->data[pos] = bm->Red; bm->data[pos + 1] = bm->Green; bm->data[pos + 2] = bm->Blue; bm->data[pos + 3] = bm->Alpha; break; case PIXFMT_ARGB32: bm->data[pos] = bm->Alpha; bm->data[pos + 1] = bm->Red; bm->data[pos + 2] = bm->Green; bm->data[pos + 3] = bm->Blue; break; case PIXFMT_BGRA32: bm->data[pos] = bm->Blue; bm->data[pos + 1] = bm->Green; bm->data[pos + 2] = bm->Red; bm->data[pos + 3] = bm->Alpha; break; default: bm->data[pos] = bm->color; } } } void rasterLine(struct raster_bitmap *bm,int xstart,int ystart,int xend,int yend) { int x, y, t, dx, dy, incx, incy, pdx, pdy, ddx, ddy, es, el, err; /* Entfernung in beiden Dimensionen berechnen */ dx = xend - xstart; dy = yend - ystart; /* Vorzeichen des Inkrements bestimmen */ incx = SGN(dx); incy = SGN(dy); if(dx<0) dx = -dx; if(dy<0) dy = -dy; /* feststellen, welche Entfernung größer ist */ if (dx>dy) { /* x ist schnelle Richtung */ pdx=incx; pdy=0; /* pd. ist Parallelschritt */ ddx=incx; ddy=incy; /* dd. ist Diagonalschritt */ es =dy; el =dx; /* Fehlerschritte schnell, langsam */ } else { /* y ist schnelle Richtung */ pdx=0; pdy=incy; /* pd. ist Parallelschritt */ ddx=incx; ddy=incy; /* dd. ist Diagonalschritt */ es =dx; el =dy; /* Fehlerschritte schnell, langsam */ } /* Initialisierungen vor Schleifenbeginn */ x = xstart; y = ystart; err = el/2; setpixel(bm,x,y); /* Pixel berechnen */ for(t=0; t<el; ++t) /* t zaehlt die Pixel, el ist auch Anzahl */ { /* Aktualisierung Fehlerterm */ err -= es; if(err<0) { /* Fehlerterm wieder positiv (>=0) machen */ err += el; /* Schritt in langsame Richtung, Diagonalschritt */ x += ddx; y += ddy; } else { /* Schritt in schnelle Richtung, Parallelschritt */ x += pdx; y += pdy; } setpixel(bm,x,y); } } /* gbham() */ void rasterCircle(struct raster_bitmap *bm, int x0, int y0, int radius) { int f = 1 - radius; int ddF_x = 0; int ddF_y = -2 * radius; int x = 0; int y = radius; setpixel(bm, x0, y0 + radius); setpixel(bm, x0, y0 - radius); setpixel(bm, x0 + radius, y0); setpixel(bm, x0 - radius, y0); while(x < y) { if(f >= 0) { y--; ddF_y += 2; f += ddF_y; } x++; ddF_x += 2; f += ddF_x + 1; setpixel(bm, x0 + x, y0 + y); setpixel(bm, x0 - x, y0 + y); setpixel(bm, x0 + x, y0 - y); setpixel(bm, x0 - x, y0 - y); setpixel(bm, x0 + y, y0 + x); setpixel(bm, x0 - y, y0 + x); setpixel(bm, x0 + y, y0 - x); setpixel(bm, x0 - y, y0 - x); } } http://www.norman-interactive.com [ - Answer - Quote - Direct link - ] |
2008-04-04, 17:21 h Der_Wanderer Posts: 1229 User |
code:void setpixel(struct raster_bitmap *bm, unsigned int x, unsigned int y) { ULONG pos = bm->width * y + x; ... muss heissen: code:--void setpixel(struct raster_bitmap *bm, unsigned int x, unsigned int y) { ULONG pos = (bm->width * y + x) * bm->Depth/8; ... Thilo Köhler, Author von: HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr... Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2008-04-04, 18:21 h MaikG Posts: 5172 User |
>Die "Bitmap" einfach als ARGB PixelArray (also simpler, formloser >Speicherblock) mit AllocMem(höhe*breite*4byte,MEMF_ANY) allocieren >und alles selbst hineinzeichnen. Grade bei P96 oder AGA wäre das wohl das beste. Ich müsste dann aber auch irgendwie die Bitmap flags eintragen, weil ich muss das ja Blitten(vorschau). Dann hab ich noch ein anderes Problem. Ich hab jetzt ein paar farbreduzierungen geschrieben, um auch eine vorschau auf AGA zu ermöglichen. Nun bekomme ich die Workbenchtiefe nicht raus. 1-8 Bit geht aber für alles darüber wird 8 Bit angegeben. So kann ich nicht unterscheiden wann welche Funktion verwendet werden muss. Datatypes sind auch so eine Sache, wenn man 8 Bit oder weniger hat muss die Palette ja dem Screen angepasst werden. Kein Screen -> keine Farbneuberechnung. Von Drucken noch gar nicht zu reden, sofern die Workbench in PAL ist (auch wenn cgx vorhanden) kommt aus dem Drucker ein schwarzes Bild. Da kann das printer.device scheinbar nichtmehr feststellen das es sich um 24 Bit Daten handelt. [ - Answer - Quote - Direct link - ] |
2008-04-04, 19:20 h Der_Wanderer Posts: 1229 User |
An alle Maiks, Reths, und Ralfs: (Entschuldingung, ich bin gerade etwas cholerisch drauf, aber manche stellen sich hier an, dass sogar einem Holger beinahe der Hut hochgeht) ============================================================== = Bitte die Threads auch genau lesen. Programmieren ist eine = Angelegenheit, bei der man alles sehr genau nehmen muss, und so = sollte man auch die Antworten lesen, die man hier bekommt. ============================================================== Zitat:Vorschau machst du mit WritePixelArray, falls der User einen Hi/True Color Screen auf hat. Anderen falls musst du selbst re-mappen, dafür gibts keine OS Routine. Das ist aber auch nicht so furchtbar schwer. Da würde ich einfach die Colormap des Screens auslesen und locken, die Pen Nummern in ein 8-bit Array schreiben und anschliessend mit WriteChunkyPixels ausgeben. Nicht vergessen nach der anzeige die Pens wieder freizugeben. Zitat:Wenn du jetzt erzählst, du malst Pen-basierend, dann macht die ganze Diskussion von wegen True/Hi Color hier gar keinen Sinn. Die Workbenchtiefe herausfinden solltest du GetBitMapAttr(*bitmap,#BMA_DEPTH) benutzen, wie so ziemlich bei allen Attributen, die du von einer Bitmap wissen willst. Zitat:Kein Screen -> warum zum Teufel eine Farbneuberechnung machen? Ich dachte, du willst ein beleibiges Bild erstellen und drucken, unabhängig von der gerade verwendeten Farbtiefe der Workbench und den Fähigkeiten der Grafikkarte. Bitte definiere doch erstmal, was du überhaupt machen willst, mit welchen Einschränkungen du leben kannst und mit welchen nicht. -- Thilo Köhler, Author von: HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr... Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2008-04-04, 20:01 h MaikG Posts: 5172 User |
>Vorschau machst du mit WritePixelArray, falls der User einen Hi/True >Color Screen auf hat. Hab ich per Blitbitmap auf Hi/Truecolor, weil ich eh noch scalieren muss. >Anderen falls musst du selbst re-mappen, dafür gibts keine OS Routine. Ja, hab ich. Momentan mit WritePixel. >Wenn du jetzt erzählst, du malst Pen-basierend, dann macht die ganze >Diskussion von wegen True/Hi Color hier gar keinen Sinn. Pen Basierend male ich nur für die Preview auf der Workbench unter 8 Bit. Den Text mache ich auf der nicht sichtbaren Bitmap mit Pens, da dort nicht tausende farben nötig sind. Alles andere mit writepixel. Datatypes per Blitbitmap, ausser für 8 Bit Bilder geht das nicht. >Die Workbenchtiefe herausfinden solltest du GetBitMapAttr(*bitmap, >BMA_DEPTH) benutzen, wie so ziemlich bei allen Attributen, die du >von einer Bitmap wissen willst. Danke. Zitat: Datatypes sind auch so eine Sache, wenn man 8 Bit oder weniger hat muss die Palette ja dem Screen angepasst werden. Kein Screen -> keine Farbneuberechnung. >Kein Screen -> warum zum Teufel eine Farbneuberechnung machen? Das bild im Speicher hat 24 Bit, die Workbench 8 Bit oder weniger. Um das Bild darzustellen muss es auf die Farben der 8 Bit Workbench umgerechnet werden. >Ich dachte, du willst ein beleibiges Bild erstellen und drucken, >unabhängig von der gerade verwendeten Farbtiefe der Workbench und >den Fähigkeiten der Grafikkarte. Ja, das wäre Optimal. Bissher scheint das 24 Bit drucken mit meinen derzeitigen kenntnissen unter AGA nicht möglich. [ - Answer - Quote - Direct link - ] |
2008-04-04, 23:14 h NoImag Posts: 1050 User |
Zitat: Aus dem NDK 3.5 (also ab printer.device V44): Zitat: Dies gilt, wenn Du eine echte Bitmap drucken möchtest. Außerdem: Zitat: Dies kannst Du benutzen, wenn Du ein ARGB-Array drucken möchtest. Tschüß [ - Answer - Quote - Direct link - ] |
2008-04-05, 00:09 h MaikG Posts: 5172 User |
>Dies gilt, wenn Du eine echte Bitmap drucken möchtest. Hab ich zwar auch gelesen, nur finde ich keine Funktion der ich eine Bitmap übergeben könnte. > Benutzt man das Tag DRPA_SourceHook so braucht weder ein RastPort noch eine > Colormap angegeben werden. >Dies kannst Du benutzen, wenn Du ein ARGB-Array drucken möchtest. Ich weiss nicht was ein Hook ist *duck und wegrenn ARGB-Arrays bekomme ich nur Zeilenweise hin, mehr als eine Zeile endete immer in grafikmüll. [ - Answer - Quote - Direct link - ] |
2008-04-05, 00:32 h Mad_Dog Posts: 1944 User |
Zitat: Danke! Die Division kann man sich aber sparen, da im raster_bitmap schon eine Komponente existiert, die die Bytes pro Pixel hält: c code:void setpixel(struct raster_bitmap *bm, unsigned int x, unsigned int y) { ULONG pos = (bm->width * y + x) * bm->BytesPerPixel; ... -- http://www.norman-interactive.com [ Dieser Beitrag wurde von Mad_Dog am 05.04.2008 um 00:35 Uhr geändert. ] [ - Answer - Quote - Direct link - ] |
2008-04-05, 00:38 h Mad_Dog Posts: 1944 User |
Zitat: Dann schau Dir den Code an, denn ich letztens gepostet habe. Der macht genau das, was Du haben willst. -- http://www.norman-interactive.com [ - Answer - Quote - Direct link - ] |
2008-04-05, 06:39 h Mad_Dog Posts: 1944 User |
Ich hab jetzt mal den Bresenham in der 24 Bit Version samt Demoprogramm in ein Archiv gepackt: bresenham24.lha Hier mal der Ausschnitt aus dem Code, wo das Pixel-Array in den RastPort des Fensters mittels WritePixelArray() eingefügt wird. c code:... struct raster_bitmap *bm24; ... bm24 = AllocRasterBitmap(BMWIDTH,BMHEIGHT,PIXFMT_RGB24); ... Zeichenoperationen hier einfügen WritePixelArray(bm24->data, 0, 0, bm24->BytesPerRow, win->RPort, win->BorderLeft, win->BorderTop, BMWIDTH,BMHEIGHT, RECTFMT_RGB); Hier ein Screenshot aus dem Demoprogramm: Bild: http://w3.norman-interactive.com/files/bresenham.png Wie man sieht, funktioniert das ganz gut. P.S.: Die Polygone, die auf dem Bild zu sehen sind, werden nicht mittels AmigaOS oder CybergraphX Funktionen gezeichnet, sondern mit Hilfe der Funktion rasterLine() aus meinem Include bresenham.c. -- http://www.norman-interactive.com [ Dieser Beitrag wurde von Mad_Dog am 05.04.2008 um 12:03 Uhr geändert. ] [ - Answer - Quote - Direct link - ] |
2008-04-05, 11:38 h MaikG Posts: 5172 User |
>Hier mal der Ausschnitt aus de, Code, wo das Pixel-Array in den >RastPort des Fensters mittels WritePixelArray() eingefügt wird. Ah, danke. Jetzt weiss ich was falsch war, ich hab PixelsPerRow statt BytesPerRow angegeben. [ - Answer - Quote - Direct link - ] |
2008-04-05, 11:54 h Mad_Dog Posts: 1944 User |
Zitat: Bedenke auch, dass solch ein Pixel-Array ja nach Farbtiefe unterschiedliche Bytes per Row hat: c code:switch (PixFmt) { case PIXFMT_RGB24: case PIXFMT_BGR24: bm->Depth = 24; bm->BytesPerPixel = 3; break; case PIXFMT_ARGB32: case PIXFMT_BGRA32: case PIXFMT_RGBA32: bm->Depth = 32; bm->BytesPerPixel = 4; break; default: bm->Depth = 8; bm->BytesPerPixel = 1; } Also: Bei 24 Bit Farbtiefe 3 Bytes, bei 32 Bit 4 Bytes pro Pixel. Folglich ergibt sich Bytes per Row aus Bytes per Pixel * Breite des Bitmaps (für Holger: Die Breite, die das Bild hat, welches durch das Pixel Array dargestellt wird). c code:bm->BytesPerRow = bm->width * bm->BytesPerPixel; -- http://www.norman-interactive.com [ Dieser Beitrag wurde von Mad_Dog am 05.04.2008 um 12:01 Uhr geändert. ] [ - Answer - Quote - Direct link - ] |
2008-04-05, 21:56 h MaikG Posts: 5172 User |
Also ich wollte das mit der neuen OS3.5 Funktionalität mal probieren. Passiert aber nichts, die Function wird nicht aufgerufen. code:'$INCLUDE dos.bh '$INCLUDE exec.bh '$INCLUDE graphics.bh '$INCLUDE intuition.bh '$INCLUDE Printer.bc '$INCLUDE utility.bh LIBRARY OPEN "dos.library",37 LIBRARY OPEN "exec.library",37 LIBRARY OPEN "graphics.library",39 LIBRARY OPEN "intuition.library",37 LIBRARY OPEN "utility.library" DEFINT a-z REM $VARCHECKS DIM SHARED temptag&(20) DIM SHARED h&(Hook_sizeof%2) DECLARE FUNCTION Readpixels& FUNCTION Readpixels&(DRPMsg2&) STATIC x&,y&, myWidht&, myHeight&, r&,buffer& STATIC DRPMsg& PRINT "reached" DRPMsg&=PEEKL(DRPMsg2&) x&=PEEKL(DRPMsg&+DRP_x%) y&=PEEKL(DRPMsg&+DRP_y%) myWidht&=PEEKL(DRPMsg&+DRP_width%) myHeight&=PEEKL(DRPMsg&+DRP_height%) buffer&=PEEKL(DRPMsg&+DRP_buf%) r&=y&<<16 FOR x&=0 TO myWidht&-1 POKEL buffer&, (r& OR x&) ^&h00ffffff NEXT x& Readpixels&=TRUE& END FUNCTION FUNCTION dumpRP%(BYVAL rp&, BYVAL cm&, BYVAL modeID&, x%,y%,x1%,y1%) STATIC pmp&, pio&, sigfr&, r% dumpRP% = -1 pmp& = CreateMsgPort&() pio& = CreateIORequest&(pmp&, IODRPTagsReq_sizeof%) r% = OpenDevice&(SADD("printer.device" + CHR$(0)), 0, pio&, 0) IF r% = 0 THEN POKEW pio& + IODRPReqio_Command%, PRD_DUMPRPORTTAGS& POKEL pio& + io_RastPort%, NULL& POKEL pio& + io_ColorMap%, NULL& POKEL pio& + io_Modes%, NULL& POKEW pio& + io_SrcX%, 0 POKEW pio& + io_SrcY%, 0 POKEW pio& + io_SrcWidth%, 256 POKEW pio& + io_SrcHeight%, 256 POKEL pio& + io_DestCols%, 256 POKEL pio& + io_DestRows%, 256 POKEW pio& + io_Special%, SPECIAL_MILROWS& OR SPECIAL_MILCOLS& POKEL pio& + io_Taglist%, VARPTR(temptag&(0)) SendIO pio& sigfr& = xWait&((1& << PEEKB(pmp& + mp_SigBit))) IF sigfr& AND (1& << PEEKB(pmp& + mp_SigBit%)) THEN ' printer is either ready or an error has occurred WHILE GetMsg&(pmp&) WEND END IF dumpRP% = PEEKB(pio& + IODRPReqio_Error%) CloseDevice pio& ELSE dumpRP% = r% END IF DeleteIORequest& pio& DeleteMsgPort pmp& END FUNCTION INITHOOK VARPTR(h&(0)), VARPTRS(Readpixels&) TAGLIST VARPTR(temptag&(0)), _ DRPA_SourceHook&, VARPTR(h&(0)) ,_ DRPA_AspectX&, 1, _ DRPA_AspectY&, 1, _ TAG_END& junk&=dumpRP%(rp&, cm&, modeID&, x%,y%,x1%,y1%) Vielleicht hab ich auch die Include ergänzungen falsch gemacht code:' >=OS3.5 stuff CONST PRD_RESETPREFS& = &hD& CONST PRD_LOADPREFS& = &hE& CONST PRD_USEPREFS& = &hF& CONST PRD_SAVEPREFS&=&h10& CONST PRD_READPREFS&=&h11& CONST PRD_WRITEPREFS&=&h12& CONST PRD_EDITPREFS&=&h13& CONST PRD_SETERRHOOK&=&h14& CONST PRD_DUMPRPORTTAGS&=&h15& 'IODRPTagsReq fields CONST io_Taglist% =62 CONST IODRPTagsReq_sizeof%=66 'DRPSourceMsg fields CONST DRP_x% = 0 CONST DRP_y% = 4 CONST DRP_width% = 8 CONST DRP_height% = 16 CONST DRP_buf% = 20 CONST DRPSourceMsg_sizeof%=78 'fill this buffer with 0x00RRGGBB pixels CONST DRPA_Dummy&=&h80060000 CONST DRPA_ICCProfile&=&h80060001& CONST DRPA_ICCName&=&h80060002& CONST DRPA_NoColCorrect&=&h80060003& CONST DRPA_SourceHook&=&h80060004& CONST DRPA_AspectX&=&h80060005& CONST DRPA_AspectY&=&h80060006& [ - Answer - Quote - Direct link - ] |
1 2 -3- 4 5 | [ - Post reply - ] |
amiga-news.de Forum > Programmierung > Kreis Zeichnen ohne graphics.library | [ - Search - New posts - Register - Login - ] |
Masthead |
Privacy policy |
Netiquette |
Advertising |
Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved. |