[#1] [Blitter] Zagwozdka
Przygotowuję artykuł o sposobie użycia Blittera i artykuł jest niemal gotowy, jednak trafiłem na jedną rzecz, która sprawia mi niewiarygodną trudność (zamieszczam link do obecnej postaci artykułu).

Otóż chodzi o jeden wariant kopiowania dowolnych obszarów z własną maską.

Opisuję różne warianty kopiowania z własną maską z dowolnego miejsca w jednej bitmapie do dowolnego miejsca w drugiej bitmapie o dowolnej szerokości operacji.

Chodzi o to, że w sytuacji gdy obszar docelowy jest szerszy (składa się z większej liczby słów) niż obszar źródłowy, w dokumentacji zalecane jest nie przesuwanie maski i przycięcie obu krańców kanału A tak, jakbyśmy maskowali kanał przeznaczenia D.

I działa to bardzo dobrze, ale gdy maska jest stała i wynosi $FFFF. Jak postąpić gdy jednak chcemy zastosować zupełnie własną maskę i kopiować do dowolnego wybranego bitu w słowie (czyli przyciąć ostatnie słowo źródła)? Jak nie przesunę maski, a przesunę dane to mi źle wytnie.

Jak rozwiązać ten problem?

Obstawiam, że jest to możliwe, gdyż funkcja BltMaskBitMapRastPort() coś takiego potrafi.

Pozdrawiam i dzięki za wszelką pomoc.
[#2] Re: [Blitter] Zagwozdka

@Hexmage960, post #1

IMHO Najlepiej rozwiązać ten problem porzuceniem funkcji BltMaskBitMapRastPort(), ale spodziewam się że nie jest to satysfakcjonująca Cię odpowiedź. ;)

PS. Popraw kodowanie znaków (head > meta z rodzaju content-type) bo przeglądarki internetowe z różnym skutkiem się domyślają poprawnego zestawu. Do reszty pod kątem merytorycznym się odniosę później.
[#3] Re: [Blitter] Zagwozdka

@teh_KaiN, post #2

Chodzi Ci o to, żeby nie obsługiwać tego przypadku.

W sumie nie jest on mi w praktyce potrzebny, bo jak będę blitować BOBy to one zawsze będą wielokrotności 1 słowa i maska będzie mieć zera w dopełnieniu.

Jednak rozważałem kilka rozwiązań problemu. Przypominam, że polega on na tym, że muszę zamaskować bity przed ostatnim słowem. W dokumentacji jest mowa o takich problematycznych sytuacjach.

Jako rozwiązanie jest podane przygotowanie odpowiedniej maski.

No bo w sumie dałoby się rozwiązać ten problem w taki sposób, że w przedostatnim słowie maski dla każdego wiersza wyzerować to dopełnienie. Nie jest to kosztowna operacja, choć modyfikuje maskę. Druga opcja to skopiować interesujący nas fragment maski wyzerowując dopełnienie.

Zastanawiam się czy jednak jednym blitem nie dałoby się tego uzyskać. Jeśli nie, trudno - nie uwzględnię tego przypadku i pozostanę przy klasycznych BOBach.

PS. Popraw kodowanie znaków (head > meta z rodzaju content-type) bo przeglądarki internetowe z różnym skutkiem się domyślają poprawnego zestawu. Do reszty pod kątem merytorycznym się odniosę później.

Tagi HTML dodawałem na bieżąco, dodam również kodowanie.

Ostatnia aktualizacja: 22.10.2017 13:30:59 przez Hexmage960
[#4] Re: [Blitter] Zagwozdka

@Hexmage960, post #3

Muszę przyznać, że długo się zastanawiam jak ten problem rozwiązać. Chciałbym chociaż dla formalności go rozwiązać i umieścić receptę w artykule.

Modyfikacja maski to chyba najmniej kosztowne rozwiązanie.

Jeśli okaże się to zbyt skomplikowane, zmodyfikuję artykuł: podzielę blity na dowolne ze stałą maską (prostokątne) oraz BOBy z maską. W ten sposób będzie to też o niebo łatwiejsze w zaprogramowaniu.

Takie BOBy systemowe właśnie tak działają.

A co do pełnego działania BltMaskBitMapRastPort() - może kiedyś...
[#5] Re: [Blitter] Zagwozdka

@teh_KaiN, post #2

Sięgnąłem po Asm-One i zagłębiłem się w implementację funkcji BltMaskBitMapRastPort().

Okazuje się, że ta funkcja robi 3 blity BltBitMap(), które, jak obliczyłem, sumują się do operacji wycinania cookie-cut (0xca).

Pierwszy i ostatni minterm: 0x90.
Środkowy minterm to ten podany jako argument funkcji.

W pierwsze i trzeciej operacji źródłem jest obrazek, a celem - tło.

W drugiej operacji używa jako źródło bitmapy, której każdy bitplan to maska, a jako cel - tło.

Czyli problem rozwiązany. W tak ogólnej postaci trzeba sięgnąć po więcej blitów.

Jednakże ja w swoim silniku będę stosował sytuację bardziej szczególną i blitował tylko raz.

Ale w artykule oczywiście opiszę tą metodę.

@Teh_KaiN

Kiedyś zastanawiałeś się dlaczego argument minterm funkcji BltBitMap() to 0xc0, a nie 0xca. Zobacz opis tej funkcji to dowiesz się dlaczego tak jest.

Otóż ten minterm mówi co ma funkcja robić, gdy kanał A jest niezerowy (czyli w obrębie prostokąta, który obejmuje operacja).
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