Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. /*
  3.  * Beat_lib.h
  4.  * Author: JohnXenox aka Aleksandr Igorevich.
  5.  */
  6.  
  7. #ifndef __Beat_lib_h__
  8. #define __Beat_lib_h__
  9.  
  10.  
  11. void __attribute__ ((noinline)) printfOnADebugBoard(const char *format,...)
  12. {
  13.     va_list ap;
  14.     char log_board[300];
  15.  
  16.     va_start (ap, format);
  17.     tiny_vsnprintf(log_board, sizeof log_board, format, ap);
  18.     va_end(ap);
  19.  
  20.     char *str = log_board;
  21.  
  22.     while(*str) __asm__ __volatile__("int $0x40"::"a"(63), "b"(1), "c"(*str++));
  23. }
  24.  
  25.  
  26. /*
  27. int start_new_thread(void* proc, unsigned int* stack_top)
  28. {
  29.     register int val;
  30.     __asm__ __volatile__("int $0x40":"=a"(val):"a"(51), "b"(1), "c"(proc), "d"(stack_top));
  31.     return val;
  32. }
  33. */
  34.  
  35.  
  36. static inline int startApp(char *args, unsigned int enc, char  *path)
  37. {
  38.     int val;
  39.  
  40.     char dt[28];  // basic information structure.
  41.  
  42.     (int  ) dt[0]  = 7;       // subfunction number.
  43.     (int  ) dt[4]  = 0;       // flags field.
  44.     (char*) dt[8]  = args;    // 0 or pointer to ASCIIZ-string with parameters.
  45.     (int  ) dt[12] = 0;       // (reserved).
  46.     (int  ) dt[16] = 0;       // (reserved).
  47.     (int  ) dt[20] = 1;       // string encoding (0 = default, 1 = cp866, 2 = UTF-16LE, 3 = UTF-8).
  48.     (char*) dt[24] = path;    // pointer to the path to the file.
  49.  
  50.     __asm__ __volatile__("int $0x40":"=a"(val):"a"(80), "b"(&dt));
  51.  
  52.     return val;
  53. }
  54.  
  55.  
  56.  
  57. static inline void makeDelay(unsigned int time)
  58. {
  59.     __asm__ __volatile__("int $0x40"::"a"(5), "b"(time):"memory");
  60. }
  61.  
  62.  
  63.  
  64. static inline void getSystemColors(struct system_colors *color_table)
  65. {
  66.   __asm__ volatile ("int $0x40"::"a"(48),"b"(3),"c"(color_table),"d"(40));
  67. }
  68.  
  69.  
  70.  
  71. static inline short getControlKeysOnAKeyboard(void)
  72. {
  73.     short val;
  74.     __asm__ __volatile__("int $0x40":"=a"(val):"a"(66),"b"(3));
  75.     return val;
  76. }
  77.  
  78.  
  79. static inline void showButton(int x, int y, int w, int h, unsigned int style, unsigned int id, unsigned int clr)
  80. {
  81.     w-=1;
  82.     h-=1;
  83.     __asm__ __volatile__("int $0x40"::"a"(8),"b"((x << 16) | w),"c"((y << 16) | h),"d"((style << 24) | id),"S"(clr));
  84. }
  85.  
  86.  
  87.  
  88. static inline void deleteButton(unsigned int id)
  89. {
  90.     __asm__ __volatile__("int $0x40"::"a"(8),"d"(0x80000000 | id));
  91. }
  92.  
  93.  
  94.  
  95. static inline void showNumber(int x, int y, unsigned int opt1, unsigned char opt2, unsigned int clr, unsigned int number)
  96. {
  97.     __asm__ __volatile__("int $0x40"::"a"(47),"b"(opt1),"c"(number),"d"((x << 16) | y),"S"(clr | ((int) opt2 << 24)));
  98. }
  99.  
  100.  
  101.  
  102. /*
  103. static inline void killThreadByTID(int tid)
  104. {
  105.     __asm__ __volatile__("int $0x40"::"a"(18), "b"(18), "c"(tid));
  106. }
  107. */
  108.  
  109.  
  110. static inline void showLine(int xs, int ys, int xe, int ye, unsigned int clr)
  111. {
  112.     __asm__ __volatile__("int $0x40"::"a"(38), "d"(clr),"b"((xs << 16) | xe),"c"((ys << 16) | ye));
  113. }
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125. // ============================================================================ //
  126.  
  127. void showRectangle(int x, int y, int w, int h, unsigned int clr)
  128. {
  129.     // top h line.
  130.     showLine(x + 1, y, w + x - 2, y, clr);
  131.     // bottom h line.
  132.     showLine(x + 1, y + h - 1, w + x - 2, y + h - 1, clr);
  133.  
  134.     // left v line.
  135.     showLine(x, y + 1, x, h + y - 2, clr);
  136.     // right v line.
  137.     showLine(x + w - 1, y + 1, x + w - 1, h + y - 2, clr);
  138. }
  139.  
  140.  
  141.  
  142. static inline void setCurrentPathToARawFile(char *dst_path, char *src_path, char* file_name)
  143. {
  144.     unsigned offset = 0;
  145.  
  146.     // cleans a dst path if not clean.
  147.     if(dst_path[offset] != 0)
  148.     {
  149.         for(; dst_path[offset] != 0; offset++) dst_path[offset] = 0;
  150.     }
  151.  
  152.     // copys current path into a buffer.
  153.     strcpy(dst_path, src_path);
  154.  
  155.     offset = 0;
  156.  
  157.     // goes to the end of a string.
  158.     while(dst_path[offset] != 0) offset++;
  159.  
  160.     // clears all bytes to a character '/'.
  161.     for(; dst_path[offset] != '/'; offset--) dst_path[offset] = 0;
  162.  
  163.     // increments a variable.
  164.     offset++;
  165.  
  166.     // stores a name of a file in a buffer.
  167.     strcpy(dst_path + offset, file_name);
  168. }
  169.  
  170.  
  171.  
  172. static inline void showNamedButton(int x, int y, int w, int h, int style, int id, int clr, \
  173.                                    char font_style, int tx, int ty, unsigned int text_clr, \
  174.                                    unsigned int text_len, char* text)
  175. {
  176. //    w--;
  177. //    h--;
  178.  
  179.     char chr_w = 8;
  180.     char chr_h = 16;
  181.  
  182.     deleteButton(id);
  183.     _ksys_make_button(x, y, (w - 1), (h - 1), (style | id), clr);
  184.     _ksys_write_text((x + ((w / 2) - ((chr_w * text_len) / 2))), (y + 1 + ((h / 2) - (chr_h / 2))), \
  185.                     (((int)font_style << 24) | text_clr), text, text_len);
  186.  
  187. }
  188.  
  189.  
  190. static inline void StartButton(int x, int y, int w, int h, unsigned int clr, unsigned int text_clr, unsigned char state)
  191. {
  192.     #define BTN_ID 7
  193.  
  194. #if defined (lang_en)
  195.     char* btn_name[] = {"Start", "Stop"};
  196. #elif defined (lang_ru)
  197.     char* btn_name[] = {"‘â àâ", "‘⮯"};
  198. #endif
  199.  
  200.     showNamedButton(x, y, w, h, 0, BTN_ID, clr, 0b00010000, 2, 2, text_clr, strlen(btn_name[state]), btn_name[state]);
  201.  
  202.     if(state == 1) counter = 0;
  203.  
  204.     #undef BTN_ID
  205. }
  206.  
  207.  
  208.  
  209. static inline void showPlusButton(int x, int y, int w, int h, unsigned int id, unsigned int clr, unsigned int text_clr)
  210. {
  211.     showNamedButton(x, y, w, h, 0, id, clr, 0b00010000, 2, 2, text_clr, 1, "+");
  212. }
  213.  
  214.  
  215.  
  216. static inline void showMinusButton(int x, int y, int w, int h, unsigned int id, unsigned int clr, unsigned int text_clr)
  217. {
  218.     showNamedButton(x, y, w, h, 0, id, clr, 0b00010000, 2, 2, text_clr, 1, "-");
  219. }
  220.  
  221. //===================================================================================//
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231. void counterIndicator(int x, int y, int w, int h, unsigned int clr1, unsigned int clr2, unsigned char flag)
  232. {
  233.     #define BTN_ID 200
  234.  
  235.     unsigned int _clr1;
  236.     unsigned int _clr2;
  237.  
  238.     char chr_w = 8 * 3;
  239.     char chr_h = 16 * 3;
  240.  
  241.     unsigned char text_len = 1;
  242.  
  243.     deleteButton(BTN_ID);
  244.     _ksys_make_button(x, y, w - 1, h - 1, (0x40000000 | BTN_ID), clr1);
  245.  
  246.  
  247.     if(flag == 0)
  248.     {
  249.         _clr1 = clr1;
  250.         _clr2 = clr2;
  251.     }
  252.     if(flag != 0)
  253.     {
  254.         _clr1 = clr2;
  255.         _clr2 = clr1;
  256.     }
  257.  
  258.     showRectangle(x, y, w, h, _clr2);
  259.     _ksys_draw_bar((x + 1), (y + 1), (w - 2), (h - 2), _clr1);
  260.  
  261.     if(counter > 9) text_len = 2;
  262.  
  263.     showNumber((x + ((w / 2) - ((chr_w * text_len) / 2))), ((y + ((h / 2) - (chr_h / 2))) - 4), 0b10000000000000110000000000000000, 0b00010011, _clr2, counter);
  264.  
  265.     #undef BTN_ID
  266. }
  267.  
  268.  
  269.  
  270.  
  271.  
  272. void meterIndicator(int x, int y, int w, int h, unsigned int clr1, unsigned int clr2, unsigned char meter, unsigned char *accentBeatFlags)
  273. {
  274.     #define SPACE 2
  275.  
  276.     #define BTN_ID 100
  277.  
  278.     char chr_w = 8;
  279.     char chr_h = 16;
  280.  
  281.     int text_len = 1;
  282.  
  283.     unsigned int btn_clr = 0;
  284.     unsigned int num_clr = 0;
  285.  
  286.     _ksys_draw_bar(10, y, w + 5, h, sc.work);
  287.  
  288.     // deletes all possible buttons.
  289.     for(unsigned short i = 0; (i < 12); i++)
  290.     {
  291.         deleteButton(BTN_ID + i);
  292.     }
  293.  
  294.  
  295.     unsigned char num_of_spaces = 0;
  296.     unsigned short spaces_sz = 0;
  297.  
  298.     unsigned int btn_x = x;
  299.     unsigned int btn_w = w;
  300.  
  301.  
  302.  
  303. //===========================================//
  304.  
  305.     char spc = 0;
  306.  
  307.     if(meter > 1)
  308.     {
  309.         spc = 1;
  310.         num_of_spaces = (meter - 1);
  311.         spaces_sz = (num_of_spaces * SPACE);
  312.     }
  313.  
  314.     btn_w = ((btn_w / meter) - spc);
  315.  
  316. //===========================================//
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.     // draws button(s).
  326.     for(unsigned short i = 0; (i < meter); i++)
  327.     {
  328.         if((i + 1) > 9) text_len = 2;
  329.  
  330.         if(accentBeatFlags[i] == 0)
  331.         {
  332.             btn_clr = clr1;
  333.             num_clr = clr2;
  334.         }
  335.         else
  336.         {
  337.             btn_clr = clr2;
  338.             num_clr = clr1;
  339.         }
  340.  
  341.         showButton(btn_x, y, btn_w, h, 0, (BTN_ID + i), btn_clr);
  342.         //_ksys_make_button(btn_x, y, (btn_w - 1), (h - 1), (0 | (BTN_ID + i)), btn_clr);
  343.          showNumber(((btn_x + ((btn_w / 2) - ((chr_w * text_len) / 2)))), (y + 2 + ((h / 2) - (chr_h / 2))), 0b10000000000000110000000000000000, 0b00010000, num_clr, (i + 1));
  344.  
  345.         btn_x += (btn_w + SPACE);
  346.     }
  347.  
  348.     #undef SPACE
  349.     #undef BTN_ID
  350. }
  351.  
  352.  
  353.  
  354. void tempoBar1(int x, int y, int w, int h, unsigned int clr1, unsigned int clr2, unsigned int clr3, unsigned char sel)
  355. {
  356.     #define BTN_ID_MINUS 10
  357.     #define BTN_ID_PLUS 11
  358.  
  359.     char chr_w = 8;
  360.     char chr_h = 16;
  361.  
  362.     char* text = 0;
  363.     int text_len = 0;
  364.  
  365.     char* tempoIt[] = {"Larghissimo", "Grave", "Lento", "Larghetto", "Adagio", "Andante", \
  366.                        "Moderato", "Allegro", "Presto", "Prestissimo"};
  367.  
  368.     _ksys_draw_bar((x + 1), y, (w - 2), h, clr1);
  369.  
  370.     text = tempoIt[sel];
  371.     text_len = strlen(tempoIt[sel]);
  372.  
  373.     _ksys_write_text((x + ((w / 2) - ((chr_w * text_len) / 2))), (y + 0 + ((h / 2) - (chr_h / 2))), (((int)0b00010000 << 24) | clr2), text, text_len);
  374.  
  375.     showMinusButton(x, y, h, h, BTN_ID_MINUS, clr3, clr2);
  376.     showPlusButton(((x + w) - h), y, h, h, BTN_ID_PLUS, clr3, clr2);
  377.  
  378.     #undef BTN_ID_MINUS
  379.     #undef BTN_ID_PLUS
  380. }
  381.  
  382.  
  383.  
  384. void tempoBar2(int x, int y, int w, int h, unsigned int clr1, unsigned int clr2, unsigned int clr3, unsigned short tempo)
  385. {
  386.     #define BTN_ID_MINUS 12
  387.     #define BTN_ID_PLUS 13
  388.  
  389.     char chr_w = 8;
  390.     char chr_h = 16;
  391.  
  392.     int text_len = 0;
  393.  
  394.     if(tempo < 10)
  395.     {
  396.         text_len = 1;
  397.     }
  398.     else if((tempo > 9) && (tempo < 100))
  399.     {
  400.         text_len = 2;
  401.     }
  402.     else if((tempo > 99) && (tempo < 321))
  403.     {
  404.         text_len = 3;
  405.     }
  406.  
  407.     _ksys_draw_bar((x + 1), y, (w - 2), h, clr1);
  408.  
  409.     showNumber((x + ((w / 2) - ((chr_w * text_len) / 2))), (y + ((h / 2) - (chr_h / 2))), 0b10000000000000110000000000000000, 0b00010000, clr2, tempo);
  410.  
  411.     showMinusButton(x, y, h, h, BTN_ID_MINUS, clr3, clr2);
  412.     showPlusButton(((x + w) - h), y, h, h, BTN_ID_PLUS, clr3, clr2);
  413.  
  414.     #undef BTN_ID_MINUS
  415.     #undef BTN_ID_PLUS
  416. }
  417.  
  418.  
  419.  
  420. void meterBar(int x, int y, int w, int h, unsigned int clr1, unsigned int clr2, unsigned int clr3, unsigned char meter, unsigned int divider)
  421. {
  422.     #define BTN_ID_MINUS 14
  423.     #define BTN_ID_PLUS 15
  424.  
  425.     char chr_w = 8;
  426.     char chr_h = 16;
  427.  
  428.     int text_len = 3;
  429.  
  430.     if(meter > 9) text_len = 4;
  431.  
  432.     _ksys_draw_bar((x + 1), y, (w - 2), h, clr1);
  433.  
  434.     unsigned int num_x = ((x + ((w / 2) - ((chr_w * text_len) / 2))));
  435.     unsigned int num_y = (y + ((h / 2) - (chr_h / 2)));
  436.  
  437.     showNumber(num_x, num_y, 0b10000000000000110000000000000000, 0b00010000, clr2, meter);
  438.     _ksys_write_text((num_x + (chr_w * (text_len - 2))), num_y, (((int)0b00010000 << 24) | clr2), "/", 1);
  439.     showNumber((num_x + (chr_w * (text_len - 1))), num_y, 0b10000000000000110000000000000000, 0b00010000, clr2, 4);
  440.  
  441.     showMinusButton(x, y, h, h, BTN_ID_MINUS, clr3, clr2);
  442.     showPlusButton(((x + w) - h), y, h, h, BTN_ID_PLUS, clr3, clr2);
  443.  
  444.     #undef BTN_ID_MINUS
  445.     #undef BTN_ID_PLUS
  446. }
  447.  
  448.  
  449.  
  450. //===================================================================//
  451.  
  452. void showCounterIndicator()
  453. {
  454.     counterIndicator(10, (skin_height + 5), 310, 60, sc.work_button, sc.work_button_text, counterIndicatorFlag);
  455. }
  456.  
  457.  
  458.  
  459. void showMeterIndicator()
  460. {
  461.     meterIndicator(10, (skin_height + 70), 310, 21, sc.work_button, sc.work_button_text, meter, accentBeatFlags);
  462. }
  463.  
  464.  
  465.  
  466.  
  467.  
  468. void showTempoBar1(char tempoSelector)
  469. {
  470.     tempoBar1(10, (skin_height + 96), 140, 20, sc.work_graph, sc.work_button_text, sc.work_button, tempoSelector);
  471. }
  472.  
  473.  
  474.  
  475. void showTempoBar2(short tempo)
  476. {
  477.     tempoBar2((10 + 145), (skin_height + 96), 76, 20, sc.work_graph, sc.work_button_text, sc.work_button, tempo);
  478. }
  479.  
  480.  
  481.  
  482. void showMeterBar(char meter)
  483. {
  484.     meterBar((10 + 140 + 5 + 76 + 5), (skin_height + 96), 84, 20, sc.work_graph, sc.work_button_text, sc.work_button, meter, 4);
  485. }
  486.  
  487.  
  488.  
  489. void showStartButton(void)
  490. {
  491.     StartButton(10, (skin_height + 121), 310, 25, sc.work_button, sc.work_button_text, startButtonBit);
  492. }
  493.  
  494. //================================================================================//
  495.  
  496.  
  497.  
  498.  
  499.  
  500.  
  501.  
  502.  
  503. void setTempoByTempoSelector(unsigned short *tempo, unsigned char tempoSelector)
  504. {
  505.     enum tempoSelectors
  506.     {
  507.         LARGHISSIMO = 0,
  508.         GRAVE,
  509.         LENTO,
  510.         LARGHETTO,
  511.         ADAGIO,
  512.         ANDANTE,
  513.         MODERATO,
  514.         ALLEGRO,
  515.         PRESTO,
  516.         PRESTISSIMO
  517.     };
  518.  
  519.     // switches tempo (beats per minet).
  520.     switch(tempoSelector)
  521.     {
  522.         case LARGHISSIMO: *tempo = 20;  // 1 - 25 bpm.
  523.         break;
  524.  
  525.         case GRAVE: *tempo = (46 - ((46 - 25) / 2));  // 25 - 46 bpm.  calculates an average value.
  526.         break;
  527.  
  528.         case LENTO: *tempo = (61 - ((61 - 46) / 2));  // 46 - 61 bpm
  529.         break;
  530.  
  531.         case LARGHETTO: *tempo = (67 - ((67 - 61) / 2));
  532.         break;
  533.  
  534.         case ADAGIO: *tempo = (77 - ((77 - 67) / 2));
  535.         break;
  536.  
  537.         case ANDANTE: *tempo = (109 - ((109 - 77) / 2));
  538.         break;
  539.  
  540.         case MODERATO: *tempo = (121 - ((121 - 109) / 2));
  541.         break;
  542.  
  543.         case ALLEGRO: *tempo = (169 - ((169 - 121) / 2));
  544.         break;
  545.  
  546.         case PRESTO: *tempo = (201 - ((201 - 169) / 2));
  547.         break;
  548.  
  549.         case PRESTISSIMO: *tempo = (320 - ((320 - 201) / 2));
  550.         break;
  551.     }
  552. }
  553.  
  554.  
  555.  
  556.  
  557.  
  558. void setTempoSelectorByTempo(unsigned short *tempo, unsigned char *tempoSelector)
  559. {
  560.     enum tempoSelectors
  561.     {
  562.         LARGHISSIMO = 0,
  563.         GRAVE,
  564.         LENTO,
  565.         LARGHETTO,
  566.         ADAGIO,
  567.         ANDANTE,
  568.         MODERATO,
  569.         ALLEGRO,
  570.         PRESTO,
  571.         PRESTISSIMO
  572.     };
  573.  
  574.     // switches a selector.
  575.     if((*tempo > 0) && (*tempo < 25))
  576.     {
  577.         if(*tempoSelector != LARGHISSIMO)
  578.         {
  579.             *tempoSelector = LARGHISSIMO;
  580.             showTempoBar1(*tempoSelector);
  581.         }
  582.     }
  583.     else if((*tempo >= 25) && (*tempo < 46))
  584.     {
  585.         if(*tempoSelector != GRAVE)
  586.         {
  587.             *tempoSelector = GRAVE;
  588.             showTempoBar1(*tempoSelector);
  589.         }
  590.     }
  591.     else if((*tempo >= 46) && (*tempo < 61))
  592.     {
  593.         if(*tempoSelector != LENTO)
  594.         {
  595.             *tempoSelector = LENTO;
  596.             showTempoBar1(*tempoSelector);
  597.         }
  598.     }
  599.     else if((*tempo >= 61) && (*tempo < 67))
  600.     {
  601.         if(*tempoSelector != LARGHETTO)
  602.         {
  603.             *tempoSelector = LARGHETTO;
  604.             showTempoBar1(*tempoSelector);
  605.         }
  606.     }
  607.     else if((*tempo >= 67) && (*tempo < 77))
  608.     {
  609.         if(*tempoSelector != ADAGIO)
  610.         {
  611.             *tempoSelector = ADAGIO;
  612.             showTempoBar1(*tempoSelector);
  613.         }
  614.     }
  615.     else if((*tempo >= 77) && (*tempo < 109))
  616.     {
  617.         if(*tempoSelector != ANDANTE)
  618.         {
  619.             *tempoSelector = ANDANTE;
  620.             showTempoBar1(*tempoSelector);
  621.         }
  622.     }
  623.     else if((*tempo >= 109) && (*tempo < 121))
  624.     {
  625.         if(*tempoSelector != MODERATO)
  626.         {
  627.             *tempoSelector = MODERATO;
  628.             showTempoBar1(*tempoSelector);
  629.         }
  630.     }
  631.     else if((*tempo >= 121) && (*tempo < 169))
  632.     {
  633.         if(*tempoSelector != ALLEGRO)
  634.         {
  635.             *tempoSelector = ALLEGRO;
  636.             showTempoBar1(*tempoSelector);
  637.         }
  638.     }
  639.     else if((*tempo >= 169) && (*tempo < 201))
  640.     {
  641.         if(*tempoSelector != PRESTO)
  642.         {
  643.             *tempoSelector = PRESTO;
  644.             showTempoBar1(*tempoSelector);
  645.         }
  646.     }
  647.     else if((*tempo >= 201) && (*tempo < 321))
  648.     {
  649.         if(*tempoSelector != PRESTISSIMO)
  650.         {
  651.             *tempoSelector = PRESTISSIMO;
  652.             showTempoBar1(*tempoSelector);
  653.         }
  654.     }
  655. }
  656.  
  657.  
  658. void drawWindow()
  659. {
  660.         //if(counter > 1) counter = 1;
  661.  
  662.         getSystemColors(&sc);
  663.         skin_height = _ksys_get_skin_height();
  664.  
  665.         _ksys_window_redraw(1);
  666.         _ksys_draw_window(10, 10, 330, 200, sc.work, 0x14, 0x5080d0, 0, (int)header);
  667.         _ksys_window_redraw(2);
  668.  
  669.  
  670.         showCounterIndicator();
  671.  
  672.         showMeterIndicator();
  673.  
  674.         setTempoSelectorByTempo(&tempo, &tempoSelector);
  675.  
  676.         showTempoBar1(tempoSelector);
  677.         showTempoBar2(tempo);
  678.         showMeterBar(meter);
  679.         showStartButton();
  680.  
  681.         //int a_x = ((x + ((w / 2) - ((chr_w * text_len) / 2))) - num_offset);
  682.  
  683.         #if defined (lang_en)
  684.             _ksys_write_text(94, (skin_height + 153), (((int)0b10010000 << 24) | sc.work_text), "Author: JohnXenox", 0);
  685.         #elif defined (lang_ru)
  686.             _ksys_write_text(94, (skin_height + 153), (((int)0b10010000 << 24) | sc.work_text), "€¢â®à: JohnXenox", 0);
  687.         #endif
  688.  
  689.  
  690.  
  691. //showRectangle(10, (skin_height + 5), 315, 50, 0xff0000);
  692.  
  693. }
  694.  
  695.  
  696.  
  697. #endif
  698.  
  699.  
  700.  
  701.  
  702.  
  703.  
  704.  
  705.  
  706.  
  707.  
  708.  
  709.  
  710.  
  711.  
  712.  
  713.  
  714.  
  715.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.  
  723.  
  724.  
  725.  
  726.  
  727.  
  728.  
  729.  
  730.  
  731.  
  732.  
  733.