home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR2 / DVPG30FS.ZIP / DVUTIL.C < prev    next >
C/C++ Source or Header  |  1993-12-04  |  15KB  |  665 lines

  1. /*
  2.  *   (C) Eric Praetzel 1992
  3.  *
  4.  *  messy utilities for dvpeg viewer and video setup program
  5.  *
  6.  */
  7.  
  8. #include <dos.h>
  9. #include <stdio.h>
  10. #include <conio.h>
  11. #include <mem.h>
  12. #include <alloc.h>
  13. #include "viewdef.h"
  14. #include "extern.h"
  15.  
  16.  
  17.  
  18.  
  19. /*
  20.  *  init the video structure to -1 in all elements
  21.  */
  22.  
  23. void clear_video_struct(void)
  24. {
  25. memset(&video_cards ,-1, sizeof(struct video_card) * number_modes_in_list);
  26. }
  27.  
  28.  
  29.  
  30. /*
  31.  * this is the keyboard checking routine for each image decoding scheme
  32.  * if a key is hit while decoding then set the flag
  33.  * if the ESC key is hit then do an immediate exit to the error trap
  34.  *  with the char E which signals a quick exit from decoding
  35.  *
  36.  * note: an "E" char will exit without messages but may beep (if it is on)
  37.  *       a "" char will exit without messages or beep
  38.  */
  39.  
  40. void check_keybd(decompress_info_ptr cinfo, char * string)
  41. {
  42. if (kbhit()){
  43.     key_hit = 1;        /* exit slide show if it is not ESC */
  44.     if (getch() == escape)
  45.         ERREXIT(cinfo->emethods, string);
  46.     }
  47. }
  48.  
  49.  
  50.  
  51. /*
  52.  *  Get a line of text but return and signal if ESC is hit
  53.  *    return # char + 1 for return if ok,   0 if ESC hit
  54.  *    that way a null input but not escape has a length of 1
  55.  * returning -1 means delete was hit
  56.  * limit string length to 'max' characters for file name input
  57.  */
  58.  
  59. int get_line(char * input_line, int max)
  60. {
  61. int i = 0;        /* current character entered ==> limit to 13 char ie 8.3 format */
  62. int new_ch;
  63.  
  64. _setcursortype(_NORMALCURSOR);
  65. do{
  66. if ( (new_ch = getche()) == 0) new_ch = getche() << 8;
  67. /*    new_ch = getche();*/
  68.     if (new_ch == delete) return -1;
  69.     input_line[i++] = new_ch;
  70.     if (i >= max) i = max;            /* limit size to not overflow array */
  71.     if (new_ch == back_space)
  72.         if ((i -= 2) < 0) i = 0;
  73.     } while ((new_ch != escape) && (new_ch != RTN));
  74. input_line[i-1] = 0;
  75. _setcursortype(_NOCURSOR);
  76. if (new_ch == escape) return 0;
  77. else return i;
  78. }
  79.  
  80.  
  81.  
  82.  
  83.  
  84. /* do an insertion into the users list of modes ie the "edited" list
  85.  * handle the special case of inserting a "custom" item
  86.  * mode, card describe what you want to insert
  87.  * if that mode already exists then do not insert
  88.  * insert the resolutions with the lowest at the bottom
  89.  *
  90.  * only_one is a flag indicating that only one of a given resolution should exist
  91.  *   ie if 640 * 480 * 24 bit exists then do not add 640 * 480 * 16 bit
  92.  */
  93.  
  94. void insert_in_list(int mode, int only_one)
  95. {
  96. int    i;
  97. int    ins_loc;                /* location to insert a new item into the users list of working modes */
  98.  
  99. ins_loc = 0;
  100. /* first find the position of a mode that is non 0 and lower resolution than the selected */
  101. for (i = 0; i < number_modes_in_list; i++)
  102.     if (ok_mode[i] >= 0){
  103.         if (ok_mode[ins_loc] == mode) return;        /* exit if its in the list already */
  104.         if ((video_cards[ok_mode[i]].y_size < video_cards[mode].y_size) &&
  105.                 (video_cards[mode].y_size != 0))
  106.             ins_loc = i + 1;
  107.         }
  108. /* if the resolution already exists then do not insert (if requested) */
  109. if ((video_cards[ok_mode[ins_loc]].y_size == video_cards[mode].y_size) &&
  110.     only_one != 0) return;
  111.  
  112. /* inserting to a full list does nothing */
  113. i = number_modes_in_list;
  114. while( --i > ins_loc)
  115.     ok_mode[i] = ok_mode[i-1];
  116.  
  117. /* now insert it - watchout for inserting at top + 1*/
  118. if (ins_loc < number_modes_in_list)
  119.     ok_mode[ins_loc] = mode;
  120. }
  121.  
  122.  
  123.  
  124.  
  125. /*
  126.  * dump the current defaults into the window
  127.  * only flag is to show it all or partially
  128.  * assume that the window is big enough
  129.  */
  130.  
  131. #ifndef small_viewer
  132.  
  133. void show_defaults(int all, int jpeg_detail)
  134. {
  135. if (all){        /* only show this for vidsetup and outer file selection menu */
  136.     cprintf("preview Menu: ");
  137.     if (view_defaults & ask_size_bit)
  138.         cprintf("on ");
  139.     else
  140.         cprintf("off");
  141.  
  142.     cprintf("\r\nPanning: ");
  143.     if (view_defaults & always_pan)
  144.         cprintf("always on");
  145.     else
  146.         if (view_defaults & panning_bit)
  147.             cprintf("enabled  ");
  148.         else
  149.             cprintf("off      ");
  150.     }
  151. else{
  152.     cprintf("Panning: ");
  153.     if (!(view_defaults & panning_bit))
  154.         cprintf      ("disabled ");
  155.     else
  156.         if (enable_pan)
  157.             if (view_defaults & always_pan)
  158.                 cprintf("always on");
  159.             else
  160.                 cprintf("on       ");
  161.         else
  162.             cprintf   ("off      ");
  163.     }
  164.  
  165.     cprintf("   Shrink: ");
  166.     if (defaults & shrink_enable_flag)
  167.         if (view_defaults & lock_shrink)
  168.             cprintf("locked 1/%i", lock_shrink_value);
  169.         else
  170.             if (all)
  171.                 cprintf("automatic");
  172.             else
  173.                 cprintf("1/%i     ", shrink);
  174.     else
  175.         cprintf("disabled");
  176.  
  177.     if (jpeg_detail){
  178.         cprintf("\r\nDithering: ");
  179.         if (view_defaults & dithering_bit)
  180.             cprintf("on ");
  181.         else
  182.             cprintf("off");
  183.  
  184.         cprintf("       Quantize ");
  185.         if (view_defaults & quantize_bit)
  186.             cprintf("two");
  187.         else
  188.             cprintf("one");
  189.         cprintf(" pass\r\n");
  190.  
  191.         if (more_defaults & high_jpeg_quality)
  192.             cprintf("high quAlity jpeg    ");
  193.         else
  194.             cprintf("medium quAlity jpeg  ");
  195.  
  196.         if (view_defaults & grey_bit)
  197.             cprintf("show jpeg as Grayscale\r\n");
  198.         else
  199.             cprintf("show jpeG as stored   \r\n");
  200.  
  201.         if (any_hi_color){
  202.             cprintf("svga Lockout: ");
  203.             if (view_defaults & only_hi_color)
  204.                 cprintf("on ");
  205.             else
  206.                 cprintf("off");
  207.             cprintf(" & loWer: ");
  208.             if (view_defaults & not_less_hi_color)
  209.                 cprintf("on \r\n");
  210.             else
  211.                 cprintf("off\r\n");
  212.             }
  213.         }
  214.     else
  215.         cprintf("\r\n");
  216. }
  217.  
  218.  
  219.  
  220. /*
  221.  * change the defaults in view_defaults int if requested
  222.  * returned flag:
  223.  *  0 = unknown key
  224.  *  1 = good key
  225.  *  2 = good key, recalc defaults
  226.  */
  227.  
  228. int change_defaults(int choice, int all)
  229. {
  230. int flag = 1;
  231. unsigned int mask;
  232.  
  233. mask = 0;        /* mask out JPEG controls if the file is not JPEG */
  234. if (all || type_of_picture == JPG) mask = 0xffff;
  235.  
  236. switch(toupper(choice)){
  237.     case 'L':
  238.             flag = 2;
  239.             view_defaults ^= only_hi_color;
  240.             break;
  241.     case 'W':
  242.             flag = 2;
  243.             view_defaults ^= not_less_hi_color;
  244.             break;
  245.     case 'P':    /* cycle panning off -> on -> always -> off -> on .... */
  246.             if (view_defaults & always_pan){
  247.                 view_defaults ^= always_pan;    /* if always then toggle always on*/
  248.                 view_defaults ^= panning_bit;    /* toggle panning to off */
  249.                 break;
  250.                 }
  251.             if (view_defaults & panning_bit)
  252.                 view_defaults |= always_pan;
  253.             else
  254.                 view_defaults ^= panning_bit;
  255.             break;
  256.     case 'A':
  257.             more_defaults ^= high_jpeg_quality;
  258.             break;
  259.     case 'M':
  260.             view_defaults ^= ask_size_bit;
  261.             break;
  262.     case 'Q':
  263.             view_defaults ^= (quantize_bit & mask);
  264.             break;
  265.     case 'D':
  266.             view_defaults ^= (dithering_bit & mask);
  267.             break;
  268.     case 'G':
  269.             flag = 2;
  270.             view_defaults ^= (grey_bit & mask);
  271.             break;
  272.     case 'S':
  273.             if ((defaults & shrink_enable_flag) == 0)
  274.                 defaults ^= shrink_enable_flag;
  275.             else{
  276.                 if (all) view_defaults |= lock_shrink;
  277.                 if (++shrink > max_shrink){
  278.                     if (view_defaults & lock_shrink)
  279.                         defaults &= (~shrink_enable_flag);
  280.                     shrink = 1;
  281.                     view_defaults ^= lock_shrink;
  282.                     }
  283.                 lock_shrink_value = shrink;        /* always update */
  284.                 }
  285.             break;
  286.     default:
  287.         return 0;
  288.     }
  289. return flag;        /* signal it was a good key */
  290. }
  291.  
  292.  
  293.  
  294. /*
  295.  * a 2nd screen of settable defaults (user calles this one up)
  296.  * these should not be accessed that often once set
  297.  */
  298. void show_extra_defaults(void)
  299. {
  300. gotoxy(1,1);
  301.  
  302. #ifndef dvpeg_viewer
  303.     cprintf("Maximum # of files in list (%4i)?\r\n", max_file_records);
  304. #endif
  305.  
  306. cprintf("file liSt is ");
  307. if (defaults & no_file_list)
  308.     cprintf("off");
  309. else
  310.     cprintf("on ");
  311.  
  312. cprintf("\r\nshow Drives (");
  313. if (defaults & show_drives)
  314.     cprintf("Y)");
  315. else
  316.     cprintf("N)");
  317.  
  318. cprintf(" | dir Tree (");
  319. if (defaults & show_tree) cprintf("Y)");
  320. else cprintf("N)");
  321.  
  322. cprintf("\r\nLong file format? (");
  323. if (defaults & long_file_format) cprintf("Y)");
  324. else cprintf("N)");
  325.  
  326. cprintf("\r\nfile sort Order is (");
  327. if (view_defaults & ascending_bit) cprintf("ascending) ");
  328. else cprintf("descending)");
  329.  
  330. cprintf("\r\nuse defaults File (");
  331. if (defaults & use_default_file) cprintf("Y)");
  332. else cprintf("N)");
  333.  
  334. cprintf("\r\nshow Error messages? (");
  335. if (defaults & error_msg_on) cprintf("Y)");
  336. else cprintf("N)");
  337.  
  338. cprintf("\r\nend of Pic. beep is ");
  339. if (view_defaults & beep_on)
  340.     cprintf("on ");
  341. else
  342.     cprintf("off");
  343.  
  344. cprintf("\r\nslideshow Pause (+,-) = %2i sec", slideshow_pause);
  345.  
  346. cprintf("\r\nClear screen before draw is ");
  347. if (defaults & clear_before_draw)
  348.     cprintf("on ");
  349. else
  350.     cprintf("off");
  351.  
  352. cprintf("\r\nRgb order is ");
  353. if (defaults & rgb_flip)
  354.     cprintf("bgr");
  355. else
  356.     cprintf("rgb");
  357.  
  358. cprintf("\r\n50 line teXt mode is ");
  359. if (view_defaults & fifty_line_text)
  360.     cprintf("on ");
  361. else
  362.     cprintf("off");
  363.  
  364. /*
  365. cprintf("\r\nfile bUffer is %2ik", buffer_size);
  366. */
  367.  
  368. cprintf("\r\ntWiddle = %2i pixels", twiddle_factor);
  369.  
  370. cprintf("\r\nclear during panning is (V) ");
  371. if (view_defaults & clear_during_pan)
  372.     cprintf("on ");
  373. else
  374.     cprintf("off");
  375.  
  376. cprintf("\r\nlock video mode for shrink (G) ");
  377. if (view_defaults & lock_during_pan)
  378.     cprintf("on ");
  379. else
  380.     cprintf("off");
  381.  
  382. cprintf("\r\ntext line (Y) ");
  383. if (defaults & show_text)
  384.     cprintf("on ");
  385. else
  386.     cprintf("off");
  387.  
  388. cprintf(" | title is (Z) ");
  389. if (defaults & show_title)
  390.     cprintf("on ");
  391. else
  392.     cprintf("off");
  393. /*
  394. cprintf("\r\nQuantize 16 color jpeg (");
  395. if (more_defaults & slow_gray)
  396.     cprintf("Y)");
  397. else
  398.     cprintf("N)");
  399.  
  400. cprintf("\r\n16 color jpeg (U) (");
  401. if (more_defaults & vga_as_color)
  402.     cprintf("Y)");
  403. else
  404.     cprintf("N)");
  405. */
  406. }
  407.  
  408.  
  409.  
  410. /*
  411.  * check for appropiate key presses to extra_defaults list
  412.  * returned flag:
  413.  *  0 = unknown key
  414.  *  bit 0 = 1 = good key
  415.  *  bit 1 = 2 = good key, reget file list
  416.  *  bit 2 = 4 = good key, redraw screen
  417.  */
  418. int change_extra_defaults(int choice)
  419. {
  420. int flag = 1;
  421.  
  422. switch(toupper(choice)){
  423.     case 'M':
  424.         #ifndef dvpeg_viewer
  425.         max_file_records += 50;
  426.         if (max_file_records > max_files_in_list) max_file_records = 50;
  427.         #endif
  428. /*        if (file_info_head != NULL) farfree(file_info_head);*/
  429.         break;
  430.     case 'X':    /* toggle 50 line text mode */
  431.         view_defaults ^= fifty_line_text;
  432.         flag = 4;
  433.         break;
  434.     case 'O':
  435.         flag = 2;
  436.         view_defaults ^= ascending_bit;
  437.         break;
  438.     case 'D':
  439.         flag = 2;
  440.         defaults ^= show_drives;
  441.         break;
  442.     case 'S':
  443.         defaults ^= no_file_list;
  444.         break;
  445.     case 'E':
  446.         defaults ^= error_msg_on;
  447.         break;
  448.     case 'T':
  449.         flag = 2;
  450.         defaults ^= show_tree;
  451.         break;
  452.     case 'F':
  453.         defaults ^= use_default_file;
  454.         break;
  455.     case 'L':
  456.         flag = 4;
  457.         defaults ^= long_file_format;
  458.         break;
  459.     case '+':
  460.         slideshow_pause++;
  461.         if (slideshow_pause > 30) slideshow_pause = 0;
  462.         break;
  463.     case '-':
  464.         slideshow_pause--;
  465.         if (slideshow_pause < 0) slideshow_pause = 0;
  466.         break;
  467. /*    case 'B':
  468.         view_defaults ^= smoothing_bit;
  469.         break;
  470. */
  471.     case 'P':
  472.         view_defaults ^= beep_on;
  473.         break;
  474.     case 'C':
  475.         defaults ^= clear_before_draw;
  476.         break;
  477.     case 'R':
  478.         defaults ^= rgb_flip;
  479.         break;
  480.     case 'W':    /* twiddle factor for image screen selection */
  481.         twiddle_factor += 2;
  482.         if (twiddle_factor > 60) twiddle_factor = 0;
  483.         break;
  484.     case 'V':
  485.         view_defaults ^= clear_during_pan;
  486.         break;
  487.     case 'G':
  488.         view_defaults ^= lock_during_pan;
  489.         break;
  490. /*    case 'U':        /* change file buffer size, 4k min, 32k max */
  491. /*        if (buffer_size < 4) buffer_size = 4;
  492.         else buffer_size <<= 1;
  493.         if (buffer_size > 32) buffer_size = 4;
  494.         break;
  495. */
  496. /*    case 'U':
  497.         if (more_defaults ^= vga_as_color)
  498.             more_defaults |= slow_gray;    /* also turn on quantizing since it is needed */
  499. /*        break;*/
  500.     case 'Y':
  501.         defaults ^= show_text;
  502.         break;
  503.     case 'Z':
  504.         defaults ^= show_title;
  505.         break;
  506. /*    case 'Q':
  507.         more_defaults ^= slow_gray;
  508.         break;
  509. */
  510.     default:
  511.         return 0;        /* bad key so exit with 0 */
  512.     }
  513. return flag;        /* good key so return signal */
  514. }
  515.  
  516. #endif    /* if smaller viewer - ie save memory */
  517.  
  518.  
  519. /*
  520.  * short message if there is a problem in the config file
  521.  */
  522.  
  523. void config_problem(int problem_number)
  524. {
  525. printf("Error %i in dvpeg.cfg file.\r\n", problem_number);
  526. printf("Perhaps the file does not exist or was corrupted.\r\nPlease delete dvpeg.cfg and run vidseteup.\r\n");
  527. exit(-1);
  528. }
  529.  
  530.  
  531.  
  532. /*
  533.  * get a key and strip that pesky 0 if its a usefull {arrow, page, insert, delete ..} key
  534.  */
  535.  
  536. int get_key(void)
  537. {
  538. int cmd;
  539. if ( (cmd = getch()) == 0) cmd = getch() << 8;
  540. return cmd;
  541. }
  542.  
  543.  
  544.  
  545. /*
  546.  * update the list of file masks from the keyboard
  547.  * on each 'enter' go-to the next entry (null = end) untill one empty one is show (or ESC hit)
  548.  * - each can be retyped, first char as space = delete
  549.  *
  550.  * return 1 if anything was changed (ret_value)
  551.  */
  552.  
  553. int get_file_masks(void)
  554. {
  555. char new_mask[20];
  556. int exit = 0, index = 0, ret_value = 0;
  557. int result;
  558.  
  559. do{
  560.     clrscr();
  561.     cprintf("Enter, Del to continue or delete\r\n");
  562.     cprintf("Mask #%i :%13s\r\n", index + 1, file_masks[index]);
  563.  
  564.     result = get_line(new_mask, 13);        /* if something was entered ie ESC not hit */
  565.     if (result > 0){        /* if something was entered ie ESC not hit */
  566.         if (strlen(new_mask) > 1){
  567.             strcpy(file_masks[index], new_mask);
  568.             ret_value = 1;
  569.             }
  570.         }
  571.     if (result == 0)
  572.         exit = 1;
  573.  
  574.     if (result < 0){        /* delete an entry ?? */
  575.         ret_value = 1;
  576.         for (result = index; result < max_file_masks - 1; result++){
  577.             strcpy(file_masks[result], file_masks[result + 1]);
  578.             }
  579.         file_masks[max_file_masks - 1][0] = 0;        /* make sure the last is cleared */
  580.         }
  581.     else
  582.         if (++index >= max_file_masks)
  583.             exit = 1;
  584.     } while (!exit);
  585. return ret_value;
  586. }
  587.  
  588.  
  589.  
  590.  
  591. /****************************************************************************
  592. *
  593. *       originally from SuperVGA Test Library
  594. *
  595. *                   Copyright (C) 1993 Kendall Bennett.
  596. *                            All rights reserved.
  597. */
  598.  
  599. void writeText(int x,int y,unsigned char *str)
  600. /****************************************************************************
  601. *
  602. * Function:        writeText
  603. * Parameters:    x,y        - Position to begin drawing string at
  604. *                str        - String to draw
  605. *
  606. * Description:    Draws a string using the BIOS 8x16 video font by plotting
  607. *                each pixel in the characters individually. This should
  608. *                work for all video modes.
  609. *
  610. ****************************************************************************/
  611. {
  612.     unsigned char            byte;
  613.     unsigned char            FAR *_font;
  614.     int                i,j,k,length,ch, color;
  615.     struct REGPACK    regs;
  616.  
  617.     regs.r_ax = 0x1130;
  618.     regs.r_bx = 0x0600;
  619.     intr(0x10,®s);
  620.     _font = MK_FP(regs.r_es,regs.r_bp);
  621.  
  622.     length = strlen(str);
  623.     for (k = 0; k < length; k++) {
  624.         ch = str[k];
  625.         for (j = 0; j < 16; j++) {
  626.             byte = *(_font + ch * 16 + j);
  627.             for (i = 0; i < 8; i++) {
  628.                 switch (video_resolution){
  629.                     case VGA:
  630.                         if ((byte & 0x80) != 0)
  631.                             put16Pixel(x+i, y+j, text_drawing_for);
  632.                         else
  633.                             put16Pixel(x+i, y+j, text_drawing_bk);
  634.                         break;
  635.                     case SVGA:
  636.                         if ((byte & 0x80) != 0)
  637.                             point(x+i, y+j, text_drawing_for);
  638.                         else
  639.                             point(x+i, y+j, text_drawing_bk);
  640.                         break;
  641.                     case SVGA_15_bit:
  642.                     case SVGA_16_bit:
  643.                         if ((byte & 0x80) != 0)
  644.                             color = 0xffff;
  645.                         else
  646.                             color = 0x00;
  647.                         point_wide(x+i, y+j, color);
  648.                         break;
  649.                     case SVGA_24_bit:
  650.                         if ((byte & 0x80) != 0)
  651.                             point_24(x+i, y+j, 0xffffff);
  652.                         else
  653.                             point_24(x+i, y+j, 0x000000);
  654.                         break;
  655.                     }
  656.                 byte <<= 1;
  657.                 }
  658.             }
  659.         x += 8;
  660.         }
  661. }
  662.  
  663.  
  664.  
  665.