Let capturer create output folder

This commit is contained in:
David Vogel 2019-10-25 20:25:41 +02:00
parent 4c6177676d
commit 5f3c55823c
2 changed files with 71 additions and 70 deletions

View File

@ -8,100 +8,101 @@ UsePNGImageEncoder()
Declare Worker(*Dummy) Declare Worker(*Dummy)
Structure QueueElement Structure QueueElement
img.i img.i
x.i x.i
y.i y.i
EndStructure EndStructure
ProcedureDLL AttachProcess(Instance) ProcedureDLL AttachProcess(Instance)
Global Semaphore = CreateSemaphore() Global Semaphore = CreateSemaphore()
Global Mutex = CreateMutex() Global Mutex = CreateMutex()
Global NewList Queue.QueueElement() Global NewList Queue.QueueElement()
ExamineDesktops()
For i = 1 To 4 ExamineDesktops()
CreateThread(@Worker(), #Null) CreateDirectory("mods/noita-mapcap/output/")
Next
For i = 1 To 4
CreateThread(@Worker(), #Null)
Next
EndProcedure EndProcedure
Procedure Worker(*Dummy) Procedure Worker(*Dummy)
Protected img, x, y Protected img, x, y
Repeat Repeat
WaitSemaphore(Semaphore) WaitSemaphore(Semaphore)
LockMutex(Mutex) LockMutex(Mutex)
FirstElement(Queue()) FirstElement(Queue())
img = Queue()\img img = Queue()\img
x = Queue()\x x = Queue()\x
y = Queue()\y y = Queue()\y
DeleteElement(Queue()) DeleteElement(Queue())
UnlockMutex(Mutex) UnlockMutex(Mutex)
SaveImage(img, "mods/noita-mapcap/output/" + x + "," + y + ".png", #PB_ImagePlugin_PNG) SaveImage(img, "mods/noita-mapcap/output/" + x + "," + y + ".png", #PB_ImagePlugin_PNG)
FreeImage(img) FreeImage(img)
ForEver ForEver
EndProcedure EndProcedure
ProcedureDLL Capture(px.i, py.i) ProcedureDLL Capture(px.i, py.i)
; Get dimensions of main screen ; Get dimensions of main screen
x = DesktopX(0)
y = DesktopY(0)
w = DesktopWidth(0)
h = DesktopHeight(0)
imageID = CreateImage(#PB_Any, w, h) x = DesktopX(0)
If Not imageID y = DesktopY(0)
ProcedureReturn w = DesktopWidth(0)
EndIf h = DesktopHeight(0)
; Get DC of whole screen imageID = CreateImage(#PB_Any, w, h)
screenDC = GetDC_(#Null) If Not imageID
If Not screenDC ProcedureReturn
FreeImage(imageID) EndIf
ProcedureReturn
EndIf
hDC = StartDrawing(ImageOutput(imageID)) ; Get DC of whole screen
If Not hDC screenDC = GetDC_(#Null)
FreeImage(imageID) If Not screenDC
ReleaseDC_(#Null, screenDC) FreeImage(imageID)
ProcedureReturn ProcedureReturn
EndIf EndIf
If Not BitBlt_(hDC, 0, 0, w, h, screenDC, x, y, #SRCCOPY) ; After some time BitBlt will fail, no idea why. Also, that's moments before noita crashes.
FreeImage(imageID)
ReleaseDC_(#Null, screenDC)
StopDrawing()
ProcedureReturn
EndIf
StopDrawing()
ReleaseDC_(#Null, screenDC) hDC = StartDrawing(ImageOutput(imageID))
If Not hDC
FreeImage(imageID)
ReleaseDC_(#Null, screenDC)
ProcedureReturn
EndIf
If Not BitBlt_(hDC, 0, 0, w, h, screenDC, x, y, #SRCCOPY) ; After some time BitBlt will fail, no idea why. Also, that's moments before noita crashes.
FreeImage(imageID)
ReleaseDC_(#Null, screenDC)
StopDrawing()
ProcedureReturn
EndIf
StopDrawing()
LockMutex(Mutex) ReleaseDC_(#Null, screenDC)
; Check if the queue has too many elements, if so, wait. (Simulate go's channels)
While ListSize(Queue()) > 0
UnlockMutex(Mutex)
Delay(10)
LockMutex(Mutex)
Wend
LastElement(Queue())
AddElement(Queue())
Queue()\img = imageID
Queue()\x = px
Queue()\y = py
UnlockMutex(Mutex)
SignalSemaphore(Semaphore) LockMutex(Mutex)
; Check if the queue has too many elements, if so, wait. (Simulate go's channels)
While ListSize(Queue()) > 0
UnlockMutex(Mutex)
Delay(10)
LockMutex(Mutex)
Wend
LastElement(Queue())
AddElement(Queue())
Queue()\img = imageID
Queue()\x = px
Queue()\y = py
UnlockMutex(Mutex)
SignalSemaphore(Semaphore)
EndProcedure EndProcedure
; IDE Options = PureBasic 5.71 LTS (Windows - x64) ; IDE Options = PureBasic 5.71 LTS (Windows - x64)
; ExecutableFormat = Shared dll ; ExecutableFormat = Shared dll
; CursorPosition = 72 ; CursorPosition = 25
; FirstLine = 32 ; FirstLine = 3
; Folding = - ; Folding = -
; EnableThread ; EnableThread
; EnableXP ; EnableXP

Binary file not shown.