全网首发:JDK绘制文字:四、绘制文字的具体函数分析
经历过一番分析,我们对绘制的相关工作大体了解了。现在要问:具体绘制函数是哪个?代码内容是怎样的?
- 预备知识
绘制文字,说到底就是把字体文件中对应的图像数据画上去(代码上就是复制到某个缓冲区)。
图像,包含几个关键信息:图像宽和高,格式(每个像素是bit,还是byte)。结合宽和格式,就产生了一个每行几个字节的信息。
- ByteBinary1Bit.c
DEFINE_BYTE_BINARY_SOLID_DRAWGLYPHLIST(ByteBinary1Bit)
- DEFINE_BYTE_BINARY_SOLID_DRAWGLYPHLIST(AnyByteBinary.h)
在LoopMacros.h中有一个类似的DEFINE_SOLID_DRAWGLYPHLIST宏定义。二者几乎一样。
#define DEFINE_BYTE_BINARY_SOLID_DRAWGLYPHLIST(DST) \
void NAME_SOLID_DRAWGLYPHLIST(DST)(SurfaceDataRasInfo *pRasInfo, \ImageRef *glyphs, \jint totalGlyphs, jint fgpixel, \jint argbcolor, \jint clipLeft, jint clipTop, \jint clipRight, jint clipBottom, \NativePrimitive *pPrim, \CompositeInfo *pCompInfo) \
{ \jint glyphCounter; \jint scan = pRasInfo->scanStride; \DST ## DataType *pPix; \
\//totalGlyphs: 本次绘制几个文字for (glyphCounter = 0; glyphCounter < totalGlyphs; glyphCounter++) { \DeclareDrawGlyphListClipVars(pixels, rowBytes, width, height, \left, top, right, bottom) \ClipDrawGlyphList(DST, pixels, 1, rowBytes, width, height, \left, top, right, bottom, \clipLeft, clipTop, clipRight, clipBottom, \glyphs, glyphCounter, continue) \pPix = PtrCoord(pRasInfo->rasBase,left,DST ## PixelStride,top,scan); \
\do { \Declare ## DST ## InitialLoadVars(pRasInfo, pPix, DstPix, left) \jint x = 0; \do { \InitialLoad ## DST(pPix, DstPix); \if (pixels[x]) { \Store ## DST ## PixelData(pPix, 0, fgpixel, DstPix); \} \ShiftBits ## DST(DstPix); \} while (++x < width); \FinalStore ## DST(pPix, DstPix); \pPix = PtrAddBytes(pPix, scan); \// rowBytes就是每行几个字节pixels += rowBytes; \} while (--height > 0); \} \
}
终于,我们找到了真正的绘制函数。
- DeclareDrawGlyphListClipVars(LoopMacros.h)
声明一些局部变量。
#define DeclareDrawGlyphListClipVars(PIXELS, ROWBYTES, WIDTH, HEIGHT, \LEFT, TOP, RIGHT, BOTTOM) \const jubyte * PIXELS; \int ROWBYTES; \int LEFT, TOP; \int WIDTH, HEIGHT; \int RIGHT, BOTTOM;
- ClipDrawGlyphList(LoopMacros.h)
初始化声明的局部变量。这里可以看到width/height是如何初始化的。
#define ClipDrawGlyphList(DST, PIXELS, BYTESPERPIXEL, ROWBYTES, WIDTH, HEIGHT,\LEFT, TOP, RIGHT, BOTTOM, \CLIPLEFT, CLIPTOP, CLIPRIGHT, CLIPBOTTOM, \GLYPHS, GLYPHCOUNTER, NULLGLYPHCODE) \PIXELS = (const jubyte *)GLYPHS[GLYPHCOUNTER].pixels; \if (!PIXELS) { \NULLGLYPHCODE; \} \ROWBYTES = GLYPHS[GLYPHCOUNTER].rowBytes; \LEFT = GLYPHS[GLYPHCOUNTER].x; \TOP = GLYPHS[GLYPHCOUNTER].y; \WIDTH = GLYPHS[GLYPHCOUNTER].width; \HEIGHT = GLYPHS[GLYPHCOUNTER].height; \
\/* if any clipping required, modify parameters now */ \RIGHT = LEFT + WIDTH; \BOTTOM = TOP + HEIGHT; \if (LEFT < CLIPLEFT) { \/* Multiply needed for LCD text as PIXELS is really BYTES */ \PIXELS += (CLIPLEFT - LEFT) * BYTESPERPIXEL ; \LEFT = CLIPLEFT; \} \if (TOP < CLIPTOP) { \PIXELS += (CLIPTOP - TOP) * ROWBYTES; \TOP = CLIPTOP; \} \if (RIGHT > CLIPRIGHT) { \RIGHT = CLIPRIGHT; \} \if (BOTTOM > CLIPBOTTOM) { \BOTTOM = CLIPBOTTOM; \} \if (RIGHT <= LEFT || BOTTOM <= TOP) { \NULLGLYPHCODE; \} \WIDTH = RIGHT - LEFT; \HEIGHT = BOTTOM - TOP;
看到这里,我们不禁要问:字体的位图信息,是怎么来的呢?
全网首发:JDK绘制文字:四、绘制文字的具体函数分析相关推荐
- CorelDraw插件开发-文字功能-文本分列-创建文本-函数分析-Cdr插件开发教程(二)
文章目录 1.函数-sub_2381FDE0-进程资源锁 2.大致分析了一下函数结构 3.动态调试 4.上一级函数分析 5.VBA宏功能 6.总结 逆向代码的学习需要耐心,往往高手的代码会用到你想不到 ...
- 【python图像处理】几何图形的绘制与文字的绘制(ImageDraw类详解)
python PIL图像处理模块中的ImageDraw类支持各种几何图形的绘制和文本的绘制,如直线.椭圆.弧.弦.多边形以及文字等. 下面直接通过示例来进行说明: #-*- coding: UTF-8 ...
- python中用于绘制各种图形、标注文本_python ImageDraw类实现几何图形的绘制与文字的绘制...
python PIL图像处理模块中的ImageDraw类支持各种几何图形的绘制和文本的绘制,如直线.椭圆.弧.弦.多边形以及文字等. 下面直接通过示例来进行说明: #-*- coding: UTF-8 ...
- 在图像中绘制基本形状和文字
目录 一 基本形状的绘制 二 随机数 三 绘制文字 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 基本形状的绘制 本文的内容和数字图像处理的关系不大,主要是关于OpenCV提供的在图像中绘 ...
- ImageDraw类详解:几何图形的绘制与文字的绘制
python PIL图像处理模块中的ImageDraw类支持各种几何图形的绘制和文本的绘制,如直线.椭圆.弧.弦.多边形以及文字等. 下面直接通过示例来进行说明: #-*- coding: UTF-8 ...
- 自定义TextView实现渐变色边框,渐变色文字并绘制drawable
工作需求,渐变色的边框和文字,还需要显示drawable.我们知道如果是View的背景色渐变,那么很好办,只需要写一个drawable文件,里面定义shape然后设置为View的background就 ...
- python 滚动字幕_Python pygame绘制文字制作滚动文字过程解析
这篇文章主要介绍了Python pygame绘制文字制作滚动文字过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 字体常用的不是很多,在pyg ...
- Canvas入门教学(3)图片与文字的绘制
上节课跟大家讲解了基本的线条和多边形的绘制,主要的方法是stroke()和fill()方法.并且还封装了两个动态绘制线条和多边形的方法.这节课我们带领大家来认识一下文字以及图片的绘制,从而理解一下ca ...
- 【学习OpenCV4】OpenCV绘制标记/线/矩形/文字/圆等
本文分享内容来自图书<学习OpenCV 4:基于Python的算法实战>,该书内容如下: 第1章 OpenCV快速入门: 第2章 图像读写模块imgcodecs: 第3章 核心库模块cor ...
- H5canvas(绘制矩形,绘制圆形,绘制线段,绘制文字,绘制曲线)
Canvas简介 canvas 最早由Apple引入WebKit,用于Mac OS X 的 Dashboard,后来又在Safari和Google Chrome被实现. 基于 Gecko 1.8的浏览 ...
最新文章
- Leetcode 912. Sort an Array
- 爱情第五课,终极选择题
- 电影院票务管理系统数据库设计(1)
- lisp 批量文字求差值_Python 超简单 提取音乐高潮(附批量提取)
- python-study-12
- dreambackend.java_【AndroidTV】如何自定义屏保、更改屏保时长
- hive 导出json格式 文件_hive存储json格式文件
- 0.Overview----Machine Learning
- Python文件练习
- 【DevCloud · 敏捷智库】如何进行需求优先级管理?
- 【DevOps】做个愉快的DevOps之XenServer自动化管理(1)
- SAP MM 采购单据中的’Origin Accept’选项会影响Inbound Delivery创建操作方式
- Archlinux 在启动时出现Error file vmlinuz not found解决方法
- 电信机顶盒怎么连接鸿蒙系统电视,电信机顶盒的密码是多少,怎么改密码
- DSP SRIO接口设计
- 【线性分类器】线性分类器理论知识
- Hexo 的next主题下添加网易云音乐作BGM
- 我们上语文英语音乐计算机和美术英语,“制作课程表”教学设计.ppt
- SSD-tensorflow-2 制作自己的数据集
- 10.curry 方法
热门文章
- 关于Hive数据仓库的那些事儿(一)模式设计
- java 读取配置文件的几种方法
- logistic回归详解(二):损失函数(cost function)详解
- matlab e52pt,matlab 神经网络的文字识别 有详细注释-补充样本
- linux 创建文件_Linux怎么创建文件或更新文件日期
- python3.9出了吗_Python 3.9正式版,新特性提前一睹为快
- vim配置运行python3快捷键_Linux VIM8 Python3 编辑器配置文件
- unity天气系统_天气系统(一)
- bootstrap modal弹出框实现及实现按钮点击复制功能
- 关于elastic-job 分片与线程问题