def draw(dest, clip, what, xo, yo, screen): """ This is the simple draw routine, which only works when alpha is 1.0 and the matrices are None. If those aren't the case, draw_complex is used instead. `dest` - Either a destination surface, or a clipper. `clip` - If None, we should draw. Otherwise we should clip, and this is the rectangle to clip to. `what` - The Render or Surface we're drawing to. `xo` - The X offset. `yo` - The Y offset. `screen` - True if this is a blit to the screen, False otherwise. """ if not isinstance(what, renpy.display.render.Render): # Pixel-Aligned blit. if isinstance(xo, int) and isinstance(yo, int): if screen: what = rle_cache.get(what, what) if clip: w, h = what.get_size() dest.blits.append((xo, yo, xo + w, yo + h, clip, what, None)) else: try: blit_lock.acquire() dest.blit(what, (xo, yo)) finally: blit_lock.release() # Subpixel blit. else: if clip: w, h = what.get_size() dest.blits.append((xo, yo, xo + w, yo + h, clip, what, None)) else: renpy.display.module.subpixel(what, dest, xo, yo) return # Deal with draw functions. if what.operation != BLIT: xo = int(xo) yo = int(yo) if clip: dx0, dy0, dx1, dy1 = clip dw = dx1 - dx0 dh = dy1 - dy0 else: dw, dh = dest.get_size() if xo >= 0: newx = 0 subx = xo else: newx = xo subx = 0 if yo >= 0: newy = 0 suby = yo else: newy = yo suby = 0 if subx >= dw or suby >= dh: return # newx and newy are the offset of this render relative to the # subsurface. They can only be negative or 0, as otherwise we # would make a smaller subsurface. subw = min(dw - subx, what.width + newx) subh = min(dh - suby, what.height + newy) if subw <= 0 or subh <= 0: return if clip: dest.forced.add((subx, suby, subx + subw, suby + subh, clip)) else: newdest = dest.subsurface((subx, suby, subw, subh)) # what.draw_func(newdest, newx, newy) draw_special(what, newdest, newx, newy) return # Deal with clipping, if necessary. if what.clipping: if clip: cx0, cy0, cx1, cy1 = clip cx0 = max(cx0, xo) cy0 = max(cy0, yo) cx1 = min(cx1, xo + what.width) cy1 = min(cy1, yo + what.height) if cx0 > cx1 or cy0 > cy1: return clip = (cx0, cy0, cx1, cy1) dest.forced.add(clip + (clip, )) return else: # After this code, x and y are the coordinates of the subsurface # relative to the destination. xo and yo are the offset of the # upper-left corner relative to the subsurface. if xo >= 0: x = xo xo = 0 else: x = 0 # xo = xo if yo >= 0: y = yo yo = 0 else: y = 0 # yo = yo dw, dh = dest.get_size() width = min(dw - x, what.width + xo) height = min(dh - y, what.height + yo) if width < 0 or height < 0: return dest = dest.subsurface((x, y, width, height)) # Deal with alpha and transforms by passing them off to draw_transformed. if what.alpha != 1 or (what.forward is not None and what.forward is not IDENTITY): for child, cxo, cyo, _focus, _main in what.visible_children: draw_transformed(dest, clip, child, xo + cxo, yo + cyo, what.alpha, what.forward, what.reverse) return for child, cxo, cyo, _focus, _main in what.visible_children: draw(dest, clip, child, xo + cxo, yo + cyo, screen)
def draw(dest, clip, what, xo, yo, screen): """ This is the simple draw routine, which only works when alpha is 1.0 and the matrices are None. If those aren't the case, draw_complex is used instead. `dest` - Either a destination surface, or a clipper. `clip` - If None, we should draw. Otherwise we should clip, and this is the rectangle to clip to. `what` - The Render or Surface we're drawing to. `xo` - The X offset. `yo` - The Y offset. `screen` - True if this is a blit to the screen, False otherwise. """ if not isinstance(what, renpy.display.render.Render): # Pixel-Aligned blit. if isinstance(xo, int) and isinstance(yo, int): if screen: what = rle_cache.get(what, what) if clip: w, h = what.get_size() dest.blits.append((xo, yo, xo + w, yo + h, clip, what, None)) else: try: blit_lock.acquire() dest.blit(what, (xo, yo)) finally: blit_lock.release() # Subpixel blit. else: if clip: w, h = what.get_size() dest.blits.append((xo, yo, xo + w, yo + h, clip, what, None)) else: renpy.display.module.subpixel(what, dest, xo, yo) return if what.text_input: renpy.display.interface.text_rect = what.screen_rect(xo, yo, None) # Deal with draw functions. if what.operation != BLIT: xo = int(xo) yo = int(yo) if clip: dx0, dy0, dx1, dy1 = clip dw = dx1 - dx0 dh = dy1 - dy0 else: dw, dh = dest.get_size() if xo >= 0: newx = 0 subx = xo else: newx = xo subx = 0 if yo >= 0: newy = 0 suby = yo else: newy = yo suby = 0 if subx >= dw or suby >= dh: return # newx and newy are the offset of this render relative to the # subsurface. They can only be negative or 0, as otherwise we # would make a smaller subsurface. subw = min(dw - subx, what.width + newx) subh = min(dh - suby, what.height + newy) if subw <= 0 or subh <= 0: return if clip: dest.forced.add((subx, suby, subx + subw, suby + subh, clip)) else: newdest = dest.subsurface((subx, suby, subw, subh)) # what.draw_func(newdest, newx, newy) draw_special(what, newdest, newx, newy) return # Deal with clipping, if necessary. if what.clipping: if clip: cx0, cy0, cx1, cy1 = clip cx0 = max(cx0, xo) cy0 = max(cy0, yo) cx1 = min(cx1, xo + what.width) cy1 = min(cy1, yo + what.height) if cx0 > cx1 or cy0 > cy1: return clip = (cx0, cy0, cx1, cy1) dest.forced.add(clip + (clip,)) return else: # After this code, x and y are the coordinates of the subsurface # relative to the destination. xo and yo are the offset of the # upper-left corner relative to the subsurface. if xo >= 0: x = xo xo = 0 else: x = 0 # xo = xo if yo >= 0: y = yo yo = 0 else: y = 0 # yo = yo dw, dh = dest.get_size() width = min(dw - x, what.width + xo) height = min(dh - y, what.height + yo) if width < 0 or height < 0: return dest = dest.subsurface((x, y, width, height)) # Deal with alpha and transforms by passing them off to draw_transformed. if what.alpha != 1 or what.over != 1.0 or (what.forward is not None and what.forward is not IDENTITY): for child, cxo, cyo, _focus, _main in what.visible_children: draw_transformed(dest, clip, child, xo + cxo, yo + cyo, what.alpha * what.over, what.forward, what.reverse) return for child, cxo, cyo, _focus, _main in what.visible_children: draw(dest, clip, child, xo + cxo, yo + cyo, screen)