帧缓冲 framebuffer

news2024/9/22 3:59:50

一、基本概念

framebuffer: 帧缓存、帧缓存(显示设备)

Linux内核为显示提供的一套应用程序接口。(驱动内核支持)

分辨率:

像素点

显示屏:800 * 600(横向有800个像素点,纵向有600个像素点)

显卡(显存(保存像素点的值))

RGB

888(8个bitR,8个bit G,8个bit B)

PC ,4412(RGB888)

RGB565(S3C2440)

为了提高代码的书写效率(将RGB扩充到4字节)

二、解决显存空间不能直接被用户访问

根据显存的大小的多少,来申请空间

1、打开显示设备(/dev/fb0)

2、获取显示设备相关参数(分辨率、位深度......)

3、建立内存映射

4、写入RGB颜色值

5、解除映射

6、关闭显示设备

三、framebuffer常问话术

framebuff(是什么,具体原理、怎么做、)

是什么:Linux内核为显示提供的一套应用程序接口。(驱动内核支持)

具体原理:通过内存映射技术向显存空间写入RGB值

1、打开显示设备(/dev/fb0)

2、获取显示设备相关参数(分辨率、位深度......)

3、建立内存映射

4、写入RGB颜色值

5、解除映射

6、关闭显示设备

四、常见画图操作

1、画一个点

void draw_point(int x,int y,unsigned int col)
{
    if(x >= vinf.xres || y>= vinf.yres)
    {
        return;
    }
    if(vinf.bits_per_pixel == RGB888_FMT)
    {
        unsigned int *p = pmem;
        *(p + y * vinf.xres_virtual + x) = col;
    }
    else if(vinf.bits_per_pixel == RGB565_FMT)
    {
        unsigned short *p = pmem;
        *(p + y * vinf.xres_virtual + x) = col;

    }
}

2、画一条竖线,横线,斜线

void draw_line(int x0,int y0,int x1,int y1,unsigned int col)
{
    if(x0 >= vinf.xres|| y0 >= vinf.yres|| x1 >= vinf.xres || y1 >= vinf.yres)
    {
        return;
    }
    if(vinf.bits_per_pixel == RGB888_FMT)
    {
        int xmax = x0 > x1 ? x0 : x1;
        int xmin = x0 < x1 ? x0 : x1;
        if(x0 == x1)
        {
            int ymax = y0 > y1 ? y0 : y1;
            int ymin = y0 < y1 ? y0 : y1;
            for(int y = ymin;y < ymax;++y)
            {
                draw_point(x0,y,col);
            }
        }
        else if(y0 == y1)
        {
            for(int x = xmin;x < xmax;++x)
            {
                draw_point(x,y0,col);
            }
        }
        else
        {
            for(int x = xmin;x < xmax;++x)
            {
                int y = (y1 - y0)/(x1 - x0) * (x - x0) + y0;
                draw_point(x,y,col);

            }
        }
    }
    
}

3、画一个圆

void draw_circle(int x,int y,int r,unsigned int col)
{
    int xc = 0;
    int yc = r;
    int p = 3 - 2 * r;
    while(xc <= yc)
    {
        draw_point(x + xc ,y+yc,col);
        draw_point(x - xc ,y+yc,col);
        draw_point(x + xc ,y-yc,col);
        draw_point(x - xc ,y-yc,col);
        draw_point(x + yc ,y+xc,col);
        draw_point(x - yc ,y-xc,col);
        draw_point(x + yc ,y-xc,col);
        draw_point(x - yc ,y-xc,col);
        xc++;

        if(p < 0)
        {
            p += 4 *xc + 6;
        }
        else
        {
            yc--;
            p += 4 *(xc - yc) + 10;
        }

    }
}

4、画一个矩形

void draw_rectangle(int x,int y,int x0,int y0,unsigned int col)
{
    if(x >= vinf.xres || y>= vinf.yres)
    {
        return;
    }
    for(int i = x;i <= x0;++i)
    {
        draw_point(i,y,col);
    }
    for(int i = x;i <= x0;++i)
    {
        draw_point(i,y0,col);
    }
    for(int i = y;i <= y0;++i)
    {
        draw_point(x,i,col);
    }
    for(int i = y;i < y0;++i)
    {
        draw_point(x0,i,col);
    }

       
}

