日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

自制操作系统(十) 图像叠加处理

發布時間:2024/9/5 windows 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自制操作系统(十) 图像叠加处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2016.07.12

參考書籍:《30天自制操作系統》、《自己動手寫操作系統》

qq:992591601 ?歡迎交流

?

? ? ? 圖像疊加處理的原理很簡單,就是給圖像分層,從低下往上面畫,便可以實現疊加的效果。例如,屏幕背景+一個窗口+鼠標的情況。

例如下面的情形:

? ? ? ?計算機桌面上有三個窗口程序,A、B、C。B位于A之上,C位于B之上。要實現這種效果,只需要,先畫A(蓋住了桌面一部分)、再畫B(蓋住了A和桌面一部分)、再畫C(蓋住了B和桌面一部分)。然后每隔一定時間刷新畫面即可。

? ? ? ?為此引入一個圖層的概念。其實圖層的本質就是我上面說的那一段話。

struct SHEET {unsigned char *buf;int bxsize, bysize, vx0, vy0, col_inv, height, flags; };

? ? ? ?buf用來記錄圖層上所描畫內容的地址。

? ? ? ?圖層的整體大小:bxsize、bysize。

? ? ? ?圖層在畫面上位置的坐標:vx0、vy0。

? ? ? ?col_inv為透明色色號。

? ? ? ?height為圖層高度。

? ? ? ?flags用于存放有關圖層的各種設定信息。(使用狀況)

?

? ? ? ?接下來,對于程序員來說,實現圖像疊加效果,其實就是對著干圖層進行管理的邏輯了(管理:增刪改查)(畫屏幕圖像:按照圖層順序畫所有圖層)~

用于圖層管理的數據結構:

struct SHTCTL {unsigned char *vram;int xsize, ysize, top;struct SHEET *sheets[MAX_SHEETS];struct SHEET sheets0[MAX_SHEETS]; };

?

#include "c_head.h"/***author: 無 名*date: 2016.07.12*description: sheet management**/#define SHEET_USE 1/**初始化圖層數據結構SHTCTL*/ struct SHTCTL *shtctl_init(struct MEMMAN *memman, unsigned char *vram, int xsize, int ysize) {struct SHTCTL *ctl;int i;ctl = (struct SHTCTL *) memman_alloc_4k(memman, sizeof (struct SHTCTL));if (ctl == 0) {goto err;}ctl->vram = vram;ctl->xsize = xsize;ctl->ysize = ysize;ctl->top = -1; /* 沒有sheet */for (i = 0; i < MAX_SHEETS; i++){ctl->sheets0[i].flags = 0; /* 標記為未使用 */} err:return ctl; }/**獲得一個未使用的圖層*/ struct SHEET *sheet_alloc(struct SHTCTL *ctl) {struct SHEET *sht;int i;for (i = 0; i < MAX_SHEETS; i++) {if (ctl->sheets0[i].flags == 0){sht = &ctl->sheets0[i];sht->flags = SHEET_USE; /* 標記為正在使用 */sht->height = -1; /* 隱藏 */return sht;}}return 0; /* 所有sheet都處于正使用狀況 */ }/**設置圖層大小和透明色*/ void sheet_setbuf(struct SHEET *sht, unsigned char *buf, int xsize, int ysize, int col_inv) {sht->buf = buf;sht->bxsize = xsize;sht->bysize = ysize;sht->col_inv = col_inv;return; }/**改進后的刷新函數*/ void sheet_refreshsub(struct SHTCTL *ctl, int vx0, int vy0, int vx1, int vy1) {int h, bx, by, vx, vy, bx0, by0, bx1, by1;unsigned char *buf, c, *vram = ctl->vram;struct SHEET *sht;for (h = 0; h <= ctl->top; h++) {sht = ctl->sheets[h];buf = sht->buf;/* 使用vx0~vy1,對bx0~by1進行倒推 */bx0 = vx0 - sht->vx0;by0 = vy0 - sht->vy0;bx1 = vx1 - sht->vx0;by1 = vy1 - sht->vy0;if (bx0 < 0) { bx0 = 0; }if (by0 < 0) { by0 = 0; }if (bx1 > sht->bxsize) { bx1 = sht->bxsize; }if (by1 > sht->bysize) { by1 = sht->bysize; }for (by = by0; by < by1; by++) {vy = sht->vy0 + by;for (bx = bx0; bx < bx1; bx++) {vx = sht->vx0 + bx;c = buf[by * sht->bxsize + bx];if (c != sht->col_inv){vram[vy * ctl->xsize + vx] = c;}}}}return; }/**設定底板高度*/ void sheet_updown(struct SHTCTL *ctl, struct SHEET *sht, int height) {int h, old = sht->height; /* 存儲設置前的高度信息 *//* 如果指定的高度過高或過低、則進行修正 */if (height > ctl->top + 1) {height = ctl->top + 1;}if (height < -1){height = -1;}sht->height = height; /* 設定高度 *//* 下面主要是進行sheets[]重新排列 */if (old > height) {if (height >= 0){ for (h = old; h > height; h--) {ctl->sheets[h] = ctl->sheets[h - 1];ctl->sheets[h]->height = h;}ctl->sheets[height] = sht;} else { if (ctl->top > old){ for (h = old; h < ctl->top; h++){ctl->sheets[h] = ctl->sheets[h + 1];ctl->sheets[h]->height = h;}}ctl->top--; }sheet_refreshsub(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize);} else if (old < height) { if (old >= 0) {for (h = old; h < height; h++) {ctl->sheets[h] = ctl->sheets[h + 1];ctl->sheets[h]->height = h;}ctl->sheets[height] = sht;} else { for (h = ctl->top; h >= height; h--){ctl->sheets[h + 1] = ctl->sheets[h];ctl->sheets[h + 1]->height = h + 1;}ctl->sheets[height] = sht;ctl->top++; }sheet_refreshsub(ctl, sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize);}return; }/**從上到下描繪所有圖層*/ void sheet_refresh(struct SHTCTL *ctl, struct SHEET *sht, int bx0, int by0, int bx1, int by1) {if (sht->height >= 0){ sheet_refreshsub(ctl, sht->vx0 + bx0, sht->vy0 + by0, sht->vx0 + bx1, sht->vy0 + by1);}return; }void sheet_slide(struct SHTCTL *ctl, struct SHEET *sht, int vx0, int vy0) {int old_vx0 = sht->vx0, old_vy0 = sht->vy0;sht->vx0 = vx0;sht->vy0 = vy0;if (sht->height >= 0) //如果正在顯示,則按照新圖層信息刷新畫面 { sheet_refreshsub(ctl, old_vx0, old_vy0, old_vx0 + sht->bxsize, old_vy0 + sht->bysize);sheet_refreshsub(ctl, vx0, vy0, vx0 + sht->bxsize, vy0 + sht->bysize);}return; }/**釋放圖層*/ void sheet_free(struct SHTCTL *ctl, struct SHEET *sht) {if (sht->height >= 0) {sheet_updown(ctl, sht, -1);}sht->flags = 0;return; }

?

最后的效果圖:

轉載于:https://www.cnblogs.com/rixiang/p/5664952.html

總結

以上是生活随笔為你收集整理的自制操作系统(十) 图像叠加处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。