amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > GA_BackFill [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- 2 [ - Beitrag schreiben - ]

27.07.2009, 08:35 Uhr

AGSzabo
Posts: 1663
Nutzer
hilfe, bei mir bewirkt das gadget-attribut GA_BackFill OFF zu setzen nichts! das colorwheel soll natürlich um sich herum die bestehende hintergrundfarbe durchlassen, so wie im farb-voreinsteller der pattern durchgelassen wird. siehe bild wie es NICHT sein soll: http://otaku.onlinehome.de/xui.png
--
e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 27.07.2009 um 08:38 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

27.07.2009, 09:13 Uhr

thomas
Posts: 7717
Nutzer

Zitat:
bei mir bewirkt das gadget-attribut GA_BackFill OFF zu setzen nichts

Natürlich nicht. Off bzw. NULL ist ja der Default.

Das Gadget benutzt EraseRect um den Hintergrund zu löschen. Dabei zieht ein evtl. installierter Backfill-Hook. Ist keiner installiert, wird der Bereich mit Farbe 0 gefüllt. Wenn du etwas anderes möchtest, mußt du einen entsprechenden Hook übergeben. Wie Hooks im Allgemeinen funktionieren, findest du bei der Beschreibung von utility.library/CallHookPkt und in den Kommentaren von utility/hooks.h. Wie ein Backfill-Hook im speziellen programmiert wird, findest du bei layers.library/InstallLayerHook.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

27.07.2009, 10:09 Uhr

AGSzabo
Posts: 1663
Nutzer
@thomas:

das mit der null finde ich verwirrend es geht ja so oder so nicht egal ob null oder 1.

aber aus den docs habe ich folgende lösung ausgegraben:

code:
move.l	layersbase(pc),a6
		move.l	wd_WLayer(a0),a0
		move.l	#LAYERS_NOBACKFILL,a1
		jsr	-198(a6)	;InstallLayerHook


das mache ich einmal geich nach dem öffnen des fensters und das problem ist fuer alle faelle erledigt. ich muss es nichtmal wider reuckgeaengig machen wenn ich das fenster schliesse.

danke,
Andreas

ps: in meinen includes fehlen einige routinendefinitionen, daher schreibe ich die offsets manchaml direkt hin.


--
e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 27.07.2009 um 10:11 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

27.07.2009, 14:14 Uhr

AGSzabo
Posts: 1663
Nutzer
oops, jetzt hab ich noch ein änliches roblem: ich zeichne ein Symbol mit DrawImage() aber es wird immer der Hintergrund mit farbe 0 überschrieben. es soll natürlch der hintergrund bleiben wie er ist, oder in der farbe gerendert werden die ich angebe.

ps: SetABPenDrMd() hab ich schon ausgetestet. mehr noch: der haken wird immer in schwarz gerendert. schwarz auf grau.

und btw, wie fülle ich mit einer "trueoclor-kachel"?

--
e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 27.07.2009 um 14:19 Uhr geändert. ]

