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 32IMPLEMENT_CLASS(wxEffects, wxObject) 33 34// Assume system colours 35wxEffects::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 45wxEffects::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 56void 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 89bool 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