surface.c

来自「CS架构的多平台的GUI系统」· C语言 代码 · 共 341 行

C
341
字号
/***************************************************************************    begin                : Wed Feb 19 2003    copyright            : (C) 2003 - 2005 by Alper Akcan    email                : distchx@yahoo.com ***************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU Lesser General Public License as        * *   published by the Free Software Foundation; either version 2.1 of the  * *   License, or (at your option) any later version.                       * *                                                                         * ***************************************************************************/#include "../lib/xynth_.h"#include "server.h"void s_server_surface_matrix_find (s_rect_t *coor, int *dm){	int h;	int w;	int w_;	s_rect_t clip;	s_rect_t inter;	unsigned char *tmp;	clip.x = 0;	clip.y = 0;	clip.w = server->window->surface->width;	clip.h = server->window->surface->height;	tmp = server->window->surface->matrix;	if (s_rect_intersect(&clip, coor, &inter)) {		return;	}        h = inter.h;        w = inter.w;        w_ = server->window->surface->width - inter.w;        tmp += ((inter.y * server->window->surface->width) + inter.x);	while (h--) {		w = inter.w;		while (w--) {			if (*tmp < S_CLIENTS_MAX) {				dm[(int) *tmp] = 1;			}			tmp++;		}		tmp += w_;	}}void s_server_surface_matrix_add (int id, s_rect_t *coor){	int h;	int w;	int w_;	s_rect_t clip;	s_rect_t intr_;	s_rect_t inter;	unsigned char *tmp;	clip.x = 0;	clip.y = 0;	clip.w = server->window->surface->width;	clip.h = server->window->surface->height;	tmp = server->window->surface->matrix;	if (s_rect_intersect(coor, &server->client[id].buf, &intr_)) {		return;	}	if (s_rect_intersect(&intr_, &clip, &inter)) {		return;	}        h = inter.h;        w = inter.w;        w_ = server->window->surface->width - inter.w;        tmp += ((inter.y * server->window->surface->width) + inter.x);	while (h--) {		w = inter.w;		while (w--) {			*tmp++ = id;		}		tmp += w_;	}}void s_server_surface_matrix_add_id (int id, s_rect_t *coor){	int h;	int w;	int w_;	s_rect_t clip;	s_rect_t inter;	unsigned char *tmp;	clip.x = 0;	clip.y = 0;	clip.w = server->window->surface->width;	clip.h = server->window->surface->height;	tmp = server->window->surface->matrix;	if (s_rect_intersect(coor, &clip, &inter)) {		return;	}	        h = inter.h;        w = inter.w;        w_ = server->window->surface->width - inter.w;        tmp += ((inter.y * server->window->surface->width) + inter.x);	while (h--) {		w = inter.w;		while (w--) {			*tmp++ = id;		}		tmp += w_;	}}void s_server_surface_matrix_add_this (int id, s_rect_t *coor, s_rect_t *mcoor, unsigned char *mat){	int h;	int w;	int w_;	int m_;	s_rect_t clip;	s_rect_t intr_;	s_rect_t inter;	unsigned char *tmp;	clip.x = 0;	clip.y = 0;	clip.w = server->window->surface->width;	clip.h = server->window->surface->height;	tmp = server->window->surface->matrix;	if (s_rect_intersect(coor, mcoor, &intr_)) {		return;	}	if (s_rect_intersect(&intr_, &clip, &inter)) {		return;	}        h = inter.h;        w = inter.w;        w_ = server->window->surface->width - inter.w;        m_ = mcoor->w - inter.w;        tmp += ((inter.y * server->window->surface->width) + inter.x);        mat += ((inter.y - mcoor->y) * mcoor->w) + (inter.x - mcoor->x);	while (h--) {		w = inter.w;		while (w--) {			if (*mat) {				*tmp = id;			}			mat++;			tmp++;		}		tmp += w_;		mat += m_;	}}void s_server_surface_matrix_del (int id){	int h;	int w;	int w_;	s_rect_t clip;	s_rect_t intersect;	unsigned char *tmp;	clip.x = 0;	clip.y = 0;	clip.w = server->window->surface->width;	clip.h = server->window->surface->height;	tmp = server->window->surface->matrix;	if (s_rect_intersect(&clip, &server->client[id].buf, &intersect)) {		return;	}        h = intersect.h;        w = intersect.w;        w_ = server->window->surface->width - intersect.w;        tmp += ((intersect.y * server->window->surface->width) + intersect.x);	while (h--) {		w = intersect.w;		while (w--) {			*tmp++ = S_MATRIX_DELETED;		}		tmp += w_;	}}void s_server_surface_matrix_del_this (int id, s_rect_t *mcoor, unsigned char *mat){	int h;	int w;	int w_;	s_rect_t clip;	s_rect_t intersect;	unsigned char *tmp;	clip.x = 0;	clip.y = 0;	clip.w = server->window->surface->width;	clip.h = server->window->surface->height;	tmp = server->window->surface->matrix;	if (s_rect_intersect(&clip, mcoor, &intersect)) {		return;	}        h = intersect.h;        w = intersect.w;        w_ = server->window->surface->width - intersect.w;        tmp += ((intersect.y * server->window->surface->width) + intersect.x);	while (h--) {		w = intersect.w;		while (w--) {			*tmp++ = S_MATRIX_DELETED;		}		tmp += w_;	}}void s_server_surface_matrix_del_coor (s_rect_t *coor){	int h;	int w;	int w_;	s_rect_t clip;	s_rect_t intersect;	unsigned char *tmp;	clip.x = 0;	clip.y = 0;	clip.w = server->window->surface->width;	clip.h = server->window->surface->height;	tmp = server->window->surface->matrix;	if (s_rect_intersect(&clip, coor, &intersect)) {		return;	}        h = intersect.h;        w = intersect.w;        w_ = server->window->surface->width - intersect.w;        tmp += ((intersect.y * server->window->surface->width) + intersect.x);	while (h--) {		w = intersect.w;		while (w--) {			*tmp++ = S_MATRIX_DELETED;		}		tmp += w_;	}}void s_server_surface_clean (s_rect_t *coor){	s_rect_t intersect;	if (s_rect_clip_virtual(server->window->surface, coor->x, coor->y, coor->w, coor->h, &intersect)) {		return;	}	bpp_fillbox_o(server->window->surface, S_MATRIX_FREE, intersect.x, intersect.y, intersect.w, intersect.h, 0);}void s_server_surface_background (s_rect_t *coor){        int x;        int y;	int h;	int w;	int w_;	s_rect_t intersect;	unsigned char *tmp;	tmp = server->window->surface->matrix;	if (s_rect_clip_virtual(server->window->surface, coor->x, coor->y, coor->w, coor->h, &intersect)) {		return;	}	bpp_fillbox_o(server->window->surface, S_MATRIX_DELETED, intersect.x, intersect.y, intersect.w, intersect.h, 0);		h = intersect.h;        w = intersect.w;        y = intersect.y;        w_ = server->window->surface->width - intersect.w;        tmp += ((intersect.y * server->window->surface->width) + intersect.x);	while (h--) {		x = intersect.x;		w = intersect.w;		while (w--) {			if (*tmp == S_MATRIX_DELETED) {				*tmp = S_MATRIX_FREE;			}			x++;			tmp++;		}		y++;		tmp += w_;	}}void s_server_surface_lock_real (void){	int i;	s_rect_t coor;	coor.x = 0;	coor.y = 0;	coor.w = server->window->surface->width;	coor.h = server->window->surface->height;	for (i = 0; i < coor.w * coor.h; i++) {		server->window->surface->matrix[i] = S_MATRIX_DELETED;	}}void s_server_surface_refresh (void){	s_rect_t coor;	coor.x = 0;	coor.y = 0;	coor.w = server->window->surface->width;	coor.h = server->window->surface->height;        s_server_surface_lock_real();	s_server_pri_set(SURFACE_REFRESH, &coor);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?