/[rdesktop]/jpeg/rdesktop/trunk/cache.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /jpeg/rdesktop/trunk/cache.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 774 - (hide annotations)
Sat Oct 2 00:40:13 2004 UTC (19 years, 7 months ago) by jsorg71
Original Path: sourceforge.net/trunk/rdesktop/cache.c
File MIME type: text/plain
File size: 6816 byte(s)
don't remove lru bitmap unless its a rdp5 connection

1 matty 9 /*
2     rdesktop: A Remote Desktop Protocol client.
3     Cache routines
4 matthewc 207 Copyright (C) Matthew Chapman 1999-2002
5 jsorg71 774
6 matty 9 This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10 jsorg71 774
11 matty 9 This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     GNU General Public License for more details.
15 jsorg71 774
16 matty 9 You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19     */
20    
21 matty 10 #include "rdesktop.h"
22 matty 9
23 matty 10 #define NUM_ELEMENTS(array) (sizeof(array) / sizeof(array[0]))
24 jsorg71 725 #define TOUCH(id, idx) (g_bmpcache[id][idx].usage = ++g_stamp)
25     #define IS_PERSISTENT(id) (g_pstcache_fd[id] > 0)
26 matty 10
27 jsorg71 725 extern int g_pstcache_fd[];
28 jsorg71 774 extern BOOL g_use_rdp5;
29 matty 10
30 jsorg71 725 uint32 g_stamp;
31     int g_num_bitmaps_in_memory[3];
32    
33    
34 matty 10 /* BITMAP CACHE */
35 jsorg71 725 static BMPCACHEENTRY g_bmpcache[3][0xa00];
36 jsorg71 730 static HBITMAP g_volatile_bc[3];
37 matty 10
38 jsorg71 725 /* Remove the least-recently used bitmap from the cache */
39     void
40     cache_remove_lru_bitmap(uint8 cache_id)
41     {
42     int i;
43     uint16 cache_idx = 0;
44 astrand 738 uint32 m = (uint32) - 1;
45 jsorg71 725 BMPCACHEENTRY *pbce;
46    
47     for (i = 0; i < NUM_ELEMENTS(g_bmpcache[cache_id]); i++)
48     {
49     if (g_bmpcache[cache_id][i].bitmap && g_bmpcache[cache_id][i].usage < m)
50     {
51     cache_idx = i;
52     m = g_bmpcache[cache_id][i].usage;
53     }
54     }
55    
56     pbce = &g_bmpcache[cache_id][cache_idx];
57     ui_destroy_bitmap(pbce->bitmap);
58     --g_num_bitmaps_in_memory[cache_id];
59     pbce->bitmap = 0;
60     pbce->usage = 0;
61     }
62    
63 matty 10 /* Retrieve a bitmap from the cache */
64 matty 25 HBITMAP
65     cache_get_bitmap(uint8 cache_id, uint16 cache_idx)
66 matty 9 {
67 jsorg71 725 HBITMAP *pbitmap;
68 matty 9
69 jsorg71 379 if ((cache_id < NUM_ELEMENTS(g_bmpcache)) && (cache_idx < NUM_ELEMENTS(g_bmpcache[0])))
70 matty 9 {
71 jsorg71 725 pbitmap = &g_bmpcache[cache_id][cache_idx].bitmap;
72     if ((*pbitmap != 0) || pstcache_load_bitmap(cache_id, cache_idx))
73     {
74     if (IS_PERSISTENT(cache_id))
75     TOUCH(cache_id, cache_idx);
76    
77     return *pbitmap;
78     }
79 matty 9 }
80 jsorg71 730 else if ((cache_id < NUM_ELEMENTS(g_volatile_bc)) && (cache_idx == 0x7fff))
81     {
82     return g_volatile_bc[cache_id];
83     }
84 matty 9
85 matty 30 error("get bitmap %d:%d\n", cache_id, cache_idx);
86 matty 9 return NULL;
87     }
88    
89 matty 10 /* Store a bitmap in the cache */
90 matty 25 void
91 jsorg71 725 cache_put_bitmap(uint8 cache_id, uint16 cache_idx, HBITMAP bitmap, uint32 stamp)
92 matty 9 {
93     HBITMAP old;
94    
95 jsorg71 379 if ((cache_id < NUM_ELEMENTS(g_bmpcache)) && (cache_idx < NUM_ELEMENTS(g_bmpcache[0])))
96 matty 9 {
97 jsorg71 725 old = g_bmpcache[cache_id][cache_idx].bitmap;
98 matty 9 if (old != NULL)
99 jsorg71 725 {
100 matty 10 ui_destroy_bitmap(old);
101 jsorg71 725 }
102 jsorg71 774 else if (g_use_rdp5)
103 jsorg71 725 {
104     if (++g_num_bitmaps_in_memory[cache_id] > BMPCACHE2_C2_CELLS)
105     cache_remove_lru_bitmap(cache_id);
106     }
107 matty 9
108 jsorg71 725 g_bmpcache[cache_id][cache_idx].bitmap = bitmap;
109     g_bmpcache[cache_id][cache_idx].usage = stamp;
110 matty 9 }
111 jsorg71 730 else if ((cache_id < NUM_ELEMENTS(g_volatile_bc)) && (cache_idx == 0x7fff))
112     {
113     old = g_volatile_bc[cache_id];
114     if (old != NULL)
115     ui_destroy_bitmap(old);
116     g_volatile_bc[cache_id] = bitmap;
117     }
118 matty 9 else
119     {
120 matty 30 error("put bitmap %d:%d\n", cache_id, cache_idx);
121 matty 9 }
122     }
123    
124 jsorg71 725 /* Updates the persistent bitmap cache MRU information on exit */
125     void
126     cache_save_state(void)
127     {
128     int id, idx;
129 matty 10
130 jsorg71 725 for (id = 0; id < NUM_ELEMENTS(g_bmpcache); id++)
131     if (IS_PERSISTENT(id))
132     for (idx = 0; idx < NUM_ELEMENTS(g_bmpcache[id]); idx++)
133     pstcache_touch_bitmap(id, idx, g_bmpcache[id][idx].usage);
134     }
135    
136    
137 matty 10 /* FONT CACHE */
138 jsorg71 379 static FONTGLYPH g_fontcache[12][256];
139 matty 10
140     /* Retrieve a glyph from the font cache */
141 matty 25 FONTGLYPH *
142     cache_get_font(uint8 font, uint16 character)
143 matty 9 {
144 matty 10 FONTGLYPH *glyph;
145 matty 9
146 jsorg71 379 if ((font < NUM_ELEMENTS(g_fontcache)) && (character < NUM_ELEMENTS(g_fontcache[0])))
147 matty 9 {
148 jsorg71 379 glyph = &g_fontcache[font][character];
149 matty 9 if (glyph->pixmap != NULL)
150     return glyph;
151     }
152    
153 matty 30 error("get font %d:%d\n", font, character);
154 matty 9 return NULL;
155     }
156    
157 matty 10 /* Store a glyph in the font cache */
158 matty 25 void
159     cache_put_font(uint8 font, uint16 character, uint16 offset,
160     uint16 baseline, uint16 width, uint16 height, HGLYPH pixmap)
161 matty 9 {
162 matty 10 FONTGLYPH *glyph;
163 matty 9
164 jsorg71 379 if ((font < NUM_ELEMENTS(g_fontcache)) && (character < NUM_ELEMENTS(g_fontcache[0])))
165 matty 9 {
166 jsorg71 379 glyph = &g_fontcache[font][character];
167 matty 9 if (glyph->pixmap != NULL)
168 matty 10 ui_destroy_glyph(glyph->pixmap);
169 matty 9
170 matty 20 glyph->offset = offset;
171 matty 9 glyph->baseline = baseline;
172     glyph->width = width;
173     glyph->height = height;
174     glyph->pixmap = pixmap;
175     }
176     else
177     {
178 matty 30 error("put font %d:%d\n", font, character);
179 matty 9 }
180     }
181    
182 matty 10
183     /* TEXT CACHE */
184 jsorg71 379 static DATABLOB g_textcache[256];
185 matty 10
186     /* Retrieve a text item from the cache */
187 matty 25 DATABLOB *
188     cache_get_text(uint8 cache_id)
189 matty 9 {
190 matty 10 DATABLOB *text;
191 matty 9
192 jsorg71 379 if (cache_id < NUM_ELEMENTS(g_textcache))
193 matty 9 {
194 jsorg71 379 text = &g_textcache[cache_id];
195 matty 9 if (text->data != NULL)
196     return text;
197     }
198    
199 matty 30 error("get text %d\n", cache_id);
200 matty 9 return NULL;
201     }
202    
203 matty 10 /* Store a text item in the cache */
204 matty 25 void
205     cache_put_text(uint8 cache_id, void *data, int length)
206 matty 9 {
207 matty 10 DATABLOB *text;
208 matty 9
209 jsorg71 379 if (cache_id < NUM_ELEMENTS(g_textcache))
210 matty 9 {
211 jsorg71 379 text = &g_textcache[cache_id];
212 matty 9 if (text->data != NULL)
213 matty 10 xfree(text->data);
214 matty 9
215 matty 10 text->data = xmalloc(length);
216 matty 9 text->size = length;
217     memcpy(text->data, data, length);
218     }
219     else
220     {
221 matty 30 error("put text %d\n", cache_id);
222 matty 9 }
223     }
224 matty 10
225    
226     /* DESKTOP CACHE */
227 jsorg71 379 static uint8 g_deskcache[0x38400 * 4];
228 matty 10
229     /* Retrieve desktop data from the cache */
230 matty 25 uint8 *
231 matty 28 cache_get_desktop(uint32 offset, int cx, int cy, int bytes_per_pixel)
232 matty 10 {
233 matty 28 int length = cx * cy * bytes_per_pixel;
234 matty 16
235 jsorg71 563 if (offset > sizeof(g_deskcache))
236     offset = 0;
237    
238 jsorg71 379 if ((offset + length) <= sizeof(g_deskcache))
239 matty 10 {
240 jsorg71 379 return &g_deskcache[offset];
241 matty 10 }
242    
243 matty 30 error("get desktop %d:%d\n", offset, length);
244 matty 10 return NULL;
245     }
246    
247     /* Store desktop data in the cache */
248 matty 25 void
249 astrand 82 cache_put_desktop(uint32 offset, int cx, int cy, int scanline, int bytes_per_pixel, uint8 * data)
250 matty 10 {
251 matty 28 int length = cx * cy * bytes_per_pixel;
252 matty 16
253 jsorg71 563 if (offset > sizeof(g_deskcache))
254     offset = 0;
255    
256 jsorg71 379 if ((offset + length) <= sizeof(g_deskcache))
257 matty 10 {
258 matty 28 cx *= bytes_per_pixel;
259 matty 16 while (cy--)
260     {
261 jsorg71 379 memcpy(&g_deskcache[offset], data, cx);
262 matty 16 data += scanline;
263     offset += cx;
264     }
265 matty 10 }
266     else
267     {
268 matty 30 error("put desktop %d:%d\n", offset, length);
269 matty 10 }
270     }
271 matty 28
272    
273     /* CURSOR CACHE */
274 jsorg71 379 static HCURSOR g_cursorcache[0x20];
275 matty 28
276     /* Retrieve cursor from cache */
277 astrand 64 HCURSOR
278     cache_get_cursor(uint16 cache_idx)
279 matty 28 {
280     HCURSOR cursor;
281    
282 jsorg71 379 if (cache_idx < NUM_ELEMENTS(g_cursorcache))
283 matty 28 {
284 jsorg71 379 cursor = g_cursorcache[cache_idx];
285 matty 28 if (cursor != NULL)
286     return cursor;
287     }
288    
289 matty 30 error("get cursor %d\n", cache_idx);
290 matty 28 return NULL;
291     }
292    
293     /* Store cursor in cache */
294     void
295     cache_put_cursor(uint16 cache_idx, HCURSOR cursor)
296     {
297     HCURSOR old;
298    
299 jsorg71 379 if (cache_idx < NUM_ELEMENTS(g_cursorcache))
300 matty 28 {
301 jsorg71 379 old = g_cursorcache[cache_idx];
302 matty 28 if (old != NULL)
303     ui_destroy_cursor(old);
304    
305 jsorg71 379 g_cursorcache[cache_idx] = cursor;
306 matty 28 }
307     else
308     {
309 matty 30 error("put cursor %d\n", cache_idx);
310 matty 28 }
311     }

  ViewVC Help
Powered by ViewVC 1.1.26