source: trunk/src/ddraw/palette.cpp@ 9560

Last change on this file since 9560 was 9560, checked in by sandervl, 23 years ago

Cleanup

File size: 8.9 KB
Line 
1/* $Id: palette.cpp,v 1.2 2002-12-29 14:11:02 sandervl Exp $ */
2
3/*
4 * DX palette class implementation
5 *
6 * Copyright 1998 Sander van Leeuwen
7 * Copyright 1999 Markus Montkowski
8 *
9 * Project Odin Software License can be found in LICENSE.TXT
10 *
11 */
12
13#define _OS2WIN_H
14#define FAR
15
16#include <odin.h>
17#include <winbase.h>
18#include <stdio.h>
19#include <stdlib.h>
20#include <string.h>
21#include <memory.h>
22#define INITGUID
23#include "ddraw2d.h"
24#include "clipper.h"
25#include "palette.h"
26#include "surface.h"
27#include <misc.h>
28#include "os2palset.h"
29#include "os2fsdd.h"
30#include <winerror.h>
31
32#undef THIS
33#define THIS IDirectDrawPalette*
34
35extern IDirectDrawPaletteVtbl DDrawPaletteTable;
36
37//******************************************************************************
38//******************************************************************************
39OS2IDirectDrawPalette::OS2IDirectDrawPalette( VOID *lpDirectDraw,
40 int palsize,
41 LPPALETTEENTRY lpColorTable,
42 DWORD dwPalFlags) :
43 Referenced(0), os2pal(NULL),
44 lastError(DD_OK), lpDraw(NULL)
45
46{
47 Vtbl = DDrawPaletteTable;
48 lpVtbl = &Vtbl;
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 WIN32API PalQueryInterface(THIS This, REFIID riid, LPVOID FAR * ppvObj)
92{
93 dprintf(("DDRAW: OS2IDirectDrawPalette::PalQueryInterface"));
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 WIN32API PalAddRef(THIS This)
109{
110 OS2IDirectDrawPalette *me = (OS2IDirectDrawPalette *)This;
111
112 dprintf(("DDRAW: OS2IDirectDrawPalette::PalAddRef %d", me->Referenced+1));
113
114 return (++me->Referenced);
115}
116//******************************************************************************
117//******************************************************************************
118ULONG WIN32API PalRelease(THIS This)
119{
120 OS2IDirectDrawPalette *me = (OS2IDirectDrawPalette *)This;
121
122 dprintf(("DDRAW: OS2IDirectDrawPalette::PalRelease %d", me->Referenced-1));
123
124 if(me->Referenced)
125 {
126 me->Referenced--;
127 if(me->Referenced == 0)
128 {
129 delete(me);
130 return(0);
131 }
132 else
133 return (me->Referenced);
134 }
135 else
136 return(0);
137}
138//******************************************************************************
139//******************************************************************************
140HRESULT WIN32API PalGetCaps(THIS This, LPDWORD lpdwCaps)
141{
142 OS2IDirectDrawPalette *me = (OS2IDirectDrawPalette *)This;
143
144 dprintf(("DDRAW: OS2IDirectDrawPalette::GetCaps"));
145
146 if(NULL== lpdwCaps)
147 return(DDERR_INVALIDPARAMS);
148
149 *lpdwCaps = me->dwCaps;
150
151 if(me->fAttachedToPrimary)
152 *lpdwCaps |= DDPCAPS_PRIMARYSURFACE;
153
154 return(DD_OK);
155}
156
157//******************************************************************************
158//******************************************************************************
159HRESULT WIN32API PalGetEntries(THIS This, DWORD dwFlags,
160 DWORD dwBase,
161 DWORD dwNumEntries,
162 LPPALETTEENTRY lpEntries)
163{
164 OS2IDirectDrawPalette *me = (OS2IDirectDrawPalette *)This;
165
166 dprintf(("DDRAW: OS2IDirectDrawPalette::PalGetEntries"));
167
168 if ((NULL == lpEntries) || (0 != dwFlags) || (dwBase > 0xFFFF) ||
169 ((dwBase + dwNumEntries) > me->dwSize))
170 return(DDERR_INVALIDPARAMS);
171
172 memcpy( (char *)lpEntries,
173 (char *)(me->os2pal + dwBase),
174 dwNumEntries*sizeof(PALETTEENTRY));
175
176 return(DD_OK);
177}
178
179//******************************************************************************
180//******************************************************************************
181HRESULT WIN32API PalInitialize(THIS, LPDIRECTDRAW, DWORD, LPPALETTEENTRY)
182{
183 dprintf(("DDRAW: OS2IDirectDrawPalette::PalInitialize"));
184 return(DDERR_ALREADYINITIALIZED);
185}
186//******************************************************************************
187//******************************************************************************
188HRESULT WIN32API PalSetEntries(THIS This, DWORD dwFlags,
189 DWORD dwBase,
190 DWORD dwNumEntries,
191 LPPALETTEENTRY lpNewEntries)
192{
193 OS2IDirectDrawPalette *me = (OS2IDirectDrawPalette *)This;
194
195 dprintf(("DDRAW: OS2IDirectDrawPalette::PalSetEntries\n"));
196 if ((NULL == lpNewEntries) || (0 != dwFlags) || (dwBase > 0xFFFF) ||
197 ((dwBase + dwNumEntries) > me->dwSize))
198 return(DDERR_INVALIDPARAMS);
199
200 memcpy((char *)(me->os2pal + dwBase),
201 (char *)lpNewEntries,
202 dwNumEntries*sizeof(PALETTEENTRY));
203
204 dprintf(("DDRAW: Setting up CC Palentries:\n"));
205 for(DWORD i=0;i<dwNumEntries;i++)
206 {
207 me->aPal16[dwBase+i] = (lpNewEntries[i].peBlue>>3) +
208 ((lpNewEntries[i].peGreen>>2) <<5) +
209 ((lpNewEntries[i].peRed>>3) << 11);
210 dprintf(( " # %d : RGB=%02X/%02X/%02X => %04X\n",
211 dwBase+i,
212 lpNewEntries[i].peRed,
213 lpNewEntries[i].peGreen,
214 lpNewEntries[i].peBlue,
215 me->aPal16[dwBase+i]));
216 me->aPal24[dwBase+i] = (lpNewEntries[i].peBlue <<8) +
217 (lpNewEntries[i].peGreen<<16) +
218 (lpNewEntries[i].peRed<<24);
219 }
220
221 if (8==((OS2IDirectDraw*)me->lpDraw)->dCaps.ulDepth)
222 {
223 if(me->fAttachedToPrimary)
224 me->SetPhysPalette();
225 }
226 else
227 {
228 if(NULL!=((OS2IDirectDraw*)me->lpDraw)->pPrimSurf)
229 ((OS2IDirectDrawSurface*)((OS2IDirectDraw*)me->lpDraw)->pPrimSurf)->ColorConversion(NULL);
230 }
231 return(DD_OK);
232}
233//******************************************************************************
234//******************************************************************************
235void OS2IDirectDrawPalette::SetPhysPalette()
236{
237 // Run appropriate code depening on whether FS DDraw is enabled
238 if (bUseFSDD)
239 SetSVGAPalette(os2pal);
240 else
241 OS2SetPhysPalette(os2pal);
242}
243//******************************************************************************
244//******************************************************************************
245void OS2IDirectDrawPalette::RestorePhysPalette()
246{
247 OS2ResetPhysPalette();
248}
249//******************************************************************************
250//******************************************************************************
251void OS2IDirectDrawPalette::SetIsPrimary(BOOL fNewVal)
252{
253 if(fNewVal==fAttachedToPrimary)
254 return;
255 fAttachedToPrimary = fNewVal;
256
257 /*
258 if(fAttachedToPrimary)
259 {
260 if(NULL!=hDiveCC)
261 DiveSetSourcePalette( hDiveCC,
262 0,
263 255,
264 (PBYTE)os2pal);
265 else
266 SetPhysPalette();
267 }
268 */
269}
270//******************************************************************************
271//******************************************************************************
272IDirectDrawPaletteVtbl DDrawPaletteTable =
273{
274 PalQueryInterface,
275 PalAddRef,
276 PalRelease,
277 PalGetCaps,
278 PalGetEntries,
279 PalInitialize,
280 PalSetEntries
281};
282//******************************************************************************
283//******************************************************************************
Note: See TracBrowser for help on using the repository browser.