home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / PMPAL.ZIP / PALETTE.C < prev    next >
C/C++ Source or Header  |  1990-01-19  |  5KB  |  203 lines

  1. #if DLL
  2.  
  3. #define DUMMY 0
  4. #define INCL_GPI
  5. #define INCL_WIN
  6. #include "os2.h"
  7. #include <stdio.h>
  8. #include <malloc.h>
  9. int pascal far remapallpalette(int n, ULONG far *c);
  10. int pascal far setpal_vga(USHORT n, ULONG rgb);
  11.  
  12. #else
  13.  
  14. #include <stdio.h>
  15. #include <math.h>
  16.  
  17. extern char far palette_regs[];
  18. typedef unsigned long ULONG;
  19. typedef unsigned char UCHAR;
  20. typedef double real;
  21. int pascal far remapallpalette(int n, ULONG far *c);
  22.  
  23. ULONG c[256];
  24.  
  25. main()
  26. {
  27.    int i;
  28.  
  29.    printf("data=%08lXh\n",(ULONG) palette_regs);
  30.    for (i=0; i<0x100; i++)
  31.    {
  32.       real r,r_AA=(real)0xAA;
  33.       r = sqrt((real)i*2)*32/3.;     /* make a table for conversion */
  34.                                      /* 0x20 -> 0x55   0x80-> 0xAA */
  35.  
  36.       if (r > (real)0xAA)
  37.       {
  38.          r = (r-r_AA)*(((real)0xFF-r_AA)/((real)0xF0-r_AA))+r_AA;
  39.          if (r > (real)0xFF) r = (real)0xFF;
  40.       }
  41.  
  42.       if (!(i & 0x07))
  43.       {
  44.          fputs("\n   ",stdout);
  45.       }
  46.       printf("0x%02X, ",(UCHAR)r);
  47.  
  48.       c[i] = (ULONG)i << ((i%3)*8);
  49.       if (i < 0x10)
  50.         c[i] *= 0x10;
  51.    }
  52.    remapallpalette(0x10,c);
  53.    for (i=0; i<0x10; i++)
  54.       printf("pal%Xh=%02Xh\n",i, palette_regs[i]);
  55. }
  56. #endif
  57.  
  58. #if DLL
  59.  
  60. static USHORT c_ncolors;
  61. static COLOR far ctbl[256];
  62. static UCHAR far pmintensitytable[256] =
  63. {
  64.    0x00, 0x0F, 0x15, 0x1A, 0x1E, 0x21, 0x24, 0x27, 
  65.    0x2A, 0x2D, 0x2F, 0x32, 0x34, 0x36, 0x38, 0x3A, 
  66.    0x3C, 0x3E, 0x40, 0x41, 0x43, 0x45, 0x46, 0x48, 
  67.    0x49, 0x4B, 0x4C, 0x4E, 0x4F, 0x51, 0x52, 0x53, 
  68.    0x55, 0x56, 0x57, 0x59, 0x5A, 0x5B, 0x5C, 0x5E, 
  69.    0x5F, 0x60, 0x61, 0x62, 0x64, 0x65, 0x66, 0x67, 
  70.    0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 
  71.    0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 
  72.    0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 
  73.    0x80, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 
  74.    0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8B, 0x8C, 
  75.    0x8D, 0x8E, 0x8F, 0x8F, 0x90, 0x91, 0x92, 0x93, 
  76.    0x93, 0x94, 0x95, 0x96, 0x96, 0x97, 0x98, 0x99, 
  77.    0x99, 0x9A, 0x9B, 0x9C, 0x9C, 0x9D, 0x9E, 0x9E, 
  78.    0x9F, 0xA0, 0xA1, 0xA1, 0xA2, 0xA3, 0xA3, 0xA4, 
  79.    0xA5, 0xA5, 0xA6, 0xA7, 0xA7, 0xA8, 0xA9, 0xA9, 
  80.    0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAE, 0xAF, 0xB0, 
  81.    0xB1, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB5, 0xB6, 
  82.    0xB7, 0xB8, 0xB8, 0xB9, 0xBA, 0xBB, 0xBB, 0xBC, 
  83.    0xBD, 0xBE, 0xBE, 0xBF, 0xC0, 0xC1, 0xC1, 0xC2, 
  84.    0xC3, 0xC3, 0xC4, 0xC5, 0xC6, 0xC6, 0xC7, 0xC8, 
  85.    0xC8, 0xC9, 0xCA, 0xCB, 0xCB, 0xCC, 0xCD, 0xCD, 
  86.    0xCE, 0xCF, 0xCF, 0xD0, 0xD1, 0xD2, 0xD2, 0xD3, 
  87.    0xD4, 0xD4, 0xD5, 0xD6, 0xD6, 0xD7, 0xD8, 0xD8, 
  88.    0xD9, 0xDA, 0xDA, 0xDB, 0xDC, 0xDC, 0xDD, 0xDD, 
  89.    0xDE, 0xDF, 0xDF, 0xE0, 0xE1, 0xE1, 0xE2, 0xE3, 
  90.    0xE3, 0xE4, 0xE5, 0xE5, 0xE6, 0xE6, 0xE7, 0xE8, 
  91.    0xE8, 0xE9, 0xEA, 0xEA, 0xEB, 0xEB, 0xEC, 0xED, 
  92.    0xED, 0xEE, 0xEE, 0xEF, 0xF0, 0xF0, 0xF1, 0xF1, 
  93.    0xF2, 0xF3, 0xF3, 0xF4, 0xF4, 0xF5, 0xF6, 0xF6, 
  94.    0xF7, 0xF7, 0xF8, 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 
  95.    0xFC, 0xFC, 0xFD, 0xFD, 0xFE, 0xFE, 0xFF, 0xFF
  96. } ;
  97.  
  98. int far pascal gpiconvertcolors(COLOR far *ctbl, USHORT fl)
  99. {
  100.    int i;
  101.    char far *p;
  102.    register USHORT j;
  103.                             /* fl == 0: convert from PM table to real table */
  104.    p = (char far *) ctbl;
  105.    if (!fl)
  106.    {
  107.       for (i=0; i<c_ncolors*sizeof(COLOR); i++)
  108.       {
  109.          p[i] = pmintensitytable[(UCHAR)p[i]];
  110.       }
  111.    }
  112.    else
  113.    {
  114.       for (i=0; i<c_ncolors*sizeof(COLOR); i++)
  115.       {
  116.          j = (UCHAR)p[i];
  117.          j = ((j*3+16)/32);
  118.          j = j*j/2;
  119.          if (j > 0xFF) j = 0xFF;
  120.          p[i] = (UCHAR)j;
  121.       }
  122.    }
  123.    return 1;
  124. }
  125.  
  126. int far pascal gpicolorinit(ULONG far * xscreen, ULONG far *yscreen, USHORT far * ncolors,
  127.    COLOR far * deftbl, ULONG flags)
  128. {
  129.    HPS hps;
  130.    HDC hdc;
  131.    LONG l,x,y;
  132.    char far *p;
  133.    int i;
  134.  
  135.    hps = WinGetPS(HWND_DESKTOP);
  136.  
  137.    hdc = GpiQueryDevice(hps);
  138.    DevQueryCaps(hdc,CAPS_COLORS, 1L, &x);
  139.    c_ncolors = (USHORT) x;
  140.    if (x == 0x1000000L)
  141.       c_ncolors = 24;
  142.    DevQueryCaps(hdc,CAPS_WIDTH,  1L, &x);
  143.    DevQueryCaps(hdc,CAPS_HEIGHT, 1L, &y);
  144.    if (c_ncolors != 24)
  145.    {
  146.       if (ctbl)
  147.       {
  148.          GpiQueryRealColors(hps,LCOLOPT_REALIZED,0L,(ULONG)c_ncolors,(COLOR*)ctbl);
  149.  
  150.          for (i=0; deftbl && i<c_ncolors; i++)    /* copy color table */
  151.              deftbl[i] = ctbl[i];
  152.  
  153.          if (flags & 1L)
  154.             gpiconvertcolors(ctbl,0);
  155.       }
  156.    }
  157.    *ncolors = c_ncolors;
  158.    *xscreen = x;
  159.    *yscreen = y;
  160.    WinReleasePS(hps);
  161.    return TRUE;
  162. }
  163.  
  164. int pascal far gpisetpalette(HPS hps, COLOR far *c, COLOR color, ULONG  fl)
  165. {
  166.    USHORT b = (USHORT)fl;
  167.    UCHAR direct = 0;
  168.  
  169.    if (fl & 0x10000L)
  170.    {
  171.       direct = 1;
  172.       if (color != -1L)
  173.       {
  174.          setpal_vga(b,color);
  175.          if (c)
  176.             c[b] = color;
  177.       }
  178.       else
  179.          remapallpalette(c_ncolors,c ? c : ctbl);
  180.    }
  181.  
  182.    if (hps)
  183.    {
  184.       GpiCreateLogColorTable(hps,LCOL_REALIZABLE,
  185.          LCOLF_CONSECRGB,
  186.          0L, (long)c_ncolors ,(c && !direct) ? c : ctbl);
  187.  
  188.       if (!direct)
  189.       {
  190.          if (c)
  191.             GpiRealizeColorTable(hps);
  192.          else
  193.             GpiUnrealizeColorTable(hps);
  194.       }
  195.    }
  196.    return TRUE;
  197. }
  198. #if DUMMY
  199. int pascal far remapallpalette(int n, ULONG far *c)
  200. {}
  201. #endif
  202. #endif
  203.