plucky (3) astext.3x.gz

Provided by: libafterimage-dev_2.2.12-18_amd64 bug

NAME

       astext - demonstrates antialiased texturized text rendering libAfterImage/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 also surround rendered text with  beveled  frame,  creating  an  illusion  of  a
       button.

       New  steps described in this tutorial are : ASText.1. Opening 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

           #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] \n");
               printf( "                  [-c text_color] [-b background_color]\n");
               printf( "                  [-T foreground_texture] "
                       "[-B background_image]\n");
               printf( "                  [-r foreground_resize_type] "
                       "[-R background_resize_type]\n");
               printf( "                  [-m ]\n");
               printf( "  Where: font - TrueType font's filename or X font spec or "
                       "alias;\n");
               printf( "         size - size in points for TrueType fonts;\n");
               printf( "         text - text to be drawn;\n");
               printf( "         3D_style - 3D style of text. "
                       "One of the following:\n");
               printf( "             0 - plain 2D tetx, 1 - embossed, 2 - sunken, "
                       "3 - shade above,\n");
               printf( "             4 - shade below, 5 - embossed thick, "
                       "6 - sunken thick.\n");
               printf( "             7 - ouline above, 8 - ouline below, "
                       "9 - full ouline.\n");
               printf( "         resize_type - tells how texture/image should be "
                       "transformed to fit\n");
               printf( "         the text size. Could be: scale or tile."
                       "Default is tile\n");
               printf( "         -m make font monospaced. \n");

           }

           int main(int argc, char* argv[]) {
               Display *dpy = NULL;
               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 jumps\nOver The Lazy Fox,\n"
                            "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 \"%s\". "
                               "Falling back to \"fixed\".", font_name );
                   font = get_asfont( fontman, "fixed", 0, size, ASF_GuessWho );
                   if( font == NULL )
                   {
                       show_error("font \"fixed\" is not available either. Aborting.");
                       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);
                       dpy = NULL; #else
                       /* writing result into the file */
                       ASImage2file( rendered_im, NULL, "astext.jpg", ASIT_Jpeg,
                                     NULL );
                       destroy_asimage( &rendered_im ); #endif
                   }
               }
               return 0 ; }

       libAfterImage/tutorials/ASText.1 [7.1]

SYNOPSIS

       Step 1. Opening and closing fonts.

DESCRIPTION

       Before any text can be rendered using libAfterImage - desired font has to be opened for use. Font opening
       process  is  two-step.  At first we need to create font manager ( ASFontManager ). That is done once, and
       same font manager can be used throughout entire application. It contains information about used  external
       libraries, hash of opened fonts, and some other info.

       When  ASFontManager  is  created  it could be used to obtain actuall fonts.  get_asfont() call is used to
       query cache of the ASFontManager, to see if the font has been loaded already, and if not - then  it  will
       load the 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 \"fixed\" is not available either.
                                   Aborting.");
                   return 1;
               }
           }
           ...
           destroy_font( font );
           destroy_font_manager( fontman, False );

SEE ALSO

       create_font_manager(), get_asfont(), destroy_font(), destroy_font_manager()
       libAfterImage/tutorials/ASText.2 [7.2]

SYNOPSIS

       Step 2. Approximating rendered text size.

DESCRIPTION

       Prior  to  actually  drawing  the text it is useful to estimate the size of the image, that rendered text
       will occupy, So that window can be created of appropriate size, and  othe  interface  elements  laid  out
       accordingly. get_text_size() could be used to obtain rendered text size 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 texture to fit the text. In order to
       texturize the text  - we need to use rendered text as an alpha channel on texture image. That can  easily
       be done only if both images are the same size.

SEE ALSO

       get_text_size(), scale_asimage(), tile_asimage(), ASText.3
       libAfterImage/tutorials/ASText.3 [7.3]

SYNOPSIS

       Step 3. Rendering texturized text.

DESCRIPTION

       The most effective text texturization technique provided by libAfterImage consists of substitution of the
       alpha channel of the texture, with rendered text. That is possible since all the text  is  rendered  into
       alpha  channel only. move_asimage_channel() call is used to accomplish this operation. This call actually
       removes channel data from the original image and stores it in destination image. If there  was  something
       in  destination image's channel  already - it will be destroyed.  All kinds of nifty things could be done
       using this call, actually.  Like, for example, rendered text can be  moved  into  green  channel  of  the
       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 the same size. It will do nothing
       otherwise.

SEE ALSO

       draw_text(), move_asimage_channel()
       libAfterImage/tutorials/ASText.4 [7.4]

SYNOPSIS

       Step 4. Merging foreground and background with bevel.

DESCRIPTION

       On this step we have 2 images ready for us - background and texturized text. At this  point  we  need  to
       merge  them  together  by  alpha-blending  text  over  background  (remember  -  text is alpha-channel of
       foreground texture). At the same time we would like to add some nice bevel border around entire image. To
       accomplish  that  task  all  we  have  to  do  is  setup  ASImageLayer  structure for both background and
       foreground, and apply merge_layers on them. When it is done - we no longer need original  images  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 image size, hence we have to use
       width+BEVEL_ADDON , height+BEVEL_ADDON as desired image size.

SEE ALSO

       ASImageLayer, ASImageBevel, merge_layers()