04.08.2026 03:35

Maska na folderze warstw, czyli fundament pod kadry komiksu

⏱️ 4 min read
Share:

Zapowiadałem narzędzie do kadrów komiksu. Zanim powstanie, musiał powstać fundament — i okazało się, że fundamentu po prostu nie było.

Maska na grupie nie robiła nic

Kadr komiksu to w istocie prosta rzecz: folder warstw, na który nakładasz kształt, i wszystko w środku widać tylko w jego obrębie. Tło, postać, efekty — każde na swojej warstwie, wszystkie przycięte jedną ramką.

Sprawdziłem, jak zachowa się program. Maskę na grupę dało się założyć. Panel warstw pokazywał ją poprawnie. Obraz się nie zmieniał. Ani trochę.

Powód okazał się bardzo konkretny: mechanizm składający obraz sięga po maskę tylko wtedy, gdy renderuje zawartość warstwy — a grupa nigdy tamtędy nie przechodzi, bo ma własną, osobną drogę. Maska na grupie była więc od zawsze deklaracją bez pokrycia.

Rozwiązanie nakłada maskę raz, na gotowy wynik całej grupy, tuż przed wmieszaniem go w tło. Kusiło, żeby zrobić to inaczej — przemnożyć maskę na każdej warstwie z osobna — ale to gorsze w każdym wymiarze: kosztuje jeden przebieg na każdą warstwę zamiast jednego na folder, i wymaga utrzymania ośmiu miejsc w kodzie w idealnej zgodzie. Jedno miejsce zamiast ośmiu dało trzy rzeczy za darmo: folder w folderze daje część wspólną obu kształtów, warstwa korekcyjna w środku przycina się poprawnie, a krycie i tryb mieszania folderu działają na już przyciętym wyniku.

Przy okazji wyszedł błąd, który siedział tam od dawna

Żeby maska kształtu działała, musi ukrywać treść wszędzie poza kształtem. Sprawdziłem, czy tak jest — i nie było. Maska wektorowa ukrywała zawartość wyłącznie w obrębie prostokąta opisanego na własnym kształcie. Postać narysowana przez całą stronę nie była przycinana w ogóle.

Przyczyna jest niewinna i typowa dla optymalizacji, które przeżyły swoje założenia: maska jest zapisywana kafelkami, a kafelki „całkiem białe" pomija się, bo biel znaczy „widoczne". Dla maski malowanej pędzlem to poprawne — nie zamalowałeś, więc widać. Dla maski będącej kształtem już nie: tam nietknięty obszar znaczy „na zewnątrz", czyli coś dokładnie odwrotnego.

Można było zapisać dziesiątki tysięcy czarnych kafelków na stronę. Zamiast tego program liczy teraz raz, przy budowaniu maski, jedną wartość: co obowiązuje poza jej zasięgiem.

I od razu druga lekcja: byłem o krok od zepsucia tego jeszcze bardziej

Pierwsza wersja tej poprawki miała paskudną wadę, którą wyłapał przegląd kodu, zanim cokolwiek trafiło dalej. „Pominięty kafelek" występuje bowiem w dwóch różnych sytuacjach — poza kształtem oraz w jego całkowitym wnętrzu, bo tam też wszystko jest jednolicie białe. Potraktowałem obie tak samo, więc kadr zamiast pokazywać rysunek pokazywałby… samą obwódkę wzdłuż konturu.

Poprawka jest prosta — program zapamiętuje, nad jakim obszarem budował maskę; wewnątrz niego brak kafelka nadal znaczy „widać", a dopiero poza nim wchodzi nowa reguła. Ale bez tego kroku funkcja wyglądałaby na skończoną i byłaby bezużyteczna.

Ten sam przegląd wykrył jeszcze, że poprawka objęła tylko jeden z pięciu rodzajów warstw (więc warstwa korekcyjna z tą samą maską zachowywałaby się inaczej niż rysunkowa obok niej) oraz że eksport do formatu warstwowego gubił maskę folderu — kadr przycięty na ekranie wychodził w pliku nieprzycięty. Obie rzeczy naprawione w tym samym podejściu.

Dwie decyzje podjęte jawnie

Tryb „przepuszczaj" i maska wykluczają się. Taki folder z założenia nie tworzy własnego wyniku — jego warstwy mieszają się wprost z tłem — więc maska nie miałaby na czym działać. Zamiast pozwolić jej po cichu przestać działać, przełącznik jest niedostępny i mówi dlaczego. Starsze pliki z tą kombinacją są przy wczytaniu porządkowane: maska wygrywa.

Folder z maską, która faktycznie coś kryje, składany jest na procesorze zamiast na karcie graficznej. Karta nie ma jeszcze kroku nakładającego maskę na wynik folderu, a obraz różniący się między podglądem a eksportem byłby gorszy niż utrata szybkości. Wersja natywna jest następnym zadaniem — i jest warunkiem, a nie życzeniem, bo strona komiksu to kilka takich folderów naraz.

Co dalej

Fundament stoi: kształt przycina zawartość folderu, wszędzie tam gdzie powinien, i zachowuje się tak samo na ekranie, przy spłaszczaniu i w eksporcie. Teraz można zbudować to, po co to wszystko powstało — narzędzia do rysowania i dzielenia kadrów, z rynnami między nimi, cięciem pod dowolnym kątem i podglądem obszaru poza kadrem.

📚 Related posts

27.08.2026 20:55

Data, której nie cofniemy nawet my

Każdy certyfikat autorstwa dostaje datę zapisaną w blockchainie Bitcoina — takiej nie podważy nikt, my też nie. Sprawdzisz ją bez konta i bez Moonligh...
Continue reading →
27.08.2026 19:35

Twój kolor, wszędzie

Trzy tryby i siedem akcentów, wspólnych dla strony i Moonlight Animate. Motyw jedzie z kontem, profil pokazuje gościom Twoje kolory, a harmonogram sam...
Continue reading →
27.08.2026 18:31

Kto moderuje i na jakiej podstawie

Moderator to teraz osobna rola z własnym zakresem, a nie administrator w przebraniu. Odrzucenie treści wymaga powodu, który trafia do autora razem z d...
Continue reading →

📧 Stay up to date!

Join the waitlist to get notified about new Dev Blog posts and Moonlight platform launch.