Best Python code snippet using playwright-python
runes.py
Source:runes.py
1def is_list(lst):2 return isinstance(lst, (list, tuple))3# Constants4viewport_size = 600 # This is the height of the viewport5spread = 20 #used to be 20, but i like at 806active_hollusion = None7lastframe = None8#Setup9import graphics10import math11import time12import PyGif13Posn = graphics.Posn14Rgb = graphics.Rgb15draw_solid_polygon = graphics.draw_solid_polygon16graphics.init(viewport_size)17vp = graphics.open_viewport("ViewPort", 4/3*viewport_size, viewport_size)18lp = graphics.open_pixmap("LeftPort", 4/3*viewport_size, viewport_size)19rp = graphics.open_pixmap("RightPort", 4/3*viewport_size, viewport_size)20def clear_all():21 global active_hollusion22 global vp, lp, rp23 if(active_hollusion != None):24 active_hollusion("kill")25 active_hollusion = None26 graphics.clear_viewport(vp)27 graphics.clear_viewport(lp)28 graphics.clear_viewport(rp)29class Frame:30 def __init__(self, p0, p1, p2, z1, z2):31 self.orig = p032 self.x = p133 self.y = p234 self.z1 = z135 self.z2 = z236unit_frame = Frame(Posn(1/6*viewport_size, 0),37 Posn(viewport_size,0),38 Posn(0,viewport_size),39 0,40 1)41def show(painter):42 return painter(vp, unit_frame)43def scale_vect(mult, p):44 return Posn(mult*p.x, mult*p.y)45#translate_posn removed - no one uses it.46 #Also it only translates on x axis47def transform_posn(frame):48 def f(posn):49 return frame.orig + (scale_vect(posn.x/viewport_size, frame.x) + scale_vect(posn.y/viewport_size, frame.y))50 return f51#this is new - for higher precision rendering52def inverse_transform_posn(frame):53 a = frame.x.x54 b = frame.y.x55 c = frame.x.y56 d = frame.y.y57 det = a*d-b*c58 if(det == 0):59 raise Exception("somehow you managed to zero the determinent for your frame")60 inv_mat = ((d/det, -b/det), (-c/det, a/det))61 def function(posn):62 nonlocal inv_mat63 t = list(map(lambda m: m[0]*(posn.x-frame.orig.x) + m[1] * (posn.y-frame.orig.y), inv_mat)) #it's a matrix multiply64 return Posn(viewport_size*t[0], viewport_size*t[1])65 return function66##painters67def blank_bb(vp, frame):68 return69def sail_bb(vp, frame):70 p = [Posn(viewport_size/2, 0), Posn(viewport_size/2, viewport_size), Posn(viewport_size, viewport_size)]71 if(is_list(vp[0])):72 for count, port in enumerate(vp):73 draw_solid_polygon(port, map(transform_posn(frame), p),74 Posn((0.3 - frame.z1) * (spread * (((2 * count) / (len(vp) - 1)) - 1)), 0),75 Rgb(frame.z1, frame.z1, frame.z1))76 elif (vp != None):77 draw_solid_polygon(vp, map(transform_posn(frame), p), Posn(0,0), Rgb(frame.z1, frame.z1, frame.z1))78def corner_bb(vp, frame):79 p = [Posn(viewport_size/2, 0), Posn(viewport_size,0), Posn(viewport_size, viewport_size/2)]80 if(is_list(vp[0])):81 for count, port in enumerate(vp):82 draw_solid_polygon(port, map(transform_posn(frame), p),83 Posn((0.3 - frame.z1) * (spread * (((2 * count) / (len(vp) - 1)) - 1)), 0),84 Rgb(frame.z1, frame.z1, frame.z1))85 elif (vp != None):86 draw_solid_polygon(vp, map(transform_posn(frame), p), Posn(0,0), Rgb(frame.z1, frame.z1, frame.z1))87def black_bb(vp, frame):88 p = [Posn(0,0), Posn(viewport_size,0), Posn(viewport_size, viewport_size), Posn(0, viewport_size)]89 if(is_list(vp[0])):90 for count, port in enumerate(vp):91 draw_solid_polygon(port, map(transform_posn(frame), p),92 Posn((0.3 - frame.z1) * (spread * (((2 * count) / (len(vp) - 1)) - 1)), 0),93 Rgb(frame.z1, frame.z1, frame.z1))94 elif (vp != None):95 draw_solid_polygon(vp, map(transform_posn(frame), p), Posn(0,0), Rgb(frame.z1, frame.z1, frame.z1))96# // center-and-fill will center and scale a 2x2 image to fill the entire viewport.97# // This is used by circle-bb, spiral-bb, and ribbon-bb.98def center_and_fill(p):99 center = Posn(viewport_size/2,viewport_size/2)100 return center+scale_vect(viewport_size/2, p)101#same with the js version, this doesn't work.102def spiral_bb(vp, frame):103 theta_max = 30104 thickness = -1/theta_max105 offset = 0.1106 angle = 0107 p = []108 while(angle<theta_max):109 p.append(Posn( (offset+angle/theta_max)*math.cos(angle) , (offset+angle/theta_max)*math.sin(angle)))110 angle += offset111 if(is_list(vp[0])):112 for count, port in enumerate(vp):113 draw_solid_polygon(port, map(transform_posn(frame), map(center_and_fill, p)),114 Posn((0.3 - frame.z1) * (spread * (((2 * count) / (len(vp) - 1)) - 1)), 0),115 Rgb(frame.z1, frame.z1, frame.z1))116 elif (vp != None):117 draw_solid_polygon(vp, map(transform_posn(frame), map(center_and_fill, p)), Posn(0,0), Rgb(frame.z1, frame.z1, frame.z1))118def circle_bb(vp, frame):119 unit = 50120 p = []121 angle = 0122 while(angle<2*math.pi):123 p.append(Posn(math.cos(angle),math.sin(angle)))124 angle+= unit/viewport_size125 if(is_list(vp[0])):126 for count, port in enumerate(vp):127 draw_solid_polygon(port, map(transform_posn(frame), map(center_and_fill, p)),128 Posn((0.3 - frame.z1) * (spread * (((2 * count) / (len(vp) - 1)) - 1)), 0),129 Rgb(frame.z1, frame.z1, frame.z1))130 elif (vp != None):131 draw_solid_polygon(vp, map(transform_posn(frame), map(center_and_fill, p)), Posn(0,0), Rgb(frame.z1, frame.z1, frame.z1))132def pentagram_bb(vp, frame):133 unit_offset = viewport_size / 2134 s1 = math.sin(2*math.pi/5) * unit_offset135 c1 = math.cos(2*math.pi/5) * unit_offset136 s2 = math.sin(4*math.pi/5) * unit_offset137 c2 = math.cos(math.pi/5) * unit_offset138 a = s2 / (s1 + s2)139 a_ = 1-a140 p = [Posn(-s1 + unit_offset, -c1 + unit_offset),\141 Posn(s1+unit_offset, -c1 + unit_offset),\142 Posn(-s2+unit_offset, c2+unit_offset),\143 Posn(unit_offset, 0),\144 Posn(s2+unit_offset, c2+unit_offset)145 ]146 #converted to 10 element form.147 p = [p[0],\148 p[3]*a+p[2]*a_,\149 p[2],\150 p[1]*a+p[2]*a_,\151 p[4],\152 p[2]*a+p[1]*a_,\153 p[1],\154 p[4]*a+p[3]*a_,\155 p[3],\156 p[2]*a+p[3]*a_]157 if(is_list(vp[0])):158 for count, port in enumerate(vp):159 draw_solid_polygon(port, map(transform_posn(frame), p),160 Posn((0.3 - frame.z1) * (spread * (((2 * count) / (len(vp) - 1)) - 1)), 0),161 Rgb(frame.z1, frame.z1, frame.z1))162 elif (vp != None):163 draw_solid_polygon(vp, map(transform_posn(frame), p), Posn(0,0), Rgb(frame.z1, frame.z1, frame.z1))164def heart_bb(vp, frame):165 k = math.sqrt(2)/2166 p = [Posn(viewport_size/2, (1-k)/(1+3*k) * viewport_size),\167 Posn((1-k)/(1+k) * viewport_size / 2, (1+k)/(1+3*k) * viewport_size),\168 Posn(viewport_size / 2, viewport_size),\169 Posn(viewport_size - (1-k)/(1+k) * viewport_size / 2, (1+k)/(1+3*k) * viewport_size)]170 #draws kite171 if(is_list(vp[0])):172 for count, port in enumerate(vp):173 draw_solid_polygon(port, map(transform_posn(frame), p),174 Posn((0.3 - frame.z1) * (spread * (((2 * count) / (len(vp) - 1)) - 1)), 0),175 Rgb(frame.z1, frame.z1, frame.z1))176 elif (vp != None):177 draw_solid_polygon(vp, map(transform_posn(frame), p), Posn(0,0), Rgb(frame.z1, frame.z1, frame.z1))178 #Draw the top of the heart179 heart_circle = stack_frac(2 / (1 + 3 * k), \180 quarter_turn_right(stack_frac(k / (1+k), blank_bb, circle_bb)), \181 blank_bb)182 heart_circle(vp, frame)183 flip_horiz(heart_circle)(vp, frame)184def rcross_bb(vp, frame):185 p1 = [Posn(0,0),\186 Posn(viewport_size / 4, viewport_size / 4),\187 Posn(3 * viewport_size / 4, viewport_size / 4),\188 Posn(3 * viewport_size / 4, 3 * viewport_size / 4),\189 Posn(viewport_size, viewport_size),\190 Posn(viewport_size, 0)]191 p2 = [Posn(viewport_size / 4, viewport_size / 4),\192 Posn(viewport_size / 4, 3 * viewport_size / 4),\193 Posn(3 * viewport_size / 4, 3 * viewport_size / 4)]194 if(is_list(vp[0])):195 for count, port in enumerate(vp):196 draw_solid_polygon(port, map(transform_posn(frame), p1),197 Posn((0.3 - frame.z1) * (spread * (((2 * count) / (len(vp) - 1)) - 1)), 0),198 Rgb(frame.z1, frame.z1, frame.z1))199 draw_solid_polygon(port, map(transform_posn(frame), p2),200 Posn((0.3 - frame.z1) * (spread * (((2 * count) / (len(vp) - 1)) - 1)), 0),201 Rgb(frame.z1, frame.z1, frame.z1))202 elif (vp != None):203 draw_solid_polygon(vp, map(transform_posn(frame), p1), Posn(0,0), Rgb(frame.z1, frame.z1, frame.z1))204 draw_solid_polygon(vp, map(transform_posn(frame), p2), Posn(0,0), Rgb(frame.z1, frame.z1, frame.z1))205def ribbon_bb(vp, frame):206 theta_max = 30207 thickness = -1 / theta_max208 unit = 0.1209 p = []210 angle = 0211 #make ribbon212 while(angle<theta_max):213 p.append(Posn((angle / theta_max) * math.cos(angle), \214 (angle / theta_max) * math.sin(angle)))215 angle+= unit216 #close it217 while(angle>0):218 p.append(Posn(abs(math.cos(angle) * thickness) + (angle / theta_max * math.cos(angle)),\219 abs(math.sin(angle) * thickness) + (angle / theta_max * math.sin(angle))))220 angle -= unit221 if(is_list(vp[0])):222 for count, port in enumerate(vp):223 draw_solid_polygon(port, map(transform_posn(frame), map(center_and_fill, p)),224 Posn((0.3 - frame.z1) * (spread * (((2 * count) / (len(vp) - 1)) - 1)), 0),225 Rgb(frame.z1, frame.z1, frame.z1))226 elif (vp != None):227 draw_solid_polygon(vp, map(transform_posn(frame), map(center_and_fill, p)), Posn(0,0), Rgb(frame.z1, frame.z1, frame.z1))228def nova_bb(vp, frame):229 p = [Posn(viewport_size / 2, 0),\230 Posn(viewport_size / 4, viewport_size / 2),\231 Posn(viewport_size, viewport_size / 2),\232 Posn(viewport_size / 2, viewport_size / 4)]233 if(is_list(vp[0])):234 for count, port in enumerate(vp):235 draw_solid_polygon(port, map(transform_posn(frame), p),236 Posn((0.3 - frame.z1) * (spread * (((2 * count) / (len(vp) - 1)) - 1)), 0),237 Rgb(frame.z1, frame.z1, frame.z1))238 elif (vp != None):239 draw_solid_polygon(vp, map(transform_posn(frame), p), Posn(0,0), Rgb(frame.z1, frame.z1, frame.z1))240#frame transformation factory241def process_frame(op, frame):242 p0 = frame.orig243 p1 = frame.x244 p2 = frame.y245 z1 = frame.z1246 z2 = frame.z2247 if (op == "bottom_frac"):248 def function(frac):249 return Frame(p0 + scale_vect(1 - frac, p2), p1, scale_vect(frac, p2), z1, z2)250 return function251 elif (op == "top_frac"):252 def function(frac):253 return Frame(p0, p1, scale_vect(frac, p2), z1, z2)254 return function255 #unused256 elif (op == "left"):257 return Frame(p0, scale_vect(1/2, p1), p2, z1, z2)258 #unused259 elif (op == "right"):260 return Frame(p0+scale_vect(1/2, p1), scale_vect(1/2, p1), p2, z1, z2)261 elif (op == "flip_horiz"):262 return Frame(p0+p1, scale_vect(-1, p1), p2, z1, z2)263 elif (op == "flip_vert"):264 return Frame(p0+p2, p1, scale_vect(-1, p2), z1, z2)265 elif (op == "reduce_2"): # unused in original266 raise NotImplementedError("reduce_2 is not implemented")267 elif (op == "rotate"): #bug: Basically old rotate bug.268 def function(rad):269 cos_theta = math.cos(rad)270 sin_theta = math.sin(rad)271 def rotate_posn(p):272 return Posn(cos_theta*p.x + sin_theta * p.y, cos_theta * p.y - sin_theta * p.x)273 half_gradient = scale_vect(1/2, p1+p2)274 center = p0+half_gradient+ rotate_posn(scale_vect(-1, half_gradient))275 return Frame(center, rotate_posn(p1), rotate_posn(p2), z1, z2)276 return function277 elif (op == "rotate90"):278 return Frame(p0+p1, p2, scale_vect(-1, p1), z1, z2)279 elif (op == "deep_frac"):280 def function(frac):281 return Frame(p0, p1, p2, z1+((z2-z1)*frac),z2)282 return function283 elif (op == "shallow_frac"):284 def function(frac):285 return Frame(p0, p1, p2, z1, z1+((z2-z1)*frac))286 return function287 elif (op == "scale_independent"):288 def function(ratio_x, ratio_y):289 gradient = p1+p2290 scaled_gradient = Posn(((1-ratio_x)/2)* gradient.x, ((1-ratio_y)/2)*gradient.y)291 center = p0+scaled_gradient292 return Frame(center, scale_vect(ratio_x, p1), scale_vect(ratio_y, p2), z1, z2)293 return function294 elif (op == "translate"):295 def function(x,y):296 return Frame(p0+scale_vect(x,p1)+scale_vect(y,p2), p1,p2,z1,z2)297 return function298##basic painter combinations299#top, bottom300def stack_frac(frac, p1, p2):301 def function(vp, frame):302 uf = process_frame("top_frac", frame)(frac)303 lf = process_frame("bottom_frac", frame)(1-frac)304 p1(vp, uf)305 p2(vp, lf)306 return function307#top, bottom308def stack(p1, p2):309 return stack_frac(1/2, p1, p2)310def rotate(rad, painter):311 def function(vp, frame):312 painter(vp, process_frame("rotate", frame)(rad))313 return function314def eighth_turn_left(painter):315 return rotate(math.pi/4, painter)316def quarter_turn_right(painter):317 def function(vp, frame):318 painter(vp, process_frame("rotate90", frame))319 return function320def flip_vert(painter):321 def function(vp, frame):322 painter(vp, process_frame("flip_vert", frame))323 return function324def flip_horiz(painter):325 def function(vp, frame):326 painter(vp, process_frame("flip_horiz", frame))327 return function328#TODO: rewrite overlay consistently329#p1 over p2330def overlay_frac(frac, p1, p2):331 def function(vp, frame):332 if(frac>1 or frac<0):333 raise ValueError("overlay_frac: 0 <= frac <= 1 is required")334 else:335 df = process_frame("deep_frac", frame)(frac)336 sf = process_frame("shallow_frac", frame)(frac)337 p2(vp, df)338 p1(vp, sf)339 return function340#p1 under p2341def overlay(p1, p2):342 return overlay_frac(1/2, p1, p2)343def scale_independent(ratio_x, ratio_y, painter):344 def function(vp, frame):345 painter(vp, process_frame("scale_independent", frame)(ratio_x, ratio_y))346 return function347def scale(ratio, painter):348 return scale_independent(ratio, ratio, painter)349# // Translate the painter. Note that positive x means right translate350# // positive y means translate down.351# the amount is to be a fraction of viewport_size352def translate(x,y, painter):353 def function(vp, frame):354 painter(vp, process_frame("translate", frame)(x,y))355 return function356#painter combinations defined in lecture 2357#check if this is still in lecture 2358def turn_upside_down(painter):359 return quarter_turn_right(quarter_turn_right(painter))360def quarter_turn_left(painter):361 return turn_upside_down(quarter_turn_right(painter))362def beside(painter1, painter2):363 return quarter_turn_right(stack(quarter_turn_left(painter2), quarter_turn_left(painter1)));364def make_cross(painter):365 return stack(beside(quarter_turn_right(painter), turn_upside_down(painter)), beside(painter,quarter_turn_left(painter)))366def repeat_pattern(n, pat, pic):367 if(n==0):368 return pic369 else:370 return pat(repeat_pattern(n-1, pat, pic))371def stackn(n, painter):372 if n==1:373 return painter374 else:375 return stack_frac(1/n, painter, stackn(n-1, painter))376def hollusion(painter, ports=None):377 global active_hollusion378 frequency = 2379 MAX_X = round(4/3*viewport_size)380 MAX_Y = round(viewport_size)381 num = ports382 if ports == None or ports <= 2:383 num = 9 #because python is faster than scheme. Used to be 3384 buffers = list(map(lambda p: graphics.open_pixmap("buffer", 4/3*viewport_size,viewport_size), range(num)))385 stereo = vp386 def animation(cmd=None):387 ports = buffers388 kill = False389 curr = -1390 dir = 1391 def Self(msg):392 nonlocal kill393 nonlocal curr394 nonlocal Self395 nonlocal dir396 if msg == "next":397 curr = (curr+dir)398 if (curr == num or curr<0):399 dir = -dir400 curr += 2*dir401 graphics.show_viewport(buffers[curr])402 if(kill != True): #moved it here so you can happily next if the hollusion is dead.403 vp[0].after(round(1000/(frequency * len(ports))), lambda: Self("next"))404 #Timer(1/(frequency * len(ports)), Self, args=["next"]).start() #doesn't work because not thread safe405 elif msg == "kill":406 kill = True407 elif msg == "buffer":408 return ports409 else:410 return411 return Self412 painter(buffers, unit_frame)413 if(active_hollusion != None):414 active_hollusion("kill")415 active_hollusion = animation()416 active_hollusion("next")417 return active_hollusion418def anaglyph(painter):419 if graphics.PIL_available:420 MAX_X = round(4/3*viewport_size)421 MAX_Y = viewport_size422 stereo = vp423 depth = graphics.open_pixmap("Depthmap Viewport", viewport_size, viewport_size)424 def get_depth(x,y, pix):425 return pix[x,y][0]426 painter([lp, rp], unit_frame)427 #really! if you use getdata(), you need to calculate the offset in the array428 #load() returns a "2d pixel array" or rather, whatever it returns acts like one for all intents and purposes429 lp_pix = graphics.get_pixels(lp)430 rp_pix = graphics.get_pixels(rp)431 pixels = graphics.get_pixels(stereo)432 for y in range(MAX_Y):433 for x in range(MAX_X):434 l = get_depth(x,y,lp_pix)435 r = get_depth(x,y,rp_pix)436 pixels[x,y] = (r,l,l)437 graphics.pixels_to_canvas(stereo)438 else:439 print("PIL does not appear to be available")440def function_to_painter(depth_fun):441 tolerance = 1/spread442 def get_depth(x, y, dir, frame): # lp -> dir = -1, rp -> dir = 1443 result = 1444 for c in range(0, spread):445 ox = round(x + (dir * ((-0.3 * spread) + c)))446 if (ox >= 0 and ox < viewport_size):447 curr = depth_fun(round(ox), round(y))448 if (curr != 1):449 curr = frame.z1 + ((frame.z2 - frame.z1) * curr)450 d = abs(curr - c/spread)451 if(d < tolerance):452 result = curr453 return result454 def painter(vp, frame):455 def ana_out_loop(port, count):456 inverse_transform = inverse_transform_posn(frame)457 tgtpixels = graphics.get_pixels(port)458 size = graphics.get_image_size(port)459 MAX_X = size[0]460 MAX_Y = size[1]461 tgtpixels = graphics.get_pixels(port)462 for y in range(MAX_Y):463 for x in range(MAX_X):464 posn = inverse_transform(Posn(x,y))465 col = get_depth(posn.x, posn.y, count, frame)466 if (col>1):467 col = 1468 col = round(col*255)469 if(col<255):470 #tgtpixels[x,y] = (col, col, col)471 tgtpixels[x,y] = (min(col, tgtpixels[x,y][0]), min(col, tgtpixels[x,y][1]), min(col, tgtpixels[x,y][2]))472 graphics.pixels_to_canvas(port)473 if(is_list(vp[0])):474 for count, port in enumerate(vp):475 ana_out_loop(port, ((2*count)/(len(vp)-1) - 1))476 else:477 inverse_transform = inverse_transform_posn(frame)478 tgtpixels = graphics.get_pixels(vp)479 size = graphics.get_image_size(vp)480 MAX_X = size[0]481 MAX_Y = size[1]482 for y in range(MAX_Y):483 for x in range(MAX_X):484 posn = inverse_transform(Posn(x,y))485 color = depth_fun(posn.x, posn.y)486 if(color != 1):487 color = frame.z1 + ((frame.z2 - frame.z1) * color)488 if (color>1):489 color = 1490 color = round(color*255)491 if(color<255): #assuming that white is the transparency color492 #tgtpixels[x,y] = (color, color, color)493 tgtpixels[x,y] = (min(color, tgtpixels[x,y][0]), min(color, tgtpixels[x,y][1]), min(color, tgtpixels[x,y][2]))494 graphics.pixels_to_canvas(vp)495 return painter496def image_to_painter(filename):497 img = graphics.load_image(filename)498 tolerance = 1/spread499 limit = 0.86500 #process501 def painter(vp, frame):502 if(is_list(vp[0])):503 def get_depth(x,y,dir):504 global spread505 nonlocal pixels506 for c in range(spread):507 ox = round(x+dir*(-0.3*spread+c))508 if(ox>=0 and ox<viewport_size):509 if type(pixels[ox,y]) is int: #this is a workaround for black/white pictures.510 curr = pixels[ox,y]511 else:512 curr = pixels[ox, y][0]513 d = abs(curr - 255*c/spread)514 if(d<=tolerance*255):515 return curr516 return 255517 def ana_out_loop(port, count):518 nonlocal img519 size = graphics.get_image_size(img)520 MAX_X = size[0]521 MAX_Y = size[1]522 tsize = graphics.get_image_size(port)523 TMAX_X = tsize[0]524 TMAX_Y = tsize[1]525 tgtpixels = graphics.get_pixels(port)526 inv_transform = inverse_transform_posn(frame)527 # for y in range(MAX_Y):528 # for x in range(MAX_X):529 # col = get_depth(x,y,count)530 # if(col>255*limit):531 # col = 999532 # else:533 # col = frame.z1 + (frame.z2 - frame.z1) * col534 # if col<=255:535 # transposn = transform(Posn(x,y))536 # if(transposn.x>=0 and transposn.y>=0 and transposn.x<TMAX_X and transposn.y<TMAX_Y):537 # tgtpixels[transposn.x, transposn.y] = (col,col,col)538 #sorry, no supersampling. Takes long enough as it is.539 for y in range(TMAX_Y):540 for x in range(TMAX_X):541 orig = inv_transform(Posn(x,y))542 rx = round(orig.x)543 ry = round(orig.y)544 if (rx>=0 and ry>=0 and rx<MAX_X and ry<MAX_Y): #within bounds545 col = get_depth(rx, ry, count)546 if(col>255*limit):547 col = 999548 else:549 col = round(frame.z1*255 + (frame.z2 - frame.z1) * col)550 if(col<=255):551 #tgtpixels[x,y] = (col, col, col)552 tgtpixels[x,y] = (min(col, tgtpixels[x,y][0]),min(col, tgtpixels[x,y][1]),min(col, tgtpixels[x,y][2]))553 graphics.pixels_to_canvas(port)554 pixels = graphics.get_pixels(img)555 for count, port in enumerate(vp):556 ana_out_loop(port, ((2*count)/(len(vp)-1) - 1))557 else:558 transform = inverse_transform_posn(frame)559 graphics.blit_pixels(vp, transform, graphics.get_pixels(img), graphics.get_image_size(vp), graphics.get_image_size(img), True, frame.z1, frame.z2) #block level image transfer560 return painter561from random import random562def stereogram(painter):563 E = 300 #distance between eyes in pixels564 D = 600 #distance between eyes and image plane in pixels565 delta = 40 #stereo separation566 MAX_X = round(4/3*viewport_size)567 MAX_Y = viewport_size568 MAX_Z = 0569 CENTRE = round(MAX_X/2)570 stereo = vp571 pixels = graphics.get_pixels(stereo)572 depthmap = graphics.open_pixmap("temp", 4/3*viewport_size, viewport_size)573 depth_pix = graphics.get_pixels(depthmap)574 painter(depthmap, unit_frame)575 Infinity = float("inf")576 depth_pix = graphics.get_pixels(depthmap)577 def get_depth(x,y):578 if((x>=(1/6*viewport_size)) and (x<(MAX_X-(1/6*viewport_size)))):579 return -100*depth_pix[x,y][0]/255 - 400580 else:581 return -500582 for y in range(MAX_Y):583 link_left = {}584 link_right = {}585 colours = {}586 for x in range(MAX_X):587 z = get_depth(x,y)588 s = delta + z*(E/(z-D)) #Determine distance between intersection of lines of sight on image589 left = x - round(s/2) #x is integer, left is integer590 right = left + round(s) #right is integer591 if (left>0 and right<MAX_X):592 if(( not(left in link_right) or s<link_right[left]) and (not(right in link_left) or s<link_left[right])):593 link_right[left] = round(s)594 link_left[right] = round(s)595 #constraint resolution596 for x in range(MAX_X):597 try:598 s = link_left[x]599 except KeyError:600 s = Infinity601 if(s != Infinity):602 s = x603 d = None604 if(x-s>0):605 d = link_right[x-s]606 else:607 d = Infinity608 if(s == Infinity or (s>d)):609 link_left[x] = 0610 #drawing step611 for x in range(MAX_X):612 s = link_left[x] #should be valid for [0, MAX_X-1]613 try:614 colour = colours[x-s]615 except KeyError:616 colour = (round(random()*10/9*255),round(random()*10/9*255),round(random()*10/9*255))617 pixels[x,y] = colour618 colours[x] = colour619 graphics.pixels_to_canvas(stereo)620def save_image(filename):621 graphics.saveImage(vp, filename)622def save_hollusion(filename):623 if graphics.PIL_available:624 if active_hollusion == None:625 raise("No hollusion active")626 else:627 filename += ".gif"628 frames = list(map(lambda vp: graphics.get_image(vp), active_hollusion("buffer")))629 rev = frames[1:len(frames)-1]630 rev.reverse()631 frames.extend(rev)632 PyGif.saveAnimated(filename, frames, 1/len(frames))633 #images2gif.writeGif(filename, frames, duration=1/len(frames), dither=0, subRectangles = False)634 else:...
graphics.py
Source:graphics.py
1#general tools, to port out.2#http://stackoverflow.com/questions/3204245/how-do-i-convert-a-tuple-of-tuples-to-a-one-dimensional-list-using-list-comprehe3#better learn before i go teach students4def flatten_once(ls):5 return [element for tupl in ls for element in tupl]6from tkinter import * #python 3 uses lower case for tkinter7import math8#assumption: VIEWPORT IS UNIQUE9master = Tk()10master.resizable(width=FALSE, height=FALSE)11visible = None12viewport_size = None;13image_buffer = None14img_antialias = 1 #off15try:16 from PIL import Image, ImageDraw, ImageTk # Import DNSPython17 PIL_available = True18except ImportError:19 PIL_available = False20 print("Warning: PIL was not loaded correctly")21def init(vp_size):22 global viewport_size23 viewport_size = vp_size24 master.geometry(str(viewport_size)+"x"+str(viewport_size)) #fixed window size25 return26# Graphics Auxiliary27class Posn:28 def __init__(self, x = None, y = None):29 if x is None:30 raise TypeError("Posn(x,y) - x must be a number")31 if y is None:32 raise TypeError("Posn(x,y) - y must be a number")33 self.x = x34 self.y = y35 def __add__(self, other): #huehuehue, operator overloading!36 return Posn(self.x+other.x, self.y+other.y)37 def __mul__(self, factor):38 return Posn(self.x*factor, self.y*factor)39##viewport/canvas capabilities40#a viewport is rendered bitmap buffer41def open_viewport(name, horiz, vert):42 vp, image = open_pixmap(name, horiz, vert)43 #vp.pack()44 show_viewport((vp, image))45 #vp.create_rectangle(0, 0, 600, 600, fill="white")46 return [vp, image]47#a pixmap is an unrendered pixmap buffer48 #how to do this is simple - 49 #everything below a certain screening layer is unrendered.50 #everything above is. And make sure there's only 1 thing there.51def open_pixmap(name, horiz, vert):52 #Canvas(parent, [options...])53 global viewport_size, PIL_available54 vp = Canvas(master, width=horiz, height=vert)55 image = None56 if PIL_available:57 image = Image.new("RGB", (int(horiz), int(vert)), "white") 58 vp.create_rectangle(viewport_size/6, 0, viewport_size+viewport_size/6, viewport_size, fill="white")59 vp.place(x=-(viewport_size/6))60 hide_viewport((vp, image))61 return [vp, image]62 63def show_viewport(vp):64 global visible #apparently no automatic closures.65 if vp == None:66 raise TypeError("show_viewport - vp cannot be None")67 if visible != None:68 hide_viewport(visible)69 visible = vp70 Misc.lift(vp[0], aboveThis = None)71 72def hide_viewport(vp):73 global visible #apparently no automatic closures.74 Misc.lower(vp[0], belowThis=None)75 if visible == vp and visible != None:76 visible = None77 78def clear_viewport(viewport):79 viewport[0].delete(ALL) #not nearly sure how this works.80 viewport[0].create_rectangle(viewport_size/6, 0, viewport_size+viewport_size/6, viewport_size, fill="white")81 if PIL_available:82 size = viewport[1].size #(width, height)83 viewport[1].paste("white", (0,0,size[0], size[1]))84#def copy_viewport(src, dest):85 #removed, because i can't figure out how to implement it.86 #however. i have no need to.87##color handling capabilities88##drawing capabilities89def draw_line(viewport, p1, p2, color):90 viewport[0].create_line(p1.x, p1.y, p2.x, p2.y, fill=color.hexcode())91 if PIL_available:92 draw = ImageDraw.Draw(viewport[1])93 draw.line(p1.x, p1.y, p2.x, p2.y, fill=color.hexcode())94#poly = canvas.create_polygon(x0, y0, x1, y1, ..., option, ...)95#points is a list of point objects, need to map and unpack interior twice.96def draw_solid_polygon(viewport, points, offset, color):97 points = flatten_once(map(lambda q: (q.x+offset.x, q.y+offset.y), points))98 #print(*points)99 viewport[0].create_polygon(*points, fill=color.hexcode())100 if PIL_available:101 draw = ImageDraw.Draw(viewport[1])102 draw.polygon(points, fill=color.hexcode())103 104#draw_pixels is removed, wasn't used in the JS code.105 #probably because it was used only in the 3d rendering code, and that was rewritten.106class Rgb:107 def __init__(self, r,g,b):108 self.r = round(r*255)109 self.g = round(g*255)110 self.b = round(b*255)111 def hexcode(self):112 return '#%02x%02x%02x' % (self.r, self.g, self.b)113#Import/export capabilities114#TODO: make higher quality115#Basically draws whatever is drawn to screen in parallel.116 #However, not pixel perfect.117import datetime118def saveImage(vp, filename=None):119 if PIL_available:120 if(filename == None):121 filename = datetime.datetime.now().strftime("%y%m%d-%H%M%S")122 vp[1].save(filename+".png", "PNG")123 else:124 print("PIL does not appear to be available")125def get_pixels(vp):126 if PIL_available:127 return vp[1].load()128 else:129 raise("PIL does not appear to be available")130def pixels_to_canvas(vp): 131 if len(vp) == 2: #why? because PIL doesn't keep a copy of the image, so the moment the function goes out of scope, the image DISAPPEARS.132 vp.append(ImageTk.PhotoImage(vp[1]))133 else:134 vp[2] = ImageTk.PhotoImage(vp[1])135 vp[0].create_image(0,0,image = vp[2], anchor="nw") #else it forget, and diessss136 137def get_image(vp):138 return vp[1]139 140def square(x):141 return x*x142 143def distance(p1, p2):144 return math.sqrt(square(p1.x-p2.x)+square(p1.y-p2.y))145 146def blit_pixels(viewport, inv_transform, pixels, viewport_size, image_size, mono, zmin = 0, zmax = 1):147 MAX_X = viewport_size[0]148 MAX_Y = viewport_size[1]149 IMAX_X = image_size[0]150 IMAX_Y = image_size[1]151 viewport_pix = get_pixels(viewport)152 for y in range(MAX_Y):153 for x in range(MAX_X):154 src = inv_transform(Posn(x,y)) #this is the posn on the pixels155 srcx = src.x156 srcy = src.y157 #simple 2x2 weighted sampling.158 #weight is inversely proportional to distance.159 #don't try to use this code for your homework on other modules, 160 #i haven't taken graphics and i wrote this off the top off my head.161 rsrcx = round(srcx)162 rsrcy = round(srcy)163 if(rsrcx>=0 and rsrcx<IMAX_X and rsrcy>=0 and rsrcy<IMAX_Y): #if the closest pixel is to be rendered164 #used for weighing165 dsrcx = srcx - rsrcx #+ve => right166 dsrcy = srcy - rsrcy #+ve => up167 #used to figure out which pixel we are actually weighing against.168 if(dsrcx>=0):169 esrcx = 1170 else:171 esrcx = -1172 if(dsrcy>=0):173 esrcy = 1174 else:175 esrcy = -1176 original = Posn(srcx, srcy)177 dtgt = 1/(distance(Posn(rsrcx, rsrcy),original)+0.01)178 dtgtdx = 1/(distance(Posn(rsrcx+esrcx, rsrcy),original)+0.01)179 dtgtdy = 1/(distance(Posn(rsrcx, rsrcy+esrcy),original)+0.01)180 dtgtdxdy = 1/(distance(Posn(rsrcx+esrcx, rsrcy+esrcy),original)+0.01)181 tgt = pixels[rsrcx, rsrcy]182 #try to get pixel colour values if possible183 #if not possible, disable the weight184 if(rsrcx+esrcx>= 0 and rsrcx+esrcx<IMAX_X):185 tgtdx = pixels[rsrcx+esrcx, rsrcy]186 else:187 dtgtdx = 0188 dtgtdxdy = 0189 tgtdx = (0,0,0)190 if(rsrcy+esrcy>= 0 and rsrcy+esrcy<IMAX_Y):191 tgtdy = pixels[rsrcx, rsrcy+esrcy]192 else:193 dtgtdy = 0194 dtgtdxdy = 0195 tgtdy = (0,0,0)196 if(dtgtdxdy!=0):197 tgtdxdy = pixels[rsrcx+esrcx, rsrcy+esrcy]198 else:199 tgtdxdy = (0,0,0)200 divisor = (dtgt + dtgtdx + dtgtdy + dtgtdxdy)201 tcolor = (round((dtgt*tgt[0]+dtgtdx*tgtdx[0]+dtgtdy*tgtdy[0]+dtgtdxdy*tgtdxdy[0])/divisor),\202 round((dtgt*tgt[1]+dtgtdx*tgtdx[1]+dtgtdy*tgtdy[1]+dtgtdxdy*tgtdxdy[1])/divisor), \203 round((dtgt*tgt[2]+dtgtdx*tgtdx[2]+dtgtdy*tgtdy[2]+dtgtdxdy*tgtdxdy[2])/divisor))204 def rescale(color):205 if color>=254:206 return 255207 else:208 return round(zmin*255 + (zmax-zmin)*color)209 tcolor = (rescale(tcolor[0]), rescale(tcolor[1]), rescale(tcolor[2]))210 viewport_pix[x,y] = (min(tcolor[0], viewport_pix[x,y][0]), min(tcolor[1], viewport_pix[x,y][1]), min(tcolor[2], viewport_pix[x,y][2]))211 pixels_to_canvas(viewport)212 213#TODO: test how it renders out of range pixels 214 #no one should up-sample with this algorithm -.-215# def blit_pixels(viewport, transform, pixels, viewport_size, image_size, mono):216 # global img_antialias217 # MAX_X = image_size[0]218 # MAX_Y = image_size[1]219 # tviewport = open_pixmap("temp", viewport_size[0]*img_antialias, viewport_size[1]*img_antialias)220 # bound_x = img_antialias*viewport_size[0]221 # bound_y = img_antialias*viewport_size[1]222 # target_pix = get_pixels(tviewport)223 # for y in range(MAX_Y):224 # for x in range(MAX_X):225 # p = Posn(x,y)226 # transposn = transform(p)227 # t_x = transposn.x228 # t_y = transposn.y229 # if(t_x>=0 and t_x<=bound_x and t_y>=0 and t_y<=bound_y):230 # if mono:231 # colour = pixels[x,y]232 # avg = round(colour[0]+colour[1]+colour[2]/3)233 # target_pix[t_x, t_y] = (avg, avg, avg)234 # else:235 # target_pix[t_x, t_y] = pixels[x,y]236 # vp_size = get_image_size(viewport)237 # MAX_X = vp_size[0]238 # MAX_Y = vp_size[1]239 ##will leave some dots at the edge.240 ##but MUAHAHAHAHAHHAHAHAHAHAHAHAHAHAHAHAH241 ##DOES NOT CARE242 # white = (255,255,255)243 # for y in range(1,MAX_Y-1):244 # for x in range(1,MAX_X-1):245 # if(target_pix[x,y]== white):246 # up = target_pix[x,y-1]247 # down = target_pix[x,y+1]248 # left = target_pix[x-1, y]249 # right = target_pix[x+1, y]250 # ul = target_pix[x-1, y+1]251 # ur = target_pix[x+1, y+1]252 # dl = target_pix[x-1, y-1]253 # dr = target_pix[x-1, y-1]254 # if(up == white and down == white and left == white and right == white):255 # colour_r = (ul[0]+ur[0]+dl[0]+dr[0])/4256 # colour_g = (ul[1]+ur[1]+dl[1]+dr[1])/4257 # colour_b = (ul[2]+ur[2]+dl[2]+dr[2])/4258 # target_pix[x,y] = (round(colour_r), round(colour_g), round(colour_b))259 # else:260 # colour_r = (ul[0]+ur[0]+dl[0]+dr[0]+up[0]+down[0]+left[0]+right[0])/8261 # colour_g = (ul[1]+ur[1]+dl[1]+dr[1]+up[1]+down[1]+left[1]+right[1])/8262 # colour_b = (ul[2]+ur[2]+dl[2]+dr[2]+up[2]+down[2]+left[2]+right[2])/8263 # target_pix[x,y] = (round(colour_r), round(colour_g), round(colour_b))264 ##TODO: enhancement, averaging for points which have been missed out265 # viewport[1] = tviewport[1].resize((viewport_size[0], viewport_size[1]), Image.ANTIALIAS)266 # pixels_to_canvas(viewport)267 268def get_image_size(img):269 return img[1].size270def load_image(filename): #returns a vp271 global img_antialias272 if PIL_available:273 img = Image.open(filename)274 img = img.convert('RGB')275 width, height = img.size276 img = img.resize((img_antialias*width, img_antialias*height), Image.BICUBIC)277 tkcanvas, pilcanvas = open_pixmap(filename, img_antialias*width, img_antialias*height)278 return (tkcanvas, img)279 else:...
screenshot.py
Source:screenshot.py
1from cefpython3 import cefpython as cef2import os3import platform4import subprocess5import sys6try:7 from PIL import Image8except ImportError:9 print("PIL is not installed,")10 "Install using: pip install PIL"11 sys.exit(1)12import tkinter as tk13VIEWPORT_SIZE = None14URL = None15SCREENSHOT_PATH = None16def main(url, w, h):17 global VIEWPORT_SIZE, URL, SCREENSHOT_PATH18 URL = url19 VIEWPORT_SIZE = (w, h)20 SCREENSHOT_PATH = os.path.join(os.path.abspath(os.path.dirname(__file__)),21 "SCREENSHOT.png") # current working dir22 check_versions()23 sys.excepthook = cef.ExceptHook # to shutdown all the processes while errors24 if os.path.exists(SCREENSHOT_PATH):25 print("Remove old screenshot")26 os.remove(SCREENSHOT_PATH)27 command_line_arguments()28 settings = {29 "windowless_rendering_enabled": True,30 }31 switches = {32 "disabled-gpu": "",33 "disabled-gpu-compositing": "",34 "enable-begin-frame-scheduling": "",35 "disable-surfaces": ""36 }37 browser_settings = {38 "windowless_frame_rate": 30,39 }40 cef.Initialize(settings=settings, switches=switches)41 create_browser(browser_settings)42 cef.MessageLoop()43 cef.Shutdown()44 print("Opening your screenshot with the default application")45 open_with_default_application(SCREENSHOT_PATH)46def check_versions():47 ver = cef.GetVersion()48 print("CEF Python {ver}".format(ver=ver['version']))49 print("Chromium {ver}".format(ver=ver['chrome_version']))50 print("CEF {ver}".format(ver=ver['cef_version']))51 print("Python {ver} {arch}".format(ver=platform.python_version(),52 arch=platform.architecture()[0]))53 assert cef.__version__ >= '57.0', "CEF Python v57.0+ required to run this"54def command_line_arguments():55 if len(sys.argv) == 4:56 url = sys.argv[1]57 width = int(sys.argv[2])58 height = int(sys.argv[3])59 if url.startswith("http://") or url.startswith("https://"):60 global URL61 URL = url62 else:63 print("Error: Invalid URL entered")64 sys.exit(1)65 if width > 0 and height > 0:66 global VIEWPORT_SIZE67 VIEWPORT_SIZE = (width, height)68 else:69 print("Error: Invalid Width and/or Height")70 sys.exit(1)71 elif len(sys.argv) > 1:72 print("Error: Expected arguments not received")73 sys.exit(1)74def create_browser(settings):75 global VIEWPORT_SIZE, URL76 parent_window_handle = 077 window_info = cef.WindowInfo()78 window_info.SetAsOffscreen(parent_window_handle)79 print("Viewport size: {size}".format(size=str(VIEWPORT_SIZE)))80 print("Loading URL: {url}".format(url=URL))81 browser = cef.CreateBrowserSync(window_info=window_info, settings=settings, url=URL)82 browser.SetClientHandler(LoadHandler())83 browser.SetClientHandler(RenderHandler())84 browser.SendFocusEvent(True)85 browser.WasResized()86def save_screenshot(browser):87 global SCREENSHOT_PATH88 buffer_string = browser.GetUserData("OnPaint.buffer string")89 if not buffer_string:90 raise Exception("buffer_string is empty because"91 " OnPaint never called?")92 image = Image.frombytes("RGBA", VIEWPORT_SIZE, buffer_string, "raw", "RGBA", 0, 1)93 image.save(SCREENSHOT_PATH, "PNG")94 print("Saved screenshot to: {path}".format(path=SCREENSHOT_PATH))95def open_with_default_application(path):96 if sys.platform.startswith("darwin"): # Mac operating system97 subprocess.call(("open", path))98 elif os.name == "nt":99 os.startfile(path)100 elif os.name == '"posix':101 subprocess.call(("xdg-open", path))102def exit_app(browser):103 print("Closing Browser and Exiting Application")104 browser.CloseBrowser()105 cef.QuitMessageLoop()106class LoadHandler(object):107 def OnLoadingStateChange(self, browser, is_loading, **_):108 if not is_loading:109 sys.stdout.write(os.linesep)110 print("Website has been loaded")111 save_screenshot(browser)112 cef.PostTask(cef.TID_UI, exit_app, browser)113 def OnLoadError(self, browser, frame, error_code, failed_url, **_):114 if not frame.IsMain():115 return116 print("Failed to load URL: {url}".format(url=failed_url))117 print("Error code: {code}".format(code=error_code))118 cef.PostTask(cef.TID_UI, exit_app, browser)119class RenderHandler(object):120 def __init__(self):121 self.OnPaint_called = False122 def GetViewRect(self, rect_out, **_):123 rect_out.extend([0, 0, VIEWPORT_SIZE[0], VIEWPORT_SIZE[1]])124 return True125 def OnPaint(self, browser, element_type, paint_buffer, **_):126 if self.OnPaint_called:127 sys.stdout.write(".")128 sys.stdout.flush()129 else:130 sys.stdout.write("OnPaint")131 self.OnPaint_called = True132 if element_type == cef.PET_VIEW:133 buffer_string = paint_buffer.GetBytes(mode='rgba', origin='top-left')134 browser.SetUserData("OnPaint.buffer string", buffer_string)135 else:136 raise Exception("Unsupported element type in OnPaint")137root = tk.Tk()138root.geometry("400x200")139class Widgets:140 def __init__(self, label_text, default_value):141 self.lab = tk.Label(root, text=label_text)142 self.lab.pack()143 self.v = tk.StringVar()144 self.entry = tk.Entry(root, textvariable=self.v)145 self.entry.pack()146 self.v.set(default_value)147obj1 = Widgets("Enter Website Name: ", "https://www.google.com")148obj2 = Widgets("Enter Width: ", "1024")149obj3 = Widgets("Enter Height: ", "2048")150root.bind("<Return>", lambda x: main(obj1.v.get(), int(obj2.v.get()), int(obj3.v.get())))151label4 = tk.Label(root, text=" ")152label4.pack()153label5 = tk.Label(root, text="Press the Enter key to create screenshot")154label5.pack()...
render.py
Source:render.py
1from glumpy import app, gloo, gl2from contextlib import contextmanager3import numpy as np4try:5 import pycuda.driver6 from pycuda.gl import graphics_map_flags, BufferObject7 _PYCUDA = True8except ImportError as err:9 print('pycuda import error:', err)10 _PYCUDA = False11import torch12class OffscreenRender:13 def __init__(self, viewport_size, out_buffer_location='opengl', clear_color=None):14 self._init_buffers(viewport_size, out_buffer_location)15 self.clear_color = clear_color if clear_color is not None else (0., 0., 0., 1.)16 def _init_buffers(self, viewport_size, out_buffer_location):17 assert out_buffer_location in ['torch', 'opengl', 'numpy']18 if out_buffer_location == 'torch':19 assert _PYCUDA, 'pycuda is not available'20 try:21 import pycuda.gl.autoinit # this may fails in headless mode22 except:23 raise RuntimeError('PyCUDA init failed, cannot use torch buffer')24 _ = torch.cuda.FloatTensor(1, 3, 512,512) # needs init here, otherwise does not work25 color_np = np.zeros((viewport_size[1], viewport_size[0], 4), np.float32)26 self.color_buf, self.color_buf_cuda = create_shared_texture(color_np)27 self.out_buf = torch.zeros((viewport_size[1], viewport_size[0], 4), dtype=torch.float32).cuda()28 elif out_buffer_location == 'opengl':29 self.color_buf = np.zeros((viewport_size[1], viewport_size[0], 4), dtype=np.float32).view(gloo.TextureFloat2D)30 self.out_buf = self.color_buf31 elif out_buffer_location == 'numpy':32 self.color_buf = np.zeros((viewport_size[1], viewport_size[0], 4), dtype=np.float32).view(gloo.TextureFloat2D)33 self.out_buf = np.zeros((viewport_size[1], viewport_size[0], 3), dtype=np.float32)34 self.viewport_size = viewport_size35 self.out_buffer_location = out_buffer_location36 self.depth_buf = gloo.DepthBuffer(viewport_size[0], viewport_size[1], gl.GL_DEPTH_COMPONENT32)37 self.fbo = gloo.FrameBuffer(color=self.color_buf, depth=self.depth_buf)38 def render(self, scene, cull_face=True):39 self.fbo.activate()40 gl.glEnable(gl.GL_PROGRAM_POINT_SIZE)41 gl.glEnable(gl.GL_DEPTH_TEST)42 gl.glShadeModel(gl.GL_FLAT)43 if cull_face:44 gl.glEnable(gl.GL_CULL_FACE)45 gl.glCullFace(gl.GL_BACK)46 else:47 gl.glDisable(gl.GL_CULL_FACE)48 49 gl.glClearColor(*self.clear_color)50 gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)51 gl.glViewport(0, 0, self.viewport_size[0], self.viewport_size[1])52 if scene.draw_points:53 scene.program.draw(gl.GL_POINTS)54 else:55 assert scene.index_buffer is not None56 scene.program.draw(gl.GL_TRIANGLES, scene.index_buffer)57 if self.out_buffer_location == 'torch':58 frame = cpy_texture_to_tensor(self.color_buf_cuda, self.out_buf).clone()59 elif self.out_buffer_location == 'opengl':60 frame = self.out_buf61 else:62 gl.glReadPixels(0, 0, self.viewport_size[0], self.viewport_size[1], gl.GL_RGB, gl.GL_FLOAT, self.out_buf)63 frame = self.out_buf.copy()64 self.fbo.deactivate()65 return frame66@contextmanager67def cuda_activate_array(img):68 """Context manager simplifying use of pycuda.gl.RegisteredImage"""69 mapping = img.map()70 yield mapping.array(0,0)71 mapping.unmap()72@contextmanager73def cuda_activate_buffer(buf):74 mapping = buf.map()75 yield mapping.device_ptr()76 mapping.unmap()77def create_shared_texture(arr, map_flags=None):78 """Create and return a Texture2D with gloo and pycuda views."""79 if map_flags is None:80 map_flags = graphics_map_flags.WRITE_DISCARD81 82 gl_view = arr.view(gloo.TextureFloat2D)83 gl_view.activate() # force gloo to create on GPU84 gl_view.deactivate()85 cuda_view = pycuda.gl.RegisteredImage(86 int(gl_view.handle), gl_view.target, map_flags)87 return gl_view, cuda_view88def create_shared_buffer(arr):89 """Create and return a BufferObject with gloo and pycuda views."""90 gl_view = arr.view(gloo.VertexBuffer)91 gl_view.activate() # force gloo to create on GPU92 gl_view.deactivate()93 cuda_view = BufferObject(np.long(gl_view.handle))94 return gl_view, cuda_view95def cpy_texture_to_tensor(texture, tensor):96 """Copy GL texture (cuda view) to pytorch tensor"""97 with cuda_activate_array(texture) as src:98 cpy = pycuda.driver.Memcpy2D()99 cpy.set_src_array(src)100 cpy.set_dst_device(tensor.data_ptr())101 cpy.width_in_bytes = cpy.src_pitch = cpy.dst_pitch = tensor.shape[1] * 4 * 4 102 cpy.height = tensor.shape[0] 103 cpy(aligned=False)104 torch.cuda.synchronize()105 return tensor106def cpy_tensor_to_texture(tensor, texture):107 """Copy pytorch tensor to GL texture (cuda view)"""108 with cuda_activate_array(texture) as ary:109 cpy = pycuda.driver.Memcpy2D()110 cpy.set_src_device(tensor.data_ptr())111 cpy.set_dst_array(ary)112 cpy.width_in_bytes = cpy.src_pitch = cpy.dst_pitch = tensor.shape[1] * 4 * 4 113 cpy.height = tensor.shape[0] 114 cpy(aligned=False)115 torch.cuda.synchronize()116 return tensor117def cpy_buffer_to_tensor(buffer, tensor):118 """Copy GL buffer (cuda view) to pytorch tensor"""119 n = tensor.numel()*tensor.element_size() 120 with cuda_activate_buffer(buffer) as buf_ptr:121 pycuda.driver.memcpy_dtod(tensor.data_ptr(), buf_ptr, n)122def cpy_tensor_to_buffer(tensor, buffer):123 """Copy pytorch tensor to GL buffer (cuda view)"""124 n = tensor.numel()*tensor.element_size() 125 with cuda_activate_buffer(buffer) as buf_ptr:...
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!