[ Dieser Beitrag wurde von AGSzabo am 27.07.2009 um 15:28 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

28.07.2009, 12:36 Uhr

thomas
Posts: 7717
Nutzer
@AGSzabo:
Zitat:
ich zeichne ein Symbol mit DrawImage() aber es wird immer der Hintergrund mit farbe 0 überschrieben. es soll natürlch der hintergrund bleiben wie er ist, oder in der farbe gerendert werden die ich angebe.

Ein herkömmliches Image ist immer ein Rechteck. Transparenz gibt es da nicht. Das mit der Hintergrundfarbe könntest du evtl. mit PlanePick und PlaneOnOff hinbekommen, aber das beeinflußt auch die Farben des Symbols.

Wenn du echte Transparenz brauchst, dann mußt du es schon selber zeichnen. Üblicherweise würde man sich dafür ein BOOPSI-Image programmieren, dann könnstest du weiterhin DrawImage oder DrawImageState benutzen. Du kannst aber der Einfachheit halber auch deine eigene Zeichenroutine aufrufen.

Wenn deine GUI fontsensitiv sein soll, dann solltest du die Symbole ohnehin als Vektorgrafiken realisieren, die du beliebig skalieren kannst.

Zitat:
wie fülle ich mit einer "trueoclor-kachel"?

Was verstehst du unter einer Truecolor-Kachel ? Bitmaps kannst du einfach mit BltBitMapRastPort in dein Fenster zeichnen. Für den Fensterhintergrund würde man sinnvollerweise wieder auf einen Backfill-Hook zurückgreifen (einen echten, nicht LAYERS_NOBACKFILL).

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

28.07.2009, 15:32 Uhr

AGSzabo
Posts: 1663
Nutzer
@thomas:

> Was verstehst du unter einer Truecolor-Kachel ? Bitmaps kannst du einfach mit BltBitMapRastPort in dein Fenster zeichnen.

ja, bitmaps, zb eine von platte geladene muster. man müsste mit offsets arbeiten damit verschiedene rechtecke zusammen passen, zb der tabs inahlt-hintergrund und der tabs-griffe hitenrhgrund. evtl mit datatypes?

> Für den Fensterhintergrund würde man sinnvollerweise wieder auf einen Backfill-Hook zurückgreifen (einen echten, nicht LAYERS_NOBACKFILL).

unter os4.1 funzt der pseudo-hook anscheinend nicht oder anders.
--
e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 28.07.2009 um 15:34 Uhr geändert. ]

[ Dieser Beitrag wurde von AGSzabo am 28.07.2009 um 15:36 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

29.07.2009, 08:43 Uhr

AGSzabo
Posts: 1663
Nutzer
@thomas

ich lese gerade deine datatypes beispielsources und rätsele ob ich platz für die bitmap- und bitmapheader strukturen reservieren muss oder blos zeiger darauf. oder muss ich diese strukturen auch initialisieren? mit c kenne ich mich kaum aus.
--
e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ - Antworten - Zitieren - Direktlink - ]

29.07.2009, 12:28 Uhr

Thore
Posts: 2266
Nutzer
@AGSzabo:
Probiers mal nur mit Pointer aus, Du wirst es dann direkt bemerken ob Du Speicher reservieren musst oder nicht ;)
Programmieren lernt man auch durch Aha-Effekte beim selber Ausprobieren. Und das hilft oft mehr weiter als bereits vorgekauter Code.
Wenn Du Dir unsicher bist, mach ein Backup von deinem Programm, änder es ab und starte es einfach (oder RAM Disk für den kurz abgeänderten Testcode verwenden). Den Computer kannst du normalerweise nicht zerstören dadurch, höchstens neu Booten ist drin ;)

(Naja außer man programmiert Videomodi und verpasst dem Monitor ungesunde Frequenzen *g*)

[ - Antworten - Zitieren - Direktlink - ]

29.07.2009, 12:33 Uhr

AGSzabo
Posts: 1663
Nutzer
@Thore:

was glaubst du wieviel aha-effekte ich schon erlebt habe und wievel backups ich täglich mache schritt für schritt! aber seit es schokolade gibt, eh ich meine flachbildschirme gibt, sind die frequenzmäßig unkaputtbar!
--
e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ - Antworten - Zitieren - Direktlink - ]

29.07.2009, 12:43 Uhr

Thore
Posts: 2266
Nutzer
Und welchen Aha-Effekt hast Du mit der Bitmap und BMHD Struktur erzielt? =)

[ - Antworten - Zitieren - Direktlink - ]

29.07.2009, 12:55 Uhr

AGSzabo
Posts: 1663
Nutzer
@Thore:

es spricht auch in diesem fall ueberhaupt nix dagegen wenn ich auf die antwort von thomas warte, der diese sources anbietet. es muss nicht alles immer selbst erfunden werden, bis auf das rad natürlich ... obwohl, ich verwende ja das boopsi-teil...
--
e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ - Antworten - Zitieren - Direktlink - ]

