void BFont::GetGlyphShapes(const char charArray[], int32 numChars, BShape* glyphShapeArray[]) const { // TODO: implement code specifically for passing BShapes to and // from the server if (!charArray || numChars < 1 || !glyphShapeArray) return; int32 code; BPrivate::AppServerLink link; link.StartMessage(AS_GET_GLYPH_SHAPES); link.Attach<uint16>(fFamilyID); link.Attach<uint16>(fStyleID); link.Attach<float>(fSize); link.Attach<float>(fShear); link.Attach<float>(fRotation); link.Attach<float>(fFalseBoldWidth); link.Attach<uint32>(fFlags); link.Attach<int32>(numChars); uint32 bytesInBuffer = UTF8CountBytes(charArray, numChars); link.Attach<int32>(bytesInBuffer); link.Attach(charArray, bytesInBuffer); if (link.FlushWithReply(code) != B_OK || code != B_OK) return; for (int32 i = 0; i < numChars; i++) link.ReadShape(glyphShapeArray[i]); }
void BFont::GetEscapements(const char charArray[], int32 numChars, escapement_delta* delta, BPoint escapementArray[], BPoint offsetArray[]) const { if (charArray == NULL || numChars < 1 || escapementArray == NULL) return; BPrivate::AppServerLink link; link.StartMessage(AS_GET_ESCAPEMENTS); link.Attach<uint16>(fFamilyID); link.Attach<uint16>(fStyleID); link.Attach<float>(fSize); link.Attach<uint8>(fSpacing); link.Attach<float>(fRotation); link.Attach<uint32>(fFlags); link.Attach<float>(delta ? delta->nonspace : 0.0); link.Attach<float>(delta ? delta->space : 0.0); link.Attach<bool>(offsetArray != NULL); link.Attach<int32>(numChars); // TODO: Should we not worry about the port capacity here?!? uint32 bytesInBuffer = UTF8CountBytes(charArray, numChars); link.Attach<int32>(bytesInBuffer); link.Attach(charArray, bytesInBuffer); int32 code; if (link.FlushWithReply(code) != B_OK || code != B_OK) return; link.Read(escapementArray, sizeof(BPoint) * numChars); if (offsetArray) link.Read(offsetArray, sizeof(BPoint) * numChars); }
BCursor::BCursor(const void *cursorData) : fServerToken(-1), fNeedToFree(false) { const uint8 *data = (const uint8 *)cursorData; if (data == B_HAND_CURSOR || data == B_I_BEAM_CURSOR) { // just use the default cursors from the app_server fServerToken = data == B_HAND_CURSOR ? B_CURSOR_DEFAULT : B_CURSOR_TEXT; return; } // Create a new cursor in the app_server if (data == NULL || data[0] != 16 // size || data[1] != 1 // depth || data[2] >= 16 || data[3] >= 16) // hot-spot return; // Send data directly to server BPrivate::AppServerLink link; link.StartMessage(AS_CREATE_CURSOR); link.Attach(cursorData, 68); status_t status; if (link.FlushWithReply(status) == B_OK && status == B_OK) { link.Read<int32>(&fServerToken); fNeedToFree = true; } }
void BFont::_GetBoundingBoxes(const char charArray[], int32 numChars, font_metric_mode mode, bool string_escapement, escapement_delta* delta, BRect boundingBoxArray[], bool asString) const { if (charArray == NULL || numChars < 1 || boundingBoxArray == NULL) return; int32 code; BPrivate::AppServerLink link; link.StartMessage(asString ? AS_GET_BOUNDINGBOXES_STRING : AS_GET_BOUNDINGBOXES_CHARS); link.Attach<uint16>(fFamilyID); link.Attach<uint16>(fStyleID); link.Attach<float>(fSize); link.Attach<float>(fRotation); link.Attach<float>(fShear); link.Attach<float>(fFalseBoldWidth); link.Attach<uint8>(fSpacing); link.Attach<uint32>(fFlags); link.Attach<font_metric_mode>(mode); link.Attach<bool>(string_escapement); if (delta != NULL) { link.Attach<escapement_delta>(*delta); } else { escapement_delta emptyDelta = {0, 0}; link.Attach<escapement_delta>(emptyDelta); } link.Attach<int32>(numChars); uint32 bytesInBuffer = UTF8CountBytes(charArray, numChars); link.Attach<int32>(bytesInBuffer); link.Attach(charArray, bytesInBuffer); if (link.FlushWithReply(code) != B_OK || code != B_OK) return; link.Read(boundingBoxArray, sizeof(BRect) * numChars); }
void BFont::GetHasGlyphs(const char charArray[], int32 numChars, bool hasArray[]) const { if (!charArray || numChars < 1 || !hasArray) return; int32 code; BPrivate::AppServerLink link; link.StartMessage(AS_GET_HAS_GLYPHS); link.Attach<uint16>(fFamilyID); link.Attach<uint16>(fStyleID); link.Attach<int32>(numChars); uint32 bytesInBuffer = UTF8CountBytes(charArray, numChars); link.Attach<int32>(bytesInBuffer); link.Attach(charArray, bytesInBuffer); if (link.FlushWithReply(code) != B_OK || code != B_OK) return; link.Read(hasArray, sizeof(bool) * numChars); }
void BFont::GetEdges(const char charArray[], int32 numChars, edge_info edgeArray[]) const { if (!charArray || numChars < 1 || !edgeArray) return; int32 code; BPrivate::AppServerLink link; link.StartMessage(AS_GET_EDGES); link.Attach<uint16>(fFamilyID); link.Attach<uint16>(fStyleID); link.Attach<int32>(numChars); uint32 bytesInBuffer = UTF8CountBytes(charArray, numChars); link.Attach<int32>(bytesInBuffer); link.Attach(charArray, bytesInBuffer); if (link.FlushWithReply(code) != B_OK || code != B_OK) return; link.Read(edgeArray, sizeof(edge_info) * numChars); }