Files
wxWidgets/src/generic/statbmpg.cpp
Tobias Taschner 58c7e6d54f Add wxStaticBitmap::SetScaleMode() to control bitmap display size
This allows a bitmap to scale with the size of the wxStaticBitmap control.
Scaling can be controlled to fill the control with or without changing the
bitmaps aspect ratio.
2016-01-20 18:55:14 +01:00

104 lines
3.0 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// Name: src/generic/statbmpg.cpp
// Purpose: wxGenericStaticBitmap
// Author: Marcin Wojdyr, Stefan Csomor
// Created: 2008-06-16
// Copyright: wxWidgets developers
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
#if wxUSE_STATBMP
#ifndef WX_PRECOMP
#include "wx/dcclient.h"
#endif
#include "wx/generic/statbmpg.h"
#if wxUSE_GRAPHICS_CONTEXT
#include "wx/graphics.h"
#include "wx/scopedptr.h"
#else
#include "wx/image.h"
#include "wx/math.h"
#endif
bool wxGenericStaticBitmap::Create(wxWindow *parent, wxWindowID id,
const wxBitmap& bitmap,
const wxPoint& pos, const wxSize& size,
long style, const wxString& name)
{
if (! wxControl::Create(parent, id, pos, size, style,
wxDefaultValidator, name))
return false;
m_scaleMode = Scale_None;
SetBitmap(bitmap);
Connect(wxEVT_PAINT, wxPaintEventHandler(wxGenericStaticBitmap::OnPaint));
return true;
}
void wxGenericStaticBitmap::OnPaint(wxPaintEvent& WXUNUSED(event))
{
if ( !m_bitmap.IsOk() )
return;
wxPaintDC dc(this);
const wxSize drawSize = GetClientSize();
const wxSize bmpSize = m_bitmap.GetSize();
wxDouble w = 0;
wxDouble h = 0;
switch ( m_scaleMode )
{
case Scale_None:
dc.DrawBitmap(m_bitmap, 0, 0, true);
return;
case Scale_Fill:
w = drawSize.x;
h = drawSize.y;
break;
case Scale_AspectFill:
case Scale_AspectFit:
{
wxDouble scaleFactor;
wxDouble scaleX = (wxDouble)drawSize.x / (wxDouble)bmpSize.x;
wxDouble scaleY = (wxDouble)drawSize.y / (wxDouble)bmpSize.y;
if ( ( m_scaleMode == Scale_AspectFit && scaleY < scaleX ) ||
( m_scaleMode == Scale_AspectFill && scaleY > scaleX ) )
scaleFactor = scaleY;
else
scaleFactor = scaleX;
w = bmpSize.x * scaleFactor;
h = bmpSize.y * scaleFactor;
break;
}
}
wxASSERT_MSG(w, wxS("Unknown scale mode"));
wxDouble x = (drawSize.x - w) / 2;
wxDouble y = (drawSize.y - h) / 2;
#if wxUSE_GRAPHICS_CONTEXT
wxScopedPtr<wxGraphicsContext> const
gc(wxGraphicsRenderer::GetDefaultRenderer()->CreateContext(dc));
gc->DrawBitmap(m_bitmap, x, y, w, h);
#else
wxImage img = m_bitmap.ConvertToImage();
img.Rescale(wxRound(w), wxRound(h), wxIMAGE_QUALITY_HIGH);
dc.DrawBitmap(wxBitmap(img), wxRound(x), wxRound(y), true);
#endif
}
// under OSX_cocoa is a define, avoid duplicate info
#ifndef wxGenericStaticBitmap
wxIMPLEMENT_DYNAMIC_CLASS(wxGenericStaticBitmap, wxStaticBitmapBase);
#endif
#endif // wxUSE_STATBMP