大体需求是,有一个文字点阵,叫glyph,为单色点阵,有笔画的地方为黑色,1;无笔画的地方为白色,0;

现在要把这个字画到屏幕,还有一个要求,要用当前颜色画;

分析来分析去,这就是一个简单的rop3操作,或者简单一点,就是一个遮罩特效:使用glyph当遮罩,使用当前颜色画矩形,仅此而以。

但是,目前没有在Skia中找到类似的操作,只找到SkXformode里有这样的定义:

enum Mode {

kClear_Mode, //!< [0, 0]

kSrc_Mode, //!< [Sa, Sc]

kDst_Mode, //!< [Da, Dc]

kSrcOver_Mode, //!< [Sa + Da - Sa*Da, Rc = Sc + (1 -

Sa)*Dc]

kDstOver_Mode, //!< [Sa + Da - Sa*Da, Rc = Dc + (1 -

Da)*Sc]

kSrcIn_Mode, //!< [Sa * Da, Sc * Da]

kDstIn_Mode, //!< [Sa * Da, Sa * Dc]

kSrcOut_Mode, //!< [Sa * (1 - Da), Sc * (1 - Da)]

kDstOut_Mode, //!< [Da * (1 - Sa), Dc * (1 - Sa)]

kSrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc]

kDstATop_Mode, //!< [Sa, Sa * Dc + Sc * (1 - Da)]

kXor_Mode, //!< [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1-Sa)* Dc]

......

基本上看不懂,光看公式,没法知道到底是个什么效果;看来只有使用这些东西来模拟遮罩效果了。

试验来试验去,下面的代码可以实现:

1 首先,把单色位图转换成32位

static void depth1to32(const uint16 * data, uint8 * out,

uint8

*

end)

{

uint16 pixel;

uint32 value;

......

// glyph : src SkBitmap

// bitmap : dst SkBitmap

int width;

int height;

width = glyph->width();

height = glyph->height();

uint8 *sbits;

sbits = (uint8 *)data;

int sstride;

sstride = (width + 7) / 8;

uint8 *sline;

sline = sbits;

// check format

uint8 *dbits;

dbits = (uint8 *)out;

int dstride;

dstride = bitmap->rowBytes();

int dbpp; // bytes per pixel

dbpp = bitmap->bytesPerPixel();

uint8 *dline;

dline = dbits;

while (height--)

{

int w = width;

uint8 *dline1 = dline;

uint8 *sline1 = sline;

while(w > 0)

{

uint8 pixel8;

pixel8 = *(sline1++);

for(int i = 0; i < (w < 8 ? w : 8); i++)

{

uint8 c = 1 < < (7 - i);

if(pixel8 & c)

{

*(dline1++) = 0;

*(dline1++) = 0;

*(dline1++) = 0;

// 这个地方,如果最高两个字节是0,则表示透明

*(dline1++) = 0xFF;

}

else

{

*(dline1++) = 0xff;

*(dline1++) = 0xff;

*(dline1++) = 0xff;

// 这个地方,如果最高两个字节是0,则表示透明

*(dline1++) = 0;

}

}

w -= 8;

}

dline += dstride;

sline += sstride;

}

}

......

2 使用当前颜色转换遮罩

SkBitmap *srcbmp = (SkBitmap*)(bitmap);

SkPaint paint;

SkCanvas canvas(*srcbmp);

paint.setXfermodeMode(SkXfermode::kSrcIn_Mode);

paint.setColor(display->foreColor);

SkRect rect = { 0, 0, srcbmp->width(),

srcbmp->height()};

canvas.drawRect(rect, paint);

自此,srcbmp已经变成了当前颜色表示的字符点阵

3 把字符画到屏幕

SkShader* s = SkShader::CreateBitmapShader(*srcbmp,

SkShader::kClamp_TileMode,

SkShader::kClamp_TileMode);

SkMatrix matrix;

matrix.reset();

matrix.postTranslate(x, y);

SkShader *shader = (SkShader *)s;

shader->setLocalMatrix(matrix); // 设置原点

SkPaint *paint = (SkPaint *)paint;

paint->setShader(shader)->unref();

paint->setXfermodeMode(SkXfermode::kSrcOver_Mode);

paint->setColor(display->foreColor);

SkRect rect = { x, y, x + w, y + h};

canvas->drawRect(rect, *paint);

这段代码,相当于把一个部分区域透明的pattern画到屏幕上

这样,我们就实现了字符遮罩的功能,使用当前颜色把字符画到屏幕上了。

当然,我们只是画了一个单色字符,其实也可以画很复杂的图案,类似于PS和Flash里的遮罩层的效果。

