home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1999 / MacHack 1999.toast / The Hacks / ReaderMouse / LetterFind.h < prev    next >
Encoding:
C/C++ Source or Header  |  1999-06-22  |  4.6 KB  |  147 lines  |  [TEXT/CWIE]

  1.  
  2. #ifndef _LetterFind_
  3.  
  4. #define _LetterFind_
  5.  
  6. #include "MyHeaders.h"
  7.  
  8.  
  9. /* Constants */
  10. #define NUM_FONTS 3
  11. #define NUM_POINT_SIZES 4
  12. //#define NUM_LETTERS 96
  13. #define NUM_LETTERS 53
  14. #define MAX_ALPHA_LETTER 52
  15.  
  16. #define MAX_NUM_LETTERS_HALF_WORD 10
  17. #define MAX_NUM_LETTERS_WORD 21
  18. #define MID_WORD_LETTER 10
  19.  
  20. #define LETTER_RIGHT_PAD 1
  21. #define LETTER_LEFT_PAD 1
  22. #define LETTER_DIFF_MINUS 1
  23.  
  24. extern const short LETTER_PAD;
  25. extern const short LETTER_KERNEL_DIFF;
  26.  
  27. /* this should actually be (letter_offset + LETTER_LEFT_PAD)    ; real letter start
  28.                         + (kernel_width + LETTER_DIFF_MINUS 
  29.                                         - LETTER_PAD)            ; real letter width
  30.                         - LETTER_LEFT_PAD                         ; to take up the padding
  31.                                                                 ; on the kernel. 
  32.     cancels to letter_offset + kernel_width + LETTER_KERNEL_DIFF    */
  33.                                                                 
  34. #define NEXT_LETTER_OFFSET(letter_offset, kernel_width) ((letter_offset) + (kernel_width) - LETTER_KERNEL_DIFF)
  35. /* letter_offset + LETTER_LEFT_PAD - (prev_kernel_width - LETTER_KERNEL_DIFF) - LETTER_LEFT_PAD */
  36. #define LAST_LETTER_OFFSET(letter_offset, prev_kernel_width) ((letter_offset) - (prev_kernel_width) + LETTER_KERNEL_DIFF)
  37.  
  38.  
  39. // rgb 16b color: Xrrr rrgg gggb bbbb
  40. #define R_MASK_16 0x7C00
  41. #define G_MASK_16 0x03E0
  42. #define B_MASK_16 0x001F
  43. #define R_SHIFT_16 10
  44. #define G_SHIFT_16 5
  45. #define B_SHIFT_16 0
  46.  
  47. #define MASK_16 0x7FFF
  48. // half of the 5 bits 0x1F
  49. #define MID_VALUE_16 0x0F
  50. // for 16 bit color, 3 * 31 / 2
  51. #define MID_DIFF_VALUE_16 47
  52. // best score is 47 (MID_DIFF_VALUE_16) currently.  
  53. // If we weight differently this must change.
  54. #define CONFIDANT_SCORE 30
  55.  
  56. #define JITTER_DIVIDER 8
  57.  
  58. #define ROWBYTES_MASK 0x3FFF
  59. /* Macros */
  60. #define RPART16(pix)((pix & R_MASK_16) >> R_SHIFT_16)
  61. #define GPART16(pix)((pix & G_MASK_16) >> G_SHIFT_16)
  62. #define BPART16(pix)((pix & B_MASK_16))
  63.  
  64. #define ROWBYTES(rowbytes)((rowbytes) & ROWBYTES_MASK)
  65.  
  66.  
  67.  
  68. /* Structures */
  69. typedef struct FontData
  70. {
  71.     int maxHeight;
  72.     int maxWidth;
  73.     int font;
  74.     int kernelOffset[NUM_LETTERS];
  75.     int kernelWidth[NUM_LETTERS];
  76.     
  77.     GWorldPtr kernelBitmap;
  78.  
  79. } FontData;
  80.  
  81. typedef struct LetterData
  82. {
  83.     short font;
  84.     short pointSize;
  85.     short letter;
  86.     float letterScore;
  87.     short x,y;
  88. }LetterData;
  89.  
  90. typedef struct WordData
  91. {
  92.     short    font;
  93.     short    pointSize;
  94.     short    aveLetterScore;
  95.     short    leftLetters, rightLetters;
  96.     char    letters[MAX_NUM_LETTERS_WORD];
  97.     Rect    wordBounds;
  98. }WordData;
  99.  
  100. #define WORD_LENGTH(word)((word).leftLetters + (word).rightLetters + 1)
  101. #define WORD_LEFT_INDEX(word)(MID_WORD_LETTER-(word).leftLetters)
  102. #define WORD_RIGHT_INDEX(word)(MID_WORD_LETTER+(word).rightLetters)
  103. #define ZERO_WORD(word){    (word).font = 0; (word).pointSize = 0; \
  104.                             (word).aveLetterScore = 0; \
  105.                             (word).leftLetters = 0; (word).rightLetters = 0; \
  106.                             (word).letters[MID_WORD_LETTER] = ' '; \
  107.                             (word).wordBounds.left = 0; (word).wordBounds.right = 0; \
  108.                             (word).wordBounds.top = 0; (word).wordBounds.bottom = 0;}
  109.                             
  110. /* globals */
  111. extern short gPointSizes[NUM_POINT_SIZES];
  112. extern short gFonts[NUM_FONTS];
  113. extern char gLetters[NUM_LETTERS+1];
  114. extern FontData gFontDatas[NUM_FONTS * NUM_POINT_SIZES];
  115. extern GWorldPtr gScreenHDiff;
  116.  
  117.  
  118. /* Function Prototypes */
  119. void InitFontNumbers();
  120. OSErr InitializeFonts();
  121. OSErr InitializeDifferenceGWorlds();
  122.  
  123. void ConvertToHDiffKernel(GWorldPtr inGWorld);
  124. void HorizontalDifference(GWorldPtr screenGWorld);
  125. void PickFontNPointDiff16(WordData *bestWord);
  126. void Correlate(LetterData *bestLetter,Rect *searchRect, 
  127.                 short kernelHeight, short kernelWidth,
  128.                 Ptr kernelPixData, Ptr screenPixData, 
  129.                 short kernelRowBytes, short screenRowBytes);
  130. void GrowWord(WordData *inWord);
  131. void FindNextLetter(LetterData *refLetter, short searchLeft,
  132.                             Ptr screenPixData, short screenRowBytes, Rect *screenRect,
  133.                             Ptr fontPixData, short fontRowBytes);
  134. void CopyWordToPascalString(Str255 inString, WordData *inWord);
  135. void MyFindWord (WordData *bestWord, GWorldPtr inGWorld);
  136.  
  137.  
  138. /* More Macros */
  139. #define FONT_DATA(font,pointSize) (gFontDatas[(font) * NUM_POINT_SIZES + (pointSize)])
  140. #define ZERO_LETTER_DATA(let) {(let).font = 0; (let).pointSize = 0; (let).letter = 0; (let).letterScore = 0; (let).x = 0; (let).y = 0;}
  141. #define LETTER_EQUAL(a,b) {(a).font = (b).font; (a).pointSize = (b).pointSize; (a).letter = (b).letter; (a).letterScore = (b).letterScore; (a).x = (b).x; (a).y = (b).y;}
  142. #define LETTER_EQUAL_WORD(a,b) {(a).font = (b).font; (a).pointSize = (b).pointSize; (a).letter = (b).letters[MID_WORD_LETTER]; (a).letterScore = (b).aveLetterScore; (a).x = (b).wordBounds.left - LETTER_LEFT_PAD; (a).y = (b).wordBounds.top;}
  143.  
  144. #define UPDATE_SCORE(word, letterScore) ((word).aveLetterScore = (((word).aveLetterScore * ((word).leftLetters + (word).rightLetters)) + letterScore) / ((word).leftLetters + (word).rightLetters + 1))
  145.  
  146.  
  147. #endif