No widzisz, bardzo fajny przykład. Nie wiedziałem, że takie książeczki "Tips & Tricks" wychodziły od Commodore.
Może przy okazji podam swoje "triki" programistyczne, które odkryłem dopiero co niedawno. Może komuś się przydadzą:
1. Otóż odkryłem jak wykryć czy w naszym komputerze z Amiga OS 3 jest grafika OCS/ECS/AGA, a tym samym również Blitter, z którego możemy skorzystać bezpośrednio oraz planarne bitmapy.
Żeby się tego dowiedzieć wystarczy odczytać za pomocą polecenia GetBitMapAttr() flagi którejś z bitmap sytemowych, np. tej pobranej z ekranu systemowego. Jeżeli bitmapa zawiera flagę BMF_STANDARD, mamy do czynienia ze standardową, planarną bitmapą.
Wykrywszy taka sytuację, wiemy jaka jest struktura tej bitmapy i możemy stosować Blitter bezpośrednio, jak również własną, szybką konwersję pikseli chunky.
Przykład kodu w języku C:
struct Screen *s;
BOOL planar = FALSE;
if (s = LockPubScreen(NULL))
{
planar = GetBitMapAttr(s->RastPort.BitMap, BMA_FLAGS) & BMF_STANDARD;
UnlockPubScreen(NULL, s);
}
Dzięki temu można optymalizować swoje procedury rysujące dla Amig z oryginalnym układem graficznym i jednocześnie zadbać też o karty RTG.
2. Żeby przemieścić szybko okienko (typu SimpleRefresh) i zadbać o jego odświeżenie w całości samodzielnie, wystarczy otworzyć nowe okno w nowej pozycji, następnie zamknąć stare i ew. podpiąć gadżety ze starego okienka do nowego okienka, a następnie odrysować okno w nowej pozycji. Dzięki temu zabiegowi animacja przemieszczania jest bardzo atrakcyjna.
Uwaga: należy zadbać o prawidłową obsługę wydarzeń ze starego okna, chyba że stosujemy wspólny port komunikacyjny dla okienek.
3. Żeby szybciej odświeżyć okno, bez timingów biblioteki intuition należy skorzystać z funkcji layers.library BeginUpdate(). Reakcja systemu jest natychmiastowa.
4. Żeby rysować w okno za pomocą własnych metod, należy przespacerować po liście ClipRectów i pominąć te niewidoczne (mają składową cr->lobs różną od zera).
Uwaga: na ekranie publicznym musimy dodatkowo zadbać o blokowanie warstwy za pomocą LockLayer().
struct Window *w;
struct ClipRect *cr;
for (cr = w->WLayer->ClipRect; cr != NULL; cr = cr->Next)
{
if (cr->lobs)
continue;
/* Rysujemy w prostokąt cr->bounds */
}
Stosuję te triki od jakiegoś czasu i dobrze to działa. Polecam. A może Wy znacie jakieś triki?
Ostatnia aktualizacja: 08.04.2022 03:08:32 przez Hexmage960