5、清屏

void clear_watch(unsigned int col)
{
    int i = 0;
    int j = 0;
    for(i = 0;i < vinf.xres;++i)
    {
        for(j = 0;j < vinf.yres;++j)
        {
            draw_point(i,j,col);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2122730.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

9.10总结

今天学习了树形dp 根据题目意思可以建出一颗树&#xff0c;先dfs递到叶节点&#xff0c;在归的时候有递推方程 dp[n][0]max(dp[s][1],dp[s][0]); dp[n][1]dp[s][0]; s为n的子节点&#xff0c;那么递推方程就写出来了&#xff0c;今天还做了几道dp&#xff0c;都是线性dp 总…

【电子通识】半导体工艺——刻蚀工艺

在文章【电子通识】半导体工艺——光刻工艺中我们讲到人们经常将 Photo Lithography&#xff08;光刻&#xff09;缩写成 Photo。光刻工艺是在晶圆上利用光线来照射带有电路图形的光罩&#xff0c;从而绘制电路。光刻工艺类似于洗印黑白照片&#xff0c;将在胶片上形成的图像印…

Vue组件:混入

1、基本用法 混入是一种为组件提供可复用功能的非常灵活的方式。混入对象可以包含任意的组件选项。当组件使用混入对象时&#xff0c;混入对象中的所有选项将被混入该组件本身的选项中。 语法格式如下&#xff1a; <script> //第一步&#xff1a;引用 mixin 对象 impo…

为什么说AI产业落地,下一代超级应用是“智能体”?

“未来超级应用方向就是AI Agent&#xff0c;ChatGPT很了不起、很强大&#xff0c;但与Agent不一样。AI Agent时代的到来&#xff0c;不会是一个神奇而强大的模型突然代替了所有的工作流&#xff0c;涉及到技术、工程与市场的不断磨合&#xff0c;最终以超预期的服务呈现给人类…

LED会议一体机开启超微小间距COB高清显示在会议系统中的新乐章

在当今数字化、信息化高速发展的时代&#xff0c;会议系统作为企业沟通、决策的重要平台&#xff0c;其显示技术的革新正以前所未有的速度推动着会议体验的飞跃。LED会议一体机&#xff0c;作为这一领域的佼佼者&#xff0c;特别是当其融合了超微小间距COB&#xff08;Chip On …

Transformer:自然语言处理领域的革命性神经网络架构

创作不易&#xff0c;您的打赏、关注、点赞、收藏和转发是我坚持下去的动力&#xff01; Transformer 是一种革命性的神经网络架构&#xff0c;最初由 Vaswani 等人在 2017 年的论文《Attention is All You Need》中提出。它主要用于自然语言处理&#xff08;NLP&#xff09;任…

组合模式composite

学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/composite 将对象组合成树状结构&#xff0c; 并且能像使用独立对象一样使用它们。组合最主要的功能是在整个树状结构上递归调用方法并对结果进行汇总。 可以把各种形状组合到一个CompoundShape类中…

Kotlin入门实用开发技巧与注意事项

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 Kotlin&#xff0c;这门由 JetBrains 开发的现代编程语言&#xff0c;自 2017 年被 Google 宣布为 Android 官方开发语言以来&#xff0c;便迅速…

第二个VUE项目(服务端带mysql数据库)

一、序言 第一个vue只有前端的羡慕部署成功后&#xff0c;立马想试试带数据库的了&#xff0c;于是在gitee上搜索了一下&#xff0c;带着试试的心里做了一次尝试&#xff0c;半天就部署完了&#xff0c;当真还是很兴奋。虽然没有改什么代码&#xff0c;但是熟悉了这整个环境&am…

用面向对象的方法进行数据分析

项目从两个不同类型的文件&#xff08;文本文件和 JSON 文件&#xff09;读取销售数据&#xff0c;将其封装为 Record 对象&#xff0c;合并数据后&#xff0c;统计每天的销售总额&#xff0c;并通过 pyecharts 库生成一个包含每日销售额的柱状图&#xff08;Bar chart&#xf…

day10-配置文件日志多线程

一、配置文件 1.1 properties配置文件 properties配置文件 特点:1、都只能是键值对2、键不能重复3、文件后缀一般是.properties结尾的 ​ Properties这是一个Map集合&#xff08;键值对集合&#xff09;&#xff0c;但是我们一般不会当集合使用主要用来代表属性文件&#xff0…

基于UDP的简易网络通信程序

目录 0.前言 1.前置知识 网络通信的大致流程 IP地址 端口号&#xff08;port&#xff09; 客户端如何得知服务器端的IP地址和端口号&#xff1f; 服务器端如何得知客户端的IP地址和端口号&#xff1f; 2.实现代码 代码模块的设计 服务器端代码 成员说明 成员实现 U…

今天讲点简单的:进制1

啊&#xff0c;哈喽&#xff0c;小伙伴们&#xff0c;大家好。我是#Y清墨&#xff0c;今天呐&#xff0c;我要介绍的是二进制。 导语 好久不见&#xff0c;今天来玩些简单的——二进制。 一.初步认识 十进制是逢十进一&#xff0c;那么&#xff0c;顾名思义&#xff0c;二进制…

完整的数仓能力,ByConity 1.0 版本发布!

文章来源&#xff5c;ByConity 开源社区 项目地址&#xff5c;https://github.com/ByConity/ByConity 2024年8月&#xff0c;ByConity 1.0 正式发布&#xff0c;翻开了 ByConity 新的一页。1.0 版本有哪些不同&#xff0c;以及 1.x 版本会重点迭代哪些能力&#xff0c;下面为大…

【NVMe SSD寄存器、数据结构】NVMe Controller 重要寄存器、SSD内部跟NVMe相关的重要数据结构解析

前言 NVMe Controller会将一些重要的信息&#xff08;NVMe控制器的能力&#xff0c;状态&#xff0c;Admin SQ, CQ地址等&#xff09;直接放在NVMe寄存器中&#xff0c;另一部分&#xff08;跟SSD比较相关的&#xff09;信息会放置在SSD内部&#xff0c;并最终通过Admin NVMe …

C:题目介绍

一、算天数 1.题目&#xff1a; kiki向获得某年某月有多少天&#xff0c;请帮他编程实现。输入年份和月份&#xff0c;计算这一年这个月有多少天。 输入描述&#xff1a; 多组输入&#xff0c;一行有两个整数&#xff0c;分别表示年份和月份&#xff0c;用空格分隔。 输出…

Python 从入门到实战13(字符串简介)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了流程控制语句中的循环语句。今天继续讨…

【机器学习】--- 逻辑回归算法

目录 逻辑回归基础1. 概述2.优点与缺点 逻辑回归的理论解释1.问题背景2. S i g m o i d Sigmoid Sigmoid函数3.决策边界4.损失函数 正则化1.L1正则化2.L2正则化 逻辑回归基础 1. 概述 逻辑回归是机器学习的一种分类算法&#xff0c;主要运用于二分类问题。将线性回归的结果&a…

day-52 三数之和

思路 双指针&#xff1a;确定最小的那个数&#xff08;i0<i<nums.length-2&#xff09;&#xff0c;剩下两个数可以利用双指针的思想。当最小的那个数大于零时&#xff0c;可以直接返回&#xff0c;因为后面的不可能还有满足题意的组合。 解题过程 为了所有满足题意的组…

async、await、promise异步操作详解

一、async、await、Promise使用介绍 当然&#xff01;在 TypeScript 中&#xff0c;Promise 的使用可以涉及多个方面&#xff0c;包括基础用法、类型系统、异步操作的错误处理以及高级用法等。下面我会详细讲解这些内容。 1. Promise 的基本概念 Promise 是一种用于处理异步操…