Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Графический режим


Автор: Slay1 22.5.2006, 22:56
Насколько я читал в разных мануалах VGAHI рассчитанн на 16 цветов.
Как задать режим, который способен отображать 256 цветов?
Пробовал IBM8514(написано что макимально 1024х768 и 256 цветов, что мне и нужно), но выскакивали только ерроры. Детектграф опредиляет видеодрайвер как VGA. Так как заставить отображать 256 цветов?
И еще вопрос по теме, допустим я перешел в режим с 256 цветами, но как эти цвета выводить на экран? Стандартные функции работают ведь только с форматом задания цвета типа BLACK или номер цвета. Как задавать и выводить на экран нужные мне цвета? Если можно пример пожалуйста. Как например сделать putpixel цвету 0,0,180?
Буду очень благодарный за ответы. 

Автор: regis 23.5.2006, 13:20
Цитата

Насколько я читал в разных мануалах VGAHI рассчитанн на 16 цветов.
Как задать режим, который способен отображать 256 цветов?
Пробовал IBM8514(написано что макимально 1024х768 и 256 цветов, что мне и нужно), но выскакивали только ерроры. Детектграф опредиляет видеодрайвер как VGA. Так как заставить отображать 256 цветов?


Все 256-цветовые режимы выше 320x200 - это уже не VGA, а SuperVGA!
Стандартные борландовские драйвера эти режимы не поддерживали. AFAIK, их вообще нельзя было поддерживать переносимым образом, пока стандарт VESA 1.0 не появился.
Вам нужны SVGA драйвера для BGI, поддерживающие VESA. Вроде был какой-то VESA.BGI (хотя не уверен, был ли это родной продукт или хакерская поделка). Поищите в Сети.

Цитата

И еще вопрос по теме, допустим я перешел в режим с 256 цветами, но как эти цвета выводить на экран? Стандартные функции работают ведь только с форматом задания цвета типа BLACK или номер цвета. Как задавать и выводить на экран нужные мне цвета? Если можно пример пожалуйста.


Элементарно: индекс цвета == индекс пиксела. (А реальный цвет зависит от палитры, которая устанавливается так же, как и в других VGA режимах.)

Цитата

Как например сделать putpixel цвету 0,0,180?
Буду очень благодарный за ответы.  


Или вам уже TrueColor нужен? Боюсь, с этим функции типа putpixel работать точно не будут.
 

Автор: Slay1 23.5.2006, 21:38
regis, 
Спасибоза ответ. Я думаю что мне наверное все таки достаточно будет 256 цветов.
Как цвет задавать я уже разобрался(ф-я setrgbpalette). Но есть еще вопросьі. 
Максимальное количество цветов в палитре только 16? 
И еще. Заюзал я  SVGA256.BGI(хочется попробовать разрешение 1280х1024), и столкнулса с такой проблемой.

Код

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

int main(void)
{
   /* select a driver and mode that supports the use */
   /* of the setrgbpalette function.                 */
   int gdriver = installuserdriver("SVGA256",NULL), gmode = 6, errorcode;
   struct palettetype pal;
   int i, ht, y, xmax;

   /* initialize graphics and local variables */
   initgraph(&gdriver, &gmode,"");

   /* read result of initialization */
   errorcode = graphresult();
   if (errorcode != grOk)  /* an error occurred */
   {
      printf("Graphics error: %s\n", grapherrormsg(errorcode));
      printf("Press any key to halt:");
      getch();
      exit(1); /* terminate with an error code */
   }

   /* grab a copy of the palette */
   getpalette(&pal);

   /* create gray scale */
   for (i=0; i<pal.size; i++)
      setrgbpalette(pal.colors[i], i*4, i*4, i*4);

   /* display the gray scale */
   ht = getmaxy() / 16;
   xmax = getmaxx();
   y = 0;
   for (i=0; i<pal.size; i++)
   {
      setfillstyle(SOLID_FILL, i);
      bar(0, y, xmax, y+ht);
      y += ht;
   }

   /* clean up */
   getch();
   closegraph();
   return 0;
}

Вьідает просто черньій єкран, а должньі бьіть прямоугольники с градациями серого. Об никаких ошьібках не информирует.
В то же время, если вместо
int gdriver = installuserdriver("SVGA256",NULL), gmode = 6, errorcode;
написать
int gdriver = VGA, gmode = 2, errorcode;
Все нормально работает, єкран заливается градиентами серого. Насколько я понял VGA и SVGA256 отличаются только тем, что второй поддержьівает режьімьі вплоть до 1280х1024. Так почему же программа не работает если использовать SVGA256.BGI???    

Автор: regis 25.5.2006, 12:43
Цитата(Slay1 @ 23.5.2006,  21:38)
regis, 
Спасибоза ответ. Я думаю что мне наверное все таки достаточно будет 256 цветов.
Как цвет задавать я уже разобрался(ф-я setrgbpalette). Но есть еще вопросьі. 
Максимальное количество цветов в палитре только 16? 

Нет, в 256 цветовых режимах каждый цвет можно перепрограммировать. Другое дело -- не уверен, что это можно ф-циями BGI (которые в основном ориентированы на 16-цветовые режимы). Если не получится, можно попробовать функции BIOS (int 10h, ah=11h кажется... точно не помню).

Добавлено @ 12:49 
Цитата(Slay1 @ 23.5.2006,  21:38)
regis, 
И еще. Заюзал я  SVGA256.BGI(хочется попробовать разрешение 1280х1024), и столкнулса с такой проблемой.

(code skipped...)

Вьідает просто черньій єкран, а должньі бьіть прямоугольники с градациями серого. Об никаких ошьібках не информирует.
В то же время, если вместо
int gdriver = installuserdriver("SVGA256",NULL), gmode = 6, errorcode;
написать
int gdriver = VGA, gmode = 2, errorcode;
Все нормально работает, єкран заливается градиентами серого. Насколько я понял VGA и SVGA256 отличаются только тем, что второй поддержьівает режьімьі вплоть до 1280х1024. Так почему же программа не работает если использовать SVGA256.BGI???

Такое ощущение, что просто неправильно инициализируется видеорежим. Я сам давненько не программировал под DOS (да еще на Borland-овских компиляторах), так что могу ошибаться. Но смутно вспоминается, что сначала надо делать installuserdriver, потом -- инициализировать соотв. режим через initgraph. И естественно, тщательно проверять коды ошибок на каждом этапе. Также проверить путь к SVGA256.BGI. Вот все, что пока могу посоветовать.
  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)