aboutsummaryrefslogtreecommitdiff
path: root/generic/Draw.h
blob: 258f297ef6cf631ee00b1cb65e7e5264ebdfcd16 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
 * Draw.h -- Header for common drawing routines.
 *
 * Authors		: Patrick Lecoanet.
 * Creation date	: Sat Dec 10 12:51:30 1994
 *
 * $Id$
 */

/*
 *  Copyright (c) 1993 - 1999 CENA, Patrick Lecoanet --
 *
 * This code is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This code is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this code; if not, write to the Free
 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */


#ifndef _Draw_h
#define _Draw_h

#include "List.h"
#include "Types.h"
#include "Color.h"
#include "Attrs.h"
#include "Image.h"

#include <X11/Xlib.h>
#ifdef GLX
#include <GL/glx.h>
#endif


#define LIGHTNING_POINTS	4
#define CORNER_POINTS		3
#define DOUBLE_CORNER_POINTS	4
#define STRAIGHT_POINTS		2
#define	LINE_SHAPE_POINTS	4	/* Maximum of all above */

struct _WidgetInfo;

#ifdef GLX
#define GLX_START_CLIP(num_clips, render) { \
  if (!num_clips) { \
    glEnable(GL_STENCIL_TEST); \
  } \
  glStencilFunc(GL_EQUAL, num_clips, 0xFF); \
  glStencilOp(GL_KEEP, GL_INCR, GL_INCR); \
  if (!render) { \
    glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); \
  } \
}
#define GLX_RENDER_CLIPPED() { \
  glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); \
  glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); \
  }
#define GLX_RESTORE_STENCIL(num_clips, render) { \
  glStencilFunc(GL_EQUAL, num_clips+1, 0xFF); \
  glStencilOp(GL_KEEP, GL_DECR, GL_DECR); \
  if (render) { \
    glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); \
  } \
  else { \
   glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); \
  } \
}
#define GLX_END_CLIP(num_clips) { \
  glStencilFunc(GL_EQUAL, num_clips, 0xFF); \
  glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); \
  glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); \
  if (!num_clips) { \
    glDisable(GL_STENCIL_TEST); \
  } \
}
#endif


void ZnSetLineStyle(struct _WidgetInfo *wi, LineStyle line_style);
void ZnGetLineShape(ZnPoint *p1, ZnPoint *p2, unsigned int line_width,
		    LineShape shape, ZnBBox *bbox, ZnList to_points);
void ZnDrawLineShape(struct _WidgetInfo *wi, ZnPoint *points, int num_points,
		     LineStyle line_style, ZnColor line_foreground,
		     unsigned int line_width, LineShape shape);
int ZnPolygonReliefInBBox(ZnPoint *points, int num_points, int line_width,
			  ZnBBox *bbox);
void ZnGetPolygonReliefBBox(ZnPoint *points, int num_points, int line_width,
			    ZnBBox *bbox);
double ZnPolygonReliefToPointDist(ZnPoint *points, int num_points, int line_width,
				  ZnPoint *pp);
void ZnDrawRectangleRelief(struct _WidgetInfo *wi,
			   ReliefStyle relief, ZnGradient *gradient,
			   XRectangle *bbox, unsigned int line_width);
void ZnDrawPolygonRelief(struct _WidgetInfo *wi, ReliefStyle relief,
			 ZnGradient *gradient, ZnPoint *points,
			 int num_points, int line_width);
#ifdef GLX
void ZnRenderPolygonRelief(struct _WidgetInfo *wi, ReliefStyle relief,
			   ZnGradient *gradient, ZnBool smooth,
			   ZnPoint *points, int num_points, int line_width);
void ZnRenderPolyline(struct _WidgetInfo *wi, ZnPoint *points, int num_points,
		      int line_width, LineStyle line_style, int cap_style,
		      int join_style, ZnLineEnd first_end, ZnLineEnd last_end,
		      ZnGradient *gradient);
void ZnComputeAxialGradient(struct _WidgetInfo *wi, ZnPoly *shape, int angle,
			    ZnPoint *grad_geo);
void ZnComputeRadialGradient(struct _WidgetInfo *wi, ZnPoly *shape, ZnBBox *bbox,
			     ZnPoint *center, ZnPoint *grad_geo);
void ZnRenderGradient(struct _WidgetInfo *wi, ZnGradient *gradient,
		      void cb(void *), void *closure, ZnPoint *quad,
		      ZnPoly *poly);
void ZnRenderTile(struct _WidgetInfo *wi, ZnImage tile, ZnGradient *gradient,
		  void cb(void *), void *closure, ZnPoint *quad);
void ZnRenderImage(struct _WidgetInfo *wi, ZnImage image,
		   ZnGradient *gradient, ZnPoint *origin, ZnBool modulate);
void RenderHollowDot(struct _WidgetInfo *wi, ZnPoint *p, ZnReal size);

void ZnRenderGlyph(ZnTexFontInfo *tfi, int c);
void ZnRenderString(ZnTexFontInfo *tfi, unsigned char *str, int len);
void ZnRenderFancyString(ZnTexFontInfo *tfi, unsigned char *str, int len);
#endif

#endif	/* _Draw_h */