From 84d3856498e9011f2e2bb1ead55fb60d3318d2e0 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 30 May 2010 09:16:50 +0000 Subject: thumbnail passepartout effect, distinguishes blend files from images. --- source/blender/windowmanager/intern/wm_files.c | 62 +++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) (limited to 'source/blender/windowmanager/intern/wm_files.c') diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index a6e59cde402..19f8ceda050 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -492,6 +492,64 @@ static void do_history(char *name, ReportList *reports) } /* writes a thumbnail for a blendfile */ +static void writeThumb_overlay(int *thumb, int width, int height, float aspect) +{ + unsigned char *px= (unsigned char *)thumb; + int margin_l = 3; + int margin_b = 3; + int margin_r = width - 3; + int margin_t = height - 3; + + printf("%f\n", aspect); + + if(aspect < 1.0f) { + margin_l= (int)((width - ((float)width * aspect)) / 2.0f); + margin_l += 2; + CLAMP(margin_l, 2, (width/2)); + margin_r = width - margin_l; + } + else if (aspect > 1.0f) { + margin_b= (int)((height - ((float)height / aspect)) / 2.0f); + margin_b += 2; + CLAMP(margin_b, 2, (height/2)); + margin_t = height - margin_b; + } + + { + int x, y; + int hline, vline; + float alpha; + int stride_x= (margin_r - margin_l) - 2; + + for(y=0; y < height; y++) { + float fac= (float)y / (float)height; + alpha= (0.2f * fac) + (1.0f * (1.0f - fac)); + for(x=0; x < width; x++, px+=4) { + if((x > margin_l && x < margin_r) && (y > margin_b && y < margin_t)) { + /* interior. skip */ + x += stride_x; + px += stride_x * 4; + } else if( (hline=(((x == margin_l || x == margin_r)) && y >= margin_b && y <= margin_t)) || + (vline=(((y == margin_b || y == margin_t)) && x >= margin_l && x <= margin_r)) + ) { + /* dashed line */ + if((hline && y % 2) || (vline && x % 2)) { + px[0]= px[1]= px[2]= 0; + px[3] = 255; + } + } + else { + /* outside, fill in alpha, like passepartout */ + px[0] *= 0.5f; + px[1] *= 0.5f; + px[2] *= 0.5f; + px[3] = (px[3] * 0.5f) + (128 * alpha); + } + } + } + } +} + static void writeThumb(const char *path, Scene *scene, int **thumb_pt) { /* will be scaled down, but gives some nice oversampling */ @@ -507,7 +565,8 @@ static void writeThumb(const char *path, Scene *scene, int **thumb_pt) ibuf= ED_view3d_draw_offscreen_imbuf_simple(scene, BLEN_THUMB_SIZE * 2, BLEN_THUMB_SIZE * 2, OB_SOLID); if(ibuf) { - + float aspect= (scene->r.xsch*scene->r.xasp) / (scene->r.ysch*scene->r.yasp); + /* dirty oversampling */ IMB_scaleImBuf(ibuf, BLEN_THUMB_SIZE, BLEN_THUMB_SIZE); @@ -518,6 +577,7 @@ static void writeThumb(const char *path, Scene *scene, int **thumb_pt) thumb[1] = BLEN_THUMB_SIZE; memcpy(thumb + 2, ibuf->rect, BLEN_THUMB_SIZE * BLEN_THUMB_SIZE * sizeof(int)); + writeThumb_overlay(thumb + 2, BLEN_THUMB_SIZE, BLEN_THUMB_SIZE, aspect); /* the image is scaled here */ ibuf= IMB_thumb_create(path, THB_NORMAL, THB_SOURCE_BLEND, ibuf); -- cgit v1.2.3