29.07.2009, 13:55 Uhr

Thore
Posts: 2266
Nutzer
Bei der Standard API für Datatypes erfindest Du nichts neu, sondern lernst, wie man damit umgeht =)

Aber ich kann Dir die Lösung verraten: Pointer sind richtig.
GetDTAttrs liefert Dir den Pointer der entsprechenden bitmap oder bmhd zurück, welches dem angegebenen Datatype-Objekt angehörig ist.
Über DisposeDTObject wird dann das Objekt wieder gelöscht und mit ihm seine angehängten Strukturen, bmhd und bitmap müssen/dürfen also nicht manuell gefreed werden.

Ich hoff Du weißt wie man in Assembler mit Taglisten umgeht.

Falls ich Müll erzählt hab, korrigiert mich bitte mit 10 Peitschenhieben. ;)

[ - Antworten - Zitieren - Direktlink - ]

29.07.2009, 13:59 Uhr

AGSzabo
Posts: 1663
Nutzer
@Thore:

>Bei der Standard API für Datatypes erfindest Du nichts neu, sondern lernst, wie man damit umgeht =)

jaa

>Aber ich kann Dir die Lösung verraten:

mann bist du fies!

>Ich hoff Du weißt wie man in Assembler mit Taglisten umgeht.

xui verwendet verschachtelte taglisten zu erzeugen von objektbäumen.
--
e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ - Antworten - Zitieren - Direktlink - ]

29.07.2009, 15:58 Uhr

AGSzabo
Posts: 1663
Nutzer
OK,

ich habe datatypes als mittel zum backfill eingebaut wie im source von thomas erklärt. nur leider wird das bild immer auf ganz wenige farben runtergemappt, egal ob ich das Tag "remap" setzte oder nicht. mein screen ist aber sehr viel farbtief, es müsste die bitmap in viel mehr farben angezeigt werden.

ps, die "message" die an das obj mit DoMethod gesendet wird verstehe ich nicht. was macht das? wo finde ich die erklärt? ich hab schon in diversen includes gesucht...


--
e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 29.07.2009 um 16:59 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

29.07.2009, 17:08 Uhr

thomas
Posts: 7717
Nutzer

"Ganz wenige Farben" und "sehr viel farbtief" sind natürlich sehr präzise Angaben, da kann man genau erkennen, was du meinst. I-)


Die Zusammenhänge sind wie folgt:

Mit PDTA_Remap = FALSE bekommst du das Bild im Original, ohne daß die Farben verändert werden. Es wird wird nur ggf. auf 8 Bitplanes und 256 Farben heruntergerechnet, um mit "älteren" Programmen kompatibel zu sein.

Mit PDTA_Remap = TRUE wird das Bild in das Pixelformat und die Farbtiefe des Bildschirms umgerechnet, aber natürlich nur, wenn ein Bildschirm mit PDTA_Screen übergeben wurde.

Um dein Programm als "neueres" Programm zu kennzeichnen, das auch mit Truecolor-Bitmaps umgehen kann, mußt du PDTA_DestMode = PMODE_V43 setzen, sonst bekommst du immer planare Bitmaps mit max. 256 Farben.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

29.07.2009, 17:22 Uhr

AGSzabo
Posts: 1663
Nutzer
@thomas:
>PDTA_DestMode = PMODE_V43

danke, jetzt gehts. schade dass du das nicht in deinem source erwähnt hast...
--
e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ - Antworten - Zitieren - Direktlink - ]

31.07.2009, 11:10 Uhr

AGSzabo
Posts: 1663
Nutzer
BLIT TILES ROUTINE

hi,

diese monster-routine soll rechteckige bereiche mit einem bild füllen, so dass verschiedene rechtecke trotzdem vom muster her nahtlos aneinander passen. das bedeutet zB dass am linken oberen rand mit offests gearbeitet wird. leider füllt sich in manchen fällen der bereich nicht ganz, siehe bild: http://otaku.onlinehome.de/xuierror.jpg

