GRASS GIS 8 Programmer's Manual 8.3.2(2024)-exported
Loading...
Searching...
No Matches
gsd_label.c
Go to the documentation of this file.
1/*!
2 \file lib/ogsf/gsd_label.c
3
4 \brief OGSF library - label management (lower level functions)
5
6 GRASS OpenGL gsurf OGSF Library
7
8 (C) 1999-2008 by the GRASS Development Team
9
10 This program is free software under the
11 GNU General Public License (>=v2).
12 Read the file COPYING that comes with GRASS
13 for details.
14
15 \author Bill Brown USACERL (1991-1992)
16 \author Doxygenized by Martin Landa <landa.martin gmail.com> (May 2008)
17 */
18
19#include <grass/gis.h>
20#include <grass/glocale.h>
21#include <grass/ogsf.h>
22
23#include "rgbpack.h"
24
25#define MAX_LIST 20
26
27static int first = 0;
29GLuint label_id;
30
31/*!
32 \brief Put label
33
34 \todo Allocate label dynamically
35
36 \param fontbase fontbase settings
37 \param size font size
38 \param color font color
39 \param pt
40 */
41void gs_put_label(const char *text, GLuint fontbase, int size,
42 unsigned long color, int *pt)
43{
44 int txt_width;
45 GLint tmp[4];
46 float labpt[2];
47 int t, l, b, r;
48
49 if (!first) {
50 /* initialize display list */
51 label_base = glGenLists(MAX_LIST);
52 glListBase(label_base);
54 first = 1;
55 }
56
57 if (label_id > (label_base + MAX_LIST)) {
58 G_warning(_("Max. number of labels reached!"));
59 return;
60 }
61
62 glNewList(label_id, GL_COMPILE_AND_EXECUTE);
63 txt_width = gsd_get_txtwidth(text, size);
64
65 /* adjust to center text string */
66 labpt[X] = (float)(pt[X] - txt_width / 2.);
67 labpt[Y] = (float)pt[Y];
68
69 glGetIntegerv(GL_VIEWPORT, tmp);
70 l = tmp[0];
71 r = tmp[0] + tmp[2];
72 b = tmp[1];
73 t = tmp[1] + tmp[3];
74
76
77 /* Set text color */
78 gsd_color_func(color);
79
80 do_label_display(fontbase, labpt, text);
81
83
84 glEndList();
85
86 label_id++;
87
88 return;
89}
90
91/*!
92 \brief Remove current label
93 */
95{
96 if (label_id) {
97 glDeleteLists(label_id - 1, 1);
98 label_id--;
99 }
100
101 return;
102}
103
104/*!
105 \brief Remove all labels from display list
106 */
108{
109 glDeleteLists(label_base, MAX_LIST);
111
112 return;
113}
114
115/*!
116 \brief Call display list and draw defined labels -- called from gsd_prim
117 (gsd_call_lists)
118 */
120{
121 int i;
122
123 for (i = 0; i < MAX_LIST; i++) {
124 glCallList(i + label_base);
125 glFlush();
126 }
127 return;
128}
double b
double l
double t
double r
void G_warning(const char *msg,...)
Print a warning message to stderr.
Definition gis/error.c:203
void do_label_display(GLuint fontbase, float *lab_pos, const char *txt)
Display label.
Definition gsd_fonts.c:97
int gsd_get_txtwidth(const char *s, int size)
Get text width.
Definition gsd_fonts.c:36
void gsd_remove_curr(void)
Remove current label.
Definition gsd_label.c:94
GLuint label_base
Definition gsd_label.c:28
#define MAX_LIST
Definition gsd_label.c:25
void gs_put_label(const char *text, GLuint fontbase, int size, unsigned long color, int *pt)
Put label.
Definition gsd_label.c:41
void gsd_remove_all(void)
Remove all labels from display list.
Definition gsd_label.c:107
GLuint label_id
Definition gsd_label.c:29
void gsd_call_label(void)
Call display list and draw defined labels – called from gsd_prim (gsd_call_lists)
Definition gsd_label.c:119
void gsd_end_legend_viewport(void)
ADD.
Definition gsd_legend.c:91
void gsd_bgn_legend_viewport(GLint wl, GLint wb, GLint wr, GLint wt)
ADD.
Definition gsd_legend.c:61
void gsd_color_func(unsigned int col)
Set current color.
Definition gsd_prim.c:698
#define X(j)
#define Y(j)