status_t ServerFont::GetGlyphShapes(const char charArray[], int32 numChars, BShape* shapeArray[]) const { if (!charArray || numChars <= 0 || !shapeArray) return B_BAD_DATA; FT_Face face = GetTransformedFace(true, true); if (!face) return B_ERROR; FT_Outline_Funcs funcs; funcs.move_to = MoveToFunc; funcs.line_to = LineToFunc; funcs.conic_to = ConicToFunc; funcs.cubic_to = CubicToFunc; funcs.shift = 0; funcs.delta = 0; const char* string = charArray; for (int i = 0; i < numChars; i++) { shapeArray[i] = new (std::nothrow) BShape(); if (shapeArray[i] == NULL) { PutTransformedFace(face); return B_NO_MEMORY; } FT_Load_Char(face, UTF8ToCharCode(&string), FT_LOAD_NO_BITMAP); FT_Outline outline = face->glyph->outline; FT_Outline_Decompose(&outline, &funcs, shapeArray[i]); shapeArray[i]->Close(); } PutTransformedFace(face); return B_OK; }
void Mesh::GetFaceBounds(int faceidx, bool objectspace, bbox& bounds) const { float3 verts[4]; const int numVert = GetTransformedFace(faceidx, objectspace ? matrix() : worldmat_, verts); bounds = bbox(verts[0], verts[1]); bounds.grow(verts[2]); if(numVert == 4 ) { bounds.grow(verts[3]); } }