move around - flatter.
[profile/ivi/evas.git] / src / modules / engines / software_16_ddraw / evas_ddraw_buffer.cpp
1 #include "evas_common.h"
2 #include "evas_engine.h"
3
4
5 DDraw_Output_Buffer *
6 evas_software_ddraw_output_buffer_new(HWND                window,
7                                       LPDIRECTDRAW        object,
8                                       LPDIRECTDRAWSURFACE surface_primary,
9                                       LPDIRECTDRAWSURFACE surface_back,
10                                       LPDIRECTDRAWSURFACE surface_source,
11                                       int                 width,
12                                       int                 height)
13 {
14    DDSURFACEDESC        surface_desc;
15    DDraw_Output_Buffer *ddob;
16
17    ddob = (DDraw_Output_Buffer *)calloc(1, sizeof(DDraw_Output_Buffer));
18    if (!ddob) return NULL;
19
20    ddob->dd.window = window;
21    ddob->dd.object = object;
22    ddob->dd.surface_primary = surface_primary;
23    ddob->dd.surface_back = surface_back;
24    ddob->dd.surface_source = surface_source;
25    ddob->width = width;
26    ddob->height = height;
27    ddob->pitch = width * 2;
28
29    ZeroMemory(&surface_desc, sizeof(surface_desc));
30    surface_desc.dwSize = sizeof(surface_desc);
31
32    if (FAILED(ddob->dd.surface_source->Lock(NULL,
33                                             &surface_desc,
34                                             DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,
35                                             NULL)))
36      {
37         free(ddob);
38         return NULL;
39      }
40
41    ddob->im.pixels = (DATA16 *)surface_desc.lpSurface;
42    ddob->im.w = width;
43    ddob->im.h = height;
44    ddob->im.stride = width;
45    ddob->im.references = 1;
46
47    if (FAILED(ddob->dd.surface_source->Unlock(NULL)))
48      {
49         free(ddob);
50         return NULL;
51      }
52
53    return ddob;
54 }
55
56 void
57 evas_software_ddraw_output_buffer_free(DDraw_Output_Buffer *ddob, int sync)
58 {
59    free(ddob);
60 }
61
62 void
63 evas_software_ddraw_output_buffer_paste(DDraw_Output_Buffer *ddob)
64 {
65    RECT  dst_rect;
66    RECT  src_rect;
67    POINT p;
68
69    SetRect(&src_rect, 0, 0, ddob->width, ddob->height);
70
71    if (FAILED(ddob->dd.surface_back->BltFast(0, 0,
72                                              ddob->dd.surface_source,
73                                              &src_rect,
74                                              DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT)))
75      return;
76
77    p.x = 0;
78    p.y = 0;
79    ClientToScreen(ddob->dd.window, &p);
80    GetClientRect(ddob->dd.window, &dst_rect);
81    OffsetRect(&dst_rect, p.x, p.y);
82    ddob->dd.surface_primary->Blt(&dst_rect,
83                                  ddob->dd.surface_back, &src_rect,
84                                  DDBLT_WAIT, NULL);
85 }