Siedzę nad tym od 3 dni i nie mogę zrozumieć co tu się dzieje. Nie interesuje mnie żadne inne rozwiązanie problemu, tylko sama przyczyna pojawiania się krzaków.
Załóżmy hipotetyczną sytuację, że jest sobie bitmapa 16x15 (wysokość nieistotna), której zawartość prezentuje się następująco:

W niechlujnym powiększeniu:
Prostokąt jest szeroki na 10 pikseli. I teraz, chcę sobie przeblitować tę bitmapę wycinając z niej prostokąt o szerokości 11 (jedna kolumna pusta za prostokątem) i narzucając shift, odpowiednio ustawiając rejestry blittera. I robię to i częściowo działa:
Niedziałające przypadki są robione trybem descending (wiem że można ascending ale to nie jest tematem tej dyskusji). Rozpatrzmy pierwszy bugujący się przykład:
źródło jest ustawiane jako początek bitmapy, szerokość blitu dwa wordy, modulo po każdej linii -2. Maska lewa 0x0000, maska prawa 0xFFFF << 5. Wycinek z moich logów:
Blit width: 32 (2 words)
LMask: 0x0, RMask: 0xFFE0
Shift: 10
Modulo: src -2
Wygląda to tak, jakby maska z lewej nie działała. O co chodzi? Nadmienię, że moja funkcja blitująca radzi sobie z prawie wszystkim (nawet z wieloma rodzajami descending mode) i możliwe, że to jest ostatni przypadek, który wadliwie działa.
Nie chcę rzucać kodu, bo jest w nim straszny bajzel. Ma ktoś pomysł, skąd te śmieci? Niby przez blit długości dwóch wordów wchodzi na dane następnej linii, ale nie powinien ich pobierać bo lewa maska (w tym przypadku rejestr bltlwm) jest ustawiona na 0.
Ostatnia aktualizacja: 19.07.2015 12:28:08 przez teh_KaiN