/* returns cache id */ int APP_CC xrdp_cache_add_bitmap(struct xrdp_cache *self, struct xrdp_bitmap *bitmap, int hints) { int i = 0; int j = 0; int oldest = 0; int cache_id = 0; int cache_idx = 0; int bmp_size = 0; int e = 0; int Bpp = 0; e = bitmap->width % 4; if (e != 0) { e = 4 - e; } Bpp = (bitmap->bpp + 7) / 8; bmp_size = (bitmap->width + e) * bitmap->height * Bpp; self->bitmap_stamp++; /* look for match */ if (bmp_size <= self->cache1_size) { i = 0; for (j = 0; j < self->cache1_entries; j++) { #ifdef USE_CRC if (xrdp_bitmap_compare_with_crc(self->bitmap_items[i][j].bitmap, bitmap)) #else if (xrdp_bitmap_compare(self->bitmap_items[i][j].bitmap, bitmap)) #endif { self->bitmap_items[i][j].stamp = self->bitmap_stamp; LLOGLN(10, ("found bitmap at %d %d", i, j)); xrdp_bitmap_delete(bitmap); return MAKELONG(j, i); } } } else if (bmp_size <= self->cache2_size) { i = 1; for (j = 0; j < self->cache2_entries; j++) { #ifdef USE_CRC if (xrdp_bitmap_compare_with_crc(self->bitmap_items[i][j].bitmap, bitmap)) #else if (xrdp_bitmap_compare(self->bitmap_items[i][j].bitmap, bitmap)) #endif { self->bitmap_items[i][j].stamp = self->bitmap_stamp; LLOGLN(10, ("found bitmap at %d %d", i, j)); xrdp_bitmap_delete(bitmap); return MAKELONG(j, i); } } } else if (bmp_size <= self->cache3_size) { i = 2; for (j = 0; j < self->cache3_entries; j++) { #ifdef USE_CRC if (xrdp_bitmap_compare_with_crc(self->bitmap_items[i][j].bitmap, bitmap)) #else if (xrdp_bitmap_compare(self->bitmap_items[i][j].bitmap, bitmap)) #endif { self->bitmap_items[i][j].stamp = self->bitmap_stamp; LLOGLN(10, ("found bitmap at %d %d", i, j)); xrdp_bitmap_delete(bitmap); return MAKELONG(j, i); } } } else { log_message(LOG_LEVEL_ERROR,"error in xrdp_cache_add_bitmap, too big(%d) bpp %d", bmp_size, bitmap->bpp); } /* look for oldest */ cache_id = 0; cache_idx = 0; oldest = 0x7fffffff; if (bmp_size <= self->cache1_size) { i = 0; for (j = 0; j < self->cache1_entries; j++) { if (self->bitmap_items[i][j].stamp < oldest) { oldest = self->bitmap_items[i][j].stamp; cache_id = i; cache_idx = j; } } } else if (bmp_size <= self->cache2_size) { i = 1; for (j = 0; j < self->cache2_entries; j++) { if (self->bitmap_items[i][j].stamp < oldest) { oldest = self->bitmap_items[i][j].stamp; cache_id = i; cache_idx = j; } } } else if (bmp_size <= self->cache3_size) { i = 2; for (j = 0; j < self->cache3_entries; j++) { if (self->bitmap_items[i][j].stamp < oldest) { oldest = self->bitmap_items[i][j].stamp; cache_id = i; cache_idx = j; } } } LLOGLN(10, ("adding bitmap at %d %d ptr %p", cache_id, cache_idx, self->bitmap_items[cache_id][cache_idx].bitmap)); /* set, send bitmap and return */ xrdp_bitmap_delete(self->bitmap_items[cache_id][cache_idx].bitmap); self->bitmap_items[cache_id][cache_idx].bitmap = bitmap; self->bitmap_items[cache_id][cache_idx].stamp = self->bitmap_stamp; if (self->use_bitmap_comp) { if (self->bitmap_cache_version & 4) { if (libxrdp_orders_send_bitmap3(self->session, bitmap->width, bitmap->height, bitmap->bpp, bitmap->data, cache_id, cache_idx, hints) == 0) { return MAKELONG(cache_idx, cache_id); } } if (self->bitmap_cache_version & 2) { libxrdp_orders_send_bitmap2(self->session, bitmap->width, bitmap->height, bitmap->bpp, bitmap->data, cache_id, cache_idx, hints); } else if (self->bitmap_cache_version & 1) { libxrdp_orders_send_bitmap(self->session, bitmap->width, bitmap->height, bitmap->bpp, bitmap->data, cache_id, cache_idx); } } else { if (self->bitmap_cache_version & 2) { libxrdp_orders_send_raw_bitmap2(self->session, bitmap->width, bitmap->height, bitmap->bpp, bitmap->data, cache_id, cache_idx); } else if (self->bitmap_cache_version & 1) { libxrdp_orders_send_raw_bitmap(self->session, bitmap->width, bitmap->height, bitmap->bpp, bitmap->data, cache_id, cache_idx); } } return MAKELONG(cache_idx, cache_id); }
/* returns cache id */ int APP_CC xrdp_cache_add_bitmap(struct xrdp_cache* self, struct xrdp_bitmap* bitmap) { int i; int j; int oldest; int cache_id; int cache_idx; int bmp_size; int e; int Bpp; e = bitmap->width % 4; if (e != 0) { e = 4 - e; } Bpp = (bitmap->bpp + 7) / 8; bmp_size = (bitmap->width + e) * bitmap->height * Bpp; self->bitmap_stamp++; /* look for match */ if (bmp_size <= self->cache1_size) { i = 0; for (j = 0; j < self->cache1_entries; j++) { #ifdef USE_CRC if (xrdp_bitmap_compare_with_crc(self->bitmap_items[i][j].bitmap, bitmap)) #else if (xrdp_bitmap_compare(self->bitmap_items[i][j].bitmap, bitmap)) #endif { self->bitmap_items[i][j].stamp = self->bitmap_stamp; DEBUG(("found bitmap at %d %d", i, j)); xrdp_bitmap_delete(bitmap); return MAKELONG(j, i); } } } else if (bmp_size <= self->cache2_size) { i = 1; for (j = 0; j < self->cache2_entries; j++) { #ifdef USE_CRC if (xrdp_bitmap_compare_with_crc(self->bitmap_items[i][j].bitmap, bitmap)) #else if (xrdp_bitmap_compare(self->bitmap_items[i][j].bitmap, bitmap)) #endif { self->bitmap_items[i][j].stamp = self->bitmap_stamp; DEBUG(("found bitmap at %d %d", i, j)); xrdp_bitmap_delete(bitmap); return MAKELONG(j, i); } } } else if (bmp_size <= self->cache3_size) { i = 2; for (j = 0; j < self->cache3_entries; j++) { #ifdef USE_CRC if (xrdp_bitmap_compare_with_crc(self->bitmap_items[i][j].bitmap, bitmap)) #else if (xrdp_bitmap_compare(self->bitmap_items[i][j].bitmap, bitmap)) #endif { self->bitmap_items[i][j].stamp = self->bitmap_stamp; DEBUG(("found bitmap at %d %d", i, j)); xrdp_bitmap_delete(bitmap); return MAKELONG(j, i); } } } else { g_writeln("error in xrdp_cache_add_bitmap, too big(%d)", bmp_size); } /* look for oldest */ cache_id = 0; cache_idx = 0; oldest = 0x7fffffff; if (bmp_size <= self->cache1_size) { i = 0; for (j = 0; j < self->cache1_entries; j++) { if (self->bitmap_items[i][j].stamp < oldest) { oldest = self->bitmap_items[i][j].stamp; cache_id = i; cache_idx = j; } } } else if (bmp_size <= self->cache2_size) { i = 1; for (j = 0; j < self->cache2_entries; j++) { if (self->bitmap_items[i][j].stamp < oldest) { oldest = self->bitmap_items[i][j].stamp; cache_id = i; cache_idx = j; } } } else if (bmp_size <= self->cache3_size) { i = 2; for (j = 0; j < self->cache3_entries; j++) { if (self->bitmap_items[i][j].stamp < oldest) { oldest = self->bitmap_items[i][j].stamp; cache_id = i; cache_idx = j; } } } DEBUG(("adding bitmap at %d %d", cache_id, cache_idx)); /* set, send bitmap and return */ xrdp_bitmap_delete(self->bitmap_items[cache_id][cache_idx].bitmap); self->bitmap_items[cache_id][cache_idx].bitmap = bitmap; self->bitmap_items[cache_id][cache_idx].stamp = self->bitmap_stamp; if (self->bitmap_cache_version == 0) /* orginal version */ { if (self->use_bitmap_comp) { libxrdp_orders_send_bitmap(self->session, bitmap->width, bitmap->height, bitmap->bpp, bitmap->data, cache_id, cache_idx); } else { libxrdp_orders_send_raw_bitmap(self->session, bitmap->width, bitmap->height, bitmap->bpp, bitmap->data, cache_id, cache_idx); } } else { if (self->use_bitmap_comp) { libxrdp_orders_send_bitmap2(self->session, bitmap->width, bitmap->height, bitmap->bpp, bitmap->data, cache_id, cache_idx); } else { libxrdp_orders_send_raw_bitmap2(self->session, bitmap->width, bitmap->height, bitmap->bpp, bitmap->data, cache_id, cache_idx); } } return MAKELONG(cache_idx, cache_id); }