[√]freetype2 bitmap纹理转换

简介: [√]freetype2 bitmap纹理转换

QImage的坐标系

(0,0)-------
|           |
|           |
|           |
|           |
|--------(1,1)
int width = 20, height = 10;
int size = width * height;
unsigned char* buffer = (unsigned char*)malloc(size);
if (!buffer)
{
    return;
}
// 0黑色 255白色
memset(buffer, 0, size);
// 第一象限灰色
for (int i = 0;i < height / 2;i++)
{
    for (int j = 0;j < width / 2;j++)
    {
        buffer[i * width + j] = 100;
    }
}
view->showA8Texture(width, height, buffer, size);
free(buffer);

image.png

可以看到第一象限在左上角,符合坐标系的预期。

FT_Bitmap

FT_Bitmap的结构

typedef struct  FT_Bitmap_
{
unsigned int    rows;
unsigned int    width;
int             pitch;
unsigned char*  buffer;
unsigned short  num_grays;
unsigned char   pixel_mode;
unsigned char   palette_mode;
void*           palette;
} FT_Bitmap;

buffer指向的就是纹理内存,这个纹理内存的坐标系和QImage一致,都是左上角是(0,0)

image.png

cocos

cocos2dx 中对bitmap的纹理有个转换

// 绘制的起始坐标
int iX = posX;
int iY = posY;
for (long y = 0; y < bitmapHeight; ++y){
    long bitmap_y = y * bitmapWidth;
    for (int x = 0; x < bitmapWidth; ++x){
        unsigned char cTemp = bitmap[bitmap_y + x];
        // the final pixel
        int dest_idx = (iX + (iY * FontAtlas::CacheTextureWidth));
        dest[dest_idx] = cTemp;
        CCLOG("bitmap:%d => dest:%d", bitmap_y + x, dest_idx);
        iX += 1;
    }
    iX  = posX;
    iY += 1;
}
width:43, height:86
bitmap:0 => dest:513 = (1 + (1*512))
bitmap:1 => dest:514
bitmap:2 => dest:515
bitmap:3 => dest:516
bitmap:4 => dest:517
bitmap:5 => dest:518
bitmap:6 => dest:519
bitmap:7 => dest:520
bitmap:8 => dest:521
bitmap:9 => dest:522
bitmap:10 => dest:523
bitmap:11 => dest:524
bitmap:12 => dest:525
bitmap:13 => dest:526
bitmap:14 => dest:527
bitmap:15 => dest:528

把纹理copy到了大纹理里面,并且有(1,1)的偏移,从下图看的更加清晰: image.png

使用到QImage去查看纹理数据

不要被OpenGL的坐标系迷惑,engine会自动处理坐标系问题

目录
相关文章
|
8月前
|
XML API 开发工具
Android Bitmap 加载与像素操作
Android Bitmap 加载与像素操作
70 2
[√]OpenGL绘制图片
[√]OpenGL绘制图片
131 0
|
缓存 算法 机器人
Android OpenGL ES(七)----理解纹理与纹理过滤
Android OpenGL ES(七)----理解纹理与纹理过滤
285 0
Android OpenGL ES(七)----理解纹理与纹理过滤
|
索引
OpenGL ES 案例07:GLSL使用索引绘图 + 纹理颜色混合
OpenGL ES 案例07:GLSL使用索引绘图 + 纹理颜色混合
352 0
OpenGL ES 案例07:GLSL使用索引绘图 + 纹理颜色混合
|
存储 Java 数据处理
【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( JNI 传递 Bitmap | 获取位图信息 | 获取图像数据 | 图像数据过滤 | 释放资源 )
【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( JNI 传递 Bitmap | 获取位图信息 | 获取图像数据 | 图像数据过滤 | 释放资源 )
445 0
|
Windows
[UWP]使用Writeable?Bitmap创建HSV色轮
原文:[UWP]使用Writeable?Bitmap创建HSV色轮 1. HSV 1.1 HSV的定义 HSV都是一种将RGB色彩模型中的点在圆柱坐标系中的表示法,这种表示法试图做到比RGB基于笛卡尔坐标系的几何结构更加直观。
1498 0
|
API Android开发 前端开发