Esempio n. 1
0
/* 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);
}
Esempio n. 2
0
/* 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);
}