Retooled the API and implemented some of the message handlers

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10789 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
DarkWyrm 2005-01-17 02:05:50 +00:00
parent c1d0331e5b
commit 4bd87f4887
7 changed files with 583 additions and 173 deletions

View File

@ -555,18 +555,7 @@ void DirectDriver::SetDrawData(const DrawData *d, bool set_font_data)
if(!sf)
return;
FontStyle *style=d->font.Style();
if(!style)
return;
FontFamily *family=(FontFamily *)style->Family();
if(!family)
return;
font_family fontfamily;
strcpy(fontfamily,family->Name());
font.SetFamilyAndStyle(fontfamily,style->Name());
font.SetFamilyAndStyle(sf->GetFamily(),sf->GetStyle());
font.SetFlags(sf->Flags());
font.SetEncoding(sf->Encoding());
font.SetSize(sf->Size());

View File

@ -471,13 +471,6 @@ void DisplayDriver::DrawString(const char *string, const int32 &length, const BP
BPoint point(pt);
const ServerFont *font=&(d->font);
FontStyle *style=font->Style();
if(!style)
{
Unlock();
return;
}
FT_Face face;
FT_GlyphSlot slot;
@ -506,7 +499,7 @@ void DisplayDriver::DrawString(const char *string, const int32 &length, const BP
else
shear=90-(90-shearangle)*2;
error=FT_New_Face(ftlib, style->GetPath(), 0, &face);
error=FT_New_Face(ftlib, font->GetPath(), 0, &face);
if(error)
{
Unlock();
@ -3740,13 +3733,6 @@ float DisplayDriver::StringWidth(const char *string, int32 length, const DrawDat
Lock();
const ServerFont *font=&(d->font);
FontStyle *style=font->Style();
if(!style)
{
Unlock();
return 0.0;
}
FT_Face face;
FT_GlyphSlot slot;
@ -3756,7 +3742,7 @@ float DisplayDriver::StringWidth(const char *string, int32 length, const DrawDat
int32 strlength,i;
float returnval;
error=FT_New_Face(ftlib, style->GetPath(), 0, &face);
error=FT_New_Face(ftlib, font->GetPath(), 0, &face);
if(error)
{
Unlock();
@ -3825,13 +3811,6 @@ float DisplayDriver::StringHeight(const char *string, int32 length, const DrawDa
Lock();
const ServerFont *font=&(d->font);
FontStyle *style=font->Style();
if(!style)
{
Unlock();
return 0.0;
}
FT_Face face;
FT_GlyphSlot slot;
@ -3839,7 +3818,7 @@ float DisplayDriver::StringHeight(const char *string, int32 length, const DrawDa
int32 strlength,i;
float returnval=0.0,ascent=0.0,descent=0.0;
error=FT_New_Face(ftlib, style->GetPath(), 0, &face);
error=FT_New_Face(ftlib, font->GetPath(), 0, &face);
if(error)
{
Unlock();

View File

@ -37,11 +37,10 @@ FTC_Manager ftmanager;
*/
FontStyle::FontStyle(const char *filepath, FT_Face face)
{
name=new BString(face->style_name);
fName=face->style_name;
cachedface=new CachedFaceRec;
cachedface->file_path=filepath;
family=NULL;
instances=new BList(0);
has_bitmaps=(face->num_fixed_sizes>0)?true:false;
is_fixedwidth=(face->face_flags & FT_FACE_FLAG_FIXED_WIDTH)?true:false;
is_scalable=(face->face_flags & FT_FACE_FLAG_SCALABLE)?true:false;
@ -49,8 +48,10 @@ FontStyle::FontStyle(const char *filepath, FT_Face face)
glyphcount=face->num_glyphs;
charmapcount=face->num_charmaps;
tunedcount=face->num_fixed_sizes;
path=new BString(filepath);
fPath=filepath;
fbounds.Set(0,0,0,0);
fFace=TranslateStyleToFace(face->style_name);
fID=0;
}
/*!
@ -63,43 +64,16 @@ FontStyle::FontStyle(const char *filepath, FT_Face face)
*/
FontStyle::~FontStyle(void)
{
delete name;
delete path;
delete cachedface;
// Mark all instances as Free here
int32 index=0;
ServerFont *fs=(ServerFont*)instances->ItemAt(index);
while(fs)
{
fs->fstyle=NULL;
index++;
fs=(ServerFont*)instances->ItemAt(index);
}
instances->MakeEmpty();
delete instances;
}
/*!
\brief Returns the name of the style as a string
\return The style's name
*/
const char *FontStyle::Name(void)
const char *FontStyle::Name(void) const
{
return name->String();
}
/*!
\brief Returns a handle to the style in question, straight from FreeType's cache
\return FreeType face handle or NULL if there was an internal error
*/
FT_Face FontStyle::GetFace(void)
{
FT_Face f;
return (FTC_Manager_LookupFace(ftmanager,(FTC_FaceID)cachedface,&f)!=0)?f:NULL;
return fName.String();
}
/*!
@ -108,7 +82,19 @@ FT_Face FontStyle::GetFace(void)
*/
const char *FontStyle::GetPath(void)
{
return path->String();
return fPath.String();
}
int32 FontStyle::GetFlags(void) const
{
int32 flags=0;
if(IsFixedWidth())
flags|=B_IS_FIXED;
if(TunedCount()>0)
flags|=B_HAS_TUNED_FONT;
return flags;
}
/*!
@ -116,37 +102,79 @@ const char *FontStyle::GetPath(void)
\param c An ASCII character
\return A Unicode value for the character
*/
// TODO: Re-enable when I understand how the FT2 Cache system changed from
// 2.1.4 to 2.1.8
/*
int16 FontStyle::ConvertToUnicode(uint16 c)
{
FT_Face f;
if(FTC_Manager_LookupFace(ftmanager,(FTC_FaceID)cachedface,&f)!=0)
if(FTC_Manager_Lookup_Face(ftmanager,cachedface,&f)!=0)
return 0;
return FT_Get_Char_Index(f,c);
}
/*!
\brief Creates a new ServerFont object for the style, given size, shear, and rotation.
\param size character size in points
\param rotation rotation in degrees
\param shear shear (slant) in degrees. 45 <= shear <= 135. 90 is vertical
\return The new ServerFont object
*/
ServerFont *FontStyle::Instantiate(float size, float rotation, float shear)
uint16 FontStyle::TranslateStyleToFace(const char *name) const
{
ServerFont *f=new ServerFont(this, size, rotation, shear);
instances->AddItem(f);
return f;
// TODO: see how R5 translates font styles to faces for FontStyle::TranslateStyleToFace
if(!name)
return 0;
BString str(name);
if(str.ICompare("ultra light")==0)
return B_REGULAR_FACE;
if(str.ICompare("thin")==0)
return B_REGULAR_FACE;
if(str.ICompare("extra light")==0)
return B_REGULAR_FACE;
if(str.ICompare("light")==0)
return B_REGULAR_FACE;
if(str.ICompare("roman")==0)
return B_REGULAR_FACE;
if(str.ICompare("book")==0)
return B_REGULAR_FACE;
if(str.ICompare("regular")==0)
return B_REGULAR_FACE;
if(str.ICompare("plain")==0)
return B_REGULAR_FACE;
if(str.ICompare("medium")==0)
return B_REGULAR_FACE;
if(str.ICompare("demibold")==0)
return B_BOLD_FACE;
if(str.ICompare("bold")==0)
return B_BOLD_FACE;
if(str.ICompare("black")==0)
return B_BOLD_FACE;
if(str.ICompare("heavy")==0)
return B_BOLD_FACE;
if(str.ICompare("extra bold")==0)
return B_BOLD_FACE;
if(str.ICompare("ultra bold")==0)
return B_BOLD_FACE;
if(str.ICompare("italic")==0)
return B_ITALIC_FACE;
if(str.ICompare("oblique")==0)
return B_BOLD_FACE;
return 0;
}
/*!
\brief Constructor
\param namestr Name of the family
*/
FontFamily::FontFamily(const char *namestr)
FontFamily::FontFamily(const char *namestr, const uint16 &index)
{
name=new BString(namestr);
styles=new BList(0);
fName=namestr;
fID=index;
// will stay uninitialized until needed
fFlags=-1;
}
/*!
@ -158,17 +186,12 @@ FontFamily::FontFamily(const char *namestr)
*/
FontFamily::~FontFamily(void)
{
delete name;
BString *string;
for(int32 i=0; i<styles->CountItems(); i++)
FontStyle *style;
for(int32 i=0; i<fStyles.CountItems(); i++)
{
string=(BString *)styles->RemoveItem(i);
if(string)
delete string;
style=(FontStyle *)fStyles.RemoveItem(i);
delete style;
}
styles->MakeEmpty(); // should be empty, but just in case...
delete styles;
}
/*!
@ -177,7 +200,7 @@ FontFamily::~FontFamily(void)
*/
const char *FontFamily::Name(void)
{
return name->String();
return fName.String();
}
/*!
@ -185,27 +208,39 @@ const char *FontFamily::Name(void)
\param path full path to the style's font file
\param face FreeType face handle used to obtain info about the font
*/
void FontFamily::AddStyle(const char *path,FT_Face face)
bool FontFamily::AddStyle(FontStyle *style)
{
if(!path)
return;
if(!style)
return false;
BString style(face->style_name);
FontStyle *item;
// Don't add if it already is in the family.
int32 count=styles->CountItems();
int32 count=fStyles.CountItems();
for(int32 i=0; i<count; i++)
{
item=(FontStyle *)styles->ItemAt(i);
if(item->name->Compare(face->style_name)==0)
return;
item=(FontStyle *)fStyles.ItemAt(i);
if(item->fName==style->fName)
return false;
}
item=new FontStyle(path, face);
item->family=this;
styles->AddItem(item);
style->family=this;
if(fStyles.CountItems()>0)
{
item=(FontStyle *)fStyles.ItemAt(fStyles.CountItems()-1);
style->fID=item->fID+1;
}
else
style->fID=0;
fStyles.AddItem(style);
AddDependent();
// force a refresh if a request for font flags is needed
fFlags=-1;
return true;
}
/*!
@ -214,33 +249,52 @@ void FontFamily::AddStyle(const char *path,FT_Face face)
*/
void FontFamily::RemoveStyle(const char *style)
{
int32 count=styles->CountItems();
int32 count=fStyles.CountItems();
if(!style || count<1)
return;
FontStyle *fs;
for(int32 i=0; i<count; i++)
{
fs=(FontStyle *)styles->ItemAt(i);
if(fs && fs->name->Compare(style)==0)
fs=(FontStyle *)fStyles.ItemAt(i);
if(fs && fs->fName.Compare(style)==0)
{
fs=(FontStyle *)styles->RemoveItem(i);
fs=(FontStyle *)fStyles.RemoveItem(i);
if(fs)
{
delete fs;
RemoveDependent();
// force a refresh if a request for font flags is needed
fFlags=-1;
}
}
}
}
/*!
\brief Removes a style from the family. The caller is responsible for freeing the object
\param style The style to be removed from the family
*/
void FontFamily::RemoveStyle(FontStyle *style)
{
if(fStyles.HasItem(style))
{
fStyles.RemoveItem(style);
RemoveDependent();
// force a refresh if a request for font flags is needed
fFlags=-1;
}
}
/*!
\brief Returns the number of styles in the family
\return The number of styles in the family
*/
int32 FontFamily::CountStyles(void)
{
return styles->CountItems();
return fStyles.CountItems();
}
/*!
@ -250,14 +304,16 @@ int32 FontFamily::CountStyles(void)
*/
bool FontFamily::HasStyle(const char *style)
{
int32 count=styles->CountItems();
int32 count=fStyles.CountItems();
if(!style || count<1)
return false;
FontStyle *fs;
for(int32 i=0; i<count; i++)
{
fs=(FontStyle *)styles->ItemAt(i);
if(fs && fs->name->Compare(style)==0)
fs=(FontStyle *)fStyles.ItemAt(i);
if(fs && fs->fName.Compare(style)==0)
return true;
}
return false;
@ -268,12 +324,9 @@ bool FontFamily::HasStyle(const char *style)
\param index list index of the style to be found
\return name of the style or NULL if the index is not valid
*/
const char *FontFamily::GetStyle(int32 index)
FontStyle *FontFamily::GetStyle(int32 index)
{
FontStyle *fs=(FontStyle*)styles->ItemAt(index);
if(!fs)
return NULL;
return fs->Name();
return (FontStyle*)fStyles.ItemAt(index);
}
/*!
@ -285,15 +338,38 @@ const char *FontFamily::GetStyle(int32 index)
*/
FontStyle *FontFamily::GetStyle(const char *style)
{
int32 count=styles->CountItems();
int32 count=fStyles.CountItems();
if(!style || count<1)
return NULL;
FontStyle *fs;
for(int32 i=0; i<count; i++)
{
fs=(FontStyle *)styles->ItemAt(i);
if(fs && fs->name->Compare(style)==0)
fs=(FontStyle *)fStyles.ItemAt(i);
if(fs && fs->fName.Compare(style)==0)
return fs;
}
return NULL;
}
int32 FontFamily::GetFlags(void)
{
if(fFlags==-1)
{
fFlags=0;
for(int32 i=0; i<fStyles.CountItems(); i++)
{
FontStyle *style=(FontStyle*)fStyles.ItemAt(i);
if(style)
{
if(style->IsFixedWidth())
fFlags|=B_IS_FIXED;
if(style->TunedCount()>0)
fFlags|=B_HAS_TUNED_FONT;
}
}
}
return fFlags;
}

View File

@ -137,6 +137,44 @@ void FontServer::RemoveFamily(const char *family)
}
}
const char *FontServer::GetFamilyName(uint16 id) const
{
FontFamily *fam;
for(int32 i=0; i<families->CountItems(); i++)
{
fam=(FontFamily*)families->ItemAt(i);
if(fam && fam->GetID()==id)
return fam->Name();
}
return NULL;
}
const char *FontServer::GetStyleName(const char *family, uint16 id) const
{
FontFamily *fam=_FindFamily(family);
FontStyle *sty;
for(int32 i=0; i<families->CountItems(); i++)
{
sty=fam->GetStyle(i);
if(sty && sty->GetID()==id)
return sty->Name();
}
return NULL;
}
FontStyle *FontServer::GetStyle(const char *family, uint16 id) const
{
FontFamily *fam=_FindFamily(family);
FontStyle *sty;
for(int32 i=0; i<families->CountItems(); i++)
{
sty=fam->GetStyle(i);
if(sty && sty->GetID()==id)
return sty;
}
return NULL;
}
/*!
\brief Protected function which locates a FontFamily object
\param name The family to find
@ -144,7 +182,7 @@ void FontServer::RemoveFamily(const char *family)
Do NOT delete the FontFamily returned by this function.
*/
FontFamily *FontServer::_FindFamily(const char *name)
FontFamily *FontServer::_FindFamily(const char *name) const
{
if(!init)
return NULL;
@ -189,6 +227,7 @@ status_t FontServer::ScanDirectory(const char *fontspath)
FT_Error error;
FT_CharMap charmap;
FontFamily *family;
FontStyle *style;
stat=dir.SetTo(fontspath);
if(stat!=B_OK)
@ -227,7 +266,7 @@ status_t FontServer::ScanDirectory(const char *fontspath)
printf("Font Family: %s\n",face->family_name);
#endif
family=new FontFamily(face->family_name);
family=new FontFamily(face->family_name,families->CountItems());
families->AddItem(family);
}
@ -242,7 +281,10 @@ status_t FontServer::ScanDirectory(const char *fontspath)
#endif
// Has vertical metrics?
family->AddStyle(path.Path(),face);
style=new FontStyle(path.Path(),face);
if(!family->AddStyle(style))
delete style;
else
validcount++;
FT_Done_Face(face);
@ -316,7 +358,7 @@ FT_CharMap FontServer::_GetSupportedCharmap(const FT_Face &face)
*/
void FontServer::SaveList(void)
{
int32 famcount=0, stycount=0,i=0,j=0;
/* int32 famcount=0, stycount=0,i=0,j=0;
FontFamily *fam;
FontStyle *sty;
BMessage fontmsg, familymsg('FONT');
@ -371,26 +413,50 @@ void FontServer::SaveList(void)
BFile file(SERVER_FONT_LIST,B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE);
if(file.InitCheck()==B_OK)
fontmsg.Flatten(&file);
*/
}
/*!
\brief Retrieves the FontStyle object
\param family The font's family
\param face The font's style
\param style The font's style
\return The FontStyle having those attributes or NULL if not available
*/
FontStyle *FontServer::GetStyle(font_family family, font_style face)
FontStyle *FontServer::GetStyle(const char *family, const char *style)
{
FontFamily *ffam=_FindFamily(family);
if(ffam)
{
FontStyle *fsty=ffam->GetStyle(face);
FontStyle *fsty=ffam->GetStyle(style);
return fsty;
}
return NULL;
}
/*!
\brief Retrieves the FontStyle object
\param family ID for the font's family
\param style ID of the font's style
\return The FontStyle having those attributes or NULL if not available
*/
FontStyle *FontServer::GetStyle(const uint16 &familyid, const uint16 &styleid)
{
// TODO: Implement FontServer::GetStyle(id,id)
return NULL;
}
FontFamily *FontServer::GetFamily(const uint16 &familyid)
{
for(int32 i=0; i<families->CountItems(); i++)
{
FontFamily *fam=(FontFamily*)families->ItemAt(i);
if(fam->GetID()==familyid)
return fam;
}
return NULL;
}
/*!
\brief Returns the current object used for the regular style
\return A ServerFont pointer which is the plain font.
@ -458,7 +524,8 @@ bool FontServer::SetSystemPlain(const char *family, const char *style, float siz
if(plain)
delete plain;
plain=sty->Instantiate(size);
plain=new ServerFont(sty,size);
return true;
}
@ -481,7 +548,8 @@ bool FontServer::SetSystemBold(const char *family, const char *style, float size
if(bold)
delete bold;
bold=sty->Instantiate(size);
bold=new ServerFont(sty,size);
return true;
}
@ -504,7 +572,8 @@ bool FontServer::SetSystemFixed(const char *family, const char *style, float siz
if(fixed)
delete fixed;
fixed=sty->Instantiate(size);
fixed=new ServerFont(sty,size);
return true;
}

View File

@ -367,19 +367,10 @@ int32 ServerApp::MonitorApp(void *data)
void ServerApp::DispatchMessage(int32 code, LinkMsgReader &msg)
{
LayerData ld;
BPortLink replylink;
switch(code)
{
case AS_UPDATED_CLIENT_FONTLIST:
{
STRACE(("ServerApp %s: Acknowledged update of client-side font list\n",fSignature.String()));
// received when the client-side global font list has been
// refreshed
fontserver->Lock();
fontserver->FontsUpdated();
fontserver->Unlock();
break;
}
case AS_UPDATE_COLORS:
{
// NOTE: R2: Eventually we will have windows which will notify their children of changes in
@ -476,7 +467,7 @@ void ServerApp::DispatchMessage(int32 code, LinkMsgReader &msg)
void *sharedmem=fSharedMem->GetBuffer(memsize);
BPortLink replylink(replyport);
replylink.SetSendPort(replyport);
if(memsize<1 || sharedmem==NULL)
{
replylink.StartMessage(SERVER_FALSE);
@ -633,7 +624,7 @@ void ServerApp::DispatchMessage(int32 code, LinkMsgReader &msg)
STRACE(("ServerApp %s: Create Bitmap (%.1f,%.1f,%.1f,%.1f)\n",
fSignature.String(),r.left,r.top,r.right,r.bottom));
BPortLink replylink(replyport);
replylink.SetSendPort(replyport);
if(sbmp)
{
fBitmapList->AddItem(sbmp);
@ -669,7 +660,7 @@ void ServerApp::DispatchMessage(int32 code, LinkMsgReader &msg)
msg.Read<int32>(&replyport);
ServerBitmap *sbmp=FindBitmap(bmp_id);
BPortLink replylink(replyport);
replylink.SetSendPort(replyport);
if(sbmp)
{
STRACE(("ServerApp %s: Deleting Bitmap %ld\n",fSignature.String(),bmp_id));
@ -788,7 +779,7 @@ void ServerApp::DispatchMessage(int32 code, LinkMsgReader &msg)
int32 replyport;
msg.Read<int32>(&replyport);
BPortLink replylink(replyport);
replylink.SetSendPort(replyport);
replylink.StartMessage(fCursorHidden ? SERVER_TRUE : SERVER_FALSE);
replylink.Flush();
break;
@ -837,7 +828,7 @@ void ServerApp::DispatchMessage(int32 code, LinkMsgReader &msg)
{
// the application is expecting a reply, but plans to do literally nothing
// with the data, so we'll just reuse the cursor token variable
BPortLink replylink(replyport);
replylink.SetSendPort(replyport);
replylink.StartMessage(SERVER_TRUE);
replylink.Flush();
}
@ -862,7 +853,7 @@ void ServerApp::DispatchMessage(int32 code, LinkMsgReader &msg)
cursormanager->AddCursor(fAppCursor);
// Synchronous message - BApplication is waiting on the cursor's ID
BPortLink replylink(replyport);
replylink.SetSendPort(replyport);
replylink.StartMessage(SERVER_TRUE);
replylink.Attach<int32>(fAppCursor->ID());
replylink.Flush();
@ -893,7 +884,7 @@ void ServerApp::DispatchMessage(int32 code, LinkMsgReader &msg)
port_id replyport;
msg.Read<int32>(&replyport);
BPortLink replylink(replyport);
replylink.SetSendPort(replyport);
replylink.StartMessage(SERVER_TRUE);
replylink.Attach<scroll_bar_info>(sbi);
replylink.Flush();
@ -919,7 +910,7 @@ void ServerApp::DispatchMessage(int32 code, LinkMsgReader &msg)
port_id replyport;
msg.Read<int32>(&replyport);
BPortLink replylink(replyport);
replylink.SetSendPort(replyport);
replylink.StartMessage(SERVER_TRUE);
replylink.Attach<bool>(desktop->FFMouseInUse());
replylink.Flush();
@ -958,7 +949,7 @@ void ServerApp::DispatchMessage(int32 code, LinkMsgReader &msg)
port_id replyport = -1;
msg.Read<int32>(&replyport);
BPortLink replylink(replyport);
replylink.SetSendPort(replyport);
replylink.StartMessage(SERVER_TRUE);
replylink.Attach<mode_mouse>(mmode);
replylink.Flush();
@ -979,12 +970,324 @@ void ServerApp::DispatchMessage(int32 code, LinkMsgReader &msg)
color=gui_colorset.AttributeToColor(whichcolor);
gui_colorset.Unlock();
BPortLink replylink(replyport);
replylink.SetSendPort(replyport);
replylink.StartMessage(SERVER_TRUE);
replylink.Attach<rgb_color>(color.GetColor32());
replylink.Flush();
break;
}
case AS_UPDATED_CLIENT_FONTLIST:
{
STRACE(("ServerApp %s: Acknowledged update of client-side font list\n",fSignature.String()));
// received when the client-side global font list has been
// refreshed
fontserver->Lock();
fontserver->FontsUpdated();
fontserver->Unlock();
break;
}
case AS_QUERY_FONTS_CHANGED:
{
// Attached Data:
// 1) bool check flag
// 2) port_id reply_port
// if just checking, just give an answer,
// if not and needs updated,
// sync the font list and return true else return false
break;
}
case AS_GET_FAMILY_NAME:
{
// Attached Data:
// 1) int32 the ID of the font family to get
// 2) port_id reply port
// Returns:
// 1) font_family - name of family
// 2) uint32 - flags of font family (B_IS_FIXED || B_HAS_TUNED_FONT)
int32 famid;
port_id replyport;
msg.Read<int32>(&famid);
msg.Read<port_id>(&replyport);
replylink.SetSendPort(replyport);
fontserver->Lock();
FontFamily *ffamily=fontserver->GetFamily(famid);
if(ffamily)
{
font_family fam;
sprintf(fam,"%s",ffamily->Name());
replylink.StartMessage(SERVER_TRUE);
replylink.Attach(fam,sizeof(font_family));
replylink.Attach<int32>(ffamily->GetFlags());
replylink.Flush();
}
else
{
replylink.StartMessage(SERVER_FALSE);
replylink.Flush();
}
fontserver->Unlock();
break;
}
case AS_GET_STYLE_NAME:
{
// Attached Data:
// 1) font_family The name of the font family
// 2) int32 ID of the style to get
// 3) port_id reply port
// Returns:
// 1) font_style - name of the style
// 2) uint16 - appropriate face values
// 3) uint32 - flags of font style (B_IS_FIXED || B_HAS_TUNED_FONT)
int32 styid;
port_id replyport;
font_family fam;
msg.Read(fam,sizeof(font_family));
msg.Read<int32>(&styid);
msg.Read<port_id>(&replyport);
replylink.SetSendPort(replyport);
fontserver->Lock();
FontStyle *fstyle=fontserver->GetStyle(fam,styid);
if(fstyle)
{
font_family sty;
sprintf(sty,"%s",fstyle->Name());
replylink.StartMessage(SERVER_TRUE);
replylink.Attach(sty,sizeof(font_style));
replylink.Attach<int32>(fstyle->GetFace());
replylink.Attach<int32>(fstyle->GetFlags());
replylink.Flush();
}
else
{
replylink.StartMessage(SERVER_FALSE);
replylink.Flush();
}
fontserver->Unlock();
break;
}
case AS_GET_FAMILY_AND_STYLE:
{
// Attached Data:
// 1) uint16 - family ID
// 2) uint16 - style ID
// 3) port_id reply port
// Returns:
// 1) font_family The name of the font family
// 2) font_style - name of the style
int32 famid, styid;
port_id replyport;
font_family fam;
font_style sty;
msg.Read<int32>(&famid);
msg.Read<int32>(&styid);
msg.Read<port_id>(&replyport);
replylink.SetSendPort(replyport);
fontserver->Lock();
FontStyle *fstyle=fontserver->GetStyle(famid,styid);
if(fstyle)
{
sprintf(fam,"%s",fstyle->Family()->Name());
sprintf(sty,"%s",fstyle->Name());
replylink.StartMessage(SERVER_TRUE);
replylink.Attach(fam,sizeof(font_family));
replylink.Attach(sty,sizeof(font_style));
replylink.Flush();
}
else
{
replylink.StartMessage(SERVER_FALSE);
replylink.Flush();
}
fontserver->Unlock();
break;
}
case AS_GET_FONT_DIRECTION:
{
// Attached Data:
// 1) uint16 - family ID
// 2) uint16 - style ID
// 3) port_id reply port
// Returns:
// 1) font_direction direction of font
/* int32 famid, styid;
port_id replyport;
msg.Read<int32>(&famid);
msg.Read<int32>(&styid);
msg.Read<port_id>(&replyport);
replylink.SetSendPort(replyport);
fontserver->Lock();
FontStyle *fstyle=fontserver->GetStyle(famid,styid);
if(fstyle)
{
font_direction dir=fstyle->GetDirection();
replylink.StartMessage(SERVER_TRUE);
replylink.Attach<font_direction>(dir);
replylink.Flush();
}
else
{
replylink.StartMessage(SERVER_FALSE);
replylink.Flush();
}
fontserver->Unlock();
*/
break;
}
case AS_GET_FONT_BOUNDING_BOX:
{
// Attached Data:
// 1) uint16 - family ID
// 2) uint16 - style ID
// 3) port_id reply port
// Returns:
// 1) BRect - box holding entire font
break;
}
case AS_GET_TUNED_COUNT:
{
// Attached Data:
// 1) uint16 - family ID
// 2) uint16 - style ID
// 3) port_id reply port
// Returns:
// 1) int32 - number of font strikes available
break;
}
case AS_GET_TUNED_INFO:
{
// Attached Data:
// 1) uint16 - family ID
// 2) uint16 - style ID
// 3) uint32 - index of the particular font strike
// 4) port_id reply port
// Returns:
// 1) tuned_font_info - info on the strike specified
break;
}
case AS_QUERY_FONT_FIXED:
{
// Attached Data:
// 1) uint16 - family ID
// 2) uint16 - style ID
// 3) port_id reply port
// Returns:
// 1) bool - font is/is not fixed
break;
}
case AS_SET_FAMILY_AND_STYLE:
{
// Attached Data:
// 1) font_family - name of font family to use
// 2) font_style - name of style in family
// 3) port_id - reply port
// Returns:
// 1) uint16 - family ID
// 2) uint16 - style ID
break;
}
case AS_SET_FAMILY_AND_FACE:
{
// Attached Data:
// 1) font_family - name of font family to use
// 2) uint16 - font face
// 3) port_id - reply port
// Returns:
// 1) uint16 - family ID
// 2) uint16 - style ID
// TODO: Check R5 for error condition behavior in SET_FAMILY_AND_FACE
break;
}
case AS_COUNT_FONT_FAMILIES:
{
// Attached Data:
// None
// Returns:
// 1) int32 - # of font families
break;
}
case AS_COUNT_FONT_STYLES:
{
// Attached Data:
// 1) font_family - name of font family
// Returns:
// 1) int32 - # of font styles
break;
}
case AS_SET_SYSFONT_PLAIN:
{
// Attached Data:
// None
// Returns:
// 1) uint16 - family ID
// 2) uint16 - style ID
// 3) float - size in points
// 4) uint16 - face flags
// 5) font_height - height structure
// TODO: See if font_height is needed in SET_SYSFONT_XXXX messages
break;
}
case AS_SET_SYSFONT_BOLD:
{
// Attached Data:
// None
// Returns:
// 1) uint16 - family ID
// 2) uint16 - style ID
// 3) float - size in points
// 4) uint16 - face flags
// 5) font_height - height structure
break;
}
case AS_SET_SYSFONT_FIXED:
{
// Attached Data:
// None
// Returns:
// 1) uint16 - family ID
// 2) uint16 - style ID
// 3) float - size in points
// 4) uint16 - face flags
// 5) font_height - height structure
break;
}
default:
{
STRACE(("ServerApp %s received unhandled message code offset %s\n",fSignature.String(),

View File

@ -24,7 +24,6 @@
// Description: Shadow BFont class
//
//------------------------------------------------------------------------------
#include "FontFamily.h"
#include "ServerFont.h"
@ -153,6 +152,16 @@ BRect ServerFont::BoundingBox(void)
return fbounds;
}
const char *ServerFont::GetStyle(void) const
{
return fstyle->Name();
}
const char *ServerFont::GetFamily(void) const
{
return fstyle->Family()->Name();
}
/*!
\brief Obtains the height values for characters in the font in its current state
\param fh pointer to a font_height object to receive the values for the font
@ -163,7 +172,3 @@ void ServerFont::Height(font_height *fh)
fh->descent=fheight.descent;
fh->leading=fheight.leading;
}
/*
@log
* added ServerFont::operator=(const ServerFont& font).
*/

View File

@ -774,18 +774,7 @@ void ViewDriver::SetDrawData(const DrawData *d, bool set_font_data)
if(!sf)
return;
FontStyle *style=d->font.Style();
if(!style)
return;
FontFamily *family=(FontFamily *)style->Family();
if(!family)
return;
font_family fontfamily;
strcpy(fontfamily,family->Name());
font.SetFamilyAndStyle(fontfamily,style->Name());
font.SetFamilyAndStyle(sf->GetFamily(),sf->GetStyle());
font.SetFlags(sf->Flags());
font.SetEncoding(sf->Encoding());
font.SetSize(sf->Size());