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
This commit is contained in:
@@ -130,6 +130,14 @@ class ServerFont {
|
|||||||
float widthArray[],
|
float widthArray[],
|
||||||
escapement_delta delta) const;
|
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;
|
float StringWidth(const char* string, int32 numBytes) const;
|
||||||
|
|
||||||
FT_Face GetFTFace() const
|
FT_Face GetFTFace() const
|
||||||
|
|||||||
@@ -1039,7 +1039,7 @@ void
|
|||||||
BFont::GetBoundingBoxesAsGlyphs(const char charArray[], int32 numChars, font_metric_mode mode,
|
BFont::GetBoundingBoxesAsGlyphs(const char charArray[], int32 numChars, font_metric_mode mode,
|
||||||
BRect boundingBoxArray[]) const
|
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;
|
BPrivate::AppServerLink link;
|
||||||
|
|
||||||
link.StartMessage(AS_GET_BOUNDINGBOXES_CHARS);
|
link.StartMessage(AS_GET_BOUNDINGBOXES_CHARS);
|
||||||
|
link.Attach<uint16>(fFamilyID);
|
||||||
|
link.Attach<uint16>(fStyleID);
|
||||||
|
link.Attach<float>(fSize);
|
||||||
|
link.Attach<float>(fRotation);
|
||||||
|
link.Attach<uint32>(fFlags);
|
||||||
link.Attach<font_metric_mode>(mode);
|
link.Attach<font_metric_mode>(mode);
|
||||||
|
|
||||||
if (delta) {
|
if (delta) {
|
||||||
@@ -1064,7 +1069,9 @@ BFont::GetBoundingBoxesAsString(const char charArray[], int32 numChars, font_met
|
|||||||
}
|
}
|
||||||
|
|
||||||
link.Attach<int32>(numChars);
|
link.Attach<int32>(numChars);
|
||||||
link.Attach(charArray, numChars);
|
uint32 bytesInBuffer = UTF8CountBytes(charArray, numChars);
|
||||||
|
link.Attach<int32>(bytesInBuffer);
|
||||||
|
link.Attach(charArray, bytesInBuffer);
|
||||||
|
|
||||||
if (link.FlushWithReply(code) != B_OK
|
if (link.FlushWithReply(code) != B_OK
|
||||||
|| code != SERVER_TRUE)
|
|| code != SERVER_TRUE)
|
||||||
@@ -1085,6 +1092,11 @@ BFont::GetBoundingBoxesForStrings(const char *stringArray[], int32 numStrings,
|
|||||||
BPrivate::AppServerLink link;
|
BPrivate::AppServerLink link;
|
||||||
|
|
||||||
link.StartMessage(AS_GET_BOUNDINGBOXES_STRINGS);
|
link.StartMessage(AS_GET_BOUNDINGBOXES_STRINGS);
|
||||||
|
link.Attach<uint16>(fFamilyID);
|
||||||
|
link.Attach<uint16>(fStyleID);
|
||||||
|
link.Attach<float>(fSize);
|
||||||
|
link.Attach<float>(fRotation);
|
||||||
|
link.Attach<uint32>(fFlags);
|
||||||
link.Attach<font_metric_mode>(mode);
|
link.Attach<font_metric_mode>(mode);
|
||||||
link.Attach<int32>(numStrings);
|
link.Attach<int32>(numStrings);
|
||||||
|
|
||||||
|
|||||||
@@ -1942,6 +1942,147 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver &link)
|
|||||||
fLink.Flush();
|
fLink.Flush();
|
||||||
break;
|
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<uint16>(&famid);
|
||||||
|
link.Read<uint16>(&styid);
|
||||||
|
link.Read<float>(&ptsize);
|
||||||
|
link.Read<float>(&rotation);
|
||||||
|
link.Read<uint32>(&flags);
|
||||||
|
link.Read<font_metric_mode>(&mode);
|
||||||
|
|
||||||
|
escapement_delta delta;
|
||||||
|
link.Read<escapement_delta>(&delta);
|
||||||
|
|
||||||
|
int32 numChars;
|
||||||
|
link.Read<int32>(&numChars);
|
||||||
|
|
||||||
|
uint32 numBytes;
|
||||||
|
link.Read<uint32>(&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<uint16>(&famid);
|
||||||
|
link.Read<uint16>(&styid);
|
||||||
|
link.Read<float>(&ptsize);
|
||||||
|
link.Read<float>(&rotation);
|
||||||
|
link.Read<uint32>(&flags);
|
||||||
|
link.Read<font_metric_mode>(&mode);
|
||||||
|
|
||||||
|
int32 numStrings;
|
||||||
|
link.Read<int32>(&numStrings);
|
||||||
|
|
||||||
|
escapement_delta deltaArray[numStrings];
|
||||||
|
char *stringArray[numStrings];
|
||||||
|
int32 lengthArray[numStrings];
|
||||||
|
for(int32 i=0; i<numStrings; i++) {
|
||||||
|
link.Read<int32>(&lengthArray[i]);
|
||||||
|
link.Read<escapement_delta>(&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<numStrings; i++)
|
||||||
|
delete[] stringArray[i];
|
||||||
|
|
||||||
|
if (!success)
|
||||||
|
fLink.StartMessage(SERVER_FALSE);
|
||||||
|
|
||||||
|
fLink.Flush();
|
||||||
|
break;
|
||||||
|
}
|
||||||
case AS_SCREEN_GET_MODE:
|
case AS_SCREEN_GET_MODE:
|
||||||
{
|
{
|
||||||
STRACE(("ServerApp %s: AS_SCREEN_GET_MODE\n", Signature()));
|
STRACE(("ServerApp %s: AS_SCREEN_GET_MODE\n", Signature()));
|
||||||
|
|||||||
@@ -523,6 +523,41 @@ ServerFont::GetEscapements(const char charArray[], int32 numChars,
|
|||||||
return ret >= B_OK;
|
return ret >= 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
|
// StringWidth
|
||||||
float
|
float
|
||||||
ServerFont::StringWidth(const char* string, int32 numBytes) const
|
ServerFont::StringWidth(const char* string, int32 numBytes) const
|
||||||
|
|||||||
Reference in New Issue
Block a user