wer kann mir einen tip geben? diese anfrage ist natürlich vollkommen auf freiwilliger basis! wer will der schaut sich das an, wer nicht will lässt es bleiben. wer den fehler findet wird im readme genannt, genau wie bei der value-to-dez routine und der listsort-routine!

mfg,
Andreas

code:
_xuiImageFill	; d0-d3	left, top, right, bottom
		; a0 bitmap		
		; a1 rastport		 > must all be valid, no testing
		; a2 bitmapheader	/

		movem.w	d0-d7,-(a7)
		pushm	a0/a1

		move.l	gfxbase(pc),a6

 STRUCTURE	ImageFillHelp,0
	UWORD	ifh_width
	UWORD	ifh_height
	UWORD	ifh_1stxoffset
	UWORD	ifh_1styoffset
	UWORD	ifh_restx
	UWORD	ifh_resty
	UWORD	ifh_xrepeats
	UWORD	ifh_yrepeats
	UWORD	ifh_currentx
	UWORD	ifh_currenty
	LABEL	ifh_SIZEOF
	APTR	ifh_bitmap
	APTR	ifh_rastport
	UWORD	ifh_left
	UWORD	ifh_top
	UWORD	ifh_right
	UWORD	ifh_bottom

		lea	-ifh_SIZEOF(a7),a7

		; startpunkt festlegen

		move.w	d0,ifh_currentx(a7)
		move.w	d1,ifh_currenty(a7)

		; left und top offset berechnen, damit
		; mehrere gefüllte flächen nahtlos zusammen passen

		moveq	#0,d4
		move.w	d0,d4
		divu.w	bmh_Width(a2),d4
		swap	d4
		move.w	d4,ifh_1stxoffset(a7)

		moveq	#0,d5
		move.w	d1,d5
		divu.w	bmh_Height(a2),d5
		swap	d5
		move.w	d5,ifh_1styoffset(a7)

		; höhe und breite, zahl der widerholungen und restgröße berechnen

		sub.w	d0,d2
		addq.w	#1,d2
		move.w	d2,ifh_width(a7)
		moveq	#0,d6
		move.w	d2,d6
		move.w	bmh_Width(a2),d2
		clr.w	ifh_xrepeats(a7)
		sub.w	d2,d6
		blt.b	.set_rx

		add.w	ifh_1stxoffset(a7),d6
		divu.w	d2,d6
		move.w	d6,ifh_xrepeats(a7)
		swap	d6

.set_rx		move.w	d6,ifh_restx(a7)

		sub.w	d1,d3
		addq.w	#1,d3
		move.w	d3,ifh_height(a7)
		moveq	#0,d7
		move.w	d3,d7
		move.w	bmh_Height(a2),d3
		clr.w	ifh_yrepeats(a7)
		sub.w	d3,d7
		blt.b	.set_ry

		add.w	ifh_1styoffset(a7),d7
		divu.w	d3,d7
		move.w	d7,ifh_yrepeats(a7)
		swap	d7

.set_ry		move.w	d7,ifh_resty(a7)

		; init x- and yrepcount

		moveq	#0,d6
		moveq	#0,d7

.loop		move.w	bmh_Width(a2),d4
		move.w	bmh_Height(a2),d5
		move.w	ifh_1stxoffset(a7),d0
		move.w	ifh_1styoffset(a7),d1

		tst.w	d6
		bne.b	.no_xoffset
		sub.w	d0,d4
		bra.b	.if_yoffset
.no_xoffset	moveq	#0,d0

.if_yoffset	tst.w	d7
		bne.b	.no_yoffset
		sub.w	d1,d5
		bra.b	.offsets_ok
.no_yoffset	moveq	#0,d1
.offsets_ok
		; nur noch ein rest übrig?

		cmp.w	ifh_xrepeats(a7),d6
		ble.b	.not_restx
		move.w	ifh_restx(a7),d4
