aboutsummaryrefslogtreecommitdiff
path: root/generic/Draw.h
blob: f0166ef27162fb25041c3caf0492271fe385ad77 (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
/*
 * 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"


#define	ZN_LINE_SHAPE_POINTS	4	/* Maximum of all *_SHAPE_POINTS */

struct _ZnWInfo;

#ifdef GL
#define ZnGlStartClip(num_clips, render) { \
  if (!num_clips) { \
    glEnable(GL_STENCIL_TEST); \
  } \
  glStencilFunc(GL_EQUAL, (GLint) num_clips, 0xFF); \
  glStencilOp(GL_KEEP, GL_INCR, GL_INCR); \
  if (!render) { \
    glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); \
  } \
}
#define ZnGlRenderClipped() { \
  glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); \
  glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); \
  }
#define ZnGlRestoreStencil(num_clips, render) { \
  glStencilFunc(GL_EQUAL, (GLint) (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 ZnGlEndClip(num_clips) { \
  glStencilFunc(GL_EQUAL, (GLint) 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 _ZnWInfo *wi, ZnLineStyle line_style);
void ZnLineShapePoints(ZnPoint *p1, ZnPoint *p2, ZnDim line_width,
		       ZnLineShape shape, ZnBBox *bbox, ZnList to_points);
void ZnDrawLineShape(struct _ZnWInfo *wi, ZnPoint *points, unsigned int num_points,
		     ZnLineStyle line_style, XColor *line_foreground,
		     ZnDim line_width, ZnLineShape shape);
void
ZnGetLineEnd(ZnPoint *p1, ZnPoint *p2, ZnDim line_width,
	     int cap_style, ZnLineEnd end_style, ZnPoint *points);

int ZnPolygonReliefInBBox(ZnPoint *points, unsigned int num_points,
			  ZnDim line_width, ZnBBox *bbox);
void ZnGetPolygonReliefBBox(ZnPoint *points, unsigned int num_points,
			    ZnDim line_width, ZnBBox *bbox);
double ZnPolygonReliefToPointDist(ZnPoint *points, unsigned int num_points,
				  ZnDim line_width, ZnPoint *pp);
void ZnDrawRectangleRelief(struct _ZnWInfo *wi,
			   ZnReliefStyle relief, ZnGradient *gradient,
			   XRectangle *bbox, ZnDim line_width);
void ZnDrawPolygonRelief(struct _ZnWInfo *wi, ZnReliefStyle relief,
			 ZnGradient *gradient, ZnPoint *points,
			 unsigned int num_points, ZnDim line_width);
#ifdef GL
void ZnRenderPolygonRelief(struct _ZnWInfo *wi, ZnReliefStyle relief,
			   ZnGradient *gradient, ZnBool smooth,
			   ZnPoint *points, unsigned int num_points, ZnDim line_width);
void ZnRenderPolyline(struct _ZnWInfo *wi, ZnPoint *points, unsigned int num_points,
		      ZnDim line_width, ZnLineStyle line_style, int cap_style,
		      int join_style, ZnLineEnd first_end, ZnLineEnd last_end,
		      ZnGradient *gradient);
void ZnComputeAxialGradient(struct _ZnWInfo *wi, ZnPoly *shape, ZnReal angle,
			    ZnPoint *grad_geo);
void ZnComputeRadialGradient(struct _ZnWInfo *wi, ZnPoly *shape, ZnBool oval,
			     ZnPoint *center, ZnPoint *grad_geo);
void ZnComputePathGradient(struct _ZnWInfo *wi, ZnPoly *shape, ZnPoint *center,
			   ZnPoint *grad_geo);
void ZnRenderGradient(struct _ZnWInfo *wi, ZnGradient *gradient,
		      void (*cb)(void *), void *closure, ZnPoint *quad,
		      ZnPoly *poly);
void ZnRenderTile(struct _ZnWInfo *wi, ZnImage tile, ZnGradient *gradient,
		  void (*cb)(void *), void *closure, ZnPoint *quad);
void ZnRenderIcon(struct _ZnWInfo *wi, ZnImage image, ZnGradient *gradient,
		  ZnPoint *origin, ZnBool modulate);
void ZnRenderImage(struct _ZnWInfo *wi, ZnImage image, ZnGradient *gradient,
		   ZnPoint *quad, ZnBool modulate);
void RenderHollowDot(struct _ZnWInfo *wi, ZnPoint *p, ZnReal size);

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

#endif	/* _Draw_h */