Add a GraphicsContext sample to the demo

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42424 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn 2006-10-26 03:34:54 +00:00
parent be68621e1e
commit 51aad6d34f
4 changed files with 145 additions and 7 deletions

View File

@ -50,13 +50,13 @@ def runTest(frame, nb, log):
overview = """<html><body>
<h2><center>Alpha Drawing</center></h2>
The wx.DC on Mac now supports alpha transparent drawing using pens and
brushes. This is accomplished by enabling the wx.Colour class to have
a fourth component for the alpha value, where 0 is fully transparent,
and 255 is fully opaque.
<p>You can consider this a \"preview of coming attractions\" for the
other platforms.
The wx.GCDC class is a class that implemented the wx.DC API using the
new wx.GraphicsContext class, and so it supports anti-aliased drawing
using pens and brushes, that can optionally also be drawn using an
alpha transparency. (On the Mac all the DC classes are using this new
implementation.) This is accomplished by enabling the wx.Colour class
to have a fourth component for the alpha value, where 0 is fully
transparent, and 255 is fully opaque.
</body></html>
"""

View File

@ -0,0 +1,134 @@
import wx
import colorsys
from math import cos, sin, radians
#----------------------------------------------------------------------
BASE = 80.0 # sizes used in shapes drawn below
BASE2 = BASE/2
BASE4 = BASE/4
class TestPanel(wx.Panel):
def __init__(self, parent, log):
self.log = log
wx.Panel.__init__(self, parent, -1)
self.Bind(wx.EVT_PAINT, self.OnPaint)
def OnPaint(self, evt):
dc = wx.PaintDC(self)
gc = wx.GraphicsContext.Create(dc)
font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
font.SetWeight(wx.BOLD)
gc.SetFont(font)
# make a path that contains a circle and some lines, centered at 0,0
path = gc.CreatePath()
path.AddCircle(0, 0, BASE2)
path.MoveToPoint(0, -BASE2)
path.AddLineToPoint(0, BASE2)
path.MoveToPoint(-BASE2, 0)
path.AddLineToPoint(BASE2, 0)
path.CloseSubpath()
path.AddRectangle(-BASE4, -BASE4/2, BASE2, BASE4)
# Now use that path to demonstrate various capbilites of the grpahics context
gc.PushState() # save current translation/scale/other state
gc.Translate(60, 75) # reposition the context origin
gc.SetPen(wx.Pen("navy", 1))
gc.SetBrush(wx.Brush("pink"))
gc.SetTextColour("black")
# show the difference between stroking, filling and drawing
for label, PathFunc in [("StrokePath", gc.StrokePath),
("FillPath", gc.FillPath),
("DrawPath", gc.DrawPath)]:
if "wxGTK" in wx.PlatformInfo:
w, h = dc.GetTextExtent(label) # NYI in Cairo context
else:
w, h = gc.GetTextExtent(label)
gc.DrawText(label, -w/2, -BASE2-h)
PathFunc(path)
gc.Translate(2*BASE, 0)
gc.PopState() # restore saved state
gc.PushState() # save it again
gc.Translate(60, 200) # offset to the lower part of the window
gc.DrawText("Scale", 0, -BASE2)
gc.Translate(0, 20)
gc.SetBrush(wx.Brush(wx.Colour(178, 34, 34, 128))) # 128 == half transparent
for cnt in range(8):
gc.Scale(1.08, 1.08) # increase scale by 8%
gc.Translate(5,5)
gc.DrawPath(path)
gc.PopState() # restore saved state
gc.PushState() # save it again
gc.Translate(400, 200)
gc.DrawText("Rotate", 0, -BASE2)
gc.Translate(0, 75)
for angle in range(0, 360, 30):
gc.PushState() # save this new current state so we can pop back to
# it at the end of the loop
r, g, b = [int(c * 255) for c in colorsys.hsv_to_rgb(float(angle)/360, 1, 1)]
gc.SetBrush(wx.Brush(wx.Colour(r, g, b, 64)))
# use translate to artfully reposition each drawn path
gc.Translate(1.5 * BASE2 * cos(radians(angle)),
1.5 * BASE2 * sin(radians(angle)))
# use Rotate to rotate the path
gc.Rotate(radians(angle))
# now draw it
gc.DrawPath(path)
gc.PopState()
gc.PopState()
#----------------------------------------------------------------------
def runTest(frame, nb, log):
win = TestPanel(nb, log)
return win
#----------------------------------------------------------------------
overview = """<html><body>
<h2><center>wx.GraphicsContext and wx.GraphicsPath</center></h2>
The new advanced 2D drawing API is implemented via the
wx.GraphicsContext and wx.GraphicsPath classes. They wrap GDI+ on
Windows, Cairo on wxGTK and CoreGraphics on OS X. They allow
path-based drawing with alpha-blending and anti-aliasing, and use a
floating point cooridnate system.
<p>When viewing this sample pay attention to how the rounded edges are
smoothed with anti-aliased drawing, and how the shapes on the lower
half of the window are partially transparent, allowing you to see what
was drawn before.
</body></html>
"""
if __name__ == '__main__':
import sys,os
import run
run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])

View File

@ -68,6 +68,7 @@ _treeList = [
'AboutBox',
'AnimateCtrl',
'AlphaDrawing',
'GraphicsContext',
]),
# managed windows == things with a (optional) caption you can close
@ -268,6 +269,7 @@ _treeList = [
'DrawXXXList',
'FileHistory',
'FontEnumerator',
'GraphicsContext',
'GLCanvas',
'Joystick',
'MimeTypesManager',

View File

@ -23,6 +23,8 @@ of wx.ListCtrl available, which will be used for wx.LC_REPORT style
list controls if you set the "mac.listctrl.always_use_generic"
SystemOption to zero. In a future release this will be the default.
Added a sample to the demo that shows some of what can be done with
the new wx.GraphicsContext and wx.GraphicsPath classes.