.not_restx	cmp.w	ifh_yrepeats(a7),d7
		ble.b	.not_resty
		move.w	ifh_resty(a7),d5
.not_resty
		; test fit

		cmp.w	ifh_width(a7),d4
		ble.b	.if_higher
		move.w	ifh_width(a7),d4
.if_higher	cmp.w	ifh_height(a7),d5
		ble.b	.size_ok
		move.w	ifh_height(a7),d5
.size_ok
		; left top im dest-rastport

		move.w	ifh_currentx(a7),d2
		move.w	ifh_currenty(a7),d3		

		movem.l	ifh_SIZEOF(a7),a0/a1
		push	d6
		move.b	#$C0,d6
		jsr	_LVOBltBitMapRastPort(a6)
		pop	d6

		; advance x

		add.w	d4,ifh_currentx(a7)
		addq.w	#1,d6
		move.w	ifh_xrepeats(a7),d2
		addq.w	#1,d2
		cmp.w	d2,d6
		ble.b	.loop

		; reset xpos to left

		move.w	ifh_left(a7),ifh_currentx(a7)
		moveq	#0,d6

		; advance y

		add.w	d5,ifh_currenty(a7)
		addq.w	#1,d7
		move.w	ifh_yrepeats(a7),d3
		addq.w	#1,d3
		cmp.w	d3,d7
		ble.b	.loop

		lea	ifh_SIZEOF(a7),a7
		popm	a0/a1
		movem.w	(a7)+,d0-d7
		rts


--
e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ - Antworten - Zitieren - Direktlink - ]

31.07.2009, 12:15 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von AGSzabo:

diese monster-routine soll rechteckige bereiche mit einem bild füllen, so dass verschiedene rechtecke trotzdem vom muster her nahtlos aneinander passen. das bedeutet zB dass am linken oberen rand mit offests gearbeitet wird.


Wozu diese Offsets? Wenn Du rechteckige Kacheln hast, kannst Du diese doch ohne Tricks nahtlos aneinanderfügen. Für den Fall, daß ein zu blittendes Bitmap an einem Rand abgeschnitten werden soll, gibts die Funktion ClipBlit: http://w3.norman-interactive.com/C-Kurs_8_9.html


--
http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

31.07.2009, 12:40 Uhr

AGSzabo
Posts: 1663
Nutzer
@Mad_Dog:

eh, tolle homepage, wirklich, aber ich fürchte mein anliegen ist nicht richtig rübergekommen. ich weis aber auch nicht wie ich es jetzt beschreiben soll. aber vielleich verstet es ja noch jemand. ich überlege derweil ...
--
e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ - Antworten - Zitieren - Direktlink - ]

31.07.2009, 13:20 Uhr

thomas
Posts: 7717
Nutzer
@Mad_Dog:
Zitat:
Wozu diese Offsets?

Stell dir vor, du möchtest die Flächen von (0,0)-(99,99) und von (100,50)-(199,149) mit dem gleichen Muster füllen, das Muster ist sagen wir mal 45 Pixel breit und an der Nahtstelle, also von (100,50) bis (100,99) sollen die Muster aneinander passen. Dann mußt du mit Offsets arbeiten.


@AGSzabo:

Ich weiß nicht, ob es dir hilft, aber hier ist eine funktionierende Backfill-Funktion:

code:
void backfill_funct (struct Hook *hook,struct RastPort *rp,struct BackfillMsg *msg)

