// Sets the font's family and face all at once status_t BFont::SetFamilyAndFace(const font_family family, uint16 face) { // To comply with the BeBook, this function will only set valid values // i.e. passing a nonexistent family will cause only the face to be set. // Additionally, if a particular face does not exist in a family, the // closest match will be chosen. BPrivate::AppServerLink link; link.StartMessage(AS_GET_FAMILY_AND_STYLE_IDS); link.AttachString(family, sizeof(font_family)); link.AttachString(NULL); // no style given link.Attach<uint16>(fFamilyID); link.Attach<uint16>(0xffff); link.Attach<uint16>(face); int32 status = B_ERROR; if (link.FlushWithReply(status) != B_OK || status != B_OK) return status; link.Read<uint16>(&fFamilyID); link.Read<uint16>(&fStyleID); link.Read<uint16>(&fFace); fHeight.ascent = kUninitializedAscent; fExtraFlags = kUninitializedExtraFlags; return B_OK; }
// Sets the font's family and style all at once status_t BFont::SetFamilyAndStyle(const font_family family, const font_style style) { if (family == NULL && style == NULL) return B_BAD_VALUE; BPrivate::AppServerLink link; link.StartMessage(AS_GET_FAMILY_AND_STYLE_IDS); link.AttachString(family, sizeof(font_family)); link.AttachString(style, sizeof(font_style)); link.Attach<uint16>(fFamilyID); link.Attach<uint16>(0xffff); link.Attach<uint16>(fFace); int32 status = B_ERROR; if (link.FlushWithReply(status) != B_OK || status != B_OK) return status; link.Read<uint16>(&fFamilyID); link.Read<uint16>(&fStyleID); link.Read<uint16>(&fFace); fHeight.ascent = kUninitializedAscent; fExtraFlags = kUninitializedExtraFlags; return B_OK; }
// Private function used to replace the R5 hack which sets a system font void _set_system_font_(const char* which, font_family family, font_style style, float size) { // R5 used a global area offset table to set the system fonts in the Font // preferences panel. Bleah. BPrivate::AppServerLink link; link.StartMessage(AS_SET_SYSTEM_FONT); link.AttachString(which, B_OS_NAME_LENGTH); link.AttachString(family, sizeof(font_family)); link.AttachString(style, sizeof(font_style)); link.Attach<float>(size); link.Flush(); }
// Sets the font's family and style all at once void BFont::SetFamilyAndStyle(uint32 code) { // R5 has a bug here: the face is not updated even though the IDs are set. // This is a problem because the face flag includes Regular/Bold/Italic // information in addition to stuff like underlining and strikethrough. // As a result, this will need a trip to the server and, thus, be slower // than R5's in order to be correct uint16 family, style; style = code & 0xFFFF; family = (code & 0xFFFF0000) >> 16; BPrivate::AppServerLink link; link.StartMessage(AS_GET_FAMILY_AND_STYLE_IDS); link.AttachString(NULL); // no family and style name link.AttachString(NULL); link.Attach<uint16>(family); link.Attach<uint16>(style); link.Attach<uint16>(fFace); int32 fontcode; if (link.FlushWithReply(fontcode) != B_OK || fontcode != B_OK) return; link.Read<uint16>(&fFamilyID); link.Read<uint16>(&fStyleID); link.Read<uint16>(&fFace); fHeight.ascent = kUninitializedAscent; fExtraFlags = kUninitializedExtraFlags; }
void BFont::GetStringWidths(const char* stringArray[], const int32 lengthArray[], int32 numStrings, float widthArray[]) const { if (stringArray == NULL || lengthArray == NULL || numStrings < 1 || widthArray == NULL) { return; } BPrivate::AppServerLink link; link.StartMessage(AS_GET_STRING_WIDTHS); link.Attach<uint16>(fFamilyID); link.Attach<uint16>(fStyleID); link.Attach<float>(fSize); link.Attach<uint8>(fSpacing); link.Attach<int32>(numStrings); // TODO: all strings into a single array??? // we do have a maximum message length, and it could be easily touched // here... for (int32 i = 0; i < numStrings; i++) link.AttachString(stringArray[i], lengthArray[i]); status_t status; if (link.FlushWithReply(status) != B_OK || status != B_OK) return; link.Read(widthArray, sizeof(float) * numStrings); }
void BFont::GetBoundingBoxesForStrings(const char* stringArray[], int32 numStrings, font_metric_mode mode, escapement_delta deltas[], BRect boundingBoxArray[]) const { if (!stringArray || numStrings < 1 || !boundingBoxArray) return; int32 code; BPrivate::AppServerLink link; link.StartMessage(AS_GET_BOUNDINGBOXES_STRINGS); 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<int32>(numStrings); if (deltas) { for (int32 i = 0; i < numStrings; i++) { link.AttachString(stringArray[i]); link.Attach<escapement_delta>(deltas[i]); } } else { escapement_delta emptyDelta = {0, 0}; for (int32 i = 0; i < numStrings; i++) { link.AttachString(stringArray[i]); link.Attach<escapement_delta>(emptyDelta); } } if (link.FlushWithReply(code) != B_OK || code != B_OK) return; link.Read(boundingBoxArray, sizeof(BRect) * numStrings); }
/*! \brief Private function which sets the window decorator for the system. \param entry_ref to the decorator to set Will return detailed error status via status_t */ status_t set_decorator(const BString& path) { BPrivate::AppServerLink link; link.StartMessage(AS_SET_DECORATOR); link.AttachString(path.String()); link.Flush(); status_t error = B_OK; link.Read<status_t>(&error); return error; }
status_t _get_system_default_font_(const char* which, font_family family, font_style style, float* _size) { BPrivate::AppServerLink link; link.StartMessage(AS_GET_SYSTEM_DEFAULT_FONT); link.AttachString(which, B_OS_NAME_LENGTH); int32 status = B_ERROR; if (link.FlushWithReply(status) != B_OK || status < B_OK) return status; link.ReadString(family, sizeof(font_family)); link.ReadString(style, sizeof(font_style)); link.Read<float>(_size); return B_OK; }