def createCharBitmaps(self): dc = MemoryDC() dc.SetFont(self.fonts['monospace']) cw, ch = dc.GetTextExtent(' ') self.charSize = cw, ch self.normalChars = {} for c in self.charSet: bitmap = Bitmap(cw, ch, BITMAP_SCREEN_DEPTH) dc.SelectObject(bitmap) dc.SetBackground(self.brushes['bkgd']) dc.Clear() dc.SetTextForeground(Colour(230, 230, 230)) dc.DrawText(c, 0, 0) self.normalChars[c] = bitmap self.selectedChars = {} for c in self.charSet: bitmap = Bitmap(cw, ch, BITMAP_SCREEN_DEPTH) dc.SelectObject(bitmap) dc.SetBackground(Brush(Colour(70, 80, 90))) dc.Clear() dc.SetTextForeground(Colour(160, 160, 180)) if c == ' ': dc.DrawText(c, 0, 0) else: dc.DrawText(c, 0, 0) self.selectedChars[c] = bitmap self.numberChars = {} for c in ' 0123456789': bitmap = Bitmap(cw, ch, BITMAP_SCREEN_DEPTH) dc.SelectObject(bitmap) dc.SetBackground(self.brushes['bkgd']) dc.Clear() dc.SetTextForeground(Colour(150, 150, 200)) dc.DrawText(c, 0, 0) self.numberChars[c] = bitmap dc.SelectObject(NullBitmap) return
def CreateDC(self, loadBackground: bool, w: int, h: int) -> DC: """ Create a DC, load the background on demand. @param loadBackground @param w : width of the frame. @param h : height of the frame. @return DC """ dc = MemoryDC() bm = self.__workingBitmap # cache the bitmap, to avoid creating a new at each refresh. # only recreate it if the size of the window has changed if (bm.GetWidth(), bm.GetHeight()) != (w, h): bm = self.__workingBitmap = Bitmap(w, h) dc.SelectObject(bm) if loadBackground: self.LoadBackground(dc, w, h) else: dc.SetBackground(Brush(self.GetBackgroundColour())) dc.Clear() self.PrepareDC(dc) return dc
def createCharBitmap(setName, fontName, frgd, bkgd): global _cw, _ch # create device context dc = MemoryDC() # set font dc.SetFont(_fonts[fontName]) # get font size _cw, _ch = dc.GetTextExtent(' ') BitmapSet = {} for c in _printableCharSet: # create bitmap bitmap = Bitmap(_cw, _ch, BITMAP_SCREEN_DEPTH) # select bitmap dc.SelectObject(bitmap) # set background dc.SetBackground(_brushes[bkgd]) # clear bitmap dc.Clear() # set text color dc.SetTextForeground(_colours[frgd]) # write character dc.DrawText(c, 0, 0) # record BitmapSet[c] = bitmap # release bitmap dc.SelectObject(NullBitmap) # record set _printableCharBitmaps[setName] = BitmapSet # done return
def __init__(self, rows, colums): self.bitmap = Bitmap(colums * _cw, rows * _ch, BITMAP_SCREEN_DEPTH) dc = MemoryDC() dc.SelectObject(self.bitmap) dc.SetBackground(_brushes['bgd']) dc.Clear() dc.SelectObject(NullBitmap) return
def refreshBuffer(self): X, Y = self.scroll cw, ch = self.charSize sl, sr, st, sb = 5, 15, 5, 5 cl, rw = self.screenSize dc = MemoryDC() dc.SelectObject(self.bmpBuf) dc.SetBackground(self.brushes['bkgd']) dc.Clear() x3, x4 = 0 * cw, cl * cw x1, y1 = (sl - 0.5) * cw, (st - 0.5) * ch x2, y2 = (cl - sr + 0.5) * cw, (rw - sb + 0.5) * ch dc.SetPen(self.pens['margin']) dc.DrawLine(x1, y1, x1, y2) dc.DrawLine(x2, y1, x2, y2) dc.DrawLine(x3, y1, x4, y1) dc.DrawLine(x3, y2, x4, y2) c1, r1, c2, r2 = self.getBlockGeometry() dc.SetBrush(Brush(Colour(100, 100, 100))) dc.SetPen(self.pens['transparent']) x, y = 0, -1 for line in self.chrBuf[Y:]: y += 1 if y + st >= rw - sb: break self.drawText(dc, f'{y+Y:4d}', 0, y + st, self.numberChars) if y + Y < r1 or y + Y > r2: self.drawText(dc, line[X:], x + sl, y + st, self.normalChars) continue if r1 == r2: self.drawText(dc, line[X:], x + sl, y + st, self.normalChars) self.drawText(dc, line[X:c2], x + sl, y + st, self.selectedChars) self.drawText(dc, line[X:c1], x + sl, y + st, self.normalChars) continue if y + Y == r1: self.drawText(dc, line[X:] + '¶', x + sl, y + st, self.selectedChars) self.drawText(dc, line[X:c1], x + sl, y + st, self.normalChars) continue if y + Y == r2: self.drawText(dc, line[X:], x + sl, y + st, self.normalChars) self.drawText(dc, line[X:c2], x + sl, y + st, self.selectedChars) continue self.drawText(dc, line[X:] + '¶', x + sl, y + st, self.selectedChars) x, y = self.cursor x1, y1, y2 = (x + sl) * cw, (y + st) * ch, (y + st + 1) * ch - 1 dc.SetPen(self.pens['cursor']) dc.DrawLine(x1, y1, x1, y2) dc.SelectObject(NullBitmap) return
def ClearBackground(self): """ Clear the background image. """ dc = MemoryDC() bb = self.__backgroundBitmap w, h = self.GetSize() if (bb.GetWidth(), bb.GetHeight()) != (w, h): bb = self.__backgroundBitmap = EmptyBitmap(w, h) dc.SelectObject(bb) dc.SetBackground(Brush(self.GetBackgroundColour())) dc.Clear() dc.SelectObject(NullBitmap)
def OnFacename(self, facename): idx = len(self.font_list) self.font_list.append(facename) w, h = self.GetTextExtentCached(idx) self.bitmaps[idx] = wx.Bitmap(w, h) dc = MemoryDC() dc.SelectObject(self.bitmaps[idx]) dc.Clear() font = self.MakeFont(facename=facename) dc.SetFont(font) dc.DrawText(facename, 0, 0) wx.CallAfter(self.Append, facename, idx) return True
def createBufferBitmap(self, width, height): cw, ch = self.charSize self.bmpBuf = Bitmap( width * cw, # bitmap width height * ch, # bitmap heigh BITMAP_SCREEN_DEPTH) # bitmap depth dc = MemoryDC() dc.SelectObject(self.bmpBuf) dc.SetBackground(self.brushes['bkgd']) dc.Clear() dc.SelectObject(NullBitmap) self.Panel.BackgroundBitmap = self.bmpBuf self.screenSize = width, height return
def _createCharBitmap(self, name, font, foreground, background): # create device context dc = MemoryDC() # set font dc.SetFont(self._fonts[font]) # get font size _cw, _ch = dc.GetTextExtent(' ') BitmapSet = {} for c in self._CharSet: # create bitmap bitmap = Bitmap(_cw, _ch, BITMAP_SCREEN_DEPTH) # select bitmap dc.SelectObject(bitmap) # set background dc.SetBackground(self._brushes[background]) # clear bitmap dc.Clear() # set text color dc.SetTextForeground(self._colours[foreground]) # record reference BitmapSet[c] = bitmap # check alternate drawing 1 if name == 'nrm' and c == '¶': dc.DrawText(' ',0,0) continue # check alternate drawing 2 if name == 'sel' and c == ' ': dc.DrawText('·',0,0) continue # draw character dc.DrawText(c,0,0) # release bitmap dc.SelectObject(NullBitmap) # record set self._CharBitmaps[name] = BitmapSet # done return
def createBufferBitmap(self, width, height): # get geometry cw, ch = self.charSize # create bitmap buffer self.bmpBuf = Bitmap( width *cw, # bitmap width height*ch, # bitmap heigh BITMAP_SCREEN_DEPTH) # bitmap depth # create device context dc = MemoryDC() # select buffer dc.SelectObject(self.bmpBuf) # set background dc.SetBackground(self.brushes['bkgd']) # clear buffer dc.Clear() # release bitmap dc.SelectObject(NullBitmap) # hook BackgroundBitmap to bitmapBuffer handle self.Panel.BackgroundBitmap = self.bmpBuf # record geometry self.screenSize = width, height # done return
def refreshBuffer(self): # get geometry X, Y = self.scroll cw, ch = self.charSize sl, sr, st, sb = 5, 15, 5, 5 cl, rw = self.screenSize # create device context dc = MemoryDC() # select dc.SelectObject(self.bmpBuf) # set background dc.SetBackground(self.brushes['bkgd']) # and clear buffer dc.Clear() # draw margins x3, x4 = 0*cw, cl*cw x1, y1 = (sl-0.5)*cw, (st-0.5)*ch x2, y2 = (cl-sr+0.5)*cw, (rw-sb+0.5)*ch dc.SetPen(self.pens['margin']) dc.DrawLine(x1, y1, x1, y2) dc.DrawLine(x2, y1, x2, y2) dc.DrawLine(x3, y1, x4, y1) dc.DrawLine(x3, y2, x4, y2) # get block geometry c1, r1, c2, r2 = self.getBlockGeometry() # set brush dc.SetBrush(Brush(Colour(100,100,100))) dc.SetPen(self.pens['transparent']) # draw text x, y = 0, -1 for line in self.chrBuf[Y:]: y += 1 if y+st >= rw-sb: break # draw line number self.drawText(dc, f'{y+Y:4d}', 0, y+st, self.numberChars) # the line is outside of the block if y+Y < r1 or y+Y > r2: self.drawText(dc, line[X:], x+sl, y+st, self.normalChars) continue # block is inside if the line if r1 == r2: self.drawText(dc, line[X:], x+sl, y+st, self.normalChars) self.drawText(dc, line[X:c2], x+sl, y+st, self.selectedChars) self.drawText(dc, line[X:c1], x+sl, y+st, self.normalChars) continue # line at the start of the block if y+Y == r1: self.drawText(dc, line[X:]+'¶', x+sl, y+st, self.selectedChars) self.drawText(dc, line[X:c1], x+sl, y+st, self.normalChars) continue # line at the end of the block if y+Y == r2: self.drawText(dc, line[X:], x+sl, y+st, self.normalChars) self.drawText(dc, line[X:c2], x+sl, y+st, self.selectedChars) continue # line is inside the block self.drawText(dc, line[X:]+'¶', x+sl, y+st, self.selectedChars) # draw cursor x, y = self.cursor x1, y1, y2 = (x+sl)*cw, (y+st)*ch, (y+st+1)*ch-1 dc.SetPen(self.pens['cursor']) dc.DrawLine(x1, y1, x1, y2) # done dc.SelectObject(NullBitmap) return
def createCharBitmaps(self): # create device context dc = MemoryDC() # set font dc.SetFont(self.fonts['monospace']) # get font size (monospace) cw, ch = dc.GetTextExtent(' ') # record geometry self.charSize = cw, ch # NORMAL CHARACTERS self.normalChars = {} # create bitmaps for c in self.charSet: # create black and white bitmap bitmap = Bitmap(cw, ch, BITMAP_SCREEN_DEPTH) # select bitmap dc.SelectObject(bitmap) # set background dc.SetBackground(self.brushes['bkgd']) # clear bitmap dc.Clear() # set text color dc.SetTextForeground(Colour(230,230,230)) # write character dc.DrawText(c,0,0) # create reference to bitmap self.normalChars[c] = bitmap # SELECTED CHARACTERS self.selectedChars = {} # create bitmaps for c in self.charSet: # create black and white bitmap bitmap = Bitmap(cw, ch, BITMAP_SCREEN_DEPTH) # select bitmap dc.SelectObject(bitmap) # set background dc.SetBackground(Brush(Colour(70, 80, 90))) # clear bitmap dc.Clear() # set text color dc.SetTextForeground(Colour(160,160,180)) # write character dc.DrawText(c,0,0) # create reference to bitmap self.selectedChars[c] = bitmap # NUMBER CHARACTERS self.numberChars = {} # create bitmaps for c in ' 0123456789': # create black and white bitmap bitmap = Bitmap(cw, ch, BITMAP_SCREEN_DEPTH) # select bitmap dc.SelectObject(bitmap) # set background dc.SetBackground(self.brushes['bkgd']) # clear bitmap dc.Clear() # set text color dc.SetTextForeground(Colour(150,150,200)) # write character dc.DrawText(c,0,0) # create reference to bitmap self.numberChars[c] = bitmap # release bitmap dc.SelectObject(NullBitmap) # done return
def OnRefreshPanel(self, event): """ Refresh dialog box """ import time # constants backRed: int = 230 backGreen: int = 255 backBlue: int = 230 # Background color frontRed: int = 64 frontGreen: int = 0 frontBlue: int = 64 # Foreground color FADE_IN_LENGTH: int = 63 self.logger.debug(f'Enter OnRefreshPanel') # Init memory buffer tdc: MemoryDC = MemoryDC() tdc.SelectObject(Bitmap(FrameWidth, FrameHeight)) while not tdc.IsOk(): time.sleep(0.05) tdc = MemoryDC() tdc.SelectObject(Bitmap(FrameWidth, FrameHeight)) tdc.SetTextForeground(Colour(frontRed, frontGreen, frontBlue)) tdc.SetBackground( Brush(Colour(backRed, backGreen, backBlue), BRUSHSTYLE_SOLID)) tdc.Clear() font = tdc.GetFont() font.SetFamily(FONTFAMILY_MODERN) font.SetPointSize(12) tdc.SetFont(font) # Fade-in position = self.textPosition if position < FADE_IN_LENGTH: n = float(position) / float(FADE_IN_LENGTH) r = backRed - n * (backRed - frontRed) g = backGreen - n * (backGreen - frontGreen) b = backBlue - n * (backBlue - frontBlue) r = int(r) g = int(g) b = int(b) tdc.SetTextForeground(Colour(r, g, b)) # Display text for j in range(1, len(self._textToShow)): # Draw text ? if position > FADE_IN_LENGTH: y = y0 + j * dy - (position - FADE_IN_LENGTH) if -dy < y < FrameHeight: tdc.DrawText(self._textToShow[j], x0, y) else: # Draw initial screen with fade in y = y0 + j * dy if -dy < y < FrameHeight: tdc.DrawText(self._textToShow[j], x0, y) # Show memory dc to current dc (blit) dc = PaintDC(self._panel) dc.Blit(0, 0, FrameWidth, FrameHeight, tdc, 0, 0) tdc.SelectObject(NullBitmap) self.logger.debug(f'Exit OnRefreshPanel')
def refreshBuffer(self): # get geometry X, Y = self.scroll cw, ch = self.charSize sl, sr, st, sb = 5, 15, 5, 5 cl, rw = self.screenSize # create device context dc = MemoryDC() # select dc.SelectObject(self.bitmapBuffer) # set background dc.SetBackground(self.brushes['bkgd']) # and clear buffer dc.Clear() # draw margins x3, x4 = 0 * cw, cl * cw x1, y1 = (sl - 0.5) * cw, (st - 0.5) * ch x2, y2 = (cl - sr + 0.5) * cw, (rw - sb + 0.5) * ch dc.SetPen(self.pens['margin']) dc.DrawLine(x1, y1, x1, y2) dc.DrawLine(x2, y1, x2, y2) dc.DrawLine(x3, y1, x4, y1) dc.DrawLine(x3, y2, x4, y2) # get block geometry r1, c1 = self.blockBegin r2, c2 = self.blockEnd block = False # draw text x, y = 0, 0 for line in self.characterBuffer[Y:]: # draw line number self.drawText(dc, f'{y+Y:4d}', 0, y + st, self.numberChars) # the line is outside of the block if y + Y < r1 or y + Y > r2: self.drawText(dc, line[X:], x + sl, y + st, self.normalChars) # done y += 1 if y + st >= rw - sb: break continue # block is inside if the line if r1 == r2: # draw normal text # self.drawText(dc, line[X:], x+sl, y+st, self.normalChars) # # block has size zero # if c1 == c2: # # done # y += 1 # if y+st >= rw-sb: break # continue # block has finite size self.drawText(dc, line[X:], x + sl, y + st, self.normalChars) self.drawText(dc, line[X:c2], x + sl, y + st, self.selectedChars) self.drawText(dc, line[X:c1], x + sl, y + st, self.normalChars) # done y += 1 if y + st >= rw - sb: break continue # line at the start of the block if y + Y == r1: self.drawText(dc, line[X:], x + sl, y + st, self.selectedChars) self.drawText(dc, line[X:c1], x + sl, y + st, self.normalChars) # done y += 1 if y + st >= rw - sb: break continue # line at the end of the block if y + Y == r2: self.drawText(dc, line[X:], x + sl, y + st, self.normalChars) self.drawText(dc, line[X:c2], x + sl, y + st, self.selectedChars) # done y += 1 if y + st >= rw - sb: break continue # line in the middle of the block self.drawText(dc, line[X:], x + sl, y + st, self.selectedChars) y += 1 if y + st >= rw - sb: break # draw cursor x, y = self.cursor x1, y1, y2 = (x + sl) * cw, (y + st) * ch, (y + st + 1) * ch - 1 dc.SetPen(self.pens['cursor']) dc.DrawLine(x1, y1, x1, y2) # done dc.SelectObject(NullBitmap) return
def Start(self): # define colors self.colours = {} self.colours['bkgd'] = Colour(52, 61, 70) self.colours['text'] = Colour(255, 255, 255) self.colours['numb'] = Colour(160, 160, 160) self.colours['sepr'] = Colour(200, 120, 120) self.colours['selbgd'] = Colour(92, 101, 110) self.colours['seltxt'] = Colour(255, 255, 255) # brushes self.brushes = {} # normal background b = Brush() b.SetStyle(BRUSHSTYLE_SOLID) b.SetColour(self.colours['bkgd']) self.brushes['bkgd'] = b # selected background b = Brush() b.SetStyle(BRUSHSTYLE_SOLID) b.SetColour(self.colours['selbgd']) self.brushes['selbgd'] = b # pens self.pens = {} p = Pen() p.SetColour(self.colours['sepr']) p.SetWidth(1) p.SetStyle(PENSTYLE_SOLID) self.pens['sepr'] = p # create device context to work on bitmaps dc = MemoryDC() # define font self.fonts = {} f = Font() f.SetFamily(FONTFAMILY_ROMAN) f.SetFaceName("Monospace") f.SetEncoding(FONTENCODING_DEFAULT) f.SetStyle(FONTSTYLE_NORMAL) f.SetWeight(FONTWEIGHT_NORMAL) f.SetUnderlined(False) f.SetPointSize(10) self.fonts['monospace'] = f # select font f = 'monospace' # get font size dc.SetFont(self.fonts[f]) w, h = dc.GetTextExtent(' ') # build character dictionary self.rawChars = {} # standard printable ascii table for c in range(32, 126): self.rawChars[chr(c)] = None # extra characters (UK) self.rawChars['£'] = None # save character size self.rawChars['Size'] = w, h # set background color dc.SetBackground(self.brushes['bkgd']) # build characters bitmaps for C in self.rawChars.keys(): if C == 'Size': continue # instanciate character bitmap self.rawChars[C] = Bitmap(w, h, BITMAP_SCREEN_DEPTH) # select bitmap dc.SelectObject(self.rawChars[C]) # clear bitmap dc.Clear() # set text color dc.SetTextForeground(self.colours['text']) # draw character shape and color dc.DrawText(C, 0, 0) # done dc.SelectObject(NullBitmap) # build selected dictionary self.selChars = {} # standard printable ascii table for c in range(32, 126): self.selChars[chr(c)] = None # extra characters (UK) self.selChars['£'] = None # save character size self.selChars['Size'] = w, h # set background color dc.SetBackground(self.brushes['selbgd']) # build selected bitmaps for C in self.selChars.keys(): if C == 'Size': continue # instanciate character bitmap self.selChars[C] = Bitmap(w, h, BITMAP_SCREEN_DEPTH) # select bitmap dc.SelectObject(self.selChars[C]) # clear bitmap dc.Clear() # set text color dc.SetTextForeground(self.colours['seltxt']) # draw character shape and color dc.DrawText(C, 0, 0) # done dc.SelectObject(NullBitmap) # create bitmap buffer display and clear buffer self.bitmapBuffer = Bitmap( 128 * w, # bitmap width 10 * h, # bitmap height BITMAP_SCREEN_DEPTH) # bitmap depth dc.SelectObject(self.bitmapBuffer) dc.SetBackground(self.brushes['bkgd']) dc.Clear() dc.SelectObject(NullBitmap) # reference BackgroundBitmap to bitmapBuffer self.Panel.BackgroundBitmap = self.bitmapBuffer # adjust frame position scrw, scrh = 3840, 1200 # screen size w, h = self.Panel.BackgroundBitmap.GetSize() self.Frame.SetPosition(Point(scrw / 4 - 128 * 8 / 2, 800)) # draw text string dc.SelectObject(self.bitmapBuffer) t = list("hello") # select buffer # draw text X = 0 w, h = self.rawChars['Size'] for c in t: dc.DrawBitmap(self.rawChars[c], X, 0) X += w t = list("World!") # select buffer # draw text X = 0 w, h = self.selChars['Size'] for c in t: dc.DrawBitmap(self.selChars[c], X, h) X += w # release bitmap dc.SelectObject(NullBitmap) # done return