1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        src/common/effects.cpp
3 // Purpose:     wxEffects implementation
4 // Author:      Julian Smart
5 // Modified by:
6 // Created:     25/4/2000
7 // RCS-ID:      $Id: effects.cpp 42755 2006-10-30 19:41:46Z VZ $
8 // Copyright:   (c) Julian Smart
9 // Licence:     wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11 
12 // For compilers that support precompilation, includes "wx.h".
13 #include "wx/wxprec.h"
14 
15 #ifdef __BORLANDC__
16     #pragma hdrstop
17 #endif
18 
19 #include "wx/effects.h"
20 
21 #ifndef WX_PRECOMP
22     #include "wx/dcmemory.h"
23     #include "wx/pen.h"
24     #include "wx/settings.h"
25     #include "wx/gdicmn.h"
26 #endif //WX_PRECOMP
27 
28 /*
29  * wxEffects: various 3D effects
30  */
31 
IMPLEMENT_CLASS(wxEffects,wxObject)32 IMPLEMENT_CLASS(wxEffects, wxObject)
33 
34 // Assume system colours
35 wxEffects::wxEffects()
36 {
37     m_highlightColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DHILIGHT) ;
38     m_lightShadow = wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT) ;
39     m_faceColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE) ;
40     m_mediumShadow = wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW) ;
41     m_darkShadow = wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW) ;
42 }
43 
44 // Going from lightest to darkest
wxEffects(const wxColour & highlightColour,const wxColour & lightShadow,const wxColour & faceColour,const wxColour & mediumShadow,const wxColour & darkShadow)45 wxEffects::wxEffects(const wxColour& highlightColour, const wxColour& lightShadow,
46                 const wxColour& faceColour, const wxColour& mediumShadow, const wxColour& darkShadow)
47 {
48     m_highlightColour = highlightColour;
49     m_lightShadow = lightShadow;
50     m_faceColour = faceColour;
51     m_mediumShadow = mediumShadow;
52     m_darkShadow = darkShadow;
53 }
54 
55 // Draw a sunken edge
DrawSunkenEdge(wxDC & dc,const wxRect & rect,int WXUNUSED (borderSize))56 void wxEffects::DrawSunkenEdge(wxDC& dc, const wxRect& rect, int WXUNUSED(borderSize))
57 {
58     wxPen highlightPen(m_highlightColour, 1, wxSOLID);
59     wxPen lightShadowPen(m_lightShadow, 1, wxSOLID);
60     wxPen facePen(m_faceColour, 1, wxSOLID);
61     wxPen mediumShadowPen(m_mediumShadow, 1, wxSOLID);
62     wxPen darkShadowPen(m_darkShadow, 1, wxSOLID);
63 
64     //// LEFT AND TOP
65     // Draw a medium shadow pen on left and top, followed by dark shadow line to
66     // right and below of these lines
67 
68     dc.SetPen(mediumShadowPen);
69     dc.DrawLine(rect.x, rect.y, rect.x+rect.width-1, rect.y); // Top
70     dc.DrawLine(rect.x, rect.y, rect.x, rect.y+rect.height-1); // Left
71 
72     dc.SetPen(darkShadowPen);
73     dc.DrawLine(rect.x+1, rect.y+1, rect.x+rect.width-2, rect.y+1); // Top
74     dc.DrawLine(rect.x+1, rect.y+1, rect.x+1, rect.y+rect.height-1); // Left
75 
76     //// RIGHT AND BOTTOM
77 
78     dc.SetPen(highlightPen);
79     dc.DrawLine(rect.x+rect.width-1, rect.y, rect.x+rect.width-1, rect.y+rect.height-1); // Right
80     dc.DrawLine(rect.x, rect.y+rect.height-1, rect.x+rect.width, rect.y+rect.height-1); // Bottom
81 
82     dc.SetPen(lightShadowPen);
83     dc.DrawLine(rect.x+rect.width-2, rect.y+1, rect.x+rect.width-2, rect.y+rect.height-2); // Right
84     dc.DrawLine(rect.x+1, rect.y+rect.height-2, rect.x+rect.width-1, rect.y+rect.height-2); // Bottom
85 
86     dc.SetPen(wxNullPen);
87 }
88 
TileBitmap(const wxRect & rect,wxDC & dc,const wxBitmap & bitmap)89 bool wxEffects::TileBitmap(const wxRect& rect, wxDC& dc, const wxBitmap& bitmap)
90 {
91     int w = bitmap.GetWidth();
92     int h = bitmap.GetHeight();
93 
94     wxMemoryDC dcMem;
95 
96 #if wxUSE_PALETTE
97     static bool hiColour = (wxDisplayDepth() >= 16) ;
98     if (bitmap.GetPalette() && !hiColour)
99     {
100         dc.SetPalette(* bitmap.GetPalette());
101         dcMem.SetPalette(* bitmap.GetPalette());
102     }
103 #endif // wxUSE_PALETTE
104 
105     dcMem.SelectObjectAsSource(bitmap);
106 
107     int i, j;
108     for (i = rect.x; i < rect.x + rect.width; i += w)
109     {
110         for (j = rect.y; j < rect.y + rect.height; j+= h)
111             dc.Blit(i, j, bitmap.GetWidth(), bitmap.GetHeight(), & dcMem, 0, 0);
112     }
113     dcMem.SelectObject(wxNullBitmap);
114 
115 #if wxUSE_PALETTE
116     if (bitmap.GetPalette() && !hiColour)
117     {
118         dc.SetPalette(wxNullPalette);
119         dcMem.SetPalette(wxNullPalette);
120     }
121 #endif // wxUSE_PALETTE
122 
123     return true;
124 }
125