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

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

Fixed Bug in colorconversion, didn't iterate
ddex1.exe from the DX samples now works,
but bitmap is still mirrored up/down

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