source: trunk/src/ddraw/palette.cpp

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

Fixed broken build after r21492 by sorting out a huuuuge wagon of duplicates, wrong include order and other dirty mess.

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