When a BBitmap is drawn with scale, but also only partly, the inverse

image scan generator matrix was calculated wrongly. The part of the offset
that lies within the bitmap bounds needs to have the scale applied as well.
Maybe this code can be simplified. Appearantly there is not a lot of code
that uses BBitmap drawing this way, perhaps because the R5 version has had
issues with rounding. But MediaPlayer uses this feature for drawing the peak
levels and this is fixed by this change.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26324 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus 2008-07-08 17:48:30 +00:00
parent 93016537eb
commit fc8e77f863

View File

@ -45,6 +45,13 @@
#include "Painter.h"
//#define TRACE_PAINTER
#ifdef TRACE_PAINTER
# define TRACE(x...) printf(x)
#else
# define TRACE(x...)
#endif
#define CHECK_CLIPPING if (!fValidClipping) return BRect(0, 0, -1, -1);
#define CHECK_CLIPPING_NO_RETURN if (!fValidClipping) return;
@ -1049,6 +1056,16 @@ Painter::DrawBitmap(const ServerBitmap* bitmap,
// the native bitmap coordinate system
BRect actualBitmapRect(bitmap->Bounds());
TRACE("Painter::DrawBitmap()\n");
TRACE(" actualBitmapRect = (%.1f, %.1f) - (%.1f, %.1f)\n",
actualBitmapRect.left, actualBitmapRect.top,
actualBitmapRect.right, actualBitmapRect.bottom);
TRACE(" bitmapRect = (%.1f, %.1f) - (%.1f, %.1f)\n",
bitmapRect.left, bitmapRect.top, bitmapRect.right,
bitmapRect.bottom);
TRACE(" viewRect = (%.1f, %.1f) - (%.1f, %.1f)\n",
viewRect.left, viewRect.top, viewRect.right, viewRect.bottom);
agg::rendering_buffer srcBuffer;
srcBuffer.attach(bitmap->Bits(),
bitmap->Width(),
@ -1304,10 +1321,16 @@ Painter::_DrawBitmap(agg::rendering_buffer& srcBuffer, color_space format,
}
if (!fSubpixelPrecise) {
align_rect_to_pixels(&viewRect);
align_rect_to_pixels(&bitmapRect);
align_rect_to_pixels(&viewRect);
}
TRACE("Painter::_DrawBitmap()\n");
TRACE(" bitmapRect = (%.1f, %.1f) - (%.1f, %.1f)\n",
bitmapRect.left, bitmapRect.top, bitmapRect.right, bitmapRect.bottom);
TRACE(" viewRect = (%.1f, %.1f) - (%.1f, %.1f)\n",
viewRect.left, viewRect.top, viewRect.right, viewRect.bottom);
double xScale = (viewRect.Width() + 1) / (bitmapRect.Width() + 1);
double yScale = (viewRect.Height() + 1) / (bitmapRect.Height() + 1);
@ -1512,6 +1535,11 @@ Painter::_DrawBitmapGeneric32(agg::rendering_buffer& srcBuffer,
double xScale, double yScale,
BRect viewRect) const
{
TRACE("Painter::_DrawBitmapGeneric32()\n");
TRACE(" offset: %.1f, %.1f\n", xOffset, yOffset);
TRACE(" scale: %.3f, %.3f\n", xScale, yScale);
TRACE(" viewRect: (%.1f, %.1f) - (%.1f, %.1f)\n",
viewRect.left, viewRect.top, viewRect.right, viewRect.bottom);
// AGG pipeline
// pixel format attached to bitmap
@ -1524,8 +1552,10 @@ Painter::_DrawBitmapGeneric32(agg::rendering_buffer& srcBuffer,
// -actualBitmapRect.top);
agg::trans_affine imgMatrix;
imgMatrix *= agg::trans_affine_translation(xOffset - viewRect.left,
yOffset - viewRect.top);
imgMatrix *= agg::trans_affine_scaling(xScale, yScale);
imgMatrix *= agg::trans_affine_translation(xOffset, yOffset);
imgMatrix *= agg::trans_affine_translation(viewRect.left, viewRect.top);
imgMatrix.invert();
// image interpolator