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

Last change on this file since 21483 was 21483, checked in by dmik, 15 years ago

ddraw: Don't define CINTERFACE twice.

File size: 9.0 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
23#ifndef CINTERFACE
24#define CINTERFACE 1
25#endif
26#include "ddraw2d.h"
27#include "clipper.h"
28#include "palette.h"
29#include "surface.h"
30
31#include <misc.h>
32#include "os2palset.h"
33#include "os2fsdd.h"
34#include <winerror.h>
35
36#undef THIS
37#define THIS IDirectDrawPalette*
38
39extern IDirectDrawPaletteVtbl DDrawPaletteTable;
40
41//******************************************************************************
42//******************************************************************************
43OS2IDirectDrawPalette::OS2IDirectDrawPalette( VOID *lpDirectDraw,
44 int palsize,
45 LPPALETTEENTRY lpColorTable,
46 DWORD dwPalFlags) :
47 Referenced(0), os2pal(NULL),
48 lastError(DD_OK), lpDraw(NULL)
49
50{
51 Vtbl = DDrawPaletteTable;
52 lpVtbl = &Vtbl;
53
54 lpDraw = lpDirectDraw;
55 ((OS2IDirectDraw*)lpDraw)->Vtbl.fnAddRef(lpDraw);
56 hDive = ((OS2IDirectDraw*)lpDirectDraw)->GetDiveInstance();
57 dwCaps = dwPalFlags;
58 hDiveCC = ((OS2IDirectDraw*)lpDirectDraw)->GetCCDiveInstance();
59
60 dwSize = palsize;
61 if(256==dwSize)
62 dwCaps |= DDPCAPS_ALLOW256;
63 dwCaps &= ~DDPCAPS_VSYNC; // No sync change
64
65 os2pal = (LPPALETTEENTRY)malloc(palsize*sizeof(PALETTEENTRY));
66 memcpy((char *)os2pal, (char *)lpColorTable, palsize*sizeof(PALETTEENTRY));
67
68 dprintf(("DDRAW: Init CC PalTable"));
69 for(DWORD i=0;i<dwSize;i++)
70 {
71 aPal16[i] = (lpColorTable[i].peBlue>>3) +
72 ((lpColorTable[i].peGreen>>2) <<5) +
73 ((lpColorTable[i].peRed>>3) << 11);
74 dprintf(( " # %d : RGB=%02X/%02X/%02X => %04X\n",
75 i,
76 lpColorTable[i].peRed,
77 lpColorTable[i].peGreen,
78 lpColorTable[i].peBlue,
79 aPal16[i]));
80 aPal24[i] = (lpColorTable[i].peBlue <<8) +
81 (lpColorTable[i].peGreen<<16) +
82 (lpColorTable[i].peRed<<24);
83 }
84}
85//******************************************************************************
86//******************************************************************************
87OS2IDirectDrawPalette::~OS2IDirectDrawPalette()
88{
89 if(os2pal)
90 free(os2pal);
91 ((OS2IDirectDraw*)lpDraw)->Vtbl.fnRelease((OS2IDirectDraw*)lpDraw);
92}
93//******************************************************************************
94//******************************************************************************
95HRESULT WIN32API PalQueryInterface(THIS This, REFIID riid, LPVOID FAR * ppvObj)
96{
97 dprintf(("DDRAW: OS2IDirectDrawPalette::PalQueryInterface"));
98
99 *ppvObj = NULL;
100
101 if(!IsEqualGUID(riid, &IID_IDirectDrawPalette))
102//&& !IsEqualGUID(riid, &IID_IUnknown))
103 return E_NOINTERFACE;
104
105 *ppvObj = This;
106
107 PalAddRef(This);
108 return(DD_OK);
109}
110//******************************************************************************
111//******************************************************************************
112ULONG WIN32API PalAddRef(THIS This)
113{
114 OS2IDirectDrawPalette *me = (OS2IDirectDrawPalette *)This;
115
116 dprintf(("DDRAW: OS2IDirectDrawPalette::PalAddRef %d", me->Referenced+1));
117
118 return (++me->Referenced);
119}
120//******************************************************************************
121//******************************************************************************
122ULONG WIN32API PalRelease(THIS This)
123{
124 OS2IDirectDrawPalette *me = (OS2IDirectDrawPalette *)This;
125
126 dprintf(("DDRAW: OS2IDirectDrawPalette::PalRelease %d", me->Referenced-1));
127
128 if(me->Referenced)
129 {
130 me->Referenced--;
131 if(me->Referenced == 0)
132 {
133 delete(me);
134 return(0);
135 }
136 else
137 return (me->Referenced);
138 }
139 else
140 return(0);
141}
142//******************************************************************************
143//******************************************************************************
144HRESULT WIN32API PalGetCaps(THIS This, LPDWORD lpdwCaps)
145{
146 OS2IDirectDrawPalette *me = (OS2IDirectDrawPalette *)This;
147
148 dprintf(("DDRAW: OS2IDirectDrawPalette::GetCaps"));
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//******************************************************************************
162//******************************************************************************
163HRESULT WIN32API PalGetEntries(THIS This, DWORD dwFlags,
164 DWORD dwBase,
165 DWORD dwNumEntries,
166 LPPALETTEENTRY lpEntries)
167{
168 OS2IDirectDrawPalette *me = (OS2IDirectDrawPalette *)This;
169
170 dprintf(("DDRAW: OS2IDirectDrawPalette::PalGetEntries"));
171
172 if ((NULL == lpEntries) || (0 != dwFlags) || (dwBase > 0xFFFF) ||
173 ((dwBase + dwNumEntries) > me->dwSize))
174 return(DDERR_INVALIDPARAMS);
175
176 memcpy( (char *)lpEntries,
177 (char *)(me->os2pal + dwBase),
178 dwNumEntries*sizeof(PALETTEENTRY));
179
180 return(DD_OK);
181}
182
183//******************************************************************************
184//******************************************************************************
185HRESULT WIN32API PalInitialize(THIS, LPDIRECTDRAW, DWORD, LPPALETTEENTRY)
186{
187 dprintf(("DDRAW: OS2IDirectDrawPalette::PalInitialize"));
188 return(DDERR_ALREADYINITIALIZED);
189}
190//******************************************************************************
191//******************************************************************************
192HRESULT WIN32API PalSetEntries(THIS This, DWORD dwFlags,
193 DWORD dwBase,
194 DWORD dwNumEntries,
195 LPPALETTEENTRY lpNewEntries)
196{
197 OS2IDirectDrawPalette *me = (OS2IDirectDrawPalette *)This;
198
199 dprintf(("DDRAW: OS2IDirectDrawPalette::PalSetEntries\n"));
200 if ((NULL == lpNewEntries) || (0 != dwFlags) || (dwBase > 0xFFFF) ||
201 ((dwBase + dwNumEntries) > me->dwSize))
202 return(DDERR_INVALIDPARAMS);
203
204 memcpy((char *)(me->os2pal + dwBase),
205 (char *)lpNewEntries,
206 dwNumEntries*sizeof(PALETTEENTRY));
207
208 dprintf(("DDRAW: Setting up CC Palentries:\n"));
209 for(DWORD i=0;i<dwNumEntries;i++)
210 {
211 me->aPal16[dwBase+i] = (lpNewEntries[i].peBlue>>3) +
212 ((lpNewEntries[i].peGreen>>2) <<5) +
213 ((lpNewEntries[i].peRed>>3) << 11);
214 dprintf(( " # %d : RGB=%02X/%02X/%02X => %04X\n",
215 dwBase+i,
216 lpNewEntries[i].peRed,
217 lpNewEntries[i].peGreen,
218 lpNewEntries[i].peBlue,
219 me->aPal16[dwBase+i]));
220 me->aPal24[dwBase+i] = (lpNewEntries[i].peBlue <<8) +
221 (lpNewEntries[i].peGreen<<16) +
222 (lpNewEntries[i].peRed<<24);
223 }
224
225 if (8==((OS2IDirectDraw*)me->lpDraw)->dCaps.ulDepth)
226 {
227 if(me->fAttachedToPrimary)
228 me->SetPhysPalette();
229 }
230 else
231 {
232 if(NULL!=((OS2IDirectDraw*)me->lpDraw)->pPrimSurf)
233 ((OS2IDirectDrawSurface*)((OS2IDirectDraw*)me->lpDraw)->pPrimSurf)->ColorConversion(NULL);
234 }
235 return(DD_OK);
236}
237//******************************************************************************
238//******************************************************************************
239void OS2IDirectDrawPalette::SetPhysPalette()
240{
241 // Run appropriate code depening on whether FS DDraw is enabled
242 if (bUseFSDD)
243 SetSVGAPalette(os2pal);
244 else
245 OS2SetPhysPalette(os2pal);
246}
247//******************************************************************************
248//******************************************************************************
249void OS2IDirectDrawPalette::RestorePhysPalette()
250{
251 OS2ResetPhysPalette();
252}
253//******************************************************************************
254//******************************************************************************
255void OS2IDirectDrawPalette::SetIsPrimary(BOOL fNewVal)
256{
257 if(fNewVal==fAttachedToPrimary)
258 return;
259 fAttachedToPrimary = fNewVal;
260
261 /*
262 if(fAttachedToPrimary)
263 {
264 if(NULL!=hDiveCC)
265 DiveSetSourcePalette( hDiveCC,
266 0,
267 255,
268 (PBYTE)os2pal);
269 else
270 SetPhysPalette();
271 }
272 */
273}
274//******************************************************************************
275//******************************************************************************
276IDirectDrawPaletteVtbl DDrawPaletteTable =
277{
278 PalQueryInterface,
279 PalAddRef,
280 PalRelease,
281 PalGetCaps,
282 PalGetEntries,
283 PalInitialize,
284 PalSetEntries
285};
286//******************************************************************************
287//******************************************************************************
Note: See TracBrowser for help on using the repository browser.