Visualization Library 2.0.0-b5

A lightweight C++ OpenGL middleware for 2D/3D graphics

VL     Star     Watch     Fork     Issue

[Download] [Tutorials] [All Classes] [Grouped Classes]
pshints.h
Go to the documentation of this file.
1 /***************************************************************************/
2 /* */
3 /* pshints.h */
4 /* */
5 /* Interface to Postscript-specific (Type 1 and Type 2) hints */
6 /* recorders (specification only). These are used to support native */
7 /* T1/T2 hints in the `type1', `cid', and `cff' font drivers. */
8 /* */
9 /* Copyright 2001-2003, 2005-2007, 2009, 2012 by */
10 /* David Turner, Robert Wilhelm, and Werner Lemberg. */
11 /* */
12 /* This file is part of the FreeType project, and may only be used, */
13 /* modified, and distributed under the terms of the FreeType project */
14 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */
15 /* this file you indicate that you have read the license and */
16 /* understand and accept it fully. */
17 /* */
18 /***************************************************************************/
19 
20 
21 #ifndef __PSHINTS_H__
22 #define __PSHINTS_H__
23 
24 
25 #include <ft2build.h>
26 #include FT_FREETYPE_H
27 #include FT_TYPE1_TABLES_H
28 
29 
31 
32 
33  /*************************************************************************/
34  /*************************************************************************/
35  /***** *****/
36  /***** INTERNAL REPRESENTATION OF GLOBALS *****/
37  /***** *****/
38  /*************************************************************************/
39  /*************************************************************************/
40 
41  typedef struct PSH_GlobalsRec_* PSH_Globals;
42 
43  typedef FT_Error
45  T1_Private* private_dict,
46  PSH_Globals* aglobals );
47 
48  typedef FT_Error
49  (*PSH_Globals_SetScaleFunc)( PSH_Globals globals,
50  FT_Fixed x_scale,
51  FT_Fixed y_scale,
52  FT_Fixed x_delta,
53  FT_Fixed y_delta );
54 
55  typedef void
56  (*PSH_Globals_DestroyFunc)( PSH_Globals globals );
57 
58 
59  typedef struct PSH_Globals_FuncsRec_
60  {
64 
66 
67 
68  /*************************************************************************/
69  /*************************************************************************/
70  /***** *****/
71  /***** PUBLIC TYPE 1 HINTS RECORDER *****/
72  /***** *****/
73  /*************************************************************************/
74  /*************************************************************************/
75 
76  /*************************************************************************
77  *
78  * @type:
79  * T1_Hints
80  *
81  * @description:
82  * This is a handle to an opaque structure used to record glyph hints
83  * from a Type 1 character glyph character string.
84  *
85  * The methods used to operate on this object are defined by the
86  * @T1_Hints_FuncsRec structure. Recording glyph hints is normally
87  * achieved through the following scheme:
88  *
89  * - Open a new hint recording session by calling the `open' method.
90  * This rewinds the recorder and prepare it for new input.
91  *
92  * - For each hint found in the glyph charstring, call the corresponding
93  * method (`stem', `stem3', or `reset'). Note that these functions do
94  * not return an error code.
95  *
96  * - Close the recording session by calling the `close' method. It
97  * returns an error code if the hints were invalid or something
98  * strange happened (e.g., memory shortage).
99  *
100  * The hints accumulated in the object can later be used by the
101  * PostScript hinter.
102  *
103  */
104  typedef struct T1_HintsRec_* T1_Hints;
105 
106 
107  /*************************************************************************
108  *
109  * @type:
110  * T1_Hints_Funcs
111  *
112  * @description:
113  * A pointer to the @T1_Hints_FuncsRec structure that defines the API of
114  * a given @T1_Hints object.
115  *
116  */
117  typedef const struct T1_Hints_FuncsRec_* T1_Hints_Funcs;
118 
119 
120  /*************************************************************************
121  *
122  * @functype:
123  * T1_Hints_OpenFunc
124  *
125  * @description:
126  * A method of the @T1_Hints class used to prepare it for a new Type 1
127  * hints recording session.
128  *
129  * @input:
130  * hints ::
131  * A handle to the Type 1 hints recorder.
132  *
133  * @note:
134  * You should always call the @T1_Hints_CloseFunc method in order to
135  * close an opened recording session.
136  *
137  */
138  typedef void
139  (*T1_Hints_OpenFunc)( T1_Hints hints );
140 
141 
142  /*************************************************************************
143  *
144  * @functype:
145  * T1_Hints_SetStemFunc
146  *
147  * @description:
148  * A method of the @T1_Hints class used to record a new horizontal or
149  * vertical stem. This corresponds to the Type 1 `hstem' and `vstem'
150  * operators.
151  *
152  * @input:
153  * hints ::
154  * A handle to the Type 1 hints recorder.
155  *
156  * dimension ::
157  * 0 for horizontal stems (hstem), 1 for vertical ones (vstem).
158  *
159  * coords ::
160  * Array of 2 coordinates in 16.16 format, used as (position,length)
161  * stem descriptor.
162  *
163  * @note:
164  * Use vertical coordinates (y) for horizontal stems (dim=0). Use
165  * horizontal coordinates (x) for vertical stems (dim=1).
166  *
167  * `coords[0]' is the absolute stem position (lowest coordinate);
168  * `coords[1]' is the length.
169  *
170  * The length can be negative, in which case it must be either -20 or
171  * -21. It is interpreted as a `ghost' stem, according to the Type 1
172  * specification.
173  *
174  * If the length is -21 (corresponding to a bottom ghost stem), then
175  * the real stem position is `coords[0]+coords[1]'.
176  *
177  */
178  typedef void
180  FT_UInt dimension,
181  FT_Fixed* coords );
182 
183 
184  /*************************************************************************
185  *
186  * @functype:
187  * T1_Hints_SetStem3Func
188  *
189  * @description:
190  * A method of the @T1_Hints class used to record three
191  * counter-controlled horizontal or vertical stems at once.
192  *
193  * @input:
194  * hints ::
195  * A handle to the Type 1 hints recorder.
196  *
197  * dimension ::
198  * 0 for horizontal stems, 1 for vertical ones.
199  *
200  * coords ::
201  * An array of 6 values in 16.16 format, holding 3 (position,length)
202  * pairs for the counter-controlled stems.
203  *
204  * @note:
205  * Use vertical coordinates (y) for horizontal stems (dim=0). Use
206  * horizontal coordinates (x) for vertical stems (dim=1).
207  *
208  * The lengths cannot be negative (ghost stems are never
209  * counter-controlled).
210  *
211  */
212  typedef void
214  FT_UInt dimension,
215  FT_Fixed* coords );
216 
217 
218  /*************************************************************************
219  *
220  * @functype:
221  * T1_Hints_ResetFunc
222  *
223  * @description:
224  * A method of the @T1_Hints class used to reset the stems hints in a
225  * recording session.
226  *
227  * @input:
228  * hints ::
229  * A handle to the Type 1 hints recorder.
230  *
231  * end_point ::
232  * The index of the last point in the input glyph in which the
233  * previously defined hints apply.
234  *
235  */
236  typedef void
237  (*T1_Hints_ResetFunc)( T1_Hints hints,
238  FT_UInt end_point );
239 
240 
241  /*************************************************************************
242  *
243  * @functype:
244  * T1_Hints_CloseFunc
245  *
246  * @description:
247  * A method of the @T1_Hints class used to close a hint recording
248  * session.
249  *
250  * @input:
251  * hints ::
252  * A handle to the Type 1 hints recorder.
253  *
254  * end_point ::
255  * The index of the last point in the input glyph.
256  *
257  * @return:
258  * FreeType error code. 0 means success.
259  *
260  * @note:
261  * The error code is set to indicate that an error occurred during the
262  * recording session.
263  *
264  */
265  typedef FT_Error
266  (*T1_Hints_CloseFunc)( T1_Hints hints,
267  FT_UInt end_point );
268 
269 
270  /*************************************************************************
271  *
272  * @functype:
273  * T1_Hints_ApplyFunc
274  *
275  * @description:
276  * A method of the @T1_Hints class used to apply hints to the
277  * corresponding glyph outline. Must be called once all hints have been
278  * recorded.
279  *
280  * @input:
281  * hints ::
282  * A handle to the Type 1 hints recorder.
283  *
284  * outline ::
285  * A pointer to the target outline descriptor.
286  *
287  * globals ::
288  * The hinter globals for this font.
289  *
290  * hint_mode ::
291  * Hinting information.
292  *
293  * @return:
294  * FreeType error code. 0 means success.
295  *
296  * @note:
297  * On input, all points within the outline are in font coordinates. On
298  * output, they are in 1/64th of pixels.
299  *
300  * The scaling transformation is taken from the `globals' object which
301  * must correspond to the same font as the glyph.
302  *
303  */
304  typedef FT_Error
305  (*T1_Hints_ApplyFunc)( T1_Hints hints,
306  FT_Outline* outline,
307  PSH_Globals globals,
308  FT_Render_Mode hint_mode );
309 
310 
311  /*************************************************************************
312  *
313  * @struct:
314  * T1_Hints_FuncsRec
315  *
316  * @description:
317  * The structure used to provide the API to @T1_Hints objects.
318  *
319  * @fields:
320  * hints ::
321  * A handle to the T1 Hints recorder.
322  *
323  * open ::
324  * The function to open a recording session.
325  *
326  * close ::
327  * The function to close a recording session.
328  *
329  * stem ::
330  * The function to set a simple stem.
331  *
332  * stem3 ::
333  * The function to set counter-controlled stems.
334  *
335  * reset ::
336  * The function to reset stem hints.
337  *
338  * apply ::
339  * The function to apply the hints to the corresponding glyph outline.
340  *
341  */
342  typedef struct T1_Hints_FuncsRec_
343  {
344  T1_Hints hints;
351 
353 
354 
355  /*************************************************************************/
356  /*************************************************************************/
357  /***** *****/
358  /***** PUBLIC TYPE 2 HINTS RECORDER *****/
359  /***** *****/
360  /*************************************************************************/
361  /*************************************************************************/
362 
363  /*************************************************************************
364  *
365  * @type:
366  * T2_Hints
367  *
368  * @description:
369  * This is a handle to an opaque structure used to record glyph hints
370  * from a Type 2 character glyph character string.
371  *
372  * The methods used to operate on this object are defined by the
373  * @T2_Hints_FuncsRec structure. Recording glyph hints is normally
374  * achieved through the following scheme:
375  *
376  * - Open a new hint recording session by calling the `open' method.
377  * This rewinds the recorder and prepare it for new input.
378  *
379  * - For each hint found in the glyph charstring, call the corresponding
380  * method (`stems', `hintmask', `counters'). Note that these
381  * functions do not return an error code.
382  *
383  * - Close the recording session by calling the `close' method. It
384  * returns an error code if the hints were invalid or something
385  * strange happened (e.g., memory shortage).
386  *
387  * The hints accumulated in the object can later be used by the
388  * Postscript hinter.
389  *
390  */
391  typedef struct T2_HintsRec_* T2_Hints;
392 
393 
394  /*************************************************************************
395  *
396  * @type:
397  * T2_Hints_Funcs
398  *
399  * @description:
400  * A pointer to the @T2_Hints_FuncsRec structure that defines the API of
401  * a given @T2_Hints object.
402  *
403  */
404  typedef const struct T2_Hints_FuncsRec_* T2_Hints_Funcs;
405 
406 
407  /*************************************************************************
408  *
409  * @functype:
410  * T2_Hints_OpenFunc
411  *
412  * @description:
413  * A method of the @T2_Hints class used to prepare it for a new Type 2
414  * hints recording session.
415  *
416  * @input:
417  * hints ::
418  * A handle to the Type 2 hints recorder.
419  *
420  * @note:
421  * You should always call the @T2_Hints_CloseFunc method in order to
422  * close an opened recording session.
423  *
424  */
425  typedef void
426  (*T2_Hints_OpenFunc)( T2_Hints hints );
427 
428 
429  /*************************************************************************
430  *
431  * @functype:
432  * T2_Hints_StemsFunc
433  *
434  * @description:
435  * A method of the @T2_Hints class used to set the table of stems in
436  * either the vertical or horizontal dimension. Equivalent to the
437  * `hstem', `vstem', `hstemhm', and `vstemhm' Type 2 operators.
438  *
439  * @input:
440  * hints ::
441  * A handle to the Type 2 hints recorder.
442  *
443  * dimension ::
444  * 0 for horizontal stems (hstem), 1 for vertical ones (vstem).
445  *
446  * count ::
447  * The number of stems.
448  *
449  * coords ::
450  * An array of `count' (position,length) pairs in 16.16 format.
451  *
452  * @note:
453  * Use vertical coordinates (y) for horizontal stems (dim=0). Use
454  * horizontal coordinates (x) for vertical stems (dim=1).
455  *
456  * There are `2*count' elements in the `coords' array. Each even
457  * element is an absolute position in font units, each odd element is a
458  * length in font units.
459  *
460  * A length can be negative, in which case it must be either -20 or
461  * -21. It is interpreted as a `ghost' stem, according to the Type 1
462  * specification.
463  *
464  */
465  typedef void
466  (*T2_Hints_StemsFunc)( T2_Hints hints,
467  FT_UInt dimension,
468  FT_UInt count,
469  FT_Fixed* coordinates );
470 
471 
472  /*************************************************************************
473  *
474  * @functype:
475  * T2_Hints_MaskFunc
476  *
477  * @description:
478  * A method of the @T2_Hints class used to set a given hintmask (this
479  * corresponds to the `hintmask' Type 2 operator).
480  *
481  * @input:
482  * hints ::
483  * A handle to the Type 2 hints recorder.
484  *
485  * end_point ::
486  * The glyph index of the last point to which the previously defined
487  * or activated hints apply.
488  *
489  * bit_count ::
490  * The number of bits in the hint mask.
491  *
492  * bytes ::
493  * An array of bytes modelling the hint mask.
494  *
495  * @note:
496  * If the hintmask starts the charstring (before any glyph point
497  * definition), the value of `end_point' should be 0.
498  *
499  * `bit_count' is the number of meaningful bits in the `bytes' array; it
500  * must be equal to the total number of hints defined so far (i.e.,
501  * horizontal+verticals).
502  *
503  * The `bytes' array can come directly from the Type 2 charstring and
504  * respects the same format.
505  *
506  */
507  typedef void
508  (*T2_Hints_MaskFunc)( T2_Hints hints,
509  FT_UInt end_point,
510  FT_UInt bit_count,
511  const FT_Byte* bytes );
512 
513 
514  /*************************************************************************
515  *
516  * @functype:
517  * T2_Hints_CounterFunc
518  *
519  * @description:
520  * A method of the @T2_Hints class used to set a given counter mask
521  * (this corresponds to the `hintmask' Type 2 operator).
522  *
523  * @input:
524  * hints ::
525  * A handle to the Type 2 hints recorder.
526  *
527  * end_point ::
528  * A glyph index of the last point to which the previously defined or
529  * active hints apply.
530  *
531  * bit_count ::
532  * The number of bits in the hint mask.
533  *
534  * bytes ::
535  * An array of bytes modelling the hint mask.
536  *
537  * @note:
538  * If the hintmask starts the charstring (before any glyph point
539  * definition), the value of `end_point' should be 0.
540  *
541  * `bit_count' is the number of meaningful bits in the `bytes' array; it
542  * must be equal to the total number of hints defined so far (i.e.,
543  * horizontal+verticals).
544  *
545  * The `bytes' array can come directly from the Type 2 charstring and
546  * respects the same format.
547  *
548  */
549  typedef void
551  FT_UInt bit_count,
552  const FT_Byte* bytes );
553 
554 
555  /*************************************************************************
556  *
557  * @functype:
558  * T2_Hints_CloseFunc
559  *
560  * @description:
561  * A method of the @T2_Hints class used to close a hint recording
562  * session.
563  *
564  * @input:
565  * hints ::
566  * A handle to the Type 2 hints recorder.
567  *
568  * end_point ::
569  * The index of the last point in the input glyph.
570  *
571  * @return:
572  * FreeType error code. 0 means success.
573  *
574  * @note:
575  * The error code is set to indicate that an error occurred during the
576  * recording session.
577  *
578  */
579  typedef FT_Error
580  (*T2_Hints_CloseFunc)( T2_Hints hints,
581  FT_UInt end_point );
582 
583 
584  /*************************************************************************
585  *
586  * @functype:
587  * T2_Hints_ApplyFunc
588  *
589  * @description:
590  * A method of the @T2_Hints class used to apply hints to the
591  * corresponding glyph outline. Must be called after the `close'
592  * method.
593  *
594  * @input:
595  * hints ::
596  * A handle to the Type 2 hints recorder.
597  *
598  * outline ::
599  * A pointer to the target outline descriptor.
600  *
601  * globals ::
602  * The hinter globals for this font.
603  *
604  * hint_mode ::
605  * Hinting information.
606  *
607  * @return:
608  * FreeType error code. 0 means success.
609  *
610  * @note:
611  * On input, all points within the outline are in font coordinates. On
612  * output, they are in 1/64th of pixels.
613  *
614  * The scaling transformation is taken from the `globals' object which
615  * must correspond to the same font than the glyph.
616  *
617  */
618  typedef FT_Error
619  (*T2_Hints_ApplyFunc)( T2_Hints hints,
620  FT_Outline* outline,
621  PSH_Globals globals,
622  FT_Render_Mode hint_mode );
623 
624 
625  /*************************************************************************
626  *
627  * @struct:
628  * T2_Hints_FuncsRec
629  *
630  * @description:
631  * The structure used to provide the API to @T2_Hints objects.
632  *
633  * @fields:
634  * hints ::
635  * A handle to the T2 hints recorder object.
636  *
637  * open ::
638  * The function to open a recording session.
639  *
640  * close ::
641  * The function to close a recording session.
642  *
643  * stems ::
644  * The function to set the dimension's stems table.
645  *
646  * hintmask ::
647  * The function to set hint masks.
648  *
649  * counter ::
650  * The function to set counter masks.
651  *
652  * apply ::
653  * The function to apply the hints on the corresponding glyph outline.
654  *
655  */
656  typedef struct T2_Hints_FuncsRec_
657  {
658  T2_Hints hints;
665 
667 
668 
669  /* */
670 
671 
672  typedef struct PSHinter_Interface_
673  {
674  PSH_Globals_Funcs (*get_globals_funcs)( FT_Module module );
675  T1_Hints_Funcs (*get_t1_funcs) ( FT_Module module );
676  T2_Hints_Funcs (*get_t2_funcs) ( FT_Module module );
677 
679 
681 
682 
683 #ifndef FT_CONFIG_OPTION_PIC
684 
685 #define FT_DEFINE_PSHINTER_INTERFACE( \
686  class_, \
687  get_globals_funcs_, \
688  get_t1_funcs_, \
689  get_t2_funcs_ ) \
690  static const PSHinter_Interface class_ = \
691  { \
692  get_globals_funcs_, \
693  get_t1_funcs_, \
694  get_t2_funcs_ \
695  };
696 
697 #else /* FT_CONFIG_OPTION_PIC */
698 
699 #define FT_DEFINE_PSHINTER_INTERFACE( \
700  class_, \
701  get_globals_funcs_, \
702  get_t1_funcs_, \
703  get_t2_funcs_ ) \
704  void \
705  FT_Init_Class_ ## class_( FT_Library library, \
706  PSHinter_Interface* clazz ) \
707  { \
708  FT_UNUSED( library ); \
709  \
710  clazz->get_globals_funcs = get_globals_funcs_; \
711  clazz->get_t1_funcs = get_t1_funcs_; \
712  clazz->get_t2_funcs = get_t2_funcs_; \
713  }
714 
715 #endif /* FT_CONFIG_OPTION_PIC */
716 
718 
719 #endif /* __PSHINTS_H__ */
720 
721 
722 /* END */
PSH_Globals_SetScaleFunc set_scale
Definition: pshints.h:62
typedefFT_BEGIN_HEADER struct PSH_GlobalsRec_ * PSH_Globals
Definition: pshints.h:41
int FT_Error
Definition: fttypes.h:296
void(* T1_Hints_SetStem3Func)(T1_Hints hints, FT_UInt dimension, FT_Fixed *coords)
Definition: pshints.h:213
void(* T2_Hints_CounterFunc)(T2_Hints hints, FT_UInt bit_count, const FT_Byte *bytes)
Definition: pshints.h:550
#define FT_END_HEADER
Definition: ftheader.h:54
T1_Hints_ResetFunc reset
Definition: pshints.h:349
struct T2_HintsRec_ * T2_Hints
Definition: pshints.h:391
T2_Hints hints
Definition: pshints.h:658
PSHinter_Interface * PSHinter_Service
Definition: pshints.h:680
enum FT_Render_Mode_ FT_Render_Mode
void(* T1_Hints_SetStemFunc)(T1_Hints hints, FT_UInt dimension, FT_Fixed *coords)
Definition: pshints.h:179
T1_Hints_CloseFunc close
Definition: pshints.h:346
void(* T1_Hints_ResetFunc)(T1_Hints hints, FT_UInt end_point)
Definition: pshints.h:237
T1_Hints_ApplyFunc apply
Definition: pshints.h:350
void(* T2_Hints_OpenFunc)(T2_Hints hints)
Definition: pshints.h:426
T2_Hints_StemsFunc stems
Definition: pshints.h:661
PSH_Globals_NewFunc create
Definition: pshints.h:61
FT_Memory memory
Definition: pshglob.h:137
typedef void(APIENTRY *GLDEBUGPROCARB)(GLenum source
T1_Hints hints
Definition: pshints.h:344
PSH_Globals_DestroyFunc destroy
Definition: pshints.h:63
unsigned char FT_Byte
Definition: fttypes.h:150
#define FT_BEGIN_HEADER
Definition: ftheader.h:36
struct PSHinter_Interface_ PSHinter_Interface
T1_Hints_SetStemFunc stem
Definition: pshints.h:347
struct PSH_Globals_FuncsRec_ * PSH_Globals_Funcs
T2_Hints_CounterFunc counter
Definition: pshints.h:663
FT_Error(* PSH_Globals_NewFunc)(FT_Memory memory, T1_Private *private_dict, PSH_Globals *aglobals)
Definition: pshints.h:44
T2_Hints_ApplyFunc apply
Definition: pshints.h:664
struct T1_Hints_FuncsRec_ T1_Hints_FuncsRec
struct T2_Hints_FuncsRec_ T2_Hints_FuncsRec
T1_Hints_OpenFunc open
Definition: pshints.h:345
void(* T2_Hints_MaskFunc)(T2_Hints hints, FT_UInt end_point, FT_UInt bit_count, const FT_Byte *bytes)
Definition: pshints.h:508
FT_Error(* T1_Hints_CloseFunc)(T1_Hints hints, FT_UInt end_point)
Definition: pshints.h:266
T2_Hints_OpenFunc open
Definition: pshints.h:659
struct T1_HintsRec_ * T1_Hints
Definition: pshints.h:104
typedefFT_BEGIN_HEADER struct FT_MemoryRec_ * FT_Memory
Definition: ftsystem.h:66
void(* PSH_Globals_DestroyFunc)(PSH_Globals globals)
Definition: pshints.h:56
FT_Error(* T2_Hints_CloseFunc)(T2_Hints hints, FT_UInt end_point)
Definition: pshints.h:580
signed long FT_Fixed
Definition: fttypes.h:284
void(* T1_Hints_OpenFunc)(T1_Hints hints)
Definition: pshints.h:139
FT_Error(* T1_Hints_ApplyFunc)(T1_Hints hints, FT_Outline *outline, PSH_Globals globals, FT_Render_Mode hint_mode)
Definition: pshints.h:305
unsigned int FT_UInt
Definition: fttypes.h:227
void(* T2_Hints_StemsFunc)(T2_Hints hints, FT_UInt dimension, FT_UInt count, FT_Fixed *coordinates)
Definition: pshints.h:466
struct PSH_Globals_FuncsRec_ PSH_Globals_FuncsRec
GLuint GLuint GLsizei count
FT_Error(* T2_Hints_ApplyFunc)(T2_Hints hints, FT_Outline *outline, PSH_Globals globals, FT_Render_Mode hint_mode)
Definition: pshints.h:619
T1_Hints_SetStem3Func stem3
Definition: pshints.h:348
GLuint coords
const struct T2_Hints_FuncsRec_ * T2_Hints_Funcs
Definition: pshints.h:404
T2_Hints_CloseFunc close
Definition: pshints.h:660
FT_Error(* PSH_Globals_SetScaleFunc)(PSH_Globals globals, FT_Fixed x_scale, FT_Fixed y_scale, FT_Fixed x_delta, FT_Fixed y_delta)
Definition: pshints.h:49
const struct T1_Hints_FuncsRec_ * T1_Hints_Funcs
Definition: pshints.h:117
T2_Hints_MaskFunc hintmask
Definition: pshints.h:662