ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > Welcher fehler im Programm? | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
01.02.2006, 23:34 Uhr MaikG Posts: 5172 Nutzer |
Ich hab hier ein Programmteil, der eigentlich Bilder über Datatypes zeigen soll. Unter AGA(bzw. dazu umlenken) geht das auch, nur leider nicht auf Graka. Ein Screen öffnet sich, das Bild wird jedoch nicht dargestellt. Sieht da jemand den Fehler? Hab keinen gefunden(Anfänger), notfalls müsste ich ein Programm das die Funktion übernimmt einfügen. WORD showdatatypepicture(struct FMHandle *h,struct DataType *dt,struct CMenuConfig *cmc) { struct DataTypeHeader *dth; Object *obj; struct ShowScreen shows; struct BitMapHeader *bmhd=0; ULONG modeid=0; struct BitMap *bm; struct gpLayout layout; ULONG *creg,*palette=0; LONG ncol,crsize,palsize; UBYTE *src; LONG type; WORD ret=0; changename(h->owner,cmc->label); priority(cmc); memseti(&shows,0,sizeof(struct ShowScreen)); dth=dt->dtn_Header; if(h->flags&OFDECRUNCH) { type=DTST_RAM; src=h->decbuffer; } else { type=DTST_FILE; src=h->filename; } pictureinfo(h,0,0,0,0,dth->dth_Name); if(!(obj=NewDTObject(src,DTA_SourceType,type,DTA_GroupID,GID_PICTURE,PDTA_Remap,TRUE,TAG_DONE))) goto error; if(GetDTAttrs(obj,PDTA_ModeID,&modeid,PDTA_BitMapHeader,&bmhd,TAG_DONE)!=2) goto error; pictureinfo(h,bmhd->bmh_Width,bmhd->bmh_Height,bmhd->bmh_Depth,modeid,dth->dth_Name); layout.MethodID=DTM_PROCLAYOUT; layout.gpl_GInfo=NULL; layout.gpl_Initial=TRUE; if(!DoDTMethodA(obj,NULL,NULL,(Msg)&layout)) goto error; if(GetDTAttrs(obj,PDTA_BitMap,&bm,PDTA_CRegs,&creg,PDTA_NumColors,&ncol,TAG_DONE)!=3) goto error; if(!bm||!creg||!ncol) goto error; crsize=(ncol*3)*4; palsize=crsize+2*4; palette=allocvec(h->owner,palsize,MEMF_CLEAR); if(!palette) goto error; palette[0]=ncol<<16; CopyMem(creg,&palette[1],crsize); if(openshowscreen(h->owner,bmhd->bmh_Width,bmhd->bmh_Height,bmhd->bmh_Depth,modeid,bmhd->bmh_Width,bmhd->bmh_Height,bmhd->bmh_Depth,&shows)) { LoadRGB32(&shows.screen->ViewPort,palette); BltBitMap(bm,0,0,shows.bitmap,0,0,bmhd->bmh_Width,bmhd->bmh_Height,0xC0,0xFF, NULL); WaitBlit(); SetPointer(shows.window,shows.mouse,2,16,0,0); ret=waitbutton(shows.window)+1; closeshowscreen(&shows); } goto picerr; error: if(!ret) requestmsg(h->owner->workname,0,MSG_OK,MSG_MAIN_DATATYPEERROR,dth->dth_Name); picerr: freemem(palette); if(obj) DisposeDTObject(obj); return(ret); } WORD openshowscreen(struct FMList *list,WORD wide,WORD high,WORD deep,ULONG modeid,WORD realw,WORD realh,WORD reald,struct ShowScreen *shows) { struct Rectangle spos, dclip, txto, stdo, maxo; WORD oscan,apu2; ULONG scrtags[24]; extern struct GfxBase *GfxBase; memseti(scrtags,0,24*4); shows->gfxbase=GfxBase;shows->tempbm=0; shows->screen=0; shows->window=0; shows->bitmap=0; shows->mouse=0; shows->mouse=allocvec(list,32,MEMF_CHIP|MEMF_CLEAR); if(!shows->mouse) goto serr; if(!(shows->bitmap=AllocBitMap(realw,realh,reald,BMF_CLEAR|BMF_DISPLAYABLE|BMF_INTERLEAVED,0))) { if(!(shows->bitmap=AllocBitMap(realw,realh,reald,BMF_CLEAR|BMF_DISPLAYABLE,0))) { requestmsg(list->workname,0,MSG_OK,MSG_MAIN_ERRNOBITMAP); goto serr; } } if(ModeNotAvailable(modeid)) modeid=modefallback(modeid,wide,high,deep); spos.MinX=0; spos.MinY=0; oscan=((QueryOverscan(modeid,&txto,OSCAN_TEXT))&&(QueryOverscan(modeid,&stdo,OSCAN_STANDARD))&&(QueryOverscan(modeid,&maxo,OSCAN_MAX))); scrtags[0]=SA_Left; scrtags[1]=spos.MinX; scrtags[2]=SA_Top; scrtags[3]=spos.MinY; scrtags[4]=SA_Width; scrtags[5]=wide; scrtags[6]=SA_Height; scrtags[7]=high; scrtags[8]=SA_Depth;if(fmmain.kick<39&&deep>6) scrtags[9]=6; else scrtags[9]=deep; scrtags[10]=SA_Type; scrtags[11]=CUSTOMSCREEN; scrtags[12]=SA_BitMap; scrtags[13]=(ULONG)(shows->bitmap); scrtags[14]=SA_DisplayID; scrtags[15]=modeid; scrtags[16]=SA_Quiet; scrtags[17]=1; scrtags[18]=SA_AutoScroll; scrtags[19]=1; scrtags[20]=SA_BackFill; scrtags[21]=(ULONG)LAYERS_NOBACKFILL; if (oscan) { clipit(wide,high,&spos,&dclip,&txto,&stdo,&maxo); scrtags[22]=SA_DClip; scrtags[23]=(ULONG)&dclip; } if (!(shows->screen=OpenScreenTagList(0,(struct TagItem*)scrtags))) { requestmsg(list->workname,0,MSG_OK,MSG_MAIN_SCRERR1); goto serr; } if (!(shows->window=OpenWindowTags(0, WA_Left,0,WA_Top,0,WA_Width,wide,WA_Height,high, WA_IDCMP,IDCMP_MOUSEBUTTONS|IDCMP_ACTIVEWINDOW|IDCMP_VANILLAKEY, WA_Flags,WFLG_BACKDROP|WFLG_BORDERLESS|WFLG_ACTIVATE|WFLG_RMBTRAP|WFLG_NOCAREREFRESH, WA_BackFill,LAYERS_NOBACKFILL,WA_SimpleRefresh,TRUE, WA_CustomScreen,shows->screen,WA_BusyPointer,TRUE, TAG_DONE))) { requestmsg(list->workname,0,MSG_OK,MSG_MAIN_WINERR1); goto serr; } apu2=1; shows->tempbm=AllocBitMap(realw,1,reald,BMF_CLEAR,0); printf("realw reald: %ld %ld ", realw, reald); CopyMem(&shows->screen->RastPort,&shows->temprp,sizeof(struct RastPort)); shows->temprp.Layer=0;shows->temprp.BitMap=shows->tempbm; if(!shows->tempbm||!apu2) { requestmsg(list->workname,0,MSG_OK,MSG_MAIN_ERRNOBITMAP); goto serr; } return(1); serr: closeshowscreen(shows); return(0); } [ - Antworten - Zitieren - Direktlink - ] |
02.02.2006, 09:11 Uhr Solar Posts: 3680 Nutzer |
Da geben sich die Admins solche Mühe mit einem [ code ] - Tag, das sogar Syntax Highlighting kann, und keiner nutzt es... in so einer Code-Wüste will doch niemand herumstochern... Zur AmigaOS API kann ich nichts sagen, aber:
C code:WORD showdatatypepicture(struct FMHandle *h,struct DataType *dt,struct CMenuConfig *cmc) { struct DataTypeHeader *dth; Object *obj; struct ShowScreen shows; struct BitMapHeader *bmhd=0; ULONG modeid=0; struct BitMap *bm; struct gpLayout layout; ULONG *creg,*palette=0; LONG ncol,crsize,palsize; UBYTE *src; LONG type; WORD ret=0; changename(h->owner,cmc->label); priority(cmc); memseti(&shows,0,sizeof(struct ShowScreen)); dth=dt->dtn_Header; if(h->flags&OFDECRUNCH) { type=DTST_RAM; src=h->decbuffer; } else { type=DTST_FILE; src=h->filename; } pictureinfo(h,0,0,0,0,dth->dth_Name); if(!(obj=NewDTObject(src,DTA_SourceType,type,DTA_GroupID,GID_PICTURE,PDTA_Remap,TRUE,TAG_DONE))) goto error; if(GetDTAttrs(obj,PDTA_ModeID,&modeid,PDTA_BitMapHeader,&bmhd,TAG_DONE)!=2) goto error; pictureinfo(h,bmhd->bmh_Width,bmhd->bmh_Height,bmhd->bmh_Depth,modeid,dth->dth_Name); layout.MethodID=DTM_PROCLAYOUT; layout.gpl_GInfo=NULL; layout.gpl_Initial=TRUE; if(!DoDTMethodA(obj,NULL,NULL,(Msg)&layout)) goto error; if(GetDTAttrs(obj,PDTA_BitMap,&bm,PDTA_CRegs,&creg,PDTA_NumColors,&ncol,TAG_DONE)!=3) goto error; if(!bm||!creg||!ncol) goto error; crsize=(ncol*3)*4; palsize=crsize+2*4; palette=allocvec(h->owner,palsize,MEMF_CLEAR); if(!palette) goto error; palette[0]=ncol<<16; CopyMem(creg,&palette[1],crsize); if(openshowscreen(h->owner,bmhd->bmh_Width,bmhd->bmh_Height,bmhd->bmh_Depth,modeid,bmhd->bmh_Width,bmhd->bmh_Height,bmhd->bmh_Depth,&shows)) { LoadRGB32(&shows.screen->ViewPort,palette); BltBitMap(bm,0,0,shows.bitmap,0,0,bmhd->bmh_Width,bmhd->bmh_Height,0xC0,0xFF, NULL); WaitBlit(); SetPointer(shows.window,shows.mouse,2,16,0,0); ret=waitbutton(shows.window)+1; closeshowscreen(&shows); } goto picerr; error: if(!ret) requestmsg(h->owner->workname,0,MSG_OK,MSG_MAIN_DATATYPEERROR,dth->dth_Name); picerr: freemem(palette); if(obj) DisposeDTObject(obj); return(ret); } WORD openshowscreen(struct FMList *list,WORD wide,WORD high,WORD deep,ULONG modeid,WORD realw,WORD realh,WORD reald,struct ShowScreen *shows) { struct Rectangle spos, dclip, txto, stdo, maxo; WORD oscan,apu2; ULONG scrtags[24]; extern struct GfxBase *GfxBase; memseti(scrtags,0,24*4); shows->gfxbase=GfxBase;shows->tempbm=0; shows->screen=0; shows->window=0; shows->bitmap=0; shows->mouse=0; shows->mouse=allocvec(list,32,MEMF_CHIP|MEMF_CLEAR); if(!shows->mouse) goto serr; if(!(shows->bitmap=AllocBitMap(realw,realh,reald,BMF_CLEAR|BMF_DISPLAYABLE|BMF_INTERLEAVED,0))) { if(!(shows->bitmap=AllocBitMap(realw,realh,reald,BMF_CLEAR|BMF_DISPLAYABLE,0))) { requestmsg(list->workname,0,MSG_OK,MSG_MAIN_ERRNOBITMAP); goto serr; } } if(ModeNotAvailable(modeid)) modeid=modefallback(modeid,wide,high,deep); spos.MinX=0; spos.MinY=0; oscan=((QueryOverscan(modeid,&txto,OSCAN_TEXT))&&(QueryOverscan(modeid,&stdo,OSCAN_STANDARD))&&(QueryOverscan(modeid,&maxo,OSCAN_MAX))); scrtags[0]=SA_Left; scrtags[1]=spos.MinX; scrtags[2]=SA_Top; scrtags[3]=spos.MinY; scrtags[4]=SA_Width; scrtags[5]=wide; scrtags[6]=SA_Height; scrtags[7]=high; scrtags[8]=SA_Depth; if(fmmain.kick<39&&deep>6) scrtags[9]=6; else scrtags[9]=deep; scrtags[10]=SA_Type; scrtags[11]=CUSTOMSCREEN; scrtags[12]=SA_BitMap; scrtags[13]=(ULONG)(shows->bitmap); scrtags[14]=SA_DisplayID; scrtags[15]=modeid; scrtags[16]=SA_Quiet; scrtags[17]=1; scrtags[18]=SA_AutoScroll; scrtags[19]=1; scrtags[20]=SA_BackFill; scrtags[21]=(ULONG)LAYERS_NOBACKFILL; if (oscan) { clipit(wide,high,&spos,&dclip,&txto,&stdo,&maxo); scrtags[22]=SA_DClip; scrtags[23]=(ULONG)&dclip; } if (!(shows->screen=OpenScreenTagList(0,(struct TagItem*)scrtags))) { requestmsg(list->workname,0,MSG_OK,MSG_MAIN_SCRERR1); goto serr; } if (!(shows->window=OpenWindowTags(0, WA_Left,0,WA_Top,0,WA_Width,wide,WA_Height,high, WA_IDCMP,IDCMP_MOUSEBUTTONS|IDCMP_ACTIVEWINDOW|IDCMP_VANILLAKEY, WA_Flags,WFLG_BACKDROP|WFLG_BORDERLESS|WFLG_ACTIVATE|WFLG_RMBTRAP|WFLG_NOCAREREFRESH, WA_BackFill,LAYERS_NOBACKFILL,WA_SimpleRefresh,TRUE, WA_CustomScreen,shows->screen,WA_BusyPointer,TRUE, TAG_DONE))) { requestmsg(list->workname,0,MSG_OK,MSG_MAIN_WINERR1); goto serr; } apu2=1; shows->tempbm=AllocBitMap(realw,1,reald,BMF_CLEAR,0); printf("realw reald: %ld %ld ", realw, reald); CopyMem(&shows->screen->RastPort,&shows->temprp,sizeof(struct RastPort)); shows->temprp.Layer=0;shows->temprp.BitMap=shows->tempbm; if(!shows->tempbm||!apu2) { requestmsg(list->workname,0,MSG_OK,MSG_MAIN_ERRNOBITMAP); goto serr; } return(1); serr: closeshowscreen(shows); return(0); } [ - Antworten - Zitieren - Direktlink - ] |
02.02.2006, 10:15 Uhr MaikG Posts: 5172 Nutzer |
>Da geben sich die Admins solche Mühe mit einem [ code ] - Tag, das >sogar Syntax Highlighting kann, und keiner nutzt es... in so einer >Code-Wüste will doch niemand herumstochern... Ich vergesse immer wie das geht. @Admin wenn das z.B. wo fett und kursiv steht währe müsste man das nicht auswendig lernen. >Zur AmigaOS API kann ich nichts sagen, aber: >o Mehr Leerzeichen (vor und nach Operatoren, zwischen Klammern und Inhalt); >o Kommentieren! >o evtl. <assert.h> statt "goto error" Der Programmteil ist ja nicht von mir, ich will ihn nur fixen. [ - Antworten - Zitieren - Direktlink - ] |
02.02.2006, 10:36 Uhr thomas Posts: 7718 Nutzer |
Du solltest es neu schreiben. Sowas umständliches habe ich noch nicht gesehen. Wozu soll das denn alles gut sein ? Der Fehler dürfte sein, daß die geladene Bitmap nicht mit dem Pixelformat des Screens übereinstimmt. Beim Öffnen der Datei wird zwar PDTA_Remap,TRUE mitgegeben, aber kein Pointer auf einen Screen. Dementsprechend kann die Bitmap auch nicht für den Screen gerendert werden. Entweder ich mache zuerst den Screen auf und lasse das Bild dann für diesen Screen rendern, oder ich öffne erst die Datei und dann einen Screen, der genau zu dem Bild paßt. Beides mischen geht nicht. Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
02.02.2006, 13:29 Uhr _PAB_ Posts: 3016 Nutzer |
@MaikG: Du suchst den "Hilfe"-Link in der oberen Navigationszeile ? http://www.amiga-news.de/forum/help.php [ - Antworten - Zitieren - Direktlink - ] |
02.02.2006, 13:44 Uhr Holger Posts: 8116 Nutzer |
Zitat:Zwischen Fehlerbedingungen und Annahmen besteht doch ein gewaltiger Unterschied. assert ist keine Alternative zu einem Abbruch im Fehlerfall. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
02.02.2006, 13:59 Uhr Holger Posts: 8116 Nutzer |
Zitat: Ach, die Chancen stehen gar nicht mal so schlecht. Schließlich legt er die Screen-BitMap ja über AllocBitMap an. (Kann man leicht übersehen, bei diesem Code...) Deshalb werden beide mit ziemlicher Sicherheit AGA-BitMaps sein. Nur daß RTG-Screens eine solche BitMap natürlich nicht anzeigen können... Mich wundert eher, daß sich überhaupt ein Screen öffnet. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
02.02.2006, 18:50 Uhr MaikG Posts: 5172 Nutzer |
>Du solltest es neu schreiben. Ich hab nur ein C Beispiel ohne Screen. Ggf muss das auch "eingepasst" werden. >Der Fehler dürfte sein, daß die geladene Bitmap nicht mit >dem Pixelformat des Screens übereinstimmt. Beim Öffnen der >Datei wird zwar PDTA_Remap,TRUE mitgegeben, aber kein >Pointer auf einen Screen. Dementsprechend kann die Bitmap >auch nicht für den Screen gerendert werden. Ich hab schon Remap FALSE gemacht und V43(24 Bit) gesetzt. Wird auch als 24 Bit erkannt und ein 24 Bit Screen geöffnet. >@MaikG: >Du suchst den "Hilfe"-Link in der oberen Navigationszeile ? >http://www.amiga-news.de/forum/help.php Ich weiss es steht unter hilfe Aweb 3.5.07 hat aber ein Problem mit dem Refresh, wenn man was falsches macht ist der geschriebene Text weck. Kannst du das nicht bei dem fett+kursiv hinpacken, wenigstens in Programmierung? >Nur daß RTG-Screens eine solche BitMap natürlich nicht anzeigen >können... Wenn die Bitmap in 24 Bit vorliegt gehts aber auch nicht(V43). >Mich wundert eher, daß sich überhaupt ein Screen öffnet. Warum nicht? Es wird immer der korrekte Screen mit dem korrekten Fenster geöffnet. Es kann sein das ich Unterprogramme die benötigt werden hier nicht gepostet habe. [ - Antworten - Zitieren - Direktlink - ] |
02.02.2006, 19:45 Uhr Holger Posts: 8116 Nutzer |
Zitat:Welche? Du hantierst mit mindestens zwei verschiedenen BitMaps herum, einer, die Du von DataType bekommst und einer, die Du selbst per AllocBitMap() anlegst. Letztere wird angelegt, ohne das die OS-Funktion den geringsten Hinweis darauf bekommt, welche ModeID der Screen hinterher haben wird. Somit hast Du gleich zwei potentielle Inkompatiblitäten in Deinem Programm, genaugenommen drei, weil Du erst danach überprüfst, ob die ModeID gültig ist und sie dann möglicherweise noch mal änderst. Mal abgesehen davon, daß das alles überhaupt nicht nötig ist. Öffne einfach einen Screen und Du bekommst eine kompatible BitMap frei Haus. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
03.02.2006, 09:47 Uhr Solar Posts: 3680 Nutzer |
Zitat: Ein assert() ist ein Abbruch im Fehlerfall... Ich hab' nicht in's Detail geschaut, nur flugs den Code eingerückt und in code-Tags gesetzt. Aber "goto error" ist mir ein bißchen zu sehr VisualBasic... normalerweise läßt sich das besser lösen. [ - Antworten - Zitieren - Direktlink - ] |
03.02.2006, 13:51 Uhr Holger Posts: 8116 Nutzer |
Zitat:Dann meinst Du ein anderes assert als ich. Für mich ist assert() etwas, das man sogar abschalten kann. Ganz abgesehen davon, daß ich schon Programme erlebt habe, die mir mit assertion-Fehlermeldungen die Konsolen vollgekleistert haben, aber gar nicht daran dachten, sich zu beenden (in einigen Fällen: zum Glück). Ich weiß auch nicht, inwieweit assert einen sauberen Ausstieg inkl. Freigeben der Resourcen ermöglichen soll, außer es verwendet intern doch goto. Zitat:"normalerweise" ist dehnbar. Ich bin auch kein Freund von goto; unter C++ oder anderen zeitgemäßen Sprachen würde ich sofort exceptions empfehlen. Oder halt return, wenn kein Rückgabewert verlangt wurde und beim Verlassen des Scope korrekt aufgeräumt wird. Bei plain C gibt es fast immer nur eine Alternative: dutzende verschachtelte if() Anweisungen. Und da laß ich mitunter ein goto durchgehen... Wobei es bei dem Code dieses Threads nach Entfernung aller unnötigen Operationen wahrscheinlich wirklich ohne goto gehen sollte. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
03.02.2006, 14:29 Uhr Solar Posts: 3680 Nutzer |
Zitat: Korrekt. NDEBUG definiert, und schon sind die assert()s draußen. zumindest die der Standardbibliothek; man kann sich natürlich auch selbst eine assert()-Funktion basteln. Zitat: assert() ruft im Fehlerfall raise(SIGABRT). Ob der Default-Handler für SIGABRT Dateien flusht und schließt und temporäre Dateien entfernt, ist implementierungsabhängig. Wenn ein Programm einen SIGABRT-Handler installiert, der zum Aufrufer (raise()) zurückkehrt, ruft assert() exit( EXIT_FAILURE ). In keinem Fall darf assert() im Fehlerfall zum Aufrufer zurückkehren. Das sagt der Standard. Was die jeweils benutzte C-Lib daraus macht... [ - Antworten - Zitieren - Direktlink - ] |
03.02.2006, 14:36 Uhr MaikG Posts: 5172 Nutzer |
>Welche? Wenn der Datatype 24 Bit liefert(V43), dann werden auch 24 Bit erkannt. >Du hantierst mit mindestens zwei verschiedenen BitMaps >herum, einer, die Du von DataType bekommst und einer, >die Du selbst per AllocBitMap() anlegst. >Letztere wird angelegt, ohne das die OS-Funktion den >geringsten Hinweis darauf bekommt, welche ModeID der >Screen hinterher haben wird. Also eigentlich habe ich mich nie richtig mit dem ganzen beschäftigt, ich hatte für DTypes verwendung immer Beispielprogramme. Die hab ich nach meinen bedürfnissen angepasst und es lief dann. >Somit hast Du gleich zwei potentielle Inkompatiblitäten in >Deinem Programm, genaugenommen drei, weil Du erst danach >überprüfst, ob die ModeID gültig ist und sie dann möglicherweise >noch mal änderst. >Mal abgesehen davon, daß das alles überhaupt nicht nötig ist. >Öffne einfach einen Screen und Du bekommst eine kompatible BitMap >frei Haus. Ist ja nicht mein Programm, ich hab auch schon gesehen das bei AllocBitmap einmal Interleaved angegenen wird wenn das nicht geht nochmal AllocBitmap ohne Interleaved. Laut AutoDocs macht das OS das selbst. Ich hab unter C ein Beispiel mit DType auf einem Fenster. Screen öffnen ist klar, aber vorher brauche ich die Bilddimensionen um bestimmen zu können was für ein Schirm ich öffnen möchte. Dann ist da ja noch was mit der Colormap, ich hab das unter Basic weiss aber nicht wie es unter C geht. Gibts nicht irgendwo ein Beispiel mit Screen? [ - Antworten - Zitieren - Direktlink - ] |
03.02.2006, 14:43 Uhr Holger Posts: 8116 Nutzer |
Zitat:Eben—deswegen sind assertions auch nur angebracht, wenn es um Bedingungen geht, die bei einem fehlerfreien Programm immer erfüllt sind. In diesem Fall geht es aber um Bedingungen, die auch bei fehlerfreien Porgramm nicht erfüllt sein können, nämlich um Rückgabewerte der OS-Funktionen beim Einladen/Analysieren eines Bildes. Die muß man immer prüfen, auch wenn man nicht debug't. Aber gut—Du hast Dir das Programm ja nicht so genau angesehen... mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
03.02.2006, 15:10 Uhr Holger Posts: 8116 Nutzer |
Zitat: Ich hatte eigentlich gehofft, daß das jemand anderes macht... Ich sitze hier eigentlich nicht auf Tonnen von Beispielsourcen. Wenn Du schon ein Beispiel mit Fenster hast, passe ich es Dir gerne an, falls es brauchbar ist und keiner hier schon ein fertiges screen-Beispiel hat. Du müßtest Dein Fenster-Beispiel nur hier posten... mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
03.02.2006, 16:30 Uhr Solar Posts: 3680 Nutzer |
Zitat: Selbst wenn würd's mir nix bringen. Als meine C/C++-Kenne anfing, für API-Programmierung auszureichen, war Amiga leider schon so auf dem absteigenden Ast, das ich mir das nicht mehr angetan habe. [ - Antworten - Zitieren - Direktlink - ] |
03.02.2006, 17:26 Uhr whose Posts: 2156 Nutzer |
@MaikG: Ich sags mal so: Normal ist es nicht besonders sinnvoll, den Screen nach den Bildeigenschaften zu erstellen, weil es, je nach Hardware, einen passenden Screen-Modus dann und wann schon mal nicht geben könnte Für Screens habe ich jetzt ad hoc auch keine Quellen parat, ich kann Dir nur sagen, daß es technisch im Grunde nicht anders funktioniert wie mit einem Fenster. Letztendlich blittet man die vom Datatype erhaltene Bitmap ja "nur" in die Screen-Bitmap statt in die des Fensters. Ist zwar nicht gerade die feine Englische, aber erlaubt. Zum Thema "wie bastel ich einen ViewPort nach den Vorgaben von Bildeigenschaften" kann ich leider kaum etwas sagen, weil ich mich damit nie tiefer beschäftigt habe. In der Theorie sollte das aber schon mit Deinem Programm problemlos machbar sein, sofern Du die Bildeigenschaften vollständig ausliest und den Screen exakt nach den Bildeigenschaften erstellst (das schließt auch Pixelformate mit ein!). Auf ModeIDs solltest Du in diesem Fall aber verzichten, da Du den Screen ja selbst erstellst. Danach sollte es dann kein Problem sein, die vom Datatype erhaltene Bitmap platt in die Bitmap des Screens zu schreiben (ob per Blit...()-Funktionen oder mittels CopyMem() u.ä. ist in diesem Fall Wurst wie Käse, da nicht konvertiert werden muß). Ich weiß jetzt allerdings nicht, ob das auf Dein Programm zutrifft, ich habs nur kurz überflogen und etwas unübersichtlich ist es noch dazu Da es aber mit AGA-Screens funktioniert, scheint der von Dir erstellte Screen das Problem zu sein. So, wie sich mir das jetzt auf die Schnelle darstellt, würde ich mein Augenmerk einmal auf die Sache mit LoadRGB32 und folgende richten. Das macht bei einem 24Bit-Bild irgendwie gar keinen Sinn. Es sieht ganz so aus, als wäre dieses von Dir angepaßte Programm rein für AGA/ECS gedacht. Das macht den Umbau naturgemäß etwas schwierig. Wenn Du Dich trotzdem etwas in Datatypes und deren Benutzung einarbeiten möchtest, kann ich Dir Thomas' Beispielquellen dazu nur wärmstens empfehlen. Schön einfach gehalten und vor allem alles Notwendige drin, was man zu dem Thema wissen sollte. Damit kommst Du schnell zu eigenen brauchbaren Ergebnissen. Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ - Antworten - Zitieren - Direktlink - ] |
03.02.2006, 18:40 Uhr MaikG Posts: 5172 Nutzer |
>Ich sitze hier eigentlich nicht auf Tonnen von Beispielsourcen. >Wenn Du schon ein Beispiel mit Fenster hast, passe ich es Dir gerne >an, falls es brauchbar ist und keiner hier schon ein fertiges >screen-Beispiel hat. >Du müßtest Dein Fenster-Beispiel nur hier posten... Okay ist das von Thomas seine Seite: C++ code:#include <proto/exec.h> #include <proto/dos.h> #include <proto/intuition.h> #include <proto/graphics.h> #include <proto/datatypes.h> #include <datatypes/pictureclass.h> long min (long a,long b) {return (a < b ? a : b);} int main (void) { struct RDArgs *rdargs; static struct { char *file; char *pubscreen; } args = {NULL}; int rc = RETURN_ERROR; struct Screen *scr; Object *o; struct BitMapHeader *bmhd; struct BitMap *bm; long winw,winh; long winx,winy; struct Window *win; BOOL cont; struct IntuiMessage *mess; if (rdargs = ReadArgs ("FILE/A,PUBSCREEN/K",(APTR)&args,NULL)) { if (scr = LockPubScreen (args.pubscreen)) { if (o = NewDTObject (args.file, DTA_GroupID,GID_PICTURE, PDTA_Remap,TRUE, PDTA_Screen,scr, TAG_END)) { DoDTMethod (o,NULL,NULL,DTM_PROCLAYOUT,NULL,TRUE); GetDTAttrs (o, PDTA_BitMapHeader,&bmhd, PDTA_DestBitMap,&bm, TAG_END); winw = min(scr->Width, bmhd->bmh_Width); winh = min(scr->Height, bmhd->bmh_Height); winx = (scr->Width - winw) >> 1; winy = (scr->Height - winh) >> 1; if (win = OpenWindowTags (NULL, WA_CustomScreen,scr, WA_Left,winx, WA_Top,winy, WA_Width,winw, WA_Height,winh, WA_Flags,WFLG_BORDERLESS|WFLG_ACTIVATE, WA_IDCMP,IDCMP_MOUSEBUTTONS|IDCMP_VANILLAKEY, TAG_END)) { BltBitMapRastPort (bm,0,0,win->RPort,0,0,winw,winh,0xC0); rc = RETURN_OK; cont = TRUE; do { WaitPort (win->UserPort); while (mess = (struct IntuiMessage *)GetMsg (win->UserPort)) { switch (mess->Class) { case IDCMP_MOUSEBUTTONS: if (mess->Code == IECODE_LBUTTON) cont = FALSE; break; case IDCMP_VANILLAKEY: if (mess->Code == 0x1b) /* Esc */ cont = FALSE; break; } ReplyMsg ((struct Message *)mess); } } while (cont); CloseWindow (win); } DisposeDTObject (o); } UnlockPubScreen (NULL,scr); } FreeArgs (rdargs); } PrintFault (IoErr(),NULL); return (rc); } @whose der schlimme Code müsste dir eigentlich bekannt vor kommen ist von Filemaster... [ Dieser Beitrag wurde von MaikG am 03.02.2006 um 18:43 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
03.02.2006, 23:43 Uhr thomas Posts: 7718 Nutzer |
Hier ist ein Beispiel mit Screen:C code:#include <proto/exec.h> #include <proto/dos.h> #include <proto/graphics.h> #include <proto/intuition.h> #include <proto/datatypes.h> #include <datatypes/pictureclass.h> #include <string.h> int main (void) { struct RDArgs *rdargs; struct { char *file; } args; Object *dto; struct BitMapHeader *bmhd; struct BitMap *bm; ULONG modeid; ULONG ncols; ULONG *cregs; ULONG *colortable; struct Screen *scr; struct Window *win; struct IntuiMessage *mess; BOOL cont; if (rdargs = ReadArgs ("FILE/A",(ULONG *)&args,NULL)) { if (dto = NewDTObject (args.file,DTA_GroupID,GID_PICTURE,PDTA_DestMode,PMODE_V43,TAG_END)) { DoDTMethod (dto,NULL,NULL,DTM_PROCLAYOUT,NULL,1); GetDTAttrs (dto, PDTA_BitMapHeader,&bmhd, PDTA_BitMap,&bm, PDTA_ModeID,&modeid, PDTA_NumColors,&ncols, PDTA_CRegs,&cregs, TAG_END); if (scr = OpenScreenTags (NULL, SA_Width,bmhd->bmh_Width, SA_Height,bmhd->bmh_Height, SA_Depth,bmhd->bmh_Depth, SA_DisplayID,modeid, TAG_END)) { if (colortable = AllocVec (ncols * 12 + 8,MEMF_CLEAR)) { colortable[0] = ncols << 16; memcpy (&colortable[1],cregs,ncols * 12); LoadRGB32 (&scr->ViewPort,colortable); FreeVec (colortable); } if (win = OpenWindowTags (NULL, WA_CustomScreen,scr, WA_Width,scr->Width, WA_Height,scr->Height, WA_Flags,WFLG_BORDERLESS|WFLG_NOCAREREFRESH|WFLG_ACTIVATE, WA_IDCMP,IDCMP_MOUSEBUTTONS|IDCMP_VANILLAKEY, TAG_END)) { BltBitMapRastPort (bm,0,0,win->RPort,0,0,win->Width,win->Height,0xc0); cont = TRUE; do { if (Wait ((1L << win->UserPort->mp_SigBit) | SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C) cont = FALSE; while (mess = (struct IntuiMessage *) GetMsg (win->UserPort)) { cont = FALSE; ReplyMsg ((struct Message *) mess); } } while (cont); CloseWindow (win); } CloseScreen (scr); } DisposeDTObject (dto); } FreeArgs (rdargs); } else PrintFault (IoErr(),NULL); return (0); } Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
04.02.2006, 18:38 Uhr MaikG Posts: 5172 Nutzer |
Danke! Funktioniert. [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > Welcher fehler im Programm? | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |