SEARCH
NEW RPMS
DIRECTORIES
ABOUT
FAQ
VARIOUS
BLOG

BotDetect - Real-Time Bot Detection API
 
 

MAN page from Other AfterStep-2.2.2-20060804.i386.rpm

astext

Section: AfterStep X11 window manager (1)
Updated: AfterStep v.2.2.2
Index 

NAME

astext - demonstrates antialiased texturized text renderinglibAfterImage/tutorials/ASText 

NAMEASText

 

SYNOPSIS

libAfterImage application for rendering texturized text.
 

DESCRIPTION

In this tutorial we will attempt to render arbitrary text in window,with optional texturized background and foreground. We shall alsosurround rendered text with beveled frame, creating an illusion of abutton.New steps described in this tutorial are :ASText.1. Openning and closing fonts.ASText.2. Approximating rendered text size.ASText.3. Rendering texturized text.ASText.4. Merging foreground and background with bevel.
 

SEE ALSO

Tutorial 1: ASView  - explanation of basic steps needed to use                      libAfterImage and some other simple things.Tutorial 2: ASScale - image scaling basics.Tutorial 3: ASTile  - image tiling and tinting.Tutorial 4: ASMerge - scaling and blending of arbitrary number of                      images.Tutorial 5: ASGrad  - drawing multipoint linear gradients.Tutorial 6: ASFlip  - image rotation.
 

SOURCE

