home *** CD-ROM | disk | FTP | other *** search
-
- #ifndef _LetterFind_
-
- #define _LetterFind_
-
- #include "MyHeaders.h"
-
-
- /* Constants */
- #define NUM_FONTS 3
- #define NUM_POINT_SIZES 4
- //#define NUM_LETTERS 96
- #define NUM_LETTERS 53
- #define MAX_ALPHA_LETTER 52
-
- #define MAX_NUM_LETTERS_HALF_WORD 10
- #define MAX_NUM_LETTERS_WORD 21
- #define MID_WORD_LETTER 10
-
- #define LETTER_RIGHT_PAD 1
- #define LETTER_LEFT_PAD 1
- #define LETTER_DIFF_MINUS 1
-
- extern const short LETTER_PAD;
- extern const short LETTER_KERNEL_DIFF;
-
- /* this should actually be (letter_offset + LETTER_LEFT_PAD) ; real letter start
- + (kernel_width + LETTER_DIFF_MINUS
- - LETTER_PAD) ; real letter width
- - LETTER_LEFT_PAD ; to take up the padding
- ; on the kernel.
- cancels to letter_offset + kernel_width + LETTER_KERNEL_DIFF */
-
- #define NEXT_LETTER_OFFSET(letter_offset, kernel_width) ((letter_offset) + (kernel_width) - LETTER_KERNEL_DIFF)
- /* letter_offset + LETTER_LEFT_PAD - (prev_kernel_width - LETTER_KERNEL_DIFF) - LETTER_LEFT_PAD */
- #define LAST_LETTER_OFFSET(letter_offset, prev_kernel_width) ((letter_offset) - (prev_kernel_width) + LETTER_KERNEL_DIFF)
-
-
- // rgb 16b color: Xrrr rrgg gggb bbbb
- #define R_MASK_16 0x7C00
- #define G_MASK_16 0x03E0
- #define B_MASK_16 0x001F
- #define R_SHIFT_16 10
- #define G_SHIFT_16 5
- #define B_SHIFT_16 0
-
- #define MASK_16 0x7FFF
- // half of the 5 bits 0x1F
- #define MID_VALUE_16 0x0F
- // for 16 bit color, 3 * 31 / 2
- #define MID_DIFF_VALUE_16 47
- // best score is 47 (MID_DIFF_VALUE_16) currently.
- // If we weight differently this must change.
- #define CONFIDANT_SCORE 30
-
- #define JITTER_DIVIDER 8
-
- #define ROWBYTES_MASK 0x3FFF
- /* Macros */
- #define RPART16(pix)((pix & R_MASK_16) >> R_SHIFT_16)
- #define GPART16(pix)((pix & G_MASK_16) >> G_SHIFT_16)
- #define BPART16(pix)((pix & B_MASK_16))
-
- #define ROWBYTES(rowbytes)((rowbytes) & ROWBYTES_MASK)
-
-
-
- /* Structures */
- typedef struct FontData
- {
- int maxHeight;
- int maxWidth;
- int font;
- int kernelOffset[NUM_LETTERS];
- int kernelWidth[NUM_LETTERS];
-
- GWorldPtr kernelBitmap;
-
- } FontData;
-
- typedef struct LetterData
- {
- short font;
- short pointSize;
- short letter;
- float letterScore;
- short x,y;
- }LetterData;
-
- typedef struct WordData
- {
- short font;
- short pointSize;
- short aveLetterScore;
- short leftLetters, rightLetters;
- char letters[MAX_NUM_LETTERS_WORD];
- Rect wordBounds;
- }WordData;
-
- #define WORD_LENGTH(word)((word).leftLetters + (word).rightLetters + 1)
- #define WORD_LEFT_INDEX(word)(MID_WORD_LETTER-(word).leftLetters)
- #define WORD_RIGHT_INDEX(word)(MID_WORD_LETTER+(word).rightLetters)
- #define ZERO_WORD(word){ (word).font = 0; (word).pointSize = 0; \
- (word).aveLetterScore = 0; \
- (word).leftLetters = 0; (word).rightLetters = 0; \
- (word).letters[MID_WORD_LETTER] = ' '; \
- (word).wordBounds.left = 0; (word).wordBounds.right = 0; \
- (word).wordBounds.top = 0; (word).wordBounds.bottom = 0;}
-
- /* globals */
- extern short gPointSizes[NUM_POINT_SIZES];
- extern short gFonts[NUM_FONTS];
- extern char gLetters[NUM_LETTERS+1];
- extern FontData gFontDatas[NUM_FONTS * NUM_POINT_SIZES];
- extern GWorldPtr gScreenHDiff;
-
-
- /* Function Prototypes */
- void InitFontNumbers();
- OSErr InitializeFonts();
- OSErr InitializeDifferenceGWorlds();
-
- void ConvertToHDiffKernel(GWorldPtr inGWorld);
- void HorizontalDifference(GWorldPtr screenGWorld);
- void PickFontNPointDiff16(WordData *bestWord);
- void Correlate(LetterData *bestLetter,Rect *searchRect,
- short kernelHeight, short kernelWidth,
- Ptr kernelPixData, Ptr screenPixData,
- short kernelRowBytes, short screenRowBytes);
- void GrowWord(WordData *inWord);
- void FindNextLetter(LetterData *refLetter, short searchLeft,
- Ptr screenPixData, short screenRowBytes, Rect *screenRect,
- Ptr fontPixData, short fontRowBytes);
- void CopyWordToPascalString(Str255 inString, WordData *inWord);
- void MyFindWord (WordData *bestWord, GWorldPtr inGWorld);
-
-
- /* More Macros */
- #define FONT_DATA(font,pointSize) (gFontDatas[(font) * NUM_POINT_SIZES + (pointSize)])
- #define ZERO_LETTER_DATA(let) {(let).font = 0; (let).pointSize = 0; (let).letter = 0; (let).letterScore = 0; (let).x = 0; (let).y = 0;}
- #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;}
- #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;}
-
- #define UPDATE_SCORE(word, letterScore) ((word).aveLetterScore = (((word).aveLetterScore * ((word).leftLetters + (word).rightLetters)) + letterScore) / ((word).leftLetters + (word).rightLetters + 1))
-
-
- #endif