// Copyright (C) 2010, Guy Barrand. All rights reserved. // See the file tools.license for terms. #ifndef tools_hershey #define tools_hershey ////////////////////////////////////////////////////////////////////////////// // drawn fonts comming from CERNLIB ! A long story now. ////////////////////// ////////////////////////////////////////////////////////////////////////////// namespace tools { class hershey { private: enum { H_ROMAN = 1, H_DIGIT = 2, H_MATH = 3, H_SPECIAL = 4, H_GREEK = 5, H_UPPER = 1, H_LOWER = 2, H_NBITMX = 30 }; public: static unsigned int max_poly() { return 8;} //font special reaches 8 static unsigned int max_point() {return 160;} // 40 * 4 static void special_char_points(char a_char,float a_scale, //input int& a_number,int* a_mx_point, float* aX,float* aY,float& a_width){ // PAW special characters. extract(H_SPECIAL,H_UPPER,a_char,a_scale,a_number,a_mx_point,aX,aY,a_width); } static void latin_char_points(char a_char,float a_scale, //input int& a_number,int* a_mx_point, float* aX,float* aY,float& a_width){ // Latin correspondance with HPLSOF // ABCDEFGHIJKLMNOPQRSTUVWXYZ done with H_ROMAN UPPER // abcdefghijklmnopqrstuvwxyz done with H_ROMAN LOWER // 0123456789 done with H_DIGIT // .,/()-+=* done with H_MATH // $!#>?:;<[]{}%& done with H_SPECIAL switch(a_char) { case 'A':extract(H_ROMAN,H_UPPER,'A',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'B':extract(H_ROMAN,H_UPPER,'B',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'C':extract(H_ROMAN,H_UPPER,'C',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'D':extract(H_ROMAN,H_UPPER,'D',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'E':extract(H_ROMAN,H_UPPER,'E',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'F':extract(H_ROMAN,H_UPPER,'F',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'G':extract(H_ROMAN,H_UPPER,'G',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'H':extract(H_ROMAN,H_UPPER,'H',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'I':extract(H_ROMAN,H_UPPER,'I',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'J':extract(H_ROMAN,H_UPPER,'J',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'K':extract(H_ROMAN,H_UPPER,'K',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'L':extract(H_ROMAN,H_UPPER,'L',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'M':extract(H_ROMAN,H_UPPER,'M',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'N':extract(H_ROMAN,H_UPPER,'N',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'O':extract(H_ROMAN,H_UPPER,'O',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'P':extract(H_ROMAN,H_UPPER,'P',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'Q':extract(H_ROMAN,H_UPPER,'Q',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'R':extract(H_ROMAN,H_UPPER,'R',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'S':extract(H_ROMAN,H_UPPER,'S',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'T':extract(H_ROMAN,H_UPPER,'T',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'U':extract(H_ROMAN,H_UPPER,'U',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'V':extract(H_ROMAN,H_UPPER,'V',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'W':extract(H_ROMAN,H_UPPER,'W',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'X':extract(H_ROMAN,H_UPPER,'X',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'Y':extract(H_ROMAN,H_UPPER,'Y',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'Z':extract(H_ROMAN,H_UPPER,'Z',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'a':extract(H_ROMAN,H_LOWER,'A',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'b':extract(H_ROMAN,H_LOWER,'B',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'c':extract(H_ROMAN,H_LOWER,'C',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'd':extract(H_ROMAN,H_LOWER,'D',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'e':extract(H_ROMAN,H_LOWER,'E',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'f':extract(H_ROMAN,H_LOWER,'F',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'g':extract(H_ROMAN,H_LOWER,'G',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'h':extract(H_ROMAN,H_LOWER,'H',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'i':extract(H_ROMAN,H_LOWER,'I',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'j':extract(H_ROMAN,H_LOWER,'J',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'k':extract(H_ROMAN,H_LOWER,'K',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'l':extract(H_ROMAN,H_LOWER,'L',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'm':extract(H_ROMAN,H_LOWER,'M',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'n':extract(H_ROMAN,H_LOWER,'N',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'o':extract(H_ROMAN,H_LOWER,'O',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'p':extract(H_ROMAN,H_LOWER,'P',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'q':extract(H_ROMAN,H_LOWER,'Q',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'r':extract(H_ROMAN,H_LOWER,'R',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 's':extract(H_ROMAN,H_LOWER,'S',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 't':extract(H_ROMAN,H_LOWER,'T',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'u':extract(H_ROMAN,H_LOWER,'U',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'v':extract(H_ROMAN,H_LOWER,'V',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'w':extract(H_ROMAN,H_LOWER,'W',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'x':extract(H_ROMAN,H_LOWER,'X',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'y':extract(H_ROMAN,H_LOWER,'Y',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'z':extract(H_ROMAN,H_LOWER,'Z',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '0':extract(H_DIGIT,H_UPPER,'0',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '1':extract(H_DIGIT,H_UPPER,'1',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '2':extract(H_DIGIT,H_UPPER,'2',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '3':extract(H_DIGIT,H_UPPER,'3',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '4':extract(H_DIGIT,H_UPPER,'4',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '5':extract(H_DIGIT,H_UPPER,'5',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '6':extract(H_DIGIT,H_UPPER,'6',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '7':extract(H_DIGIT,H_UPPER,'7',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '8':extract(H_DIGIT,H_UPPER,'8',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '9':extract(H_DIGIT,H_UPPER,'9',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '.':extract(H_MATH,H_UPPER,'.',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case ',':extract(H_MATH,H_UPPER,',',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '/':extract(H_MATH,H_UPPER,'/',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '(':extract(H_MATH,H_UPPER,'(',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case ')':extract(H_MATH,H_UPPER,')',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '-':extract(H_MATH,H_UPPER,'-',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '+':extract(H_MATH,H_UPPER,'+',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '=':extract(H_MATH,H_UPPER,'=',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '*':extract(H_MATH,H_UPPER,'*',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '$':extract(H_SPECIAL,H_UPPER,'D',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '!':extract(H_SPECIAL,H_UPPER,'E',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '#':extract(H_SPECIAL,H_UPPER,'F',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '>':extract(H_SPECIAL,H_UPPER,'G',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '?':extract(H_SPECIAL,H_UPPER,'H',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case ':':extract(H_SPECIAL,H_UPPER,'J',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case ';':extract(H_SPECIAL,H_UPPER,'K',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '<':extract(H_SPECIAL,H_UPPER,'L',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '[':extract(H_SPECIAL,H_UPPER,'M',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case ']':extract(H_SPECIAL,H_UPPER,'N',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '{':extract(H_SPECIAL,H_UPPER,'P',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '}':extract(H_SPECIAL,H_UPPER,'Q',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '%':extract(H_SPECIAL,H_UPPER,'Y',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '&':extract(H_SPECIAL,H_UPPER,'W',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case '_': a_number = 1; a_mx_point[0] = 2; aX[0] = 0; aY[0] = 0; aX[1] = a_scale; aY[1] = 0; a_width = a_scale; break; case ' ': a_number = 0; a_width = a_scale/2; break; default : a_number = 0; a_width = a_scale; break; } } static void greek_char_points(char a_char,float a_scale, //input int& a_number,int* a_mx_point, float* aX,float* aY,float& a_width){ switch(a_char) { case 'A':extract(H_GREEK,H_UPPER,'A',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'B':extract(H_GREEK,H_UPPER,'B',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'C':extract(H_GREEK,H_UPPER,'C',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'D':extract(H_GREEK,H_UPPER,'D',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'E':extract(H_GREEK,H_UPPER,'E',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'F':extract(H_GREEK,H_UPPER,'F',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'G':extract(H_GREEK,H_UPPER,'G',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'H':extract(H_GREEK,H_UPPER,'H',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'I':extract(H_GREEK,H_UPPER,'I',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'J':extract(H_GREEK,H_UPPER,'J',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'K':extract(H_GREEK,H_UPPER,'K',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'L':extract(H_GREEK,H_UPPER,'L',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'M':extract(H_GREEK,H_UPPER,'M',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'N':extract(H_GREEK,H_UPPER,'N',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'O':extract(H_GREEK,H_UPPER,'O',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'P':extract(H_GREEK,H_UPPER,'P',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'Q':extract(H_GREEK,H_UPPER,'Q',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'R':extract(H_GREEK,H_UPPER,'R',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'S':extract(H_GREEK,H_UPPER,'S',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'T':extract(H_GREEK,H_UPPER,'T',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'U':extract(H_GREEK,H_UPPER,'U',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'V':extract(H_GREEK,H_UPPER,'V',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'W':extract(H_GREEK,H_UPPER,'W',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'X':extract(H_GREEK,H_UPPER,'X',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'Y':extract(H_GREEK,H_UPPER,'Y',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'Z':extract(H_GREEK,H_UPPER,'Z',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'a':extract(H_GREEK,H_LOWER,'A',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'b':extract(H_GREEK,H_LOWER,'B',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'c':extract(H_GREEK,H_LOWER,'C',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'd':extract(H_GREEK,H_LOWER,'D',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'e':extract(H_GREEK,H_LOWER,'E',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'f':extract(H_GREEK,H_LOWER,'F',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'g':extract(H_GREEK,H_LOWER,'G',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'h':extract(H_GREEK,H_LOWER,'H',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'i':extract(H_GREEK,H_LOWER,'I',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'j':extract(H_GREEK,H_LOWER,'J',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'k':extract(H_GREEK,H_LOWER,'K',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'l':extract(H_GREEK,H_LOWER,'L',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'm':extract(H_GREEK,H_LOWER,'M',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'n':extract(H_GREEK,H_LOWER,'N',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'o':extract(H_GREEK,H_LOWER,'O',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'p':extract(H_GREEK,H_LOWER,'P',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'q':extract(H_GREEK,H_LOWER,'Q',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'r':extract(H_GREEK,H_LOWER,'R',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 's':extract(H_GREEK,H_LOWER,'S',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 't':extract(H_GREEK,H_LOWER,'T',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'u':extract(H_GREEK,H_LOWER,'U',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'v':extract(H_GREEK,H_LOWER,'V',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'w':extract(H_GREEK,H_LOWER,'W',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'x':extract(H_GREEK,H_LOWER,'X',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'y':extract(H_GREEK,H_LOWER,'Y',a_scale,a_number,a_mx_point,aX,aY,a_width);break; case 'z':extract(H_GREEK,H_LOWER,'Z',a_scale,a_number,a_mx_point,aX,aY,a_width);break; default : latin_char_points(a_char,a_scale,a_number,a_mx_point,aX,aY,a_width);break; } } private: static void extract(int aType,int aCase,char aC,float a_scale, //input int& aN,int* a_mx_point, float* aX,float* aY,float& a_width){ int count; int npoly,ichr,iw,idif,ibit,kx,ky,iy0,ix0,dky,ipoint; float scale,size; float max_x; ichr = 1; if (aType==H_DIGIT) { switch(aC) { case '0':ichr= 1;break; case '1':ichr= 2;break; case '2':ichr= 3;break; case '3':ichr= 4;break; case '4':ichr= 5;break; case '5':ichr= 6;break; case '6':ichr= 7;break; case '7':ichr= 8;break; case '8':ichr= 9;break; case '9':ichr=10;break; } } else if (aType==H_ROMAN) { switch(aC) { case 'A':ichr=11;break; case 'B':ichr=12;break; case 'C':ichr=13;break; case 'D':ichr=14;break; case 'E':ichr=15;break; case 'F':ichr=16;break; case 'G':ichr=17;break; case 'H':ichr=18;break; case 'I':ichr=19;break; case 'J':ichr=20;break; case 'K':ichr=21;break; case 'L':ichr=22;break; case 'M':ichr=23;break; case 'N':ichr=24;break; case 'O':ichr=25;break; case 'P':ichr=26;break; case 'Q':ichr=27;break; case 'R':ichr=28;break; case 'S':ichr=29;break; case 'T':ichr=30;break; case 'U':ichr=31;break; case 'V':ichr=32;break; case 'W':ichr=33;break; case 'X':ichr=34;break; case 'Y':ichr=35;break; case 'Z':ichr=36;break; } } else if (aType==H_GREEK) { switch(aC) { case 'A':ichr=1 ;break; case 'B':ichr=2 ;break; case 'C':ichr=7 ;break; case 'D':ichr=4 ;break; case 'E':ichr=5 ;break; case 'F':ichr=21;break; case 'G':ichr=3 ;break; case 'H':ichr=22;break; case 'I':ichr=9 ;break; case 'J':ichr=9 ;break; case 'K':ichr=10;break; case 'L':ichr=11;break; case 'M':ichr=12;break; case 'N':ichr=13;break; case 'O':ichr=15;break; case 'P':ichr=16;break; case 'Q':ichr=8 ;break; case 'R':ichr=17;break; case 'S':ichr=18;break; case 'T':ichr=19;break; case 'U':ichr=20;break; case 'V':ichr=22;break; case 'W':ichr=24;break; case 'X':ichr=14;break; case 'Y':ichr=23;break; case 'Z':ichr=6 ;break; } ichr += 36; } else if (aType==H_SPECIAL) { switch(aC) { case 'A':ichr=61;break; case 'B':ichr=62;break; case 'C':ichr=63;break; case 'D':ichr=64;break; case 'E':ichr=65;break; case 'F':ichr=66;break; case 'G':ichr=67;break; case 'H':ichr=68;break; case 'I':ichr=69;break; case 'J':ichr=70;break; case 'K':ichr=71;break; case 'L':ichr=72;break; case 'M':ichr=73;break; case 'N':ichr=74;break; case 'O':ichr=75;break; case 'P':ichr=76;break; case 'Q':ichr=77;break; case 'R':ichr=78;break; case 'S':ichr=79;break; case 'T':ichr=80;break; case 'U':ichr=81;break; case 'V':ichr=82;break; case 'W':ichr=83;break; case 'X':ichr=84;break; case 'Y':ichr=85;break; case 'Z':ichr=86;break; case '0':ichr=87;break; case '1':ichr=88;break; case '2':ichr=89;break; case '3':ichr=90;break; case '4':ichr=91;break; case '5':ichr=92;break; case '6':ichr=93;break; case '7':ichr=94;break; case '8':ichr=95;break; case '9':ichr=96;break; } } else if (aType==H_MATH) { switch(aC) { case '.':ichr= 97;break; case ',':ichr= 98;break; case '/':ichr= 99;break; case '(':ichr=100;break; case ')':ichr=101;break; case '-':ichr=102;break; case '+':ichr=103;break; case '=':ichr=104;break; case '*':ichr=105;break; } } if (aCase==H_LOWER) ichr += 105; // scale : size = a_scale; if(size<0.001) size = 0.25F; iy0 = 9; dky = 21; if (aType==H_SPECIAL) rescale(ichr,iy0,dky); scale = size/dky; iw = hs(ichr-1) - 1; kx = (hx(iw) % 64 ) - 32; ky = (hy(iw) % 64 ) - 32; ibit = 1; idif = 1; ix0 = kx; // a character may be composed of many polylines : npoly = 0; ipoint = 0; max_x = 0; while(1) { count = 0; while(1) { ibit += 6; idif *= 64; if(ibit>=H_NBITMX) { ibit = 1; idif = 1; iw ++; } kx = ((hx(iw)/idif) % 64 ) - 32; ky = ((hy(iw)/idif) % 64 ) - 32; if(kx==31) break; aX[ipoint] = scale * (kx - ix0); aY[ipoint] = scale * (iy0 - ky); if (aX[ipoint] > max_x) max_x = aX[ipoint]; ipoint ++; count ++; } // got one polyline : a_mx_point[npoly] = count; npoly ++; if(ky==31) break; } aN = npoly; a_width = max_x; } static void rescale(int aIchr,int& aIy0,int& aDky){ int iw,ibit,idif,kx,ky,kymin,kymax; iw = hs(aIchr-1) - 1; kymin = 100; kymax = -100; ibit = 1; idif = 1; while(1) { while(1) { ibit += 6; idif *= 64; if(ibit>=H_NBITMX) { ibit = 1; idif = 1; iw ++; } kx = ((hx(iw)/idif) % 64 ) - 32; ky = ((hy(iw)/idif) % 64 ) - 32; if(kx==31) break; if(ky>kymax) kymax = ky; if(ky