{
struct BitMap *srcbm = ((struct bminfo *)hook->h_Data)->bm;
long srcw = ((struct bminfo *)hook->h_Data)->w;
long srch = ((struct bminfo *)hook->h_Data)->h;
long srcx0 = msg->offsetx % srcw;
long srcy0 = msg->offsety % srch;
struct BitMap *destbm = rp->BitMap;
long destx0 = msg->bounds.MinX;
long desty0 = msg->bounds.MinY;
long destx1 = msg->bounds.MaxX + 1;
long desty1 = msg->bounds.MaxY + 1;
long srcx,srcy;
long destx,desty;
long blitw,blith;

desty = desty0;
srcy  = srcy0;
while (desty < desty1)
	{
	blith = min(desty1 - desty,srch - srcy);

	destx = destx0;
	srcx  = srcx0;
	while (destx < destx1)
		{
		blitw = min(destx1 - destx,srcw - srcx);

		BltBitMap(srcbm,srcx,srcy,destbm,destx,desty,blitw,blith,0xc0,0xff,NULL);

		destx += blitw;
		srcx = (srcx + blitw) % srcw;
		}

	desty += blith;
	srcy = (srcy + blith) % srch;
	}
}


Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

31.07.2009, 13:46 Uhr

AGSzabo
Posts: 1663
Nutzer
@thomas:

>Stell dir vor, du möchtest die Flächen von (0,0)-(99,99) und von (100,50)-(199,149) mit dem gleichen Muster füllen, das Muster ist sagen wir mal 45 Pixel breit und an der Nahtstelle, also von (100,50) bis (100,99) sollen die Muster aneinander passen. Dann mußt du mit Offsets arbeiten.

genau meine rede.:-)

>Ich weiß nicht, ob es dir hilft, aber hier ist eine funktionierende Backfill-Funktion:

ich hoffe die hast du jetzt nicht extra für mich geschrieben weil ich sie nämlich kaum verstehe (mein problem mit c). aber ich versuche es mal. ein hinweis was an meiner routine falsch ist würde mir besser helfen. ich brauche auch dieses backfill-hook dingens nicht. mir ist auch nicht klar warum dein code BlitBitmap statt meinem BltBitmapRastport benutzt... also wie gesagt, ich versuche es zu verstehen bis vielleicht eine direkte antwort kommt.
--
e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ - Antworten - Zitieren - Direktlink - ]

31.07.2009, 13:48 Uhr

Thore
Posts: 2266
Nutzer
@AGSzabo:
Dein Code:

moveq #0,d4
move.w d0,d4
divu.w bmh_Width(a2),d4
swap d4
move.w d4,ifh_1stxoffset(a7)

Kleine Anmerkungen:
moveq schreibt meines Wissens nur 8 Bit, die restlichen 24 Bit bleiben unberührt.
move.w d0,d4 schreibt 16 Bit, die vorderen 16 bit bleiben unberührt
d4 sollte daher besser mit clr.l d4 oder move.l #0,d4 geleert werden.

Dein Register-Retten geht hier auch nur auf Word, am besten machst Du hier longword, da Du z.B. swap verwendest, was 2 Words eines Registers tauscht.

Nur so als kleine Hinweise.
Möglicherweise behebt das dein Problem nicht, könnte aber andere Fehlerquellen ausschließen.

[ - Antworten - Zitieren - Direktlink - ]

31.07.2009, 14:23 Uhr

AGSzabo
Posts: 1663
Nutzer
@Thore:

moveq macht langwort sagt mein 68k referenzbuch. das weis ich schon lang. die register hab ich jetzt mal besser gerettet. danke!

ps: umgebungsbedignt um den aufruf der routine herum waren die datenregister nur bis bit 16 verwendet...

--
e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 31.07.2009 um 14:25 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

31.07.2009, 16:19 Uhr

Thore
Posts: 2266
Nutzer
Ups ja moveq kopiert zwar nur ein Byte, aber leert die übrigen Bits. Sorry mein Fehler.

Aber das swap tauscht die ersten 16 Bit mit den anderen 16 Bit, da wird also das komplette Register verwendet.

[ - Antworten - Zitieren - Direktlink - ]

31.07.2009, 17:29 Uhr

AGSzabo
Posts: 1663
Nutzer
es passt etwas in diesen thread: wenn ich unter os4 mein window resize (68k emuliertes prog) staut sich eine menge von IDCMP_NEWISZE messages auf und das fenster ist beim loslassen des mausbuttons noch eine weile mit den aufgestauten messages beschäftigt. wie kann ich das vom programm aus abwehren ohne es systemweit abzuschalten? wie macht man das normalerweise?
--
e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 31.07.2009 um 17:30 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

