aboutsummaryrefslogtreecommitdiff
path: root/generic/Draw.h
blob: e4632eec8864457f859acc7b8911a96f3bca85bc (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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
/*
 * 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 <X11/Xlib.h>


#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;
struct _ImageBits;

#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 SetLineStyle(struct _WidgetInfo *wi, LineStyle line_style);
void GetLineShape(ZnPoint *p1, ZnPoint *p2, unsigned int line_width,
		  LineShape shape, ZnBBox *bbox, ZnList to_points);
void DrawLineShape(struct _WidgetInfo *wi, ZnPoint *points, int num_points,
		   LineStyle line_style, ZnColor line_foreground,
		   unsigned int line_width, LineShape shape);
int PolygonReliefInBBox(ZnPoint *points, int num_points, int line_width,
			ZnBBox *bbox);
void GetPolygonReliefBBox(ZnPoint *points, int num_points, int line_width,
			  ZnBBox *bbox);
double PolygonReliefToPointDist(ZnPoint *points, int num_points, int line_width,
				ZnPoint *pp);
void DrawRectangleRelief(struct _WidgetInfo *wi,
 			 ReliefStyle relief, ZnGradient *gradient,
 			 XRectangle *bbox, unsigned int line_width);
void DrawPolygonRelief(struct _WidgetInfo *wi, ReliefStyle relief,
		       ZnGradient *gradient, ZnPoint *points,
		       int num_points, int line_width);
#ifdef GLX
void RenderPolygonRelief(struct _WidgetInfo *wi, ReliefStyle relief,
			 ZnGradient *gradient, int alpha, ZnBool smooth,
			 ZnPoint *points, int num_points, int line_width);
void RenderPolyline(struct _WidgetInfo *wi, ZnPoint *points, int num_points,
		    int line_width, ZnBool closed, LineStyle line_style,
		    int cap_style, int join_style, ZnLineEnd first_end,
		    ZnLineEnd last_end, ZnGradient *gradient);
void ComputeAxialGradient(struct _WidgetInfo *wi, ZnPoly *shape, int angle,
			  ZnPoint *grad_geo);
void ComputeRadialGradient(struct _WidgetInfo *wi, ZnPoly *shape, ZnBBox *bbox,
			   ZnPoint *center, ZnPoint *grad_geo);
void RenderGradient(struct _WidgetInfo *wi, ZnGradient *gradient,
		    void cb(void *), void *closure, ZnPoint *quad,
		    ZnPoly *poly);
void RenderTile(struct _WidgetInfo *wi, struct _ImageBits *tile,
		ZnGradient *gradient, void cb(void *), void *closure,
		ZnPoint *quad);
void RenderImage(struct _WidgetInfo *wi, struct _ImageBits *image,
		 ZnGradient *gradient, ZnPoint *origin, ZnBool modulate);
void RenderHollowDot(struct _WidgetInfo *wi, ZnPoint *p, ZnReal size);
#endif

#ifdef GLX
/* Copyright (c) Mark J. Kilgard, 1997. */

/* This program is freely distributable without licensing fees  and is
   provided without guarantee or warrantee expressed or  implied. This
   program is -not- in the public domain. */

#include <GL/gl.h>

typedef struct {
  unsigned short c;       /* Potentially support 16-bit glyphs. */
  unsigned char width;
  unsigned char height;
  signed char xoffset;
  signed char yoffset;
  signed char advance;
  char dummy;           /* Space holder for alignment reasons. */
  short x;
  short y;
} TexGlyphInfo;

typedef struct {
  GLfloat t0[2];
  GLshort v0[2];
  GLfloat t1[2];
  GLshort v1[2];
  GLfloat t2[2];
  GLshort v2[2];
  GLfloat t3[2];
  GLshort v3[2];
  GLfloat advance;
} TexGlyphVertexInfo;

typedef struct {
  GLuint texobj;
  int tex_width;
  int tex_height;
  int max_ascent;
  int max_descent;
  int num_glyphs;
  int min_glyph;
  int range;
  unsigned char *teximage;
  TexGlyphInfo *tgi;
  TexGlyphVertexInfo *tgvi;
  TexGlyphVertexInfo **lut;
} TexFont;

extern void txfRenderGlyph(TexFont	*/* txf */,
			   int		/* c */);

extern void txfRenderString(TexFont	*/* txf */,
			    unsigned char */* string */,
			    int		/* len */);

extern void txfRenderFancyString(TexFont */* txf */,
				 unsigned char */* string */,
				 int	/* len */);
#endif

#endif	/* _Draw_h */