xpra icon
Bug tracker and wiki

This bug tracker and wiki are being discontinued
please use https://github.com/Xpra-org/xpra instead.


Ticket #2757: cairo_replayscroll2.py

File cairo_replayscroll2.py, 4.1 KB (added by Antoine Martin, 11 months ago)

replay in two separate windows (original and copy)

Line 
1#!/usr/bin/env python
2# This file is part of Xpra.
3# Copyright (C) 2020 Antoine Martin <antoine@xpra.org>
4# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
5# later version. See the file COPYING for details.
6
7import sys
8import cairo
9
10import gi
11gi.require_version("Gtk", "3.0")
12gi.require_version("Gdk", "3.0")
13from gi.repository import Gtk, Gdk, GLib
14
15
16class ImageWindow(Gtk.Window):
17
18    def __init__(self, title="Original"):
19        super().__init__()
20
21        self.image = None
22
23        self.darea = Gtk.DrawingArea()
24        self.darea.connect("draw", self.on_draw)
25        self.darea.set_size_request(1024, 1024)
26        self.add(self.darea)
27
28        self.set_title(title)
29        self.set_position(Gtk.WindowPosition.CENTER)
30        self.connect("delete-event", Gtk.main_quit)
31        self.show_all()
32
33    def clear(self, w, h):
34        self.image = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h)
35        cr = cairo.Context(self.image)
36        cr.set_operator(cairo.OPERATOR_CLEAR)
37        cr.set_source_rgba(1, 1, 1, 1)
38        cr.rectangle(0, 0, w, h)
39        cr.fill()
40        self.image.flush()
41        self.redraw()
42        print("clear")
43
44    def load_image(self, filename):
45        self.last = self.image
46        self.image = cairo.ImageSurface.create_from_png(filename)
47        self.resize(self.image.get_width(), self.image.get_height())
48        self.darea.queue_draw()
49
50    def redraw(self):
51        self.darea.queue_draw()
52
53    def on_draw(self, wid, cr):
54        if self.image:
55            cr.set_source_surface(self.image, 0, 0)
56            cr.paint()
57
58
59def load_scrolls(filename):
60    with open(filename, "rb") as f:
61        data = f.read()
62    scrolls = []
63    for line in data.decode().splitlines():
64        scroll = [int(x.strip()) for x in line.split(",")]
65        scrolls.append(scroll)
66    return scrolls
67
68def apply_scroll(original, scrolled, filename):
69    scrolls = load_scrolls(filename)
70    src = original.image
71    w, h = src.get_width(), src.get_height()
72    scrolled.clear(w, h)
73
74    def copy():
75        print("copy")
76        cr = cairo.Context(scrolled.image)
77        cr.set_operator(cairo.OPERATOR_SOURCE)
78        cr.set_source_surface(original.image, 0, 0)
79        cr.paint()
80        scrolled.redraw()
81
82    GLib.timeout_add(5000, paint_scrolls, original, scrolled, scrolls)
83
84def paint_scrolls(original, scrolled, scrolls):
85    if not scrolls:
86        return False
87    scroll = scrolls.pop(0)
88    sx,sy,sw,sh,xdelta,ydelta = scroll
89    print("paint scroll: %s" % (scroll))
90
91    #show source rect:
92    cr = cairo.Context(original.image)
93    color = 1, 0, 0, 1
94    cr.set_line_width(1)
95    cr.set_source_rgba(*color)
96    cr.rectangle(sx, sy, sw, sh)
97    cr.stroke()
98    original.redraw()
99
100    x = sx+xdelta
101    y = sy+ydelta
102
103    def show_dst():
104        print("show_dst()")
105        cr = cairo.Context(scrolled.image)
106        color = 0, 1, 0, 1
107        cr.set_line_width(1)
108        cr.set_source_rgba(*color)
109        cr.rectangle(x, y, sw, sh)
110        cr.stroke()
111        scrolled.redraw()
112    GLib.timeout_add(1000, show_dst)
113
114    def copy_scroll():
115        print("copy_scroll()")
116        cr = cairo.Context(scrolled.image)
117        cr.set_operator(cairo.OPERATOR_SOURCE)
118        cr.set_source_surface(original.image, xdelta, ydelta)
119        x = sx+xdelta
120        y = sy+ydelta
121        cr.rectangle(x, y, sw, sh)
122        cr.fill()
123        if True:
124            color = 0, 0, 1, 1
125            cr.set_line_width(1)
126            cr.set_source_rgba(*color)
127            cr.rectangle(x, y, sw, sh)
128            cr.stroke()
129        scrolled.redraw()
130    GLib.timeout_add(2000, copy_scroll)
131    return bool(scrolls)
132
133
134def main():
135    original = ImageWindow("Original")
136    original.move(0, 0)
137    scrolled = ImageWindow("Scrolled")
138    scrolled.move(1024, 0)
139    i1 = sys.argv[1]
140    original.load_image(i1)
141    scrolled.load_image(i1)
142    def update_image():
143        for x in sys.argv[1:]:
144            if x.endswith(".png"):
145                original.load_image(x)
146            else:
147                apply_scroll(original, scrolled, x)
148    GLib.timeout_add(1000, update_image)
149    Gtk.main()
150
151if __name__ == "__main__":   
152    main()