-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathview_manager.py
More file actions
99 lines (89 loc) · 3 KB
/
Copy pathview_manager.py
File metadata and controls
99 lines (89 loc) · 3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import cv2
import numpy as np
from cursor_win import set_dpi_awareness, get_cursor_pos
from capture import ScreenCapture
from buffer import FrameBuffer
from key_codes import wait_key
import view_live, view_scrub, view_hex, view_crop, view_trim
WIN = "ActiveSteg 3 - On-Screen Steganography Filter"
_MODS = {
"live": view_live,
"scrub": view_scrub,
"hex": view_hex,
"crop": view_crop,
"trim": view_trim,
}
class ViewManager:
def __init__(self):
set_dpi_awareness()
self.cap = ScreenCapture()
self.buf = FrameBuffer()
self.current = "live"
self._mev = []
self._prev_frames = None # working frame set for scrub/crop/trim
def _mcb(self, event, x, y, flags, param):
self._mev.append((event, x, y, flags))
def _dims(self):
try:
r = cv2.getWindowImageRect(WIN)
if r and r[2] > 0:
return max(400, r[2]), max(300, r[3])
except:
pass
return 900, 600
def _win_rect(self):
try:
r = cv2.getWindowImageRect(WIN)
return r if r and r[2] > 0 else (0, 0, 0, 0)
except:
return (0, 0, 0, 0)
def _go(self, t):
to = t.get("to")
frames = t.get("frames")
if to not in _MODS:
return
if to == "live":
final = frames or self._prev_frames
if final:
self.buf.replace(final)
self._prev_frames = None
view_live.on_enter(buf=self.buf, cap=self.cap)
elif to == "scrub":
if frames:
self._prev_frames = frames
src = self._prev_frames or self.buf.get_frames()
view_scrub.on_enter(frames=src)
elif to == "hex":
view_hex.on_enter(frame=t["frame"])
elif to == "crop":
src = frames or self._prev_frames or self.buf.get_frames()
view_crop.on_enter(frames=src)
elif to == "trim":
src = frames or self._prev_frames or self.buf.get_frames()
view_trim.on_enter(frames=src)
self.current = to
def run(self):
cv2.namedWindow(WIN, cv2.WINDOW_NORMAL)
cv2.resizeWindow(WIN, 900, 600)
cv2.setMouseCallback(WIN, self._mcb)
view_live.on_enter(buf=self.buf, cap=self.cap)
while True:
ww, wh = self._dims()
k = wait_key(1)
mev = self._mev[:]
self._mev.clear()
mx, my = get_cursor_pos()
events = {
"mouse": mev,
"key": k,
"win_rect": self._win_rect(),
"cursor": (mx, my),
}
canvas = np.zeros((wh, ww, 3), dtype=np.uint8)
t = _MODS[self.current].render(canvas, ww, wh, events)
if t:
if t.get("quit"):
break
self._go(t)
cv2.imshow(WIN, canvas)
cv2.destroyAllWindows()