| ... |
... |
@@ -86,10 +86,7 @@ def generate_avatar(letters, color, size, scale): |
|
86
|
86
|
def generate_default_avatar(letter, color_string, size, scale, style='circle'):
|
|
87
|
87
|
color = text_to_color(color_string)
|
|
88
|
88
|
surface = generate_avatar(letter, color, size, scale)
|
|
89
|
|
- if style == 'circle':
|
|
90
|
|
- surface = clip_circle(surface)
|
|
91
|
|
- elif style == 'round-corners':
|
|
92
|
|
- surface = round_corners(surface)
|
|
|
89
|
+ surface = clip(surface, style)
|
|
93
|
90
|
surface.set_device_scale(scale, scale)
|
|
94
|
91
|
return surface
|
|
95
|
92
|
|
| ... |
... |
@@ -97,10 +94,7 @@ def generate_default_avatar(letter, color_string, size, scale, style='circle'): |
|
97
|
94
|
@lru_cache(maxsize=None)
|
|
98
|
95
|
def make_workspace_avatar(letter, color, size, scale, style='round-corners'):
|
|
99
|
96
|
surface = generate_avatar(letter, color, size, scale)
|
|
100
|
|
- if style == 'circle':
|
|
101
|
|
- surface = clip_circle(surface)
|
|
102
|
|
- elif style == 'round-corners':
|
|
103
|
|
- surface = round_corners(surface)
|
|
|
97
|
+ surface = clip(surface, style)
|
|
104
|
98
|
surface.set_device_scale(scale, scale)
|
|
105
|
99
|
return surface
|
|
106
|
100
|
|
| ... |
... |
@@ -178,6 +172,14 @@ def square(surface, size): |
|
178
|
172
|
return context.get_target()
|
|
179
|
173
|
|
|
180
|
174
|
|
|
|
175
|
+def clip(surface, mode):
|
|
|
176
|
+ if mode == 'circle':
|
|
|
177
|
+ return clip_circle(surface)
|
|
|
178
|
+ if mode == 'round-corners':
|
|
|
179
|
+ return round_corners(surface)
|
|
|
180
|
+ raise ValueError('clip mode unknown: %s' % mode)
|
|
|
181
|
+
|
|
|
182
|
+
|
|
181
|
183
|
def clip_circle(surface):
|
|
182
|
184
|
new_surface = cairo.ImageSurface(cairo.Format.ARGB32,
|
|
183
|
185
|
surface.get_width(),
|
| ... |
... |
@@ -228,23 +230,6 @@ def round_corners(surface): |
|
228
|
230
|
return context.get_target()
|
|
229
|
231
|
|
|
230
|
232
|
|
|
231
|
|
-def get_avatar_from_pixbuf(pixbuf, scale, show=None):
|
|
232
|
|
- size = max(pixbuf.get_width(), pixbuf.get_height())
|
|
233
|
|
- size *= scale
|
|
234
|
|
- surface = Gdk.cairo_surface_create_from_pixbuf(pixbuf, scale)
|
|
235
|
|
- if surface is None:
|
|
236
|
|
- return None
|
|
237
|
|
- surface = square(surface, size)
|
|
238
|
|
- if surface is None:
|
|
239
|
|
- return None
|
|
240
|
|
- surface = clip_circle(surface)
|
|
241
|
|
- if surface is None:
|
|
242
|
|
- return None
|
|
243
|
|
- if show is not None:
|
|
244
|
|
- return add_status_to_avatar(surface, show)
|
|
245
|
|
- return surface
|
|
246
|
|
-
|
|
247
|
|
-
|
|
248
|
233
|
class AvatarStorage(metaclass=Singleton):
|
|
249
|
234
|
def __init__(self):
|
|
250
|
235
|
self._cache = defaultdict(dict)
|
| ... |
... |
@@ -276,7 +261,7 @@ def get_surface(self, |
|
276
|
261
|
if surface is not None:
|
|
277
|
262
|
return surface
|
|
278
|
263
|
|
|
279
|
|
- surface = self._get_avatar_from_storage(contact, size, scale)
|
|
|
264
|
+ surface = self._get_avatar_from_storage(contact, size, scale, style)
|
|
280
|
265
|
if surface is not None:
|
|
281
|
266
|
if show is not None:
|
|
282
|
267
|
surface = add_status_to_avatar(surface, show)
|
| ... |
... |
@@ -294,7 +279,13 @@ def get_surface(self, |
|
294
|
279
|
self._cache[jid][(size, scale, show)] = surface
|
|
295
|
280
|
return surface
|
|
296
|
281
|
|
|
297
|
|
- def get_muc_surface(self, account, jid, size, scale, default=False):
|
|
|
282
|
+ def get_muc_surface(self,
|
|
|
283
|
+ account,
|
|
|
284
|
+ jid,
|
|
|
285
|
+ size,
|
|
|
286
|
+ scale,
|
|
|
287
|
+ default=False,
|
|
|
288
|
+ style='circle'):
|
|
298
|
289
|
if not default:
|
|
299
|
290
|
surface = self._cache[jid].get((size, scale))
|
|
300
|
291
|
if surface is not None:
|
| ... |
... |
@@ -305,14 +296,14 @@ def get_muc_surface(self, account, jid, size, scale, default=False): |
|
305
|
296
|
surface = self.surface_from_filename(avatar_sha, size, scale)
|
|
306
|
297
|
if surface is None:
|
|
307
|
298
|
return None
|
|
308
|
|
- surface = clip_circle(surface)
|
|
|
299
|
+ surface = clip(surface, style)
|
|
309
|
300
|
self._cache[jid][(size, scale)] = surface
|
|
310
|
301
|
return surface
|
|
311
|
302
|
|
|
312
|
303
|
con = app.connections[account]
|
|
313
|
304
|
name = get_groupchat_name(con, jid)
|
|
314
|
305
|
letter = self._generate_letter(name)
|
|
315
|
|
- surface = generate_default_avatar(letter, str(jid), size, scale)
|
|
|
306
|
+ surface = generate_default_avatar(letter, str(jid), size, scale, style)
|
|
316
|
307
|
self._cache[jid][(size, scale)] = surface
|
|
317
|
308
|
return surface
|
|
318
|
309
|
|
| ... |
... |
@@ -414,7 +405,7 @@ def _load_surface_from_storage(self, filename, size, scale): |
|
414
|
405
|
surface = Gdk.cairo_surface_create_from_pixbuf(pixbuf, scale)
|
|
415
|
406
|
return square(surface, size)
|
|
416
|
407
|
|
|
417
|
|
- def _get_avatar_from_storage(self, contact, size, scale):
|
|
|
408
|
+ def _get_avatar_from_storage(self, contact, size, scale, style):
|
|
418
|
409
|
avatar_sha = contact.avatar_sha
|
|
419
|
410
|
if avatar_sha is None:
|
|
420
|
411
|
return None
|
| ... |
... |
@@ -422,7 +413,7 @@ def _get_avatar_from_storage(self, contact, size, scale): |
|
422
|
413
|
surface = self._load_surface_from_storage(avatar_sha, size, scale)
|
|
423
|
414
|
if surface is None:
|
|
424
|
415
|
return None
|
|
425
|
|
- return clip_circle(surface)
|
|
|
416
|
+ return clip(surface, style)
|
|
426
|
417
|
|
|
427
|
418
|
@staticmethod
|
|
428
|
419
|
def _generate_letter(name):
|