]>
git.saurik.com Git - wxWidgets.git/blob - src/dfb/dc.cpp
d8d9176e836d8e73cf6828a4c83bbe93f1fee12d
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/dfb/dc.cpp
4 // Author: Vaclav Slavik
7 // Copyright: (c) 2006 REA Elektronik GmbH
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
11 // ===========================================================================
13 // ===========================================================================
15 // ---------------------------------------------------------------------------
17 // ---------------------------------------------------------------------------
19 // For compilers that support precompilation, includes "wx.h".
20 #include "wx/wxprec.h"
31 #include "wx/dfb/private.h"
33 // these values are used to initialize newly created DC
34 #define DEFAULT_FONT (*wxNORMAL_FONT)
35 #define DEFAULT_PEN (*wxBLACK_PEN)
36 #define DEFAULT_BRUSH (*wxWHITE_BRUSH)
38 // ===========================================================================
40 // ===========================================================================
42 //-----------------------------------------------------------------------------
44 //-----------------------------------------------------------------------------
46 IMPLEMENT_ABSTRACT_CLASS(wxDC
, wxDCBase
)
48 // Default constructor
54 wxDC::wxDC(const wxIDirectFBSurfacePtr
& surface
)
59 void wxDC::DFBInit(const wxIDirectFBSurfacePtr
& surface
)
61 m_ok
= (surface
!= NULL
);
62 wxCHECK_RET( surface
!= NULL
, _T("invalid surface") );
66 m_mm_to_pix_x
= (double)wxGetDisplaySize().GetWidth() /
67 (double)wxGetDisplaySizeMM().GetWidth();
68 m_mm_to_pix_y
= (double)wxGetDisplaySize().GetHeight() /
69 (double)wxGetDisplaySizeMM().GetHeight();
71 SetFont(DEFAULT_FONT
);
73 SetBrush(DEFAULT_BRUSH
);
77 // ---------------------------------------------------------------------------
79 // ---------------------------------------------------------------------------
81 void wxDC::DoSetClippingRegion(wxCoord cx
, wxCoord cy
, wxCoord cw
, wxCoord ch
)
83 wxCHECK_RET( Ok(), wxT("invalid dc") );
85 wxSize
size(GetSize());
87 wxASSERT_MSG( !m_clipping
,
88 _T("narrowing clipping region not implemented yet") );
90 // NB: We intersect the clipping rectangle with surface's area here because
91 // DirectFB will return an error if you try to set clipping rectangle
92 // that is partially outside of the surface.
94 r
.x1
= wxMax(0, XLOG2DEV(cx
));
95 r
.y1
= wxMax(0, YLOG2DEV(cy
));
96 r
.x2
= wxMin(r
.x1
+ XLOG2DEVREL(cw
), size
.x
) - 1;
97 r
.y2
= wxMin(r
.y1
+ YLOG2DEVREL(ch
), size
.y
) - 1;
99 if ( !m_surface
->SetClip(&r
) )
104 m_clipX2
= cx
+ cw
- 1;
105 m_clipY2
= cy
+ ch
-1;
109 void wxDC::DoSetClippingRegionAsRegion(const wxRegion
& region
)
111 // NB: this can be done because wxDFB only supports rectangular regions
112 SetClippingRegion(region
.AsRect());
115 void wxDC::DestroyClippingRegion()
117 wxCHECK_RET( Ok(), wxT("invalid dc") );
119 m_surface
->SetClip(NULL
);
124 // ---------------------------------------------------------------------------
125 // query capabilities
126 // ---------------------------------------------------------------------------
128 int wxDC::GetDepth() const
130 return m_surface
->GetDepth();
133 // ---------------------------------------------------------------------------
135 // ---------------------------------------------------------------------------
139 wxCHECK_RET( Ok(), wxT("invalid dc") );
141 if ( m_backgroundBrush
.GetStyle() == wxTRANSPARENT
)
144 wxColour clr
= m_backgroundBrush
.GetColour();
145 m_surface
->Clear(clr
.Red(), clr
.Green(), clr
.Blue(), clr
.Alpha());
147 wxSize
size(GetSize());
148 CalcBoundingBox(XDEV2LOG(0), YDEV2LOG(0));
149 CalcBoundingBox(XDEV2LOG(size
.x
), YDEV2LOG(size
.y
));
152 extern bool wxDoFloodFill(wxDC
*dc
, wxCoord x
, wxCoord y
,
153 const wxColour
& col
, int style
);
155 bool wxDC::DoFloodFill(wxCoord x
, wxCoord y
,
156 const wxColour
& col
, int style
)
158 return wxDoFloodFill(this, x
, y
, col
, style
);
161 bool wxDC::DoGetPixel(wxCoord x
, wxCoord y
, wxColour
*col
) const
163 wxCHECK_MSG( col
, false, _T("NULL colour parameter in wxDC::GetPixel"));
165 wxFAIL_MSG( _T("GetPixel not implemented") );
169 void wxDC::DoCrossHair(wxCoord x
, wxCoord y
)
171 wxCHECK_RET( Ok(), wxT("invalid dc") );
173 wxFAIL_MSG( _T("CrossHair not implemented") );
176 void wxDC::DoDrawLine(wxCoord x1
, wxCoord y1
, wxCoord x2
, wxCoord y2
)
178 wxCHECK_RET( Ok(), wxT("invalid dc") );
180 if ( m_pen
.GetStyle() == wxTRANSPARENT
)
183 wxCoord xx1
= XLOG2DEV(x1
);
184 wxCoord yy1
= YLOG2DEV(y1
);
185 wxCoord xx2
= XLOG2DEV(x2
);
186 wxCoord yy2
= YLOG2DEV(y2
);
188 // FIXME: DrawLine() shouldn't draw the last pixel, but DFB's DrawLine()
189 // does draw it. We should undo any change to the last pixel by
190 // using GetPixel() and PutPixel(), but until they are implemented,
191 // handle at least the special case of vertical and horizontal
197 else if ( yy1
> yy2
)
204 else if ( xx1
> xx2
)
208 m_surface
->DrawLine(xx1
, yy1
, xx2
, yy2
);
210 CalcBoundingBox(x1
, y1
);
211 CalcBoundingBox(x2
, y2
);
214 // Draws an arc of a circle, centred on (xc, yc), with starting point (x1, y1)
215 // and ending at (x2, y2)
216 void wxDC::DoDrawArc(wxCoord x1
, wxCoord y1
,
217 wxCoord x2
, wxCoord y2
,
218 wxCoord xc
, wxCoord yc
)
220 wxCHECK_RET( Ok(), wxT("invalid dc") );
222 wxFAIL_MSG( _T("DrawArc not implemented") );
225 void wxDC::DoDrawPoint(wxCoord x
, wxCoord y
)
227 wxCHECK_RET( Ok(), wxT("invalid dc") );
229 // NB: DirectFB API doesn't provide a function for drawing points, so
230 // implement it as 1px long line. This is inefficient, but then, so is
231 // using DrawPoint() for drawing more than a few points.
232 DoDrawLine(x
, y
, x
, y
);
234 // FIXME_DFB: implement special cases for common formats (RGB24,RGBA/RGB32)
237 void wxDC::DoDrawPolygon(int n
, wxPoint points
[], wxCoord xoffset
, wxCoord yoffset
,int WXUNUSED(fillStyle
))
239 wxCHECK_RET( Ok(), wxT("invalid dc") );
241 wxFAIL_MSG( _T("DrawPolygon not implemented") );
244 void wxDC::DoDrawLines(int n
, wxPoint points
[], wxCoord xoffset
, wxCoord yoffset
)
246 wxCHECK_RET( Ok(), wxT("invalid dc") );
248 // TODO: impl. using DirectDB's DrawLines
249 wxFAIL_MSG( _T("DrawLines not implemented") );
252 void wxDC::DoDrawRectangle(wxCoord x
, wxCoord y
, wxCoord width
, wxCoord height
)
254 wxCHECK_RET( Ok(), wxT("invalid dc") );
256 wxCoord xx
= XLOG2DEV(x
);
257 wxCoord yy
= YLOG2DEV(y
);
258 wxCoord ww
= m_signX
* XLOG2DEVREL(width
);
259 wxCoord hh
= m_signY
* YLOG2DEVREL(height
);
261 if ( ww
== 0 || hh
== 0 ) return;
274 if ( m_brush
.GetStyle() != wxTRANSPARENT
)
276 SelectColour(m_brush
.GetColour());
277 m_surface
->FillRectangle(xx
, yy
, ww
, hh
);
278 // restore pen's colour, because other drawing functions expect the
279 // colour to be set to the pen:
280 SelectColour(m_pen
.GetColour());
283 if ( m_pen
.GetStyle() != wxTRANSPARENT
)
285 m_surface
->DrawRectangle(xx
, yy
, ww
, hh
);
288 CalcBoundingBox(x
, y
);
289 CalcBoundingBox(x
+ width
, y
+ height
);
292 void wxDC::DoDrawRoundedRectangle(wxCoord x
, wxCoord y
, wxCoord width
, wxCoord height
, double radius
)
294 wxCHECK_RET( Ok(), wxT("invalid dc") );
296 wxFAIL_MSG( _T("DrawRoundedRectangle not implemented") );
299 void wxDC::DoDrawEllipse(wxCoord x
, wxCoord y
, wxCoord width
, wxCoord height
)
301 wxCHECK_RET( Ok(), wxT("invalid dc") );
303 wxFAIL_MSG( _T("DrawElipse not implemented") );
306 void wxDC::DoDrawEllipticArc(wxCoord x
,wxCoord y
,wxCoord w
,wxCoord h
,double sa
,double ea
)
308 wxCHECK_RET( Ok(), wxT("invalid dc") );
310 wxFAIL_MSG( _T("DrawElipticArc not implemented") );
313 void wxDC::DoDrawText(const wxString
& text
, wxCoord x
, wxCoord y
)
315 wxCHECK_RET( Ok(), wxT("invalid dc") );
317 wxCoord xx
= XLOG2DEV(x
);
318 wxCoord yy
= YLOG2DEV(y
);
320 // update the bounding box
322 CalcBoundingBox(x
, y
);
323 GetTextExtent(text
, &w
, &h
);
324 CalcBoundingBox(x
+ w
, y
+ h
);
326 // if background mode is solid, DrawText must paint text's background:
327 if ( m_backgroundMode
== wxSOLID
)
329 wxCHECK_RET( m_textBackgroundColour
.Ok(),
330 wxT("invalid background color") );
332 SelectColour(m_textBackgroundColour
);
333 m_surface
->FillRectangle(xx
, yy
, XLOG2DEVREL(w
), YLOG2DEVREL(h
));
336 // finally draw the text itself:
337 wxCHECK_RET( m_textForegroundColour
.Ok(),
338 wxT("invalid foreground color") );
339 SelectColour(m_textForegroundColour
);
340 m_surface
->DrawString(wxSTR_TO_DFB(text
), -1, xx
, yy
, DSTF_LEFT
| DSTF_TOP
);
342 // restore pen's colour, because other drawing functions expect the colour
343 // to be set to the pen:
344 SelectColour(m_pen
.GetColour());
347 void wxDC::DoDrawRotatedText(const wxString
& text
,
348 wxCoord x
, wxCoord y
,
351 wxCHECK_RET( Ok(), wxT("invalid dc") );
353 wxFAIL_MSG( _T("DrawRotatedText not implemented") );
356 // ---------------------------------------------------------------------------
358 // ---------------------------------------------------------------------------
360 void wxDC::SetPen(const wxPen
& pen
)
362 m_pen
= pen
.Ok() ? pen
: DEFAULT_PEN
;
364 SelectColour(m_pen
.GetColour());
367 void wxDC::SetBrush(const wxBrush
& brush
)
369 m_brush
= brush
.Ok() ? brush
: DEFAULT_BRUSH
;
372 void wxDC::SelectColour(const wxColour
& clr
)
374 m_surface
->SetColor(clr
.Red(), clr
.Green(), clr
.Blue(), clr
.Alpha());
375 #warning "use SetColorIndex?"
379 void wxDC::SetPalette(const wxPalette
& WXUNUSED(palette
))
381 wxCHECK_RET( Ok(), wxT("invalid dc") );
383 wxFAIL_MSG( _T("SetPalette not implemented") );
385 #endif // wxUSE_PALETTE
387 void wxDC::SetFont(const wxFont
& font
)
389 wxCHECK_RET( Ok(), wxT("invalid dc") );
391 wxFont
f(font
.Ok() ? font
: DEFAULT_FONT
);
393 if ( !m_surface
->SetFont(f
.GetDirectFBFont()) )
399 void wxDC::SetBackground(const wxBrush
& brush
)
401 wxCHECK_RET( Ok(), wxT("invalid dc") );
403 if (!brush
.Ok()) return;
405 m_backgroundBrush
= brush
;
408 void wxDC::SetBackgroundMode(int mode
)
410 m_backgroundMode
= mode
;
413 void wxDC::SetLogicalFunction(int function
)
415 wxCHECK_RET( Ok(), wxT("invalid dc") );
417 // NB: we could also support XOR, but for blitting only (via DSBLIT_XOR);
418 // and possibly others via SetSrc/DstBlendFunction()
419 wxASSERT_MSG( function
== wxCOPY
,
420 _T("only wxCOPY logical function supported") );
422 m_logicalFunction
= function
;
425 bool wxDC::StartDoc(const wxString
& WXUNUSED(message
))
427 // We might be previewing, so return true to let it continue.
435 void wxDC::StartPage()
443 // ---------------------------------------------------------------------------
445 // ---------------------------------------------------------------------------
447 wxCoord
wxDC::GetCharHeight() const
449 wxCHECK_MSG( Ok(), -1, wxT("invalid dc") );
450 wxCHECK_MSG( m_font
.Ok(), -1, wxT("no font selected") );
453 m_font
.GetDirectFBFont()->GetHeight(&h
);
454 return YDEV2LOGREL(h
);
457 wxCoord
wxDC::GetCharWidth() const
459 wxCHECK_MSG( Ok(), -1, wxT("invalid dc") );
460 wxCHECK_MSG( m_font
.Ok(), -1, wxT("no font selected") );
463 m_font
.GetDirectFBFont()->GetStringWidth("H", 1, &w
);
464 // VS: YDEV is corrent, it should *not* be XDEV, because font's are only
465 // scaled according to m_scaleY
466 return YDEV2LOGREL(w
);
469 void wxDC::DoGetTextExtent(const wxString
& string
, wxCoord
*x
, wxCoord
*y
,
470 wxCoord
*descent
, wxCoord
*externalLeading
,
471 wxFont
*theFont
) const
473 wxCHECK_RET( Ok(), wxT("invalid dc") );
474 wxCHECK_RET( m_font
.Ok(), wxT("no font selected") );
475 wxCHECK_RET( !theFont
|| theFont
->Ok(), wxT("invalid font") );
478 if ( theFont
!= NULL
)
481 wxConstCast(this, wxDC
)->SetFont(*theFont
);
484 wxCoord xx
= 0, yy
= 0;
486 wxIDirectFBFontPtr f
= m_font
.GetDirectFBFont();
488 if ( f
->GetStringExtents(wxSTR_TO_DFB(string
), -1, &rect
, NULL
) )
490 // VS: YDEV is corrent, it should *not* be XDEV, because font's are
491 // only scaled according to m_scaleY
492 xx
= YDEV2LOGREL(rect
.w
);
493 yy
= YDEV2LOGREL(rect
.h
);
498 if ( f
->GetDescender(&d
) )
499 *descent
= YDEV2LOGREL(-d
);
507 if ( externalLeading
) *externalLeading
= 0;
509 if ( theFont
!= NULL
)
510 wxConstCast(this, wxDC
)->SetFont(oldFont
);
515 // ---------------------------------------------------------------------------
517 // ---------------------------------------------------------------------------
519 void wxDC::ComputeScaleAndOrigin()
521 m_scaleX
= m_logicalScaleX
* m_userScaleX
;
522 m_scaleY
= m_logicalScaleY
* m_userScaleY
;
524 // FIXME_DFB: scaling affects pixel size of font, pens, brushes, which
525 // is not currently implemented here; probably makes sense to
526 // switch to Cairo instead of implementing everything for DFB
527 wxASSERT_MSG( m_scaleX
== 1.0 && m_scaleY
== 1.0,
528 _T("scaling is not implemented in wxDFB") );
531 void wxDC::SetMapMode(int mode
)
533 #warning "move this to common code, it's shared by almost all ports!"
537 SetLogicalScale(twips2mm
*m_mm_to_pix_x
, twips2mm
*m_mm_to_pix_y
);
540 SetLogicalScale(pt2mm
*m_mm_to_pix_x
, pt2mm
*m_mm_to_pix_y
);
543 SetLogicalScale(m_mm_to_pix_x
, m_mm_to_pix_y
);
546 SetLogicalScale(m_mm_to_pix_x
/10.0, m_mm_to_pix_y
/10.0);
550 SetLogicalScale(1.0, 1.0);
553 m_mappingMode
= mode
;
556 void wxDC::SetUserScale(double x
, double y
)
558 #warning "move this to common code?"
559 // allow negative ? -> no
562 ComputeScaleAndOrigin();
565 void wxDC::SetLogicalScale(double x
, double y
)
567 #warning "move this to common code?"
571 ComputeScaleAndOrigin();
574 void wxDC::SetLogicalOrigin( wxCoord x
, wxCoord y
)
576 #warning "move this to common code?"
577 m_logicalOriginX
= x
* m_signX
; // is this still correct ?
578 m_logicalOriginY
= y
* m_signY
;
579 ComputeScaleAndOrigin();
582 void wxDC::SetDeviceOrigin( wxCoord x
, wxCoord y
)
584 #warning "move this to common code?"
585 // only wxPostScripDC has m_signX = -1, we override SetDeviceOrigin there
588 ComputeScaleAndOrigin();
591 void wxDC::SetAxisOrientation( bool xLeftRight
, bool yBottomUp
)
593 #warning "move this to common code?"
594 // only wxPostScripDC has m_signX = -1, we override SetAxisOrientation there
595 m_signX
= (xLeftRight
? 1 : -1);
596 m_signY
= (yBottomUp
? -1 : 1);
597 ComputeScaleAndOrigin();
600 // ---------------------------------------------------------------------------
601 // coordinates transformations
602 // ---------------------------------------------------------------------------
604 wxCoord
wxDCBase::DeviceToLogicalX(wxCoord x
) const
606 return ((wxDC
*)this)->XDEV2LOG(x
);
609 wxCoord
wxDCBase::DeviceToLogicalY(wxCoord y
) const
611 return ((wxDC
*)this)->YDEV2LOG(y
);
614 wxCoord
wxDCBase::DeviceToLogicalXRel(wxCoord x
) const
616 return ((wxDC
*)this)->XDEV2LOGREL(x
);
619 wxCoord
wxDCBase::DeviceToLogicalYRel(wxCoord y
) const
621 return ((wxDC
*)this)->YDEV2LOGREL(y
);
624 wxCoord
wxDCBase::LogicalToDeviceX(wxCoord x
) const
626 return ((wxDC
*)this)->XLOG2DEV(x
);
629 wxCoord
wxDCBase::LogicalToDeviceY(wxCoord y
) const
631 return ((wxDC
*)this)->YLOG2DEV(y
);
634 wxCoord
wxDCBase::LogicalToDeviceXRel(wxCoord x
) const
636 return ((wxDC
*)this)->XLOG2DEVREL(x
);
639 wxCoord
wxDCBase::LogicalToDeviceYRel(wxCoord y
) const
641 return ((wxDC
*)this)->YLOG2DEVREL(y
);
645 void wxDC::DoGetSize(int *w
, int *h
) const
647 wxCHECK_RET( Ok(), wxT("invalid dc") );
649 m_surface
->GetSize(w
, h
);
652 void wxDC::DoGetSizeMM(int *width
, int *height
) const
654 #warning "move this to common code?"
658 if ( width
) *width
= int(double(w
) / (m_userScaleX
*m_mm_to_pix_x
));
659 if ( height
) *height
= int(double(h
) / (m_userScaleY
*m_mm_to_pix_y
));
662 wxSize
wxDC::GetPPI() const
664 #warning "move this to common code?"
665 return wxSize(int(double(m_mm_to_pix_x
) * inches2mm
),
666 int(double(m_mm_to_pix_y
) * inches2mm
));
670 // ---------------------------------------------------------------------------
672 // ---------------------------------------------------------------------------
674 bool wxDC::DoBlit(wxCoord xdest
, wxCoord ydest
,
675 wxCoord width
, wxCoord height
,
676 wxDC
*source
, wxCoord xsrc
, wxCoord ysrc
,
677 int rop
, bool useMask
,
678 wxCoord xsrcMask
, wxCoord ysrcMask
)
680 wxCHECK_MSG( Ok(), false, _T("invalid dc") );
681 wxCHECK_MSG( source
, false, _T("invalid source dc") );
683 // NB: we could also support XOR here (via DSBLIT_XOR)
684 // and possibly others via SetSrc/DstBlendFunction()
685 wxCHECK_MSG( rop
== wxCOPY
, false, _T("only wxCOPY function supported") );
687 // transform the source DC coords to the device ones
688 xsrc
= source
->LogicalToDeviceX(xsrc
);
689 ysrc
= source
->LogicalToDeviceY(ysrc
);
691 // FIXME_DFB: use the mask origin when drawing transparently
692 wxASSERT_MSG( xsrcMask
== -1 && ysrcMask
== -1,
693 _T("non-default source mask offset not implemented") );
695 if (xsrcMask
== -1 && ysrcMask
== -1)
697 xsrcMask
= xsrc
; ysrcMask
= ysrc
;
701 xsrcMask
= source
->LogicalToDeviceX(xsrcMask
);
702 ysrcMask
= source
->LogicalToDeviceY(ysrcMask
);
706 wxMemoryDC
*sourceAsMemDC
= wxDynamicCast(source
, wxMemoryDC
);
709 DoDrawSubBitmap(sourceAsMemDC
->GetSelectedObject(),
718 return DoBlitFromSurface(source
->GetDirectFBSurface(),
727 void wxDC::DoDrawBitmap(const wxBitmap
&bmp
, wxCoord x
, wxCoord y
, bool useMask
)
729 wxCHECK_RET( Ok(), wxT("invalid dc") );
730 wxCHECK_RET( bmp
.Ok(), wxT("invalid bitmap") );
733 0, 0, bmp
.GetWidth(), bmp
.GetHeight(),
735 m_logicalFunction
, useMask
);
738 void wxDC::DoDrawIcon(const wxIcon
& icon
, wxCoord x
, wxCoord y
)
740 // VZ: egcs 1.0.3 refuses to compile this without cast, no idea why
741 DoDrawBitmap((const wxBitmap
&)icon
, x
, y
, true);
744 void wxDC::DoDrawSubBitmap(const wxBitmap
&bmp
,
745 wxCoord x
, wxCoord y
, wxCoord w
, wxCoord h
,
746 wxCoord destx
, wxCoord desty
, int rop
, bool useMask
)
748 wxCHECK_RET( Ok(), wxT("invalid dc") );
749 wxCHECK_RET( bmp
.Ok(), wxT("invalid bitmap") );
751 // NB: we could also support XOR here (via DSBLIT_XOR)
752 // and possibly others via SetSrc/DstBlendFunction()
753 wxCHECK_RET( rop
== wxCOPY
, _T("only wxCOPY function supported") );
755 if ( bmp
.GetDepth() == 1 )
757 // Mono bitmaps are handled in special way -- all 1s are drawn in
758 // foreground colours, all 0s in background colour.
759 wxFAIL_MSG( _T("drawing mono bitmaps not implemented") );
763 if ( useMask
&& bmp
.GetMask() )
765 // FIXME_DFB: see MGL sources for a way to do it, but it's not directly
766 // applicable because DirectFB doesn't implement ROPs; OTOH,
767 // it has blitting modes that can be useful; finally, see
768 // DFB's SetSrcBlendFunction() and SetSrcColorKey()
769 wxFAIL_MSG( _T("drawing bitmaps with masks not implemented") );
773 DoBlitFromSurface(bmp
.GetDirectFBSurface(),
779 bool wxDC::DoBlitFromSurface(const wxIDirectFBSurfacePtr
& src
,
780 wxCoord srcx
, wxCoord srcy
,
781 wxCoord w
, wxCoord h
,
782 wxCoord dstx
, wxCoord dsty
)
784 // don't do anything if the source rectangle is outside of source surface,
785 // DirectFB would assert in that case:
787 src
->GetSize(&srcsize
.x
, &srcsize
.y
);
788 if ( !wxRect(srcx
, srcy
, w
, h
).Intersects(wxRect(srcsize
)) )
790 wxLogDebug(_T("Blitting from area outside of the source surface, caller code needs fixing."));
794 CalcBoundingBox(dstx
, dsty
);
795 CalcBoundingBox(dstx
+ w
, dsty
+ h
);
797 DFBRectangle srcRect
= { srcx
, srcy
, w
, h
};
798 DFBRectangle dstRect
= { XLOG2DEV(dstx
), YLOG2DEV(dsty
),
799 XLOG2DEVREL(w
), YLOG2DEVREL(h
) };
801 wxIDirectFBSurfacePtr
dst(m_surface
);
803 // FIXME: this will have to be different in useMask case, see above
804 if ( !dst
->SetBlittingFlags(DSBLIT_NOFX
) )
807 if ( srcRect
.w
!= dstRect
.w
|| srcRect
.h
!= dstRect
.h
)
809 // the bitmap is drawn stretched:
810 dst
->StretchBlit(src
, &srcRect
, &dstRect
);
814 // no stretching, size is preserved:
815 dst
->Blit(src
, &srcRect
, dstRect
.x
, dstRect
.y
);