Skip to content

Commit 27833fb

Browse files
committed
Crop grabbed output frames to actual dimensions
1 parent 1e821f9 commit 27833fb

File tree

2 files changed

+75
-1
lines changed

2 files changed

+75
-1
lines changed

Types/GraphicsOutput.bmx

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,10 +182,47 @@ Type GraphicsOutput
182182
EndIf
183183
Next
184184
Next
185-
Return framesToSave
185+
Return CropGrabbedOutputFrames(framesToSave)
186186
EndIf
187187
EndMethod
188188

189+
'////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
190+
191+
Method CropGrabbedOutputFrames:TPixmap[,](framesToCrop:TPixmap[,])
192+
Local croppedFrames:TPixmap[c_LimbCount, m_FrameCount]
193+
Local stackedLimbFrames:TPixmap = CreatePixmap(framesToCrop[0, 0].Width, framesToCrop[0, 0].Height, PF_RGBA8888)
194+
195+
'This is seemingly inefficient but surprisingly fast garbage but I don't have anything better
196+
For Local limb:Int = 0 Until c_LimbCount
197+
Cls()
198+
199+
For Local frame:Int = 0 Until m_FrameCount
200+
'Mask the magenta and stack all the frames on top of each other, then grab the stacked frames to a new pixmap
201+
DrawImage(LoadImage(MaskPixmap(framesToCrop[limb, frame], m_Magenta[0], m_Magenta[1], m_Magenta[2]), DYNAMICIMAGE | MASKEDIMAGE), 0, 0)
202+
stackedLimbFrames = GrabPixmap(0, 0, stackedLimbFrames.Width, stackedLimbFrames.Height)
203+
Next
204+
205+
Local realDimensions:Int[] = Utility.GetPixmapNonMaskedPixelBounds(stackedLimbFrames, -65281) 'God knows why this is the value for magenta here but it is what it is
206+
207+
For Local frame:Int = 0 Until m_FrameCount
208+
'Copy the area that is the real dimensions to a new pixmap
209+
Local croppedFrame:TPixmap = CreatePixmap(realDimensions[1] - realDimensions[0] + 1, realDimensions[3] - realDimensions[2] + 1, PF_RGBA8888)
210+
Local xCount:Int = 0
211+
Local yCount:Int = 0
212+
For Local pixelY:Int = realDimensions[2] To realDimensions[3]
213+
xCount = 0
214+
For Local pixelX:Int = realDimensions[0] To realDimensions[1]
215+
WritePixel(croppedFrame, xCount, yCount, ReadPixel(framesToCrop[limb, frame], pixelX, pixelY))
216+
xCount :+ 1
217+
Next
218+
yCount :+ 1
219+
Next
220+
croppedFrames[limb, frame] = croppedFrame
221+
Next
222+
Next
223+
Return croppedFrames
224+
EndMethod
225+
189226
'////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
190227

191228
Method Update()

Types/Utility.bmx

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,43 @@ Type Utility
9898
Return outputPixmap
9999
EndFunction
100100

101+
'////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
102+
103+
Function GetPixmapNonMaskedPixelBounds:Int[](sourcePixmap:TPixmap, maskColor:Int)
104+
Local bounds:Int[] = [sourcePixmap.Width, 0, sourcePixmap.Height, 0]
105+
106+
'Scan the pixmap from each direction to find the actual dimensions of the non-mask content. Basically trimming whitespace but with pixels
107+
For Local pixelY:Int = 0 Until sourcePixmap.Height
108+
For Local pixelX:Int = 0 Until sourcePixmap.Width
109+
If ReadPixel(sourcePixmap, pixelX, pixelY) <> maskColor Then
110+
bounds[0] = Min(bounds[0], pixelX)
111+
EndIf
112+
Next
113+
Next
114+
For Local pixelY:Int = 0 Until sourcePixmap.Height
115+
For Local pixelX:Int = sourcePixmap.Width - 1 To 0 Step -1
116+
If ReadPixel(sourcePixmap, pixelX, pixelY) <> maskColor Then
117+
bounds[1] = Max(bounds[1], pixelX)
118+
EndIf
119+
Next
120+
Next
121+
For Local pixelX:Int = 0 Until sourcePixmap.Width
122+
For Local pixelY:Int = 0 Until sourcePixmap.Height
123+
If ReadPixel(sourcePixmap, pixelX, pixelY) <> maskColor Then
124+
bounds[2] = Min(bounds[2], pixelY)
125+
EndIf
126+
Next
127+
Next
128+
For Local pixelX:Int = 0 Until sourcePixmap.Width
129+
For Local pixelY:Int = sourcePixmap.Height - 1 To 0 Step -1
130+
If ReadPixel(sourcePixmap, pixelX, pixelY) <> maskColor Then
131+
bounds[3] = Max(bounds[3], pixelY)
132+
EndIf
133+
Next
134+
Next
135+
Return bounds
136+
EndFunction
137+
101138
'////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
102139

103140
Function PNGWriteStream(pngPtr:Byte Ptr, buf:Byte Ptr, size:Int)

0 commit comments

Comments
 (0)