def __convert_PIL_to_SDL(self, image): # Copied from sdl2.ext.image.load_image() # Thanks to Marcus von. Appen! endian = sdl2.endian mode = image.mode width, height = image.size rmask = gmask = bmask = amask = 0 if mode in ("1", "L", "P"): # 1 = B/W, 1 bit per byte # "L" = greyscale, 8-bit # "P" = palette-based, 8-bit pitch = width depth = 8 elif mode == "RGB": # 3x8-bit, 24bpp if endian.SDL_BYTEORDER == endian.SDL_LIL_ENDIAN: rmask = 0x0000FF gmask = 0x00FF00 bmask = 0xFF0000 else: rmask = 0xFF0000 gmask = 0x00FF00 bmask = 0x0000FF depth = 24 pitch = width * 3 elif mode in ("RGBA", "RGBX"): # RGBX: 4x8-bit, no alpha # RGBA: 4x8-bit, alpha if endian.SDL_BYTEORDER == endian.SDL_LIL_ENDIAN: rmask = 0x000000FF gmask = 0x0000FF00 bmask = 0x00FF0000 if mode == "RGBA": amask = 0xFF000000 else: rmask = 0xFF000000 gmask = 0x00FF0000 bmask = 0x0000FF00 if mode == "RGBA": amask = 0x000000FF depth = 32 pitch = width * 4 else: # We do not support CMYK or YCbCr for now raise TypeError("unsupported image format") pxbuf = image.tobytes() surface = sdl2.SDL_CreateRGBSurfaceFrom(pxbuf, width, height, depth, pitch, rmask, gmask, bmask, amask) return sdl2.SDL_CreateTextureFromSurface(self._renderer, surface)
def write_snapshot(self, filename): """Take a snapshot of the view and write it as a BMP image. Parameters ---------- filename : str Destination filename. """ pixel_size = 4 pixels = self._renderer.read_pixels() surface = sdl2.SDL_CreateRGBSurfaceFrom( pixels.data, pixels.width, pixels.height, 8 * pixel_size, pixels.width * pixel_size, _RGB_MASKS.red, _RGB_MASKS.green, _RGB_MASKS.blue, 0) sdl2.SDL_SaveBMP(surface, filename) sdl2.SDL_FreeSurface(surface)
def image_to_surface(image): y_size, x_size, channels = image.shape assert channels == N_RGBA data = numpy.round(image * 255.).astype(numpy.uint8).tobytes() surface = sdl2.SDL_CreateRGBSurfaceFrom( data, x_size, # width y_size, # height 32, # depth x_size * 4, # pitch 0x000000ff, # rmask 0x0000ff00, # gmask 0x00ff0000, # gmask 0xff000000, # amask ) assert surface return surface, data
def set_window_icon(icon: PathLike, bytes_per_pixel: int = 4): """ Lets you set a custom window icon for pyxel. you can call this after pyxel.init """ if not has_pil: RuntimeWarning('You need Pillow/PIL in order to use pyxelext.system.set_window_icon') return current_window = sdl2.SDL_GL_GetCurrentWindow() img = Image.open(icon) x, y = img.size rmask = 0x000000ff gmask = 0x0000ff00 bmask = 0x00ff0000 amask = 0 if bytes_per_pixel == 3 else 0xff000000 icon_surface = sdl2.SDL_CreateRGBSurfaceFrom(img.tobytes(), x, y, bytes_per_pixel*8, bytes_per_pixel*x, rmask, gmask, bmask, amask) sdl2.SDL_SetWindowIcon(current_window, icon_surface) sdl2.SDL_FreeSurface(icon_surface)
def defaultfont(forergb, backrgb, cwidth=8, cheight=16): ''' Given 32-bit foreground and background colors, create a SDL_Surface containing a default character font with 256 character cells of size 8x16, arranged vertically (so entire surface size is 8x4096). Return a pointer to this SDL_Surface and a data array which must not be freed until the surface is freed. ''' pixdata = (ctypes.c_ulong * int(1024 * cwidth * cheight))() charset = sdl2.SDL_CreateRGBSurfaceFrom(ctypes.byref(pixdata), cwidth, cheight << 8, 32, cwidth << 2, 0xff0000, 0xff00, 0xff, 0x0) charsrc = array.array('B') charsrc.fromstring(zlib.decompress( 'x\x9cuW\xcfk\x1bG\x14^\xc5\xb0\xa1 d\xfb\xb6\xc6\xc6F\xb4\x17\xdf\xb6\x18\x94\xdd\xb2\xb6.\xfd\x17z\xe9i\te\xc9a(:\xa9*,j\x82\xc0>\xf6\xa0C\xd0!\xd5)\x97\xfe\x15\xc2jG=,\xceM\x08\xac\x8a\x94\x82s\t\x8e\x83\xc0q\xc0]\xf5\xbd\x997\xb33\xab\xe4\xd3\n\xef\xa7\xf7f\xde\x8fy\xf3f\xbcZ\xadzaX\xaf\xd7\xbfl\xf6V\x02\xef&\xfd0\xac\x84\x00\xc97\x06\x83A\x0f\xbe\x83\r\xc9\xc7\x83\xe3&\xe0x0\x96\xfca\x7f \xd0\x7f(ye\xf0\xe2\xf9\xd9\xf3\xe1\x8bA\xc5\xe2\xc3\xe1\xa61\xbe\x1e\x86\x83?%GK\xc2\x1c\xd9\x1b\xbf!\xd0\xfc\xff,\x11GGGg\x92\xef\x80\xa9\xb330\xba#\xf9\xe6P@\xdb\x0b\xb7+\x95Cc\xbep\xe7\x8bJ\xfd\xeb\x82\xf7BB\xcf\x88oX\xf8G\xf2\xc3zo\xf9^\xcb1\xc6\x1d-\x1fN\x96\x1f\xf5\xf8g\xcf^Z\xfe\x86\xa5\xf9\x89\xf5\'\xef\n~xxX\xd9\xee+\xde\xefM&\xbd\xbe\xf2\x0fs96\xe6\xab\x84?/\xdf\xbc\x1a\x1e\x87\x14\xdf\xf8\x15\x81\xe4\xab_\x9a\x07\xbfN\xfe}\xff\xf1?\x92/\tc\xb5\x9a\xab\xcf\xc1\x81g\r^\x14E\x9e\xe79\xf0 \x92$\xf9\xcaV`,g\xe2+\xb4\xbd\x94\x9f\x8fR\xd7=\xe5)\x8dp\xcey\xd5\xf3c~*Y\xc0X\xd0\x9egY\xd6\x16\xd4\xf7\xfd\xd8\x9a\x0et\x05\xbc\xaa\xe4\xf0"\xe0\xf9Z%\x89VQb\xba\xe8u\x95-\xe37c\x80\x93\x7f".=\xe2\x81\x8b\xfe\x8d\x9e*\xff8\x9fN9g\x01\xe9\x05\x1dO\xa0+y\xca\xa5:\xcf5w#\xd7uyJ\xfe\xefE,\xcb\xc1\xe1}2=\x1a\x8d\xee\ry\x10\x03\xe7\x00\xe29\x8c\x971\xab\xf9@d\xc8\xf1\xbd\x0b\xe3\xab\x1d\xcbs#`\xe2*\\\xe1\x1ed\xcd\xd5\n]\xf1(\x08\x19\xea\xe8\xf9\xab\xc6\xfa\x8a\x1f\x16\x8b\xc5|D\xf6\xb70!9:$\xf9=T@\n\xdf\xe4^\xf2(9\x87\x08G\xe7I$\xf9\x1dK\x04\xd8\x1d\xc5\x97<~\xd2y\x12?Nr\x8b\xc7\xf1\x8d1~\xc1y\xf2\x8d\xe4hI\x98#{\x91G\xa0\xf9\xf7E5@\xfdP>\xae\xc0T\xa7\x03F\xaf$\xbf\x89\x05\xb4=~\x9d\xe7Sc>~u\x9b/.\n.rm\xe4[\xc4\x17\x17\xfe\x91|\xbaH\xab5-\xc7\x18\xaf\xb4<\x0e\xaa\xae\x1e\xdf\xed~o\xf9\xcbK\xf3\x13c\xc1V\xc1\xa7\xd3i~\xcd\x14gi\x10\xa4L\xf9\x87\xb9\x8c\x8c\xf9r~\x8a\x8bw\xae\xea/\xf2\t$w\x9e\x8e^\xb7\x82\xbd\x9a\xfb\x80\xe4UB\xa4V\xd3\xf9\x1cV\xb8\x1d\xcb\x1b\t\xd0\xa9\xa6z\xbf:\xaf\xe3\xb8#\x968\xd5\xf2\x94C\x01\xa8\xf8\xf6\xc0\x12\xcb\n}!\xcf\x0by\xc0~\x88o\x8c\xfc\x02\xda\xa8\x9e\xa5U\xb1\xa40?k\'E~\xa1.\x033\x9f\xae\xeb\xd4\\\x81D\x94\x1c\xe8\xcb\x02 \xfd\xa0T/\x80\xb79$xZ\xc4=\x97\x15j\xf8g\xac\x8f\x96\xa7\xdaE\xe5\x9f\xda\xd2\xf3vb\xf9\x9fb\x05\xa8\xf1[\xbe\x7f\x8f\xcb\xd1\xd8\xd3r1\xdc\xc8G"\xd7TsY\x00\xac\xe0,\x08\xccu\x92\x15\xd3u\xabjKe\xd8Oi\xfdk\x10j\x0b\xe3\xad\xa9|\x89\xcd\xec\xa9\xfd\x8c2\xd4\xf1Z\x14\xcc\xdc)A\xecp5\x1d\xedg\xd8\xceUWD\x94\xd9\xfec\x1f6\xd7\x13\x06\xdb\xf5\x91\xd9\xf5\x02\xdd\xc6\xe2\x01\xf4UK\x1f-\xc2\x12\x829U\xa0v\xbdp\xbb~p>K\x9e8V}xp2\x98\x1c\xf5M\xce\x8b\x86\xa6\xdc19\xb6\xc5<\x89a\xed\x93\xe2\xcc\xc8\xda\x8d\xeel\xf6\xa3$\'P\xdc9\xe6\xe3B\xc7o\xd5\x0f\xb7\xebI\xfa[p\xbf\x93Y\xf9D\xb9U\x1f\xdcX\xef\x0eR\xd5\xa0R\x12\xdb\xfd\x04\xe2\xc2b\xc4\x16A\xf9\xa5\xeduE\xfd\x19+\xad\x8b\x07\xa4\x94\xdfe\xd9\xdd\x1f\xd9\x02\xec\xc9\xfa\xaa\xedz\xe2\xf8\x04\xccZ\x94\x00s}p\xbd\xad\xfc\x82\xdc\x8c\x07\xb9\xe5?\xd4\x97\xb1\xbf\x80\xe9\x86+\x17\x9b\xb1\x13\xf34\xc2\xeb\x80Sl=\xec@\xf0\xc0\xf1j\xecGq\x86\x8e\x0c\x9d\x1c\xb7\xbf|\x85R\xe5\xb8\x1d\xe6\xd0\x15O\n\x9e\\\xfcv"U\xe4n\xc0K\x8c\x1e\xde`3\xd60\xa6\x03\xc6f\xf2u\xfb[\xfb\xf3\xdd\xef\xf6\xe7\xef\x9f\xec\x8f\xf7i\xdc\x95\x98\xe6\r\x89[\xfa\xab\xbc\xc8-^\xd6\xbfu\xb5~\x19\x94\x0e[~\xeb\xea\xda\xa5_4W\xfe86l\x7f=\xef\xc0\xd2\xf7\xbc\xf2\xbdpU\xd6W/J^\x1e_\xd2\xd6\xfa\xe4\xdf#\xcb\xffG~\xd3\xb2\xd6\xf4m\xf9\x07\xc7\xf6g\xe5|(\x8d\xd7\xfa$\xd7\xfa4^\xebSt\xb6\xbc\xd1(\xcf\xbf*\xc7WZ\x06\xed\xaf\x8a\xcf\x1a\x7f\xb0\x96\x9ffi\xbc\x9e\x8f\xb2U\xceoy\xbd\xf4|kWx\xf2O\xe1\xa6\x84\xcd\x12\xeca\x84\xf6|6\x9b\xcdi?w`k\xcf2\xd8\xbe\x99\xe4\xd0)G\x12J\x1d\xaf\xff\x08E9\xf4\xb4\xe2|\x02@\xf3\x04\xb4\x14U\xa7\xab\x9a\xa0=\xb7r\xd3\x85\x8e&\x9a\x16qj\xcf\xea>.\x0e+4w-\xf9>\\gO\xc4\x81Z\xd8\xbb\xbc\xbc,Z\xcc\x86\x0b|\xd9U\xe6\xf6\xfc\x18\xdb{\xec\xab\xf3Y_\x00u<\xea!\xd0\xbf\x17*It}\xd6M\x8c\xae\xdb\x8a\xd7vw\xbdu\x98\xf1\xc3d]\xf3\xfe\x8eMR\x9f\xca\xa2\x1f\xaea\xfd\xdf\x1b\xf5\xb2)\xeevo\x19\x8bd<3s)\x00\xad\x99\x1f\xffe\x97O*\xb1n\x05\xf0?\x93\x8d\xb5\xab' )) for y in xrange(4096): #offset = y << 3 offset = ((y >> 4) * cheight + (y & 15)) * cwidth #print y, offset pixdata[offset ] = forergb if charsrc[y] & 128 else backrgb pixdata[offset + 1] = forergb if charsrc[y] & 64 else backrgb pixdata[offset + 2] = forergb if charsrc[y] & 32 else backrgb pixdata[offset + 3] = forergb if charsrc[y] & 16 else backrgb pixdata[offset + 4] = forergb if charsrc[y] & 8 else backrgb pixdata[offset + 5] = forergb if charsrc[y] & 4 else backrgb pixdata[offset + 6] = forergb if charsrc[y] & 2 else backrgb pixdata[offset + 7] = forergb if charsrc[y] & 1 else backrgb for oo in xrange(offset + 8, offset + cwidth): pixdata[oo] = pixdata[offset + 7] if (y & 15) == 15: for oo in xrange(((y >> 4) * cheight + 16) * cwidth, (((y >> 4) + 1) * cheight) * cwidth): pixdata[oo] = pixdata[oo - cwidth] return charset, pixdata
def OnPaint(self, element_type, paint_buffer, **_): """ Using the pixel data from CEF's offscreen rendering the data is converted by PIL into a SDL2 surface which can then be rendered as a SDL2 texture. """ if element_type == cef.PET_VIEW: image = Image.frombuffer( 'RGBA', (self.__width, self.__height), paint_buffer.GetString(mode="rgba", origin="top-left"), 'raw', 'BGRA' ) # Following PIL to SDL2 surface code from pysdl2 source. mode = image.mode rmask = gmask = bmask = amask = 0 depth = None pitch = None if mode == "RGB": # 3x8-bit, 24bpp if sdl2.endian.SDL_BYTEORDER == sdl2.endian.SDL_LIL_ENDIAN: rmask = 0x0000FF gmask = 0x00FF00 bmask = 0xFF0000 else: rmask = 0xFF0000 gmask = 0x00FF00 bmask = 0x0000FF depth = 24 pitch = self.__width * 3 elif mode in ("RGBA", "RGBX"): # RGBX: 4x8-bit, no alpha # RGBA: 4x8-bit, alpha if sdl2.endian.SDL_BYTEORDER == sdl2.endian.SDL_LIL_ENDIAN: rmask = 0x00000000 gmask = 0x0000FF00 bmask = 0x00FF0000 if mode == "RGBA": amask = 0xFF000000 else: rmask = 0xFF000000 gmask = 0x00FF0000 bmask = 0x0000FF00 if mode == "RGBA": amask = 0x000000FF depth = 32 pitch = self.__width * 4 else: logging.error("ERROR: Unsupported mode: %s" % mode) exit_app() pxbuf = image.tobytes() # Create surface surface = sdl2.SDL_CreateRGBSurfaceFrom( pxbuf, self.__width, self.__height, depth, pitch, rmask, gmask, bmask, amask ) if self.texture: # free memory used by previous texture sdl2.SDL_DestroyTexture(self.texture) # Create texture self.texture = sdl2.SDL_CreateTextureFromSurface(self.__renderer, surface) # Free the surface sdl2.SDL_FreeSurface(surface) else: logging.warning("Unsupport element_type in OnPaint")
# test only if options.copyPacket: pkt2 = copy.copy(pkt) else: pkt2 = pkt pkt2.decode() if pkt2.decoded: decodedCount += 1 print('decoded frame %d' % decodedCount) if decodedCount >= options.offset: print('saving frame...') buf = pkt2.swsFrame.contents.data[0] # convert buffer to a SDL Surface surface = sdl2.SDL_CreateRGBSurfaceFrom(buf, size[0], size[1], 24, size[0] * 3, rmask, gmask, bmask, amask) # save then free surface sdl2.SDL_SaveBMP(surface, 'frame.%d.bmp' % decodedCount) sdl2.SDL_FreeSurface(surface) if decodedCount >= options.offset + options.frameCount: break
def loadfont(infilename=None, sets=None): global screen global loadedfontpack if infilename is False and loadedfontpack is not None: fdata = loadedfontpack else: if not isinstance(infilename, (str, unicode)): infilename = prefs['font.file'] with open(infilename, 'rb') as f: fdata = f.read(32) #insert newer version read blocks here if fdata.startswith('SRCF binary v1860\r\n'): fdata = fdata[19:] + f.read() try: fdata = zlib.decompress(fdata) except zlib.error: print 'Decompression error reading {:s}'.format(infilename) return try: fdata = pickle.loads(fdata) except Exception: print 'Error interpreting {:s}'.format(infilename) return #perform transformation to newer version srcf data here else: print 'Signature check failed reading {:s}'.format(infilename) return #assume fdata is in up-to-data srcf format loadedfontpack = fdata rootdict, basesets, extsets, gpages = fdata del fdata #print rootdict if sets is None or sets == '(default)': sets = rootdict[0][6] if isinstance(sets, unicode): try: sets = rootdict[0][5][sets] except KeyError: for k in rootdict[0][5]: sets = rootdict[0][5][k] break elif isinstance(sets, (str, unicode)): sets = unicode(sets).split(u' ') #populate data with base set baseset = sets[0] sets = sets[1:] try: baseset = basesets[baseset] except KeyError: print 'First element in charset selection is not a baseset' return cflags = baseset[0][4] cucp = baseset[0][3] if baseset[0][5] not in gpages: print 'Missing graphics set from font file' return gsrc = [baseset[0][5]] * 256 #add in selected extension sets #TODO #save codepoint table screen.encoding = [unichr(c) for c in cucp] #begin drawing characters fcw = rootdict[0][3] fch = rootdict[0][4] pagesize = 1024 * fcw * fch #allocate font memory area and create surface objects if necessary freesurf = [] freedsurfrepr = set() for a in cellcolors: if a not in fontmemory: fontmemory[a] = (ctypes.c_ulong * pagesize)() if screen.charsurf[a] is not None: freesurf.append(screen.charsurf[a]) screen.charsurf[a] = sdl2.SDL_CreateRGBSurfaceFrom( ctypes.byref(fontmemory[a]), fcw, fch << 8, 32, fcw << 2, 0xff0000, 0xff00, 0xff, 0x0) for s in freesurf: r = repr(s) if r in freedsurfrepr: continue sdl2.SDL_FreeSurface(s) freedsurfrepr.add(r) del freesurf del freedsurfrepr for a in xrange(256): if a not in cellcolors: screen.charsurf[a] = screen.charsurf[attalias[a]] if prefs['font.subpixel'] == 'rgb': offsetr = 0 offsetg = 1 offsetb = 2 elif prefs['font.subpixel'] == 'bgr': offsetr = 2 offsetg = 1 offsetb = 0 else: offsetr = 1 offsetg = 1 offsetb = 1 for c in xrange(256): colorclass = cflags[c] & 7 gp = gpages[gsrc[c]][c] for a in cellcolors: try: backcolor = ibmcolors[cellcolors[a][0]] except IndexError: backcolor = 0x00 try: forecolor = ibmcolors[cellcolors[a][1][colorclass]] except IndexError: forecolor = 0x2a backr = (backcolor & 0x30) >> 4 backg = (backcolor & 0xc) >> 2 backb = backcolor & 0x3 forer = (forecolor & 0x30) >> 4 foreg = (forecolor & 0xc) >> 2 foreb = forecolor & 0x3 aptr = 0 mptr = fcw * fch * c for y in xrange(fch): for x in xrange(fcw): try: r = colormix[backr][forer][gp[aptr + offsetr]] g = colormix[backg][foreg][gp[aptr + offsetg]] b = colormix[backb][foreb][gp[aptr + offsetb]] except IndexError: r = colormix[backr][forer][9] g = colormix[backg][foreg][9] b = colormix[backb][foreb][9] fontmemory[a][mptr] = r << 16 | g << 8 | b aptr += 3 mptr += 1 yield None screen.cellwidth = fcw screen.cellheight = fch screen.refresh()