INF:_pg_setpalette Causes Incorrect Display for Extended ASCII

ID Number: Q70362

6.00 6.00a 6.00ax

MS-DOS

Summary:

When attempting to reset the Presentation Graphics palette to display

an extended ASCII character as a plotted point, a different character

may be printed than expected. This problem occurs with the

_pg_setpalette() function in C versions 6.0, 6.0a, and 6.0ax and

QuickC versions 2.5 and 2.51 [but not with the _pg_setpalette()

function in QuickC versions 2.0 and 2.01].

More Information:

The _pg_setpalette() function sets a palette that is used by the

presentation graphics routines. This palette contains colors, line

styles, fill patterns, and plot characters specifically defined by the

user.

When defining these plot characters with extended ASCII characters,

the actual character displayed may be different than what was defined.

The sample code below demonstrates this problem. Note that the ASCII

character displayed incorrectly is ASCII 254. All extended ASCII

characters of value 175 and below seem to be displayed correctly;

however, most characters above 175 are displayed incorrectly, usually

as single dashes.

This problem is occurring because with QuickC versions 2.5 and later,

and C versions 6.0 and later, characters are based on the ANSI

character set, and the actual implementation of additional characters

are undefined (Section 2.2.1). The ANSI character set consists of all

uppercase and lowercase letters, decimal digits 0 - 10, and the

following graphics characters:

! " # % & ' ( ) * + , - . / :

; < = > ? [ \ ] _ { | } ~

When using the CodeView debugger and setting a watch on

pal[1].plotchar, it can be seen that the correct value is being placed

in memory. However, _pg_setpalette() does not initialize this value

correctly for the presentation graphics functions.

Sample Code

-----------

/* Compiler options needed: none

*/

#include <graph.h>

#include <pgchart.h>

#include <stdio.h>

#include <conio.h>

#define VALUES 5

float _far xvals[VALUES] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f};

float _far yvals[VALUES] = {11.0f, 9.0f, 12.0f, 8.0f, 5.0f};

void main(void)

{

chartenv env;

palettetype pal;

_setvideomode(_MAXRESMODE);

_pg_initchart();

_pg_defaultchart( &env, _PG_SCATTERCHART, _PG_POINTANDLINE );

_pg_getpalette((paletteentry _far *)pal);

pal[1].plotchar = 254; /* This value does not get */

/* printed correctly */

_pg_setpalette((paletteentry _far *)pal);

_pg_chartscatter(&env, xvals, yvals, VALUES);

getch();

_setvideomode(_DEFAULTMODE);

}

Additional reference words: 6.00 6.00a 6.00ax