""" core.font.glyph - glyph abstraction """ from core.logger import log __all__ = [ 'glyph_get_wgeometry', 'glyph_encode', ] #--- # Public #--- def glyph_get_wgeometry(geometry_info, img_raw, img_size, pos, grid_size): """ Generate glyph width geometry information @args > geometry_info (dict) - geometry information > img_raw (list) - list of all pixel of the image > img_size (tuple) - image width and image height > pos (tuple) - glyph position information (X and Y in pixel) > grid_size (tuple) - glyph grid size information (width and height) @return > Nothing """ geometry_info['wstart'] = -1 geometry_info['wend'] = -1 _px = pos[0] _py = pos[1] log.debug(f'[geometry] X:{pos[0]} Y:{int(pos[1]/img_size[0])}') log.debug(f' - grid_size = {grid_size}') for _ in range(0, grid_size[1]): for offx in range(0, grid_size[0]): if img_raw[_py + (_px + offx)][:3] == (255, 255, 255): continue if geometry_info['wstart'] < 0 or offx < geometry_info['wstart']: geometry_info['wstart'] = offx if geometry_info['wstart'] < 0 or offx > geometry_info['wend']: geometry_info['wend'] = offx _py += img_size[0] geometry_info['wend'] += 1 log.debug(f' - geometry = {geometry_info}') def glyph_encode(data_info, img_info, geometry, posx, posy): """ Encode glyph bitmap @args > data_info (dict) - internal data information (list, index and shift) > img_info (dict) - image-related information (object and raw content) > geometry (dict) - geometry information > posx (int) - X-axis position in pixel > posy (int) - Y-axis position in pixel @return > Nothing """ # fetch information img = img_info['obj'] img_raw = img_info['raw'] data = data_info['table'] data_idx = data_info['idx'] data_shift = data_info['shift'] wstart = geometry['wstart'] wend = geometry['wend'] # encode the glyph yoff = 0 log.debug(f'[encode] X:{posx} Y:{int(posy/img.size[0])}') for _h in range(geometry['hstart'], geometry['hend']): for _w in range(wstart, wend): if img_raw[(posy + yoff) + (posx + _w)][:3] == (0, 0, 0): log.debug('#', end='') data[data_idx] |= 0x80000000 >> data_shift else: log.debug('.', end='') data[data_idx] &= ~(0x80000000 >> data_shift) if (data_shift := data_shift + 1) >= 32: data_shift = 0 data_idx += 1 log.debug('') yoff += img.size[0] # commit modification data_info['idx'] = data_idx data_info['shift'] = data_shift