From 6fb68b835cd0c28c53e717fe401babbdc098b1b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Wed, 23 Mar 2005 22:34:45 +0000 Subject: [PATCH] added missing string rendering functions, on Haiku, there should be support for drawing bitmaps in all colorspaces that BBitmap::ImportBits knows how to convert to B_RGB32 git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@11965 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/server/Painter/Painter.cpp | 85 ++++++++++++++++++++-- 1 file changed, 80 insertions(+), 5 deletions(-) diff --git a/src/servers/app/server/Painter/Painter.cpp b/src/servers/app/server/Painter/Painter.cpp index 609038ddb7..8b4fd7c8cf 100644 --- a/src/servers/app/server/Painter/Painter.cpp +++ b/src/servers/app/server/Painter/Painter.cpp @@ -243,6 +243,21 @@ Painter::SetFont(const BFont& font) _UpdateFont(); } +// SetFont +void +Painter::SetFont(const ServerFont& font) +{ + // NOTE: this is just a transitional function + // to help integrate Painter with app_server later + fFont.SetFamilyAndStyle(font.GetFamily(), font.GetStyle()); + fFont.SetSpacing(font.Spacing()); + fFont.SetShear(font.Shear()); + fFont.SetRotation(font.Rotation()); + fFont.SetSize(font.Size()); + + _UpdateFont(); +} + // #pragma mark - // StrokeLine @@ -540,18 +555,38 @@ Painter::FillArc(BPoint center, float xRadius, float yRadius, // #pragma mark - -// DrawString +// DrawChar void -Painter::DrawString(const char* utf8String, const escapement_delta* delta) +Painter::DrawChar(char aChar) { // TODO: to be moved elsewhere - DrawString(utf8String, fPenLocation, delta); + DrawChar(aChar, fPenLocation); +} + +// DrawChar +void +Painter::DrawChar(char aChar, BPoint baseLine) +{ + // TODO: to be moved elsewhere + char wrapper[2]; + wrapper[0] = aChar; + wrapper[1] = 0; + DrawString(wrapper, 1, baseLine); } // DrawString void -Painter::DrawString(const char* utf8String, BPoint baseLine, +Painter::DrawString(const char* utf8String, uint32 length, const escapement_delta* delta) +{ + // TODO: to be moved elsewhere + DrawString(utf8String, length, fPenLocation, delta); +} + +// DrawString +void +Painter::DrawString(const char* utf8String, uint32 length, + BPoint baseLine, const escapement_delta* delta) { fPatternHandler->SetPattern(B_SOLID_HIGH); @@ -564,6 +599,7 @@ Painter::DrawString(const char* utf8String, BPoint baseLine, transform.TranslateBy(fOrigin); fTextRenderer->RenderString(utf8String, + length, fFontRendererSolid, fFontRendererBin, transform, @@ -576,6 +612,23 @@ Painter::DrawString(const char* utf8String, BPoint baseLine, transform.Transform(&fPenLocation); } +// DrawString +void +Painter::DrawString(const char* utf8String, const escapement_delta* delta) +{ + // TODO: to be moved elsewhere + DrawString(utf8String, strlen(utf8String), fPenLocation, delta); +} + +// DrawString +void +Painter::DrawString(const char* utf8String, BPoint baseLine, + const escapement_delta* delta) +{ + // TODO: to be moved elsewhere + DrawString(utf8String, strlen(utf8String), baseLine, delta); +} + // #pragma mark - // DrawBitmap @@ -933,7 +986,29 @@ Painter::_DrawBitmap(const agg::rendering_buffer& srcBuffer, color_space format, _DrawBitmap32(srcBuffer, actualBitmapRect, bitmapRect, viewRect); break; default: -fprintf(stderr, "Painter::DrawBitmap() - unsupported colorspace: %d\n", format); +fprintf(stderr, "Painter::_DrawBitmap() - non-native colorspace: %d\n", format); +#ifdef __HAIKU__ + // TODO: this is only a temporary implementation, + // to really handle other colorspaces, one would + // rather do the conversion with much less overhead, + // for example in the nn filter (hm), or in the + // scanline generator + BBitmap temp(actualBitmapRect, 0, B_RGB32); + status_t err = temp.ImportBits(srcBuffer.buf(), + srcBuffer.height() * srcBuffer.stride(), + srcBuffer.stride(), + 0, format); + if (err >= B_OK) { + agg::rendering_buffer convertedBuffer; + convertedBuffer.attach((uint8*)temp.Bits(), + (uint32)actualBitmapRect.IntegerWidth() + 1, + (uint32)actualBitmapRect.IntegerHeight() + 1, + temp.BytesPerRow()); + _DrawBitmap32(convertedBuffer, actualBitmapRect, bitmapRect, viewRect); + } else { +fprintf(stderr, "Painter::_DrawBitmap() - colorspace conversion failed: %s\n", strerror(err)); + } +#endif // __HAIKU__ break; } }