| 1 | |
| 2 | import wx |
| 3 | |
| 4 | #---------------------------------------------------------------------- |
| 5 | |
| 6 | logicList = [ |
| 7 | ('wx.AND', wx.AND), |
| 8 | ('wx.AND_INVERT', wx.AND_INVERT), |
| 9 | ('wx.AND_REVERSE', wx.AND_REVERSE), |
| 10 | ('wx.CLEAR', wx.CLEAR), |
| 11 | ('wx.COPY', wx.COPY), |
| 12 | ('wx.EQUIV', wx.EQUIV), |
| 13 | ('wx.INVERT', wx.INVERT), |
| 14 | ('wx.NAND', wx.NAND), |
| 15 | |
| 16 | # this one causes an assert on wxGTK, and doesn't seem to |
| 17 | # do much on MSW anyway, so I'll just take it out.... |
| 18 | #('wxNOR', wxNOR), |
| 19 | |
| 20 | ('wx.NO_OP', wx.NO_OP), |
| 21 | ('wx.OR', wx.OR), |
| 22 | ('wx.OR_INVERT', wx.OR_INVERT), |
| 23 | ('wx.OR_REVERSE', wx.OR_REVERSE), |
| 24 | ('wx.SET', wx.SET), |
| 25 | ('wx.SRC_INVERT', wx.SRC_INVERT), |
| 26 | ('wx.XOR', wx.XOR), |
| 27 | ] |
| 28 | |
| 29 | import images |
| 30 | |
| 31 | class TestMaskWindow(wx.ScrolledWindow): |
| 32 | def __init__(self, parent): |
| 33 | wx.ScrolledWindow.__init__(self, parent, -1) |
| 34 | self.SetBackgroundColour(wx.Colour(0,128,0)) |
| 35 | |
| 36 | # A reference bitmap that we won't mask |
| 37 | self.bmp_nomask = images.getTestStar2Bitmap() |
| 38 | |
| 39 | # One that we will |
| 40 | self.bmp_withmask = images.getTestStar2Bitmap() |
| 41 | |
| 42 | # this mask comes from a monochrome bitmap |
| 43 | self.bmp_themask = wx.BitmapFromImage(images.getTestMaskImage(), 1) |
| 44 | mask = wx.Mask(self.bmp_themask) |
| 45 | |
| 46 | # set the mask on our bitmap |
| 47 | self.bmp_withmask.SetMask(mask) |
| 48 | |
| 49 | # Now we'll create a mask in a bit of an easier way, by picking a |
| 50 | # colour in the image that is to be the transparent colour. |
| 51 | self.bmp_withcolourmask = images.getTestStar2Bitmap() |
| 52 | mask = wx.MaskColour(self.bmp_withcolourmask, wx.WHITE) |
| 53 | self.bmp_withcolourmask.SetMask(mask) |
| 54 | |
| 55 | self.SetScrollbars(20, 20, 700/20, 460/20) |
| 56 | |
| 57 | self.Bind(wx.EVT_PAINT, self.OnPaint) |
| 58 | |
| 59 | |
| 60 | def OnPaint (self, e): |
| 61 | dc = wx.PaintDC(self) |
| 62 | self.PrepareDC(dc) |
| 63 | dc.SetTextForeground(wx.WHITE) |
| 64 | |
| 65 | # make an interesting background... |
| 66 | dc.SetPen(wx.MEDIUM_GREY_PEN) |
| 67 | for i in range(100): |
| 68 | dc.DrawLine((0,i*10), (i*10,0)) |
| 69 | |
| 70 | # draw raw image, mask, and masked images |
| 71 | dc.DrawText('original image', (0,0)) |
| 72 | dc.DrawBitmap(self.bmp_nomask, (0,20), 0) |
| 73 | dc.DrawText('with colour mask', (0,100)) |
| 74 | dc.DrawBitmap(self.bmp_withcolourmask, (0,120), 1) |
| 75 | dc.DrawText('the mask image', (0,200)) |
| 76 | dc.DrawBitmap(self.bmp_themask, (0,220), 0) |
| 77 | dc.DrawText('masked image', (0,300)) |
| 78 | dc.DrawBitmap(self.bmp_withmask, (0,320), 1) |
| 79 | |
| 80 | cx,cy = self.bmp_themask.GetWidth(), self.bmp_themask.GetHeight() |
| 81 | |
| 82 | # draw array of assorted blit operations |
| 83 | mdc = wx.MemoryDC() |
| 84 | i = 0 |
| 85 | |
| 86 | for text, code in logicList: |
| 87 | x,y = 120+150*(i%4), 20+100*(i/4) |
| 88 | dc.DrawText(text, (x, y-20)) |
| 89 | mdc.SelectObject(self.bmp_withcolourmask) |
| 90 | dc.Blit((x,y), (cx,cy), mdc, (0,0), code, True) |
| 91 | i = i + 1 |
| 92 | |
| 93 | |
| 94 | # On wxGTK there needs to be a panel under wx.ScrolledWindows if they are |
| 95 | # going to be in a wxNotebook... |
| 96 | class TestPanel(wx.Panel): |
| 97 | def __init__(self, parent, ID): |
| 98 | wx.Panel.__init__(self, parent, ID) |
| 99 | self.win = TestMaskWindow(self) |
| 100 | self.Bind(wx.EVT_SIZE, self.OnSize) |
| 101 | |
| 102 | def OnSize(self, evt): |
| 103 | self.win.SetSize(evt.GetSize()) |
| 104 | |
| 105 | |
| 106 | #---------------------------------------------------------------------- |
| 107 | |
| 108 | def runTest(frame, nb, log): |
| 109 | win = TestPanel(nb, -1) |
| 110 | return win |
| 111 | |
| 112 | #---------------------------------------------------------------------- |
| 113 | |
| 114 | |
| 115 | overview = """\ |
| 116 | This class encapsulates a monochrome mask bitmap, where the masked area is black |
| 117 | and the unmasked area is white. When associated with a bitmap and drawn in a device |
| 118 | context, the unmasked area of the bitmap will be drawn, and the masked area will |
| 119 | not be drawn. |
| 120 | |
| 121 | This example shows not only how to create a Mask, but the effects of the Device |
| 122 | Context (dc) <code>Blit()</code> method's logic codes. |
| 123 | """ |
| 124 | |
| 125 | |
| 126 | |
| 127 | if __name__ == '__main__': |
| 128 | import sys,os |
| 129 | import run |
| 130 | run.main(['', os.path.basename(sys.argv[0])]) |
| 131 | |