Jump to content

Quantas cores tem o modo gráfico em Pascal?


passarito
 Share

Recommended Posts

Boas a todos,

Normalmente à pergunta feita no tópico respondiam-se as normais 16. Standarizadas sim, mas isso era como um pintor comprar uma caixa com 12 aguarelas e depois pintar um quadro! Um pintor mistura as cores para obter outras, assim também nós o podemos fazer misturando as cores primárias Vermelho, Verde e Azul. Sim estas são as cores primárias da luminusidade em que o preto é ausencia de cor e o branco a mistura das tres cores primárias ao contrario das cores pigmentadas. Mas isto dava um outro tópico noutro forum que não este!

Seguindo, com o setrgbpalette podemos configurar qualquer das 16 cores que temos à disposição. Melhor, imaginem que em vez de terem 16 cores têm um array de 16 posições que podem colocar lá a cor que querem... BRUTAL, não? (como diz a minha filha)

A titulo de exemplo deixo-vos abaixo o código de um programita que fiz em '98 para testar estas funcionalidades.

Para alterarem as cores têm de carregar em R, G ou B até aparecer um asterisco na cor pretendida e depois carregar em + ou - para dar ou tirar a cor.

Poderia ser muito melhorado, mas isso deixo-o a voçês 😉

Have fun!

(*
Autor: Pedro Estima
Data.: 18/Dez/1998
*)

Program RGB;

uses Graph,crt;

var
r,g,b,Driver, Mode: Integer;
scont,sr,sg,sb:string;
caminho:string;
s:char;