Source :
#include "../afterbase.h"#include "../afterimage.h"#include "common.h"/* Usage:  astext [-f font] [-s size] [-t text] [-S 3D_style]                  [-c text_color] [-b background_color]                  [-T foreground_texture] [-B background_image]                  [-r foreground_resize_type] [-R background_resize_type] */#define BEVEL_HI_WIDTH 20#define BEVEL_LO_WIDTH 30#define BEVEL_ADDON    (BEVEL_HI_WIDTH+BEVEL_LO_WIDTH)void usage(){    printf( "  Usage:   astext [-h] [-f font] [-s size] [-t text] "            "[-S 3D_style] );    printf( "                  [-c text_color] [-b background_color]);    printf( "                  [-T foreground_texture] "            "[-B background_image]);    printf( "                  [-r foreground_resize_type] "            "[-R background_resize_type]);    printf( "                  [-m ]);    printf( "  Where: font - TrueType font's filename or X font spec or "            "alias;);    printf( "         size - size in points for TrueType fonts;);    printf( "         text - text to be drawn;);    printf( "         3D_style - 3D style of text. "            "One of the following:);    printf( "             0 - plain 2D tetx, 1 - embossed, 2 - sunken, "            "3 - shade above,);    printf( "             4 - shade below, 5 - embossed thick, "            "6 - sunken thick.);    printf( "             7 - ouline above, 8 - ouline below, "            "9 - full ouline.);    printf( "         resize_type - tells how texture/image should be "            "transformed to fit);    printf( "         the text size. Could be: scale or tile."             "Default is tile);    printf( "         -m make font monospaced. );}int main(int argc, char* argv[]){    ASVisual *asv = NULL ;    int screen = 0, depth = 0;    char *font_name = "test.ttf";    int size = 32 ;#if 0    char *text = "  还没有";  /* chinese */ #else    char *text = "Smart Brown Dog jumpsver The Lazy Fox,                 "and falls into the ditch.";#endif    ARGB32 text_color = ARGB32_White, back_color = ARGB32_Black;    char *text_color_name = "#FFFFFFFF", *back_color_name = "#FF000000";    char *fore_image_file = "fore.xpm" ;    char *back_image_file = "back.xpm" ;    Bool scale_fore_image = False, scale_back_image = False ;    ASImage *fore_im = NULL, *back_im = NULL;    ASImage *text_im = NULL ;    struct ASFontManager *fontman = NULL;    struct ASFont  *font = NULL;    unsigned int width, height ;    int i ;    int text_margin = size/2 ;    Bool monospaced = False ;    char * font_path = NULL;    ASTextAttributes attr = {ASTA_VERSION_1, ASTA_UseTabStops,                              AST_ShadeBelow, ASCT_UTF8, 8, 0,                              NULL, 0, ARGB32_White };        /* see ASView.1 : */    set_application_name( argv[0] );#if (HAVE_AFTERBASE_FLAG==1)    set_output_threshold(OUTPUT_LEVEL_DEBUG);#endif    if( argc == 1 )        usage();    else for( i = 1 ; i < argc ; i++ )    {        if( strncmp( argv[i], "-h", 2 ) == 0 )        {            usage();            return 0;        }        if( strncmp( argv[i], "-m", 2 ) == 0 )        {            monospaced = True ;        }else if( i+1 < argc )        {            if( strncmp( argv[i], "-f", 2 ) == 0 )                font_name = argv[i+1] ;            else if( strncmp( argv[i], "-s", 2 ) == 0 )            {                size = atoi(argv[i+1]);                text_margin = size/2 ;            }else if( strncmp( argv[i], "-t", 2 ) == 0 )                text = argv[i+1] ;            else if( strncmp( argv[i], "-S", 2 ) == 0 )            {                attr.type = atoi(argv[i+1]);                if( attr.type >= AST_3DTypes )                {                    show_error( "3D type is wrong. "                                "Using 2D Plain instead.");                    attr.type = AST_Plain ;                }            }else if( strncmp( argv[i], "-c", 2 ) == 0 )                text_color_name = argv[i+1] ;            else if( strncmp( argv[i], "-b", 2 ) == 0 )                back_color_name = argv[i+1] ;            else if( strncmp( argv[i], "-T", 2 ) == 0 )                fore_image_file = argv[i+1] ;            else if( strncmp( argv[i], "-B", 2 ) == 0 )                back_image_file = argv[i+1] ;            else if( strncmp( argv[i], "-r", 2 ) == 0 )                scale_fore_image = (strcmp( argv[i+1], "scale") == 0);            else if( strncmp( argv[i], "-R", 2 ) == 0 )                scale_back_image = (strcmp( argv[i+1], "scale") == 0);        }    }#ifndef X_DISPLAY_MISSING    dpy = XOpenDisplay(NULL);    _XA_WM_DELETE_WINDOW = XInternAtom( dpy, "WM_DELETE_WINDOW", False);    screen = DefaultScreen(dpy);    depth = DefaultDepth( dpy, screen );#endif    /* see ASText.1 : */    if( getenv("FONT_PATH") != NULL )     {        font_path = safemalloc( strlen(getenv("FONT_PATH"))+1+2+1);        sprintf( font_path, "%s:./", getenv("FONT_PATH") );            }        if( (fontman = create_font_manager( dpy, font_path, NULL )) != NULL )        font = get_asfont( fontman, font_name, 0, size,                            ASF_GuessWho|(monospaced?ASF_Monospaced:0) );    if( font == NULL )    {        show_error( "unable to load requested font                     "Falling back to         font = get_asfont( fontman, "fixed", 0, size, ASF_GuessWho );        if( font == NULL )        {            show_error("font             return 1;        }    }    /*for( i = 0 ; i < 128 ; ++i )         print_asglyph( stderr, font, i); */    parse_argb_color( text_color_name, &text_color );    parse_argb_color( back_color_name, &back_color );    attr.fore_color = text_color ;    if( attr.type >= AST_OutlineAbove )         fore_image_file = NULL ;    /* see ASView.3 : */    asv = create_asvisual( dpy, screen, depth, NULL );    /* see ASText.2 : */    /*set_asfont_glyph_spacing( font, 10, 40 );*/    /*Simple way:get_text_size( text, font, attr.type, &width, &height ); */    /*Fancy way : */    get_fancy_text_size( text, font, &attr, &width, &height, 0, NULL );/* show_progress( "extimated text size = %dx%d", width, height ); */        if( fore_image_file )    {        ASImage *tmp = file2ASImage( fore_image_file, 0xFFFFFFFF,                                     SCREEN_GAMMA, 0, getenv("IMAGE_PATH"), NULL );        if( tmp )        {            if( tmp->width != width || tmp->height != height )            {   /* see ASScale.2 : */                if( scale_fore_image )                    fore_im = scale_asimage( asv, tmp, width, height,                                             ASA_ASImage, 0,                                              ASIMAGE_QUALITY_DEFAULT );                else                    fore_im = tile_asimage( asv, tmp, 0, 0,                                             width, height, 0,                                            ASA_ASImage, 0,                                             ASIMAGE_QUALITY_DEFAULT );                destroy_asimage( &tmp );            }else                fore_im = tmp ;        }else            fore_im = NULL ;    }    width  += text_margin*2 + BEVEL_ADDON;    height += text_margin*2 + BEVEL_ADDON;    if( back_image_file )    { /* see ASView.2 : */        ASImage *tmp = file2ASImage( back_image_file, 0xFFFFFFFF,                                    SCREEN_GAMMA, 0, getenv("IMAGE_PATH"), NULL );        if( tmp )        {            if( scale_back_image &&                 (tmp->width != width || tmp->height != height) )            {   /* see ASScale.2 : */                back_im = scale_asimage( asv, tmp, width, height,                                         ASA_ASImage, 0,                                          ASIMAGE_QUALITY_DEFAULT );                destroy_asimage( &tmp );            }else                back_im = tmp ;        }else            back_im = NULL ;    }    /* see ASText.3 : */    /* simple way : text_im = draw_text( text, font, attr.type, 0 ); */    text_im = draw_fancy_text( text, font, &attr, 0, 0 );    if( fore_im )    {        move_asimage_channel( fore_im, IC_ALPHA, text_im, IC_ALPHA );        destroy_asimage( &text_im );    }else        fore_im = text_im ;    /* see ASText.1 : */    release_font( font );    destroy_font_manager( fontman, False );    if( fore_im )    {        ASImage *rendered_im ;        ASImageLayer layers[2] ;        ASImageBevel bevel = {0/*BEVEL_SOLID_INLINE*/, 0xFFDDDDDD,                               0xFF555555, 0xFFFFFFFF,                               0xFF777777, 0xFF222222,                              BEVEL_HI_WIDTH, BEVEL_HI_WIDTH,                              BEVEL_LO_WIDTH, BEVEL_LO_WIDTH,                              BEVEL_HI_WIDTH, BEVEL_HI_WIDTH,                              BEVEL_LO_WIDTH, BEVEL_LO_WIDTH } ;        /* see ASText.4 : */        init_image_layers( &(layers[0]), 2 );        if( back_im )            back_im->back_color = back_color ;        if( fore_im )             fore_im->back_color = text_color ;        layers[0].im = back_im ;        layers[0].dst_x = 0 ;        layers[0].dst_y = 0 ;        layers[0].clip_width = width ;        layers[0].clip_height = height ;        layers[0].bevel = &bevel ;        layers[1].im = fore_im ;        layers[1].dst_x = text_margin+BEVEL_HI_WIDTH*2 ;        layers[1].dst_y = text_margin+                            MIN( (int)text_margin,                                ((int)font->max_height-                                 (int)font->max_ascend))/2+                                 BEVEL_HI_WIDTH*2;        if( fore_im )         {               layers[1].clip_width = fore_im->width ;            layers[1].clip_height = fore_im->height ;        }        rendered_im = merge_layers( asv, &(layers[0]), 2,                                    width+BEVEL_ADDON, height+BEVEL_ADDON,#ifndef X_DISPLAY_MISSING                                    ASA_XImage,#else                                    ASA_ASImage,#endif                                    0, ASIMAGE_QUALITY_DEFAULT);        destroy_asimage( &fore_im );        destroy_asimage( &back_im );        if( rendered_im )        {#ifndef X_DISPLAY_MISSING            Window w;            /* see ASView.4 : */            w = create_top_level_window( asv, DefaultRootWindow(dpy),                                          32, 32,                                         width+BEVEL_ADDON,                                          height+BEVEL_ADDON,                                         1, 0, NULL,                                         "ASText", text );            if( w != None )            {                Pixmap p ;                XMapRaised   (dpy, w);                /* see ASView.5 : */                p = asimage2pixmap( asv, DefaultRootWindow(dpy),                                     rendered_im, NULL, True );                destroy_asimage( &rendered_im );                /* see common.c: set_window_background_and_free() : */                p = set_window_background_and_free( w, p );                /* see common.c: wait_closedown() : */                wait_closedown(w);            }            if( dpy )                XCloseDisplay (dpy);#else            /* writing result into the file */            ASImage2file( rendered_im, NULL, "astext.jpg", ASIT_Jpeg,                           NULL );            destroy_asimage( &rendered_im );#endif        }    }    return 0 ;}
 

