Из-за проблем с производительностью пришлось выбросить из проекта эту библиотеку. Теперь для отображения количества точек используется заранее сгенерированный spritesheet, в котором иконки с надписями. И скорость работы повысилась, и ушёл один плавающий баг. В общем, чем проще, тем лучше.
А spritesheet сгенерировал скриптом на питоне, который выглядит примерно так:
import math
from os import path
from PIL import ImageFont, Image, ImageDraw
def here(*pathchunks):
return path.abspath(path.join(path.dirname(__file__), *pathchunks))
def spritesheet(image, labels, columns):
original_width, original_height = image.size
font_name = '/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf'
font = ImageFont.truetype(font_name, 10)
sheet_items = []
for label in labels:
item_image = image.copy()
item_draw = ImageDraw.Draw(item_image)
_, text_height = item_draw.textsize(label)
text_width, _ = font.getsize(label)
item_draw.text(
((original_width - text_width) / 2, (original_height - text_height) / 2),
label, (255, 255, 255), font=font)
sheet_items.append(item_image)
sheet_width = original_width * columns
lines = int(math.ceil(len(labels) / float(columns)))
sheet_height = original_height * lines
sheet = Image.new(mode='RGBA', size=(sheet_width, sheet_height), color=(0, 0, 0, 0))
for number, item_image in enumerate(sheet_items):
x = number % columns
y = int(number / columns)
sheet.paste(item_image, (x * original_width, y * original_height))
sheet.save(here('sheet.png'), 'PNG')
if __name__ == '__main__':
spritesheet(
Image.open(here('image.png')), [str(i) for i in range(25)], 10
)