31.07.2009, 20:47 Uhr

thomas
Posts: 7717
Nutzer

Üblicherweise hat man im Hauptprogramm zwei geschachtelte Schleifen, die das Fenster behandeln. Die äußere Schleife hat als Bedingung einen Schalter, der besagt, ob das Programm weiterlaufen soll oder nicht. Sie enthält das Warten auf den Message-Port und die innere Schleife.

Die innere Schleife holt alle Messages ab und behandelt sie, bis keine mehr da sind. Dabei können Sachen, die schnell gehen, sofort behandelt werden und für Sachen, die länger dauern oder endgültig sind, merkt man sich die relevanten Angaben und macht es dann später außerhalb der Schleife.

Bei NewSize heißt das, du setzt einfach einen Schalter, daß sich die Fenstergröße geändert hat und nach der inneren Schleife, wenn alle Messages bearbeitet wurden, prüfst du den Schalter und zeichnest den Fensterinhalt neu. Einmal, nicht tausendmal.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

31.07.2009, 20:57 Uhr

AGSzabo
Posts: 1663
Nutzer
@thomas:

> die zwei schleifen

...genauso mache ich das. nur warte ich am selben port für viele fenster...und weis noch nicht wie ich das machen werde dass der schalter nur für ein fenster gillt, bzw dass ich weis für welches oder welche, falls (unwahrscheinlich) NEWISZEs von verschiedenen fenstern gleichzeitig kommen...

ich hatte gehofft dass es vielleicht ein flag oder eine funktion gibt um den ansturm zu beschränken...

ps, btw, so smooth wie os4.1 seine nativen fenster beim größeziehen on the fly refresht wird es ein 68k app niemals schaffen, oder?

pps: ich hab jezt einen refresh-schalter beim größeändern eingebaut. jetzt hängt der beim zeichnen nicht mehr soooo viek hinterher aber immerhin noch etwas... brauche noch einen anderen trick oder kniff


--
Sam os4.1, e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110


[ Dieser Beitrag wurde von AGSzabo am 31.07.2009 um 22:01 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

02.08.2009, 15:36 Uhr

AGSzabo
Posts: 1663
Nutzer
hi,

ich hab hier nochmal eine verbesserte version der bildausgabe meiner nahtlos-füll-funktion gemacht. vielleicht fällt jetzt jemandem das problem / die lösung auf.

http://otaku.onlinehome.de/xuierror.gif

und hier die bisherige routine: http://www.amiga-news.de/forum/thread.php?id=31614&BoardID=7#322854

EDIT

Jawoll, ich habe das problem in meinem code behoben und den fehler gefunden!


grs,
Andreas

--
Sam os4.1, e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 02.08.2009 um 22:09 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

03.08.2009, 19:28 Uhr

AGSzabo
Posts: 1663
Nutzer
hi,

noch eine frage zum background. meine tabs-griffleiste merkt sich den hintergund um sich auf einem muster refreshen zu können dass von einem übergeordneten objekt betrieben wird. es weiss also nicht was dahinter ist sondern macht damit get bzw put bevor sich die tabsleiste zeichnet.

zum aufnehmen bzw setzen benutzte ich eine bitmap mit einer bittiefe von 8. das scheint aber nicht für jedem fall zu reichen, mehr geht aber anscheinend nicht. was nun? es soll doch ein hintergund in truecolor gemerkt werden.

ps: zum transfer der bitmap-inhalte benutze ich ClipBlit().

mgf
Andreas
--
Sam os4.1, e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 03.08.2009 um 19:42 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

03.08.2009, 20:20 Uhr

thomas
Posts: 7717
Nutzer

Am Anfang der Cybergraphics-Autodocs ist eine Abhandlung über Bitmaps. Da findest du die Informationen, die du brauchst.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]


-1- 2 [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > GA_BackFill [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.