MaskBlt. Помогите с MakeROP4

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

MaskBlt. Помогите с MakeROP4

Сообщение Don Leno » 12.03.2019 (Вт) 19:50

Искал готовые примеры с MaskBlt, но столкнулся с тем что их нет (может плохо искал? Тогда ткните в рабочий код!). Зашел на МСДН. Не лучше перевод для меня словно китайцы писали:

MAKEROP4 макрос создает четвертичную растровый код операции для использования с MaskBlt функции. Макрос принимает два троичных кода операций растра в качестве входных данных, один для переднего плана и один для фона, и упаковывает их индексы логических операций в старшее слово 32-битного значения. Слово младшего разряда этого значения будет игнорироваться.

Код: Выделить всё
void MAKEROP4(
   fore,
   back
);


Как я понимаю надо здесь с битовыми операциями провернуть. Но из-за машиного перевода не понимаю что нужно сделать.

То что я понял. Есть Long и в старших восьми битах хранятся значения. Как они там расположены и какие значения писать не понимаю!

Приблизительный код:
Код: Выделить всё
Public Function MakeRop4(byval fore as ????,byval back as ????) as Long
    'Сооброжу как запихать fore & back в Long только какого они типа??
end function


Если честно подставлял значения отсюда https://docs.microsoft.com/ru-ru/windows/desktop/gdi/ternary-raster-operations
но эффекта никакого. Суть в том что MaskBlt вообще ничего не рисует. Ставлю значение dwRop = 0, то отрисовывает просто черный квадрат

Код: Выделить всё
Create combined ROP for MaskBlt
Function MakeRop4(ropFore As Long, ropBack As Long) As Long
    ' MakeRop4 = ((ropBack SHL 8) And &HFF000000) Or ropFore
#If 1 Then
    MakeRop4 = (MBytes.LShiftDWord(ropBack, 8) And &HFF000000) Or ropFore
#Else
    ' Hack to do same shift in Basic
    If ropBack And &H800000 Then
        Dim ropTmp As Long
        ' Remove high bit
        ropTmp = (ropBack And &HFF7FFFFF)
        ' Do calculation
        ropTmp = ((ropTmp * 256) And &HFF000000) Or ropFore
        ' Put high bit back in
        MakeRop4 = ropTmp Or &H80000000
    Else
        MakeRop4 = ((ropBack * 256) And &HFF000000) Or ropFore
    End If
#End If
End Function

Нашел на просторах. Как я понял #if для исполнения из под ide или в скомпиленом виде так? То есть это все что после #else и есть нужный код? Объясните пжлста, мне можно вообще убрать #if then #else?

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: MaskBlt. Помогите с MakeROP4

Сообщение Don Leno » 14.03.2019 (Чт) 18:32

Итак, ответов все равно нет, напишу сам мало ли кому сгодится)))
Я сам все таки разобрался. Далее идет код для функции MakeROP4, которая вполне работоспособна! (В коммент включен автор и ссыль на гитхаб где сий код был найден. Все права соблюдены))) ):

Код: Выделить всё
'This code from "https://github.com"
'Author: Eotect Nahn [eotect] Organization "Badcodes"
'Link download:
'https://github.com/badcodes/vb6/blob/master/%5BInclude%5D/HardcodeVB/LocalModule/GDITool.Bas
Private Function MakeRop4(ByVal ropFore As Long, ByVal ropBack As Long) As Long
    ' MakeRop4 = ((ropBack SHL 8) And &HFF000000) Or ropFore
     MakeRop4 = (LShiftDWord(ropBack, 8) And &HFF000000) Or ropFore
End Function

'Next code from "https://github.com"
Private Function LShiftDWord(ByVal dw As Long, ByVal c As Integer) As Long
   
        Dim dwT As Long
        On Error GoTo FailLShiftDWord
       
        If c >= 0 And c <= 31 Then
            dwT = dw * Power2(c)
           
            If dwT And &H80000000 Then
                LShiftDWord = CLng(dwT And &H7FFFFFFF) Or &H80000000
            Else
                LShiftDWord = dwT
            End If
        End If
       
        Exit Function
FailLShiftDWord:
    LShiftDWord = &HFFFFFFFF
End Function

'Next code from "https://github.com"
Private Property Get Power2(ByVal i As Integer) As Long
If i >= 0 And i <= 31 Then

    If aPower2(0) = 0 Then
        aPower2(0) = &H1&
        aPower2(1) = &H2&
        aPower2(2) = &H4&
        aPower2(3) = &H8&
        aPower2(4) = &H10&
        aPower2(5) = &H20&
        aPower2(6) = &H40&
        aPower2(7) = &H80&
        aPower2(8) = &H100&
        aPower2(9) = &H200&
        aPower2(10) = &H400&
        aPower2(11) = &H800&
        aPower2(12) = &H1000&
        aPower2(13) = &H2000&
        aPower2(14) = &H4000&
        aPower2(15) = &H8000&
        aPower2(16) = &H10000
        aPower2(17) = &H20000
        aPower2(18) = &H40000
        aPower2(19) = &H80000
        aPower2(20) = &H100000
        aPower2(21) = &H200000
        aPower2(22) = &H400000
        aPower2(23) = &H800000
        aPower2(24) = &H1000000
        aPower2(25) = &H2000000
        aPower2(26) = &H4000000
        aPower2(27) = &H8000000
        aPower2(28) = &H10000000
        aPower2(29) = &H20000000
        aPower2(30) = &H40000000
        aPower2(31) = &H80000000
    End If

    Power2 = aPower2(i)
End If
End Property



Ниже пример использования Апи MaskBlt:
Код: Выделить всё
'pic.hdc - PictureBox
'mask.handle - StdPicture
'DSTCOPY & SRCERASE Constantes
MaskBlt Form1.hdc, DstX, DstY, Width, Height, pic.hdc, SrcX, SrcY, mask.Handle, 0, 0, MakeRop4(DSTCOPY, SRCERASE)


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList