uint32 Text::lowTextManager(uint8 *ascii, int32 width, uint8 pen) { _textCount++; if (_textCount > MAX_TEXT_OBS) error("Text::lowTextManager: MAX_TEXT_OBS exceeded"); uint32 textObjId = (TEXT_sect * ITM_PER_SEC) - 1; do { textObjId++; } while (_objMan->fetchObject(textObjId)->o_status); // okay, found a free text object _objMan->fetchObject(textObjId)->o_status = STAT_FORE; makeTextSprite((uint8)textObjId, ascii, (uint16)width, pen); return textObjId; }
uint32 FontRenderer::buildNewBloc(byte *ascii, int16 x, int16 y, uint16 width, uint8 pen, uint32 type, uint32 fontRes, uint8 justification) { uint32 i = 0; while (i < MAX_text_blocs && _blocList[i].text_mem) i++; assert(i < MAX_text_blocs); // Create and position the sprite _blocList[i].text_mem = makeTextSprite(ascii, width, pen, fontRes); // 'NO_JUSTIFICATION' means print sprite with top-left at (x,y) // without margin checking - used for debug text if (justification != NO_JUSTIFICATION) { FrameHeader frame_head; frame_head.read(_blocList[i].text_mem); switch (justification) { case POSITION_AT_CENTER_OF_BASE: // This one is always used for SPEECH TEXT; possibly // also for pointer text x -= (frame_head.width / 2); y -= frame_head.height; break; case POSITION_AT_CENTER_OF_TOP: x -= (frame_head.width / 2); break; case POSITION_AT_LEFT_OF_TOP: // The given coords are already correct for this! break; case POSITION_AT_RIGHT_OF_TOP: x -= frame_head.width; break; case POSITION_AT_LEFT_OF_BASE: y -= frame_head.height; break; case POSITION_AT_RIGHT_OF_BASE: x -= frame_head.width; y -= frame_head.height; break; case POSITION_AT_LEFT_OF_CENTER: y -= (frame_head.height / 2); break; case POSITION_AT_RIGHT_OF_CENTER: x -= frame_head.width; y -= (frame_head.height) / 2; break; } // Ensure text sprite is a few pixels inside the visible screen // remember - it's RDSPR_DISPLAYALIGN uint16 text_left_margin = TEXT_MARGIN; uint16 text_right_margin = 640 - TEXT_MARGIN - frame_head.width; uint16 text_top_margin = TEXT_MARGIN; uint16 text_bottom_margin = 400 - TEXT_MARGIN - frame_head.height; // Move if too far left or too far right if (x < text_left_margin) x = text_left_margin; else if (x > text_right_margin) x = text_right_margin; // Move if too high or too low if (y < text_top_margin) y = text_top_margin; else if (y > text_bottom_margin) y = text_bottom_margin; } // The sprite is always uncompressed _blocList[i].type = type | RDSPR_NOCOMPRESSION; _blocList[i].x = x; _blocList[i].y = y; return i + 1; }