diff --git a/src/servers/app/drawing/DisplayDriverPainter.cpp b/src/servers/app/drawing/DisplayDriverPainter.cpp index a6de4ea907..7b20f1a0c0 100644 --- a/src/servers/app/drawing/DisplayDriverPainter.cpp +++ b/src/servers/app/drawing/DisplayDriverPainter.cpp @@ -1093,7 +1093,7 @@ DisplayDriverPainter::DrawString(const char* string, int32 length, // TODO: make the availability of the hardware cursor part of the // HW acceleration flags and skip all calculations for HideSoftwareCursor // in case we don't have one. - BRect b = fPainter->BoundingBox(string, length, pt); + BRect b = fPainter->BoundingBox(string, length, pt, delta); // stop here if we're supposed to render outside of the clipping b = fPainter->ClipRect(b); if (b.IsValid()) { diff --git a/src/servers/app/drawing/Painter/Painter.cpp b/src/servers/app/drawing/Painter/Painter.cpp index 5dcf780d89..f018c59e5f 100644 --- a/src/servers/app/drawing/Painter/Painter.cpp +++ b/src/servers/app/drawing/Painter/Painter.cpp @@ -899,7 +899,8 @@ Painter::DrawString(const char* utf8String, uint32 length, baseLine, fClippingRegion->Frame(), false, - &fPenLocation); + &fPenLocation, + delta); } return _Clipped(bounds); } @@ -985,14 +986,16 @@ Painter::InvertRect(const BRect& r) const // BoundingBox BRect Painter::BoundingBox(const char* utf8String, uint32 length, - const BPoint& baseLine) const + const BPoint& baseLine, const escapement_delta* delta) const { static BRect dummy; + BPoint penPosition; return fTextRenderer->RenderString(utf8String, length, fFontRendererSolid, fFontRendererBin, - baseLine, dummy, true); + baseLine, dummy, true, &penPosition, + delta); } // StringWidth diff --git a/src/servers/app/drawing/Painter/Painter.h b/src/servers/app/drawing/Painter/Painter.h index cd0c74951c..70d872ea76 100644 --- a/src/servers/app/drawing/Painter/Painter.h +++ b/src/servers/app/drawing/Painter/Painter.h @@ -204,9 +204,8 @@ class Painter { BRect InvertRect( const BRect& r) const; - BRect BoundingBox( const char* utf8String, - uint32 length, - const BPoint& baseLine) const; + BRect BoundingBox( const char* utf8String, uint32 length, + const BPoint& baseLine, const escapement_delta* delta = NULL) const; float StringWidth( const char* utf8String, uint32 length) const; diff --git a/src/servers/app/drawing/Painter/font_support/AGGTextRenderer.cpp b/src/servers/app/drawing/Painter/font_support/AGGTextRenderer.cpp index 80a0e0214a..a4b76a0b8a 100644 --- a/src/servers/app/drawing/Painter/font_support/AGGTextRenderer.cpp +++ b/src/servers/app/drawing/Painter/font_support/AGGTextRenderer.cpp @@ -41,6 +41,17 @@ rect_to_int(BRect r, bottom = (int32)ceilf(r.bottom); } + +// is_white_space +inline bool +is_white_space(uint16 glyph) +{ + // TODO: handle them all! + if (glyph == ' ' || glyph == B_TAB) + return true; + return false; +} + #define DEFAULT_UNI_CODE_BUFFER_SIZE 2048 // constructor @@ -150,7 +161,8 @@ AGGTextRenderer::RenderString(const char* string, const BPoint& baseLine, const BRect& clippingFrame, bool dryRun, - BPoint* nextCharPos) + BPoint* nextCharPos, + const escapement_delta* delta) { //printf("RenderString(\"%s\", length: %ld, dry: %d)\n", string, length, dryRun); @@ -210,6 +222,9 @@ AGGTextRenderer::RenderString(const char* string, x += advanceX; y += advanceY; + if (delta) + x += is_white_space(*p) ? delta->space : delta->nonspace; + // "glyphBounds" is the bounds of the glyph transformed // by the x y location of the glyph along the base line, // it is therefor yet "untransformed". diff --git a/src/servers/app/drawing/Painter/font_support/AGGTextRenderer.h b/src/servers/app/drawing/Painter/font_support/AGGTextRenderer.h index 7357a8720c..b8aaa6c9f9 100644 --- a/src/servers/app/drawing/Painter/font_support/AGGTextRenderer.h +++ b/src/servers/app/drawing/Painter/font_support/AGGTextRenderer.h @@ -41,7 +41,8 @@ class AGGTextRenderer { const BPoint& baseLine, const BRect& clippingFrame, bool dryRun = false, - BPoint* nextCharPos = NULL); + BPoint* nextCharPos = NULL, + const escapement_delta* delta = NULL); double StringWidth(const char* utf8String, uint32 length);