1 /*   ncbidraw.h
2 * ===========================================================================
3 *
4 *                            PUBLIC DOMAIN NOTICE
5 *            National Center for Biotechnology Information (NCBI)
6 *
7 *  This software/database is a "United States Government Work" under the
8 *  terms of the United States Copyright Act.  It was written as part of
9 *  the author's official duties as a United States Government employee and
10 *  thus cannot be copyrighted.  This software/database is freely available
11 *  to the public for use. The National Library of Medicine and the U.S.
12 *  Government do not place any restriction on its use or reproduction.
13 *  We would, however, appreciate having the NCBI and the author cited in
14 *  any work or product based on this material
15 *
16 *  Although all reasonable efforts have been taken to ensure the accuracy
17 *  and reliability of the software and data, the NLM and the U.S.
18 *  Government do not and cannot warrant the performance or results that
19 *  may be obtained by using this software or data. The NLM and the U.S.
20 *  Government disclaim all warranties, express or implied, including
21 *  warranties of performance, merchantability or fitness for any particular
22 *  purpose.
23 *
24 * ===========================================================================
25 *
26 * File Name:  ncbidraw.h
27 *
28 * Author:  Jonathan Kans
29 *
30 * Version Creation Date:   1/1/91
31 *
32 * $Revision: 6.10 $
33 *
34 * File Description:
35 *       Vibrant drawing procedure definitions
36 *
37 * Modifications:
38 * --------------------------------------------------------------------------
39 *
40 * ==========================================================================
41 */
42 
43 #ifndef _NCBIDRAW_
44 #define _NCBIDRAW_
45 
46 #ifndef _NCBI_
47 #include <ncbi.h>
48 #endif
49 
50 
51 #ifdef __cplusplus
52 extern "C" {
53 #endif
54 
55 /***  PORTABLE GRAPHIC PRIMITIVE OBJECT TYPES  ***/
56 
57 /*
58 *  Platform independent point and rectangle data structures.
59 */
60 
61 typedef  struct  Nlm_point {
62   Nlm_Int2  x;
63   Nlm_Int2  y;
64 } Nlm_PoinT, PNTR Nlm_PointPtr;
65 
66 typedef  struct  Nlm_rect {
67   Nlm_Int2  left;
68   Nlm_Int2  top;
69   Nlm_Int2  right;
70   Nlm_Int2  bottom;
71 } Nlm_RecT, PNTR Nlm_RectPtr;
72 
73 typedef  Nlm_Handle  Nlm_RegioN;
74 
75 typedef  struct  Nlm_font {
76   Nlm_VoidPtr  dummy;
77 } HNDL Nlm_FonT;
78 
79 /***  GLOBAL VARIABLES  ***/
80 
81 /*
82 *  The update region contains the update region on drawing requests,
83 *  and contains at least the visible region during other callbacks.
84 *  Clipping is set to the update region on drawing events.  The
85 *  update rectangle has the minimum rectangular boundary of the
86 *  update region.  These variables are kept up to date by the Vibrant
87 *  event loop.
88 */
89 
90 extern  Nlm_RegioN  Nlm_updateRgn;
91 extern  Nlm_RecT    Nlm_updateRect;
92 
93 /*
94 *  The standard systemFont and programFont variables are used to
95 *  specify fonts for dialog objects and scrolling text objects.
96 */
97 
98 extern  Nlm_FonT  Nlm_systemFont;
99 extern  Nlm_FonT  Nlm_programFont;
100 
101 /*
102 *  Miscellaneous constants for pixel sizes of the standard font.
103 */
104 
105 extern  Nlm_Int2  Nlm_stdAscent;
106 extern  Nlm_Int2  Nlm_stdDescent;
107 extern  Nlm_Int2  Nlm_stdLeading;
108 extern  Nlm_Int2  Nlm_stdFontHeight;
109 extern  Nlm_Int2  Nlm_stdLineHeight;
110 extern  Nlm_Int2  Nlm_stdCharWidth;
111 
112 /***  DRAWING PROCEDURES  ***/
113 
114 void         Nlm_SetUpDrawingTools (void);
115 void         Nlm_CleanUpDrawingTools(void);
116 
117 /*
118 *  It is not necessary to create a new font when switching colors.  The
119 *  family for GetFont can be Roman, Swiss, Modern, Script, or Decorative.
120 */
121 
122 /*
123 *  ScrollRect will erase and invalidate all invalid regions.
124 */
125 
126 void         Nlm_ResetDrawingTools(void);
127 
128 void         Nlm_CopyMode(void);
129 void         Nlm_MergeMode(void);
130 void         Nlm_InvertMode(void);
131 void         Nlm_EraseMode(void);
132 
133 void         Nlm_Black(void);
134 void         Nlm_Red(void);
135 void         Nlm_Green(void);
136 void         Nlm_Blue(void);
137 void         Nlm_Cyan(void);
138 void         Nlm_Magenta(void);
139 void         Nlm_Yellow(void);
140 void         Nlm_White(void);
141 void         Nlm_Gray(void);
142 void         Nlm_LtGray(void);
143 void         Nlm_DkGray(void);
144 void         Nlm_SelectColor(Nlm_Uint1 red, Nlm_Uint1 green, Nlm_Uint1 blue);
145 Nlm_Uint4    Nlm_GetColorRGB(Nlm_Uint1 red, Nlm_Uint1 green, Nlm_Uint1 blue);
146 Nlm_Uint4    Nlm_GetColor(void);
147 void         Nlm_SetColorEx (Nlm_Uint4 color);
148 void         Nlm_SetColor(Nlm_Uint4 color);
149 void         Nlm_InvertColors(void);
150 void         Nlm_DecodeColor(Nlm_Uint4 color, Nlm_Uint1Ptr red, Nlm_Uint1Ptr green, Nlm_Uint1Ptr blue);
151 
152 void         Nlm_Solid(void);
153 void         Nlm_Dark(void);
154 void         Nlm_Medium(void);
155 void         Nlm_Light(void);
156 void         Nlm_Empty(void);
157 void         Nlm_SetPenPattern(Nlm_VoidPtr pattern);
158 void         Nlm_Dotted(void);
159 void         Nlm_Dashed(void);
160 void         Nlm_WidePen(Nlm_Int2 width);
161 
162 /* Under X11       -- pen offset, dash length and gap length
163  * Under Win-NT    -- parameter "offset" ignored(always zero)
164  * Other platforms -- exactly analogous to "Nlm_Dotted()"
165  */
166 void Nlm_SetPenDash(Nlm_Uint1 offset, Nlm_Uint1 dash, Nlm_Uint1 gap);
167 
168 /* esl++ */
169 /***  FONT HANDLING PROCEDURES  ***/
170 
171 /* font styles */
172 #define STYLE_REGULAR       0
173 #define STYLE_BOLD          1
174 #define STYLE_ITALIC        2
175 #define STYLE_BOLD_ITALIC   3
176 #define STYLE_UNDERLINE     4
177 /* (other bits are used for platform-specific styles) */
178 
179 /* font charset */
180 #define CHARSET_NULL        0
181 #define CHARSET_ANSI        1
182 #define CHARSET_SYMBOL      2
183 #define CHARSET_KANJI		3	/* Japanese Kanji */
184 #define CHASET_HANGUL		4	/* Korean character set */
185 
186 /* font pitch */
187 #define PITCH_NULL          0
188 #define PITCH_FIXED         1
189 #define PITCH_VARIABLE      2
190 
191 /* font family */
192 #define FAMILY_NULL         0
193 #define FAMILY_ROMAN        1
194 #define FAMILY_SWISS        2
195 #define FAMILY_MODERN       3
196 #define FAMILY_SCRIPT       4
197 #define FAMILY_DECORATIVE   5
198 #define FAMILY_GOTHIC		6	/* Japanese Kanji or Korean Hangle */
199 #define FAMILY_MINCHOU		7	/* Japanese Kanji */
200 
201 #define FONT_NAME_SIZE      32
202 
203 typedef struct Nlm_fontspec {
204   Nlm_Char name [FONT_NAME_SIZE];
205   Nlm_Int2 size;
206   Nlm_Uint1 style;
207   Nlm_Uint1 charset;
208   Nlm_Uint1 pitch;
209   Nlm_Uint1 family;
210 } Nlm_FontSpec, PNTR Nlm_FontSpecPtr;
211 
212 Nlm_FonT     Nlm_CreateFont(Nlm_FontSpecPtr fsp);
213 Nlm_FonT     Nlm_GetResidentFont(Nlm_FontSpecPtr fsp);
214 Nlm_FonT     Nlm_CopyFont(Nlm_FonT font);
215 Nlm_FonT     Nlm_DeleteFont(Nlm_FonT font);
216 Nlm_FonT     Nlm_FindNextResidentFont(Nlm_FonT font);
217 Nlm_Boolean  Nlm_GetFontSpec(Nlm_FonT font, Nlm_FontSpecPtr fsp);
218 Nlm_Boolean  Nlm_EqualFontSpec(Nlm_FontSpecPtr fsp1, Nlm_FontSpecPtr fsp2);
219 
220 /*
221 *  The functions below return the specifications for common fonts.
222 *  The return value points to the static buffer that is owerwritten
223 *  by next call to any of these functions.
224 *  Example: FonT f = CreateFont (Times (24, STYLE_BOLD_ITALIC);
225 */
226 extern Nlm_FontSpecPtr Nlm_Helvetica(Nlm_Int2 size, Nlm_Uint1 style);
227 extern Nlm_FontSpecPtr Nlm_Times(Nlm_Int2 size, Nlm_Uint1 style);
228 extern Nlm_FontSpecPtr Nlm_Courier(Nlm_Int2 size, Nlm_Uint1 style);
229 extern Nlm_FontSpecPtr Nlm_Symbol(Nlm_Int2 size, Nlm_Uint1 style);
230 extern Nlm_FontSpecPtr Nlm_Gothic(Nlm_Int2 size, Nlm_Uint1 style);
231 extern Nlm_FontSpecPtr Nlm_Minchou(Nlm_Int2 size, Nlm_Uint1 style);
232 extern Nlm_FontSpecPtr Nlm_GothicFixed(Nlm_Int2 size, Nlm_Uint1 style);
233 extern Nlm_FontSpecPtr Nlm_MinchouFixed(Nlm_Int2 size, Nlm_Uint1 style);
234 
235 /* esl++ end */
236 
237 Nlm_FonT     Nlm_GetFont(Nlm_CharPtr name, Nlm_Int2 size, Nlm_Boolean bld, Nlm_Boolean itlc, Nlm_Boolean undrln, Nlm_CharPtr fmly);
238 Nlm_FonT     Nlm_GetFontEx(Nlm_CharPtr name, Nlm_Int2 size, Nlm_Boolean bld, Nlm_Boolean itlc, Nlm_Boolean undrln, Nlm_CharPtr fmly, Nlm_CharPtr chset, Nlm_Boolean fixed);
239 Nlm_FonT     Nlm_ParseFont(Nlm_CharPtr spec);
240 Nlm_FonT     Nlm_ParseFontEx(Nlm_CharPtr scrSpec, Nlm_CharPtr prtSpec);
241 void         Nlm_SelectFont(Nlm_FonT f);
242 void         Nlm_AssignPrinterFont(Nlm_FonT scrnFont, Nlm_FonT prtrFont);
243 
244 Nlm_Int2     Nlm_CharWidth(Nlm_Char ch);
245 Nlm_Int2     Nlm_StringWidth(const Nlm_Char* text);
246 Nlm_Int2     Nlm_TextWidth(const Nlm_Char* text, size_t len);
247 Nlm_Int2     Nlm_Ascent(void);
248 Nlm_Int2     Nlm_Descent(void);
249 Nlm_Int2     Nlm_Leading(void);
250 Nlm_Int2     Nlm_FontHeight(void);
251 Nlm_Int2     Nlm_LineHeight(void);
252 Nlm_Int2     Nlm_MaxCharWidth(void);
253 
254 /* Calculate(based on the presently active font) and return maximum
255  * number of characters from the string "str" which can be fit into
256  * "*max_width" pixels.
257  * Return 0 if the "str" is NULL or empty or if the curr.font is NULL.
258  */
259 size_t Nlm_FitStringWidth(const Nlm_Char PNTR str, Nlm_Int4 max_width);
260 
261 void         Nlm_SetPen(Nlm_PoinT pt);
262 void         Nlm_GetPen(Nlm_PointPtr pt);
263 void         Nlm_SetPenWidth(Nlm_Int2 width);
264 
265 void         Nlm_PaintChar(Nlm_Char ch);
266 void         Nlm_PaintString(Nlm_CharPtr text);
267 void         Nlm_PaintStringEx(Nlm_CharPtr text, Nlm_Int2 x, Nlm_Int2 y);
268 void CDECL   Nlm_PaintText(char *format, ...);
269 
270 void         Nlm_DrawString(Nlm_RectPtr r, Nlm_CharPtr text, Nlm_Char jst, Nlm_Boolean gray);
271 void         Nlm_DrawText(Nlm_RectPtr r, Nlm_CharPtr text, size_t len, Nlm_Char jst, Nlm_Boolean gray);
272 
273 void         Nlm_MoveTo(Nlm_Int2 x, Nlm_Int2 y);
274 void         Nlm_LineTo(Nlm_Int2 x, Nlm_Int2 y);
275 void         Nlm_DrawLine(Nlm_PoinT pt1, Nlm_PoinT pt2);
276 
277 void         Nlm_LoadPt(Nlm_PointPtr pt, Nlm_Int2 x, Nlm_Int2 y);
278 void         Nlm_AddPt(Nlm_PoinT src, Nlm_PointPtr dst);
279 void         Nlm_SubPt(Nlm_PoinT src, Nlm_PointPtr dst);
280 Nlm_Boolean  Nlm_EqualPt(Nlm_PoinT p1, Nlm_PoinT p2);
281 Nlm_Boolean  Nlm_PtInRect(Nlm_PoinT pt, Nlm_RectPtr r);
282 Nlm_Boolean  Nlm_PtInRgn(Nlm_PoinT pt, Nlm_RegioN rgn);
283 
284 void         Nlm_LoadRect(Nlm_RectPtr r, Nlm_Int2 lf, Nlm_Int2 tp, Nlm_Int2 rt, Nlm_Int2 bt);
285 void         Nlm_UpsetRect(Nlm_RectPtr r, Nlm_Int2 lf, Nlm_Int2 tp, Nlm_Int2 rt, Nlm_Int2 bt);
286 void         Nlm_OffsetRect(Nlm_RectPtr r, Nlm_Int2 dx, Nlm_Int2 dy);
287 void         Nlm_InsetRect(Nlm_RectPtr r, Nlm_Int2 dx, Nlm_Int2 dy);
288 Nlm_Boolean  Nlm_SectRect(Nlm_RectPtr src1, Nlm_RectPtr src2, Nlm_RectPtr dst);
289 Nlm_Boolean  Nlm_UnionRect(Nlm_RectPtr src1, Nlm_RectPtr src2, Nlm_RectPtr dst);
290 Nlm_Boolean  Nlm_EqualRect(Nlm_RectPtr r1, Nlm_RectPtr r2);
291 Nlm_Boolean  Nlm_EmptyRect(Nlm_RectPtr r);
292 Nlm_Boolean  Nlm_RectInRect(Nlm_RectPtr r1, Nlm_RectPtr r2);
293 Nlm_Boolean  Nlm_RectInRgn(Nlm_RectPtr r, Nlm_RegioN rgn);
294 
295 void         Nlm_EraseRect(Nlm_RectPtr r);
296 void         Nlm_FrameRect(Nlm_RectPtr r);
297 void         Nlm_PaintRect(Nlm_RectPtr r);
298 void         Nlm_InvertRect(Nlm_RectPtr r);
299 void         Nlm_ScrollRect(Nlm_RectPtr r, Nlm_Int2 dx, Nlm_Int2 dy);
300 
301 void         Nlm_EraseOval(Nlm_RectPtr r);
302 void         Nlm_FrameOval(Nlm_RectPtr r);
303 void         Nlm_PaintOval(Nlm_RectPtr r);
304 void         Nlm_InvertOval(Nlm_RectPtr r);
305 
306 void         Nlm_EraseRoundRect(Nlm_RectPtr r, Nlm_Int2 ovlWid, Nlm_Int2 ovlHgt);
307 void         Nlm_FrameRoundRect(Nlm_RectPtr r, Nlm_Int2 ovlWid, Nlm_Int2 ovlHgt);
308 void         Nlm_PaintRoundRect(Nlm_RectPtr r, Nlm_Int2 ovlWid, Nlm_Int2 ovlHgt);
309 void         Nlm_InvertRoundRect(Nlm_RectPtr r, Nlm_Int2 ovlWid, Nlm_Int2 ovlHgt);
310 
311 void         Nlm_EraseArc(Nlm_RectPtr r, Nlm_PoinT start, Nlm_PoinT end);
312 void         Nlm_FrameArc(Nlm_RectPtr r, Nlm_PoinT start, Nlm_PoinT end);
313 void         Nlm_PaintArc(Nlm_RectPtr r, Nlm_PoinT start, Nlm_PoinT end);
314 void         Nlm_InvertArc(Nlm_RectPtr r, Nlm_PoinT start, Nlm_PoinT end);
315 
316 /* Special case of an arc(90 grad) */
317 typedef enum {
318   eQ_RightTop    = 1,
319   eQ_LeftTop     = 2,
320   eQ_LeftBottom  = 3,
321   eQ_RightBottom = 4
322 } Nlm_EQuadrant;
323 #define EQuadrant Nlm_EQuadrant
324 
325 void         Nlm_EraseQuadrant(Nlm_RectPtr r, Nlm_EQuadrant quadrant);
326 void         Nlm_FrameQuadrant(Nlm_RectPtr r, Nlm_EQuadrant quadrant);
327 void         Nlm_PaintQuadrant(Nlm_RectPtr r, Nlm_EQuadrant quadrant);
328 void         Nlm_InvertQuadrant(Nlm_RectPtr r, Nlm_EQuadrant quadrant);
329 
330 
331 void         Nlm_ErasePoly(Nlm_Int2 num, Nlm_PointPtr pts);
332 void         Nlm_FramePoly(Nlm_Int2 num, Nlm_PointPtr pts);
333 void         Nlm_PaintPoly(Nlm_Int2 num, Nlm_PointPtr pts);
334 void         Nlm_InvertPoly(Nlm_Int2 num, Nlm_PointPtr pts);
335 
336 Nlm_RegioN   Nlm_CreateRgn(void);
337 Nlm_RegioN   Nlm_DestroyRgn(Nlm_RegioN rgn);
338 void         Nlm_ClearRgn(Nlm_RegioN rgn);
339 void         Nlm_LoadRectRgn(Nlm_RegioN rgn, Nlm_Int2 lf, Nlm_Int2 tp, Nlm_Int2 rt, Nlm_Int2 bt);
340 void         Nlm_OffsetRgn(Nlm_RegioN rgn, Nlm_Int2 dx, Nlm_Int2 dy);
341 void         Nlm_SectRgn(Nlm_RegioN src1, Nlm_RegioN src2, Nlm_RegioN dst);
342 void         Nlm_UnionRgn(Nlm_RegioN src1, Nlm_RegioN src2, Nlm_RegioN dst);
343 void         Nlm_DiffRgn(Nlm_RegioN src1, Nlm_RegioN src2, Nlm_RegioN dst);
344 void         Nlm_XorRgn(Nlm_RegioN src1, Nlm_RegioN src2, Nlm_RegioN dst);
345 Nlm_Boolean  Nlm_EqualRgn(Nlm_RegioN rgn1, Nlm_RegioN rgn2);
346 Nlm_Boolean  Nlm_EmptyRgn(Nlm_RegioN rgn);
347 
348 void         Nlm_EraseRgn(Nlm_RegioN rgn);
349 void         Nlm_FrameRgn(Nlm_RegioN rgn);
350 void         Nlm_PaintRgn(Nlm_RegioN rgn);
351 void         Nlm_InvertRgn(Nlm_RegioN rgn);
352 
353 void         Nlm_ClipRect(Nlm_RectPtr r);
354 void         Nlm_ClipRgn(Nlm_RegioN rgn);
355 void         Nlm_ResetClip(void);
356 
357 void         Nlm_ValidRect(Nlm_RectPtr r);
358 void         Nlm_InvalRect(Nlm_RectPtr r);
359 void         Nlm_ValidRgn(Nlm_RegioN rgn);
360 void         Nlm_InvalRgn(Nlm_RegioN rgn);
361 
362 void         Nlm_CopyBits(Nlm_RectPtr r, Nlm_VoidPtr source);
363 
364 typedef struct {
365   Nlm_Uint1 red;
366   Nlm_Uint1 green;
367   Nlm_Uint1 blue;
368 } Nlm_RGBColoR, PNTR Nlm_RGBColoRPtr;
369 
370 void         Nlm_CopyPixmap(Nlm_RectPtr r, Nlm_Int1Ptr source,
371                             Nlm_Uint1 totalColors,
372                             Nlm_RGBColoRPtr colorTable);
373 
374 /* Try to read alternate color set from the user-specified file;
375  * <table_index> <red> <green> <blue> [<name>].
376  * Return number of updated colors
377  */
378 size_t Nlm_UpdateColorTable(Nlm_RGBColoR table[], size_t table_size,
379                             const Nlm_Char PNTR filename);
380 #define UpdateColorTable Nlm_UpdateColorTable
381 
382 
383 /* [WIN_GIF] Create a GIF image with the given attributes, and set it as
384  * the current drawable.
385  */
386 Nlm_Boolean Nlm_CreateGIF(Nlm_Int2 width, Nlm_Int2 height,
387                           Nlm_Boolean transparent);
388 #define CreateGIF Nlm_CreateGIF
389 
390 /* [WIN_GIF] Save current GIF drawable to output stream "out".
391  */
392 Nlm_Boolean Nlm_SaveGIF(FILE* out);
393 #define SaveGIF Nlm_SaveGIF
394 
395 /* [WIN_GIF] Destroy current GIF drawable (if any).
396  */
397 void Nlm_DestroyGIF(void);
398 #define DestroyGIF Nlm_DestroyGIF
399 
400 /* [WIN_GIF] Make GIF image "im" be the current drawable.
401  * Return the previous one.
402  */
403 struct gdImageStruct* Nlm_SetCurrentGIF(struct gdImageStruct* im);
404 #define SetCurrentGIF Nlm_SetCurrentGIF
405 
406 
407 /* If the application is using GUI or just drawing(picture) functionality */
408 Nlm_Boolean Nlm_VibrantIsGUI(void);
409 #define VibrantIsGUI Nlm_VibrantIsGUI
410 
411 #ifdef __cplusplus
412 }
413 #endif
414 
415 #endif
416 
417