void bitmap_cache_free(rdpBitmapCache* bitmap_cache) { int i, j; rdpBitmap* bitmap; if (bitmap_cache != NULL) { for (i = 0; i < (int) bitmap_cache->maxCells; i++) { for (j = 0; j < (int) bitmap_cache->cells[i].number; j++) { bitmap = bitmap_cache->cells[i].entries[j]; if (bitmap != NULL) { Bitmap_Free(bitmap_cache->context, bitmap); } } xfree(bitmap_cache->cells[i].entries); } if (bitmap_cache->bitmap != NULL) Bitmap_Free(bitmap_cache->context, bitmap_cache->bitmap); xfree(bitmap_cache->cells); xfree(bitmap_cache); } }
static BOOL update_gdi_cache_bitmap_v2(rdpContext* context, CACHE_BITMAP_V2_ORDER* cacheBitmapV2) { rdpBitmap* bitmap; rdpBitmap* prevBitmap; rdpCache* cache = context->cache; rdpSettings* settings = context->settings; bitmap = Bitmap_Alloc(context); if (!bitmap) return FALSE; if (!cacheBitmapV2->bitmapBpp) cacheBitmapV2->bitmapBpp = settings->ColorDepth; if ((settings->ColorDepth == 15) && (cacheBitmapV2->bitmapBpp == 16)) cacheBitmapV2->bitmapBpp = settings->ColorDepth; Bitmap_SetDimensions(bitmap, cacheBitmapV2->bitmapWidth, cacheBitmapV2->bitmapHeight); if (!bitmap->Decompress(context, bitmap, cacheBitmapV2->bitmapDataStream, cacheBitmapV2->bitmapWidth, cacheBitmapV2->bitmapHeight, cacheBitmapV2->bitmapBpp, cacheBitmapV2->bitmapLength, cacheBitmapV2->compressed, RDP_CODEC_ID_NONE)) { Bitmap_Free(context, bitmap); return FALSE; } prevBitmap = bitmap_cache_get(cache->bitmap, cacheBitmapV2->cacheId, cacheBitmapV2->cacheIndex); if (!bitmap->New(context, bitmap)) { Bitmap_Free(context, bitmap); return FALSE; } Bitmap_Free(context, prevBitmap); return bitmap_cache_put(cache->bitmap, cacheBitmapV2->cacheId, cacheBitmapV2->cacheIndex, bitmap); }
void update_gdi_cache_bitmap_v2(rdpContext* context, CACHE_BITMAP_V2_ORDER* cache_bitmap_v2) { rdpBitmap* bitmap; rdpBitmap* prevBitmap; rdpCache* cache = context->cache; bitmap = Bitmap_Alloc(context); Bitmap_SetDimensions(context, bitmap, cache_bitmap_v2->bitmapWidth, cache_bitmap_v2->bitmapHeight); if (cache_bitmap_v2->bitmapBpp == 0) { /* Workaround for Windows 8 bug where bitmapBpp is not set */ cache_bitmap_v2->bitmapBpp = context->instance->settings->color_depth; } bitmap->Decompress(context, bitmap, cache_bitmap_v2->bitmapDataStream, cache_bitmap_v2->bitmapWidth, cache_bitmap_v2->bitmapHeight, cache_bitmap_v2->bitmapBpp, cache_bitmap_v2->bitmapLength, cache_bitmap_v2->compressed, CODEC_ID_NONE); bitmap->New(context, bitmap); prevBitmap = bitmap_cache_get(cache->bitmap, cache_bitmap_v2->cacheId, cache_bitmap_v2->cacheIndex); if (prevBitmap != NULL) Bitmap_Free(context, prevBitmap); bitmap_cache_put(cache->bitmap, cache_bitmap_v2->cacheId, cache_bitmap_v2->cacheIndex, bitmap); }
void update_gdi_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cache_bitmap_v3) { rdpBitmap* bitmap; rdpBitmap* prevBitmap; rdpCache* cache = context->cache; BITMAP_DATA_EX* bitmapData = &cache_bitmap_v3->bitmapData; bitmap = Bitmap_Alloc(context); Bitmap_SetDimensions(context, bitmap, bitmapData->width, bitmapData->height); if (cache_bitmap_v3->bitmapData.bpp == 0) { /* Workaround for Windows 8 bug where bitmapBpp is not set */ cache_bitmap_v3->bitmapData.bpp = context->instance->settings->color_depth; } bitmap->Decompress(context, bitmap, bitmapData->data, bitmap->width, bitmap->height, bitmapData->bpp, bitmapData->length, true, bitmapData->codecID); bitmap->New(context, bitmap); prevBitmap = bitmap_cache_get(cache->bitmap, cache_bitmap_v3->cacheId, cache_bitmap_v3->cacheIndex); if (prevBitmap != NULL) Bitmap_Free(context, prevBitmap); bitmap_cache_put(cache->bitmap, cache_bitmap_v3->cacheId, cache_bitmap_v3->cacheIndex, bitmap); }
void update_gdi_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cacheBitmapV3) { rdpBitmap* bitmap; rdpBitmap* prevBitmap; BOOL compressed = TRUE; rdpCache* cache = context->cache; rdpSettings* settings = context->settings; BITMAP_DATA_EX* bitmapData = &cacheBitmapV3->bitmapData; bitmap = Bitmap_Alloc(context); Bitmap_SetDimensions(context, bitmap, bitmapData->width, bitmapData->height); if (!cacheBitmapV3->bpp) cacheBitmapV3->bpp = settings->ColorDepth; compressed = (bitmapData->codecID != RDP_CODEC_ID_NONE); bitmap->Decompress(context, bitmap, bitmapData->data, bitmap->width, bitmap->height, bitmapData->bpp, bitmapData->length, compressed, bitmapData->codecID); bitmap->New(context, bitmap); prevBitmap = bitmap_cache_get(cache->bitmap, cacheBitmapV3->cacheId, cacheBitmapV3->cacheIndex); if (prevBitmap) Bitmap_Free(context, prevBitmap); bitmap_cache_put(cache->bitmap, cacheBitmapV3->cacheId, cacheBitmapV3->cacheIndex, bitmap); }
BOOL gdi_bitmap_update(rdpContext* context, const BITMAP_UPDATE* bitmapUpdate) { UINT32 index; if (!context || !bitmapUpdate || !context->gdi || !context->codecs) return FALSE; for (index = 0; index < bitmapUpdate->number; index++) { const BITMAP_DATA* bitmap = &(bitmapUpdate->rectangles[index]); rdpBitmap* bmp = Bitmap_Alloc(context); if (!bmp) return FALSE; Bitmap_SetDimensions(bmp, bitmap->width, bitmap->height); Bitmap_SetRectangle(bmp, bitmap->destLeft, bitmap->destTop, bitmap->destRight, bitmap->destBottom); if (!bmp->Decompress(context, bmp, bitmap->bitmapDataStream, bitmap->width, bitmap->height, bitmap->bitsPerPixel, bitmap->bitmapLength, bitmap->compressed, RDP_CODEC_ID_NONE)) { Bitmap_Free(context, bmp); return FALSE; } if (!bmp->New(context, bmp)) { Bitmap_Free(context, bmp); return FALSE; } if (!bmp->Paint(context, bmp)) { Bitmap_Free(context, bmp); return FALSE; } Bitmap_Free(context, bmp); } return TRUE; }
static BOOL update_gdi_cache_bitmap(rdpContext* context, const CACHE_BITMAP_ORDER* cacheBitmap) { rdpBitmap* bitmap; rdpBitmap* prevBitmap; rdpCache* cache = context->cache; bitmap = Bitmap_Alloc(context); if (!bitmap) return FALSE; Bitmap_SetDimensions(bitmap, cacheBitmap->bitmapWidth, cacheBitmap->bitmapHeight); if (!bitmap->Decompress(context, bitmap, cacheBitmap->bitmapDataStream, cacheBitmap->bitmapWidth, cacheBitmap->bitmapHeight, cacheBitmap->bitmapBpp, cacheBitmap->bitmapLength, cacheBitmap->compressed, RDP_CODEC_ID_NONE)) { Bitmap_Free(context, bitmap); return FALSE; } if (!bitmap->New(context, bitmap)) { Bitmap_Free(context, bitmap); return FALSE; } prevBitmap = bitmap_cache_get(cache->bitmap, cacheBitmap->cacheId, cacheBitmap->cacheIndex); Bitmap_Free(context, prevBitmap); return bitmap_cache_put(cache->bitmap, cacheBitmap->cacheId, cacheBitmap->cacheIndex, bitmap); }
void offscreen_cache_delete(rdpOffscreenCache* offscreen, uint32 index) { rdpBitmap* prevBitmap; if (index >= offscreen->maxEntries) { printf("invalid offscreen bitmap index (delete): 0x%04X\n", index); return; } prevBitmap = offscreen->entries[index]; if (prevBitmap != NULL) Bitmap_Free(offscreen->update->context, prevBitmap); offscreen->entries[index] = NULL; }
void offscreen_cache_delete(rdpOffscreenCache* offscreenCache, UINT32 index) { rdpBitmap* prevBitmap; if (index >= offscreenCache->maxEntries) { WLog_ERR(TAG, "invalid offscreen bitmap index (delete): 0x%04X", index); return; } prevBitmap = offscreenCache->entries[index]; if (prevBitmap != NULL) Bitmap_Free(offscreenCache->update->context, prevBitmap); offscreenCache->entries[index] = NULL; }
void offscreen_cache_free(rdpOffscreenCache* offscreen_cache) { int i; rdpBitmap* bitmap; if (offscreen_cache != NULL) { for (i = 0; i < offscreen_cache->maxEntries; i++) { bitmap = offscreen_cache->entries[i]; if (bitmap != NULL) Bitmap_Free(offscreen_cache->update->context, bitmap); } xfree(offscreen_cache->entries); xfree(offscreen_cache); } }
void bitmap_cache_free(rdpBitmapCache* bitmapCache) { int i, j; rdpBitmap* bitmap; if (bitmapCache) { for (i = 0; i < (int) bitmapCache->maxCells; i++) { for (j = 0; j < (int) bitmapCache->cells[i].number + 1; j++) { bitmap = bitmapCache->cells[i].entries[j]; Bitmap_Free(bitmapCache->context, bitmap); } free(bitmapCache->cells[i].entries); } free(bitmapCache->cells); free(bitmapCache); } }
void update_gdi_create_offscreen_bitmap(rdpUpdate* update, CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap) { rdpBitmap* bitmap; rdpBitmap* prevBitmap; rdpCache* cache = update->context->cache; bitmap = Bitmap_Alloc(update->context); bitmap->width = create_offscreen_bitmap->cx; bitmap->height = create_offscreen_bitmap->cy; bitmap->New(update->context, bitmap); prevBitmap = offscreen_cache_get(cache->offscreen, create_offscreen_bitmap->id); if (prevBitmap != NULL) Bitmap_Free(update->context, prevBitmap); offscreen_cache_put(cache->offscreen, create_offscreen_bitmap->id, bitmap); if(cache->offscreen->currentSurface == create_offscreen_bitmap->id) Bitmap_SetSurface(update->context, bitmap, False); }
void update_gdi_cache_bitmap(rdpContext* context, CACHE_BITMAP_ORDER* cache_bitmap) { rdpBitmap* bitmap; rdpBitmap* prevBitmap; rdpCache* cache = context->cache; bitmap = Bitmap_Alloc(context); Bitmap_SetDimensions(context, bitmap, cache_bitmap->bitmapWidth, cache_bitmap->bitmapHeight); bitmap->Decompress(context, bitmap, cache_bitmap->bitmapDataStream, cache_bitmap->bitmapWidth, cache_bitmap->bitmapHeight, cache_bitmap->bitmapBpp, cache_bitmap->bitmapLength, cache_bitmap->compressed, CODEC_ID_NONE); bitmap->New(context, bitmap); prevBitmap = bitmap_cache_get(cache->bitmap, cache_bitmap->cacheId, cache_bitmap->cacheIndex); if (prevBitmap != NULL) Bitmap_Free(context, prevBitmap); bitmap_cache_put(cache->bitmap, cache_bitmap->cacheId, cache_bitmap->cacheIndex, bitmap); }
void update_gdi_cache_bitmap_v3(rdpContext* context, CACHE_BITMAP_V3_ORDER* cacheBitmapV3) { rdpBitmap* bitmap; rdpBitmap* prevBitmap; BOOL isCompressed = TRUE; rdpCache* cache = context->cache; BITMAP_DATA_EX* bitmapData = &cacheBitmapV3->bitmapData; bitmap = Bitmap_Alloc(context); Bitmap_SetDimensions(context, bitmap, bitmapData->width, bitmapData->height); if (cacheBitmapV3->bitmapData.bpp == 0) { /* Workaround for Windows 8 bug where bitmapBpp is not set */ cacheBitmapV3->bitmapData.bpp = context->instance->settings->ColorDepth; } /* According to http://msdn.microsoft.com/en-us/library/gg441209.aspx * CACHE_BITMAP_REV3_ORDER::bitmapData::codecID = 0x00 (uncompressed) */ isCompressed = (bitmapData->codecID != RDP_CODEC_ID_NONE); bitmap->Decompress(context, bitmap, bitmapData->data, bitmap->width, bitmap->height, bitmapData->bpp, bitmapData->length, isCompressed, bitmapData->codecID); bitmap->New(context, bitmap); prevBitmap = bitmap_cache_get(cache->bitmap, cacheBitmapV3->cacheId, cacheBitmapV3->cacheIndex); if (prevBitmap) Bitmap_Free(context, prevBitmap); bitmap_cache_put(cache->bitmap, cacheBitmapV3->cacheId, cacheBitmapV3->cacheIndex, bitmap); }
void Scene_Raytrace_Cmd(int argc, char *argv[]) { #ifndef _S2_DONT_INCLUDE_GL int x, y; int width, height; float ratio_x, ratio_y; bitmap_t bmp; float msec; if (!scene_cam) return; if (argc < 2) { width = 640; height = 480; } else { width = atoi(argv[0]); height = atoi(argv[1]); } ratio_x = scene_cam->width / (float)width; ratio_y = scene_cam->height / (float)height; Bitmap_Alloc(&bmp, width, height, BITMAP_RGBA); msec = System_Milliseconds(); for (y=0; y<height; y++) { for (x=0; x<width; x++) { vec3_t dir; vec3_t end; float light; traceinfo_t trace; Cam_ConstructRay(scene_cam, (float)x*ratio_x, (float)y*ratio_y, dir); M_PointOnLine(scene_cam->origin, dir, gfx_farclip.value, end); WT_TraceBox_Client(&trace, scene_cam->origin, end, zero_vec, zero_vec, 0);//SURF_TERRAIN); if (trace.fraction < 1) { if (argc == 3) light = trace.fraction; else light = ABS(M_DotProduct(trace.normal, scene_cam->viewaxis[AXIS_FORWARD])); } else { light = 0; } Bitmap_SetPixel4b(&bmp, x, y, (byte)((trace.flags & SURF_TERRAIN) ? 0 : 255)*light, (byte)((trace.flags & SURF_FOLIAGE) ? 255 : 0)*light, (byte)((trace.flags & SURF_TERRAIN) ? 255 : 0)*light, 255); } } Console_Printf("raytrace took %f msec\n", System_Milliseconds() - msec); Bitmap_WritePNG("raytrace.png", &bmp); Bitmap_Free(&bmp); #endif }