SYNOPSIS

Step 1. Openning and closing fonts.
 

DESCRIPTION

Before any text can be rendered using libAfterImage - desired fonthas to be opened for use. Font opening process is two-step. At firstwe need to create font manager ( ASFontManager ). That is done once,and same font manager can be used throughout entire application. Itcontains information about used external libraries, hash of openedfonts, and some other info.When ASFontManager is created it could be used to obtain actuall fonts.get_asfont() call is used to query cahce of the ASFontManager, to seeif the font has been loaded already, and if not - then it will loadthe font and prepare it for drawing.
 

EXAMPLE

    if( (fontman = create_font_manager( dpy, NULL, NULL )) != NULL )        font = get_asfont( fontman, font_name, 0, size, ASF_GuessWho);    if( font == NULL )    {        font = get_asfont( fontman, "fixed", 0, size, ASF_GuessWho );        if( font == NULL )        {            show_error( "font                             Aborting.");            return 1;        }    }    ...    destroy_font( font );    destroy_font_manager( fontman, False );
 

SEE ALSO

create_font_manager(), get_asfont(), destroy_font(),destroy_font_manager()
 

SYNOPSIS

Step 2. Approximating rendered text size.
 

DESCRIPTION

Prior to actually drawing the text it is usefull to estimate the sizeof the image, that rendered text will occupy, So that window can becreated of appropriate size, and othe interface elements laid outaccordingly. get_text_size() could be used to obtain rendered textsize without actually drawing it.
 

