1 #include "evas_common.h"
2 #include "evas_engine.h"
5 evas_software_ddraw_init (HWND window,
9 DDSURFACEDESC surface_desc;
10 DDPIXELFORMAT pixel_format;
20 if (!GetClientRect(window, &rect))
23 width = rect.right - rect.left;
24 height = rect.bottom - rect.top;
26 buf->priv.dd.window = window;
28 res = DirectDrawCreate(NULL, &buf->priv.dd.object, NULL);
32 res = buf->priv.dd.object->SetCooperativeLevel(window, DDSCL_NORMAL);
36 res = buf->priv.dd.object->CreateClipper (0, &buf->priv.dd.clipper, NULL);
40 res = buf->priv.dd.clipper->SetHWnd (0, window);
44 memset(&surface_desc, 0, sizeof(surface_desc));
45 surface_desc.dwSize = sizeof(surface_desc);
46 surface_desc.dwFlags = DDSD_CAPS;
47 surface_desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
49 res = buf->priv.dd.object->CreateSurface (&surface_desc, &buf->priv.dd.surface_primary, NULL);
53 res = buf->priv.dd.surface_primary->SetClipper (buf->priv.dd.clipper);
55 goto release_surface_primary;
57 memset (&surface_desc, 0, sizeof(surface_desc));
58 surface_desc.dwSize = sizeof(surface_desc);
59 surface_desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
60 surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
61 surface_desc.dwWidth = width;
62 surface_desc.dwHeight = height;
64 res = buf->priv.dd.object->CreateSurface (&surface_desc, &buf->priv.dd.surface_back, NULL);
66 goto release_surface_primary;
68 ZeroMemory(&pixel_format, sizeof(pixel_format));
69 pixel_format.dwSize = sizeof(pixel_format);
70 buf->priv.dd.surface_primary->GetPixelFormat(&pixel_format);
72 if (pixel_format.dwRGBBitCount != depth)
73 goto release_surface_back;
75 buf->priv.dd.depth = depth;
80 buf->priv.dd.surface_back->Release();
81 release_surface_primary:
82 buf->priv.dd.surface_primary->Release();
84 buf->priv.dd.clipper->Release();
86 buf->priv.dd.object->Release();
92 evas_software_ddraw_shutdown(Outbuf *buf)
97 buf->priv.dd.surface_back->Release();
98 buf->priv.dd.surface_primary->Release();
99 buf->priv.dd.clipper->Release();
100 buf->priv.dd.object->Release();
104 evas_software_ddraw_masks_get(Outbuf *buf)
106 DDPIXELFORMAT pixel_format;
108 ZeroMemory(&pixel_format, sizeof(pixel_format));
109 pixel_format.dwSize = sizeof(pixel_format);
111 if (FAILED(buf->priv.dd.surface_primary->GetPixelFormat(&pixel_format)))
114 buf->priv.mask.r = pixel_format.dwRBitMask;
115 buf->priv.mask.g = pixel_format.dwGBitMask;
116 buf->priv.mask.b = pixel_format.dwBBitMask;
122 evas_software_ddraw_lock(Outbuf *buf,
128 DDSURFACEDESC surface_desc;
130 ZeroMemory(&surface_desc, sizeof(surface_desc));
131 surface_desc.dwSize = sizeof(surface_desc);
133 if (FAILED(buf->priv.dd.surface_back->Lock(NULL,
135 DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,
139 *ddraw_width = surface_desc.dwWidth;
140 *ddraw_height = surface_desc.dwHeight;
141 *ddraw_pitch = surface_desc.lPitch;
142 *ddraw_depth = surface_desc.ddpfPixelFormat.dwRGBBitCount >> 3;
144 return surface_desc.lpSurface;
148 evas_software_ddraw_unlock_and_flip(Outbuf *buf)
154 if (FAILED(buf->priv.dd.surface_back->Unlock(NULL)))
157 /* we figure out where on the primary surface our window lives */
160 ClientToScreen(buf->priv.dd.window, &p);
161 GetClientRect(buf->priv.dd.window, &dst_rect);
162 OffsetRect(&dst_rect, p.x, p.y);
163 SetRect(&src_rect, 0, 0, buf->width, buf->height);
165 /* nothing to do if the function fails, so we don't check the result */
166 buf->priv.dd.surface_primary->Blt(&dst_rect,
167 buf->priv.dd.surface_back,
173 evas_software_ddraw_surface_resize(Outbuf *buf)
175 DDSURFACEDESC surface_desc;
177 buf->priv.dd.surface_back->Release();
178 memset (&surface_desc, 0, sizeof (surface_desc));
179 surface_desc.dwSize = sizeof (surface_desc);
180 /* FIXME: that code does not compile. Must know why */
182 surface_desc.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
183 surface_desc.dwWidth = width;
184 surface_desc.dwHeight = height;
185 buf->priv.dd.surface_back->SetSurfaceDesc(&surface_desc, NULL);
187 surface_desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
188 surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
189 surface_desc.dwWidth = buf->width;
190 surface_desc.dwHeight = buf->height;
191 buf->priv.dd.object->CreateSurface(&surface_desc,
192 &buf->priv.dd.surface_back,