static void draw_border( SaWManWindow *sawwin, CardState *state, const DFBRegion *region, int thickness, bool right_eye ) { int i; DFBRegion old_clip; DFBRectangle rects[thickness]; CoreWindow *window; const SaWManBorderInit *border; const DFBColor *colors; const int *indices; unsigned int num_colors; unsigned int num_indices; int offset; window = sawwin->window; D_ASSERT( window != NULL ); D_DEBUG_AT( SaWMan_Draw, "%s( %p, %p, %d,%d-%dx%d, %d )\n", __FUNCTION__, sawwin, state, DFB_RECTANGLE_VALS_FROM_REGION( region ), thickness ); if (thickness > sawwin->bounds.w / 2) thickness = sawwin->bounds.w / 2; if (thickness > sawwin->bounds.h / 2) thickness = sawwin->bounds.h / 2; /* Check thickness. */ if (thickness < 1) return; /* Initialize border rectangles. */ rects[0] = sawwin->bounds; /* Translate for stereo effect. */ offset = window->config.z; offset *= right_eye ? -1 : 1; dfb_rectangle_translate( &rects[0], offset, 0 ); for (i=1; i<thickness; i++) { rects[i].x = rects[i-1].x + 1; rects[i].y = rects[i-1].y + 1; rects[i].w = rects[i-1].w - 2; rects[i].h = rects[i-1].h - 2; } /* Save clipping region. */ old_clip = state->clip; /* Change clipping region. */ dfb_state_set_clip( state, region ); border = &sawman_config->borders[sawman_window_priority(sawwin)]; if (window->flags & CWF_FOCUSED) { colors = border->focused; indices = border->focused_index; num_colors = D_ARRAY_SIZE(border->focused); num_indices = D_ARRAY_SIZE(border->focused_index); } else { colors = border->unfocused; indices = border->unfocused_index; num_colors = D_ARRAY_SIZE(border->unfocused); num_indices = D_ARRAY_SIZE(border->unfocused_index); } /* Draw border rectangles. */ for (i=0; i<thickness; i++) { dfb_state_set_color_or_index( state, &colors[i*num_colors/thickness], indices[i*num_indices/thickness] ); CoreGraphicsStateClient_DrawRectangles( state->client, &rects[i], 1 ); } /* Restore clipping region. */ dfb_state_set_clip( state, &old_clip ); }
static void foo_update( StretRegion *region, void *region_data, void *update_data, unsigned long arg, int x, int y, const DFBRegion *updates, int num ) { int i; DFBRegion clip; DFBDimension size; bool visible; WMShared *shared; UniqueContext *context; UniqueWindow *window = region_data; CardState *state = update_data; DFBSurfaceBlittingFlags flags = DSBLIT_NOFX; D_ASSERT( region != NULL ); D_ASSERT( region_data != NULL ); D_ASSERT( update_data != NULL ); D_ASSERT( updates != NULL ); D_MAGIC_ASSERT( window, UniqueWindow ); D_MAGIC_ASSERT( state, CardState ); shared = window->shared; D_MAGIC_ASSERT( shared, WMShared ); D_ASSERT( shared->foo_surface != NULL ); context = window->context; D_MAGIC_ASSERT( context, UniqueContext ); visible = D_FLAGS_IS_SET( window->flags, UWF_VISIBLE ); D_DEBUG_AT( UniQuE_Foo, "foo_update( region %p, window %p, visible %s, num %d )\n", region, window, visible ? "yes" : "no", num ); #if D_DEBUG_ENABLED for (i=0; i<num; i++) { D_DEBUG_AT( UniQuE_Foo, " (%d) %4d,%4d - %4dx%4d\n", i, DFB_RECTANGLE_VALS_FROM_REGION( &updates[i] ) ); } #endif if (!visible) return; stret_region_get_size( region, &size ); /* Use per pixel alpha blending. */ flags |= DSBLIT_BLEND_ALPHACHANNEL; /* Use global alpha blending. */ if (window->opacity != 0xFF) { flags |= DSBLIT_BLEND_COLORALPHA; /* Set opacity as blending factor. */ if (state->color.a != window->opacity) { state->color.a = window->opacity; state->modified |= SMF_COLOR; } } /* Use colorizing if the color is not white. */ if (context->color.r != 0xff || context->color.g != 0xff || context->color.b != 0xff) { flags |= DSBLIT_COLORIZE; state->color.r = context->color.r; state->color.g = context->color.g; state->color.b = context->color.b; state->modified |= SMF_COLOR; } /* Set blitting flags. */ dfb_state_set_blitting_flags( state, flags ); /* Set blitting source. */ state->source = shared->foo_surface; state->modified |= SMF_SOURCE; switch (arg) { case UFI_N: case UFI_E: case UFI_S: case UFI_W: clip = state->clip; /* for (i=0; i<num; i++) { DFBRegion update = DFB_REGION_INIT_TRANSLATED( &updates[i], x, y ); DFBRectangle source = shared->foo_rects[arg]; DFBRectangle dest = { x, y, size.w, size.h }; dfb_state_set_clip( state, &update ); dfb_gfxcard_stretchblit( &source, &dest, state ); }*/ for (i=0; i<num; i++) { DFBRegion update = DFB_REGION_INIT_TRANSLATED( &updates[i], x, y ); DFBRectangle source = shared->foo_rects[arg]; dfb_state_set_clip( state, &update ); dfb_gfxcard_tileblit( &source, x, y, x + size.w - 1, y + size.h - 1, state ); } dfb_state_set_clip( state, &clip ); break; case UFI_NE: case UFI_SE: case UFI_SW: case UFI_NW: for (i=0; i<num; i++) { DFBRectangle rect = DFB_RECTANGLE_INIT_FROM_REGION( &updates[i] ); dfb_rectangle_translate( &rect, shared->foo_rects[arg].x, shared->foo_rects[arg].y ); dfb_gfxcard_blit( &rect, x + updates[i].x1, y + updates[i].y1, state ); } break; default: D_BUG( "invalid arg" ); } /* Reset blitting source. */ state->source = NULL; state->modified |= SMF_SOURCE; }