ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > Datatypes Problem | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
24.10.2005, 01:41 Uhr Mazze Posts: 263 Nutzer |
Hi, ich möchte aus einem Fenster einen rechteckigen Bereich abgreifen und in einem Datatype speichern. An einer anderen Stelle möchte ich die Bitmap aus dem Datatype ermitteln und ins Fenster blitten. Problem ist, dass die Abfrage mit GetDTAttrs(o, PDTA ..) für BitMap, ClassBitMap und DestBitMap 0 ergibt. Wie komme ich an die BitMap ran? (Getestet habe ich bisher nur unter 24 Bit) code:--Object * get(struct Window *win, int x, int y, int w, int h) { if (! win) Cleanup("win is 0"); int d = GetBitMapAttr(win->RPort->BitMap, BMA_DEPTH); printf("Tiefe %dn", d); struct BitMap *bm = AllocBitMap(w, h, d, 0, win->RPort->BitMap); if (! bm) Cleanup("bitmap is 0"); struct RastPort rp; memset(&rp,0,sizeof(struct RastPort)); InitRastPort(&rp); rp.BitMap = bm; ClipBlit(win->RPort, x, y, &rp, 0, 0, w, h, 0xc0); long ncols = (d > 8 ? 0 : 1 << d); struct ViewPort *vp = &(win->WScreen->ViewPort); Object *o = NewDTObject(NULL, DTA_SourceType, DTST_RAM, DTA_GroupID, GID_PICTURE, PDTA_BitMap, (ULONG)bm, PDTA_ModeID, GetVPModeID(vp), (ncols ? PDTA_NumColors : PDTA_DestMode) , (ncols ? ncols : PMODE_V43), //PDTA_Screen, (ULONG)win->WScreen, TAG_DONE); if ( o == NULL ) Cleanup("object is 0"); if (ncols) { UBYTE *cmap; ULONG *cregs; puts("Ncols"); GetDTAttrs(o, PDTA_ColorRegisters, (ULONG)&cmap, PDTA_CRegs, (ULONG)&cregs, TAG_DONE); GetRGB32(vp->ColorMap, 0, ncols, cregs); int i; for(i = 3*ncols; i; i--) { *cmap++ = (*cregs++) >> 24; } } struct BitMapHeader *bmhd = NULL; GetDTAttrs(o, PDTA_BitMapHeader, (ULONG)&bmhd, TAG_DONE); bmhd->bmh_Width = w; bmhd->bmh_Height = h; bmhd->bmh_Depth = d; bmhd->bmh_XAspect = 22; bmhd->bmh_YAspect = 22; bmhd->bmh_PageWidth = (w <= 320 ? 320 : w <= 640 ? 640 : w <= 1024 ? 1024 : w <= 1280 ? 1280 : 1600); bmhd->bmh_PageHeight = bmhd->bmh_PageWidth * 3 / 4; // DoDTMethod(o, win, NULL, DTM_PROCLAYOUT, NULL, 1); struct BitMap *nbm = NULL; struct BitMap *cbm = NULL; struct BitMap *dbm = NULL; GetDTAttrs(o, PDTA_BitMap, (ULONG)&nbm, PDTA_ClassBitMap, (ULONG)&cbm, PDTA_DestBitMap, (ULONG) &dbm, TAG_DONE); printf("Bitmap %p Classbitmap %p Destbitmap %pn", nbm, cbm, dbm); // warum sind alle NULL? return o; } Meine Homepage [ - Antworten - Zitieren - Direktlink - ] |
25.10.2005, 11:39 Uhr thomas Posts: 7718 Nutzer |
@Mazze: Deine Frage kann ich auch nicht beantworten, außer daß die Bitmaps bei mir auch NULL sind. Aber ich wüßte gerne, warum du unbedingt ein Datatype-Object dafür benutzen möchtest. Reicht es nicht, die Bitmap selbst zu benutzen ? Das Datatype-Object brauchst du nur, wenn du die Bitmap als IFF-Datei abspeichern möchtest und dann kannst du immer noch kurzzeitig ein Object generieren. Für normale Zeichenoperationen reicht die Bitmap allein vollkommen aus. Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
25.10.2005, 12:00 Uhr Mazze Posts: 263 Nutzer |
@thomas: Ich möchte die Programmiersprache Lua um eine Library erweitern, die Funktionen zum Laden, Speichern, Blitten und Grabben von Grafiken besitzt (siehe Amilua im Aminet). Das Laden, Speichern und Blitten über Datatypes klappt bereits, es fehlt nur noch das Grabben. Was ich noch ausprobieren könnte: Da das Speichern mit DTM_WRITE trotz "fehlender" Bitmap funktioniert, könnte ich mal versuchen, das Bild mit DTM_DRAW (IIRC) zu blitten. Wenn das auch nicht klappt, dann muss ich wohl die abgegriffene Bitmap als Userdata im Datatype-Objekt abspeichern. -- Meine Homepage [ - Antworten - Zitieren - Direktlink - ] |
25.10.2005, 15:07 Uhr thomas Posts: 7718 Nutzer |
@Mazze:Zitat: Trotzdem sehe ich noch nicht, warum du unbedingt das Datatype-Object als Datentyp benutzen mußt. IMHO hat das viele Nachteile. Z.B. ist nach dem Laden immer noch die Datei gesperrt. D.h. du kannst nicht eine Grafik laden, sie verändern und unter dem selben Namen wieder abspeichern. Oder die Datei löschen, während das Programm noch mit der Grafik arbeitet. Ich finde, es wäre ein besserer Ansatz, einen eigenen Datentyp zu entwerfen, der eine Kopie der Bitmap enthält.Dann kannst du nach dem Laden das Datatype-Object und damit auch die Datei freigeben. Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
25.10.2005, 17:53 Uhr Mazze Posts: 263 Nutzer |
@thomas: OK, natürlich kann ich das Datatype temporär zum Laden und Speichern verwenden. Das funktioniert vermutlich bei >=15 Bit Bildern problemlos. Aber was passiert, wenn ich ein <=8 Bit Bild lade, die DestBitmap kopiere und das Datatype freigebe? Werden dann die vom Datatype allozierten Stifte wieder freigegeben und die Farben verändern sich? -- Meine Homepage [ - Antworten - Zitieren - Direktlink - ] |
25.10.2005, 18:03 Uhr thomas Posts: 7718 Nutzer |
Zitat: Ja. Es sei denn, du lädst das Originalbild (also PDTA_Remap,FALSE) und rasterst es selbst für den Screen. Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > Datatypes Problem | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |