CustomFilterCallback() custom parameter! (Windows x64)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

CustomFilterCallback() custom parameter! (Windows x64)

Beitrag von Mijikai »

Da es keinen Custom Paramater für den Callback gibt habe ich mal was zusammengebastelt :)
Warum es diesen nicht von Haus aus gibt ist mir ein Rätsel.

Code:

Code: Alles auswählen

EnableExplicit

UseJPEGImageDecoder()

Procedure.i FilterImageCallback(X.i,Y.i,ColorSrc.i,ColorDst.i)
  Protected *parameter
  !mov rax,[rsp + 150h]                                ;<- locate the image structure
  !mov rax,[rax + 20h]                                 ;<- extract the custom parameter
  !mov qword[p.p_parameter],rax
  Debug *parameter
  ProcedureReturn ColorSrc
EndProcedure

Procedure.i FilterImage(*Buffer,Path.s = #Null$)
  Protected image.i
  Protected backup.i
  Protected *parameter.Integer
  If *Buffer
    image = CatchImage(#PB_Any,*Buffer)
  Else
    If Path
      image = LoadImage(#PB_Any,Path)
    EndIf 
  EndIf
  If IsImage(image)
    *parameter = image + $20                          ;<- pointer to the image structure (vacant spot afaik)
    backup = *parameter\i                             ;<- make a backup just to be safe
    If StartDrawing(ImageOutput(image))
      DrawingMode(#PB_2DDrawing_CustomFilter) 
      *parameter\i = 123456789                        ;<- set the custom parameter
      CustomFilterCallback(@FilterImageCallback())
      Box(0,0,1,1)                                    ;<- process one pixel
      StopDrawing()
    Else
      FreeImage(image)
      image = #Null
    EndIf
    *parameter\i = backup                             ;<- restore the image structure
  EndIf
  ProcedureReturn image
EndProcedure

FilterImage(#Null,"test.jpg")

End