//----------------------------------------------------------------// void MOAIDraw::DrawString ( cc8* text, float x, float y, float width, float height ) { // Sanity check size_t textLength = strlen ( text ); if ( textLength <= 0 ) return; // Get the context data assert ( g_CurrentTextDrawContext ); // Transform the center into 'world' space MOAIGfxDevice& gfxDevice = MOAIGfxDevice::Get (); const ZLMatrix4x4& orgWorldTransform = gfxDevice.GetVertexTransform ( MOAIGfxDevice::VTX_WORLD_TRANSFORM ); USVec2D pos ( x, y ); orgWorldTransform.Transform ( pos ); x = pos.mX; y = pos.mY; // Extract the 'state' MOAIFont& font = *g_CurrentTextDrawContext->mFont; float scale = g_CurrentTextDrawContext->mScale; float fontSize = g_CurrentTextDrawContext->mFontSize; MOAIGlyphSet* glyphSet = font.GetGlyphSet ( fontSize ); assert ( glyphSet ); // Let's draw the string! float cursorX = x; float cursorY = y + glyphSet->GetAscent() * scale; MOAIGlyph* prevGlyph = 0; // Update the glyph cache for ( size_t i = 0; i < textLength; i++ ) { cc8 c = text [ i ]; if ( c != '\n' ) { font.AffirmGlyph ( fontSize, c ); } } font.ProcessGlyphs (); glyphSet = font.GetGlyphSet ( fontSize ); assert ( glyphSet ); for ( size_t i = 0; i < textLength; i++ ) { cc8 c = text [ i ]; if ( c == '\n' ) { // Move to the next line cursorX = x; cursorY += glyphSet->GetHeight () * scale; prevGlyph = 0; if ( height > 0 && (cursorY - y) > height ) { break; } } else { if ( width > 0 && (cursorX - x) > width ) { continue; } // Get the glyph for the current character MOAIGlyph* glyph = glyphSet->GetGlyph ( c ); if ( glyph ) { // Draw the current glyph MOAITextureBase* glyphTexture = font.GetGlyphTexture ( *glyph ); if ( glyphTexture ) { GlyphPlacement placement = { glyph, cursorX, cursorY }; g_CurrentTextDrawContext->mGlyphs.push_back( placement ); } // Apply kerning if ( prevGlyph ) { MOAIKernVec kern = prevGlyph->GetKerning ( glyph->GetCode () ); cursorX += kern.mX * scale; } // Move the cursor cursorX += glyph->GetAdvanceX () * scale; } prevGlyph = glyph; } } }