Procedure Select_Cor;
var cont:real;
begin
 cont:=5 / 2;
 str(cont:10:5,scont);
 Outtextxy(10,10,scont);
 SetTextJustify(Centertext,Centertext);
 r:=32;  g:=0;  b:=8;
 setrgbpalette(1,r,g,b);
 setrgbpalette(2,r,0,0);
 setrgbpalette(3,0,r,0);
 setrgbpalette(4,0,0,b);
 setcolor(15);
 cont:=r+(g*64)+(b*(64*64))+0.5;
 str(cont:10:2,scont);
 OutTextXY(150,350,scont);
 str(r,sr);
 OutTextXY(550,135,'+ '+sr+' -');
 str(g,sg);
 OutTextXY(550,185,'+ '+sg+' -');
 str(b,sb);
 OutTextXY(550,235,'+ '+sb+' -');
 S:=#0;
 repeat
   s:=upcase(readkey);
   case s of
     'R':BEGIN
           setcolor(15);
           OutTextXy(550,110,'*');
           repeat
             s:=readkey;
             setcolor(0);
             OutTextXY(550,135,'+ '+sr+' -');
             OutTextXY(150,350,scont);
             case s of
               '+':if r+1=64 then r:=63 else inc(r);
               '-':if r-1=-1 then r:=0 else dec(r);
             end;
             setrgbpalette(1,r,g,b);
             setrgbpalette(2,r,0,0);
             str(r,sr);
             setcolor(15);
             OutTextXY(550,135,'+ '+sr+' -');
             cont:=r+(g*64)+(b*(64*64))+0.5;
             str(cont:10:2,scont);
             OutTextXY(150,350,scont);
           until s in [#27,'G','g','B','b','R','r'];
           if s=#27 then s:=#0;
           setcolor(2);
           OutTextXy(550,110,'*');
         END;
     'G':BEGIN
           setcolor(15);
           OutTextXy(550,160,'*');
           repeat
             s:=readkey;
             setcolor(0);
             OutTextXY(550,185,'+ '+sg+' -');
             OutTextXY(150,350,scont);
             case s of
               '+':if g+1=64 then g:=63 else inc(g);
               '-':if g-1=-1 then g:=0 else dec(g);
             end;
             setrgbpalette(1,r,g,b);
             setrgbpalette(3,0,g,0);
             str(g,sg);
             setcolor(15);
             OutTextXY(550,185,'+ '+sg+' -');
             cont:=r+(g*64)+(b*(64*64))+0.5;
             str(cont:10:2,scont);
             OutTextXY(150,350,scont);
           until s in [#27,'G','g','B','b','R','r'];
           if s=#27 then s:=#0;
           setcolor(3);
           OutTextXy(550,160,'*');
         END;
     'B':BEGIN
           setcolor(15);
           OutTextXy(550,210,'*');
           repeat
             s:=readkey;
             setcolor(0);
             OutTextXY(550,235,'+ '+sb+' -');
             OutTextXY(150,350,scont);
             case s of
               '+':if b+1=64 then b:=63 else inc(b);
               '-':if b-1=-1 then b:=0 else dec(b);
             end;
             setrgbpalette(1,r,g,b);
             setrgbpalette(4,0,0,b);
             str(b,sb);
             setcolor(15);
             OutTextXY(550,235,'+ '+sb+' -');
             cont:=r+(g*64)+(b*(64*64))+0.5;
             str(cont:10:2,scont);
             OutTextXY(150,350,scont);
           until s in [#27,'G','g','B','b','R','r'];
           if s=#27 then s:=#0;
           setcolor(4);
           OutTextXy(550,210,'*');
         END;
   end;
 until s=#27;
end;

begin
Writeln('Indique o caminho para os drivers graficos: (c:\bp\bgi)');
write('> ');
caminho:='';
readln(caminho);
if caminho='' then caminho:='c:\bp\bgi';
Driver := Detect;   { Put in graphics mode }
InitGraph(Driver, Mode, caminho);
if GraphResult <> grOk then Halt(1);
setbkcolor(0);
setrgbpalette(1,0,0,0);
setrgbpalette(2,0,0,0);
setrgbpalette(3,0,0,0);
setrgbpalette(4,0,0,0);
r:=0;  g:=0;  b:=0;
SetFillStyle(1, 1);
bar(100,100,300,300);
SetFillStyle(1, 2);
bar(500,100,600,125);
SetFillStyle(1, 3);
bar(500,150,600,175);
SetFillStyle(1, 4);
bar(500,200,600,225);
Select_Cor;
CloseGraph;
end.
Edited by passarito
Link to comment
Share on other sites

Ahh, o velhinho mas excelente Borland Pascal 😄

Sim, recorri ao FPC, é o meu compilador de eleição: open-source, cheio de opções de compilação, relativamente fácil de utilizar, e apesar do IDE para Windows não ser o melhor, já estou tão habituado que começo como que a gostar dele 😛

Knowledge is free!

Link to comment
Share on other sites

O IDE não é problema... 🙂 É um clone do Borland Pascal 7.

O problema é, salvo erro, nos drivers graficos (BGI), que são diferentes no FPC.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Também pensei nisso, mas quando o experimentei no free pascal usei o BGI's do Borland pascal e não funcionou como deve de ser. Procurei os BGI's do Free pascal e não encontrei nada.

.... A não ser que o FPC tenha uma interacção com windows diferente da do BP ?!?

anw, @Thoga31, recebeste o executavel compilado em BP? funcionou bem?

Link to comment
Share on other sites

Sim, tem...

O Borland Pascal era apenas 16 bits, enquanto o FPC é de 32 bits.

Logo aí faz diferença. Os BGI do BP não funcionam noo FPC. E pelos vistos, são pouco compativeis entre eles, mesmo usando o {$MODE TP}

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Foi como eu.

Acho que no FPC, os BGI são integrados. Talvez remodelando o programa para simplesmente usar o modo grafico, sem activar os BGI, seja uma opção, mas não testei!

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Eu ainda desconfio do IDE, isto é, correr o programa a partir do IDE.

Vou fazer um teste, criar um EXE a partir do FPC e depois executá-lo a partir de uma janela de DOS.

É que há algo de estranho quando se correr o programa a partir do IDE do FPC, o programa abre uma janela do modo gráfico integrado no windows, mas só funciona se a janela do IDE estiver activa. E isto deixa-me com a pulga atrás da orelha quanto ao IDE.

Link to comment
Share on other sites

Isso já testei. Só os asteriscos é que aparecem a cores, e mal (muito escuros).

O que era suposto aparecer com cores?

Fiz um pequeno teste para as cores, sem usar o BGI. Quem quiser experimente isto para ver se "vê a luz"! 🙂

program Project1;

{$mode objfpc}{$H+}

uses
 {$IFDEF UNIX}{$IFDEF UseCThreads}
 cthreads,
 {$ENDIF}{$ENDIF}
 Classes, Graph, SysUtils;

{$R *.res}

var
  x,y:word;
  gd, gm: SmallInt;
  PathToDriver : string;

begin
    gd:=detect;
    gm:=0;
    PathToDriver:='';
    InitGraph(gd,gm,PathToDriver);
    if GraphResult<>grok then halt;

    for x:=1 to 1024 do
        for y:=1 to 768 do
            begin
                 SetRGBPalette(20,trunc(Sin(x))+y,trunc(sin(y))+x,trunc(sin(x+y))+x+y);
                 PutPixel(x,y,20);
            end;

    Sleep(10000);
    CloseGraph;
end.
Edited by nunopicado
Adicionado exemplo de cores...

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

@passarito, experimenta ver as opções de compilação do FPC na linha de comandos, são mais de 100.

fpc -h

Além disso, o FPC já não necessita das drivers BGI - isso é do tempo do Borland Pascal, e o procedimento InitGraph do FPC só mantém esse parâmetro por uma questão de compatibilidade, apesar de poder não funcionar devidamente.

Aconselho-te a adoptares o FPC e adaptares ligeiramente o programa de modo a que funcione no século XXI 😉

Ah, recebi o teu programa, mas precisamente devido aos problemas Borland vs FPC, os símbolos saem todos trocados - por exemplo, quando carrego na tecla "\" aparece-me um "<" e coisas assim.

EDIT:

@nunopicado, nem o teu código compilava no FPC por causa da porcaria do ficheiro *.res 😛

Peço que passem a adaptar os códigos para FPC já que esses funcionam igualmente bem no Delphi ou no Lazarus. Claro que no PZim (ou no Borland) não funcionam devidamente.

{$mode objfpc}
program Project1;
uses Graph, SysUtils; // falta adaptação aos ambientes Unix

var
  x,y:word;
  driver, modus: SmallInt;

begin
    DetectGraph(driver, modus);
    InitGraph(diver, modus, '');
    if (GraphResult <> grok) then halt;

    for x:=1 to 1024 do
        for y:=1 to 768 do
            begin
                 SetRGBPalette(20, trunc(Sin(x))+y, trunc(sin(y))+x, trunc(sin(x+y))+x+y);
                 PutPixel(x,y,20);
            end;

    Sleep(10000);
    CloseGraph;
end.

E para acabar com o mistério de 2 dias, coloco aqui o resultado do programa do @nunopicado:

rgb_pascal.jpg

Edited by thoga31

Knowledge is free!

Link to comment
Share on other sites

Isso não é Borland vs FPC, mas sim Microsoft 16 vs Microsoft 32. 🙂

O Windows "esqueceu-se" de configurar a pagina de codigos dos programas a 16bits, tens de o fazer manualmente... Já nao me lembro é onde!

O FPC tem a possibilidade de usar os BGI da borland, ou outros que sejam compativeis, mas não trás ele proprio esses drivers. Modernices do opensource. 😄

O meu programa foi feito em Lazarus... 🙂 Ando com pouca paciencia para Text IDE...

Agora, mistério de dois dias? Só pus isso há umas 3 ou 4 horas, não sou assim tão rapido! hehehehe

Agora experimenta trocar a formula de calculo de cor nesse programa, e põe esta:

SetRGBPalette(20,x,y,(x*y) mod 255);     

Welcome to the 80's! 😉

PS: Codigos do FPC a correr bem no Delphi? Grande fezada que tu tens! 😉

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Isso não é Borland vs FPC, mas sim Microsoft 16 vs Microsoft 32. 🙂

O Windows "esqueceu-se" de configurar a pagina de codigos dos programas a 16bits, tens de o fazer manualmente... Já nao me lembro é onde!

A evolução tem destas coisas, hoje em dia a computação a 16 bits é praticamente história para museus - actualmente estamos na era dos 64 bits 😉

O FPC tem a possibilidade de usar os BGI da borland, ou outros que sejam compativeis, mas não trás ele proprio esses drivers. Modernices do opensource. 😄

o FPC já não necessita das drivers BGI - isso é do tempo do Borland Pascal, e o procedimento InitGraph do FPC só mantém esse parâmetro por uma questão de compatibilidade, apesar de poder não funcionar devidamente.

Agora, mistério de dois dias? Só pus isso há umas 3 ou 4 horas, não sou assim tão rapido! hehehehe

O tópico é de há 2 dias - o mistério das cores tem 2 dias.

Agora experimenta trocar a formula de calculo de cor nesse programa, e põe esta:

SetRGBPalette(20,x,y,(x*y) mod 255);     

Welcome to the 80's! 😉

rgb_80s_pascal.jpg

PS: Codigos do FPC a correr bem no Delphi? Grande fezada que tu tens! 😉

What do you mean?

Knowledge is free!

Link to comment
Share on other sites

@Thoga31, o facto de carregares numa tecla e aparecer outra, não é do programa mas sim da tua janela janela de DOS que deve de estar a assumir uma configuração do teclado diferente da do Português.

"Zipei" o programa fonte e compilado em BP7 bem como os BGI's, assim quem quizer já o pode experimentar

https://www.portugal-a-programar.pt/files/file/36-rgb/

Link to comment
Share on other sites

@Thoga31, o facto de carregares numa tecla e aparecer outra, não é do programa mas sim da tua janela janela de DOS que deve de estar a assumir uma configuração do teclado diferente da do Português.

Strange, é que isto só acontece com o teu programa 🙂

Knowledge is free!

Link to comment
Share on other sites

Não vai funcionar... 🙂

Muita gente desconhece, mas o windows tem duas linhas de comandos distintas.

Uma é de 32 bits, e acedes executando o ficheiro cmd e outra é de 16 bits e acedes executando o ficheiro command, ou executando um exe a 16 bits (detecção automática).

Ou seja, se executares o comando Command, terás as teclas todas desconfiguradas, se executares cmd irão estar bem.

Como o programa do passarito é de 16 bits, o windows vai inicia-lo na linha de comandos a 16, e daí te dá as teclas mal "só no dele" - porque só testaste o dele a 16 bits.

Experimenta sacar uns jogos antigos (tipo freeoldies.com ou coisa do genero) e executá-lo para ver o resultado! 😉

Entretanto fiz outro programa de teste. Não está aperfeiçoado visualmente, mas mostra todas as cores possíveis de reproduzir em Pascal.

O resto mantém-se, altera-se só a zona dos ciclos FOR, que passam a ser 3:

for r:=0 to 255 do
  for g:=0 to 255 do
     for b:=0 to 255 do
        begin
           SetRGBPalette(20,r,g,b);
           PutPixel(r+g,g+b,20);
        end;  

Aviso já que é lento a chegar ao destino. 🙂

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.