经历过一番分析,我们对绘制的相关工作大体了解了。现在要问:具体绘制函数是哪个?代码内容是怎样的?

  • 预备知识

  绘制文字,说到底就是把字体文件中对应的图像数据画上去(代码上就是复制到某个缓冲区)。

  图像,包含几个关键信息:图像宽和高,格式(每个像素是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绘制文字:四、绘制文字的具体函数分析相关推荐

  1. CorelDraw插件开发-文字功能-文本分列-创建文本-函数分析-Cdr插件开发教程(二)

    文章目录 1.函数-sub_2381FDE0-进程资源锁 2.大致分析了一下函数结构 3.动态调试 4.上一级函数分析 5.VBA宏功能 6.总结 逆向代码的学习需要耐心,往往高手的代码会用到你想不到 ...

  2. 【python图像处理】几何图形的绘制与文字的绘制(ImageDraw类详解)

    python PIL图像处理模块中的ImageDraw类支持各种几何图形的绘制和文本的绘制,如直线.椭圆.弧.弦.多边形以及文字等. 下面直接通过示例来进行说明: #-*- coding: UTF-8 ...

  3. python中用于绘制各种图形、标注文本_python ImageDraw类实现几何图形的绘制与文字的绘制...

    python PIL图像处理模块中的ImageDraw类支持各种几何图形的绘制和文本的绘制,如直线.椭圆.弧.弦.多边形以及文字等. 下面直接通过示例来进行说明: #-*- coding: UTF-8 ...

  4. 在图像中绘制基本形状和文字

    目录 一 基本形状的绘制 二 随机数 三 绘制文字 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 基本形状的绘制 本文的内容和数字图像处理的关系不大,主要是关于OpenCV提供的在图像中绘 ...

  5. ImageDraw类详解:几何图形的绘制与文字的绘制

    python PIL图像处理模块中的ImageDraw类支持各种几何图形的绘制和文本的绘制,如直线.椭圆.弧.弦.多边形以及文字等. 下面直接通过示例来进行说明: #-*- coding: UTF-8 ...

  6. 自定义TextView实现渐变色边框,渐变色文字并绘制drawable

    工作需求,渐变色的边框和文字,还需要显示drawable.我们知道如果是View的背景色渐变,那么很好办,只需要写一个drawable文件,里面定义shape然后设置为View的background就 ...

  7. python 滚动字幕_Python pygame绘制文字制作滚动文字过程解析

    这篇文章主要介绍了Python pygame绘制文字制作滚动文字过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 字体常用的不是很多,在pyg ...

  8. Canvas入门教学(3)图片与文字的绘制

    上节课跟大家讲解了基本的线条和多边形的绘制,主要的方法是stroke()和fill()方法.并且还封装了两个动态绘制线条和多边形的方法.这节课我们带领大家来认识一下文字以及图片的绘制,从而理解一下ca ...

  9. 【学习OpenCV4】OpenCV绘制标记/线/矩形/文字/圆等

    本文分享内容来自图书<学习OpenCV 4:基于Python的算法实战>,该书内容如下: 第1章 OpenCV快速入门: 第2章 图像读写模块imgcodecs: 第3章 核心库模块cor ...

  10. H5canvas(绘制矩形,绘制圆形,绘制线段,绘制文字,绘制曲线)

    Canvas简介 canvas 最早由Apple引入WebKit,用于Mac OS X 的 Dashboard,后来又在Safari和Google Chrome被实现. 基于 Gecko 1.8的浏览 ...

最新文章

  1. Leetcode 912. Sort an Array
  2. 爱情第五课,终极选择题
  3. 电影院票务管理系统数据库设计(1)
  4. lisp 批量文字求差值_Python 超简单 提取音乐高潮(附批量提取)
  5. python-study-12
  6. dreambackend.java_【AndroidTV】如何自定义屏保、更改屏保时长
  7. hive 导出json格式 文件_hive存储json格式文件
  8. 0.Overview----Machine Learning
  9. Python文件练习
  10. 【DevCloud · 敏捷智库】如何进行需求优先级管理?
  11. 【DevOps】做个愉快的DevOps之XenServer自动化管理(1)
  12. SAP MM 采购单据中的’Origin Accept’选项会影响Inbound Delivery创建操作方式
  13. Archlinux 在启动时出现Error file vmlinuz not found解决方法
  14. 电信机顶盒怎么连接鸿蒙系统电视,电信机顶盒的密码是多少,怎么改密码
  15. DSP SRIO接口设计
  16. 【线性分类器】线性分类器理论知识
  17. Hexo 的next主题下添加网易云音乐作BGM
  18. 我们上语文英语音乐计算机和美术英语,“制作课程表”教学设计.ppt
  19. SSD-tensorflow-2 制作自己的数据集
  20. 10.curry 方法

热门文章

  1. 关于Hive数据仓库的那些事儿(一)模式设计
  2. java 读取配置文件的几种方法
  3. logistic回归详解(二):损失函数(cost function)详解
  4. matlab e52pt,matlab 神经网络的文字识别 有详细注释-补充样本
  5. linux 创建文件_Linux怎么创建文件或更新文件日期
  6. python3.9出了吗_Python 3.9正式版,新特性提前一睹为快
  7. vim配置运行python3快捷键_Linux VIM8 Python3 编辑器配置文件
  8. unity天气系统_天气系统(一)
  9. bootstrap modal弹出框实现及实现按钮点击复制功能
  10. 关于elastic-job 分片与线程问题