def draw(self, **params): ret = [] k = self.k L = self.text.w W, H = self.font.size.w + 1, self.font.size.h + 1 next = Mask() pos0 = Position(-W, 0) pos1 = Position(k * W, 0) if k != 0: txt0 = self.text.subMask(size=Size(k * W, H)) next.addMask(txt0, pos=self.pos0 + pos0, wrap=True) if self.l - k != 0: txt1 = self.text.subMask(pos=Position((k) * W, 0), size=Size((self.l - k) * W, H)) next.addMask(txt1, pos=self.pos0 + pos1, wrap=True) # log("from\n"+str(self.mask)) # log("to\n"+str(next)) steps = Morph2(self.mask, next) if len(steps) >= 2: return steps[1] return steps[0] steps = [self.mask, next] for i in range(len(steps)): step = steps[i] ret += [step] self.mask = step self.k += 1 if self.k > self.l: log("step") self.k = 0 self.pos0.x -= W if self.pos0.x <= -L: self.pos0.x += FRAMESIZE.w return ret
def draw(self, **params): ret = [] k = self.k L = self.l W, H = self.font.size.w + 1, self.font.size.h + 1 next = Mask() pos0 = Position(k, 0) next = Mask() next.addMask(self.text, pos=self.pos0 + pos0, wrap=True) log("from\n" + str(self.mask)) log("to\n" + str(next)) # steps = Morph2(self.mask,next) # steps = Scan(self.mask,next) # steps = [self.mask,next] steps = [self.mask, next] return next for i in range(len(steps)): step = steps[i] ret += [step] self.mask = step self.k += 1 if self.k >= self.l: log("step") self.k = 0 self.pos0.x += self.l if self.pos0.x + self.l >= FRAMESIZE.w: self.pos0.x -= FRAMESIZE.w return ret
def render(self, style, invert, cutoff, **params): ret = Mask() if style == Style.check: for y in range(FRAMESIZE.h): for x in range(FRAMESIZE.w): if x % 2 != y % 2: ret[x, y] = True elif style == Style.gauss: for y in range(FRAMESIZE.h): for x in range(FRAMESIZE.w): if random.gauss(0., 1.) > cutoff: ret[x, y] = True elif style == Style.font: fill = self.font.render_repertoire(offset=self.offset, size=self.mask.size()) self.offset += 1 ret.addMask(fill) elif style == Style.axis: fill = Axis(self.mask.size()) ret.addMask(fill) elif style == Style.border: fill = Border(self.mask.size()) ret.addMask(fill) if invert: ret = ret.inverse() return ret
class Smooth(Mode): DefaultFont = FONT.font3x5 def start(self, font, msg=None, **params): # self.fluepdot.rendering.setMode(Fluepdot.Mode.full) self.fluepdot.rendering.setMode(Fluepdot.Mode.diff) self.font = Font(font) debug(str(self.font)) self.msg = "hello, world." if msg: self.msg = msg info("start scroll: {:s}".format(self.msg)) self.mask = Mask() self.text = self.font.render(self.msg, fixed=True) p0 = int(math.floor(FRAMESIZE.w / (self.font.size.w + 1))) p1 = p0 - len(self.msg) self.pos0 = Position((self.font.size.w + 1) * int(p1 / 2), 0) # self.pos0 = Position(int(FRAMESIZE.w/2)-int(self.text.w/2), 0 ) self.mask.addMask(self.text, pos=self.pos0, wrap=True) self.fluepdot.buffer.write(self.mask) self.l = self.text.w self.k = 0 return True def draw(self, **params): ret = [] k = self.k L = self.l W, H = self.font.size.w + 1, self.font.size.h + 1 next = Mask() pos0 = Position(k, 0) next = Mask() next.addMask(self.text, pos=self.pos0 + pos0, wrap=True) log("from\n" + str(self.mask)) log("to\n" + str(next)) # steps = Morph2(self.mask,next) # steps = Scan(self.mask,next) # steps = [self.mask,next] steps = [self.mask, next] return next for i in range(len(steps)): step = steps[i] ret += [step] self.mask = step self.k += 1 if self.k >= self.l: log("step") self.k = 0 self.pos0.x += self.l if self.pos0.x + self.l >= FRAMESIZE.w: self.pos0.x -= FRAMESIZE.w return ret flags = [ Mode.FLAG("font", DefaultFont), ("P:", "pause=", "pause", 1.0, "pause", lambda x: int(x)), (None, None, "msg", "hello, world.", "message", None), ]
def draw(self, style, stamp, cuckoo, **params): if self.kuckuck and self.kuckuck.active(): hour = int(self.kuckuck.repeat / 1) count = int(self.kuckuck.count / 1) + 1 ret = Mask() idx = self.kuckuck.count % 2 if 1 <= hour <= 4: vader = invader.INVADER.one.Mask(idx).double() msk = Mask(size=Size((4 + vader.w) * hour, vader.h)) for c in range(hour): pos = Position(c * (4 + vader.w), 0) msk.addMask(vader, pos=pos) ret.addMask(msk) elif 5 <= hour <= 8: vader = invader.INVADER.one.Mask(idx) msk = Mask(size=Size((2 + vader.w) * hour, vader.h)) for c in range(hour): pos = Position(c * (2 + vader.w), 0) msk.addMask(vader, pos=pos) ret.addMask(msk) elif 9 <= hour <= 12: vader = invader.INVADER.one.Mask(idx) msk = Mask(size=Size((2 + vader.w) * ceil(hour / 2), 2 * (vader.h))) for c in range(hour): pos = Position(int(c / 2) * (2 + vader.w), 0) if c % 2 == 1: pos.y += vader.h msk.addMask(vader, pos=pos) ret.addMask(msk) return ret hour = datetime.datetime.now(self.timezone).hour if stamp != "": hour = (datetime.datetime.fromisoformat(stamp) + (datetime.datetime.now(self.timezone) - self.start)).hour if cuckoo == True and hour != self.hour: self.step(style, stamp, **params) times = hour % 12 if times == 0: times = 12 self.kuckuck = dotlife.time.Clock.Timer(1500., times) debug("KUCKUCK {:}".format(self.kuckuck)) self.hour = hour self.step(style, stamp, **params) prev = self.mask self.mask = self.next return self.draw(style, stamp, cuckoo, **params) # recurse once! if self.next != self.mask: if style in [Clock.Style.small, Clock.Style.large]: m = Morph2(self.mask, self.next, steps=1, flipcount=1) debug("to\n" + str(self.next)) self.mask = m[1] elif style in [Clock.Style.split]: m = Morph2(self.mask, self.next, steps=1, flipcount=2) debug("to\n" + str(self.next)) self.mask = m[1] else: # debug("to\n"+str(self.next)) self.mask = self.next self.hour = hour return self.mask
class Pipe(Mode): DefaultFont = FONT.font3x5 def start(self, font, **params): # self.fluepdot.rendering.setMode(Fluepdot.Mode.full) self.fluepdot.rendering.setMode(Fluepdot.Mode.diff) self.font = Font(font) log(str(self.font)) info("start pipe".format()) if font == FONT.font3x5: self.pos = [Position(0, 2), Position(0, 9)] self.buffer = [" ", " "] elif font == FONT.font5x5: self.pos = [Position(0, 2), Position(0, 9)] self.buffer = [" ", " "] elif font == FONT.font5x7: self.pos = [Position(0, 0), Position(0, 9)] self.buffer = [" ", " "] else: self.pos = [Position(0, 0)] self.buffer = [" "] self.rows = len(self.buffer) # self.buf = self.font.render(self.msg) # log(str(self.buf)) self.mask = self.draw(**params) while True: line = sys.stdin.readline() if not line: log("end of file.") break debug("read " + line) if len(self.buffer) > 1: self.buffer[1] = self.buffer[0] self.buffer[0] = line.rstrip()[:30] self.draw(**params) return False def draw(self, **params): pos = Position(0, 0) self.mask = Mask() #self.fluepdot.buffer.read() for i in range(self.rows): try: self.mask.addMask(self.font.render(self.buffer[i]), pos=self.pos[i]) except Error as x: pass # self.mask.mask(self.buf,pos=pos) ret = self.fluepdot.buffer.write(self.mask) info(str(self.mask)) return ret flags = [ Mode.FLAG("font", DefaultFont), ]
class Echo(Mode): DefaultFont = FONT.font5x5 def start(self, font, alignv, scroll, msg="hello, world", **params): dump(params) self.fluepdot.rendering.setMode(Fluepdot.Mode.full) self.font = Font(font) self.msg = msg info("start echo: {:s}".format(self.msg)) if scroll and alignv == AlignVertical.center: log("cannot scroll with center vertical alignment") scroll = False self.text = self.font.render(self.msg) log("text is {:}".format(self.text.size())) log(str(self.text)) self.mask = self.draw(scroll, alignv, **params) return False def draw(self, scroll, alignv, alignh, **params): self.mask = Mask() if scroll and alignv in [AlignVertical.top, AlignVertical.bottom]: rest = Size(FRAMESIZE.w, FRAMESIZE.h - (self.font.size.h + 1)) top = Position(0, 0) bot = Position(0, self.font.size.h + 1) prev = self.fluepdot.buffer.read() if alignv == AlignVertical.top: tmp = prev.subMask(pos=top, size=rest) self.mask.addMask(tmp, pos=bot) elif alignv == AlignVertical.bottom: tmp = prev.subMask(pos=bot, size=rest) self.mask.addMask(tmp, pos=top) pos = Position(0, 0) if alignv == AlignVertical.top: pos.y = 0 elif alignv == AlignVertical.center: pos.y = math.floor(abs(FRAMESIZE.h - self.text.h) / 2) elif alignv == AlignVertical.bottom: pos.y = FRAMESIZE.h - self.text.h if alignh == AlignHorizontal.left: pos.x = 0 elif alignh == AlignHorizontal.center: pos.x = math.floor(abs(FRAMESIZE.w - self.text.w) / 2) elif alignh == AlignHorizontal.right: pos.x = FRAMESIZE.w - self.text.w self.mask.addMask(self.text, pos=pos) return self.mask flags = [ ("S", "scroll", "scroll", False, "scroll line?", None), Mode.FLAG("font", DefaultFont), Mode.FLAG("msg"), Mode.FLAG("alignv", AlignVertical.center), Mode.FLAG("alignh", AlignHorizontal.center), ]
class Scroll(Mode): DefaultFont = FONT.font3x5 def start(self, font, msg=None, **params): # self.fluepdot.rendering.setMode(Fluepdot.Mode.full) self.fluepdot.rendering.setMode(Fluepdot.Mode.diff) self.font = Font(font) debug(str(self.font)) self.msg = "hello, world." if msg: self.msg = msg info("start scroll: {:s}".format(self.msg)) self.mask = Mask() self.text = self.font.render(self.msg, fixed=True) p0 = int(math.floor(FRAMESIZE.w / (self.font.size.w + 1))) p1 = p0 - len(self.msg) self.pos0 = Position((self.font.size.w + 1) * int(p1 / 2), 0) # self.pos0 = Position(int(FRAMESIZE.w/2)-int(self.text.w/2), 0 ) self.mask.addMask(self.text, pos=self.pos0, wrap=True) self.fluepdot.buffer.write(self.mask) self.l = int(self.text.w / (self.font.size.w + 1)) self.k = 0 return True def draw(self, **params): ret = [] k = self.k L = self.text.w W, H = self.font.size.w + 1, self.font.size.h + 1 next = Mask() pos0 = Position(-W, 0) pos1 = Position(k * W, 0) if k != 0: txt0 = self.text.subMask(size=Size(k * W, H)) next.addMask(txt0, pos=self.pos0 + pos0, wrap=True) if self.l - k != 0: txt1 = self.text.subMask(pos=Position((k) * W, 0), size=Size((self.l - k) * W, H)) next.addMask(txt1, pos=self.pos0 + pos1, wrap=True) # log("from\n"+str(self.mask)) # log("to\n"+str(next)) steps = Morph2(self.mask, next) if len(steps) >= 2: return steps[1] return steps[0] steps = [self.mask, next] for i in range(len(steps)): step = steps[i] ret += [step] self.mask = step self.k += 1 if self.k > self.l: log("step") self.k = 0 self.pos0.x -= W if self.pos0.x <= -L: self.pos0.x += FRAMESIZE.w return ret flags = [ Mode.FLAG("font", DefaultFont), ("P:", "pause=", "pause", 1.0, "pause", lambda x: int(x)), (None, None, "msg", "hello, world.", "message", None), ]