0
|
1 #include "dmlib.h"
|
|
2
|
|
3
|
|
4 void dmFillRect(SDL_Surface *screen, int x0, int y0, int x1, int y1, Uint32 col)
|
|
5 {
|
|
6 SDL_Rect rc;
|
|
7 rc.x = x0;
|
|
8 rc.y = y0;
|
|
9 rc.w = x1 - x0 + 1;
|
|
10 rc.h = y1 - y0 + 1;
|
|
11 SDL_FillRect(screen, &rc, col);
|
|
12 }
|
|
13
|
|
14 #define DM_SWAP(T, A, B) { if ((B) < (A)) { T swtmp = (B); B = (A); A = swtmp; } }
|
|
15
|
|
16 void dmDrawHLine(SDL_Surface *screen, int x0, int x1, int yc, const Uint32 col)
|
|
17 {
|
|
18 int x;
|
|
19 const int bpp = screen->format->BytesPerPixel,
|
|
20 cx0 = screen->clip_rect.x, cy0 = screen->clip_rect.y,
|
|
21 cx1 = screen->clip_rect.x + screen->clip_rect.w - 1,
|
|
22 cy1 = screen->clip_rect.y + screen->clip_rect.h - 1;
|
|
23
|
|
24 DM_SWAP(int, x0, x1);
|
|
25 if (yc < cy0|| yc > cy1 || x1 < cx0 || x0 > cx1) return;
|
|
26 if (x0 < cx0) x0 = cx0;
|
|
27 if (x1 > cx1) x1 = cx1;
|
|
28
|
|
29 Uint8 *pix = screen->pixels + yc * screen->pitch + (x0 * bpp);
|
|
30 switch (screen->format->BitsPerPixel)
|
|
31 {
|
|
32 case 8:
|
|
33 for (x = x0; x <= x1; x++)
|
|
34 *pix++ = col;
|
|
35 break;
|
|
36
|
|
37 case 15:
|
|
38 case 16:
|
|
39 {
|
|
40 Uint16 *p = (Uint16 *) pix;
|
|
41 for (x = x0; x <= x1; x++)
|
|
42 *p++ = col;
|
|
43 }
|
|
44 break;
|
|
45
|
|
46 case 24:
|
|
47 for (x = x0; x <= x1; x++)
|
|
48 {
|
|
49 *pix++ = col;
|
|
50 *pix++ = col;
|
|
51 *pix++ = col;
|
|
52 }
|
|
53 break;
|
|
54
|
|
55 case 32:
|
|
56 {
|
|
57 Uint32 *p = (Uint32 *) pix;
|
|
58 for (x = x0; x <= x1; x++)
|
|
59 *p++ = col;
|
|
60 }
|
|
61 break;
|
|
62 }
|
|
63 }
|
|
64
|
|
65
|
|
66 void dmDrawVLine(SDL_Surface *screen, int y0, int y1, int xc, const Uint32 col)
|
|
67 {
|
|
68 int y;
|
|
69 const int bpp = screen->format->BytesPerPixel,
|
|
70 pitch = screen->pitch / bpp,
|
|
71 cx0 = screen->clip_rect.x, cy0 = screen->clip_rect.y,
|
|
72 cx1 = screen->clip_rect.x + screen->clip_rect.w - 1,
|
|
73 cy1 = screen->clip_rect.y + screen->clip_rect.h - 1;
|
|
74
|
|
75 DM_SWAP(int, y0, y1);
|
|
76 if (xc < cx0 || xc > cx1 || y1 < cy0 || y0 > cy1) return;
|
|
77 if (y0 < cy0) y0 = cy0;
|
|
78 if (y1 > cy1) y1 = cy1;
|
|
79
|
|
80 Uint8 *pix = screen->pixels + y0 * screen->pitch + (xc * bpp);
|
|
81 switch (screen->format->BitsPerPixel)
|
|
82 {
|
|
83 case 8:
|
|
84 for (y = y0; y <= y1; y++, pix += pitch)
|
|
85 *pix = col;
|
|
86 break;
|
|
87
|
|
88 case 16:
|
|
89 case 15:
|
|
90 {
|
|
91 Uint16 *p = (Uint16 *) pix;
|
|
92 for (y = y0; y <= y1; y++, p += pitch)
|
|
93 *p = col;
|
|
94 }
|
|
95 break;
|
|
96
|
|
97 case 24:
|
|
98 for (y = y0; y <= y1; y++, pix += pitch)
|
|
99 pix[0] = pix[1] = pix[2] = col;
|
|
100 break;
|
|
101
|
|
102 case 32:
|
|
103 {
|
|
104 Uint32 *p = (Uint32 *) pix;
|
|
105 for (y = y0; y <= y1; y++, p += pitch)
|
|
106 *p = col;
|
|
107 }
|
|
108 break;
|
|
109 }
|
|
110 }
|
|
111
|
|
112
|
|
113 void dmDrawBox3D(SDL_Surface *screen, int x0, int y0, int x1, int y1, Uint32 bgcol, Uint32 ucol, Uint32 dcol)
|
|
114 {
|
|
115 SDL_Rect rc;
|
|
116
|
|
117 rc.x = x0 + 1;
|
|
118 rc.y = y0 + 1;
|
|
119 rc.w = x1 - x0 - 1;
|
|
120 rc.h = y1 - y0 - 1;
|
|
121 SDL_FillRect(screen, &rc, bgcol);
|
|
122
|
|
123 dmDrawHLine(screen, x0 , x1 - 1, y0, ucol);
|
|
124 dmDrawHLine(screen, x0 + 1, x1 , y1, dcol);
|
|
125
|
|
126 dmDrawVLine(screen, y0 , y1 - 1, x0, ucol);
|
|
127 dmDrawVLine(screen, y0 + 1, y1 , x1, dcol);
|
|
128 }
|
|
129
|
|
130
|
|
131 void dmClearSurface(SDL_Surface *screen, const Uint32 col)
|
|
132 {
|
|
133 SDL_FillRect(screen, NULL, col);
|
|
134 }
|
|
135
|
|
136
|
|
137 Uint32 dmMapRGB(SDL_Surface *screen, int r, int g, int b)
|
|
138 {
|
|
139 return SDL_MapRGB(screen->format, r, g, b);
|
|
140 }
|
|
141
|
|
142
|
|
143 Uint32 dmMapRGBA(SDL_Surface *screen, int r, int g, int b, int a)
|
|
144 {
|
|
145 return SDL_MapRGBA(screen->format, r, g, b, a);
|
|
146 }
|
|
147
|
|
148
|
|
149 int dmDirectBlitSurface(SDL_Surface *bmp, SDL_Surface *screen)
|
|
150 {
|
|
151 return SDL_BlitSurface(bmp, NULL, screen, NULL);
|
|
152 }
|