Subversion Repositories Kolibri OS

Rev

Rev 5260 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #include "rskos.h"
  2.  
  3. #ifndef RS_KOS
  4.  
  5. #include "rs/rstexture.h"
  6. #include "rs/rsgl.h"
  7. #include "rs/rsshader.h"
  8.  
  9. #include "rs/rsaudio.h"
  10.  
  11. #include <stdlib.h>
  12. #include <string.h>
  13.  
  14. //unsigned char* rskos_malloc(unsigned int bytes_count) {
  15. //    return malloc(bytes_count);
  16. //};
  17. //
  18. //void rskos_free(unsigned char* pointer) {
  19. //    free(pointer);
  20. //};
  21. //
  22. //void rskos_memset(unsigned char* pointer, unsigned char value, unsigned int bytes_count) {
  23. //    memset(pointer, value, bytes_count);
  24. //};
  25. //
  26. //void rskos_memcpy(unsigned char* dest, unsigned char* src, unsigned int bytes_count) {
  27. //    memcpy(dest, src, bytes_count);
  28. //};
  29.  
  30.  
  31.  
  32. unsigned int rskos_get_time() {
  33.    
  34.     return rs_app.app_time;
  35.    
  36. };
  37.  
  38. void rskos_draw_area(int x, int y, int w, int h, int k_scale, unsigned char *data, unsigned char *scaled_buffer, int image_format) {
  39.    
  40.     int bpp = image_format == RSKOS_BGR ? 3 : 4;
  41.  
  42. //    int i, j;
  43. //    
  44. //    for (i = 0; i < h*k_scale; i++) {
  45. //        for (j = 0; j < w*k_scale; j++) {
  46. //            scaled_buffer[ (i*w*k_scale + j)*3 + 0] = data[ ( (i/k_scale)*w + (j/k_scale) )*4 + 0];
  47. //            scaled_buffer[ (i*w*k_scale + j)*3 + 1] = data[ ( (i/k_scale)*w + (j/k_scale) )*4 + 1];
  48. //            scaled_buffer[ (i*w*k_scale + j)*3 + 2] = data[ ( (i/k_scale)*w + (j/k_scale) )*4 + 2];
  49. //        };
  50. //    };
  51.  
  52.  
  53.    
  54.  
  55.  
  56.  
  57.  
  58.         glViewport(0, 0, rs_app.width, rs_app.height);
  59.     glClearColor( 0.2596078431, 0.2815686275, 0.3929411765, 1.0 ); // #98d0ed
  60.     //glClearColor( 0.0, 0.4, 0.1 + 0.5*0.001*(rs_get_time()%1024) , 1.0 );
  61.  
  62.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // <-- FBO
  63.        
  64.        
  65.        
  66.        
  67.        
  68.    
  69.     //rs_tx_t tex = rs_tx_create_from_data(w*k_scale, h*k_scale, 3, 0, 1, scaled_buffer);
  70.     rs_tx_t tex = rs_tx_create_from_data(w, h, bpp, 0, 1, data);
  71.    
  72.     glBindTexture(GL_TEXTURE_2D, tex);
  73.    
  74.     rs_sh_use(DefaultShader);
  75.    
  76.     rs_mx_identity_modelview();
  77.     rs_mx_ortho_proj();
  78.    
  79.     glUniformMatrix4fv( DefaultShader[RS_SH_PROJ_ID], 1, GL_FALSE, rs_reg.mx_proj );
  80.     glUniformMatrix4fv( DefaultShader[RS_SH_MODELVIEW_ID], 1, GL_FALSE, rs_reg.mx_modelview );
  81.    
  82.     glrsDrawRect(x, y, x+w*k_scale, y+h*k_scale, DefaultShader[RS_SH_POS_ID], DefaultShader[RS_SH_UV_ID]);
  83.    
  84.     rs_tx_destroy(&tex);
  85.    
  86.    
  87.    
  88.  
  89.     rsDoSwapBuffers();
  90.    
  91. };
  92.  
  93.  
  94. void rskos_resize_window(int w, int h) {
  95.     //
  96. };
  97.  
  98. void rskos_get_screen_size(unsigned int  *pw, unsigned int  *ph) {
  99.     *pw = rs_app.width + 50;
  100.     *ph = rs_app.height + 50;
  101. };
  102.  
  103. void rskos_exit() {
  104.     rsAppExit();
  105. };
  106.  
  107.  
  108.  
  109.  
  110. int rskos_file_save(char *filename, unsigned char *data, int length) {
  111.     FILE *fp;
  112.    
  113.     fp = fopen(filename, "w");
  114.     if (!fp) {
  115.         return 0;
  116.     };
  117.    
  118.     fwrite(data, 1, length, fp);
  119.     fclose(fp);
  120.    
  121.     return 1;
  122.    
  123. };
  124.  
  125. int rskos_file_load(char *filename, unsigned char *data, int length) {
  126.     FILE *fp;
  127.    
  128.     fp = fopen(filename, "r");
  129.     if (!fp) {
  130.         return 0;
  131.     };
  132.    
  133.     fread(data, 1, length, fp);
  134.     fclose(fp);
  135.    
  136.     return 1;
  137. };
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147. //void rskos_snd_init() {
  148. //    //
  149. //    
  150. //    rs_audio
  151. //    
  152. //};
  153.  
  154. void rskos_snd_create_buffer(SNDBUF *hbuf, signed short *buffer, unsigned int length) {
  155.     //
  156.    
  157.     rs_sound_t *snd = malloc( sizeof(rs_sound_t) );  
  158.     rs_sound_create_from_data(snd, length*2, (unsigned char*) buffer);
  159.    
  160.     *hbuf = snd;
  161.    
  162. };
  163.  
  164. void rskos_snd_update_buffer(SNDBUF *hbuf, signed short *buffer, unsigned int length) {
  165.    
  166.     rs_sound_destroy(*hbuf);
  167.     rskos_snd_create_buffer(hbuf, buffer, length);
  168.    
  169. };
  170.  
  171. void rskos_snd_play(SNDBUF *hbuf, unsigned int mode) {
  172.    
  173.     rs_sound_play(*hbuf);
  174.    
  175. };
  176.  
  177. void rskos_snd_stop(SNDBUF *hbuf) {
  178.     rs_sound_stop(*hbuf);
  179. };
  180.  
  181.  
  182. #else
  183.  
  184.     #include "rs/rsplatform.h"
  185.    
  186.    
  187.     #pragma pack(push,1)
  188.      
  189.     typedef struct rskos_file_struct_t {
  190.        
  191.         unsigned int func_num;
  192.         unsigned int offset;
  193.         unsigned int flags;
  194.         unsigned int length;
  195.         unsigned char *data;
  196.         unsigned char  zero;
  197.         char *filename;
  198.        
  199.     } rskos_file_struct_t;
  200.      
  201.     #pragma pack(pop)    
  202.    
  203.  
  204.  
  205.     unsigned int rskos_get_time() {
  206.         return 1;
  207.     };
  208.    
  209.    
  210.    
  211.  
  212.    
  213.    
  214.    
  215.    
  216.      
  217.     int rskos_file_load(char *filename, unsigned char *data, int length) {
  218.  
  219. //        char filename_abs[] = "/sys/games/************************";
  220. //        memcpy( filename_abs[ strchr(filename_abs, "*") ], filename, strlen(filename)+1 );
  221.        
  222.         rskos_file_struct_t file_struct;
  223.         file_struct.func_num = 0;
  224.         file_struct.offset = 0;
  225.         file_struct.flags = 0;
  226.         file_struct.length = length;
  227.         file_struct.data = data;
  228.         file_struct.zero = 0;
  229.         file_struct.filename = filename;
  230.      
  231.         asm volatile ("int $0x40"::"a"(70), "b"(&file_struct) : "memory");
  232.        
  233.         return 1;
  234.     }
  235.    
  236.    
  237.    
  238.     int rskos_file_save(char *filename, unsigned char *data, int length) {
  239.  
  240. //        char filename_abs[] = "/sys/games/************************";
  241. //        memcpy( filename_abs[ strchr(filename_abs, "*") ], filename, strlen(filename)+1 );
  242.        
  243.         rskos_file_struct_t file_struct;
  244.         file_struct.func_num = 2;
  245.         file_struct.offset = 0;
  246.         file_struct.flags = 0;
  247.         file_struct.length = length;
  248.         file_struct.data = data;
  249.         file_struct.zero = 0;
  250.         file_struct.filename = filename;
  251.      
  252.         asm volatile ("int $0x40"::"a"(70), "b"(&file_struct) : "memory" );
  253.        
  254.         return 1;
  255.     }
  256.    
  257.  
  258.    
  259.    
  260.  
  261.    
  262.    
  263.    
  264.    
  265.  
  266.     void rskos_draw_area(int x, int y, int w, int h, int k_scale, unsigned char *data, unsigned char *scaled_buffer, int image_format) {
  267.  
  268.         int i, j;
  269.        
  270.         for (i = 0; i < h*k_scale; i++) {
  271.             for (j = 0; j < w*k_scale; j++) {
  272.                 scaled_buffer[ (i*w*k_scale + j)*3 + 0] = data[ ( (i/k_scale)*w + (j/k_scale) )*4 + 0];
  273.                 scaled_buffer[ (i*w*k_scale + j)*3 + 1] = data[ ( (i/k_scale)*w + (j/k_scale) )*4 + 1];
  274.                 scaled_buffer[ (i*w*k_scale + j)*3 + 2] = data[ ( (i/k_scale)*w + (j/k_scale) )*4 + 2];
  275.             };
  276.         };
  277.  
  278.         kol_paint_image(0, 0, w*k_scale, h*k_scale, scaled_buffer);
  279.  
  280.     };
  281.    
  282.     void rskos_resize_window(int w, int h) {
  283.        
  284.         // !!!!!!!!! add define-fix here
  285.        
  286.         w = -1 + w + 10; // 2 x 5px border
  287.         h = -1 + kol_skin_height() + h + 5; // bottom 5px border
  288.        
  289.         asm volatile ("int $0x40"::"a"(67), "b"(-1), "c"(-1), "d"(w), "S"(h));
  290.        
  291.     };
  292.    
  293.     void rskos_get_screen_size(unsigned int  *pw, unsigned int  *ph) {
  294.         kol_screen_get_size(pw, ph);
  295.     };
  296.    
  297.     void rskos_exit() {
  298.         kol_exit();
  299.     };
  300.  
  301.     #define fmt PCM_1_16_16 // 1 channel, 16 bit per sample, 16 kHz
  302.  
  303.     void rskos_snd_create_buffer(SNDBUF *phbuf, signed short *buffer, unsigned int length_samples) {
  304.         unsigned int snd_format = fmt;
  305.         CreateBuffer(snd_format|PCM_STATIC, length_samples*2, phbuf);
  306.         int offset = 0;
  307.         SetBuffer(*phbuf, (void*)buffer, offset, length_samples*2);
  308.     };
  309.    
  310.     void rskos_snd_update_buffer(SNDBUF *phbuf, signed short *buffer, unsigned int length_samples) {
  311.         unsigned int snd_format = fmt;
  312. //        CreateBuffer(snd_format|PCM_STATIC, length, phbuf);
  313.         int offset = 0;
  314.         SetBuffer(*phbuf, (void*)buffer, offset, length_samples*2);
  315.     };
  316.  
  317.     void rskos_snd_play(SNDBUF *phbuf, unsigned int mode) {
  318.         SetBufferPos(*phbuf, 0);
  319.         PlayBuffer(*phbuf, 0);
  320.     };
  321.  
  322.     void rskos_snd_stop(SNDBUF *phbuf) {
  323.         StopBuffer(*phbuf);
  324.     };
  325.  
  326.  
  327.  
  328. #endif
  329.