From 2f23ef90dd1c72779c09cdb5fd035a636f41538b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 25 Aug 2005 15:21:34 +0000 Subject: [PATCH] added GetBoundingBoxesAsGlyph, GetBoundingBoxesAsString, GetBoundingBoxesAsStrings real implementation with freetype still missing git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14062 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/servers/app/ServerFont.h | 8 ++ src/kits/interface/Font.cpp | 16 ++- src/servers/app/ServerApp.cpp | 141 +++++++++++++++++++++++ src/servers/app/ServerFont.cpp | 35 ++++++ 4 files changed, 198 insertions(+), 2 deletions(-) diff --git a/headers/private/servers/app/ServerFont.h b/headers/private/servers/app/ServerFont.h index 0930014590..554f2a5f72 100644 --- a/headers/private/servers/app/ServerFont.h +++ b/headers/private/servers/app/ServerFont.h @@ -130,6 +130,14 @@ class ServerFont { float widthArray[], escapement_delta delta) const; + bool GetBoundingBoxesAsString(const char charArray[], + int32 numChars, BRect rectArray[], + font_metric_mode mode, escapement_delta delta); + + bool GetBoundingBoxesAsStrings(char *charArray[], int32 lengthArray[], + int32 numStrings, BRect rectArray[], + font_metric_mode mode, escapement_delta deltaArray[]); + float StringWidth(const char* string, int32 numBytes) const; FT_Face GetFTFace() const diff --git a/src/kits/interface/Font.cpp b/src/kits/interface/Font.cpp index 99e6cc2085..8b42071ce2 100644 --- a/src/kits/interface/Font.cpp +++ b/src/kits/interface/Font.cpp @@ -1039,7 +1039,7 @@ void BFont::GetBoundingBoxesAsGlyphs(const char charArray[], int32 numChars, font_metric_mode mode, BRect boundingBoxArray[]) const { - GetBoundingBoxesAsString(charArray,numChars,mode,NULL,boundingBoxArray); + GetBoundingBoxesAsString(charArray, numChars, mode, NULL, boundingBoxArray); } @@ -1054,6 +1054,11 @@ BFont::GetBoundingBoxesAsString(const char charArray[], int32 numChars, font_met BPrivate::AppServerLink link; link.StartMessage(AS_GET_BOUNDINGBOXES_CHARS); + link.Attach(fFamilyID); + link.Attach(fStyleID); + link.Attach(fSize); + link.Attach(fRotation); + link.Attach(fFlags); link.Attach(mode); if (delta) { @@ -1064,7 +1069,9 @@ BFont::GetBoundingBoxesAsString(const char charArray[], int32 numChars, font_met } link.Attach(numChars); - link.Attach(charArray, numChars); + uint32 bytesInBuffer = UTF8CountBytes(charArray, numChars); + link.Attach(bytesInBuffer); + link.Attach(charArray, bytesInBuffer); if (link.FlushWithReply(code) != B_OK || code != SERVER_TRUE) @@ -1085,6 +1092,11 @@ BFont::GetBoundingBoxesForStrings(const char *stringArray[], int32 numStrings, BPrivate::AppServerLink link; link.StartMessage(AS_GET_BOUNDINGBOXES_STRINGS); + link.Attach(fFamilyID); + link.Attach(fStyleID); + link.Attach(fSize); + link.Attach(fRotation); + link.Attach(fFlags); link.Attach(mode); link.Attach(numStrings); diff --git a/src/servers/app/ServerApp.cpp b/src/servers/app/ServerApp.cpp index fb81b47fcd..6de4ec54e9 100644 --- a/src/servers/app/ServerApp.cpp +++ b/src/servers/app/ServerApp.cpp @@ -1942,6 +1942,147 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver &link) fLink.Flush(); break; } + case AS_GET_BOUNDINGBOXES_CHARS: + { + FTRACE(("ServerApp %s: AS_GET_BOUNDINGBOXES_CHARS\n", Signature())); + // Attached Data: + // 1) uint16 - family ID + // 2) uint16 - style ID + // 3) float - point size + // 4) float - rotation + // 5) uint32 - flags + + // 6) font_metric_mode - mode + + // 7) escapement_delta - additional delta + + // 8) int32 - numChars + // 9) int32 - numBytes + // 10) char - the char buffer with size numBytes + + // Returns: + // 1) BRect - rects with numChar entries + + uint16 famid, styid; + uint32 flags; + float ptsize, rotation; + font_metric_mode mode; + + link.Read(&famid); + link.Read(&styid); + link.Read(&ptsize); + link.Read(&rotation); + link.Read(&flags); + link.Read(&mode); + + escapement_delta delta; + link.Read(&delta); + + int32 numChars; + link.Read(&numChars); + + uint32 numBytes; + link.Read(&numBytes); + + char* charArray = new char[numBytes]; + link.Read(charArray, numBytes); + + BRect* rectArray = new BRect[numChars]; + // figure out escapements + + ServerFont font; + bool success = false; + if (font.SetFamilyAndStyle(famid, styid) == B_OK) { + font.SetSize(ptsize); + font.SetRotation(rotation); + font.SetFlags(flags); + + if (font.GetBoundingBoxesAsString(charArray, numChars, rectArray, mode, delta)) { + fLink.StartMessage(SERVER_TRUE); + fLink.Attach(rectArray, sizeof(rectArray)); + success = true; + } + } + + delete[] charArray; + delete[] rectArray; + + if (!success) + fLink.StartMessage(SERVER_FALSE); + + fLink.Flush(); + break; + } + case AS_GET_BOUNDINGBOXES_STRINGS: + { + FTRACE(("ServerApp %s: AS_GET_BOUNDINGBOXES_STRINGS\n", Signature())); + // Attached Data: + // 1) uint16 - family ID + // 2) uint16 - style ID + // 3) float - point size + // 4) float - rotation + // 5) uint32 - flags + + // 6) font_metric_mode - mode + // 7) int32 numStrings + + // 8) escapement_delta - additional delta (numStrings times) + // 9) int32 string length to measure (numStrings times) + // 10) string - string (numStrings times) + + // Returns: + // 1) BRect - rects with numStrings entries + + uint16 famid, styid; + uint32 flags; + float ptsize, rotation; + font_metric_mode mode; + + link.Read(&famid); + link.Read(&styid); + link.Read(&ptsize); + link.Read(&rotation); + link.Read(&flags); + link.Read(&mode); + + int32 numStrings; + link.Read(&numStrings); + + escapement_delta deltaArray[numStrings]; + char *stringArray[numStrings]; + int32 lengthArray[numStrings]; + for(int32 i=0; i(&lengthArray[i]); + link.Read(&deltaArray[i]); + stringArray[i] = new char[lengthArray[i]]; + link.ReadString(&stringArray[i]); + } + + BRect rectArray[numStrings]; + + ServerFont font; + bool success = false; + if (font.SetFamilyAndStyle(famid, styid) == B_OK) { + font.SetSize(ptsize); + font.SetRotation(rotation); + font.SetFlags(flags); + + if (font.GetBoundingBoxesAsStrings(stringArray, lengthArray, numStrings, rectArray, mode, deltaArray)) { + fLink.StartMessage(SERVER_TRUE); + fLink.Attach(rectArray, sizeof(rectArray)); + success = true; + } + } + + for (int32 i=0; i= B_OK; } + +bool +ServerFont::GetBoundingBoxesAsString(const char charArray[], int32 numChars, BRect rectArray[], + font_metric_mode mode, escapement_delta delta) +{ + if (!fStyle || !charArray || numChars <= 0 || !rectArray) + return false; + + FT_Face face = fStyle->GetFTFace(); + if (!face) + return false; + + FT_Set_Char_Size(face, 0, int32(fSize * 64), 72, 72); + + return true; +} + + +bool +ServerFont::GetBoundingBoxesAsStrings(char *charArray[], int32 lengthArray[], + int32 numStrings, BRect rectArray[], font_metric_mode mode, escapement_delta deltaArray[]) +{ + if (!fStyle || !charArray || !lengthArray|| numStrings <= 0 || !rectArray || !deltaArray) + return false; + + FT_Face face = fStyle->GetFTFace(); + if (!face) + return false; + + FT_Set_Char_Size(face, 0, int32(fSize * 64), 72, 72); + + return true; +} + + // StringWidth float ServerFont::StringWidth(const char* string, int32 numBytes) const