Ejemplo n.º 1
0
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]);
        }
    }