Hi developers,
I am turning to you with my problem to use colors as described here.
https://gitlab.freedesktop.org/freetype/freetype/-/issues/1099
To invoke this issue I use a function* FT_Palette_Set_Foreground_Color* in
my source code (in the attachment). The tail of make log file is also in
the attachment.
The aim of my work is to show a text on an OLED display. This works but it
looks ugly. Half of a text is not visible and there is a black background
that I can't change.
https://stackoverflow.com/questions/69222145/freetype-set-size-and-color-of-bounding-box
Is there something I have missed?

I will appreciate help
Lenka Polaskova
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_COLOR_H
#include "log.h"
#include <fcntl.h>
#include <string.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <linux/kd.h>
#include <assert.h>

#define WIDTH   640
#define HEIGHT  480

FT_Library ft;
FT_Face face;

unsigned char image[WIDTH][HEIGHT];

void show_image( char *fb );

void show_image( char *fb )
{
  int  i, j;


  for ( i = 0; i < WIDTH; i++ )
  {
    for ( j = 0; j < HEIGHT; j++ )
      fb[i+2432*j] = image[i][j];
  }
}

static void draw_bitmap(char *fb, FT_Bitmap*  bitmap,
             FT_Int      x,
             FT_Int      y)
{
  FT_Int  i, j, p, q;
  FT_Int  x_max = x + bitmap->width;
  FT_Int  y_max = y + bitmap->rows;
 
  for ( i = x, p = 0; i < x_max; i++, p++ )
  {
    for ( j = y, q = 0; j < y_max; j++, q++ )
    {
      if ( i < 0      || j < 0       ||
           i >= WIDTH || j >= HEIGHT )
        continue;

      image[i][j] |= bitmap->buffer[q * bitmap->width + p];

    }
  }
}

int TypewriterSetForeground(uint32_t color) {
    FT_Color fc;
    fc.alpha = color & 0xFF000000 >> 24;
    fc.red = color & 0xFF0000 >> 16;
    fc.green = color & 0xFF00 >> 8;
    fc.blue = color & 0xFF;
    
    FT_Palette_Set_Foreground_Color(face, fc);
}

int TypewriterInit(void) {

    if (FT_Init_FreeType(&ft))
    {
        LOG_E("Typewriter init failed");
        return -1;
    }


    if (FT_New_Face(ft, "/root/projects/GPU/fonts/arial.ttf", 0, &face))
    {
        LOG_E("Typewriter failed to load font");
        return -1;
    }

}

int TypewriterRenderText(char *fb, char *text) {
    
    int n = 0;
    int           target_height = 600;
    int pen_x = 300;
    int pen_y = 200;

    assert(text!=NULL);
    FT_ULong character = 'x';
    FT_UInt       glyph_index;
    FT_Vector     pen;
    FT_UInt gi = FT_Get_Char_Index (face, character);

    /* char width, height, horz_resolution, vert_resolution, 50pt at 100dpi */
    if(FT_Set_Char_Size(face, 100 * 64, 0,
                            100, 100 )) {
        LOG_E("Set char size failed");
        return -1;
    }

    for (n = 0; n < strlen(text); n++) {
        
        if (text[n] == 'g') {
            FT_UInt gi = FT_Get_Char_Index (face, text[n]);
            FT_Load_Glyph (face, gi, FT_LOAD_DEFAULT);
            face->glyph->metrics.horiBearingY = 
face->glyph->metrics.horiBearingY + 5;
        }
         
        FT_Load_Char( face, text[n], FT_LOAD_RENDER );
         
         draw_bitmap(fb, &face->glyph->bitmap,
                 pen_x  + face->glyph->bitmap_left,
                 pen_y  + face->glyph->bitmap_top );
        /* increment pen position */
        pen_x += face->glyph->advance.x >> 6;
        printf("Char %c is printed \n", text[n]);
    }
    
    show_image(fb);
}


cc -Wall  -g -DCO_SINGLE_THREAD -D_LARGE_FILE_SOURCE=1 -ICANopenLinux 
-ICANopenLinux/CANopenNode -IGPU -ISrc -I/../../usr/local/include/freetype2  
-Wl,--stack,67108864 -c Src/main.c -o Src/main.o
cc  -g -lrt -lpng -pthread -lfreetype CANopenLinux/CO_driver.o 
CANopenLinux/CO_error.o CANopenLinux/CO_epoll_interface.o 
CANopenLinux/CO_storageLinux.o CANopenLinux/CANopenNode/301/CO_ODinterface.o 
CANopenLinux/CANopenNode/301/CO_NMT_Heartbeat.o 
CANopenLinux/CANopenNode/301/CO_HBconsumer.o 
CANopenLinux/CANopenNode/301/CO_Emergency.o 
CANopenLinux/CANopenNode/301/CO_SDOserver.o 
CANopenLinux/CANopenNode/301/CO_SDOclient.o 
CANopenLinux/CANopenNode/301/CO_TIME.o CANopenLinux/CANopenNode/301/CO_SYNC.o 
CANopenLinux/CANopenNode/301/CO_PDO.o 
CANopenLinux/CANopenNode/301/crc16-ccitt.o 
CANopenLinux/CANopenNode/301/CO_fifo.o CANopenLinux/CANopenNode/303/CO_LEDs.o 
CANopenLinux/CANopenNode/304/CO_GFC.o CANopenLinux/CANopenNode/304/CO_SRDO.o 
CANopenLinux/CANopenNode/305/CO_LSSslave.o 
CANopenLinux/CANopenNode/305/CO_LSSmaster.o 
CANopenLinux/CANopenNode/309/CO_gateway_ascii.o 
CANopenLinux/CANopenNode/storage/CO_storage.o 
CANopenLinux/CANopenNode/extra/CO_trace.o CANopenLinux/CANopenNode/OD/OD.o 
CANopenLinux/CANopenNode/CANopen.o Src/task_default.o Src/task_can.o 
Src/task_gpu.o GPU/png_decoder.o GPU/drawer.o GPU/typewriter.o Src/main.o -o 
canopend
/usr/bin/ld: GPU/typewriter.o: in function `TypewriterSetForeground':
/root/projects/GPU/typewriter.c:69: undefined reference to 
`FT_Palette_Set_Foreground_Color'
collect2: error: ld returned 1 exit status
make: *** [Makefile:93: canopend] Error 1

Reply via email to