//takes the character BEFORE being offset into current font void get_char_width(unsigned int c,unsigned int c2,int *width,int *spacing) { unsigned int letter; letter = c-FMINCHAR; if (!INFONT(letter)) { //not in font, draw as space *width=0; if (FFLAGS & FT_PROPORTIONAL) *spacing = FWIDTH/2; else *spacing = FWIDTH; return; } if (FFLAGS & FT_PROPORTIONAL) *width = FWIDTHS[letter]; else *width = FWIDTH; *spacing = *width; if (FFLAGS & FT_KERNED) { ubyte *p; if (!(c2==0 || c2=='\n')) { int letter2; letter2 = c2-FMINCHAR; if (INFONT(letter2)) { p = find_kern_entry(FONT,letter,letter2); if (p) *spacing = p[2]; } } } }
int gr_internal_string2(int x, int y, unsigned char *s ) { unsigned char * fp; unsigned char * text_ptr, * next_row, * text_ptr1; int r, BitMask, i, bits, width, spacing, letter, underline; int page_switched; unsigned int VideoOffset, VideoOffset1; VideoOffset1 = (unsigned long)DATA + y * ROWSIZE + x; gr_vesa_setpage(VideoOffset1 >> 16); VideoOffset1 &= 0xFFFF; next_row = s; while (next_row != NULL ) { text_ptr1 = next_row; next_row = NULL; if (x==0x8000) { //centered int xx = get_centered_x(text_ptr1); VideoOffset1 = y * ROWSIZE + xx; gr_vesa_setpage(VideoOffset1 >> 16); VideoOffset1 &= 0xFFFF; } for (r=0; r<FHEIGHT; r++) { text_ptr = text_ptr1; VideoOffset = VideoOffset1; page_switched = 0; while (*text_ptr) { if (*text_ptr == '\n' ) { next_row = &text_ptr[1]; break; } underline = 0; if (*text_ptr == '&' ) { if ((r==FBASELINE+2) || (r==FBASELINE+3)) underline = 1; text_ptr++; } get_char_width(text_ptr[0],text_ptr[1],&width,&spacing); Assert(width==spacing); //no kerning support here letter = *text_ptr-FMINCHAR; if (!INFONT(letter)) { //not in font, draw as space VideoOffset += spacing; text_ptr++; continue; } if (FFLAGS & FT_PROPORTIONAL) fp = FCHARS[letter]; else fp = FDATA + letter * BITS_TO_BYTES(width)*FHEIGHT; if (underline) { if ( VideoOffset+width > 0xFFFF ) { for (i=0; i< width; i++ ) { gr_video_memory[VideoOffset++] = FG_COLOR; if (VideoOffset > 0xFFFF ) { VideoOffset -= 0xFFFF + 1; page_switched = 1; gr_vesa_incpage(); } } } else { for (i=0; i< width; i++ ) gr_video_memory[VideoOffset++] = FG_COLOR; } } else { // fp -- dword // VideoOffset // width fp += BITS_TO_BYTES(width)*r; BitMask = 0; if ( VideoOffset+width > 0xFFFF ) { for (i=0; i< width; i++ ) { if (BitMask==0) { bits = *fp++; BitMask = 0x80; } if (bits & BitMask) gr_video_memory[VideoOffset++] = FG_COLOR; else gr_video_memory[VideoOffset++] = BG_COLOR; BitMask >>= 1; if (VideoOffset > 0xFFFF ) { VideoOffset -= 0xFFFF + 1; page_switched = 1; gr_vesa_incpage(); } } } else { if (width == 8 ) { bits = *fp++; if (bits & 0x80) gr_video_memory[VideoOffset+0] = FG_COLOR; else gr_video_memory[VideoOffset+0] = BG_COLOR; if (bits & 0x40) gr_video_memory[VideoOffset+1] = FG_COLOR; else gr_video_memory[VideoOffset+1] = BG_COLOR; if (bits & 0x20) gr_video_memory[VideoOffset+2] = FG_COLOR; else gr_video_memory[VideoOffset+2] = BG_COLOR; if (bits & 0x10) gr_video_memory[VideoOffset+3] = FG_COLOR; else gr_video_memory[VideoOffset+3] = BG_COLOR; if (bits & 0x08) gr_video_memory[VideoOffset+4] = FG_COLOR; else gr_video_memory[VideoOffset+4] = BG_COLOR; if (bits & 0x04) gr_video_memory[VideoOffset+5] = FG_COLOR; else gr_video_memory[VideoOffset+5] = BG_COLOR; if (bits & 0x02) gr_video_memory[VideoOffset+6] = FG_COLOR; else gr_video_memory[VideoOffset+6] = BG_COLOR; if (bits & 0x01) gr_video_memory[VideoOffset+7] = FG_COLOR; else gr_video_memory[VideoOffset+7] = BG_COLOR; VideoOffset += 8; } else { for (i=0; i< width/2 ; i++ ) { if (BitMask==0) { bits = *fp++; BitMask = 0x80; } if (bits & BitMask) gr_video_memory[VideoOffset++] = FG_COLOR; else gr_video_memory[VideoOffset++] = BG_COLOR; BitMask >>= 1; // Unroll twice if (BitMask==0) { bits = *fp++; BitMask = 0x80; } if (bits & BitMask) gr_video_memory[VideoOffset++] = FG_COLOR; else gr_video_memory[VideoOffset++] = BG_COLOR; BitMask >>= 1; } } } } text_ptr++; } VideoOffset1 += ROWSIZE; y++; if (VideoOffset1 > 0xFFFF ) { VideoOffset1 -= 0xFFFF + 1; if (!page_switched) gr_vesa_incpage(); } }
int gr_internal_string0m(int x, int y, unsigned char *s ) { unsigned char * fp; unsigned char * text_ptr, * next_row, * text_ptr1; int r, BitMask, i, bits, width, spacing, letter, underline; unsigned int VideoOffset, VideoOffset1; VideoOffset1 = y * ROWSIZE + x; next_row = s; while (next_row != NULL ) { text_ptr1 = next_row; next_row = NULL; if (x==0x8000) { //centered int xx = get_centered_x(text_ptr1); VideoOffset1 = y * ROWSIZE + xx; } for (r=0; r<FHEIGHT; r++) { text_ptr = text_ptr1; VideoOffset = VideoOffset1; while (*text_ptr) { if (*text_ptr == '\n' ) { next_row = &text_ptr[1]; break; } underline = 0; if (*text_ptr == '&' ) { if ((r==FBASELINE+2) || (r==FBASELINE+3)) underline = 1; text_ptr++; } get_char_width(text_ptr[0],text_ptr[1],&width,&spacing); letter = *text_ptr-FMINCHAR; if (!INFONT(letter)) { //not in font, draw as space VideoOffset += spacing; text_ptr++; continue; } if (FFLAGS & FT_PROPORTIONAL) fp = FCHARS[letter]; else fp = FDATA + letter * BITS_TO_BYTES(width)*FHEIGHT; if (underline) for (i=0; i< width; i++ ) DATA[VideoOffset++] = FG_COLOR; else { fp += BITS_TO_BYTES(width)*r; BitMask = 0; for (i=0; i< width; i++ ) { if (BitMask==0) { bits = *fp++; BitMask = 0x80; } if (bits & BitMask) DATA[VideoOffset++] = FG_COLOR; else VideoOffset++; BitMask >>= 1; } } text_ptr++; VideoOffset += spacing-width; } VideoOffset1 += ROWSIZE; y++; } } return 0; }
int GrInternalString0m (int x, int y, const char *s) { unsigned char * fp; const char * textP, * nextRowP, * text_ptr1; int r, BitMask, i, bits, width, spacing, letter, underline; int skip_lines = 0; char c; int orig_color; unsigned int VideoOffset, VideoOffset1; if (FG_COLOR.rgb) { FG_COLOR.rgb = 0; FG_COLOR.index = GrFindClosestColor (FONT->ftParentBitmap.bmPalette, FG_COLOR.color.red, FG_COLOR.color.green, FG_COLOR.color.blue); } if (BG_COLOR.rgb) { BG_COLOR.rgb = 0; BG_COLOR.index = GrFindClosestColor (FONT->ftParentBitmap.bmPalette, BG_COLOR.color.red, BG_COLOR.color.green, BG_COLOR.color.blue); } orig_color = FG_COLOR.index;//to allow easy reseting to default string color with colored strings -MPM bits=0; VideoOffset1 = y * ROWSIZE + x; nextRowP = s; FG_COLOR.rgb = 0; while (nextRowP != NULL) { text_ptr1 = nextRowP; nextRowP = NULL; if (x==0x8000) { //centered int xx = GetCenteredX (text_ptr1); VideoOffset1 = y * ROWSIZE + xx; } for (r=0; r<FHEIGHT; r++) { textP = text_ptr1; VideoOffset = VideoOffset1; while ((c = *textP)) { if (c == '\n') { nextRowP = &textP[1]; break; } if (c == CC_COLOR) { FG_COLOR.index = * (++textP); textP++; continue; } if (c == CC_LSPACING) { skip_lines = * (++textP) - '0'; textP++; continue; } underline = 0; if (c == CC_UNDERLINE) { if ((r==FBASELINE+2) || (r==FBASELINE+3)) underline = 1; c = * (++textP); } GetCharWidth (c, textP[1], &width, &spacing); letter = c - FMINCHAR; if (!INFONT (letter) || c <= 0x06) { //not in font, draw as space #if 0 CHECK_EMBEDDED_COLORS () #else if ((c >= 1) && (c <= 3)) { if (*++textP) { if (grMsgColorLevel >= c) { FG_COLOR.rgb = 1; FG_COLOR.color.red = textP [0] - 128; FG_COLOR.color.green = textP [1] - 128; FG_COLOR.color.blue = textP [2] - 128; FG_COLOR.color.alpha = 0; } textP += 3; } } else if ((c >= 4) && (c <= 6)) { if (grMsgColorLevel >= *textP - 3) { FG_COLOR.index = orig_color; FG_COLOR.rgb = 0; } textP++; } #endif else { VideoOffset += spacing; textP++; } continue; } if (FFLAGS & FT_PROPORTIONAL) fp = FCHARS[letter]; else fp = FDATA + letter * BITS_TO_BYTES (width) * FHEIGHT; if (underline) for (i=0; i< width; i++) DATA[VideoOffset++] = (unsigned int) FG_COLOR.index; else { fp += BITS_TO_BYTES (width)*r; BitMask = 0; for (i=0; i< width; i++) { if (BitMask==0) { bits = *fp++; BitMask = 0x80; } if (bits & BitMask) DATA[VideoOffset++] = (unsigned int) FG_COLOR.index; else VideoOffset++; BitMask >>= 1; } } textP++; VideoOffset += spacing-width; } VideoOffset1 += ROWSIZE; y++; } y += skip_lines; VideoOffset1 += ROWSIZE * skip_lines; skip_lines = 0; }
int GrInternalString0 (int x, int y, const char *s) { unsigned char * fp; const char *textP, *nextRowP, *text_ptr1; int r, BitMask, i, bits, width, spacing, letter, underline; int skip_lines = 0; unsigned int VideoOffset, VideoOffset1; ubyte *palette = grdCurCanv->cvBitmap.bmPalette; if (!palette) palette = gamePalette; if (FG_COLOR.rgb) { FG_COLOR.rgb = 0; FG_COLOR.index = GrFindClosestColor (gamePalette, FG_COLOR.color.red, FG_COLOR.color.green, FG_COLOR.color.blue); } if (BG_COLOR.rgb) { BG_COLOR.rgb = 0; BG_COLOR.index = GrFindClosestColor (gamePalette, BG_COLOR.color.red, BG_COLOR.color.green, BG_COLOR.color.blue); } bits=0; VideoOffset1 = y * ROWSIZE + x; nextRowP = s; while (nextRowP != NULL) { text_ptr1 = nextRowP; nextRowP = NULL; if (x == 0x8000) { //centered int xx = GetCenteredX (text_ptr1); VideoOffset1 = y * ROWSIZE + xx; } for (r = 0; r < FHEIGHT; r++) { textP = text_ptr1; VideoOffset = VideoOffset1; while (*textP) { if (*textP == '\n') { nextRowP = &textP[1]; break; } if (*textP == CC_COLOR) { FG_COLOR.index = *(textP+1); FG_COLOR.rgb = 0; textP += 2; continue; } if (*textP == CC_LSPACING) { skip_lines = * (textP+1) - '0'; textP += 2; continue; } underline = 0; if (*textP == CC_UNDERLINE) { if ((r == FBASELINE + 2) || (r == FBASELINE + 3)) underline = 1; textP++; } GetCharWidth (textP[0], textP[1], &width, &spacing); letter = *textP - FMINCHAR; if (!INFONT (letter)) { //not in font, draw as space VideoOffset += spacing; textP++; continue; } if (FFLAGS & FT_PROPORTIONAL) fp = FCHARS [letter]; else fp = FDATA + letter * BITS_TO_BYTES (width)*FHEIGHT; if (underline) for (i = 0; i < width; i++) DATA[VideoOffset++] = (unsigned char) FG_COLOR.index; else { fp += BITS_TO_BYTES (width)*r; BitMask = 0; for (i = 0; i < width; i++) { if (BitMask == 0) { bits = *fp++; BitMask = 0x80; } if (bits & BitMask) DATA[VideoOffset++] = (unsigned char) FG_COLOR.index; else DATA[VideoOffset++] = (unsigned char) BG_COLOR.index; BitMask >>= 1; } } VideoOffset += spacing-width; //for kerning textP++; } VideoOffset1 += ROWSIZE; y++; } y += skip_lines; VideoOffset1 += ROWSIZE * skip_lines; skip_lines = 0; } return 0; }