/* Paint backdrop
---------------------------------------------------------------------------------*/
void TableSkin::PaintBackdrop( const Painter& painter, const Pos &p )
{
    if ( Exists(SOURCE) )
    {
        _point_cache.clear();
        _rect_cache.clear();
        ThinkFrame( _point_cache, _rect_cache, p);

        ThinkBackdrop( _point_cache, _rect_cache, p );

        painter.ProjectImages( GetImage(SOURCE), _point_cache, _rect_cache );
    }
}
void AlphaFont::Paint( const Painter &painter, const Text &text, const Pos &pos )
{
    PreformatedText preformated = text;
    PreformatedText::ConstIterator subtext_i = preformated.ConstBegin();
    Pos carret = pos;

    MaskedColor &mask = (MaskedColor &)( (*_faces).GetImage( ImageDicer::SOURCE ) );

    for (; !!subtext_i; ++subtext_i )
    {
        const UniCode *p = &*preformated.begin() + (*subtext_i).start;
        const UniCode *q = &*preformated.begin() + (*subtext_i).end;

        ApplyMarkup( *subtext_i );

        if ( p==q ) { continue; }

        PointList points;
        RectList rects;
        ThinkQuick( p, q, points, rects, carret );
        
        if ( _back_opacity > 0.0 )
        {
            mask.InvertMask(true);
            mask.SetAlphaFactors( 0, 255.0*_back_opacity );
            mask.SetColor( _back_color );
            painter.ProjectImages( mask, points, rects );
        }
        if ( _opacity > 0.0 )
        {
            mask.InvertMask(false);
            mask.SetAlphaFactors( 0, 255.0*_opacity );
            mask.SetColor( _color );
            painter.ProjectImages( mask, points, rects );
        }
    }
}
/* Paint frame & grid
---------------------------------------------------------------------------------*/
void TableSkin::PaintGrid    ( const Painter& painter, const Pos &p )
{
    if ( Exists(SOURCE) )
    {
        if ( _point_cache.empty() || _rect_cache.empty() )
        {
            _point_cache.clear();
            _rect_cache.clear();
            ThinkFrame( _point_cache, _rect_cache, p);
        }
        PointList points;
        RectList  rects;
        ThinkGrid( points, rects, p);
        painter.ProjectImages( GetImage(SOURCE), points, rects );

        _point_cache.clear();
        _rect_cache.clear();
    }
}