[#1] Ping Krashan :) ColourLock
Czesc,
od pewnego czasu uzywam Twojego bardzo starego programu (w tytule) i powiem, ze jest mi bardzo pomocny.
Ostatnio jednak, calkiem przypadkiem zauwazylem, ze ma on pewien upierdliwy "bug" - nie zwalnia pliku po wczytaniu z niego palety - takze nie moge takiego obrazka "nadgrac" czy skasowac.
Zakladam, ze nie masz juz do niego kodu (chyba 1998 rok) ale zapytac przeciez moge szeroki uśmiech
Wiec jesli masz to moglbys poprawic ten drobiazg?

Dzieki
[#2] Re: Ping Krashan :) ColourLock

@peceha, post #1

Kodu nie mam niestety. W tamtych czasach przywiązywałem do backupów zadziwiająco małą wagę... Trzebaby zdisasemblować i napisać od nowa.
[#3] Re: Ping Krashan :) ColourLock

@Krashan, post #2

To juz chyba za duzo zachodu,
Dzieki za odpowiedz.
[#4] Re: Ping Krashan :) ColourLock

@Krashan, post #2

No wiec napisalem wlasny program (oczywiscie w blitzu ale nie rozwijajmy tego tmatu), ktory podmienia kolory WB na te z obrazka.
Jako, ze chcialem zrobic to szybko wiec wykorzystalem to co juz wiem i uzylem datatype-ow.

Jest jednak maly problem i nie wiem o co chodzi:
-gdy uzywam programu z cli lub WB/Opusa to dziala on wysmienicie (oczywiscie zauwazalnie wolniej od Twojego ale dziala)
-gdy jednak wstawiam go do s-s (tuz przed EndCli) to po wgraniu WB/Opusa kolory nie sa ustawione na te z obrazka

Jak to poprawic?
Dzieki
[#5] Re: Ping Krashan :) ColourLock

@peceha, post #4

"Zaptaszkuj" w startup-sequence wywołanie IPrefs i sprawdź jeszcze raz.
[#6] Re: Ping Krashan :) ColourLock

@*y, post #5

nie pomaga
teraz wb uruchamia sie w niskiej rozdzielczosci i do tego w 4 kolorach ale mimo to sa to 4 domyslne kolory WB.
[#7] Re: Ping Krashan :) ColourLock

@peceha, post #6

Wrzuć program do wbstartup żeby się wykonał później :)

Ps: jakby wciąż za szybko się uruchamial to dodaj jakiś delay w bltzu na start

Ostatnia aktualizacja: 08.09.2019 12:09:27 przez juen
[#8] Re: Ping Krashan :) ColourLock

@juen, post #7

Wstawie na probe do wbstartup ale najpierw musze go lekko przerobic by startowal z WB i bral argument z tooltype.
[#9] Re: Ping Krashan :) ColourLock

@peceha, post #8

Uruchom skrypt z ikony poprzez iconx

Ostatnia aktualizacja: 08.09.2019 12:15:36 przez Norbert
[#10] Re: Ping Krashan :) ColourLock

@juen, post #7

Z "wbstarup" dziala ale mimo wszystko chcialbym wiedziec co jest potrzebne w programie by dzialalo z s-s (oryginal Krashana dziala z s-s)

@Norbert
to juz iconx nie bede probowal bo program przyjmuje juz tooltype

Ostatnia aktualizacja: 08.09.2019 12:29:05 przez peceha
[#11] Re: Ping Krashan :) ColourLock

@peceha, post #4

ktory podmienia kolory WB na te z obrazka.
Podmienia w jaki sposób?
[#12] Re: Ping Krashan :) ColourLock

@Krashan, post #11

Uzywam
GetDTAttrs()

By dostać PDTA_CRegs obrazka (poprzez datatypes) a potem wykonuje odpowiednią ilość razy komende
SetRGB32()

by podmienić kolory.

nowe:
ponizej caly kod (ten nie startuje z WB)
Domyslam sie ze jest tam kilka "potworkow" ale na te chwile stac mnie tylko na tyle szeroki uśmiech
If FromCLI
  If NumPars<>1 Then End
  f$=Par$(1)
Else
    End
EndIf

DEFTYPE.IntuitionBase   *iBase
DEFTYPE.Screen          *scr
DEFTYPE.DrawInfo        *di
DEFTYPE._Object         *dto
DEFTYPE.DataType        *dtn
DEFTYPE.DataTypeHeader  *dth
DEFTYPE.BitMapHeader    *bmhd
DEFTYPE.BitMap          *bm
DEFTYPE.gpLayout        gpl


DEFTYPE.l suc
DEFTYPE.l lock
DEFTYPE.l *cr


;----------------- znajdz WB ----------------------------------------
*iBase = IntuitionBase
lock   = LockIBase_(0)
*scr   = *iBase\FirstScreen
While *scr
  If (*scr\Flags)&#SCREENTYPE=#WBENCHSCREEN
    Pop While
    Goto jump_00
  EndIf
  *scr=*scr\NextScreen
Wend
End;nie ma wb
jump_00:
UnlockIBase_(lock)
; -----------------------------------------------------------------------------



Dim tags.TagItem(5)

tags(0)\ti_Tag = #DTA_SourceType ,#DTST_FILE
tags(1)\ti_Tag = #DTA_GroupID    ,#GID_PICTURE;zamiast IF + GetDTString_(*dth\dth_GroupID)
tags(2)\ti_Tag = #PDTA_Remap     ,False
tags(3)\ti_Tag = #PDTA_Screen    ,*scr
tags(4)\ti_Tag = #TAG_DONE       ,0
*dto=NewDTObjectA_(&f$, &tags(0))

If *dto
  *lock = Lock_(f$,#ACCESS_READ)  ;moge tez dac & z przodu ale nie * dla czystego textu
  *dtn  = ObtainDataTypeA_(#DTST_FILE,*lock,#TAG_DONE)
  *dth  = *dtn\dtn_Header

  ReleaseDataType_(*dtn)
  UnLock_(lock)

  gpl\MethodID=#DTM_PROCLAYOUT,0,1
  suc=DoDTMethodA_(*dto,0,0,&gpl)

  tags(0)\ti_Tag = #PDTA_BitMapHeader ,&*bmhd
  tags(1)\ti_Tag = #PDTA_BitMap       ,&*bm
  tags(2)\ti_Tag = #PDTA_CRegs        ,&*cr
  tags(3)\ti_Tag = #TAG_DONE          ,0
  suc=GetDTAttrsA_(*dto,&tags(0))

  bmd.b=*bmhd\bmh_Depth
  *di=GetScreenDrawInfo_(*scr)
  scd.b=*di\dri_Depth
  If bmd>scd Then bmd=scd

  i.b=0
  While i<bmd^2
    suc=SetRGB32_(*scr\ViewPort,i,Peek.l(*cr+i*12+0),Peek.l(*cr+i*12+4),Peek.l(*cr+i*12+8))
    i+1
  Wend

  DisposeDTObject_(*dto)
EndIf
End





Ostatnia aktualizacja: 08.09.2019 16:10:32 przez peceha
[#13] Re: Ping Krashan :) ColourLock

@peceha, post #12

Kolory lockuje się funkcją ObtainPen. Sprawdź sobie kilka programów z aminetu (szukaj color lock). Może nie będzie trzeba w ogóle niczego pisać. Znajdziesz też kilka źródeł. Zerknij na Colorado.
[#14] Re: Ping Krashan :) ColourLock

@peceha, post #12

Używasz kilku funkcji z datatypes.library ale nie widzę żebyś ją otwierał, może tu jest błąd?
[#15] Re: Ping Krashan :) ColourLock

@peceha, post #12

Mam kilka rad:

1. Zamiast SetRGB32() lepiej jest skorzystać z funkcji SetRGB32CM(). Jest to jej odmiana, która korzysta z ColorMap. To w ColorMap przechowywane są informacje o rezerwowanych pisakach. Wskaźnik do ColorMap znajduje się w strukturze ViewPort ekranu.

2. Najlepiej zablokować kolory za pomocą ObtainPen(). Ustaw tryb jako Shared, czyli współdzielony. Wówczas ustawisz własny kolor. Ale nie wolno potem tego koloru zmieniać (jeśli chcesz dynamicznie zmieniać kolor dostęp musi być Exclusive, ale w tym przypadku raczej to nie jest konieczne).

3. Można to zrobić jeszcze lepiej. Polecaną metodą jest skorzystać z funkcji ObtainBestPenA(). Ta funkcja najpierw szuka, czy dany kolor nie jest już dostępny na liście kolorów w podanej jako argument precyzji (może to być dokładna precyzja - Exact). Jeśli nie znajdzie odpowiedniego koloru, to ta funkcja rezerwuje samodzielnie kolor za pomocą ObtainPen().

Sam dopiero niedawno dowiedziałem się jak dokładnie działa ObtainBestPenA(). Jeżeli chcesz ustawić wybrane kolory z palety użyj metody nr 2. Jeśli jednak nie zależy na wybranych indeksach - użyj metody 3.

Ważna nota: Z reguły pierwsze i ostatnie 4 kolory ekranu Workbencha są rezerwowane przez system. Tych pisaków nie zarezerwujesz za pomocą ObtainPen()! Prostym obejściem jest ustawianie tych kolorów za pomocą pliku Preset z programu preferencji Palette.
[#16] Re: Ping Krashan :) ColourLock

@cholok, post #13

Dzieki za informacje. Colorado juz wlasnie przegladam - co prawda jest w asemblerze ale i tak moge zobaczyc jakie komendy systemowe sa uzyte.
Mysle jednak, ze skoro zaczalem pisac to czemu nie pociagnac tego do konca.

@forge
w blitzu nie ma potrzeby otwierac bibliotek dla polecen systemowych. Kiedys nawet zalozylem temat na EAB z dokladnie takim zapytaniem (czy potrzeba je otwierac) i dostalem taka odpowiedz:

In general, you don't need to open libraries explicitly for using OS calls - Blitz will open and close them as required (but be sure to use the End statement to exit the program). However, you *can* open and close the libraries yourself manually if you like, which could be done to check that the correct library is available for example and handle a failure appropriately. Using a function that doesn't exist in a library (e.g. a V39 call when running on V36) will result in a crash if you don't manually check the library yourself and avoid the call.


edit:
@Hex
dzieki, za objasnienie.
Co do pierwszych 4 kolorow to tych akurat nie zmieniam bo kazdy obrazek jaki uzywam za tlo w WB ma w swojej palecie pierwsze 4 kolory ustawione na te z WB (kolejnosc i wartosc)

Ostatnia aktualizacja: 08.09.2019 16:57:25 przez peceha
[#17] Re: Ping Krashan :) ColourLock

@peceha, post #12

cholok ma rację. Użyj ObtainPen(), co oprócz zmiany wartości kolorów RGB blokuje je dla Intuition. Intuition posiada prosty system zarządzania "penami" czyli pozycjami w palecie dla programów. Dany pen może mieć 3 statusy: wolny, współdzielony i wyłączny. Jeżeli każda aplikacja grzecznie woła ObtainPen() (albo ObtainBestPenA()), to wtedy:
  • status wolny oznacza, że nic jeszcze tym penem na ekranie nie jest narysowane
  • status współdzielony oznacza, że aplikacje rysowały już tym penem, ale zobowiązują się do nie zmieniania jego koloru (czyli jedna appka nie pozmienia kolorów w drugiej).
  • status wyłączny oznacza, że jakaś aplikacja chce mieć ten pen na wyłączność, zazwyczaj po to, żeby go zmieniać. Na przykład pole wyboru koloru w gadżecie do jego ustawiania.

Program blokujący paletę powinien wybrane (albo wszystkie) peny zablokować jako współdzielone. Wtedy żadna aplikacja nie powinna zmienić kolorów tych penów, ale będzie mogła ich używać do rysowania. Z tym, że jest to tylko dżentelmeńska umowa, możesz napisać program, który zmieni kolory „na chama” i wtedy „nie mamy pańskiego płaszcza i co nam pan zrobi?”. Elementem tej umowy jest to, że każda normalna aplikacja powinna zwolnić wszystkie używane peny przez ReleasePen(). Oczywiście Twój program nie, bo on powinien trzymać blok aż do resetu.
[#18] Re: Ping Krashan :) ColourLock

@Krashan, post #17

Wyglada na to ze dostalem wszytkie potrzebne informacje OK
Dzieki!
To zaoszczedza bardzo duzo czasu - szukajac na slepo w autodoc-ach i do tego metoda prob i bledow by zadzialalo w blitzu ... ehhh
[#19] Re: Ping Krashan :) ColourLock

@peceha, post #18

Ja jeszcze tylko przypomnę, że ObtainPen() alokuje tylko ołówki, które są wolne. Oznacza to, że jeżeli dwa programy skorzystają równocześnie z tej techniki, to ten drugi już tego ołówka nie będzie mógł zaalokować za pomocą ObtainPen().

Dokumentacja poleca w tym przypadku dla kolorów współdzielonych skorzystać z ObtainBestPenA(), ponieważ ta funkcja alokuje nowy kolor dopiero gdy nie jest dostępny odpowiedni kolor na liście współdzielonych.

Przy czym, czy zastosujesz ObtainPen() w trybie współdzielonym, czy ObtainBestPenA() zawsze udostępniasz w puli kolorów własny kolor i inne programy korzystające z funkcji ObtainBestPenA() będą mogły z niego skorzystać. Przykładowo Workbench i jego remapowanie rysunku na blacie. A chyba na tym Ci przede wszystkim zależy.

Dlatego też bez obaw warto korzystać z ObtainBestPenA().

A jak dodatkowo zrobisz możliwość dezaktywacji swojego programu (z użyciem ReleasePen(), jak radził kolega Krashan), choćby poprzez Commodities, to z Twojego programu będzie bardzo przyjemnie korzystać.

ObtainPen() przydaje się, gdy chcemy zmienić kolory na sztywno według indeksów, albo chcemy zmieniać kolor dynamicznie po zaalokowaniu. Jednak tak jak napisałem generalnie przy remapowaniu rysunków, ikon itp. nie liczą się indeksy, tylko kolory.

P.S. Dokumentacja do nowych funkcji OS3.x jest generalnie mało dostępna i trzeba szukać. Ja serdecznie polecam Amiga Developer CD.
[#20] Re: Ping Krashan :) ColourLock

@Hexmage960, post #19

ObtainPen() przydaje się, gdy chcemy zmienić kolory na sztywno według indeksów.
Właśnie to ma robić tworzony program, nie wiem czy zauważyłeś.
[#21] Re: Ping Krashan :) ColourLock

@Hexmage960, post #19

Czy po uzyciu jednej z tych komend kolory powinny sie natychmiast zmienic czy musze jeszce cos wykonac by ekran dostal nowe kolory?
Wykonuje ObtainBestPenA() ale efektu nie widze...

dodano:
ObtainPen() musialem tymczasowo zostawic...
Komenda ta jako ostatniego argumentu wymaga (albo i nie) flag: PEN_EXCLUSIVE lub PEN_NO_SETCOLOR bo "wspoldzielny" jest jako domyslny.
Niestety implementacja tej komendy w blitzu WYMAGA podania flagi a flaga "wspoldzielna" nie istnieje (jest domyslna). W autodoc jest tylko zadeklarowane PEN_EXCLUSIVE i PEN_NO_SETCOLOR, a jesli pomine argument FLAGS to blitz wywala blad.

Ostatnia aktualizacja: 08.09.2019 18:35:13 przez peceha
[#22] Re: Ping Krashan :) ColourLock

@peceha, post #21

Czy po uzyciu jednej z tych komend kolory powinny sie natychmiast zmienic czy musze jeszce cos wykonac by ekran dostal nowe kolory?
Wykonuje ObtainBestPenA() ale efektu nie widze...

Przepraszam, jeśli chcesz zmienić kolor na ekranie z podanym indeksem użyj funkcji ObtainPen() - tak jak zwrócił uwagę kolega Krashan.

ObtainBestPenA() zwraca Ci kolor, który najlepiej pasuje (i ew. alokuje nowy). ObtainBestPenA() można też używać do ew. dodawania kolorów do puli, ale nie służy do zmieniania kolorów ekranu o danych indeksach.

Co do drugiej części - ustaw wartość 0 jako parametr Flags.

Ostatnia aktualizacja: 08.09.2019 18:42:07 przez Hexmage960
[#23] Re: Ping Krashan :) ColourLock

@Hexmage960, post #22

Juz wrocilem do ObtainPen()
Ustawilem 0 po tym jak dostawalem blad przy kompilacji ale efektu nie ma
Teraz ustawilem #PEN_EXCLUSIVE - i tez kolory sie nie zmienily
Cos gdzies przeoczylem...
[#24] Re: Ping Krashan :) ColourLock

@peceha, post #23

ObtainPen() zwraca kod koloru jeśli może go zmienić lub wartość -1 gdy jest błąd. Musisz ten kod odczytać. Najwyraźniej wybrany kolor jest niedostępny (bo jest już zarezerwowany).

Pierwsze i ostatnie 4 kolory Workbencha są z automatu zajęte.

Ostatnia aktualizacja: 08.09.2019 18:49:47 przez Hexmage960
[#25] Re: Ping Krashan :) ColourLock

@Hexmage960, post #24

zeby nie za duzo mieszac to zrobilem beepscreen gdy rezultat ObtainPen() bedzie -1
Dla palety 16 kolorow miga 16 razy
[#26] Re: Ping Krashan :) ColourLock

@peceha, post #25

odpal przed Iprefs :)
[#27] Re: Ping Krashan :) ColourLock

@peceha, post #25

Dwa pytania:
1. Co dałeś za parametr indeks dla ObtainPen() w każdym wywołaniu?
Podajesz tam numer konkretnego koloru lub -1 gdy może to być dowolny kolor (nie dotyczy tego przypadku).

2. Czy uruchamiasz jakieś programy przed swoim?

Ważna nota: Jak zaalokowałeś już kolory za pomocą ObtainPen() i nie zwolniłeś za pomocą ReleasePen() to nie możesz ich używać.

Ostatnia aktualizacja: 08.09.2019 19:07:20 przez Hexmage960
[#28] Re: Ping Krashan :) ColourLock

@Hexmage960, post #27

i.b=0
  While i<bmd^2
    suc=ObtainPen_(*scr\ViewPort\ColorMap,i,Peek.l(*cr+i*12+0),Peek.l(*cr+i*12+4),Peek.l(*cr+i*12+8),0)  ;lub #PEN_EXCLUSIVE
    i+1
  Wend


te Peek.l(...) to pobieranie wartosci z color table uzyskane uzyskane przez #PDTA_CRegs (patrz pierwszy listing)
2. zresetowalem kompa i sprawdzilem czy cos moze blokowac kolory ale nic nie widze
[#29] Re: Ping Krashan :) ColourLock

@peceha, post #28

Dodałem do poprzedniego postu:

Zauważ, że jeśli zaalokowałeś już kolory za pomocą ObtainPen() i nie zwolniłeś za pomocą ReleasePen() to nie możesz ich ponownie blokować za pomocą ObtainPen() przy następnym wywołaniu programu.

Twój program musi zwalniać kolory pomyślnie zaalokowane, przynajmniej podczas testów.

Dla ekranu 16-kolorowego kolory 4-11 powinny być wolne.

Ostatnia aktualizacja: 08.09.2019 19:14:11 przez Hexmage960
[#30] Re: Ping Krashan :) ColourLock

@Hexmage960, post #29

fakt, dodalem ReleasePen() jako nastepna komende po ObtainPen() i teraz cos sie dzieje - efekt oplakany ale cos sie dzieje wiec trop juz jest , dzieki

dodalem
efekt byl oplakany bo do testow podalem wartosc jednego koloru dla wszystkich i zapomnialem.
Po poprawce juz kolory zostaja zmienione - teraz tylko jakos musze zmienic ostatnie 4

Ostatnia aktualizacja: 08.09.2019 19:16:45 przez peceha
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