add helper methods for intersection
This commit is contained in:
		
							parent
							
								
									420bd3e422
								
							
						
					
					
						commit
						5a9baf487e
					
				|  | @ -46,24 +46,20 @@ static void handle_output_frame(struct output_state *output, struct timespec *ts | |||
| 	struct sample_state *sample = state->data; | ||||
| 	struct wlr_output *wlr_output = output->output; | ||||
| 
 | ||||
| 	int32_t width, height; | ||||
| 	wlr_output_effective_resolution(wlr_output, &width, &height); | ||||
| 
 | ||||
| 	wlr_output_make_current(wlr_output); | ||||
| 	wlr_renderer_begin(sample->renderer, wlr_output); | ||||
| 
 | ||||
| 	float matrix[16]; | ||||
| 	if (wlr_output_layout_intersects(sample->layout, output->output, | ||||
| 				sample->x_offs, sample->y_offs, | ||||
| 				sample->x_offs + 128, sample->y_offs + 128)) { | ||||
| 		float matrix[16]; | ||||
| 
 | ||||
| 	// transform global coordinates to local coordinates
 | ||||
| 	int local_x = sample->x_offs; | ||||
| 	int local_y = sample->y_offs; | ||||
| 		// transform global coordinates to local coordinates
 | ||||
| 		int local_x = sample->x_offs; | ||||
| 		int local_y = sample->y_offs; | ||||
| 		wlr_output_layout_output_coords(sample->layout, output->output, &local_x, | ||||
| 				&local_y); | ||||
| 
 | ||||
| 	wlr_output_layout_output_coords(sample->layout, output->output, &local_x, | ||||
| 		&local_y); | ||||
| 
 | ||||
| 	if (local_x < width && local_x + 128 > 0 && local_y < height && | ||||
| 			local_y + 128 > 0) { | ||||
| 		// render the image if it intersects with the output
 | ||||
| 		wlr_texture_get_matrix(sample->cat_texture, &matrix, | ||||
| 			&wlr_output->transform_matrix, local_x, local_y); | ||||
| 		wlr_render_with_matrix(sample->renderer, | ||||
|  |  | |||
|  | @ -40,4 +40,10 @@ void wlr_output_layout_remove(struct wlr_output_layout *layout, | |||
| void wlr_output_layout_output_coords(struct wlr_output_layout *layout, | ||||
|     struct wlr_output *reference, int *x, int *y); | ||||
| 
 | ||||
| bool wlr_output_layout_contains_point(struct wlr_output_layout *layout, | ||||
| 	struct wlr_output *reference, int x, int y); | ||||
| 
 | ||||
| bool wlr_output_layout_intersects(struct wlr_output_layout *layout, | ||||
| 	struct wlr_output *reference, int x1, int y1, int x2, int y2); | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -47,6 +47,36 @@ struct wlr_output_layout_output *wlr_output_layout_get( | |||
| 
 | ||||
| } | ||||
| 
 | ||||
| static bool output_contains_point( struct wlr_output_layout_output *l_output, | ||||
| 		int x, int y, int width, int height) { | ||||
| 	return x >= l_output->x && x <= l_output->x + width && | ||||
| 		y >= l_output->y && y <= l_output->y + height; | ||||
| } | ||||
| 
 | ||||
| bool wlr_output_layout_contains_point(struct wlr_output_layout *layout, | ||||
| 		struct wlr_output *reference, int x, int y) { | ||||
| 	struct wlr_output_layout_output *layout_output = wlr_output_layout_get(layout, reference); | ||||
| 	int width, height; | ||||
| 	wlr_output_effective_resolution(layout_output->output, &width, &height); | ||||
| 	return output_contains_point(layout_output, x, y, width, height); | ||||
| } | ||||
| 
 | ||||
| bool wlr_output_layout_intersects(struct wlr_output_layout *layout, | ||||
| 		struct wlr_output *reference, int x1, int y1, int x2, int y2) { | ||||
| 	struct wlr_output_layout_output *l_output = wlr_output_layout_get(layout, reference); | ||||
| 	if (!l_output) { | ||||
| 		return false; | ||||
| 	} | ||||
| 	int width, height; | ||||
| 	wlr_output_effective_resolution(l_output->output, &width, &height); | ||||
| 
 | ||||
| 	// the output must contain one of the points
 | ||||
| 	return output_contains_point(l_output, x1, y1, width, height) || | ||||
| 		output_contains_point(l_output, x2, y2, width, height) || | ||||
| 		output_contains_point(l_output, x2, y1, width, height) || | ||||
| 		output_contains_point(l_output, y2, x1, width, height); | ||||
| } | ||||
| 
 | ||||
| struct wlr_output *wlr_output_layout_output_at(struct wlr_output_layout *layout, | ||||
| 		double x, double y) { | ||||
| 	struct wlr_output *ret = NULL; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue