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

Last change on this file since 2174 was 2174, checked in by hugh, 26 years ago

Added ODIn lic header with ID to all files where missing

Cleaned up Surface handling by movefing colorfill and
colorconversion into own files and use functionpointers
setup during creation.

updated makefile to add files

removed inhertiance from IBASE in DDrectangle class

File size: 8.9 KB
Line 
1/* $Id: OS2PALETTE.CPP,v 1.12 1999-12-21 01:28:16 hugh 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 #ifdef DEBUG
94 dprintf(("DDRAW: OS2IDirectDrawPalette::PalQueryInterface\n"));
95 #endif
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 __stdcall PalAddRef(THIS This)
111{
112 OS2IDirectDrawPalette *me = (OS2IDirectDrawPalette *)This;
113
114 #ifdef DEBUG
115 dprintf(("DDRAW: OS2IDirectDrawPalette::PalAddRef %d\n", me->Referenced+1));
116 #endif
117
118 return (++me->Referenced);
119}
120//******************************************************************************
121//******************************************************************************
122ULONG __stdcall PalRelease(THIS This)
123{
124 OS2IDirectDrawPalette *me = (OS2IDirectDrawPalette *)This;
125
126 #ifdef DEBUG
127 dprintf(("DDRAW: OS2IDirectDrawPalette::PalRelease %d\n", me->Referenced-1));
128 #endif
129
130 if(me->Referenced)
131 {
132 me->Referenced--;
133 if(me->Referenced == 0)
134 {
135 delete(me);
136 return(0);
137 }
138 else
139 return (me->Referenced);
140 }
141 else
142 return(0);
143}
144//******************************************************************************
145//******************************************************************************
146HRESULT __stdcall PalGetCaps(THIS This, LPDWORD lpdwCaps)
147{
148 OS2IDirectDrawPalette *me = (OS2IDirectDrawPalette *)This;
149
150 #ifdef DEBUG
151 dprintf(("DDRAW: OS2IDirectDrawPalette::GetCaps\n"));
152 #endif
153
154 if(NULL== lpdwCaps)
155 return(DDERR_INVALIDPARAMS);
156
157 *lpdwCaps = me->dwCaps;
158
159 if(me->fAttachedToPrimary)
160 *lpdwCaps |= DDPCAPS_PRIMARYSURFACE;
161
162 return(DD_OK);
163}
164//******************************************************************************
165//******************************************************************************
166HRESULT __stdcall PalGetEntries(THIS This, DWORD dwFlags,
167 DWORD dwBase,
168 DWORD dwNumEntries,
169 LPPALETTEENTRY lpEntries)
170{
171 OS2IDirectDrawPalette *me = (OS2IDirectDrawPalette *)This;
172
173 #ifdef DEBUG
174 dprintf(("DDRAW: OS2IDirectDrawPalette::PalGetEntries\n"));
175 #endif
176
177 if( (NULL== lpEntries) ||(0!=dwFlags) ||(dwBase<0) ||((dwBase + dwNumEntries)>me->dwSize) )
178 return(DDERR_INVALIDPARAMS);
179
180 memcpy( (char *)lpEntries,
181 (char *)(me->os2pal + dwBase),
182 dwNumEntries*sizeof(PALETTEENTRY));
183
184 return(DD_OK);
185}
186//******************************************************************************
187//******************************************************************************
188HRESULT __stdcall PalInitialize(THIS, LPDIRECTDRAW, DWORD, LPPALETTEENTRY)
189{
190 #ifdef DEBUG
191 dprintf(("DDRAW: OS2IDirectDrawPalette::PalInitialize\n"));
192 #endif
193 return(DDERR_ALREADYINITIALIZED);
194}
195//******************************************************************************
196//******************************************************************************
197HRESULT __stdcall PalSetEntries(THIS This, DWORD dwFlags,
198 DWORD dwBase,
199 DWORD dwNumEntries,
200 LPPALETTEENTRY lpNewEntries)
201{
202 OS2IDirectDrawPalette *me = (OS2IDirectDrawPalette *)This;
203
204 #ifdef DEBUG
205 dprintf(("DDRAW: OS2IDirectDrawPalette::PalSetEntries\n"));
206 #endif
207 if( (NULL== lpNewEntries) ||(0!=dwFlags) ||(dwBase<0) ||((dwBase + dwNumEntries)>me->dwSize) )
208 return(DDERR_INVALIDPARAMS);
209
210 memcpy((char *)(me->os2pal + dwBase),
211 (char *)lpNewEntries,
212 dwNumEntries*sizeof(PALETTEENTRY));
213
214 dprintf(("DDRAW: Setting up CC Palentries:\n"));
215 for(DWORD i=0;i<dwNumEntries;i++)
216 {
217 me->aPal16[dwBase+i] = (lpNewEntries[i].peBlue>>3) +
218 ((lpNewEntries[i].peGreen>>2) <<5) +
219 ((lpNewEntries[i].peRed>>3) << 11);
220 dprintf(( " # %d : RGB=%02X/%02X/%02X => %04X\n",
221 dwBase+i,
222 lpNewEntries[i].peRed,
223 lpNewEntries[i].peGreen,
224 lpNewEntries[i].peBlue,
225 me->aPal16[dwBase+i]));
226 me->aPal24[dwBase+i] = (lpNewEntries[i].peBlue <<8) +
227 (lpNewEntries[i].peGreen<<16) +
228 (lpNewEntries[i].peRed<<24);
229 }
230
231 if(8==((OS2IDirectDraw*)me->lpDraw)->dCaps.ulDepth)
232 {
233 if(me->fAttachedToPrimary)
234 me->SetPhysPalette();
235 }
236 else
237 {
238 if(NULL!=((OS2IDirectDraw*)me->lpDraw)->pPrimSurf)
239 ((OS2IDirectDrawSurface*)((OS2IDirectDraw*)me->lpDraw)->pPrimSurf)->ColorConversion(NULL);
240 }
241 return(DD_OK);
242}
243//******************************************************************************
244//******************************************************************************
245void OS2IDirectDrawPalette::SetPhysPalette()
246{
247 OS2SetPhysPalette(os2pal);
248}
249//******************************************************************************
250//******************************************************************************
251void OS2IDirectDrawPalette::RestorePhysPalette()
252{
253 OS2ResetPhysPalette();
254}
255//******************************************************************************
256//******************************************************************************
257void OS2IDirectDrawPalette::SetIsPrimary(BOOL fNewVal)
258{
259 if(fNewVal==fAttachedToPrimary)
260 return;
261 fAttachedToPrimary = fNewVal;
262
263 /*
264 if(fAttachedToPrimary)
265 {
266 if(NULL!=hDiveCC)
267 DiveSetSourcePalette( hDiveCC,
268 0,
269 255,
270 (PBYTE)os2pal);
271 else
272 SetPhysPalette();
273 }
274 */
275}
276//******************************************************************************
277//******************************************************************************
278
Note: See TracBrowser for help on using the repository browser.