Exemple #1
0
 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
Exemple #2
0
    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
Exemple #3
0
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
Exemple #4
0
 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
Exemple #5
0
 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
Exemple #6
0
 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)
Exemple #7
0
 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
Exemple #8
0
 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
Exemple #9
0
 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
Exemple #10
0
    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
Exemple #11
0
 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
Exemple #12
0
    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')
Exemple #13
0
    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
Exemple #14
0
    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