Sources PureBasic
Sources PureBasicConsultez toutes les sources
Nombre d'auteurs : 41, nombre de sources : 88, dernière mise à jour : 13 août 2011
- Affichage d'un texte sur toute la diagonale d'une image
- Déformation d'une image
- Quelques exemples d'utilisation de la fonction CustomFilterCallback()
- Démo : Contour d'un texte dans une image, avec de très jolis effets.
- Codage informatique des couleurs : RGB, CMY, HLS, HSL (HLS, HSI)
- Lotus démo , ou un nouvel exemple avec CustomFilterCallback()
- Réaliser une interface de type 'Cover Flow'
Pour les besoins d'un éditeur srod avait besoin d'inscrire un texte en lieu et place d'une image qui ne serait pas définie, etc.
Le texte est calculé de façon à occuper la diagonale de l'image manquante.
;Based on code by Bluid-fyte.
text$ =
"NO IMAGE DEFINED!"
If
OpenWindow(0
, 0
, 0
, 600
, 600
, ""
,#PB_Window_SystemMenu
|
#PB_Window_ScreenCentered
)
;Create an EMF to house the text.
hdc =
CreateEnhMetaFile_(0
, 0
, 0
, 0
)
If
hdc
oldBrush =
SelectObject_(hdc, GetStockObject_(#NULL_BRUSH
))
oldPen =
SelectObject_(hdc, GetStockObject_(#WHITE_PEN
))
SetBkMode_(hdc, #TRANSPARENT
)
hFont =
CreateFont_(100
,55
,450
,0
.0
,0
,0
,0
,0
,0
,0
,0
,0
,0
,"ARIAL"
)
oldFont =
SelectObject_(hdc, hFont)
SetTextAlign_(hdc, #TA_LEFT
|
#TA_BOTTOM
)
BeginPath_(hdc)
TextOut_(hdc, 70
, 510
,text$, Len(text$))
EndPath_(hdc)
SelectObject_(hdc, oldFont)
DeleteObject_(hFont)
StrokeAndFillPath_(hdc)
SelectObject_(hdc, oldPen)
SelectObject_(hdc, oldBrush)
hEMF =
CloseEnhMetaFile_(hdc)
EndIf
width =
WindowWidth(0
)
height =
WindowHeight(0
)
;Now an image gadget etc.
If
CreateImage(1
, width, height, 24
)
hdc =
StartDrawing(ImageOutput(1
))
If
hdc
SetRect_(rc.RECT, 0
, 0
, width,height)
PlayEnhMetaFile_(hdc, hEMF, rc)
StopDrawing()
ImageGadget(1
, 0
,0
,0
,0
,ImageID(1
))
EndIf
EndIf
Repeat
EventID =
WaitWindowEvent()
Until
EventID =
#PB_Event_CloseWindow
DeleteEnhMetaFile_(hEMF)
EndIf
Ce code permet de déformer une image.
;"Image Rotate, Pull, Reverse & Stretch"
Structure
PointF : X.f : Y.f : EndStructure
Structure
FLEX
pt.POINT
Plg.POINT[4
]
Vertx.POINT[4
]
s1.f[4
]
S2.PointF[4
]
EndStructure
Global
__Clip ,__Hatch,__Rim
Global
_Brush,_BrushRGB,_BrushStyle
Global
_DRAWING,_Grid,_Mode
Global
_MyFont10=
FontID(LoadFont(-
1
,"Arial"
,10
))
Global
_OldBrush,_Pen,_PenRGB,_PenStyle,_ShowCornerNumbers=
1
,_Showflag=
1
Global
_X,_Xmax,_Xmin,_Y,_Ymax,_Ymin
Global
Dim
Color(0
, 0
)
Global
Dim
Grid.POINT(0
, 0
)
Global
_Flex.FLEX
Title$ =
"Image Rotate, Pull, Reverse & Stretch"
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()
#DBLUE
=
$660000
#LBLUE
=
$FFFCC2
Enumeration
#ImGad
#IMG
#IMG2
#Open
#SaveAs
#CornerNumbers
#Quit
#HorVer
#Diag
#Grid
#GridIMG
EndEnumeration
Macro
MMx : WindowMouseX(EventWindow()) : EndMacro
Macro
MMy : WindowMouseY(EventWindow()) : EndMacro
Macro
MMK
Abs(GetAsyncKeyState_(#VK_LBUTTON
) +
GetAsyncKeyState_(#VK_RBUTTON
)*
2
+
GetAsyncKeyState_(#VK_MBUTTON
)*
3
)/
$8000
EndMacro
Macro
MouseOverGad ;- MouseOverGad : ret GadgetID under mouse
WindowFromPoint_(MMx|
MMy<<
32
)
EndMacro
Macro
LoBound(A,B) : If
A<
B :A=
B:EndIf
: EndMacro
Macro
HiBound(A,B) : If
A>
B :A=
B:EndIf
: EndMacro
Procedure
InMousEX(X,Y,X1,Y1)
SetRect_(rc.RECT,X,Y,X1,Y1)
ProcedureReturn
PtInRect_(@rc,MMx|
MMy<<
32
)
EndProcedure
Procedure
EndClip() ;- EndClip
SelectClipRgn_(_DRAWING, 0
)
DeleteObject_(__Clip)
EndProcedure
Procedure
Clip(X,Y,X1,Y1) ;- Clip(X,Y,X1,Y1)
If
__Clip:EndClip():EndIf
__Clip =
CreateRectRgn_(X,Y,X1,Y1)
If
__Clip : SelectClipRgn_(_DRAWING, __Clip)
Else
: __Clip=
0
EndIf
EndProcedure
Macro
STOPDRAW ;- StopDraw
If
_DRAWING
StopDrawing() : _DRAWING=
0
: EndIf
EndMacro
Macro
DrawIMG(IMG) ;- DrawIMG(IMG) ; #ImageOutput=2
STOPDRAW
_DRAWING=
StartDrawing(ImageOutput(IMG)) ;<
EndMacro
Procedure
Min(A,B)
If
A<
B:ProcedureReturn
A:EndIf
ProcedureReturn
B
EndProcedure
Procedure
ClsImg(IMG,RGB=
0
) ;-ClsImg(IMG,RGB=0)
DrawIMG(IMG)
Box(0
,0
,ImageWidth(IMG),ImageHeight(IMG),RGB)
EndProcedure
Macro
DelBrush() ;-DelBrush()
If
_Brush :DeleteObject_(_Brush) :EndIf
_Brush=
0
If
_OldBrush : SelectObject_(_DRAWING, _OldBrush) : EndIf
_BrushRGB=
0
EndMacro
Procedure
Brush(BrushRGB,style=
#BS_SOLID
,Hatch=
0
) ;- Brush(BrushRGB,Style=#BS_SOLID,Hatch=0) #BS_HOLLOW, #BS_PATTERN
Protected
L.LOGBRUSH
DelBrush()
L\lbStyle=
style
L\lbColor=
BrushRGB
L\lbHatch=
Hatch
_Brush =
CreateBrushIndirect_(@L)
_OldBrush=
SelectObject_(_DRAWING,_Brush)
_BrushRGB=
BrushRGB
_BrushStyle=
style
__Hatch=
Hatch
EndProcedure
Macro
DelPen() ;- DelPen
If
_Pen: DeleteObject_(_Pen) :EndIf
_Pen=
0
: _PenRGB=
0
:__Rim=
0
EndMacro
Macro
Pen(Rim=
1
, PenRGB=
0
,style=
#PS_SOLID
) ;- Pen(Rim=1, PenRGB=0,style=#ps_solid)
DelPen()
If
style=
#NULL_PEN
_Pen=
SelectObject_(_DRAWING,GetStockObject_ ( #NULL_PEN
))
Else
_Pen=
CreatePen_(style,Rim,PenRGB)
SelectObject_(_DRAWING,_Pen)
EndIf
__Rim=
Rim
_PenRGB=
PenRGB
_PenStyle=
style
EndMacro
Procedure
CenterTXT(X,Y,Wi,He,T.S)
Protected
TextWidth=
TextWidth(T),TextHeight=
TextHeight(T)
Protected
X1=
X+
Wi,Y1=
Y+
He
Clip(X,Y,X1,Y1)
If
TextWidth>
Wi : DrawText(X,(Y+
Y1)/
2
-
TextHeight/
2
, T)
Else
: DrawText((X+
X1)/
2
-
TextWidth/
2
, (Y1+
Y)/
2
-
TextHeight/
2
, T)
EndIf
EndClip()
EndProcedure
Procedure
Corners() ;- draw corners
Protected
i
With
_Flex
DrawingFont(_MyFont10)
FrontColor(#LBLUE
):BackColor(#DBLUE
)
For
i =
0
To
3
Circle (\Vertx[i]\X , \Vertx[i]\Y, 9
,#DBLUE
)
CenterTXT(\Vertx[i]\X-
5
,\Vertx[i]\Y-
5
,10
,10
,Str(i))
Next
EndWith
EndProcedure
Procedure
Bounding() ;- Bounding()
Protected
i
With
_Flex
_Xmax=
0
: _Xmin=
$FFFFFF
:_Ymax=
0
:_Ymin=
$FFFFFF
For
i =
0
To
3
HiBound(_Xmin,\Vertx[i]\X)
LoBound(_Xmax,\Vertx[i]\X)
HiBound(_Ymin,\Vertx[i]\Y)
LoBound(_Ymax,\Vertx[i]\Y)
Next
EndWith
EndProcedure
Procedure
STP(A,B,C,D,E) ;- STP(A,B,C,D,E) - aux de Sizes
With
_Flex
\s1[0
] =
(\S2[A]\X -
\S2[B]\X) /
E
\s1[1
] =
(_Flex\Vertx[C]\X -
_Flex\Vertx[D]\X) /
E
\s1[2
] =
(\S2[A]\Y -
\S2[B]\Y) /
E
\s1[3
] =
(_Flex\Vertx[C]\Y -
_Flex\Vertx[D]\Y) /
E
EndWith
EndProcedure
Procedure
Sizes()
Protected
i,j,A.f,B.f,C.f,D.f
With
_Flex
; _Xmax = 0 : _Xmin = _X : _Ymax = 0 : _Ymin = _Y
Bounding()
\S2[0
]\X =
(\Vertx[1
]\X -
\Vertx[0
]\X) /
\pt\X ; step X HOR TOP
\S2[0
]\Y =
(\Vertx[1
]\Y -
\Vertx[0
]\Y) /
\pt\X ; step Y HOR TOP
\S2[1
]\X =
(\Vertx[2
]\X -
\Vertx[3
]\X) /
\pt\X ; step X HOR BOTTOM
\S2[1
]\Y =
(\Vertx[2
]\Y -
\Vertx[3
]\Y) /
\pt\X ; step Y HOR BOTTOM
\S2[2
]\X =
(\Vertx[3
]\X -
\Vertx[0
]\X) /
\pt\Y ; step X VER LEFT
\S2[2
]\Y =
(\Vertx[3
]\Y -
\Vertx[0
]\Y) /
\pt\Y ; step Y VER LEFT
\S2[3
]\X =
(\Vertx[2
]\X -
\Vertx[1
]\X) /
\pt\Y ; step X VER RIGHT
\S2[3
]\Y =
(\Vertx[2
]\Y -
\Vertx[1
]\Y) /
\pt\Y ; step Y VER RIGHT
STP(1
,0
,3
,0
,\pt\Y)
For
j =
0
To
\pt\Y
A=
\S2[0
]\X +
\s1[0
]*
j
B=
\Vertx[0
]\X +
\s1[1
]*
j
C=
\S2[0
]\Y +
\s1[2
]*
j
D=
\Vertx[0
]\Y +
\s1[3
]*
j
For
i =
0
To
\pt\X
Grid(i,j)\X=
A*
i+
B
Grid(i,j)\Y=
C*
i+
D
Next
Next
STP(3
,2
,1
,0
,\pt\X)
For
j =
0
To
\pt\X
A=
\S2[2
]\X +
\s1[0
]*
j
B=
\Vertx[0
]\X +
\s1[1
]*
j
C=
\S2[2
]\Y +
\s1[2
]*
j
D=
\Vertx[0
]\Y +
\s1[3
]*
j
For
i =
1
To
\pt\Y
Grid(j,i)\X=
A*
i+
B
Grid(j,i)\Y=
C*
i+
D
Next
Next
EndWith
EndProcedure
Procedure
FastGrid(Wi,He,StpX=
24
,StpY=-
1
,RGB=-
1
)
If
StpY=-
1
:StpY=
StpX:EndIf
If
RGB=-
1
:RGB=
$555555
:EndIf
For
Y=
0
To
He
LineXY(0
,Y,Wi,Y,RGB)
Y+
StpY
Next
For
X=
0
To
Wi
LineXY(X,0
,X,He,RGB)
X+
StpX
Next
EndProcedure
Macro
InitGrid() ;- InitGrid()
CreateImage(#GridIMG
,_X,_Y)
DrawIMG(#GridIMG
)
FastGrid(_X,_Y,30
,30
)
STOPDRAW
EndMacro
Procedure
FastImage() ;- Faster than ShowImage - ONLY POINTS to circumvent the Polygon drawing
Static
i,j,STP
With
_Flex
If
_Grid
FreeImage(#IMG
)
GrabImage(#GridIMG
,#IMG
,0
,0
,_X,_Y)
DrawIMG(#IMG
)
Else
DrawIMG(#IMG
)
ClsImg(#IMG
)
EndIf
If
_ShowCornerNumbers : Corners() : EndIf
STP=
\pt\X/
120
; LONGER STP = QUICKER DRAWING
LoBound(STP,1
)
i=
0
Repeat
; Increase Stp for slow processor
j=
0
Repeat
Box(Grid(i, j)\X, Grid(i, j)\Y,1
,1
, Color(i, j))
j+
STP
Until
j>=
\pt\Y
i+
STP
Until
i>=
\pt\X
STOPDRAW
SetGadgetState(#ImGad
, ImageID(#IMG
))
EndWith
EndProcedure
Procedure
Polyg( Sides,*
P,RGB=-
1
) ;P= array of POINT struc with polyg vertices ; sides >1
If
RGB>-
1
Pen(1
,RGB):Brush(RGB)
EndIf
Polygon_(_DRAWING,*
P,Sides)
EndProcedure
Procedure
ShowImage()
Protected
i,j,i2,j2
With
_Flex
If
_Grid
FreeImage(#IMG
)
GrabImage(#GridIMG
,#IMG
,0
,0
,_X,_Y)
DrawIMG(#IMG
)
Else
DrawIMG(#IMG
)
ClsImg(#IMG
,0
)
EndIf
If
_ShowCornerNumbers : Corners() : EndIf
For
i =
0
To
\pt\X
DrawIMG(#IMG
)
If
MMK =
1
: _Showflag=
0
: ProcedureReturn
: EndIf
; show interruptus
i2=
i+
1
WindowEvent()
For
j =
0
To
\pt\Y
If
j <
\pt\Y And
i <
\pt\X
j2=
j+
1
\Plg[0
]\X =
Grid(i ,j )\X ; Polygon positions
\Plg[0
]\Y =
Grid(i ,j )\Y
\Plg[1
]\X =
Grid(i2,j )\X
\Plg[1
]\Y =
Grid(i2,j )\Y
\Plg[2
]\X =
Grid(i2,j2)\X
\Plg[2
]\Y =
Grid(i2,j2)\Y
\Plg[3
]\X =
Grid(i ,j2)\X
\Plg[3
]\Y =
Grid(i ,j2)\Y
Pen(1
,Color(i,j)):Brush(Color(i,j))
Polyg(4
,\Plg[0
])
Else
Plot(Grid(i,j)\X, Grid(i,j)\Y, Color(i,j)) ; only 1 pixel for the last line
EndIf
Next
If
_ShowCornerNumbers : Corners() : EndIf
STOPDRAW
SetGadgetState(#ImGad
,ImageID(#IMG
))
Next
EndWith
EndProcedure
Procedure
SaveImg(DefaultFile$=
""
,Title.S=
"Save Image"
) ; Save Image
Protected
Flag, Pattern$ =
"(*.bmp)|*.bmp|"
Pattern$ +
"(*.jpg)|*.jpg|"
Pattern$ +
"(*.png)|*.png|"
File$=
SaveFileRequester("Please Choose The File Name To Save"
, DefaultFile$, Pattern$, 0
)
If
File$
If
_ShowCornerNumbers
Flag=
1
_ShowCornerNumbers =
0
EndIf
If
_Grid
Flag+
2
_Grid=
0
EndIf
If
Flag : ShowImage() : EndIf
Select
SelectedFilePattern()
Case
0
: SaveImage(#IMG
,File$,#PB_ImagePlugin_BMP
)
Case
1
: SaveImage(#IMG
,File$,#PB_ImagePlugin_JPEG
,10
)
Case
2
: SaveImage(#IMG
,File$,#PB_ImagePlugin_PNG
)
EndSelect
MessageRequester(""
,"Saved to "
+
File$, #PB_MessageRequester_Ok
)
Else
MessageRequester(""
,"File Not Saved"
, #PB_MessageRequester_Ok
)
EndIf
If
Flag=
1
Or
Flag=
3
:_ShowCornerNumbers=
1
:EndIf
If
Flag=
2
Or
Flag=
3
:_Grid=
1
:EndIf
If
Flag:ShowImage():EndIf
EndProcedure
Procedure
$ GetLastDir(LastDirFile.S)
Protected
Temp=
ReadFile(-
1
,GetTemporaryDirectory()+
LastDirFile)
If
Temp
LastDir.S=
ReadString(Temp)
CloseFile(Temp)
EndIf
ProcedureReturn
LastDir.S
EndProcedure
Procedure
SetLastDir(LastDirFile.S,LastDir.S) ;-SetLastDir - pone en TempDir
Protected
Temp
DeleteFile(GetTemporaryDirectory()+
LastDirFile)
Temp=
OpenFile(-
1
,GetTemporaryDirectory()+
LastDirFile)
If
Temp
WriteString(Temp,LastDir)
CloseFile(Temp)
EndIf
EndProcedure
Procedure
LeeImg(*
P.POINT)
Protected
StandardFile$
Static
IMG,hIMG
If
IsImage(IMG):FreeImage(IMG):EndIf
If
hIMG:DeleteDC_(hIMG):EndIf
LastDirFile.S=
"EstiraLast"
Pattern$ =
"Images (*.bmp, *.jpg, *.png, *.tiff, *.tga)|*.bmp;*.jpg; *.png; *.tiff ; *.tga |All files (*.*)|*.*"
StandardFile$=
GetLastDir(LastDirFile)
If
StandardFile$=
""
StandardFile$ =
"c:\" ; put here your image directory
EndIf
File$ =
OpenFileRequester("Load Image"
, StandardFile$, Pattern$, Pattern)
If
File$
StandardFile$=
GetPathPart(File$)
SetLastDir(LastDirFile,StandardFile$)
hIMG =
CreateCompatibleDC_(GetDC_(WindowID(0
)))
IMG =
LoadImage(#PB_Any
, File$, #PB_Image_DisplayFormat
)
If
ImageWidth(IMG)>
_X
ResizeImage(IMG,_X,ImageHeight(IMG))
EndIf
If
ImageHeight(IMG)>
_Y
ResizeImage(IMG,ImageWidth(IMG),_Y)
EndIf
*
P\X=
ImageWidth(IMG):*
P\Y=
ImageHeight(IMG)
SelectObject_(hIMG, ImageID(IMG))
ProcedureReturn
hIMG
EndIf
EndProcedure
Procedure
Menu(Win=
0
) ;- Menu(win)
Protected
Menu=
CreateMenu(-
1
, WindowID(Win))
MenuTitle(" File"
)
MenuItem(#Open
,"Open "
)
MenuBar()
MenuItem(#SaveAs
,"Save As"
)
MenuBar()
MenuItem(#Quit
,"Quit"
)
MenuTitle(" Options"
)
MenuItem( #CornerNumbers
, "Switch Corner Numbers"
)
MenuBar()
MenuItem(#Grid
,"Switch Grid"
)
ProcedureReturn
Menu
EndProcedure
Procedure
NewImage()
Protected
hIMG =
LeeImg(@P.POINT) ,X,Y,CenterX,CenterYsz
With
_Flex
If
hIMG
\pt\X =
P\X -
1
: \pt\Y =
P\Y -
1
Global
Dim
Color(\pt\X, \pt\Y)
Global
Dim
Grid.POINT (\pt\X, \pt\Y )
For
X =
0
To
\pt\X
For
Y =
0
To
\pt\Y
Color(X, Y) =
GetPixel_(hIMG, X, Y)
Next
Next
CenterX=
_X/
2
:CenterY=
_Y/
2
SZ=
Min(_X,_Y)/
10
\Vertx[0
]\X =
CenterX-
SZ
\Vertx[0
]\Y =
CenterY-
SZ
\Vertx[1
]\X =
CenterX+
SZ
\Vertx[1
]\Y =
CenterY-
SZ
\Vertx[2
]\X =
CenterX+
SZ
\Vertx[2
]\Y =
CenterY+
SZ
\Vertx[3
]\X =
CenterX-
SZ
\Vertx[3
]\Y =
CenterY+
SZ
Sizes() : ShowImage()
EndIf
EndWith
EndProcedure
Procedure
GetDistance(A1,A2) ;- GetDistance(a1,a2)
ProcedureReturn
Sqr(A1*
A1 +
A2*
A2)
EndProcedure
Procedure
Near(X,Y); X, Y, ArrSize, ARRAY P.POINT(1)) ; Return elem de Array de Points Nearest to x,y
Protected
A,i,min
With
_Flex
min =
$FFFFFFF
For
i =
0
To
3
A =
GetDistance(X -
\Vertx[i]\X, Y -
\Vertx[i]\Y)
If
A <
min : min =
A : Near =
i : EndIf
Next
i
ProcedureReturn
Near
EndWith
EndProcedure
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
If
OpenWindow(0
, 100
, 100
,600
,400
,Title$, #WS_OVERLAPPEDWINDOW
|
#WS_MAXIMIZE
)
SetWindowColor(0
,0
)
StickyWindow(0
,1
)
_X=
WindowWidth(0
):_Y=
WindowHeight(0
)
Menu()
CreateImage(#IMG
, _X,_Y,32
)
ImageGadget(#ImGad
,0
,0
,0
,0
,ImageID(#IMG
))
SetWindowLongPtr_(GadgetID(#ImGad
), -
20
, GetWindowLongPtr_(GadgetID(#ImGad
), -
20
) |
$2000000
)
InitGrid() : NewImage()
With
_Flex
Repeat
If
GetAsyncKeyState_(#VK_ESCAPE
) : End
:EndIf
Ev =
WaitWindowEvent(1
)
Select
Ev
Case
#PB_Event_Menu
Select
EventMenu() ; To see which menu has been selected
Case
#Quit
: End
Case
#Open
:NewImage()
Case
#SaveAs
:SaveImg()
Case
#CornerNumbers
; switch corner numbers
_ShowCornerNumbers =
1
-
_ShowCornerNumbers
ShowImage()
Case
#Grid
_Grid=
1
-
_Grid
ShowImage()
EndSelect
Case
#PB_Event_SizeWindow
_X=
WindowWidth(0
):_Y=
WindowHeight(0
)
ShowImage()
Default
If
Ev=
#WM_MOUSEMOVE
If
MMK =
1
If
InMousEX(1
,1
,_X-
4
,_Y-
4
)
If
Sel =
0
Near =
Near(MMx,MMy)
Sel =
1
EndIf
_Showflag =
0
\Vertx[Near]\X =
MMx
\Vertx[Near]\Y =
MMy
Sizes() : FastImage()
EndIf
EndIf
EndIf
If
MMK=
0
If
_Showflag =
0
: _Showflag =
1
: ShowImage() : EndIf
Sel =
0
EndIf
EndSelect
Until
Ev =
#PB_Event_CloseWindow
EndWith
EndIf
End
Le code qui suit comporte 2 exemples avec la fonction CustomFilterCallback(),
l'appel se fait aux lignes 65, 66 :
- ;NoiseFilter() ; Supprimez le commentaire pour tester cette fonction
- PixelFilter() ; mettez cette ligne en commentaire pour tester la fonction ci dessus.
Le premier code est complet et permet de tester les 2 premiers effets, plus bas
vous trouverez d'autres effets sous forme d'une procédure uniquement,
vous pourrez prendre modèle sur le premier code pour les utiliser.
UsePNGImageDecoder()
Procedure
NoiseFilterCallback(x, y, SourceColor, TargetColor)
If
(x+
y)%5
=
0
ProcedureReturn
TargetColor
EndIf
xn=
x-
1
+
Random(2
)
yn=
y-
1
+
Random(2
)
If
xn<
0
Or
xn>=
OutputWidth() Or
yn<
0
Or
yn>=
OutputHeight()
ProcedureReturn
TargetColor
EndIf
ProcedureReturn
Point(xn, yn)
EndProcedure
Procedure
NoiseFilter()
CustomFilterCallback(@NoiseFilterCallback())
EndProcedure
Procedure
PixelFilterCallback(x, y, SourceColor, TargetColor)
#pixelSize
=
5
xn=
#pixelSize
*
(x/
#pixelSize
)
yn=
#pixelSize
*
(y/
#pixelSize
)
ProcedureReturn
Point(xn, yn)
EndProcedure
Procedure
PixelFilter()
CustomFilterCallback(@PixelFilterCallback())
EndProcedure
If
OpenWindow(0
, 0
, 0
, 800
, 600
, ""
, #PB_Window_SystemMenu
|
#PB_Window_ScreenCentered
)
; load purebasic logo
CatchImage(100
, ?TestImage)
; background layer
If
CreateImage(0
, 800
, 600
, 32
) And
StartDrawing(ImageOutput(0
))
#box_size
=
7
Box(0
, 0
, 800
, 600
, $FFFFFF
)
For
y=
0
To
600
Step
#box_size
*
2
For
x=
0
To
800
Step
#box_size
*
2
Box(x, y, #box_size
, #box_size
, $C0C0C0
)
Box(x+
#box_size
, y+
#box_size
, #box_size
, #box_size
, $C0C0C0
)
Next
Next
; draw logo image
For
i=
1
To
60
DrawAlphaImage(ImageID(100
), Random(800
), Random(600
))
Next
StopDrawing()
EndIf
; drawing layer
CreateImage(1
, 800
, 600
, 32
)
SmartWindowRefresh(0
, 1
)
ImageGadget(1
, 0
, 0
, 0
, 0
, ImageID(1
))
Repeat
e=
WaitWindowEvent(0
)
If
e=
#PB_Event_ActivateWindow
Or
e=
#WM_MOUSEMOVE
StartDrawing(ImageOutput(1
))
; draw background
DrawImage(ImageID(0
), 0
, 0
)
; draw gradient filter
DrawingMode(#PB_2DDrawing_CustomFilter
)
;NoiseFilter()
PixelFilter()
Circle(WindowMouseX(0
), WindowMouseY(0
), 100
)
StopDrawing()
SetGadgetState(1
, ImageID(1
))
EndIf
Until
e=
#PB_Event_CloseWindow
EndIf
DataSection
TestImage :
Data
.b $89
, $50
, $4E
, $47
, $0D
, $0A
, $1A
, $0A
, $00
, $00
, $00
, $0D
, $49
, $48
, $44
, $52
Data
.b $00
, $00
, $00
, $30
, $00
, $00
, $00
, $30
, $08
, $06
, $00
, $00
, $00
, $57
, $02
, $F9
Data
.b $87
, $00
, $00
, $00
, $09
, $70
, $48
, $59
, $73
, $00
, $00
, $1C
, $20
, $00
, $00
, $1C
Data
.b $20
, $01
, $CD
, $0F
, $9B
, $9E
, $00
, $00
, $00
, $07
, $74
, $49
, $4D
, $45
, $07
, $D6
Data
.b $0C
, $1C
, $15
, $17
, $0D
, $B6
, $53
, $C9
, $04
, $00
, $00
, $0C
, $9C
, $49
, $44
, $41
Data
.b $54
, $68
, $DE
, $D5
, $99
, $79
, $8C
, $5D
, $D7
, $5D
, $C7
, $3F
, $E7
, $9C
, $7B
, $EF
Data
.b $5B
, $E6
, $BD
, $D9
, $17
, $CF
, $E2
, $78
, $A9
, $27
, $09
, $B6
, $A2
, $26
, $71
, $90
Data
.b $93
, $8A
, $2C
, $60
, $D2
, $02
, $6D
, $54
, $94
, $96
, $48
, $24
, $6D
, $11
, $55
, $55
Data
.b $05
, $A5
, $40
, $25
, $4A
, $04
, $52
, $A1
, $82
, $06
, $A9
, $8A
, $10
, $02
, $A1
, $A6
Data
.b $34
, $40
, $45
, $CB
, $2A
, $0A
, $51
, $A0
, $B4
, $84
, $2C
, $4E
, $52
, $E3
, $6C
, $B6
Data
.b $C7
, $F6
, $64
, $C6
, $19
, $7B
, $16
, $8F
, $67
, $5F
, $DF
, $BE
, $DF
, $77
, $CF
, $E1
Data
.b $8F
, $7B
, $66
, $3C
, $36
, $89
, $ED
, $B1
, $C7
, $48
, $1C
, $E9
, $E8
, $5E
, $DD
, $27
Data
.b $BD
, $FB
, $FB
, $9E
, $DF
, $F6
, $FD
, $FE
, $AE
, $62
, $8B
, $56
, $4B
, $3C
, $2A
, $9E
Data
.b $79
, $F4
, $A1
, $96
, $87
, $F6
, $DF
, $D6
, $11
, $53
, $2A
, $32
, $B6
, $94
, $52
, $81
Data
.b $D6
, $0E
, $A0
, $00
, $B9
, $61
, $0B
, $BB
, $B9
, $E4
, $FE
, $9A
, $96
, $D8
, $22
, $FB
Data
.b $C5
, $F4
, $23
, $0F
, $7E
, $B9
, $51
, $D7
, $FF
, $D8
, $F1
, $5C
, $29
, $1C
, $15
, $18
Data
.b $29
, $2B
, $06
, $72
, $46
, $90
, $D1
, $82
, $4C
, $A0
, $C9
, $D4
, $B5
, $49
, $D7
, $11
Data
.b $E9
, $BA
, $54
, $99
, $9A
, $A3
, $D2
, $15
, $A9
, $D2
, $45
, $44
, $2A
, $A7
, $4D
, $7A
Data
.b $36
, $5F
, $4A
, $1D
, $3E
, $37
, $93
, $7E
, $73
, $72
, $B6
, $70
, $66
, $25
, $E5
, $07
Data
.b $DA
, $68
, $60
, $6D
, $07
, $F6
, $7A
, $63
, $00
, $9C
, $79
, $E2
, $D1
, $9B
, $55
, $A6
Data
.b $30
, $50
, $74
, $DD
, $06
, $E3
, $07
, $18
, $BF
, $8E
, $30
, $06
, $61
, $C0
, $51
, $02
Data
.b $E5
, $39
, $38
, $9E
, $83
, $F2
, $5C
, $1C
, $C7
, $C5
, $95
, $02
, $19
, $F8
, $50
, $2E
Data
.b $41
, $AD
, $82
, $10
, $E0
, $7A
, $11
, $94
, $E7
, $82
, $52
, $B5
, $74
, $AE
, $58
, $D0
Data
.b $F9
, $6A
, $26
, $55
, $F5
, $8F
, $DC
, $F9
, $C3
, $D7
, $9E
, $06
, $E6
, $81
, $8C
, $05
Data
.b $72
, $D1
, $72
, $AE
, $D7
, $F8
, $87
, $6F
, $DE
, $A1
, $A2
, $E9
, $FC
, $B7
, $A7
, $CF
Data
.b $4F
, $37
, $68
, $40
, $1B
, $83
, $36
, $60
, $08
, $37
, $F6
, $AA
, $0D
, $04
, $1A
, $02
Data
.b $6D
, $D0
, $08
, $94
, $1B
, $C5
, $69
, $6A
, $C2
, $69
, $6C
, $42
, $7A
, $1E
, $A2
, $0A
Data
.b $C2
, $57
, $4C
, $8D
, $0C
, $7A
, $1D
, $41
, $AD
, $75
, $5F
, $57
, $57
, $FC
, $E1
, $D7
Data
.b $DE
, $01
, $B8
, $17
, $78
, $1D
, $28
, $DC
, $10
, $00
, $7F
, $76
, $FF
, $81
, $2F
, $2E
Data
.b $9C
, $9D
, $78
, $C0
, $6C
, $74
, $AB
, $00
, $63
, $42
, $F7
, $5E
, $78
, $6E
, $C2
, $80
Data
.b $17
, $20
, $8D
, $41
, $FB
, $15
, $AA
, $2B
, $15
, $CA
, $2B
, $4B
, $61
, $6C
, $08
, $45
Data
.b $C1
, $D4
, $89
, $F9
, $25
, $F6
, $DF
, $B4
, $DD
, $FC
, $C2
, $91
, $E3
, $E9
, $C9
, $62
Data
.b $69
, $9B
, $B5
, $B1
, $F6
, $7E
, $C6
, $63
, $93
, $EA
, $9A
, $D7
, $D0
, $AF
, $3D
, $BA
Data
.b $33
, $37
, $B3
, $F0
, $8D
, $AA
, $EF
, $83
, $31
, $18
, $13
, $9A
, $6B
, $36
, $A2
, $31
Data
.b $1B
, $1E
, $08
, $90
, $02
, $A4
, $B4
, $5B
, $80
, $14
, $06
, $25
, $C0
, $77
, $14
, $54
Data
.b $0A
, $3C
, $B0
, $BD
, $8F
, $2F
, $9D
, $1A
, $C9
, $1F
, $4B
, $65
, $97
, $80
, $53
, $C0
Data
.b $00
, $B0
, $B8
, $E5
, $00
, $6E
, $EF
, $68
, $91
, $D1
, $E5
, $D4
, $B7
, $B2
, $D9
, $6C
Data
.b $23
, $18
, $CC
, $DA
, $59
, $6F
, $30
, $DE
, $98
, $0D
, $BF
, $58
, $8F
, $20
, $D6
, $C2
Data
.b $CB
, $80
, $08
, $EF
, $44
, $43
, $92
, $62
, $6E
, $85
, $7B
, $BB
, $B7
, $F1
, $17
, $E7
Data
.b $E7
, $4A
, $FF
, $3C
, $35
, $37
, $0F
, $BC
, $03
, $BC
, $0C
, $BC
, $07
, $14
, $2F
, $FE
Data
.b $E7
, $2D
, $00
, $F0
, $DC
, $CF
, $3F
, $F0
, $B9
, $D4
, $C2
, $E2
, $CF
, $69
, $63
, $42
Data
.b $43
, $0D
, $18
, $63
, $CD
, $5D
, $F7
, $C6
, $C5
, $EF
, $34
, $EF
, $03
, $D0
, $4D
, $B6
Data
.b $B0
, $9C
, $5A
, $E4
, $F6
, $D6
, $56
, $4E
, $94
, $AB
, $B5
, $AF
, $0D
, $9D
, $59
, $02
Data
.b $4E
, $00
, $2F
, $59
, $0F
, $64
, $3F
, $A8
, $02
, $61
, $6B
, $F4
, $A6
, $D7
, $C0
, $AF
Data
.b $7E
, $AA
, $A7
, $3E
, $33
, $FF
, $7C
, $B1
, $52
, $89
, $E9
, $75
, $E3
, $2F
, $24
, $EE
Data
.b $7A
, $F2
, $1A
, $61
, $3D
, $20
, $2C
, $B0
, $8B
, $81
, $44
, $92
, $CD
, $2C
, $66
, $D3
Data
.b $EC
, $F0
, $1C
, $62
, $8D
, $8D
, $C1
, $27
, $0F
, $1F
, $5D
, $AE
, $69
, $3D
, $08
, $FC
Data
.b $27
, $F0
, $DF
, $36
, $74
, $EA
, $97
, $B3
, $65
, $D3
, $49
, $BC
, $2D
, $1E
, $95
, $0D
Data
.b $CB
, $A9
, $3F
, $9F
, $CF
, $64
, $5B
, $EB
, $DA
, $86
, $87
, $14
, $08
, $21
, $C2
, $E4
Data
.b $15
, $62
, $3D
, $65
, $8D
, $08
, $BD
, $83
, $30
, $17
, $9D
, $BC
, $30
, $E0
, $C5
, $13
Data
.b $A4
, $2A
, $55
, $9A
, $B4
, $4F
, $7F
, $4F
, $AF
, $B9
, $FF
, $D5
, $37
, $53
, $85
, $7A
Data
.b $7D
, $14
, $38
, $04
, $1C
, $B1
, $A5
, $D3
, $BF
, $92
, $3D
, $9B
, $06
, $F0
, $BD
, $BB
Data
.b $6F
, $DB
, $51
, $2A
, $64
, $9B
, $DC
, $98
, $BB
, $D4
, $28
, $44
, $9B
, $13
, $68
, $55
Data
.b $01
, $7C
, $24
, $01
, $10
, $04
, $9A
, $7A
, $50
, $47
, $23
, $C2
, $92
, $23
, $42
, $4F
Data
.b $5C
, $F4
, $52
, $2F
, $42
, $59
, $45
, $08
, $52
, $33
, $7C
, $64
, $D7
, $4E
, $1E
, $79
Data
.b $EB
, $64
, $F6
, $5C
, $A1
, $34
, $09
, $FC
, $D8
, $EE
, $F3
, $B6
, $F2
, $DC
, $90
, $4E
Data
.b $DC
, $00
, $7C
, $18
, $F8
, $B8
, $14
, $E2
, $CE
, $CE
, $88
, $D7
, $D6
, $1F
, $75
, $93
Data
.b $3B
, $A3
, $5E
, $BC
, $37
, $EA
, $C5
, $BA
, $63
, $D1
, $C8
, $81
, $F6
, $D6
, $86
, $42
Data
.b $D5
, $57
, $75
, $AD
, $C1
, $7A
, $06
, $04
, $CA
, $F5
, $30
, $DA
, $40
, $73
, $27
, $33
Data
.b $D3
, $A3
, $1C
, $DC
, $BE
, $9D
, $A7
, $46
, $27
, $0B
, $CF
, $8E
, $4D
, $4E
, $02
, $AF
Data
.b $00
, $CF
, $DB
, $F8
, $CF
, $7D
, $50
, $D2
, $6E
, $05
, $00
, $0F
, $E8
, $06
, $3E
, $64
Data
.b $AF
, $4D
, $76
, $37
, $02
, $4D
, $F7
, $75
, $B4
, $DC
, $FC
, $F5
, $5D
, $7D
, $3F
, $5D
Data
.b $F1
, $7D
, $A9
, $A5
, $40
, $08
, $89
, $10
, $82
, $68
, $A2
, $89
, $B2
, $72
, $E9
, $2E
Data
.b $67
, $19
, $CE
, $64
, $D8
, $D7
, $DE
, $C1
, $6B
, $C5
, $4A
, $F9
, $37
, $8F
, $0D
, $CE
Data
.b $D8
, $90
, $79
, $0E
, $78
, $13
, $48
, $5D
, $2E
, $69
, $B7
, $A2
, $91
, $F9
, $C0
, $1C
Data
.b $B0
, $02
, $44
, $2C
, $A0
, $28
, $10
, $FB
, $E8
, $AE
, $BE
, $9D
, $7F
, $78
, $53
, $CF
Data
.b $F7
, $D2
, $B9
, $9C
, $34
, $80
, $D1
, $06
, $21
, $34
, $5E
, $34
, $46
, $25
, $92
, $20
Data
.b $7D
, $EE
, $34
, $BB
, $3E
, $B4
, $C7
, $FC
, $D5
, $E8
, $54
, $7E
, $78
, $7C
, $2E
, $B7
Data
.b $58
, $A9
, $AE
, $00
, $EF
, $02
, $2F
, $DA
, $7A
, $9F
, $DE
, $8C
, $F1
, $D7
, $0A
, $C0
Data
.b $58
, $10
, $BE
, $AD
, $CF
, $02
, $E0
, $B7
, $EE
, $DC
, $1B
, $FB
, $62
, $6F
, $F7
, $B3
Data
.b $53
, $B3
, $B3
, $ED
, $D2
, $5A
, $61
, $0C
, $08
, $29
, $50
, $AD
, $3D
, $4C
, $9F
, $3D
Data
.b $C9
, $DD
, $BB
, $76
, $F3
, $C4
, $C0
, $70
, $EE
, $D0
, $D2
, $EA
, $14
, $30
, $04
, $0C
Data
.b $5B
, $00
, $A7
, $80
, $A5
, $0F
, $6A
, $56
, $5B
, $0A
, $E0
, $C4
, $E7
, $7F
, $B1
, $AF
Data
.b $AB
, $BD
, $E5
, $EE
, $B9
, $7C
, $31
, $FF
, $97
, $C7
, $4E
, $9F
, $FD
, $F6
, $D1
, $A1
Data
.b $55
, $A0
, $FE
, $1B
, $7B
, $76
, $FE
, $C9
, $FC
, $EC
, $DC
, $4F
, $79
, $9E
, $8B
, $D6
Data
.b $10
, $18
, $83
, $36
, $86
, $78
, $F7
, $2E
, $46
, $CE
, $BE
, $CB
, $BE
, $BE
, $3E
, $7E
Data
.b $F7
, $BD
, $F1
, $FC
, $CB
, $0B
, $4B
, $D3
, $B6
, $44
, $FE
, $97
, $6D
, $52
, $CB
, $96
Data
.b $E7
, $F8
, $D7
, $52
, $D2
, $37
, $95
, $03
, $23
, $8F
, $7C
, $7C
, $77
, $9B
, $E7
, $9F
Data
.b $90
, $E5
, $5A
, $A3
, $17
, $8B
, $E2
, $C6
, $63
, $A6
, $8C
, $9C
, $AF
, $69
, $31
, $5D
Data
.b $5C
, $4E
, $1D
, $F0
, $A5
, $C0
, $AF
, $07
, $54
, $FD
, $80
, $7A
, $60
, $50
, $89
, $36
Data
.b $06
, $C7
, $DE
, $A3
, $29
, $1E
, $E5
, $B9
, $D5
, $5C
, $F1
, $EF
, $C7
, $26
, $D7
, $8C
Data
.b $FF
, $37
, $DB
, $69
, $53
, $F6
, $D4
, $CD
, $B5
, $36
, $D4
, $AB
, $F6
, $C0
, $67
, $77
Data
.b $F7
, $39
, $CD
, $75
, $FF
, $AF
, $4B
, $42
, $37
, $CA
, $B6
, $26
, $F2
, $42
, $11
, $18
Data
.b $21
, $02
, $4D
, $4F
, $63
, $26
, $D7
, $D3
, $D8
, $D5
, $46
, $60
, $04
, $D5
, $9A
, $4F
Data
.b $B9
, $E2
, $83
, $8C
, $71
, $6C
, $6C
, $94
, $93
, $B3
, $73
, $2C
, $B5
, $75
, $54
, $FE
Data
.b $69
, $6C
, $72
, $19
, $38
, $69
, $3B
, $EC
, $80
, $35
, $BE
, $7E
, $BD
, $64
, $F2
, $6A
Data
.b $01
, $88
, $A7
, $EF
, $D8
, $F7
, $EB
, $C2
, $D1
, $0F
, $44
, $3D
, $17
, $53
, $AD
, $13
Data
.b $51
, $06
, $A9
, $1C
, $8C
, $00
, $A7
, $B3
, $05
, $E5
, $44
, $08
, $0C
, $18
, $E9
, $10
Data
.b $C8
, $18
, $D3
, $B9
, $22
, $AB
, $E9
, $15
, $5A
, $1C
, $C5
, $1D
, $1E
, $D1
, $5F
, $BE
Data
.b $7F
, $7F
, $B7
, $1B
, $8D
, $DC
, $E1
, $41
, $09
, $6D
, $92
, $43
, $99
, $DC
, $C9
, $3F
Data
.b $38
, $75
, $76
, $32
, $5D
, $F3
, $2B
, $36
, $7C
, $D6
, $44
, $8B
, $D9
, $F2
, $10
, $1A
Data
.b $FD
, $D4
, $47
, $F7
, $36
, $4B
, $73
, $54
, $C4
, $9C
, $B8
, $11
, $21
, $9D
, $14
, $CA
Data
.b $41
, $48
, $85
, $54
, $0A
, $A9
, $1C
, $84
, $0A
, $63
, $BF
, $EA
, $07
, $94
, $CB
, $3E
Data
.b $E5
, $9A
, $8F
, $89
, $46
, $A9
, $6B
, $4D
, $10
, $F8
, $54
, $4A
, $45
, $74
, $21
, $4F
Data
.b $BC
, $52
, $A0
, $39
, $E2
, $12
, $73
, $5C
, $DC
, $48
, $24
, $8F
, $1B
, $19
, $79
, $FC
Data
.b $E8
, $D0
, $D7
, $BE
, $3F
, $39
, $3B
, $68
, $2B
, $5B
, $75
, $4B
, $3D
, $F0
, $D4
, $87
Data
.b $6F
, $F6
, $9A
, $D1
, $DF
, $51
, $31
, $27
, $AE
, $37
, $E2
, $5E
, $A3
, $CE
, $6B
, $47
Data
.b $A6
, $0D
, $C6
, $08
, $04
, $02
, $29
, $15
, $AE
, $32
, $D4
, $7D
, $8D
, $A7
, $5C
, $DC
Data
.b $68
, $03
, $AD
, $8D
, $9D
, $18
, $2F
, $8A
, $69
, $68
, $24
, $9D
, $5A
, $62
, $F0
, $D8
Data
.b $6B
, $EC
, $4D
, $36
, $25
, $FF
, $71
, $75
, $31
, $FA
, $FD
, $C9
, $D9
, $7B
, $AC
, $E1
Data
.b $45
, $DB
, $81
, $AF
, $DA
, $0B
, $57
, $62
, $A3
, $E2
, $0B
, $3B
, $7B
, $9F
, $54
, $51
Data
.b $79
, $E0
, $82
, $02
, $17
, $17
, $5F
, $4D
, $C8
, $8F
, $D7
, $08
, $1D
, $58
, $5E
, $24
Data
.b $25
, $42
, $48
, $A4
, $08
, $29
, $85
, $90
, $0A
, $57
, $3A
, $88
, $62
, $85
, $F1
, $63
Data
.b $6F
, $B0
, $23
, $12
, $E7
, $07
, $D9
, $42
, $E9
, $F7
, $4F
, $BD
, $07
, $D0
, $62
, $8D
Data
.b $DE
, $DA
, $32
, $3A
, $F1
, $B1
, $03
, $B7
, $47
, $A4
, $F9
, $AA
, $72
, $54
, $28
, $0B
Data
.b $85
, $C4
, $08
, $19
, $1A
, $27
, $25
, $88
, $D0
, $48
, $83
, $E4
, $02
, $7B
, $5E
, $23
Data
.b $76
, $12
, $69
, $F9
, $90
, $10
, $E1
, $30
, $A2
, $5E
, $0F
, $38
, $79
, $FC
, $75
, $7A
Data
.b $84
, $66
, $C4
, $50
, $FB
, $CA
, $C0
, $F0
, $32
, $70
, $06
, $78
, $1B
, $18
, $03
, $CA
Data
.b $9B
, $CD
, $81
, $CB
, $D2
, $E9
, $A9
, $72
, $35
, $98
, $C9
, $E5
, $53
, $A3
, $4B
, $E9
Data
.b $F6
, $7A
, $D5
, $4F
, $B6
, $2B
, $E5
, $4A
, $C7
, $11
, $D2
, $71
, $2D
, $08
, $15
, $4A
Data
.b $AB
, $90
, $86
, $A2
, $8D
, $08
, $35
, $B1
, $D6
, $68
, $0D
, $46
, $48
, $A4
, $08
, $F3
Data
.b $04
, $E9
, $70
, $7A
, $78
, $80
, $58
, $3E
, $4D
, $D0
, $D8
, $58
, $7F
, $E4
, $C8
, $F1
Data
.b $45
, $5F
, $9B
, $41
, $E0
, $47
, $96
, $C0
, $CD
, $5F
, $4B
, $2F
, $B8
, $2C
, $80
, $91
Data
.b $7C
, $49
, $1D
, $5A
, $CD
, $55
, $7F
, $B8
, $94
, $CE
, $7F
, $F7
, $FC
, $C2
, $6A
, $A6
Data
.b $5C
, $F3
, $1E
, $EC
, $ED
, $EC
, $10
, $9E
, $7B
, $E1
, $F4
, $CD
, $05
, $FA
, $AC
, $4D
Data
.b $28
, $EA
, $03
, $1D
, $0A
, $FB
, $50
, $43
, $4A
, $A4
, $72
, $18
, $9B
, $38
, $4B
, $7D
Data
.b $69
, $86
, $8E
, $CE
, $8E
, $E0
, $13
, $87
, $8F
, $AD
, $14
, $EA
, $C1
, $69
, $CB
, $FB
Data
.b $5F
, $05
, $A6
, $AE
, $96
, $7D
, $6E
, $56
, $D0
, $68
, $9B
, $58
, $B3
, $BF
, $D4
, $DB
Data
.b $59
, $FD
, $C6
, $5D
, $7B
, $3F
, $EB
, $25
, $E3
, $6E
, $28
, $50
, $04
, $06
, $C9
, $F8
Data
.b $CC
, $2A
, $A5
, $89
, $31
, $DC
, $6A
, $99
, $A0
, $1E
, $A0
, $09
, $E3
, $5D
, $5B
, $50
Data
.b $42
, $2A
, $66
, $16
, $E6
, $C9
, $4C
, $8D
, $D2
, $DF
, $DB
, $AD
, $1F
, $3A
, $32
, $90
Data
.b $5A
, $A8
, $54
, $CF
, $5A
, $FE
, $F3
, $12
, $30
, $B1
, $D9
, $CA
, $B3
, $99
, $2A
, $54
Data
.b $07
, $52
, $5F
, $BD
, $75
, $47
, $ED
, $4B
, $BB
, $B7
, $FF
, $43
, $A4
, $B1
, $21
, $A6
Data
.b $B5
, $59
, $D7
, $B3
, $73
, $A9
, $02
, $93
, $13
, $A3
, $F4
, $75
, $B5
, $E9
, $4F
, $1E
Data
.b $3E
, $91
, $E9
, $95
, $54
, $EE
, $6B
, $49
, $AA
, $FD
, $AD
, $4D
, $89
, $BD
, $6D
, $6D
Data
.b $71
, $95
, $68
, $12
, $2B
, $5A
, $B1
, $30
, $31
, $CC
, $1D
, $7D
, $3D
, $E6
, $D3
, $EF
Data
.b $0C
, $66
, $CE
, $17
, $CB
, $13
, $F6
, $D4
, $5F
, $B1
, $C6
, $57
, $AE
, $A7
, $13
, $5F
Data
.b $B1
, $0F
, $C4
, $1D
, $47
, $4C
, $FC
, $CC
, $FE
, $67
, $22
, $ED
, $6D
, $8F
, $6B
, $A5
Data
.b $C2
, $E1
, $88
, $10
, $64
, $2A
, $9A
, $A3
, $43
, $C3
, $F4
, $B4
, $35
, $99
, $C7
, $4F
Data
.b $9D
, $4D
, $BD
, $97
, $2B
, $4E
, $02
, $A7
, $ED
, $00
, $AA
, $B9
, $41
, $A9
, $AE
, $FB
Data
.b $1A
, $63
, $DD
, $B7
, $34
, $44
, $DB
, $13
, $5E
, $34
, $FA
, $1F
, $A9
, $5C
, $F9
, $64
Data
.b $26
, $37
, $03
, $BC
, $06
, $FC
, $00
, $18
, $04
, $F2
, $D7
, $63
, $FC
, $55
, $01
, $98
Data
.b $3E
, $B8
, $FF
, $B1
, $44
, $6B
, $EB
, $DF
, $E2
, $45
, $84
, $16
, $60
, $90
, $54
, $EA
Data
.b $F0
, $C6
, $F0
, $08
, $6E
, $D4
, $31
, $5F
, $1F
, $9F
, $CD
, $0C
, $A4
, $B2
, $E7
, $AC
Data
.b $14
, $3C
, $64
, $75
, $6C
, $12
, $E8
, $B2
, $7A
, $A1
, $07
, $E8
, $B4
, $EF
, $1A
, $03
Data
.b $0E
, $5B
, $E3
, $B3
, $9B
, $A5
, $CE
, $9B
, $0E
, $A1
, $33
, $0F
, $DC
, $FE
, $13
, $89
Data
.b $64
, $F2
, $5B
, $78
, $AE
, $08
, $45
, $79
, $58
, $65
, $06
, $C6
, $26
, $79
, $7D
, $7A
Data
.b $86
, $F9
, $D6
, $B6
, $CA
, $C9
, $74
, $6E
, $09
, $38
, $6A
, $E3
, $F9
, $B8
, $55
, $53
Data
.b $CA
, $6A
, $84
, $04
, $D0
, $6C
, $05
, $8F
, $B4
, $9D
, $76
, $CE
, $9E
, $FC
, $75
, $1B
Data
.b $7F
, $D9
, $24
, $FE
, $D7
, $7B
, $F6
, $C5
, $F7
, $35
, $35
, $FE
, $48
, $26
, $13
, $3B
Data
.b $40
, $AC
, $CF
, $73
, $16
, $6B
, $01
, $E7
, $4B
, $45
, $2A
, $F9
, $02
, $F7
, $B4
, $35
Data
.b $B9
, $BF
, $F7
, $B3
, $F7
, $24
, $1F
, $DE
, $DD
, $A7
, $3E
, $D6
, $D7
, $99
, $2E
, $F9
Data
.b $C1
, $F4
, $78
, $AE
, $50
, $B5
, $B9
, $53
, $B1
, $86
, $AE
, $02
, $0B
, $C0
, $AC
, $05
Data
.b $50
, $B9
, $DE
, $B0
, $B9
, $62
, $08
, $25
, $5C
, $47
, $4C
, $1E
, $BC
, $EB
, $59
, $AF
Data
.b $B9
, $E9
, $0B
, $5A
, $CA
, $0B
, $E3
, $12
, $11
, $56
, $1F
, $5F
, $2A
, $2A
, $91
, $08
Data
.b $99
, $5C
, $91
, $F4
, $EA
, $2A
, $D1
, $5A
, $95
, $AE
, $64
, $03
, $1D
, $AD
, $CD
, $7E
Data
.b $C5
, $98
, $E3
, $73
, $85
, $D2
, $AB
, $87
, $E6
, $96
, $5F
, $FC
, $CA
, $B1
, $D3
, $43
Data
.b $DA
, $98
, $D2
, $86
, $D1
, $E0
, $96
, $19
, $7E
, $59
, $00
, $0B
, $0F
, $FE
, $E4
, $AF
Data
.b $24
, $9B
, $9B
, $FE
, $C6
, $B8
, $EE
, $FA
, $7C
, $DB
, $AC
, $F9
, $5C
, $4A
, $90
, $2A
Data
.b $6C
, $62
, $42
, $51
, $AD
, $6B
, $2A
, $8E
, $4B
, $BE
, $54
, $A2
, $98
, $CF
, $E2
, $94
Data
.b $8B
, $B4
, $7A
, $2E
, $2D
, $89
, $38
, $28
, $35
, $BD
, $5A
, $2E
, $BF
, $7E
, $26
, $5B
Data
.b $78
, $F9
, $A9
, $E1
, $89
, $1F
, $BF
, $B5
, $9A
, $5B
, $B5
, $1E
, $A8
, $6F
, $55
, $08
Data
.b $FD
, $2F
, $00
, $E3
, $07
, $F7
, $DF
, $B6
, $AD
, $31
, $F9
, $86
, $88
, $46
, $13
, $21
Data
.b $CD
, $11
, $04
, $98
, $90
, $2A
, $0B
, $81
, $11
, $21
, $85
, $40
, $28
, $8C
, $0C
, $AF
Data
.b $DA
, $F6
, $84
, $5A
, $3D
, $C0
, $F7
, $5C
, $8A
, $7E
, $8D
, $4A
, $B9
, $08
, $99
, $14
Data
.b $4D
, $D4
, $69
, $F2
, $3C
, $12
, $B1
, $48
, $39
, $5B
, $AD
, $BD
, $3D
, $57
, $AA
, $1C
Data
.b $7A
, $7E
, $6E
, $E5
, $C5
, $3F
, $1A
, $99
, $1A
, $03
, $D6
, $BC
, $A3
, $AF
, $D5
, $3B
Data
.b $17
, $01
, $F8
, $E6
, $81
, $7D
, $D1
, $CF
, $B5
, $37
, $1D
, $93
, $89
, $86
, $7D
, $C8
Data
.b $90
, $BF
, $84
, $5F
, $17
, $2C
, $00
, $42
, $00
, $6B
, $7B
, $1D
, $C8
, $DA
, $33
, $04
Data
.b $DA
, $EE
, $40
, $1B
, $EA
, $91
, $18
, $65
, $61
, $A8
, $96
, $F3
, $04
, $E9
, $25
, $12
Data
.b $A5
, $3C
, $CD
, $8E
, $43
, $5B
, $3C
, $66
, $AA
, $5A
, $8F
, $2F
, $55
, $FD
, $57
, $07
Data
.b $73
, $C5
, $97
, $7F
, $67
, $68
, $FC
, $8D
, $B1
, $42
, $39
, $6B
, $BD
, $13
, $6C
, $C6
Data
.b $3B
, $97
, $7A
, $C0
, $FB
, $F2
, $EE
, $EE
, $83
, $77
, $B5
, $34
, $3E
, $79
, $4F
, $47
Data
.b $CB
, $81
, $6D
, $89
, $86
, $98
, $56
, $2A
, $F4
, $F7
, $06
, $00
, $7A
, $23
, $00
, $29
Data
.b $31
, $22
, $FC
, $8A
, $A4
, $C5
, $5A
, $87
, $16
, $68
, $2C
, $C9
, $13
, $12
, $23
, $25
Data
.b $81
, $EB
, $51
, $F3
, $5C
, $CA
, $A5
, $0C
, $F5
, $EC
, $32
, $B1
, $CC
, $0A
, $ED
, $AE
Data
.b $43
, $B3
, $EB
, $A1
, $94
, $93
, $5B
, $AD
, $D5
, $DF
, $38
, $5F
, $AE
, $BE
, $F2
, $77
Data
.b $53
, $F3
, $2F
, $3D
, $33
, $3E
, $7D
, $DE
, $32
, $80
, $FA
, $95
, $3C
, $73
, $69
, $15
Data
.b $92
, $6F
, $A5
, $0B
, $FA
, $B9
, $F9
, $D5
, $EC
, $37
, $C7
, $67
, $B3
, $43
, $A9
, $B4
Data
.b $1F
, $0D
, $02
, $AF
, $2F
, $E2
, $C5
, $94
, $72
, $C2
, $09
, $95
, $10
, $F6
, $1F
, $C5
Data
.b $DA
, $C4
, $7F
, $C3
, $1B
, $C4
, $C6
, $2F
, $01
, $17
, $EE
, $85
, $44
, $21
, $88
, $18
Data
.b $49
, $C2
, $4D
, $10
, $4D
, $76
, $22
, $FA
, $F6
, $90
, $8E
, $27
, $59
, $74
, $24
, $2B
Data
.b $D9
, $74
, $24
, $22
, $D8
, $B3
, $3B
, $16
, $79
, $70
, $B4
, $54
, $6E
, $7F
, $69
, $31
Data
.b $35
, $67
, $85
, $7E
, $79
, $B3
, $00
, $B0
, $BC
, $64
, $D9
, $C0
, $F9
, $91
, $42
, $E5
Data
.b $DC
, $BF
, $CC
, $AD
, $4C
, $7F
, $67
, $72
, $6E
, $39
, $5D
, $28
, $D0
, $2A
, $45
, $B4
Data
.b $D3
, $73
, $23
, $46
, $3A
, $E1
, $0C
, $D4
, $88
, $F5
, $CA
, $64
, $6C
, $9D
, $DD
, $08
Data
.b $CE
, $58
, $70
, $42
, $08
, $1B
, $6E
, $E1
, $90
, $4B
, $4A
, $85
, $AB
, $05
, $0D
, $5E
Data
.b $12
, $65
, $A2
, $2C
, $A4
, $57
, $91
, $F9
, $A2
, $F9
, $ED
, $33
, $13
, $0B
, $7F
, $3A
Data
.b $3A
, $BD
, $68
, $BB
, $F9
, $F4
, $D5
, $34
, $3B
, $F5
, $3E
, $33
, $9F
, $9A
, $6D
, $46
Data
.b $8B
, $76
, $46
, $39
, $5E
, $0E
, $F4
, $B9
, $B7
, $33
, $85
, $73
, $DF
, $9D
, $5A
, $98
Data
.b $79
, $61
, $6E
, $29
, $67
, $AA
, $65
, $D5
, $E7
, $AA
, $78
, $C2
, $71
, $94
, $91
, $CE
Data
.b $45
, $A7
, $7D
, $61
, $42
, $BD
, $E6
, $A1
, $B5
, $9F
, $2D
, $ED
, $DE
, $00
, $AC
, $5A
Data
.b $2C
, $30
, $F9
, $EE
, $11
, $3A
, $74
, $D5
, $3C
, $39
, $36
, $95
, $FB
, $F7
, $B9
, $95
Data
.b $05
, $3B
, $2B
, $3A
, $6A
, $79
, $52
, $E9
, $4A
, $1E
, $10
, $57
, $91
, $23
, $8E
, $ED
Data
.b $AA
, $2D
, $96
, $1A
, $EC
, $04
, $FA
, $A5
, $10
, $FD
, $0F
, $75
, $35
, $DF
, $FA
, $E9
Data
.b $9E
, $AE
, $5D
, $F7
, $76
, $77
, $B5
, $39
, $B1
, $A4
, $34
, $8E
, $67
, $3D
, $22
, $D1
Data
.b $A8
, $F5
, $9C
, $40
, $2A
, $BB
, $43
, $1D
, $2D
, $94
, $43
, $B9
, $54
, $60
, $E6
, $CC
Data
.b $00
, $ED
, $51
, $C7
, $3C
, $71
, $7A
, $3C
, $F3
, $56
, $2A
, $37
, $65
, $47
, $2E
, $2F
Data
.b $00
, $C7
, $6C
, $D3
, $AB
, $5F
, $37
, $17
, $BA
, $44
, $7E
, $BA
, $76
, $B8
, $DB
, $06
Data
.b $F4
, $01
, $BB
, $81
, $9B
, $5B
, $3D
, $A7
, $FF
, $B1
, $9E
, $F6
, $5B
, $1E
, $EA
, $ED
Data
.b $DE
, $BE
, $B7
, $BD
, $3D
, $59
, $8F
, $24
, $D1
, $D2
, $59
, $4F
, $FA
, $30
, $D9
, $D5
Data
.b $FA
, $2E
, $15
, $73
, $2C
, $4C
, $0C
, $D3
, $1C
, $73
, $F5
, $E7
, $07
, $47
, $D3
, $43
Data
.b $21
, $11
, $3C
, $6C
, $F5
, $C1
, $89
, $0D
, $F3
, $A2
, $1B
, $32
, $DC
, $15
, $16
, $4C
Data
.b $C4
, $92
, $B6
, $4E
, $E0
, $26
, $A0
, $1F
, $E8
, $BF
, $AD
, $31
, $7E
, $CB
, $67
, $7A
Data
.b $3B
, $F6
, $3C
, $D8
, $DB
, $D3
, $DD
, $92
, $68
, $F1
, $EA
, $91
, $44
, $28
, $29
, $A5
Data
.b $83
, $91
, $92
, $42
, $3E
, $C3
, $EA
, $F4
, $28
, $B1
, $58
, $24
, $F8
, $CC
, $C9
, $91
Data
.b $D4
, $B9
, $62
, $65
, $C2
, $7E
, $85
, $7C
, $C1
, $92
, $BC
, $CC
, $66
, $B4
, $B1
, $D8
Data
.b $82
, $46
, $B8
, $31
, $C4
, $B6
, $01
, $BB
, $80
, $7E
, $25
, $44
, $FF
, $27
, $BA
, $9A
Data
.b $6F
, $7D
, $B8
, $BB
, $63
, $D7
, $47
, $B6
, $F5
, $B4
, $89
, $78
, $8B
, $CC
, $96
, $4B
Data
.b $64
, $17
, $A6
, $20
, $E2
, $06
, $8F
, $9E
, $18
, $59
, $59
, $A8
, $D4
, $C6
, $AC
, $36
Data
.b $78
, $D1
, $CE
, $4A
, $37
, $CD
, $50
, $C5
, $16
, $D2
, $92
, $0F
, $0C
, $B1
, $36
, $CF
Data
.b $E9
, $7F
, $AC
, $B7
, $FD
, $D6
, $7D
, $D1
, $58
, $EF
, $8A
, $31
, $3C
, $3D
, $3E
, $93
Data
.b $CD
, $FA
, $F5
, $35
, $E3
, $5F
, $B2
, $33
, $D2
, $6B
, $62
, $A8
, $82
, $1B
, $B3
, $D4
Data
.b $25
, $21
, $B6
, $03
, $D8
, $63
, $C3
, $AC
, $CB
, $36
, $A9
, $E3
, $36
, $69
, $47
, $6D
Data
.b $CD
, $37
, $5B
, $C2
, $85
, $6E
, $00
, $59
, $74
, $80
, $98
, $D5
, $05
, $DB
, $AC
, $77
Data
.b $2A
, $56
, $C8
, $CF
, $5F
, $CB
, $28
, $E5
, $FF
, $12
, $C0
, $A5
, $21
, $E6
, $D8
, $30
Data
.b $33
, $37
, $92
, $62
, $FF
, $BF
, $5A
, $FF
, $03
, $14
, $40
, $F3
, $DA
, $D8
, $5F
, $19
Data
.b $B7
, $00
, $00
, $00
, $00
, $49
, $45
, $4E
, $44
, $AE
, $42
, $60
, $82
EndDataSection
;Overlay diagonal scanlines by reducing color and leaving Alpha unchanged
Procedure
DiagonalScanlines(x,y,SourceColor,TargetColor)
If
((x+
y) % 3
)
ProcedureReturn
RGBA(Red(TargetColor) *
0
.1
, Green(TargetColor) *
0
.1
, Blue(TargetColor) *
0
.1
, Alpha(TargetColor))
Else
ProcedureReturn
TargetColor
EndIf
EndProcedure
;invert color and keep alpha layer
Procedure
InvertedColors(x,y,SourceColor,TargetColor)
ProcedureReturn
TargetColor !
$FFFFFF
EndProcedure
;convert color to grayscale
Procedure
GrayscaleFilter(x,y,SourceColor,TargetColor)
grayLevel=
(Red(TargetColor)+
Green(TargetColor)+
Blue(TargetColor))/
3
ProcedureReturn
RGBA(grayLevel,grayLevel,grayLevel,Alpha(TargetColor))
EndProcedure
Procedure
SetDarkenPercent(percent)
Global
DarkFactor.f
DarkFactor =
1
-
percent /
100
.0
If
DarkFactor <
0
: DarkFactor =
0
: EndIf
If
DarkFactor >
1
: DarkFactor =
1
: EndIf
EndProcedure
Procedure
DarkenFilter(x, y, SourceColor, TargetColor)
Global
DarkFactor.f
ProcedureReturn
RGBA(Red(TargetColor) *
DarkFactor, Green(TargetColor) *
DarkFactor, Blue(TargetColor) *
DarkFactor, Alpha(TargetColor))
EndProcedure
; SetDarkenPercent(10) ; make image 10% darker
Procedure
SetLightenPercent(percent)
Global
LightFactor.f
LightFactor =
1
-
percent /
100
.0
If
LightFactor <
0
: LightFactor =
0
: EndIf
If
LightFactor >
1
: LightFactor =
1
: EndIf
EndProcedure
Procedure
LightenFilter(x, y, SourceColor, TargetColor)
Global
LightFactor.f
ColorToWhite =
$FFFFFF
-
TargetColor
ProcedureReturn
RGBA(255
-
Red(ColorToWhite) *
LightFactor, 255
-
Green(ColorToWhite) *
LightFactor, 255
-
Blue(ColorToWhite) *
LightFactor, Alpha(TargetColor))
EndProcedure
;SetLightenPercent(20) ;make image 20% lighter
;Fat pixel
Procedure
PixelFilterCallback(x, y, SourceColor, TargetColor)
#pixelSize
=
5
xn=
#pixelSize
*
(x/
#pixelSize
)
yn=
#pixelSize
*
(y/
#pixelSize
)
ProcedureReturn
Point(xn,yn)
EndProcedure
Procedure
PixelFilter()
CustomFilterCallback(@PixelFilterCallback())
EndProcedure
Les trois derniers filtres sont de Demivec :
;Transfer the Alpha layer into the visible layer.
Procedure
MakeAlphaVisibleFilterCallback(x, y, SourceColor, TargetColor)
ProcedureReturn
RGBA(Alpha(SourceColor), Alpha(SourceColor),Alpha(SourceColor),00
)
EndProcedure
;Overlay horizontal scanlines by reducing color and leaving Alpha unchanged
Procedure
HorizontalScanlines(x,y,SourceColor,TargetColor)
If
y % 2
ProcedureReturn
RGBA(Red(TargetColor) *
0
.1
, Green(TargetColor) *
0
.1
, Blue(TargetColor) *
0
.1
, Alpha(TargetColor))
Else
ProcedureReturn
TargetColor
EndIf
EndProcedure
;Overlay vertical scanlines by reducing color and leaving Alpha unchanged
Procedure
VerticalScanlines(x,y,SourceColor,TargetColor)
If
x % 2
ProcedureReturn
RGBA(Red(TargetColor) *
0
.1
, Green(TargetColor) *
0
.1
, Blue(TargetColor) *
0
.1
, Alpha(TargetColor))
Else
ProcedureReturn
TargetColor
EndIf
EndProcedure
Première version :
#SquaredShape
=
0
#RhombShape
=
1
EnableExplicit
Define
i,wi,he, ev,Fon,Img,ImGad
DisableDebugger ; with debugger on, slow drawing
Procedure
CAux(Array Arr.Point(1
),X,Y,A,B,Rgb,N)
If
Point(X,Y)=
RGB And
Point(A,B)<>
Rgb
Arr(N)\X=
x : Arr(N)\Y=
y
N+
1
EndIf
ProcedureReturn
N
EndProcedure
Procedure
Outline(Array Arr.Point(1
),Img,Rgb=
0
,Rhomb=
0
)
;ret Arr con outline de rgb
Protected
I,X,Y,N
Protected
Iwi=
ImageWidth(Img)-
2
Protected
Ihe=
ImageHeight(Img)-
2
Dim
arr(iwi*
ihe)
For
X=
1
To
Iwi
For
y=
1
To
Ihe
If
Rhomb=
1
Or
(Rhomb=
2
And
1
&
Y) ; if Odd(y)
N=
CAux(Arr(),X,Y,X-
1
,Y ,Rgb,N) ; left
N=
CAux(Arr(),X,Y,X ,Y-
1
,Rgb,N) ; top
N=
CAux(Arr(),X,Y,X+
1
,Y ,Rgb,N) ; right
N=
CAux(Arr(),X,Y,X ,Y+
1
,Rgb,N) ; bottom
EndIf
If
Rhomb=
0
Or
(Rhomb=
2
And
Not
(1
&
Y)) ; if Even(Y)
N=
CAux(Arr(),X,Y,X-
1
,Y-
1
,Rgb,N) ; left top
N=
CAux(Arr(),X,Y,X-
1
,Y+
1
,Rgb,N) ; left bottom
N=
CAux(Arr(),X,Y,X+
1
,Y-
1
,Rgb,N) ; top right
N=
CAux(Arr(),X,Y,X+
1
,Y+
1
,Rgb,N) ; bottom right
EndIf
Next
Next
ReDim
arr(n-
1
)
EndProcedure
;Test it <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;StartDrawing is inside loop to see the growing outline effect
Procedure
TestDraw(img,imgad)
Protected
RGB,j
Dim
arr.point(0
)
StartDrawing(ImageOutput(Img))
Outline(arr(),Img,0
,#RhombShape
) ; try #SquaredShape <<<<<<<<<<
RGB=
Random(#White
)
For
j=
0
To
ArraySize(arr())
Plot(arr(j)\x,arr(j)\y,RGB)
Next
StopDrawing()
SetGadgetState(Imgad,ImageID(Img))
EndProcedure
OpenWindow(0
, 100
, 100
,900
,320
,"Get Outline"
, #PB_Window_SystemMenu
|
1
)
Wi=
WindowWidth(0
):He=
WindowHeight(0
)
Fon=
LoadFont(-
1
,"arial"
,80
)
Img=
CreateImage(-
1
,Wi,He)
Imgad=
ImageGadget(-
1
,0
,0
,0
,0
,ImageID(Img))
StartDrawing(ImageOutput(Img))
DrawingFont(FontID(Fon))
DrawingMode(#PB_2DDrawing_Outlined
)
DrawText(130
,90
,"Pure Basic"
,Random(#White
),0
)
StopDrawing()
SetGadgetState(Imgad,ImageID(Img))
Repeat
ev=
WaitWindowEvent(1
)
If
i<
90
testdraw(img,imgad)
i+
1
EndIf
Until
ev=
#PB_Event_CloseWindow
Version encore plus jolie (avec un semblant de 3D) :
#SquaredShape
=
0
#RhombShape
=
1
EnableExplicit
Define
i,wi,he, ev,Fon,Img,ImGad
Global
_FastMode=
#False
; less fun if set to #True
Global
_drawing
DisableDebugger ; with debugger on, slow drawing
Macro
MMK
Abs(GetAsyncKeyState_(#VK_LBUTTON
) +
GetAsyncKeyState_(#VK_RBUTTON
)*
2
+
GetAsyncKeyState_(#VK_MBUTTON
)*
3
)/
$8000
EndMacro
Procedure
CAux(Array Arr.Point(1
),X,Y,A,B,Rgb,N)
If
Point(X,Y)=
RGB And
Point(A,B)<>
Rgb
Arr(N)\X=
x : Arr(N)\Y=
y
N+
1
EndIf
ProcedureReturn
N
EndProcedure
Procedure
Outline(Array Arr.Point(1
),Img,Rgb=
0
,Rhomb=
0
)
;ret Arr con outline de rgb
Protected
I,X,Y,N
Protected
Iwi=
ImageWidth(Img)-
2
Protected
Ihe=
ImageHeight(Img)-
2
Dim
arr(iwi*
ihe)
For
X=
1
To
Iwi
For
y=
1
To
Ihe
If
Rhomb=
1
Or
(Rhomb=
2
And
1
&
Y) ; if Odd(y)
N=
CAux(Arr(),X,Y,X-
1
,Y ,Rgb,N) ; left
N=
CAux(Arr(),X,Y,X ,Y-
1
,Rgb,N) ; top
N=
CAux(Arr(),X,Y,X+
1
,Y ,Rgb,N) ; right
N=
CAux(Arr(),X,Y,X ,Y+
1
,Rgb,N) ; bottom
EndIf
If
Rhomb=
0
Or
(Rhomb=
2
And
Not
(1
&
Y)) ; if Even(Y)
N=
CAux(Arr(),X,Y,X-
1
,Y-
1
,Rgb,N) ; left top
N=
CAux(Arr(),X,Y,X-
1
,Y+
1
,Rgb,N) ; left bottom
N=
CAux(Arr(),X,Y,X+
1
,Y-
1
,Rgb,N) ; top right
N=
CAux(Arr(),X,Y,X+
1
,Y+
1
,Rgb,N) ; bottom right
EndIf
Next
Next
ReDim
arr(n-
1
)
EndProcedure
;Test it <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Procedure
BallDraw(img,imgad,X,Y,Array Arr.Point(1
),Rgb1,Rgb2,Radius)
Protected
I,X1,Y1,R2=
Radius/
2
,ev
If
_Fastmode
DrawingMode(#PB_2DDrawing_Gradient
)
FrontColor(Rgb2) : BackColor(Rgb1)
For
I=
0
To
ArraySize(Arr())-
1
X1=
Arr(I)\X : Y1=
Arr(I)\Y
LinearGradient(X1-
R2,Y1-
R2,X1+
R2,Y1+
R2)
Circle(X1,Y1,Radius)
Next
Else
While
Mmk:WindowEvent():Wend
For
I=
0
To
ArraySize(Arr())-
1
If
GetAsyncKeyState_(27
)&
$8000
: End
: EndIf
WindowEvent()
If
Mmk :Break
:EndIf
; stop drawing and return if left mouse click
If
_Drawing:StopDrawing():EndIf
_Drawing=
StartDrawing(ImageOutput(Img))
DrawingMode(#PB_2DDrawing_Gradient
)
FrontColor(Rgb2) : BackColor(Rgb1)
X1=
Arr(I)\X : Y1=
Arr(I)\Y
LinearGradient(X1-
R2,Y1-
R2,X1+
R2,Y1+
R2)
Circle(X1,Y1,Radius)
StopDrawing():_Drawing=
0
SetGadgetState(Imgad,ImageID(Img))
Next
EndIf
EndProcedure
Procedure
TestDraw(img,imgad,rgb1,rgb2,radius)
Protected
RGB,j
Dim
arr.point(0
)
_drawing=
StartDrawing(ImageOutput(Img))
Outline(arr(),Img,0
,#RhombShape
) ; try #SquaredShape <<<<<<<<<<
RGB=
Random(#White
)
balldraw(img,imgad,arr(j)\x,arr(j)\y,arr(),rgb1,rgb2,radius)
StopDrawing():_drawing=
0
SetGadgetState(Imgad,ImageID(Img))
EndProcedure
OpenWindow(0
, 100
, 100
,1000
,320
,"Get Outline _ Double click on Close Window to Quit"
, #PB_Window_SystemMenu
|
1
)
Wi=
WindowWidth(0
):He=
WindowHeight(0
)
Fon=
LoadFont(-
1
,"times new roman"
,70
) ; try different fonts and sizes
Img=
CreateImage(-
1
,Wi,He)
Imgad=
ImageGadget(-
1
,0
,0
,0
,0
,ImageID(Img))
StartDrawing(ImageOutput(Img))
DrawingFont(FontID(Fon))
DrawingMode(#PB_2DDrawing_Outlined
)
DrawText(100
,90
,"P u r e B a s i c"
,Random(#White
),0
)
StopDrawing()
SetGadgetState(Imgad,ImageID(Img))
testdraw(img,imgad,#Yellow
,$55
,6
) ; last parameter= radius: small values or very slow drawing
Repeat
ev=
WaitWindowEvent(1
)
If
i<
10
testdraw(img,imgad,Random(#White
),Random(#White
),i)
i+
1
SetWindowTitle(0
,Str(i))
EndIf
Until
ev=
#PB_Event_CloseWindow
Et une version de kenmo :
#Glow
=
0
.35
; Vary from 0.0 to 1.0
#GlowColor
=
$2040FF
; Color in $BBGGRR format
#Thickness
=
90
; Outline iterations
#Message
=
"PureBasic"
; String to display
#SquaredShape
=
0
#RhombShape
=
1
EnableExplicit
Define
i,wi,he, ev,Fon,Img,ImGad
DisableDebugger ; with debugger on, slow drawing
Procedure
CAux(Array Arr.Point(1
),X,Y,A,B,Rgb,N)
If
Point(X,Y)=
RGB And
Point(A,B)<>
Rgb
Arr(N)\X=
x : Arr(N)\Y=
y
N+
1
EndIf
ProcedureReturn
N
EndProcedure
Procedure
Outline(Array Arr.Point(1
),Img,Rgb=
0
,Rhomb=
0
)
;ret Arr con outline de rgb
Protected
I,X,Y,N
Protected
Iwi=
ImageWidth(Img)-
2
Protected
Ihe=
ImageHeight(Img)-
2
Dim
arr(iwi*
ihe)
For
X=
1
To
Iwi
For
y=
1
To
Ihe
If
Rhomb=
1
Or
(Rhomb=
2
And
1
&
Y) ; if Odd(y)
N=
CAux(Arr(),X,Y,X-
1
,Y ,Rgb,N) ; left
N=
CAux(Arr(),X,Y,X ,Y-
1
,Rgb,N) ; top
N=
CAux(Arr(),X,Y,X+
1
,Y ,Rgb,N) ; right
N=
CAux(Arr(),X,Y,X ,Y+
1
,Rgb,N) ; bottom
EndIf
If
Rhomb=
0
Or
(Rhomb=
2
And
Not
(1
&
Y)) ; if Even(Y)
N=
CAux(Arr(),X,Y,X-
1
,Y-
1
,Rgb,N) ; left top
N=
CAux(Arr(),X,Y,X-
1
,Y+
1
,Rgb,N) ; left bottom
N=
CAux(Arr(),X,Y,X+
1
,Y-
1
,Rgb,N) ; top right
N=
CAux(Arr(),X,Y,X+
1
,Y+
1
,Rgb,N) ; bottom right
EndIf
Next
Next
ReDim
arr(n-
1
)
EndProcedure
;Test it <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;StartDrawing is inside loop to see the growing outline effect
Procedure
TestDraw(img,imgad,i)
Protected
RGB,j
Dim
arr.point(0
)
StartDrawing(ImageOutput(Img))
Outline(arr(),Img,0
,#RhombShape
) ; try #SquaredShape <<<<<<<<<<
Define
f.f =
1
.0
-
Pow((i /
#Thickness
), #Glow
)
RGB=
RGB(Red(#GlowColor
) *
f, Green(#GlowColor
) *
f, Blue(#GlowColor
) *
f)
For
j=
0
To
ArraySize(arr())
Plot(arr(j)\x,arr(j)\y,RGB)
Next
StopDrawing()
SetGadgetState(Imgad,ImageID(Img))
EndProcedure
OpenWindow(0
, 100
, 100
,900
,320
,"Get Outline"
, #PB_Window_SystemMenu
|
1
)
Wi=
WindowWidth(0
):He=
WindowHeight(0
)
Fon=
LoadFont(-
1
,"georgia"
,80
,#PB_Font_Bold
)
If
(Not
Fon)
Fon=
LoadFont(-
1
,"times"
,80
,#PB_Font_Bold
)
EndIf
Img=
CreateImage(-
1
,Wi,He)
Imgad=
ImageGadget(-
1
,0
,0
,0
,0
,ImageID(Img))
StartDrawing(ImageOutput(Img))
DrawingFont(FontID(Fon))
DrawingMode(#PB_2DDrawing_Outlined
)
DrawText(150
,90
,#Message
,$010101
,0
)
StopDrawing()
SetGadgetState(Imgad,ImageID(Img))
Repeat
ev=
WaitWindowEvent(1
)
If
i<
#Thickness
testdraw(img,imgad,i)
i+
1
EndIf
Until
ev=
#PB_Event_CloseWindow
;- Color v1.1
;-
;- Procedures for handling colors not only in RGB, but also CMY, HSV and HSL (sometimes called HLS oder HSI)
;- Especially the last both let you modify the saturation and hue much more intuitively
;- See Wikipedia for more information on HSV and HSL
;-
;- The procedures contains all conversions between those color-types. The internal RGB-format
;- uses values in range [0.0, 1.0], so scale them manually to [0, 255] or use ColorRGB() for their usage in PB.
;-
;- Feel free to use this code for anything you want but without infringing its copyright.
;- (don't describe as it's author, don't sell itself - so just stay as nice as you are :)
;-
;- 19.09.06 by Froggerprogger
;-
;- v1.1:
;- - added example 3
;-
;- please report any bugs, etc. to Froggerprogger in the Purebasic-Forums
Enumeration
; do not change their order!
#COLOR_RGB
#COLOR_CMY
#COLOR_HSV
#COLOR_HSL
EndEnumeration
Structure
Color
StructureUnion
r.f ; Red in RGB [0.0, 1.0]
c.f ; Cyan in CMY [0.0, 1.0]
h.f ; Hue in HSV/HSL [0.0, 360.0[
EndStructureUnion
StructureUnion
g.f ; Green in RGB [0.0, 1.0]
m.f ; Magenta in CMY [0.0, 1.0]
s.f ; Saturation in HSV/HSL [0.0, 1.0]
EndStructureUnion
StructureUnion
b.f ; Blue in RGB [0.0, 1.0]
y.f ; Yellow in CMY [0.0, 1.0]
v.f ; Value in HSV [0.0, 1.0]
l.f ; Lightness in HSL [0.0, 1.0]
EndStructureUnion
type.l ; gives the type. One of #COLOR_RGB, #COLOR_CMY, #COLOR_HSV, #COLOR_HSL
EndStructure
;- some neccessary declares
DeclareDLL
.l Color2RGB(*
c.Color)
DeclareDLL
.l Color2CMY(*
c.Color)
DeclareDLL
.l Color2HSV(*
c.Color)
DeclareDLL
.l Color2HSL(*
c.Color)
;- some helper-proceudures
Procedure
.f Max3F(a.f, b.f, c.f)
If
a >
b
If
a >
c
ProcedureReturn
a
Else
ProcedureReturn
c
EndIf
Else
If
b >
c
ProcedureReturn
b
Else
ProcedureReturn
c
EndIf
EndIf
EndProcedure
Procedure
.f Min3F(a.f, b.f, c.f)
If
a <
b
If
a <
c
ProcedureReturn
a
Else
ProcedureReturn
c
EndIf
Else
If
b <
c
ProcedureReturn
b
Else
ProcedureReturn
c
EndIf
EndIf
EndProcedure
;- some global color-procedures
ProcedureDLL
.l IsColorValid(*
c.Color) ; returns #True or #False whether *c specifies a valid color or not
If
*
c\type <
#COLOR_RGB
Or
*
c\type >
#COLOR_HSL
ProcedureReturn
#False
EndIf
; check r, c in [0.0, 1.0] or h in [0.0, 360.0]
If
*
c\type <=
#COLOR_CMY
If
*
c\r <
0
Or
*
c\r >
1
.0
ProcedureReturn
#False
EndIf
Else
If
*
c\h <
0
Or
*
c\h >=
360
.0
ProcedureReturn
#False
EndIf
EndIf
; check g, m, s, b, y, v, l in [0.0, 1.0]
If
*
c\g <
0
Or
*
c\g >
1
.0
ProcedureReturn
#False
EndIf
If
*
c\b <
0
Or
*
c\b >
1
.0
ProcedureReturn
#False
EndIf
ProcedureReturn
#True
EndProcedure
ProcedureDLL
.l ColorCopy(*
c.Color) ; copies *c and returns *copy
Protected
*
out =
AllocateMemory(SizeOf(Color))
CopyMemory(*
c, *
out, SizeOf(Color))
ProcedureReturn
*
out
EndProcedure
ProcedureDLL
.l ColorComplement(*
c.Color) ; complements *c and returns *c
If
*
c\type <=
#COLOR_CMY
; if #COLOR_RGB or #COLOR_CMY
*
c\r =
1
.0
-
*
c\r
*
c\g =
1
.0
-
*
c\g
*
c\b =
1
.0
-
*
c\b
Else
; if #COLOR_HSV or #COLOR_HSL
If
*
c\h >=
180
.0
*
c\h -
180
.0
Else
*
c\h +
180
.0
EndIf
EndIf
EndProcedure
ProcedureDLL
.l ColorChangeType(*
c.Color, type.l) ; changes the type of *c to the new type and returns *c. type = #COLOR_*
Select
type
Case
#COLOR_RGB
: Color2RGB(*
c)
Case
#COLOR_CMY
: Color2CMY(*
c)
Case
#COLOR_HSV
: Color2HSV(*
c)
Case
#COLOR_HSL
: Color2HSL(*
c)
EndSelect
EndProcedure
ProcedureDLL
.l IsSameColors(*
c1.Color, *
c2.Color, tolerance.f) ; compares the two colors (of any type) without modifiing them and returns #True if they describe the same color equal, #False otherwise
Protected
same.l
; compare in RGB to easy treat special cases in HSL, HSV
*
c1c.Color =
ColorCopy(*
c1)
*
c2c.Color =
ColorCopy(*
c2)
Color2RGB(*
c1c)
Color2RGB(*
c2c)
If
tolerance =
0
same =
CompareMemory(*
c1c, *
c2c, SizeOf(Color))
Else
same =
#True
If
Abs(*
c1c\r -
*
c2c\r) >
tolerance
same =
#False
EndIf
If
Abs(*
c1c\g -
*
c2c\g) >
tolerance
same =
#False
EndIf
If
Abs(*
c1c\b -
*
c2c\b) >
tolerance
same =
#False
EndIf
EndIf
FreeMemory(*
c1c)
FreeMemory(*
c2c)
ProcedureReturn
same
EndProcedure
ProcedureDLL
.s ColorToStr(*
c.Color)
Protected
s.s
Select
*
c\type
Case
#COLOR_RGB
: s =
"RGB"
Case
#COLOR_CMY
: s =
"CMY"
Case
#COLOR_HSV
: s =
"HSV"
Case
#COLOR_HSL
: s =
"HSL"
EndSelect
s +
": "
+
StrF(*
c\r, 2
) +
", "
+
StrF(*
c\g, 2
) +
", "
+
StrF(*
c\b, 2
)
ProcedureReturn
s
EndProcedure
;- change color to RGB
ProcedureDLL
.l CMY2RGB(*
c.Color) ; converts CMY-color *c to RGB and returns *c. No check if CMY is made!
*
c\r =
1
.0
-
*
c\c
*
c\g =
1
.0
-
*
c\m
*
c\b =
1
.0
-
*
c\y
*
c\type =
#COLOR_RGB
ProcedureReturn
*
c
EndProcedure
ProcedureDLL
.l HSV2RGB(*
c.Color) ; converts HSV-color *c to RGB and returns *c. No check if HSV is made!
Protected
h.f, s.f, v.f
Protected
f.f, p.f, q.f, t.f, i.l
h =
*
c\h
s =
*
c\s
v =
*
c\v
If
s =
0
; it's a gray-tone
*
c\r =
v
*
c\g =
v
*
c\b =
v
Else
h /
60
.0
i =
Round(h, 0
)
f =
h-
i
p =
v*
(1
.0
-
s)
q =
v*
(1
.0
-
s*
f)
t =
v*
(1
.0
-
s*
(1
.0
-
f))
Select
i
Case
0
: *
c\r =
v : *
c\g =
t : *
c\b =
p
Case
1
: *
c\r =
q : *
c\g =
v : *
c\b =
p
Case
2
: *
c\r =
p : *
c\g =
v : *
c\b =
t
Case
3
: *
c\r =
p : *
c\g =
q : *
c\b =
v
Case
4
: *
c\r =
t : *
c\g =
p : *
c\b =
v
Case
5
: *
c\r =
v : *
c\g =
p : *
c\b =
q
EndSelect
EndIf
*
c\type =
#COLOR_RGB
ProcedureReturn
*
c
EndProcedure
Procedure
.f HSL2RGBHelper(q1.f, q2.f, h.f)
If
h >=
360
.0
h -
360
.0
ElseIf
h <
0
.0
h +
360
.0
EndIf
If
h <
60
.0
ProcedureReturn
q1+
(q2-
q1)*
h/
60
.0
ElseIf
h <
180
.0
ProcedureReturn
q2
ElseIf
h <
240
.0
ProcedureReturn
q1+
(q2-
q1)*
(240
.0
-
h)/
60
.0
Else
ProcedureReturn
q1
EndIf
EndProcedure
ProcedureDLL
.l HSL2RGB(*
c.Color) ; converts HSL-color *c to RGB and returns *c. No check if HSL is made!
Protected
h.f, l.f, s.f
Protected
f.f, p1.f, p2.f, t.f
Protected
i.l
h =
*
c\h
l =
*
c\l
s =
*
c\s
If
l<=
0
.5
p2 =
l*
(1
.0
+
s)
Else
p2 =
l+
s-
l*
s
EndIf
p1 =
2
.0
*
l-
p2
If
s=
0
.0
; it's a gray-tone
*
c\r =
l
*
c\g =
l
*
c\b =
l
Else
*
c\r =
HSL2RGBHelper(p1, p2, h+
120
.0
)
*
c\g =
HSL2RGBHelper(p1, p2, h)
*
c\b =
HSL2RGBHelper(p1, p2, h-
120
.0
)
EndIf
*
c\type =
#COLOR_RGB
ProcedureReturn
*
c
EndProcedure
ProcedureDLL
.l Color2RGB(*
c.Color) ; converts *c from any color-type to RGB and returns *c
Select
*
c\type
Case
#COLOR_RGB
: ProcedureReturn
*
c
Case
#COLOR_CMY
: ProcedureReturn
CMY2RGB(*
c)
Case
#COLOR_HSV
: ProcedureReturn
HSV2RGB(*
c)
Case
#COLOR_HSL
: ProcedureReturn
HSL2RGB(*
c)
EndSelect
EndProcedure
ProcedureDLL
.l ColorSetRGB(*
c.Color, r.f, g.f, b.f) ; sets *c to the RGB-color given by r,g,b, each in range [0.0, 1.0] (no check is made) and returns *c
*
c\r =
r
*
c\g =
g
*
c\b =
b
*
c\type =
#COLOR_RGB
ProcedureReturn
*
c
EndProcedure
;- change color to CMY
ProcedureDLL
.l RGB2CMY(*
c.Color) ; converts RGB-color *c to CMY and returns *c. No check if RGB is made!
*
c\c =
1
.0
-
*
c\r
*
c\m =
1
.0
-
*
c\g
*
c\y =
1
.0
-
*
c\b
*
c\type =
#COLOR_CMY
ProcedureReturn
*
c
EndProcedure
ProcedureDLL
.l HSV2CMY(*
c.Color) ; converts HSV-color *c to CMY and returns *c. No check if HSV is made!
; complement
If
*
c\h >=
180
.0
*
c\h -
180
.0
Else
*
c\h +
180
.0
EndIf
HSV2RGB(*
c) ; HSV2RGB of complement
*
c\type =
#COLOR_CMY
ProcedureReturn
*
c
EndProcedure
ProcedureDLL
.l HSL2CMY(*
c.Color) ; converts HSL-color *c to CMY and returns *c. No check if HSL is made!
; complement
If
*
c\h >=
180
.0
*
c\h -
180
.0
Else
*
c\h +
180
.0
EndIf
HSL2RGB(*
c) ; HSL2RGB of complement
*
c\type =
#COLOR_CMY
ProcedureReturn
*
c
EndProcedure
ProcedureDLL
.l Color2CMY(*
c.Color) ; converts *c from any color-type to CMY and returns *c
Select
*
c\type
Case
#COLOR_RGB
: ProcedureReturn
RGB2CMY(*
c)
Case
#COLOR_CMY
: ProcedureReturn
*
c
Case
#COLOR_HSV
: ProcedureReturn
HSV2CMY(*
c)
Case
#COLOR_HSL
: ProcedureReturn
HSL2CMY(*
c)
EndSelect
EndProcedure
ProcedureDLL
.l ColorSetCMY(*
c.Color, c.f, m.f, y.f) ; sets *c to the CMY-color given by c,m,y, each in range [0.0, 1.0] (no check is made) and returns *c
*
c\c =
c
*
c\m =
m
*
c\y =
y
*
c\type =
#COLOR_CMY
ProcedureReturn
*
c
EndProcedure
;- change color to HSV
ProcedureDLL
.l RGB2HSV(*
c.Color) ; converts RGB-color *c to HSV and returns *c. No check if RGB is made!
Protected
r.f, g.f, b.f, max.f, min.f, delta.f
r =
*
c\r
g =
*
c\g
b =
*
c\b
max =
Max3F(r,g,b)
min =
Min3F(r,g,b)
; get value
*
c\v =
max
If
max <>
0
.0
delta =
max -
min
; get saturation
*
c\s =
delta/
max
; get hue
If
delta <>
0
.0
If
r =
max
*
c\h =
(g-
b)/
delta
ElseIf
g =
max
*
c\h =
2
.0
+
(b-
r)/
delta
ElseIf
b =
max
*
c\h =
4
.0
+
(r-
g)/
delta
EndIf
*
c\h *
60
.0
If
*
c\h<
0
.0
*
c\h +
360
.0
EndIf
Else
; it's a gray-tone
*
c\h =
0
; *c\h is even undefined
EndIf
Else
; it's black
*
c\s =
0
*
c\h =
0
; *c\h is even undefined
EndIf
*
c\type =
#COLOR_HSV
ProcedureReturn
*
c
EndProcedure
ProcedureDLL
.l CMY2HSV(*
c.Color) ; converts CMY-color *c to HSV and returns *c. No check if CMY is made!
; treat as RGB-color
RGB2HSV(*
c)
; complement
If
*
c\h >=
180
.0
*
c\h -
180
.0
Else
*
c\h +
180
.0
EndIf
ProcedureReturn
*
c
EndProcedure
ProcedureDLL
.l HSL2HSV(*
c.Color) ; converts HSL-color *c to HSV and returns *c. No check if HSL is made!
ProcedureReturn
RGB2HSV(HSL2RGB(*
c)) ; it's the easiest, though not fastet way
EndProcedure
ProcedureDLL
.l Color2HSV(*
c.Color) ; converts *c from any color-type to HSV And returns *c
Select
*
c\type
Case
#COLOR_RGB
: ProcedureReturn
RGB2HSV(*
c)
Case
#COLOR_CMY
: ProcedureReturn
CMY2HSV(*
c)
Case
#COLOR_HSV
: ProcedureReturn
*
c
Case
#COLOR_HSL
: ProcedureReturn
HSL2HSV(*
c)
EndSelect
EndProcedure
ProcedureDLL
.l ColorSetHSV(*
c.Color, h.f, s.f, v.f) ; sets *c to the HSV-color given by h in range [0.0, 360.0] and s,v in range [0.0, 1.0] (no check is made) and returns *c
If
h =
360
.0
h =
0
EndIf
*
c\h =
h
*
c\s =
s
*
c\v =
v
*
c\type =
#COLOR_HSV
ProcedureReturn
*
c
EndProcedure
;- change color to HSL
ProcedureDLL
.l RGB2HSL(*
c.Color) ; converts RGB-color *c to HSL and returns *c. No check if RGB is made!
Protected
r.f, g.f, b.f, max.f, min.f, delta.f
r =
*
c\r
g =
*
c\g
b =
*
c\b
max =
Max3F(r,g,b)
min =
Min3F(r,g,b)
delta =
max -
min
If
delta <>
0
.0
; get lightness
*
c\l =
(max +
min) /
2
.0
; get saturation
If
*
c\l <=
0
.5
*
c\s =
delta/
(max+
min)
Else
*
c\s =
delta/
(2
-
max-
min)
EndIf
; get hue
If
r =
max
*
c\h =
(g-
b)/
delta
ElseIf
g =
max
*
c\h =
2
.0
+
(b-
r)/
delta
ElseIf
b =
max
*
c\h =
4
.0
+
(r-
g)/
delta
EndIf
*
c\h *
60
.0
If
*
c\h<
0
.0
*
c\h +
360
.0
EndIf
Else
; it's black
*
c\s =
0
*
c\h =
0
; *c\h is even undefined
EndIf
*
c\type =
#COLOR_HSL
ProcedureReturn
*
c
EndProcedure
ProcedureDLL
.l CMY2HSL(*
c.Color) ; converts CMY-color *c to HSL and returns *c. No check if CMY is made!
; treat as RGB-color
RGB2HSL(*
c)
; complement
If
*
c\h >=
180
.0
*
c\h -
180
.0
Else
*
c\h +
180
.0
EndIf
ProcedureReturn
*
c
EndProcedure
ProcedureDLL
.l HSV2HSL(*
c.Color) ; converts HSV-color *c to HSL and returns *c. No check if HSV is made!
ProcedureReturn
RGB2HSL(HSV2RGB(*
c)) ; it's the easiest, though not fastet way
EndProcedure
ProcedureDLL
.l Color2HSL(*
c.Color) ; converts *c from any color-type to HSL and returns *c
Select
*
c\type
Case
#COLOR_RGB
: ProcedureReturn
RGB2HSL(*
c)
Case
#COLOR_CMY
: ProcedureReturn
CMY2HSL(*
c)
Case
#COLOR_HSV
: ProcedureReturn
HSV2HSL(*
c)
Case
#COLOR_HSL
: ProcedureReturn
*
c
EndSelect
EndProcedure
ProcedureDLL
.l ColorSetHSL(*
c.Color, h.f, l.f, s.f) ; sets *c to the HSL-color given by h in range [0.0, 360.0[ and l,s in range [0.0, 1.0] (no check is made) and returns *c
*
c\h =
h
*
c\l =
l
*
c\s =
s
*
c\type =
#COLOR_HSL
ProcedureReturn
*
c
EndProcedure
;- change color to PureBasic's RGB
ProcedureDLL
.l ColorRGBFast(*
c.Color) ; converts *c to RGB and returns a Purebasic-RGB-colorcode same as returned by PB's RGB()
Color2RGB(*
c)
ProcedureReturn
RGB(255
*
*
c\r, 255
*
*
c\g, 255
*
*
c\b)
EndProcedure
ProcedureDLL
.l ColorRGB(*
c.Color) ; converts an internal copy of *c to RGB and returns a Purebasic-RGB-colorcode same as returned by PB's RGB()
Protected
*
cc.Color, rgb.l
*
cc =
ColorCopy(*
c)
Color2RGB(*
cc)
rgb =
RGB(255
*
*
cc\r, 255
*
*
cc\g, 255
*
*
cc\b)
FreeMemory(*
cc)
ProcedureReturn
rgb
EndProcedure
;-
;- debug test functionality
;-
Procedure
.l DebugTestFunctionality()
; RGB <-> CMY
For
i=
0
To
10000
ColorSetRGB(c.Color, Random(100
)/
100
.0
, Random(100
)/
100
.0
, Random(100
)/
100
.0
)
*
c2.Color =
Color2RGB(Color2CMY(ColorCopy(c)))
If
IsSameColors(c, *
c2, 0
.1
) =
#False
Debug
"ERROR RGB <-> CMY"
End
EndIf
FreeMemory(*
c2)
Next
; RGB <-> HSV
For
i=
0
To
10000
ColorSetRGB(c.Color, Random(100
)/
100
.0
, Random(100
)/
100
.0
, Random(100
)/
100
.0
)
*
c2.Color =
Color2RGB(Color2HSV(ColorCopy(c)))
If
IsSameColors(c, *
c2, 0
.1
) =
#False
Debug
"ERROR RGB <-> HSV"
End
EndIf
FreeMemory(*
c2)
Next
; RGB <-> HSL
For
i=
0
To
10000
ColorSetRGB(c.Color, Random(100
)/
100
.0
, Random(100
)/
100
.0
, Random(100
)/
100
.0
)
*
c2.Color =
Color2RGB(Color2HSL(ColorCopy(c)))
If
IsSameColors(c, *
c2, 0
.1
) =
#False
Debug
"ERROR RGB <-> HSL"
End
EndIf
FreeMemory(*
c2)
Next
; CMY <-> HSV
For
i=
0
To
10000
ColorSetCMY(c.Color, Random(100
)/
100
.0
, Random(100
)/
100
.0
, Random(100
)/
100
.0
)
*
c2.Color =
Color2CMY(Color2HSV(ColorCopy(c)))
If
IsSameColors(c, *
c2, 0
.1
) =
#False
Debug
"ERROR CMY <-> HSV"
End
EndIf
FreeMemory(*
c2)
Next
; CMY <-> HSL
For
i=
0
To
10000
ColorSetCMY(c.Color, Random(100
)/
100
.0
, Random(100
)/
100
.0
, Random(100
)/
100
.0
)
*
c2.Color =
Color2CMY(Color2HSL(ColorCopy(c)))
If
IsSameColors(c, *
c2, 0
.1
) =
#False
Debug
"ERROR CMY <-> HSL"
End
EndIf
FreeMemory(*
c2)
Next
; HSV <-> HSL
For
i=
0
To
10000
ColorSetHSV(c.Color, Random(360
)/
100
.0
, Random(100
)/
100
.0
, Random(100
)/
100
.0
)
*
c2.Color =
Color2HSV(Color2HSL(ColorCopy(c)))
If
IsSameColors(c, *
c2, 0
.1
) =
#False
Debug
"ERROR HSV <-> HSL"
End
EndIf
FreeMemory(*
c2)
Next
Debug
"All Tests done."
EndProcedure
;Goto example3
;-
;- example 1
;-
example1:
ColorSetRGB(rgbCol.Color, 0
.0
, 0
.0
, 1
.0
) ; full blue
s.s =
"Create blue, decrease its saturation towards gray and move it"
+
#CRLF
$
s.s +
"slightly towards green without changing it's intensity"
+
#CRLF
$ +
#CRLF
$
s.s +
"Original color: "
+
ColorToStr(rgbCol) +
#CRLF
$
; we dont' like this green, we want to make it a little bit darker and remove it's saturation
Color2HSL(rgbCol)
s.s +
"Original color: "
+
ColorToStr(rgbCol) +
#CRLF
$
rgbCol\h -
30
; be careful to stay in range [0, 360[. Here we know h is 240
rgbCol\s =
0
.5
s.s +
"Modified color: "
+
ColorToStr(rgbCol) +
#CRLF
$
Color2RGB(rgbCol)
s.s +
"Modified color: "
+
ColorToStr(rgbCol) +
#CRLF
$
MessageRequester("Color example 1/3:"
, s)
MessageRequester("Color example 2/3:"
, "Click OK to run a HSL-demonstration in fullscreen."
)
;-
;- example 2
;-
example2:
InitSprite()
InitKeyboard()
OpenScreen(1024
, 768
, 32
, "Color-example"
)
framecounter =
0
fps =
0
lastFrametimer =
0
Repeat
; fps-calculation
framecounter+
1
If
ElapsedMilliseconds() -
lastFrametimer >
1000
fps =
framecounter
framecounter =
0
lastFrametimer =
ElapsedMilliseconds()
EndIf
; draw the colorbars
ClearScreen(RGB(0
, 0
, 50
))
StartDrawing(ScreenOutput())
FrontColor(RGB(255
,255
,255
))
DrawingMode(1
)
DrawText(10
,10
, "HSL-colors for 1.440.000 individual colored pixels at "
+
Str(fps) +
" fps. Press ESC to exit."
)
; create 1.440.000 combinations of hue, sat and lightness and display them
sat.f =
0
.05
While
sat <=
1
.0
lig.f =
0
While
lig <=
1
.0
hue.f =
0
While
hue <
360
.0
; create a new hsl-colored pixel (you might fill your structure manually, too)
ColorSetHSL(HSLCol.Color, hue, sat, lig)
; draw it on the screen after converting to PB's RGB
Plot(152
+
2
*
hue, 180
+
20
*
lig +
400
*
sat, ColorRGBFast(HSLCol))
hue +
0
.5
Wend
lig +
0
.05
Wend
sat +
0
.1
Wend
StopDrawing()
FlipBuffers()
Delay(10
)
ExamineKeyboard()
Until
KeyboardPushed(#PB_Key_Escape
)
CloseScreen()
;-
;- example 3
;-
example3:
Procedure
.l GetContrastedPBColor(red.l, green.l, blue.l)
Protected
col.Color
ColorSetRGB(col.Color, red/
255
.0
, green/
255
.0
, blue/
255
.0
)
Color2HSV(col)
ColorComplement(col) ; build the normal complement
; modify saturation and value
; you might experiment with those to achieve other results
col\s +
0
.5
If
col\s >
1
.0
col\s -
1
.0
EndIf
col\v +
0
.5
If
col\v >
1
.0
col\v -
1
.0
EndIf
Color2RGB(col)
ProcedureReturn
RGB(col\r*
255
, col\g*
255
, col\b*
255
)
EndProcedure
CreateImage(0
, 500
, 500
)
For
i=
0
To
9
Select
i
Case
0
: col.l =
$000000
Case
1
: col.l =
$FFFFFF
Case
2
: col.l =
$7F7F7F
Case
3
: col.l =
$660000
Case
4
: col.l =
$00FF00
Case
5
: col.l =
$000033
Case
6
: col.l =
$FF9900
Case
7
: col.l =
$FF33FF
Case
8
: col.l =
$3754A9
Case
9
: col.l =
$9F3F20
EndSelect
contrCol =
GetContrastedPBColor(Red(col), Green(col), Blue(col))
StartDrawing(ImageOutput(0
))
Box(0
, i*
50
, 500
, 50
, col)
DrawingMode(#PB_2DDrawing_Transparent
)
DrawText(10
, i*
50
+
20
, "This is just an example-text in a color contrasted to the background"
, contrCol)
StopDrawing()
Next
OpenWindow(0
, 0
, 0
, 500
, 500
, "Color example 3/3:"
)
ImageGadget(0
, 0
, 0
, 500
, 500
, ImageID(0
))
Repeat
Until
WaitWindowEvent() =
#PB_Event_CloseWindow
;********************************
;*
;* LOTUS DEMO
;* djes 28/03/2011
;*
;********************************
Procedure
FilterCallback(x, y, SourceColor, TargetColor)
r.l =
(0
.5
*
Sqr((x -
64
) *
(x -
256
) +
(y -
256
) *
(y -
256
) ))
v.l =
(0
.5
*
Sqr((x -
256
) *
(x -
64
) +
(y -
256
) *
(y -
64
) ))
b.l =
(0
.5
*
Sqr((x -
256
) *
(x -
256
) +
(y -
64
) *
(y -
256
) ))
a.l =
(256
*
(512
-
Sqr((x -
256
) *
(x -
256
) +
(y -
256
) *
(y -
256
) )))
u%255
ProcedureReturn
RGBA(r, v, b, a)
EndProcedure
If
InitSprite() =
0
Or
InitKeyboard() =
0
MessageRequester("Error"
, "Sprite system can't be initialized"
, 0
)
End
EndIf
If
InitSprite3D() =
0
MessageRequester("Error"
, "Sprite3D system can't be initialized correctly"
, 0
)
End
EndIf
If
OpenWindow(0
, 0
, 0
, 512
, 512
, "Un écran dans une fenêtre..."
, #PB_Window_SystemMenu
|
#PB_Window_ScreenCentered
)
If
OpenWindowedScreen(WindowID(0
), 0
, 0
, 512
, 512
, 0
, 0
, 0
)
If
CreateImage(0
, 512
, 512
, 32
) And
StartDrawing(ImageOutput(0
))
DrawingMode(#PB_2DDrawing_AlphaChannel
)
Box(0
, 0
, 512
, 512
, $00000000
)
DrawingMode(#PB_2DDrawing_CustomFilter
)
CustomFilterCallback(@FilterCallback())
Circle( 256
, 256
, 256
)
StopDrawing()
EndIf
If
StartDrawing(ScreenOutput())
DrawImage(ImageID(0
), 0
, 0
)
StopDrawing()
EndIf
GrabSprite(0
, 0
, 0
, 512
, 512
, #PB_Sprite_Texture
|
#PB_Sprite_AlphaBlending
)
For
u =
0
To
31
CreateSprite3D(u, 0
)
Next
u
Sprite3DQuality(#PB_Sprite3D_BilinearFiltering
)
i.f =
0
bl_src =
2
bl_dst =
6
Repeat
Event =
WindowEvent()
Select
Event
Case
#PB_Event_Gadget
If
EventGadget() =
0
End
EndIf
Case
#PB_Event_CloseWindow
End
EndSelect
FlipBuffers()
ClearScreen(RGB(0
,50
,128
))
If
Start3D()
Sprite3DBlendingMode(bl_src, bl_dst)
For
u =
0
To
31
w =
512
*
Sin(i +
u *
5
)
h =
512
*
Sin(i +
u *
5
)
ZoomSprite3D(u, w, h)
RotateSprite3D(u, i *
100
+
u *
5
, 0
)
DisplaySprite3D(u, 256
-
w /
2
-
8
*
Sin(i *
u), 256
-
h /
2
-
8
*
Cos(i *
u), 127
)
Next
u
Stop3D()
EndIf
ExamineKeyboard()
If
KeyboardReleased(#PB_Key_Up
)
bl_src +
1
EndIf
If
KeyboardReleased(#PB_Key_Down
)
bl_src -
1
EndIf
If
KeyboardReleased(#PB_Key_Left
)
bl_dst +
1
EndIf
If
KeyboardReleased(#PB_Key_Right
)
bl_dst -
1
EndIf
i+
0
.01
Until
KeyboardPushed(#PB_Key_Escape
)
Else
MessageRequester("Erreur"
, "Can't open a screen !"
, 0
)
End
EndIf
Else
MessageRequester("Error"
, "Can't open a window !"
, 0
)
EndIf
End
Cover Flow est une interface utilisateur tridimensionnelle servant à naviguer dans une bibliothèque (de musique, d'image, ...)
via des représentations graphiques signifiantes (pochettes d'albums, image réduite,...).
C'est un bon exemple de manipulation des images, il faudrait tenter d'obtenir le même effet avec des sprite3D, qui s'y colle ?
EnableExplicit
; Mit 'UseRealAplhaMirror = #True' kann festgelegt werden, ob ein Spiegelbild mit ECHTEM Alpha-Kanal erstellt und genutzt werden soll, oder nicht.
; Andernfalls wird 'nur' ein Spiegelbild erstellt, welches auf eine feste Hintergrundfarbe 'geblendet' wird.
; (Die letztgenannte Methode hat den Vorteil, dass Bilder mit diesem Spiegelbild nahezu ohne Performanceeinbussen verkleinert dargestellt werden können.)
; Define UseRealAplhaMirror = #True
Define
UseRealAplhaMirror =
#False
Define
TempDir.s =
GetTemporaryDirectory()
Define
Quit =
#True
Define
DeleteCoverImages =
#False
; #True
Define
ScrWidth =
800
Define
ScrHeight =
600
Define
ScrXCenter =
400
Define
ScrYCenter =
300
Define
LoopHeight =
70
Define
LoopWidth =
300
Define
CoverURL.s
Define
Covers.l
Define
AktWinkel.f
Define
OldWinkel.f =
-
1
Define
WinkelSchrittweite.f
Define
DoFShrink.f =
0
.2
Define
FrameColor.l =
$ff0000
Define
DummyImage.i
Define
HintergrundFarbe =
$0
; $400000
Define
n
Structure
str_CoverZBuffer
ImageID.i
XPos.l
YPos.f
Zoom.f
Width.l
Height.l
CoverName.s
EndStructure
NewList
CoverFiles.s()
;{ Flip-Image Procedures by Balatro. => http://www.purebasic.fr/english/viewtopic.php?t=25276&highlight=image+mirror
Procedure
CopyImageToMemory(ImageNumber, Memory)
Protected
TemporaryDC.L, TemporaryBitmap.BITMAP, TemporaryBitmapInfo.BITMAPINFO
TemporaryDC =
CreateDC_("DISPLAY"
, #Null
, #Null
, #Null
)
GetObject_(ImageID(ImageNumber), SizeOf(BITMAP), TemporaryBitmap.BITMAP)
TemporaryBitmapInfo\bmiHeader\biSize =
SizeOf(BITMAPINFOHEADER)
TemporaryBitmapInfo\bmiHeader\biWidth =
TemporaryBitmap\bmWidth
TemporaryBitmapInfo\bmiHeader\biHeight =
-
TemporaryBitmap\bmHeight
TemporaryBitmapInfo\bmiHeader\biPlanes =
1
TemporaryBitmapInfo\bmiHeader\biBitCount =
32
TemporaryBitmapInfo\bmiHeader\biCompression =
#BI_RGB
GetDIBits_(TemporaryDC, ImageID(ImageNumber), 0
, TemporaryBitmap\bmHeight, Memory, TemporaryBitmapInfo, #DIB_RGB_COLORS
)
DeleteDC_(TemporaryDC)
EndProcedure
Procedure
CopyMemoryToImage(Memory, ImageNumber)
Protected
TemporaryDC.L, TemporaryBitmap.BITMAP, TemporaryBitmapInfo.BITMAPINFO
TemporaryDC =
CreateDC_("DISPLAY"
, #Null
, #Null
, #Null
)
GetObject_(ImageID(ImageNumber), SizeOf(BITMAP), TemporaryBitmap.BITMAP)
TemporaryBitmapInfo\bmiHeader\biSize =
SizeOf(BITMAPINFOHEADER)
TemporaryBitmapInfo\bmiHeader\biWidth =
TemporaryBitmap\bmWidth
TemporaryBitmapInfo\bmiHeader\biHeight =
-
TemporaryBitmap\bmHeight
TemporaryBitmapInfo\bmiHeader\biPlanes =
1
TemporaryBitmapInfo\bmiHeader\biBitCount =
32
TemporaryBitmapInfo\bmiHeader\biCompression =
#BI_RGB
SetDIBits_(TemporaryDC, ImageID(ImageNumber), 0
, TemporaryBitmap\bmHeight, Memory, TemporaryBitmapInfo, #DIB_RGB_COLORS
)
DeleteDC_(TemporaryDC)
EndProcedure
Procedure
Flip(ImageNumber)
Protected
MemorySize, *
MemoryOrigin, *
MemoryTarget
Protected
Origin, Target, W, H, X, Y
MemorySize =
(ImageWidth(ImageNumber) *
ImageHeight(ImageNumber) <<
2
)
*
MemoryOrigin =
AllocateMemory(MemorySize)
*
MemoryTarget =
AllocateMemory(MemorySize)
CopyImageToMemory(ImageNumber, *
MemoryOrigin)
W =
ImageWidth(ImageNumber)
H =
ImageHeight(ImageNumber)
For
Y =
0
To
H -
1
For
X =
0
To
W -
1
Origin =
(Y *
W +
X) <<
2
Target =
((H -
Y -
1
) *
W +
X) <<
2
PokeL(*
MemoryTarget +
Target, PeekL(*
MemoryOrigin +
Origin))
Next
Next
CopyMemoryToImage(*
MemoryTarget, ImageNumber)
FreeMemory(*
MemoryOrigin)
FreeMemory(*
MemoryTarget)
EndProcedure
;}
Procedure
AddAlphaMirrorToImage(ImageNum, HeightPercentage, MirrorOffest =
0
, StartBlend =
40
, EndBlend =
100
)
Protected
MirrorImage.i =
CopyImage(ImageNum, #PB_Any
)
Protected
MirrorHeight.l =
ImageHeight(ImageNum) *
HeightPercentage /
100
Protected
OrigImageHeight.l =
ImageHeight(ImageNum)
Protected
OrigImageWidth.l =
ImageWidth(ImageNum)
Protected
ActBlend.f =
255
-
(2
.55
*
StartBlend)
Protected
BlendStep.f =
(2
.55
*
(EndBlend-
StartBlend)) /
MirrorHeight
Protected
n.l
CreateImage(ImageNum,ImageWidth(ImageNum),OrigImageHeight+
MirrorHeight+
MirrorOffest,32
)
If
StartDrawing(ImageOutput(ImageNum))
DrawImage(ImageID(MirrorImage),0
,0
)
ResizeImage(MirrorImage,ImageWidth(MirrorImage),MirrorHeight)
Flip(MirrorImage)
DrawImage(ImageID(MirrorImage),0
,OrigImageHeight+
MirrorOffest)
DrawingMode(#PB_2DDrawing_AlphaChannel
)
Box(0
, OrigImageHeight, OrigImageWidth, MirrorHeight+
MirrorOffest, $00000000
)
For
n =
OrigImageHeight+
MirrorOffest To
ImageHeight(ImageNum)
LineXY(0
,n,OrigImageWidth,n,RGBA(0
,0
,0
,ActBlend))
ActBlend -
BlendStep
Next
StopDrawing()
EndIf
EndProcedure
Procedure
AddMirrorToImage(ImageNum, HeightPercentage, BGColor =
0
, MirrorOffest =
0
, StartBlend =
40
, EndBlend =
100
)
Protected
MirrorImage.i =
CopyImage(ImageNum, #PB_Any
)
Protected
MirrorHeight.l =
ImageHeight(ImageNum) *
HeightPercentage /
100
Protected
OrigImageHeight.l =
ImageHeight(ImageNum)
Protected
OrigImageWidth.l =
ImageWidth(ImageNum)
Protected
ActBlend.f =
255
-
(2
.55
*
StartBlend)
Protected
BlendStep.f =
(2
.55
*
(EndBlend-
StartBlend)) /
MirrorHeight
Protected
n.l
ResizeImage(ImageNum,ImageWidth(ImageNum),OrigImageHeight+
MirrorHeight+
MirrorOffest)
If
StartDrawing(ImageOutput(ImageNum))
Box(0
, 0
, OrigImageWidth, ImageHeight(ImageNum), BGColor)
DrawImage(ImageID(MirrorImage),0
,0
)
ResizeImage(MirrorImage,ImageWidth(MirrorImage),MirrorHeight)
Flip(MirrorImage)
DrawImage(ImageID(MirrorImage),0
,OrigImageHeight+
MirrorOffest)
DrawingMode(#PB_2DDrawing_AlphaBlend
)
For
n =
OrigImageHeight+
MirrorOffest To
ImageHeight(ImageNum)
LineXY(0
,n,OrigImageWidth,n,RGBA(Red(BGColor),Green(BGColor),Blue(BGColor),ActBlend))
ActBlend -
BlendStep
Next
StopDrawing()
EndIf
EndProcedure
; Read URL from DataSection and Download Cover Images from Internet
InitNetwork()
UseJPEGImageDecoder()
Restore CoverFileNames
Read.s CoverURL
While
CoverURL <>
""
AddElement(CoverFiles())
CoverFiles() =
TempDir+
GetFilePart(CoverURL)
If
FileSize(CoverFiles()) <=
0
If
ReceiveHTTPFile(CoverURL, CoverFiles())
LoadImage(ListSize(CoverFiles())-
1
,CoverFiles())
If
UseRealAplhaMirror
AddAlphaMirrorToImage(ListSize(CoverFiles())-
1
,40
,10
,80
,100
)
Else
AddMirrorToImage(ListSize(CoverFiles())-
1
,40
,HintergrundFarbe,10
,20
,0
)
EndIf
Else
DeleteElement(CoverFiles())
EndIf
Else
LoadImage(ListSize(CoverFiles())-
1
,CoverFiles())
If
UseRealAplhaMirror
AddAlphaMirrorToImage(ListSize(CoverFiles())-
1
,40
,10
,80
,100
)
Else
AddMirrorToImage(ListSize(CoverFiles())-
1
,40
,HintergrundFarbe,10
,20
,0
)
EndIf
EndIf
Read.s CoverURL
Wend
Covers =
ListSize(CoverFiles())
If
Covers <
1
Debug
"Es konnten keine Cover-Bilder geladen werden."
End
EndIf
InitSprite()
InitKeyboard()
InitMouse()
Dim
CoverZBuff.str_CoverZBuffer(Covers-
1
)
If
OpenWindow(0
,0
,0
,ScrWidth,ScrHeight,"Medien-Bibliothek (press ESC to exit)"
,#PB_Window_SystemMenu
|
#PB_Window_ScreenCentered
)
If
OpenWindowedScreen(WindowID(0
),0
,0
,ScrWidth,ScrHeight,0
,0
,0
)
Quit =
#False
EndIf
EndIf
While
Not
Quit
WaitWindowEvent(2
)
ExamineKeyboard()
ExamineMouse()
AktWinkel +
0
.01
*
MouseDeltaX()
If
AktWinkel <>
OldWinkel
Define
starttime.i =
ElapsedMilliseconds()
ClearScreen(HintergrundFarbe)
WinkelSchrittweite =
#PI
*
2
/
Covers
If
StartDrawing(ScreenOutput())
; =============================================================================================
Plot(0
,0
,0
) ; <= BUG in PB !!! Ohne den Plot()-Befehl wird kein ClearScreen() ausgeführt !!!
; =============================================================================================
; Position und Größe der Cover an Hand der aktuellen Drehung (AktWinkel) berechnen
For
n =
0
To
Covers-
1
CoverZBuff(n)\ImageID =
n
CoverZBuff(n)\Zoom =
DoFShrink +
(Cos(AktWinkel +
n *
WinkelSchrittweite) +
1
) *
(1
-
DoFShrink) /
2
CoverZBuff(n)\Width =
ImageWidth(n) *
CoverZBuff(n)\Zoom
CoverZBuff(n)\Height =
ImageHeight(n) *
CoverZBuff(n)\Zoom
CoverZBuff(n)\XPos =
ScrXCenter +
Sin(AktWinkel +
n *
WinkelSchrittweite) *
LoopWidth -
CoverZBuff(n)\Width/
2
CoverZBuff(n)\YPos =
ScrYCenter +
Cos(AktWinkel +
n *
WinkelSchrittweite) *
LoopHeight -
CoverZBuff(n)\Height/
2
SelectElement(CoverFiles(),n)
CoverZBuff(n)\CoverName =
GetFilePart(CoverFiles())
CoverZBuff(n)\CoverName =
Left(CoverZBuff(n)\CoverName, Len(CoverZBuff(n)\CoverName)-
4
)
Next
; Sortieren nach Y-Position der Cover, um Überlappungen korrekt darzustellen.
SortStructuredArray(CoverZBuff(), #PB_Sort_Ascending
, OffsetOf(str_CoverZBuffer\YPos), #PB_Sort_Float
)
DrawingMode(#PB_2DDrawing_AlphaBlend
)
For
n =
0
To
Covers-
1
If
UseRealAplhaMirror
; ------ Anzeige der Images mit ECHTEM Alpha-Kanal Spiegelbild -------
; Da ein AlphaImage nicht "on-the-fly" gezoomed werden kann, wird hier ein Dummy-Image erzeugt, welches dann verkleinert wird.
; Dieser Vorgang kostet extrem viel Zeit, wodurch die Framerate stark sinkt.
DummyImage =
CopyImage(CoverZBuff(n)\ImageID, #PB_Any
)
ResizeImage(DummyImage, CoverZBuff(n)\Width, CoverZBuff(n)\Height)
DrawAlphaImage(ImageID(DummyImage),CoverZBuff(n)\XPos, CoverZBuff(n)\YPos)
FreeImage(DummyImage)
; Sollte die "on-the-fly" Verkleinerung nicht benötigt werden, so kann nachfolgende Zeile statt der vorstehenden 4 Zeilen aktiviert werden.
; hierdurch steigt die Performance enorm - trotz Spiegelbild mit ECHTEM Alpha-Kanal.
; DrawAlphaImage(ImageID(CoverZBuff(n)\ImageID),CoverZBuff(n)\XPos, CoverZBuff(n)\YPos)
Else
; ------ Anzeige der Images mit Spiegelbild, welches auf einen einfarbigen Hintergrund geblendet wurde -------
DrawImage(ImageID(CoverZBuff(n)\ImageID),CoverZBuff(n)\XPos, CoverZBuff(n)\YPos, CoverZBuff(n)\Width, CoverZBuff(n)\Height)
EndIf
Next
DrawingMode(#PB_2DDrawing_Transparent
)
DrawText((ScrWidth-
TextWidth(CoverZBuff(n-
1
)\CoverName))/
2
, ScrHeight -
30
, CoverZBuff(n-
1
)\CoverName, $888888
, $0
)
DrawText(10
,ScrHeight -
30
,Str(ElapsedMilliseconds()-
starttime)+
"ms/Frame"
,$444444
)
StopDrawing()
EndIf
FlipBuffers()
OldWinkel =
AktWinkel
EndIf
If
KeyboardPushed(#PB_Key_Escape
)
Quit =
#True
EndIf
Wend
; ggfl. die heruntergeladenen Cover wieder löschen
If
DeleteCoverImages
ForEach
CoverFiles()
DeleteFile(CoverFiles())
Next
EndIf
DataSection
CoverFileNames:
Data
.s "http://www.fan-lexikon.de/musik/depeche-mode/bilder/m/depeche-mode-the-best-of-volume-1-cover-8981.jpg"
Data
.s "http://www.fan-lexikon.de/musik/depeche-mode/bilder/m/depeche-mode-a-broken-frame-cover-8980.jpg"
Data
.s "http://www.fan-lexikon.de/musik/depeche-mode/bilder/m/depeche-mode-music-for-the-masses-cover-8977.jpg"
Data
.s "http://www.fan-lexikon.de/musik/depeche-mode/bilder/m/depeche-mode-construction-time-again-cover-8974.jpg"
Data
.s "http://www.fan-lexikon.de/musik/depeche-mode/bilder/m/depeche-mode-the-singles-81-98-cover-8972.jpg"
Data
.s "http://www.fan-lexikon.de/musik/depeche-mode/bilder/m/depeche-mode-speak-and-spell-cover-8976.jpg"
Data
.s "http://www.fan-lexikon.de/musik/depeche-mode/bilder/m/depeche-mode-violator-cover-8978.jpg"
Data
.s "http://www.fan-lexikon.de/musik/seal/bilder/m/seal-i-cant-stand-the-rain-cover-9837.jpg"
Data
.s "http://www.fan-lexikon.de/musik/seal/bilder/m/seal-soul-cover-9826.jpg"
Data
.s "http://www.fan-lexikon.de/musik/seal/bilder/m/seal-amazing-single-cover-4416.jpg"
Data
.s ""
Data
.s ""
Data
.s ""
Data
.s ""
Data
.s ""
Data
.s ""
Data
.s ""
EndDataSection