以上代码是示意代码,因此有些地方明显无法编译,有些地方明显多此一举,请注意。

另,Skia有类似Mask的概念,但看来看去,好像没有我们这里说的遮罩功能。

如果大家有更好的实现方法,也请告诉我一下。

skia android 教程,Android下Skia遮罩特效的实现相关推荐

  1. Xamarin Android教程Android基本知识版本介绍与系统介绍

    Xamarin Android教程Android基本知识版本介绍与系统介绍 Xamarin Android教程Android基本知识版本介绍与系统介绍,开发Andriod有时候不像iOS一样轻松,因为 ...

  2. android教程 - android ui 介绍,多图详解 “Android UI”设计官方教程

    我们曾经给大家一个<MeeGo移动终端设备开发UI设计基础教程>,同时很多朋友都在寻找Android UI开发的教程,我们从Android的官方开发者博客找了一份幻灯片,介绍了一些Andr ...

  3. flex+android+教程,android开发flex4.5入门教程.pdf

    android开发flex4.5入门教程 中国矿业大学教务部 教务通知(2013 )第33 号 关于做好各级"大学生创新训练计划" 项目中期检查和结题验收的通知 各学院: 为加强我 ...

  4. monkey android 教程,Android Monkey使用详解

    Monkey 是Android SDK提供的一个命令行工具,是一个黑盒压力测试工具,采用随机算法,对被测应用随机发送伪随机的用户事件流,如点击,拖拽,滑动,输入等,来确定应用是否会发生异常,并且会产生 ...

  5. 2020最新android教程,Android教程2020

    本文介绍RecyclerView设置点击的方法.这里给出比较常见的使用方式. 用户点击某个item时,app可以做出相应的反应.这里我们使用添加点击监听器的方式来实现这个效果. Android开发中, ...

  6. orbot android教程,Android Orbot malformed reply from SOCKS server

    问题 I am trying to enable TOR support on my own XMPP app in android. I am using orbot as TOR proxy an ...

  7. android对skia的封装,Skia引擎API整理介绍(skia in Android 2.3 trunk)

    序 通过google, baidu,我们都很难搜索到关于skia引擎方面的文档,skia的官方wiki(http://code.google.com/p/skia) 也只有寥寥无几的文字简单介绍了Sk ...

  8. android studio最新教程pdf下载,android studio教程pdf下

    android studio教程pdf下 [2021-02-13 15:00:57]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace( ...

  9. android渲染是skia与egl,opengl和skia哪个快 游戏电脑问题解决分享!

    从Honeycomb[3.x]版本起,Andorid便支持GPU加速,但目前Android并没有使用Skia GPU进行Webkit渲染.Skia GPU使用OpenGL进行后台加速渲染,未来也许会代 ...

最新文章

  1. ValueError: Bin labels must be one fewer than the number of bin edges
  2. yolov5检测完不显示框和标注
  3. [My B.S paper draft]我的本科答辩论文草稿
  4. html使用共同的头部导航
  5. (58)模拟线程切换——添加挂起、恢复线程功能
  6. Sequence II (HDU 5919)(主席树)
  7. 动态规划 —— 背包问题 P09 —— 背包问题的变化
  8. eclipse中在线安装gradle插件
  9. java 冗余,java代码冗余
  10. Linux 邮件服务器 之跟我一步一步来实现一个邮件系统
  11. sprintf参数包含本身时,结果并不符合预期
  12. 使用WMI和性能计数器监控远程服务器权限设置
  13. Informix ODBC 设置
  14. WINCC 7.4 SP1 7.5 博图v16 硬件学习补丁
  15. 【校招VIP】产品行测之逻辑推理
  16. 2022-车道线检测综述
  17. Lambda表达式----“进化论”
  18. 只要简单7步就能破解魔方的图文教程!怎样还原魔方?
  19. MySQL varchar类型可以存储多少个汉字
  20. 人工智能之知识图谱体系总结

热门文章

  1. xampp安装php源码教程,XAMPP的安装图文教程
  2. 【Linux】HTTP/HTTPS
  3. python学习笔记-马哥2017
  4. c语言while嵌套循环语句,C语言 while 循环嵌套-嗨客网
  5. 探索未来|一文看懂小米年度技术峰会 · 互联网技术专场
  6. 从搜索引擎到人工智能看百度科技创新之路
  7. java tess4j ddl_tess4j jna dll报错,求助
  8. ADRC从入门到放弃0
  9. sudo:/etc/sudoers 可被任何人写 解决方案
  10. 一条 shell 命令的阻塞与唤醒