//
// Draw_TString
void Draw_TString(int x, int y, char *str)
{
	  TextBegin(network_text);
	  DrawString(network_text, x, y, str);
	  TextEnd();

} // end of the func
Example #2
0
// gradient demos linear and radial gradients
void gradient(int width, int height) {
	VGfloat x1, y1, x2, y2, cx, cy, fx, fy, r;
	VGfloat w = (VGfloat)width;
	VGfloat h = (VGfloat)height;
	VGfloat dotcolor[4] = {0, 0, 0, 0.3};
	
	
	VGfloat stops[] = {
		0.0, 1.0, 1.0, 1.0, 1.0,
		0.5, 0.5, 0.5, 0.5, 1.0,
		1.0, 0.0, 0.0, 0.0, 1.0
	};
				
	
	x1 = w/8;
	x2 = (w*3)/8;
	y1 = h/3;
	y2 = (h*2)/3;
	cx = (w*3)/4;
	cy = (h/2);
	r = (x2-x1);
	fx = cx + (r/4);
	fy = cy + (r/4);
	Start(w, h);
	Background(128, 128, 128);
	

	FillLinearGradient(x1, y1, x2, y2, stops, 3);
	Rect(x1, y1, x2-x1, y2-y1);
	FillRadialGradient(cx, cy, fx, fy, r, stops, 3);
	Circle(cx, cy, r);
	
	RGBA(.5, 0, 0, 0.3, dotcolor);
	setfill(dotcolor);
	Circle(x1, y1, 10);
	Circle(x2, y2, 10);
	Circle(cx, cy, 10);
	Circle(cx+r/2, cy, 10);
	Circle(fx, fy, 10);
	
	RGB(0,0,0,dotcolor);
	setfill(dotcolor);
	TextMid(x1, y1-20, "(x1, y1)", 18);
	TextMid(x2, y2+10, "(x2, y2)", 18);
	TextMid(cx, cy, "(cx, cy)", 18);
	TextMid(fx, fy, "(fx, fy)", 18);
	TextEnd(cx+(r/2)+20, cy, "r", 18);
	
	
	TextMid(x1+((x2-x1)/2), h/6, "Linear Gradient", 36);
	TextMid(cx, h/6, "Radial Gradient", 36);
	
	
	End();

}
//
// Print_Score
//
void Print_Score(void)
{
	int i = 0;
	char buffer[80];
	int x,y;
	
	for (i = 0; i < MAX_SCORE_DISPLAY; i++)
	{
		sprintf(buffer, "P%d %0.2f %d\n", 
			ant_globals->score_obj[i].name, 
			ant_globals->score_obj[i].score, 
			ant_globals->score_obj[i].kills);

		TextBegin(score_text);
		DrawString(score_text, 10, 4+(i*10), buffer);
		TextEnd();

	} // end of the for 

	// Also, print frames per second
	sprintf(buffer, "FPS: %0.2f", framerate);
	TextBegin(score_text);
	DrawString(score_text, 500, 4, buffer);
	TextEnd();

	// And the score and health
	sprintf(buffer, "Armor: %0.2f", ant_globals->player_health);
	TextBegin(score_text);
	DrawString(score_text, 300, 4, buffer);
	TextEnd();

	// Print the current position
	sprintf(buffer, "%d/%d Bots",
		ant_globals->alive_bots, (MAX_FIRE_ANTS-1));
	TextBegin(score_text);
	DrawString(score_text, 300, 14, buffer);
	TextEnd();

	// Print some paused text
	if (ant_globals->paused)
	{
		
		// find the correct x pos
		x = 12 * 8;
		x /= 2;
		
		x = (SCREEN_WIDTH/2) - x;
		y = (SCREEN_HEIGHT / 2);
		
		// And the score and health
		sprintf(buffer, "- PAUSED -", ant_globals->player_health);
		TextBegin(score_text);
		DrawString(score_text, x, y, buffer);
		TextEnd();

		sprintf(buffer, "(GLANTS)");
		TextBegin(score_text);
		DrawString(score_text, x+8, y+10, buffer);
		TextEnd();



	} // end of the if 

} // end of the function 
Example #4
0
File: osd.c Project: noonat/omplex
void show_osd(int played, int duration, char* title)
{
    if (MAIN_OSD == NULL)
    {
        // Calling ``init_osd`` everytime seems wasteful, but it is needed to
        // ensure that the OSD is visible.  The main issue is that if the player
        // is stopped and then restarted, the graphics library needs to be
        // reinitalized, otherwise the OSD is not drawn ontop of the video.
        init_osd();
    }

    OSD* osd = MAIN_OSD;

    if (played > duration)
    {
        played = duration;
    }

    osd->duration   = duration;
    osd->played     = played;
    osd->title      = title;

    Start(osd->width, osd->height);

    Fill(255,255,255,1);
    Text(32, 120+82+20, "PAUSED", OpenSansBold, 16);

    // Main OSD background
    Fill(0, 0, 0, 0.5);
    Roundrect(22, 82, osd->width-44, 120, 15, 15);

    ///////////////////////////////////////////////////////////////////////
    // Header
    ///////////////////////////////////////////////////////////////////////
    Fill(0, 0, 0, 1);
    Roundrect(22, 120+82-20, osd->width-44, 20, 15, 15);  // Top of the header
    Rect(22, 120+82-(54+10), osd->width-44, 54);          // Bottom of header

    // Current time
    get_time(osd->time_now, 0);
    Fill(102, 102, 102, 1);
    Text(46, 162, osd->time_now, OpenSansSemiBold, 14);

    // End time
    if (duration > 0)
    {
        get_time(osd->time_end, osd->duration-osd->played);
        TextEnd(osd->width-46, 162, osd->time_end, OpenSansSemiBold, 14);
    }

    // Title text
    Fill(255, 255, 255, 1);
    int title_width = TextWidth(osd->title, OpenSansSemiBold, 20);
    Text((osd->width/2)-(title_width/2), 162, osd->title, OpenSansSemiBold, 20);


    ///////////////////////////////////////////////////////////////////////////

    ///////////////////////////////////////////////////////////////////////////
    // Progress Bar
    ///////////////////////////////////////////////////////////////////////////
    if (duration > 0)
    {
        int   pbar_width = osd->width-288;
        float pct_player = (float)played/duration;
        Fill(255, 255, 255, 0.2);                               // Transparent bg
        Roundrect(142, 102, pbar_width, 12, 10, 10);            // Centered

        Fill(209, 125, 30, 1);                                  // Orange bar (progress)
        Roundrect(142, 102, pbar_width*pct_player, 12, 10, 10); // Left justified

        // Progress text
        seconds_to_str(osd->pos_now, osd->played);
        seconds_to_str(osd->pos_end, osd->duration-osd->played);

        // Text shadow
        Fill(0, 0, 0, 1);
        Text(46-1, 102-1, osd->pos_now, OpenSansSemiBold, 12);
        TextEnd(osd->width-46-1, 102-1, osd->pos_end, OpenSansSemiBold, 12);

        // Actual text
        Fill(255,255,255,1);
        Text(46, 102, osd->pos_now, OpenSansSemiBold, 12);
        TextEnd(osd->width-46, 102, osd->pos_end, OpenSansSemiBold, 12);
    }
    //////////////////////////////////////////////////////////////////////

    End();
}
//
// Draw_NetworkScreen
//
void Draw_NetworkScreen(void)
{
  const float box_x_min = 50.0f;
  const float box_x_max = 500.0f;
  const float box_y_min = 50.0f;
  const float box_y_max = 440.0f;

  const float msg_y = box_y_max - 32.0f;
  
  char buffer[80];

  glDisable(GL_TEXTURE_2D);

	// Draw a blue screen
	// in the background

	glColor3ub(20, 120, 235); 

	glLineWidth(3.0f);
	glBegin(GL_QUADS);
	        glVertex3f(box_x_min, box_y_min, 0.0f);
		glVertex3f(box_x_max, box_y_min, 0.0f);

		glVertex3f(box_x_max, box_y_max, 0.0f);
		glVertex3f(box_x_min, box_y_max, 0.0f);

	glEnd();


	// draw outline around object
	glColor3ub(255, 255, 255);
	glBegin(GL_LINE_LOOP);
	        glVertex3f(box_x_min, box_y_min, 0.0f);
		glVertex3f(box_x_max, box_y_min, 0.0f);

		glVertex3f(box_x_max, box_y_max, 0.0f);
		glVertex3f(box_x_min, box_y_max, 0.0f);
	glEnd();

	// The next line
	// will be used for the message screen
	glBegin(GL_LINE_LOOP);
	        glVertex3f(box_x_min, msg_y, 0.0f);
		glVertex3f(box_x_max, msg_y, 0.0f);
	glEnd();


	glLineWidth(1.0f);

	// before drawing the name, save selection
	Display_NetSel(network_str_);

	// Print the actual text
	Setup_NetMenu(CLIENT_NET_MENU, END_CLIENT_NET, VERT_TYPE_);
        Setup_NetMenu(C_HORZ_MENU, END_CLIENT_NET, HORZ_TYPE_);
	
	Setup_NetMenu(N_TITLE_X, N_TITLE_YY2, SERVER_SETTINGS);
	Setup_NetMenu(SERVER_NET_MENU, END_SERVER_NET, VERT_TYPE_);
	Setup_NetMenu(S_SERV_HORZ, E_SERV_HORZ, HORZ_TYPE_);

	
	// Draw the static text
	TextBegin(network_text);
	DrawString(network_text, T_COL_6, 
		   T_ROW_1, network_str_[_TEXT_CONNECT_]);
	TextEnd();

	TextBegin(network_text);
	DrawString(network_text, T_COL_7, 
		   T_ROW_1, network_str_[_TEXT_DISCONNECT_]);
	TextEnd();

	// Server buttons --
	TextBegin(network_text);
	DrawString(network_text, T_COL_6, 
		   T_ROW_2, network_str_[_TEXT_START_]);
	TextEnd();

	TextBegin(network_text);
	DrawString(network_text, T_COL_7, 
		   T_ROW_2, network_str_[_TEXT_SHUTDOWN_]);
	TextEnd();

	// And at the bottom
	// the network and help screens and messages
	TextBegin(network_text);

	// get network message
	Get_NetworkMsg(buffer);
	DrawString(network_text, TEXT_HORZ_START, 
		   T_ROW_3, buffer);
	TextEnd();

	// print connections if there are any
	printConnections();

} // end of the functino 
//
// Set_Net_Menu(int 
// - setup the horizontal or vertical positions
// and draw the text -- 
//
static void Setup_NetMenu(int start_pos, int end_pos, int h_type)
{

  int i;  
  float horz_pos;
  float vert_pos;

  // 
  // set the text changes before the code below
 
 
  switch(h_type)
    {
    case HORZ_TYPE_:
  
      // we only have two diferent cases to handle 
      if (start_pos == C_HORZ_MENU) 
	{

	  horz_pos = TEXT_HORZ_START;
	  vert_pos = TXT_V_START;
  
	  TextBegin(network_text);
	  DrawString(network_text, horz_pos, vert_pos, network_str_[C_HORZ_MENU]);
	  TextEnd();

	  // next col --
	  horz_pos = T_COL_1;
	  vert_pos = TXT_V_START;
  
	  TextBegin(network_text);
	  DrawString(network_text, horz_pos, vert_pos, network_str_[C_HORZ_MENU+1]);
	  TextEnd();

	  // next col --
	  horz_pos = T_COL_2;
	  vert_pos = TXT_V_START;
  
	  TextBegin(network_text);
	  DrawString(network_text, horz_pos, vert_pos, network_str_[C_HORZ_MENU+2]);
	  TextEnd();

	  // next col --
	  horz_pos = T_COL_3;
	  vert_pos = TXT_V_START;
  
	  TextBegin(network_text);
	  DrawString(network_text, horz_pos, vert_pos, network_str_[C_HORZ_MENU+3]);
	  TextEnd();

	  
	  // next col --
	  horz_pos = T_COL_4;
	  vert_pos = TXT_V_START;
  
	  TextBegin(network_text);
	  DrawString(network_text, horz_pos, vert_pos, network_str_[C_HORZ_MENU+4]);
	  TextEnd();

	  
	  // next col --
	  horz_pos = T_COL_5;
	  vert_pos = TXT_V_START;
  
	  TextBegin(network_text);
	  DrawString(network_text, horz_pos, vert_pos, network_str_[C_HORZ_MENU+5]);
	  TextEnd();

	} // end of the 
      else {

	  horz_pos = TEXT_HORZ_START;
	  vert_pos = TXT_V_STARTYY2;
	  TextBegin(network_text);
	  DrawString(network_text, horz_pos, vert_pos, network_str_[S_SERV_HORZ]);
	  TextEnd();

	  // next col
	  horz_pos = T_COL_1;
	  vert_pos = TXT_V_STARTYY2;
  
	  TextBegin(network_text);
	  DrawString(network_text, horz_pos, vert_pos, network_str_[S_SERV_HORZ+1]);
	  TextEnd();


	  horz_pos = T_COL_2;
	  vert_pos = TXT_V_STARTYY2;
  
	  TextBegin(network_text);
	  DrawString(network_text, horz_pos, vert_pos, network_str_[S_SERV_HORZ+2]);
	  TextEnd();

	  horz_pos = T_COL_3;
	  vert_pos = TXT_V_STARTYY2;
  
	  TextBegin(network_text);
	  DrawString(network_text, horz_pos, vert_pos, network_str_[S_SERV_HORZ+3]);
	  TextEnd();

      } // end of the if-else
    

  
      break;
      
    case VERT_TYPE_:

      if (start_pos == CLIENT_NET_MENU)
	vert_pos = TEXT_VERT_START;
      else 
	vert_pos = TEXT_VERT_STARTY2;

      for (i = start_pos; i <= end_pos; i++)
	{
	  TextBegin(network_text);
	  DrawString(network_text, TEXT_HORZ_START, vert_pos, network_str_[i]);
	  TextEnd();

	  vert_pos = vert_pos + TEXT_VERT_HEIGHT;

	} // end of the for 

      break;

    case STAT_TYPE_:      
      break;

   
    case SERVER_SETTINGS:
      TextBegin(network_text);
      DrawString(network_text, start_pos, 
		     end_pos, network_str_[SERVER_SETTINGS]);
	  TextEnd();
	  
	  break;


    case CLIENT_SETTINGS:
        TextBegin(network_text);
	  DrawString(network_text, start_pos, 
		     end_pos, network_str_[CLIENT_SETTINGS]);
	  TextEnd();

	  break;


    };

} // end of the function 
Example #7
0
// refcard shows a reference card of shapes
void refcard(int width, int height) {
	char *shapenames[] = {
		"Circle",
		"Ellipse",
		"Rectangle",
		"Rounded Rectangle",
		"Line",
		"Polyline",
		"Polygon",
		"Arc",
		"Quadratic Bezier",
		"Cubic Bezier",
		"Image"
	};
	VGfloat shapecolor[4];
	RGB(202, 225, 255, shapecolor);
	VGfloat top = height * .95, sx = 500, sy = top, sw = width * .05, sh = height * .045, dotsize = 7, spacing = 2.0;

	int i, ns = sizeof(shapenames) / sizeof(char *), fontsize = height * .033;
	Start(width, height);
	sx = width * 0.10;

	Fill(128, 0, 0, 1);
	TextEnd(width - 20, height / 2, "OpenVG on the Raspberry Pi", fontsize + (fontsize / 2));
	Fill(0, 0, 0, 1);
	for (i = 0; i < ns; i++) {
		Text(sx + sw + sw / 2, sy, shapenames[i], fontsize);
		sy -= sh * spacing;
	}
	sy = top;
	VGfloat cx = sx + (sw / 2), ex = sx + sw;
	setfill(shapecolor);
	Circle(cx, sy, sw);
	coordpoint(cx, sy, dotsize, shapecolor);
	sy -= sh * spacing;
	Ellipse(cx, sy, sw, sh);
	coordpoint(cx, sy, dotsize, shapecolor);
	sy -= sh * spacing;
	Rect(sx, sy, sw, sh);
	coordpoint(sx, sy, dotsize, shapecolor);
	sy -= sh * spacing;
	Roundrect(sx, sy, sw, sh, 20, 20);
	coordpoint(sx, sy, dotsize, shapecolor);
	sy -= sh * spacing;

	StrokeWidth(1);
	Stroke(204, 204, 204, 1);
	Line(sx, sy, ex, sy);
	coordpoint(sx, sy, dotsize, shapecolor);
	coordpoint(ex, sy, dotsize, shapecolor);
	sy -= sh;

	VGfloat px[5] = { sx, sx + (sw / 4), sx + (sw / 2), sx + ((sw * 3) / 4), sx + sw };
	VGfloat py[5] = { sy, sy - sh, sy, sy - sh, sy };

	Polyline(px, py, 5);
	coordpoint(px[0], py[0], dotsize, shapecolor);
	coordpoint(px[1], py[1], dotsize, shapecolor);
	coordpoint(px[2], py[2], dotsize, shapecolor);
	coordpoint(px[3], py[3], dotsize, shapecolor);
	coordpoint(px[4], py[4], dotsize, shapecolor);
	sy -= sh * spacing;

	py[0] = sy;
	py[1] = sy - sh;
	py[2] = sy - (sh / 2);
	py[3] = py[1] - (sh / 4);
	py[4] = sy;
	Polygon(px, py, 5);
	sy -= (sh * spacing) + sh;

	Arc(sx + (sw / 2), sy, sw, sh, 0, 180);
	coordpoint(sx + (sw / 2), sy, dotsize, shapecolor);
	sy -= sh * spacing;

	VGfloat cy = sy + (sh / 2), ey = sy;
	Qbezier(sx, sy, cx, cy, ex, ey);
	coordpoint(sx, sy, dotsize, shapecolor);
	coordpoint(cx, cy, dotsize, shapecolor);
	coordpoint(ex, ey, dotsize, shapecolor);
	sy -= sh * spacing;

	ey = sy;
	cy = sy + sh;
	Cbezier(sx, sy, cx, cy, cx, sy, ex, ey);
	coordpoint(sx, sy, dotsize, shapecolor);
	coordpoint(cx, cy, dotsize, shapecolor);
	coordpoint(cx, sy, dotsize, shapecolor);
	coordpoint(ex, ey, dotsize, shapecolor);

	sy -= (sh * spacing * 1.5);
	Image(sx, sy, 100, 100, "starx.jpg");

	End();
}
Example #8
0
BOOL WINPROC EXPORT DlgTextProc(
/***********************************************************************/
HWND 	hDlg,
UINT 	msg,
WPARAM 	wParam,
LPARAM 	lParam)
{
int i;
WORD wKey;
HFONT hFont;
STRING szString;

switch (msg)
    {
    case WM_INITDIALOG:
	RibbonInit( hDlg );
	ColorInit( hDlg );
	GetFonts( hDlg );
	CheckRadioButton( hDlg, IDC_TEXT_T1, IDC_TEXT_T10, Text.nFont+IDC_TEXT_T1 );
	Text.Size = 48;
	InitSlide( hDlg, IDC_TEXT_SIZE, Text.Size, 24, 200 );
	Text.Angle = 0;
	InitSlide( hDlg, IDC_TEXT_ANGLE, 0, -2, 2 );
	ControlEnable(hDlg, IDC_TEXT_ANGLE, TextCanRotate(hDlg, Text.nFont));
	for ( i=0; i<max(10,Text.nFont); i++ )
		{
		hFont = CreateFont(
				/* Height */ 45,
				/* Width */ 0,
				/* Escapement */ 0,
				/* Orientation */ 0,
				/* Weight */ FW_NORMAL,
				/* Italic */ FALSE,
				/* UnderLine */ FALSE,
				/* StrikeOut */ FALSE,
				/* CharSet */ Text.lpFontList[i].fdCharSet,
				/* Output Precis */ OUT_CHARACTER_PRECIS,
				/* Clip Precis */ CLIP_DEFAULT_PRECIS,
				/* Quality */ PROOF_QUALITY,
				/* PitchAndFamily */ Text.lpFontList[i].fdPitchAndFamily,
				/* Face */ Text.lpFontList[i].fdFaceName );
		if ( hFont )
			SendDlgItemMessage( hDlg, IDC_TEXT_T1+i, WM_SETFONT, (WPARAM)hFont, 0L );
		}
	if ( lpImage )
		{
		bTextBegun = TextBegin( lpImage->hWnd, 10/*x*/, 40/*y*/ );
		Tool.bActive = YES;
		SetFocus( lpImage->hWnd );
		}
	else
		bTextBegun = NO;
	// fall thru

    case WM_CONTROLENABLE:
    case WM_DOCACTIVATED:
	break;

	case WM_DESTROY:
	if ( bTextBegun )
		{
		if ( lpImage )
			{
			TextEnd( lpImage->hWnd, NO/*fCancel*/ );
			Tool.bActive = NO;
			AstralUpdateWindow( lpImage->hWnd );
			}
		bTextBegun = NO;
		}
	for ( i=0; i<max(10,Text.nFont); i++ )
		{
		if ( hFont = (HFONT)SendDlgItemMessage( hDlg, IDC_TEXT_T1+i, WM_GETFONT, (WPARAM)0, 0L ) )
			DeleteObject( hFont );
		}
	if ( Text.lpFontList )
		{
		FreeUp((LPTR)Text.lpFontList);
		Text.lpFontList = NULL;
		}
	break;

    case WM_CHAR:
	if ( !lpImage || !bTextBegun )
		return( FALSE );
	TextSetFocus();
	wKey = (WORD)lParam;
	TextKeystroke( lpImage->hWnd, wKey );
	if ( wKey == VK_RETURN )
		{
		TextAnchor( lpImage->hWnd );
		RandomizeActiveColor();
		break;
		}
	szString[0] = '_';
	szString[1] = wKey;
	szString[2] = '\0';
	Lowercase( szString );
	SoundStartResource( szString, NO/*bLoop*/, NULL/*hInstance*/ );
	break;

    case WM_KEYDOWN:
	if ( !lpImage || !bTextBegun )
		return( FALSE );
	wKey = lParam;
	switch (wKey)
		{
		case VK_UP:
			TextRMove( lpImage->hWnd, 0, -1 );
			break;
		case VK_DOWN:
			TextRMove( lpImage->hWnd, 0, 1);
			break;
		case VK_LEFT:
			TextRMove( lpImage->hWnd, -1, 0);
			break;
		case VK_RIGHT:
			TextRMove( lpImage->hWnd, 1, 0);
			break;
		default:
			break;
		}
	break;

    case WM_SETCURSOR:
	return( SetupCursor( wParam, lParam, IDD_TEXT ) );

    case WM_ERASEBKGND:
	break; // handle ERASEBKGND and do nothing; PAINT covers everything

    case WM_PAINT:
	LayoutPaint( hDlg );
	break;

    case WM_CLOSE:
	AstralDlgEnd( hDlg, FALSE );
	break;

    case WM_MEASUREITEM:
    case WM_DRAWITEM:
	return( OwnerDraw( hDlg, msg, lParam, NO ) );

    case WM_CTLCOLOR:
// We don't get this message
//	Print( "%u", HIWORD(lParam) );
//	if ( HIWORD(lParam) == CTLCOLOR_BTN )
//		{
//		SetTextColor( (HDC)wParam, RGB(0,0,255) ); // Blue text...
//		SetBkColor( (HDC)wParam, RGB(255,255,255) ); // on a white background
//		return( GetStockObject(WHITE_BRUSH) );
//		}
	return( (BOOL)SetControlColors( (HDC)wParam, hDlg, (HWND)LOWORD(lParam),
		HIWORD(lParam) ) );

    case WM_COMMAND:
	switch (wParam)
	    {
		case IDC_ACTIVECOLOR:
		case IDC_COLORS_TEXT:
		ColorCommand( hDlg, wParam, lParam );
		TextSetFocus();
		if (bTextBegun)
			TextFontChanged(lpImage->hWnd);
		break;

		case IDC_TEXT_T1:
		case IDC_TEXT_T2:
		case IDC_TEXT_T3:
		case IDC_TEXT_T4:
		case IDC_TEXT_T5:
		case IDC_TEXT_T6:
		case IDC_TEXT_T7:
		case IDC_TEXT_T8:
		case IDC_TEXT_T9:
		case IDC_TEXT_T10:
		CheckRadioButton( hDlg, IDC_TEXT_T1, IDC_TEXT_T10, wParam );
		Text.nFont = wParam - IDC_TEXT_T1;
		ControlEnable(hDlg, IDC_TEXT_ANGLE, TextCanRotate(hDlg, Text.nFont));
		TextSetFocus();
		if (bTextBegun)
			TextFontChanged(lpImage->hWnd);
		break;

	    case IDC_TEXT_SIZE:
		Text.Size = HandleSlide( hDlg, (ITEMID)wParam, (UINT)lParam, NULL );
		Text.Size = bound( Text.Size, 16, 216 );
		if ( !LBUTTON )
			TextSetFocus();
		if (bTextBegun)
			TextFontChanged(lpImage->hWnd);
		break;

	    case IDC_TEXT_ANGLE:
		i = HandleSlide( hDlg, (ITEMID)wParam, (UINT)lParam, NULL ); // -2 to 2
		Text.Angle = (i * 45);
		if ( Text.Angle < 0 )
			Text.Angle += 360;
		i = (Text.Angle + 22) / 45; // down to 0-8
		if ( i > 4 )
				i = bound( i - 8, -2, 0 );
		else	i = bound( i, 0, 2 );
		SetSlide( hDlg, wParam, i );
		if ( !LBUTTON )
			TextSetFocus();
		if (bTextBegun)
			TextFontChanged(lpImage->hWnd);
		break;

	    default:
		return( FALSE );
	    }

    default:
	return( FALSE );
    }

return( TRUE );
}