forked from bartvdbraak/blender
thumbnail passepartout effect, distinguishes blend files from images.
This commit is contained in:
parent
941c10a296
commit
84d3856498
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user