[#1] Remapping kolorow (a dokladnie ten z DataTypes)
Czesc,
mam obrazek wczytany przez DataTypes (DT).
wg manuala, jesli ustawie taga PDTA_Remap (True) oraz podam PDTA_Screen (ja tu daje pointera do wb screen) to:

PDTA_DestBitMap (struct BitMap *) -- Pointer to the remapped
bitmap.
PDTA_GRegs (ULONG *) -- Color table; this table is initialized
during the layout process and will contain the colours the
picture will use after remapping. If no remapping takes
place, these colours will match those in the PDTA_CRegs table.


Gdy system skonczy remapping to komenda SetRGB32 kopiuje kolory z GReg do mojego ekranu , kopiuje DestBitmap do okna.... i dostaje "koszmarny obraz" (chodzi o kolory)
Uruchamiam Multiview na WB , wgrywam ten sam obrazek i mam rezultat duzo lepszy - a przeciez oba powinny byc takie same.

Jak zrobic remapping poprzez DT?


Ladowanie obrazkow bez remapingu dziala mi poprawnie - uzywam:

PDTA_BitMap (struct BitMap *) -- Pointer to a class-allocated
bitmap, that will end up being freed by the picture class in the
OM_DISPOSE method.
PDTA_CRegs (ULONG *) -- Color table to use with SetRGB32CM().
Applicability is (G).

Potem oczywiscie SetRGB32 z Creg do ekranu i obrazek jest perfekt.

Dzieki
[#2] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@pch, post #1

A skąd bierzesz tego pointer do wb screen ?

Według mnie trzeba go wziąć za pomocą LockPubScreen(NULL) i potem oczywiście UnlockPubScreen.
[#3] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@asman, post #2

Tak, tak robie, LockIBase(), przelatuje przez ekrany az bedzie to SCREENTYPE=#WBENCHSCREEN, zapamietuje pointera i zwalnialm lock.
Ten pointer jest na 100% poprawny. Moge wb przywolac na wierzch, nawet pobieralem jego kolory by skopiowac do mojego ekranu - to dziala.

Przyklad:
niech Cie nie zmyla 4 pierwsze kolory, ten obrazek ma juz ustawiona palete tak by nie psuly kolorow GUI w WB (4 pierwsze oraz 17,18,19 sa takie jak w WB - a przynajmniej bardzo zblizone)

Bez remapingu (tylko kopiowanie kolorow z Creg do mojego okranu i wyswietlenie BitMap)



Remaping ON (kopiowanie kolorow z GReg do mojego okranu i wyswietlenie DestBitMap)




Ostatnia aktualizacja: 28.11.2021 19:57:58 przez pch
[#4] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@pch, post #3

Rozumiem też, że głębia ekranu jest taka sama jak WB ?
[#5] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@asman, post #4

Tak,
wb jest w 32 kolorach, 720x566
obrazek jest w 32 kolorach, 720x566
moj ekran jest otwierany z ustawieniami wb (rozdzielczosc i ilosc kolorow)

eta.
tyul jaki jest w oknie palety to wartsosc wzieta z picture.datype: PDTA_NumColors
PDTA_NumColors (UWORD) -- Number of colors used by the picture.


Ostatnia aktualizacja: 28.11.2021 20:37:35 przez pch
[#6] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@pch, post #3

Sorki za pytanie nie dotyczące tematu, ale skąd można dorwać tą grafikę?
[#7] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@Ponki1986, post #6

np tu, przerobilem pierwszy lepszy obrazek
link

Ostatnia aktualizacja: 28.11.2021 20:47:43 przez pch
[#8] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@asman, post #4

Dla pewnosci sprawdzilem jeszce kombinacje:
BitMap + GRegs
DestBitMap + CRegs




Cos robie zle, tylko jeszce nie wiem co...



eta
a tak to robi multiview (remap do ekranu wb) - wiec ja spodziewam sie podobnych wynikow..




Ostatnia aktualizacja: 28.11.2021 21:02:03 przez pch
[#9] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@pch, post #8

Nie wiem czemu tak się dzieje. Nie wiem czy to pomoże, napiszę Ci jak ja to robię (w języku C).
static struct BitMap* bmap = NULL;
struct TagItem tags[] =
{
	{PDTA_ColorRegisters, (ULONG)&cregs},
	{PDTA_NumColors, (ULONG)&num},
	{TAG_END, TAG_END}
};

{
struct Screen* screen = LockPubScreen(NULL);

Object* o = NewDTObject("tiles.iff", DTA_GroupID, GID_PICTURE, PDTA_Remap, TRUE, PDTA_Screen, (ULONG)screen, TAG_END);

if (NULL != o)
{
	DoDTMethod(o, NULL, NULL, DTM_PROCLAYOUT,NULL,TRUE);
	
	result = GfxGetBitmapTiles(o);

	if (0 == result)
		{
			GetDTAttrsA(o, tags);

			ULONG screen = ScreenGetAddress();

			struct Screen* scr = (struct Screen*)screen;

			for (int i = 0; i < num; ++i)
			{
				SetRGB4(&scr->ViewPort, i, cregs[i].red, cregs[i].green, cregs[i].blue);
			}
		}



	DisposeDTObject(o);
}

UnlockPubScreen(NULL, screen);
}

/*--------------------------------------------------------------------------*/

static int GfxGetBitmapTiles(Object* o)
{
	struct BitMap* bm;
	GetDTAttrs(o, PDTA_DestBitMap, &bm, TAG_END);

	const ULONG width = GetBitMapAttr(bm, BMA_WIDTH);
	const ULONG height = GetBitMapAttr(bm, BMA_HEIGHT);
	const ULONG depth = GetBitMapAttr(bm, BMA_DEPTH);
	const ULONG flags = BMF_DISPLAYABLE|BMF_CLEAR;

	bmap = AllocBitMap(width, height, depth, flags, NULL);

	if (NULL != bmap)
	{
		BltBitMap(bm, 0, 0, bmap, 0, 0, width, height, 0xC0, 0xFF, NULL);

		return 0;
	}
	
	return -1;
}


I potem oczywiście można kopiować sobie z bmap w jakieś miejsce. Brakuje tu zwalniania tejże bitmapy.

Edit: Metoda ScreenGetAddress() zwraca longa (to jest adres ekranu).

Ostatnia aktualizacja: 28.11.2021 22:43:28 przez asman
[#10] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@asman, post #9

No widze, ze mamy prawie to samo , prawie bo :

Ty dajesz PDTA_Remap i PDTA_Screen do NewDTObject
Ja robie *dto bez tych tagow a zaraz potem (jak juz wiem, ze wybrany plik jest powiedzmy IFF-em) to ustawiam je za pomoca:

SetDTAttrsA(*dto...)

i teraz robie:

DoDTMethodA(..)

ale to nie powinno dac roznicy bo bitmapa jest tworzona w trakcie DoDTMethodA()...

!! chyba, ze SetDTAttrsA cos mi zle ustawia .. to jest mysl OK - musze to sprawdzic ale to juz rano

Dzieki !

Ostatnia aktualizacja: 28.11.2021 23:32:16 przez pch
[#11] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@pch, post #10

No niestety, niczego to nie zmienilo.

A moze ja mam zly tok myslenia tutaj (jak to ma dzialac wg mnie). Robie tak:
- jest sobie WB (niech bedzie 32 kolory)
- otwieram wlasny ekran (32 kolory)
- na moim ekranie otwieram okno BACKDROP|BORDERLESS pokrywajace caly ekran
- laduje obrazek za pomoca DT, ustawiam REMAP=ON a w SCREEN daje pointer do WB, zeby remapping zrobil wg jego (WB) kolorow.
- gdy DT wroci z wynikiem to zawartosc DestBitMap blituje do mojego okna i na koniec kopiuje kolory z CRegs/GRegs .... - ... no i mam sieczke
- gdy nie robie REMAP to zawartosc BitMap (nie DestBitMap) blituje do okna, kopiuje kolory i wszytko jest idealnie (pierwszy obrazek w tym temacie)
[#12] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@pch, post #11

Sprawdzę Twoje podejście dzisiaj (jak znajdę czas) i napiszę.
[#13] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@asman, post #12

Cierpliwie czekam OK
[#14] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@pch, post #10

PDTA_Remap jest typu I - create only. Czyli tag ten dziala tylko przy tworzeniu obiektu, uzycie juz po utworzeniu obiektu nie jest obslugiwane.
[#15] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@docent, post #14

Dzieki , sluszna uwaga.
Ale mimo wstawienia PDTA_Remap i PDTA_Screen do NewDTObject dalej mi nie dziala remapping - wlasnie rano to zrobilem, to byl ten wczorajszy pomysl gdy zobaczylem ze asman ma to przy NewDTObject - cos gdzies nie styka... znajde co ok, racja
[#16] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@pch, post #15

Moze wrzuc ten niedzialajacy kod, bedzie latwiej znalezc przyczyne.
[#17] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@docent, post #16

@docent, @pch

Wrzuciłem kod na githuba (nie ma obrazka ani pliku wynikowego). Tu jest link do pliku gfx.c link.

Nie wiem (bądź nie pamiętam) w czym dokładnie pisze pch, bo to drugorzędna rzecz. Najważniejsze że ten "problem" u mnie też się pojawia.
[#18] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@asman, post #17

Mała zmiana w kodzie, wziąłem kolory z WB za pomocą
GetRGB32(wbScreen->ViewPort.ColorMap, 0, 32, &wbColors[0]);


i ustawiłem je w moim ekranie i teraz jest ok ( na sztywno wziąłem 32 kolory ). Nie rozumiem czemu tak się dzieje, byłem przekonany że prawidłowa paleta powinna być w gregColors a tak nie jest.

Dodałem też plik wynikowy i obrazek do repo.
[#19] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@asman, post #18

Heh, faktycznie!
Przekopiowanie kolorow z WB na moj ekran (po remappingu) dziala - no ale to powinno byc w Gregs przeciez

Program ten pisze w blitzu (uzywajac sytemowych komend przepisanych pod blitza - wiec moge sie spodziewac bledow w nich) - ale tu wychodzi na to ze blad jest gdzies indziej..

A tak na marginesie co dokladnie zeruje ten zapis w C:
/* clear UserPort so Intuition will not free it */
win->UserPort = NULL;

bo w blitzu nie moge napisac *win\UserPort=0, musze wyzerowac poszczegolne pola tej struktury ale czy w tym wypadku wszystkie czy tylko \mp_SigBit ?
[#20] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@pch, post #19

A tak na marginesie co dokladnie zeruje ten zapis w C:
/* clear UserPort so Intuition will not free it */
win->UserPort = NULL;

bo w blitzu nie moge napisac *win\UserPort=0, musze wyzerowac poszczegolne pola tej struktury ale czy w tym wypadku wszystkie czy tylko \mp_SigBit ?

UserPort jest wskaźnikiem, nie strukturą. Powyższy zapis zeruje tylko jedną liczbę - ten wskaźnik.

Tego zapisu używa się w przypadku współdzielenia przez okienka programu jednego portu komunikacyjnego, który utworzyliśmy samodzielnie funkcją CreateMsgPort().

Podczas otwierania okna UserPort jest tworzony tylko wówczas, gdy zapaliliśmy flagi IDCMP. W przeciwnym przypadku UserPort nie jest tworzony, więc możemy podpiąć ten własny i zrobić ModifyIDCMP().

I właśnie należy pamiętać, żeby UserPort wyzerować przed wyzerowaniem flag IDCMP i zamknięciem okienka, by system nam nie zwolnił naszego współdzielonego portu.

Tutaj masz więcej detali nt. współdzielonego portu. Warto zauważyć, że okna ze współdzielonym portem należy zamykać za pomocą specjalnej funkcji CloseWindowSafely().
[#21] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@Hexmage960, post #20

Dzieki.
Wlasnie od rana walcze z podmiana calosci na ten "wspolny" port (bo moge miec duzo okien docelowo).
Co do pytania o zerowanie to byla pomylka :) - za duzo zmian na raz i blitz mi krzyczal o cos innego ale za kazdym razem ustawial kursor na tym i zapytalem bez zastanowienia ... Jak najbardziej to tylko wskaznik.

-------- ale to juz bylo nie na temat --------------------------
[#22] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@asman, post #17

@asman
czy moglbym podlinkowac twoj kod na EAB?
Tam sie przewijaja osoby czynnie rozwijajace system wiec moze warto by rzucili okiem i sie wypowiedzieli czy to blad w datatypes czy sposob jaki tu chcemy zrobic ten remapping jest bledny.

Nie bede tam zamieszczal kodu w blitzu bo nawet sie nie zainteresuja - a jak dostana gotowca w C to inna sprawa.
[#23] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@pch, post #22

@pch
Jasne, nie ma sprawy.
[#24] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@asman, post #23

Dzieki.
link
[#25] Re: Remapping kolorow (a dokladnie ten z DataTypes)

@pch, post #24

Czyli to chyba tak nie dziala, ze mozna sobie ustawic PDTA_Screen na jakis inny niz ten na ktorym ma byc wyswietlona grafika (znaczy mozna ale wtedy bedzie kaszana).

Wiec proste obejscie - jesli chce miec grafike przekolorowana na moim ekranie ale tak by pasowala do kolorow WB:
- albo zrobic jak Ty znalazles (kopiowac kolory wb po remappingu), a PDTA_SCreen=*WB
- albo skopiowac 0,1,2,3,17,18,19 z wb na wlasny ekran przed remappingiem i wystrartowac podajac PDTA_Screen=*wlasny
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem