import wx #---------------------------------------------------------------------- logicList = [ ('wx.AND', wx.AND), ('wx.AND_INVERT', wx.AND_INVERT), ('wx.AND_REVERSE', wx.AND_REVERSE), ('wx.CLEAR', wx.CLEAR), ('wx.COPY', wx.COPY), ('wx.EQUIV', wx.EQUIV), ('wx.INVERT', wx.INVERT), ('wx.NAND', wx.NAND), # this one causes an assert on wxGTK, and doesn't seem to # do much on MSW anyway, so I'll just take it out.... #('wxNOR', wxNOR), ('wx.NO_OP', wx.NO_OP), ('wx.OR', wx.OR), ('wx.OR_INVERT', wx.OR_INVERT), ('wx.OR_REVERSE', wx.OR_REVERSE), ('wx.SET', wx.SET), ('wx.SRC_INVERT', wx.SRC_INVERT), ('wx.XOR', wx.XOR), ] import images class TestMaskWindow(wx.ScrolledWindow): def __init__(self, parent): wx.ScrolledWindow.__init__(self, parent, -1) self.SetBackgroundColour(wx.Colour(0,128,0)) # A reference bitmap that we won't mask self.bmp_nomask = images.getTestStar2Bitmap() # One that we will self.bmp_withmask = images.getTestStar2Bitmap() # this mask comes from a monochrome bitmap self.bmp_themask = wx.BitmapFromImage(images.getTestMaskImage(), 1) mask = wx.Mask(self.bmp_themask) # set the mask on our bitmap self.bmp_withmask.SetMask(mask) # Now we'll create a mask in a bit of an easier way, by picking a # colour in the image that is to be the transparent colour. self.bmp_withcolourmask = images.getTestStar2Bitmap() mask = wx.MaskColour(self.bmp_withcolourmask, wx.WHITE) self.bmp_withcolourmask.SetMask(mask) self.SetScrollbars(20, 20, 700/20, 460/20) self.Bind(wx.EVT_PAINT, self.OnPaint) def OnPaint (self, e): dc = wx.PaintDC(self) self.PrepareDC(dc) dc.SetTextForeground(wx.WHITE) # make an interesting background... dc.SetPen(wx.MEDIUM_GREY_PEN) for i in range(100): dc.DrawLine((0,i*10), (i*10,0)) # draw raw image, mask, and masked images dc.DrawText('original image', (0,0)) dc.DrawBitmap(self.bmp_nomask, (0,20), 0) dc.DrawText('with colour mask', (0,100)) dc.DrawBitmap(self.bmp_withcolourmask, (0,120), 1) dc.DrawText('the mask image', (0,200)) dc.DrawBitmap(self.bmp_themask, (0,220), 0) dc.DrawText('masked image', (0,300)) dc.DrawBitmap(self.bmp_withmask, (0,320), 1) cx,cy = self.bmp_themask.GetWidth(), self.bmp_themask.GetHeight() # draw array of assorted blit operations mdc = wx.MemoryDC() i = 0 for text, code in logicList: x,y = 120+150*(i%4), 20+100*(i/4) dc.DrawText(text, (x, y-20)) mdc.SelectObject(self.bmp_withcolourmask) dc.Blit((x,y), (cx,cy), mdc, (0,0), code, True) i = i + 1 # On wxGTK there needs to be a panel under wx.ScrolledWindows if they are # going to be in a wxNotebook... class TestPanel(wx.Panel): def __init__(self, parent, ID): wx.Panel.__init__(self, parent, ID) self.win = TestMaskWindow(self) self.Bind(wx.EVT_SIZE, self.OnSize) def OnSize(self, evt): self.win.SetSize(evt.GetSize()) #---------------------------------------------------------------------- def runTest(frame, nb, log): win = TestPanel(nb, -1) return win #---------------------------------------------------------------------- overview = """\ This class encapsulates a monochrome mask bitmap, where the masked area is black and the unmasked area is white. When associated with a bitmap and drawn in a device context, the unmasked area of the bitmap will be drawn, and the masked area will not be drawn. This example shows not only how to create a Mask, but the effects of the Device Context (dc) Blit() method's logic codes. """ if __name__ == '__main__': import sys,os import run run.main(['', os.path.basename(sys.argv[0])])