สร้าง SDL_Texture จาก FT_Bitmap

หลังจากห่างหายกับเรื่องการวาดตัวอักษรไปนาน วันนี้จะมาอัพเดตเรื่องนี้สักเล็กน้อย

ในตัวอย่างเก่า ๆ ผมใช้การสร้าง SDL_Surface ขึ้นมาแล้วเรียก SDL_CreateTextureFromSurface() ในการสร้าง Texture ก่อนที่จะวาดลงไป วิธีนี้มีข้อเสียเพราะว่าเราจะมี object ใช้แล้วทิ้งเพิ่มมาหนึ่งตัว ซึ่งถ้าเราสามารถลดตรงนี้ไปได้โค๊ดเราก็จะทำงานได้อย่างมีประสิทธิภาพมากขึ้นครับ

โค๊ดก็ไม่ได้มีอะไรซับซ้อนเลย

SDL_Texture* CreateTextureFromFT_Bitmap(SDL_Renderer* renderer,
                                        const FT_Bitmap& bitmap,
                                        const SDL_Color& color)
{
    SDL_Texture* output = SDL_CreateTexture(renderer,
            SDL_PIXELFORMAT_RGBA8888,
            SDL_TEXTUREACCESS_STREAMING,
            bitmap.width,
            bitmap.rows);

    void *buffer;
    int pitch;
    SDL_LockTexture(output, NULL, &buffer, &pitch);

    unsigned char *src_pixels = bitmap.buffer;
    unsigned int *target_pixels = reinterpret_cast<unsigned int*>(buffer);

    SDL_PixelFormat* pixel_format = SDL_AllocFormat(SDL_PIXELFORMAT_RGBA8888);

    for (int y = 0; y < bitmap.rows; y++)
    {
        for (int x = 0; x < bitmap.width; x++)
        {
            int index = (y * bitmap.width) + x;
            unsigned int alpha = src_pixels[index];
            unsigned int pixel_value =
                    SDL_MapRGBA(pixel_format, color.r, color.g, color.b, alpha);

            target_pixels[index] = pixel_value;
        }
    }

    SDL_FreeFormat(pixel_format);
    SDL_UnlockTexture(output);

    return output;
}

ผมเปลี่ยนไปใช้ return statement แทนการใช้ pass-by-reference นะครับ โค๊ดจะอ่านง่ายขึ้นพอสมควร ส่วนการเอาไปใช้ก็เหมือนเดิมครับ อาจจะต้องปรับเปลี่ยนโค๊ดเดิมนิดหน่อยแต่ก็ไม่เกินความสามารถกันอยู่แล้ว

โค๊ดชุดนี้มีการลดการใช้ hardcode ในส่วนของการคำนวนค่าในแต่ละ pixel ลง จากของเก่าจะเป็นการยึด format มาเลย ก็เปลี่ยนมาใช้ SDL_MapRGBA() แทน แต่โค๊ดนี้ก็ยังอยู่ภายใต้ข้อจำกัดที่ว่าแต่ละ pixel นั้นมีขนาด 4 byte อันนี้อาจจะมีการแก้ไขในอนาคตครับ

อ่านแล้วก็ไปลองเล่นกันดูนะครับ :-)

Wutipong Wongsakuldej

Programmer, interested in frontend applications, music and multimedia.

Latest posts by Wutipong Wongsakuldej (see all)

Leave a Reply

Your email address will not be published. Required fields are marked *