source: trunk/src/ddraw/OS2PALETTE.CPP@ 5291

Last change on this file since 5291 was 5291, checked in by mike, 24 years ago

Updates/cleanup for Watcom (not complete)

File size: 8.8 KB
Line 
1/* $Id: OS2PALETTE.CPP,v 1.13 2001-03-09 22:48:46 mike Exp $ */
2
3/*
4 * DX palette class implementation
5 *
6 * Copyright 1998 Sander va Leeuwen
7 * Copyright 1999 Markus Montkowski
8 *
9 * Project Odin Software License can be found in LICENSE.TXT
10 *
11 */
12
13#include <stdio.h>
14#include <stdlib.h>
15#include <string.h>
16#include <memory.h>
17#define INITGUID
18#include "os2ddraw.h"
19#include "os2clipper.h"
20#include "os2palette.h"
21#include "os2surface.h"
22#define _OS2WIN_H
23#define FAR
24#include <misc.h>
25#include "os2palset.h"
26#include <winerror.h>
27
28#undef THIS
29#define THIS IDirectDrawPalette*
30
31//******************************************************************************
32//******************************************************************************
33OS2IDirectDrawPalette::OS2IDirectDrawPalette( VOID *lpDirectDraw,
34 int palsize,
35 LPPALETTEENTRY lpColorTable,
36 DWORD dwPalFlags) :
37 Referenced(0), os2pal(NULL),
38 lastError(DD_OK), lpDraw(NULL)
39
40{
41 lpVtbl = &Vtbl;
42 Vtbl.AddRef = PalAddRef;
43 Vtbl.Release = PalRelease;
44 Vtbl.QueryInterface = PalQueryInterface;
45 Vtbl.GetCaps = PalGetCaps;
46 Vtbl.GetEntries = PalGetEntries;
47 Vtbl.Initialize = PalInitialize;
48 Vtbl.SetEntries = PalSetEntries;
49
50 lpDraw = lpDirectDraw;
51 ((OS2IDirectDraw*)lpDraw)->Vtbl.AddRef(lpDraw);
52 hDive = ((OS2IDirectDraw*)lpDirectDraw)->GetDiveInstance();
53 dwCaps = dwPalFlags;
54 hDiveCC = ((OS2IDirectDraw*)lpDirectDraw)->GetCCDiveInstance();
55
56 dwSize = palsize;
57 if(256==dwSize)
58 dwCaps |= DDPCAPS_ALLOW256;
59 dwCaps &= ~DDPCAPS_VSYNC; // No sync change
60
61 os2pal = (LPPALETTEENTRY)malloc(palsize*sizeof(PALETTEENTRY));
62 memcpy((char *)os2pal, (char *)lpColorTable, palsize*sizeof(PALETTEENTRY));
63
64 dprintf(("DDRAW: Init CC PalTable"));
65 for(DWORD i=0;i<dwSize;i++)
66 {
67 aPal16[i] = (lpColorTable[i].peBlue>>3) +
68 ((lpColorTable[i].peGreen>>2) <<5) +
69 ((lpColorTable[i].peRed>>3) << 11);
70 dprintf(( " # %d : RGB=%02X/%02X/%02X => %04X\n",
71 i,
72 lpColorTable[i].peRed,
73 lpColorTable[i].peGreen,
74 lpColorTable[i].peBlue,
75 aPal16[i]));
76 aPal24[i] = (lpColorTable[i].peBlue <<8) +
77 (lpColorTable[i].peGreen<<16) +
78 (lpColorTable[i].peRed<<24);
79 }
80}
81//******************************************************************************
82//******************************************************************************
83OS2IDirectDrawPalette::~OS2IDirectDrawPalette()
84{
85 if(os2pal)
86 free(os2pal);
87 ((OS2IDirectDraw*)lpDraw)->Vtbl.Release((OS2IDirectDraw*)lpDraw);
88}
89//******************************************************************************
90//******************************************************************************
91HRESULT __stdcall PalQueryInterface(THIS This, REFIID riid, LPVOID FAR * ppvObj)
92{
93 dprintf(("DDRAW: OS2IDirectDrawPalette::PalQueryInterface\n"));
94
95 *ppvObj = NULL;
96
97 if(!IsEqualGUID(riid, IID_IDirectDrawPalette))
98//&& !IsEqualGUID(riid, IID_IUnknown))
99 return E_NOINTERFACE;
100
101 *ppvObj = This;
102
103 PalAddRef(This);
104 return(DD_OK);
105}
106//******************************************************************************
107//******************************************************************************
108ULONG __stdcall PalAddRef(THIS This)
109{
110 OS2IDirectDrawPalette *me = (OS2IDirectDrawPalette *)This;
111
112 dprintf(("DDRAW: OS2IDirectDrawPalette::PalAddRef %d\n", me->Referenced+1));
113
114 return (++me->Referenced);
115}
116//******************************************************************************
117//******************************************************************************
118ULONG __stdcall PalRelease(THIS This)
119{
120 OS2IDirectDrawPalette *me = (OS2IDirectDrawPalette *)This;
121
122 #ifdef DEBUG
123 dprintf(("DDRAW: OS2IDirectDrawPalette::PalRelease %d\n", me->Referenced-1));
124 #endif
125
126 if(me->Referenced)
127 {
128 me->Referenced--;
129 if(me->Referenced == 0)
130 {
131 delete(me);
132 return(0);
133 }
134 else
135 return (me->Referenced);
136 }
137 else
138 return(0);
139}
140//******************************************************************************
141//******************************************************************************
142HRESULT __stdcall PalGetCaps(THIS This, LPDWORD lpdwCaps)
143{
144 OS2IDirectDrawPalette *me = (OS2IDirectDrawPalette *)This;
145
146 #ifdef DEBUG
147 dprintf(("DDRAW: OS2IDirectDrawPalette::GetCaps\n"));
148 #endif
149
150 if(NULL== lpdwCaps)
151 return(DDERR_INVALIDPARAMS);
152
153 *lpdwCaps = me->dwCaps;
154
155 if(me->fAttachedToPrimary)
156 *lpdwCaps |= DDPCAPS_PRIMARYSURFACE;
157
158 return(DD_OK);
159}
160//******************************************************************************
161//******************************************************************************
162HRESULT __stdcall PalGetEntries(THIS This, DWORD dwFlags,
163 DWORD dwBase,
164 DWORD dwNumEntries,
165 LPPALETTEENTRY lpEntries)
166{
167 OS2IDirectDrawPalette *me = (OS2IDirectDrawPalette *)This;
168
169 dprintf(("DDRAW: OS2IDirectDrawPalette::PalGetEntries\n"));
170
171 if ((NULL == lpEntries) || (0 != dwFlags) || (dwBase > 65536)
172 || ((dwBase + dwNumEntries) > me->dwSize))
173 return(DDERR_INVALIDPARAMS);
174
175 memcpy( (char *)lpEntries,
176 (char *)(me->os2pal + dwBase),
177 dwNumEntries*sizeof(PALETTEENTRY));
178
179 return(DD_OK);
180}
181//******************************************************************************
182//******************************************************************************
183HRESULT __stdcall PalInitialize(THIS, LPDIRECTDRAW, DWORD, LPPALETTEENTRY)
184{
185 dprintf(("DDRAW: OS2IDirectDrawPalette::PalInitialize\n"));
186 return(DDERR_ALREADYINITIALIZED);
187}
188//******************************************************************************
189//******************************************************************************
190HRESULT __stdcall PalSetEntries(THIS This, DWORD dwFlags,
191 DWORD dwBase,
192 DWORD dwNumEntries,
193 LPPALETTEENTRY lpNewEntries)
194{
195 OS2IDirectDrawPalette *me = (OS2IDirectDrawPalette *)This;
196
197 dprintf(("DDRAW: OS2IDirectDrawPalette::PalSetEntries\n"));
198
199 if ((NULL== lpNewEntries) || (0 != dwFlags) || (dwBase > 65536)
200 || ((dwBase + dwNumEntries) > me->dwSize))
201 return(DDERR_INVALIDPARAMS);
202
203 memcpy((char *)(me->os2pal + dwBase),
204 (char *)lpNewEntries,
205 dwNumEntries*sizeof(PALETTEENTRY));
206
207 dprintf(("DDRAW: Setting up CC Palentries:\n"));
208 for(DWORD i=0;i<dwNumEntries;i++)
209 {
210 me->aPal16[dwBase+i] = (lpNewEntries[i].peBlue>>3) +
211 ((lpNewEntries[i].peGreen>>2) <<5) +
212 ((lpNewEntries[i].peRed>>3) << 11);
213 dprintf(( " # %d : RGB=%02X/%02X/%02X => %04X\n",
214 dwBase+i,
215 lpNewEntries[i].peRed,
216 lpNewEntries[i].peGreen,
217 lpNewEntries[i].peBlue,
218 me->aPal16[dwBase+i]));
219 me->aPal24[dwBase+i] = (lpNewEntries[i].peBlue <<8) +
220 (lpNewEntries[i].peGreen<<16) +
221 (lpNewEntries[i].peRed<<24);
222 }
223
224 if(8==((OS2IDirectDraw*)me->lpDraw)->dCaps.ulDepth)
225 {
226 if(me->fAttachedToPrimary)
227 me->SetPhysPalette();
228 }
229 else
230 {
231 if(NULL!=((OS2IDirectDraw*)me->lpDraw)->pPrimSurf)
232 ((OS2IDirectDrawSurface*)((OS2IDirectDraw*)me->lpDraw)->pPrimSurf)->ColorConversion(NULL);
233 }
234 return(DD_OK);
235}
236//******************************************************************************
237//******************************************************************************
238void OS2IDirectDrawPalette::SetPhysPalette()
239{
240 OS2SetPhysPalette(os2pal);
241}
242//******************************************************************************
243//******************************************************************************
244void OS2IDirectDrawPalette::RestorePhysPalette()
245{
246 OS2ResetPhysPalette();
247}
248//******************************************************************************
249//******************************************************************************
250void OS2IDirectDrawPalette::SetIsPrimary(BOOL fNewVal)
251{
252 if(fNewVal==fAttachedToPrimary)
253 return;
254 fAttachedToPrimary = fNewVal;
255
256 /*
257 if(fAttachedToPrimary)
258 {
259 if(NULL!=hDiveCC)
260 DiveSetSourcePalette( hDiveCC,
261 0,
262 255,
263 (PBYTE)os2pal);
264 else
265 SetPhysPalette();
266 }
267 */
268}
269//******************************************************************************
270//******************************************************************************
271
Note: See TracBrowser for help on using the repository browser.