Показать сообщение отдельно
Старый 14.10.2015, 08:44   #18
polopok
ПроЭктировщик
 
Регистрация: 17.07.2009
Сообщений: 182
Написано 51 полезных сообщений
(для 71 пользователей)
Ответ: Прозрачный прямоугольник с краем

Исправил функцию . теперь параметр Alpha в пределах [0 ; 255]
Alpha = 0 не прозрачно ; Alpha = 255 прозрачно

Код под спойлером :
Graphics 1024, 768, 32, 2
SetBuffer BackBuffer()

Local Alpha=0 : v = 5

While Not KeyHit(1)

     Alpha=Alpha + v
    
    If Alpha <=0 
        Delay 200
        v=5
    ElseIf     Alpha >= 255
        Delay 200
         v= -5
    EndIf
    Color 255,0,0
    Rect 0,0,100,100,1    
    Color 0,0,255
    Rect 100,0,100,100,1    
    Color 0,255,0
    Rect 200,0,100,100,1    
    Color 255,255,0
    Rect 300,0,100,100,1    
    Color 0,255,255
    Rect 400,0,100,100,1    
    Color 128,128,128
    Rect 0,100,200,100,1        
    Color 28,28,28
    Rect 0,200,200,100,1        
    Color 228,228,228
    Rect 300,100,200,100,1    
    Color 255,255,255
    Rect 200,100,100,200,1            
;    AlphaRect(50,50 , 400 , 200, 255, 0, 0, 255 , 1)    
    AlphaRect(50,50 , 400 , 200, 255, 0, 0, Alpha ,1 )

    Color 25,25,25
    Text 20, 20, Alpha
    Flip:Cls
Wend
End


Function AlphaRect(Point_X# = 0 ,Point_Y# = 0 ,width ,height ,R = 255 ,G = 255 ,B = 255 ,A% = 255 ,border = False)

If A <= 0 And border = False
    Return
ElseIf (A <= 0 And border = True ) Or (A > 0 And border = False ) Or (A > 0 And border = True )

    Buffer = BackBuffer()
    LockBuffer Buffer
    RGB =  255 Shl 24 Or R Shl 16 Or G Shl 8 Or B ;
    For localY# = Point_Y To  Point_Y + height -1
    For localX# = Point_X To Point_X + width -1
        If localX > 0 And localX < GraphicsWidth() And localY > 0 And localY < GraphicsHeight()
        bgRGB = ReadPixelFast (localX ,localY ,Buffer )

        WritePixelFast localX ,localY , GetPixelForOpacity( bgRGB , RGB , A),Buffer
        
        If border
            NewRGB =(255-RGB *(A-((255-RGB )*(255-bgRGB  ) Shr 8)-A) Shr 8)
            WritePixelFast localX ,Point_Y , NewRGB ,Buffer
            WritePixelFast localX ,Point_Y+ height , NewRGB , Buffer
            WritePixelFast Point_X ,localY, NewRGB ,Buffer
            WritePixelFast Point_X + width ,localY, NewRGB , Buffer
        EndIf
        End If

    Next : Next
    UnlockBuffer Buffer
End If
End Function 

Function GetPixelForOpacity( pixelBackground, pixelForeground, pixelAlpha)
    If pixelForeground = $ff000000 Then pixelForeground = pixelBackground
        bgsourceR = ((pixelForeground And $00FF0000) Shr 16);
        bgsourceG = ((pixelForeground And $0000FF00) Shr 8);
        bgsourceB = ((pixelForeground And $000000FF));

        sourceR = ((pixelBackground And $00FF0000) Shr 16);
        sourceG = ((pixelBackground And $0000FF00) Shr 8);
        sourceB = ((pixelBackground And $000000FF));

        newR = sourceR * pixelAlpha/255 + bgsourceR * ( 255-pixelAlpha)/255;
        newG = sourceG * pixelAlpha/255 + bgsourceG * (255- pixelAlpha)/255;
        newB = sourceB * pixelAlpha/255 + bgsourceB * (255- pixelAlpha)/255;

        Return (255 Shl 24 Or newR Shl 16 Or newG Shl 8 Or newB);
End Function 
__________________
Мой проект здесь
(Offline)
 
Ответить с цитированием