EXAMPLE

    get_text_size( text, font, type_3d, &width, &height );    if( fore_image_file )    {        ASImage *tmp = file2ASImage( fore_image_file, 0xFFFFFFFF,                                     SCREEN_GAMMA, 0, NULL );        if( tmp )        {            if( tmp->width != width || tmp->height != height )            {                if( scale_fore_image )                    fore_im = scale_asimage( asv, tmp, width, height,                                             ASA_ASImage, 0,                                             ASIMAGE_QUALITY_DEFAULT );                else                    fore_im = tile_asimage( asv, tmp, 0, 0,                                            width, height, 0,                                            ASA_ASImage, 0,                                            ASIMAGE_QUALITY_DEFAULT );                destroy_asimage( &tmp );            }else                fore_im = tmp ;        }    }
 

NOTES

In this particular example we either tile or scale foreground textureto fit the text. In order to texturize the text  - we need to userendered text as an alpha channel on texture image. That can easilybe done only if both images are the same size.
 

SEE ALSO

get_text_size(), scale_asimage(), tile_asimage(), ASText.3
 

SYNOPSIS

Step 3. Rendering texturized text.
 

DESCRIPTION

The most effective text texturization technique provided bylibAfterImage consists of substitution of the alpha channel of thetexture, with rendered text. That is possible since all the text isrendered into alpha channel only. move_asimage_channel() call is usedto accomplish this operation. This call actually removes channeldata from the original image and stores it in destination image. Ifthere was something in destination image's channel  already - it willbe destroyed.All kinds of nifty things could be done using this call, actually.Like, for example, rendered text can be moved into green channel ofthe texture, creating funky effect.
 

EXAMPLE

    text_im = draw_text( text, font, 0 );    if( fore_im )    {        move_asimage_channel( fore_im, IC_ALPHA, text_im, IC_ALPHA );        destroy_asimage( &text_im );    }else        fore_im = text_im ;
 

NOTES

move_asimage_channel() will only work if both images have exactly thesame size. It will do nothing otherwise.
 

SEE ALSO

draw_text(), move_asimage_channel()
 

SYNOPSIS

Step 4. Merging foreground and background with bevel.
 

DESCRIPTION

On this step we have 2 images ready for us - background and texturizedtext. At this point we need to merge them together by alpha-blendingtext over background (remeber - text is alpha-channel of foregroundtexture). At the same time we would like to add some nice bevel borderaround entire image. To accomplish that task all we have to do is setupASImageLayer structure for both background and foreground, and applymerge_layers on them. When it is done - we no longer need originalimages and we destroy them to free up some memory.
 

EXAMPLE

    ASImageLayer layers[2] ;    ASImageBevel bevel = {0, 0xFFDDDDDD, 0xFF555555,                             0xFFFFFFFF, 0xFF777777, 0xFF444444,                          BEVEL_HI_WIDTH, BEVEL_HI_WIDTH,                          BEVEL_LO_WIDTH, BEVEL_LO_WIDTH,                          BEVEL_HI_WIDTH, BEVEL_HI_WIDTH,                          BEVEL_LO_WIDTH, BEVEL_LO_WIDTH } ;    memset( &(layers[0]), 0x00, sizeof(layers) );    layers[0].im = back_im ;    layers[0].clip_width = width ;    layers[0].clip_height = height ;    layers[0].merge_scanlines = alphablend_scanlines ;    layers[0].bevel = &bevel ;    layers[1].im = fore_im ;    layers[1].dst_x = TEXT_MARGIN ;    layers[1].dst_y = TEXT_MARGIN ;    layers[1].clip_width = fore_im->width ;    layers[1].clip_height = fore_im->height ;    layers[1].back_color = text_color ;    layers[1].merge_scanlines = alphablend_scanlines ;    rendered_im = merge_layers( asv, &(layers[0]), 2,                                width+BEVEL_ADDON, height+BEVEL_ADDON,                                ASA_XImage, 0, ASIMAGE_QUALITY_DEFAULT);    destroy_asimage( &fore_im );    destroy_asimage( &back_im );
 

NOTES

We have to remember that outside bevel border will addup to the imagesize, hence we have to use width+BEVEL_ADDON , height+BEVEL_ADDON asdesired image size.
 

SEE ALSO

ASImageLayer, ASImageBevel, merge_layers()


 

Index

NAME
NAMEASText
SYNOPSIS
DESCRIPTION
SEE ALSO
SOURCE
SYNOPSIS
DESCRIPTION
EXAMPLE
SEE ALSO
SYNOPSIS
DESCRIPTION
EXAMPLE
NOTES
SEE ALSO
SYNOPSIS
DESCRIPTION
EXAMPLE
NOTES
SEE ALSO
SYNOPSIS
DESCRIPTION
EXAMPLE
NOTES
SEE ALSO

This document was created byman2html,using the manual pages.
 
ICM Bot detect detector