JVM_SOFTFP_LINKAGE jlong jvm_doubleToLongBits(jdouble x) { jlong bits = double_bits(x); if ((bits & JVM_LL(0x7FFFFFFFFFFFFFFF)) >= JVM_LL(0x43E0000000000000)) { if ((bits >= D_L_POS_NAN && bits <= D_H_POS_NAN) || (bits >= D_L_NEG_NAN && bits <= D_H_NEG_NAN)) { bits = D_JUST_NAN; } } return bits; }
// ----------------------------------------------------------------------------- // Outputs a character on the display, using the given font and style // uint8_t lcd_put_char(FONT_P font, uint8_t style, char character) { int8_t i; uint8_t row = 0; // current row of char uint8_t hc = (style & DOUBLE_HEIGHT) ? 1 : 0; // height change uint8_t wc = (style & DOUBLE_WIDTH) ? 1 : 0; // width change uint8_t ul = (style & UNDERLINE) ? 0x80 : 0x00; // underline uint8_t inv = (style & INVERT) ? 0xFF : 0; // inverted uint8_t tmp; // load information about character uint8_t char_width = font_get_char_width(font, character); uint8_t font_height = font_get_height_bytes(font); uint8_t free_space = font_get_add_space(font, character); PGM_P tableposition = font_get_char_position(font, character); // final size of character uint8_t char_final_width = (uint8_t)(char_width + free_space) << wc; uint8_t char_final_height = (uint8_t)font_height << hc; // check for avail. space on display if ((style & WRAP) && (LCD_CURRENT_COL() + char_final_width > LCD_WIDTH)) { LCD_MOVE_TO(LCD_CURRENT_PAGE() + char_final_height, 0); if (character == ' ') { return 0; } } // write chracter do { for (i = (row >> hc); i < char_width / font_height; i += font_height) { tmp = pgm_read_byte(tableposition + i); if (row == char_final_height - 1) { tmp |= ul; } if (hc) { tmp = double_bits((row & 1), tmp); } if (inv) { tmp = ~tmp; } LCD_WRITE(tmp); if (wc) { LCD_WRITE(tmp); } } if (free_space) { uint8_t c = inv; if (row == char_final_height - 1) { c ^= ul; if (hc) { c ^= ul >> 1; } } LCD_WRITE(c); if (wc) { LCD_WRITE(c); } } LCD_MOVE(1, -char_final_width); } while (++row < char_final_height);