Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Autres questions


Index du Forum » Autres questions » Custom Glyph not working
Critical Hors ligne Membre Points: 47 Défis: 0 Message

Custom Glyph not working

Posté le 25/05/2025 19:19

I have been trying to make a custom glyph that appears in the status area however I have been having issues

#include <fxcg/display.h>
#include <fxcg/keyboard.h>

unsigned short myBitmap[16 * 22] = {
    0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4,
    0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4,
    0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xE8E4,
    0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xE8E4,
    0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4,
    0xFFFF, 0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4,
    0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF,
    0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4,
    0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF,
    0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xE8E4,
    0xE8E4, 0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4,
    0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4,
    0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4,
    0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4,
    0xE8E4, 0xFFFF, 0xFFFF, 0xFFFF, 0xE8E4, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4,
    0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xE8E4,
    0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xFFFF, 0xE8E4,
    0xE8E4, 0xE8E4, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4,
    0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4,
    0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF,
    0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4,
    0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF,
    0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4,
    0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4,
    0xE8E4, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4,
    0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF, 0xE8E4, 0xFFFF, 0xFFFF, 0xE8E4, 0xE8E4,
    0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF, 0xFFFF,
    0xFFFF, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4,
    0xE8E4, 0xE8E4, 0xE8E4, 0xFFFF
};

struct glyph_def {
    short dx;
    short dy;
    void* shortcolor_bitmap;
    short xalignment;
    short xoffset;
};

struct glyph_def myGlyph = {
    .dx = 16,
    .dy = 22,
    .shortcolor_bitmap = myBitmap,
    .xalignment = 1,  
    .xoffset = 0
};

int main(void) {
    char color1 = TEXT_COLOR_WHITE;
    char color2 = TEXT_COLOR_WHITE;

    DefineStatusAreaFlags(3, SAF_BATTERY | SAF_GLYPH, &color1, &color2);

    DefineStatusGlyph(0, &myGlyph);

    DisplayStatusArea();

    int key;
    while (1) {
        GetKey(&key);
        if (key == KEY_CTRL_MENU) {
            break;
        }
    }

    return 1;
}


This example of the issue I am facing should give me the bmp image I made of a 16*22 pixel white X on a red background though its not the best looking however when inputting this code into my calc it s got the red background with random streaks of white nothing like the image I want it to look like I don't know if I am doing something wrong appreciate any help!


Lephenixnoir Hors ligne Administrateur Points: 25156 Défis: 174 Message

Citer : Posté le 26/05/2025 10:12 | #


It's not obvious what's going wrong. Since you have the right colors could this be a width/stride misalignment? Like the real width is not the same as the width you wanted so every row is shifted? You can try with the "standard" size of 22x36 (according to wiki).
Mon graphe (28 Janvier): (MPM ; serial gint ; (Rogue Life || HH2) ; PythonExtra ; ? ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Critical Hors ligne Membre Points: 47 Défis: 0 Message

Citer : Posté le 26/05/2025 11:38 | #


Do you mean 24*16 as that is what's on https://prizm.cemetech.net/Syscalls/DefineStatusGlyph/ I believe 22*36 would go off the status area as its only 22 pixels tall
Lephenixnoir Hors ligne Administrateur Points: 25156 Défis: 174 Message

Citer : Posté le 26/05/2025 11:42 | #


I mixed up the directions, it should be 36x22. Be careful as 0x24 by 0x16 is not 24 by 16! "0x" being the prefix for hexadecimal these numbers read in base 16. As it turns out, 0x24=36 and 0x16=22. This makes sense to me as the status bar is 24 pixels high, so 22 pixels should just fit.
Mon graphe (28 Janvier): (MPM ; serial gint ; (Rogue Life || HH2) ; PythonExtra ; ? ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Critical Hors ligne Membre Points: 47 Défis: 0 Message

Citer : Posté le 26/05/2025 12:38 | #


Unfortunately the same thing happened the image came out all weird looking again.
Lephenixnoir Hors ligne Administrateur Points: 25156 Défis: 174 Message

Citer : Posté le 26/05/2025 13:05 | #


Can we see a photo or screenshot of that please?
Mon graphe (28 Janvier): (MPM ; serial gint ; (Rogue Life || HH2) ; PythonExtra ; ? ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Critical Hors ligne Membre Points: 47 Défis: 0 Message

Citer : Posté le 26/05/2025 15:23 | # | Fichier joint


Given by this code

#include <fxcg/display.h>
#include <fxcg/keyboard.h>

unsigned short myBitmap[36 * 22] = {
0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xE0C4, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xE0C4, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
};

struct glyph_def {
    short dx;
    short dy;
    void* shortcolor_bitmap;
    short xalignment;
    short xoffset;
};

struct glyph_def myGlyph = {
    .dx = 0x24,
    .dy = 0x16,
    .shortcolor_bitmap = myBitmap,
    .xalignment = 1,  
    .xoffset = 0
};

int main(void) {
    char color1 = TEXT_COLOR_WHITE;
    char color2 = TEXT_COLOR_WHITE;

    DefineStatusAreaFlags(3, SAF_BATTERY | SAF_GLYPH, &color1, &color2);

    DefineStatusGlyph(0, &myGlyph);

    DisplayStatusArea();

    int key;
    while (1) {
        GetKey(&key);
        if (key == KEY_CTRL_MENU) {
            break;
        }
    }

    return 1;
}


I get this image I have attatched
Lephenixnoir Hors ligne Administrateur Points: 25156 Défis: 174 Message

Citer : Posté le 26/05/2025 15:41 | #


So you get white, red, and black despite having only 0xFFFF and 0xE0C4 in the array? This has to be a format mismatch. Given the photo I can't shake the feeling that the format might actually be 1 byte per pixel. Can you check if you replace unsigned short with unsigned char (maybe with values 0x00 and 0xFF)? Also try different widths. You're bound to find one where things align and it will make the issue much clearer.
Mon graphe (28 Janvier): (MPM ; serial gint ; (Rogue Life || HH2) ; PythonExtra ; ? ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Critical Hors ligne Membre Points: 47 Défis: 0 Message

Citer : Posté le 26/05/2025 18:58 | # | Fichier joint


Just in case something else may be wrong here this is the python script I used to obtain the values

from PIL import Image

def rgb888_to_rgb565(r, g, b):
    r5 = (r * 31) // 255
    g6 = (g * 63) // 255
    b5 = (b * 31) // 255
    return (r5 << 11) | (g6 << 5) | b5

def extract_rgb565_from_bmp(image_path, expected_width=36, expected_height=22):
    img = Image.open(image_path).convert('RGB')

    if img.size != (expected_width, expected_height):
        raise ValueError(f"Expected image size {expected_width}x{expected_height}, got {img.size}")

    pixels = list(img.getdata())
    rgb565_values = [rgb888_to_rgb565(r, g, b) for r, g, b in pixels]
    return rgb565_values


bmp_file = "me.bmp"  
rgb565_list = extract_rgb565_from_bmp(bmp_file)

for i, val in enumerate(rgb565_list):
    print(f"0x{val:04X}", end=', ')
    if (i + 1) % 36 == 0:
        print()  


I also attached the bmp file
Critical Hors ligne Membre Points: 47 Défis: 0 Message

Citer : Posté le 26/05/2025 19:48 | #


Now what I have done is jumped down to 1 byte per pixel

#include <fxcg/display.h>
#include <fxcg/keyboard.h>

unsigned char myBitmap[36 * 22] = {
0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0x5B, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
};

struct glyph_def {
    short dx;                
    short dy;                
    void* shortcolor_bitmap;  
    short xalignment;        
    short xoffset;          
};

struct glyph_def myGlyph = {
    .dx = 36,
    .dy = 22,
    .shortcolor_bitmap = myBitmap,
    .xalignment = 2,  
    .xoffset = 0
};

int main(void) {
    char color1 = TEXT_COLOR_WHITE;
    char color2 = TEXT_COLOR_WHITE;

    // Setup glyph display in status area
    DefineStatusAreaFlags(3, SAF_BATTERY | SAF_GLYPH, &color1, &color2);
    DefineStatusGlyph(0, &myGlyph);
    DisplayStatusArea();

    // Wait for MENU key to exit
    int key;
    while (1) {
        GetKey(&key);
        if (key == KEY_CTRL_MENU) break;
    }

    return 1;
}



This code gave me finally for the first time something that looked like my bmp file however it was too fat in the sense that it looked like it had been enlarged by a scale factor of 2 or something like that in the status area so not the whole thing fit in and can only see the top part of the bmp file it also looked dotty as if I could count the pixels not a clean glyph.

So I tried downsizing it to 18*11 and this completely broke it again and did not look anything like its supposed to similar to the picture I attached earlier and somehow had a very pure red despite being in 1 byte per pixel
Lephenixnoir Hors ligne Administrateur Points: 25156 Défis: 174 Message

Citer : Posté le 26/05/2025 20:28 | #


We're getting somewhere. Can you attach a picture of the 36x22 1-byte attempt, the one which looked a little bit like your original?
Mon graphe (28 Janvier): (MPM ; serial gint ; (Rogue Life || HH2) ; PythonExtra ; ? ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Critical Hors ligne Membre Points: 47 Défis: 0 Message

Citer : Posté le 26/05/2025 21:02 | # | Fichier joint


#include <fxcg/display.h>
#include <fxcg/keyboard.h>

unsigned char myBitmap[36 * 22] = {
0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0x5B, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5B, 0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
};

struct glyph_def {
    short dx;                
    short dy;                
    void* shortcolor_bitmap;  
    short xalignment;        
    short xoffset;          
};

struct glyph_def myGlyph = {
    .dx = 36,
    .dy = 22,
    .shortcolor_bitmap = myBitmap,
    .xalignment = 2,  
    .xoffset = 0
};

int main(void) {
    char color1 = TEXT_COLOR_WHITE;
    char color2 = TEXT_COLOR_WHITE;

  
    DefineStatusAreaFlags(3, SAF_BATTERY | SAF_GLYPH, &color1, &color2);
    DefineStatusGlyph(0, &myGlyph);
    DisplayStatusArea();

  
    int key;
    while (1) {
        GetKey(&key);
        if (key == KEY_CTRL_MENU) break;
    }

    return 1;
}


This code gave this picture
Lephenixnoir Hors ligne Administrateur Points: 25156 Défis: 174 Message

Citer : Posté le 28/05/2025 10:36 | #


So you have the right stride (or twice that) but you're only specifying one in two pixels and only half the data is being read. This is looking good.

Please try the same data but with 4-bit entries instead, so one pixel in the upper 4 bits and another in the lower 4 bits; the complete array should be 18*22 bytes representing an image of 36*22 pixels.
Mon graphe (28 Janvier): (MPM ; serial gint ; (Rogue Life || HH2) ; PythonExtra ; ? ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Critical Hors ligne Membre Points: 47 Défis: 0 Message

Citer : Posté le 29/05/2025 00:18 | #


It Finally worked!!

However I have a few issues/questions

from PIL import Image
import numpy as np

PALETTE_RGB = [
    (0, 0, 0),        # 0 black
    (0, 0, 170),      # 1 blue
    (0, 170, 0),      # 2 green
    (0, 170, 170),    # 3 cyan
    (170, 0, 0),      # 4 red (dark)
    (170, 0, 170),    # 5 magenta
    (170, 85, 0),     # 6 brown/orange
    (170, 170, 170),  # 7 light gray
    (85, 85, 85),     # 8 dark gray
    (85, 85, 255),    # 9 bright blue
    (85, 255, 85),    # 10 bright green
    (85, 255, 255),   # 11 bright cyan
    (255, 85, 85),    # 12 bright red
    (255, 85, 255),   # 13 bright magenta
    (255, 255, 85),   # 14 yellow
    (255, 255, 255),  # 15 white
]

def rgb_to_rgb565(r, g, b):
    return ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3)

def color_distance(c1, c2):
    return sum((a - b) ** 2 for a, b in zip(c1, c2))

def closest_palette_index(rgb):
    distances = [color_distance(rgb, pc) for pc in PALETTE_RGB]
    return int(np.argmin(distances))

def quantize_image(img):
    """Force image to exactly use the 16-color palette."""
    palette_img = Image.new('P', (16, 16))
    flat_palette = []
    for c in PALETTE_RGB:
        flat_palette.extend(c)
    flat_palette.extend([0] * (256*3 - len(flat_palette)))  # fill rest with zeros
    palette_img.putpalette(flat_palette)
    img_q = img.convert('RGB').quantize(palette=palette_img)
    return img_q.convert('RGB')

def pack_4bpp_indices(indices):
    """Pack list of 4-bit palette indices into bytes (2 pixels per byte)."""
    assert len(indices) % 2 == 0, "Number of pixels must be even"
    packed = []
    for i in range(0, len(indices), 2):
        packed_byte = (indices[i] << 4) | indices[i+1]
        packed.append(packed_byte)
    return packed

def process_image(bmp_path, width=18, height=22):
    img = Image.open(bmp_path).convert('RGB')
    if img.size != (width, height):
        img = img.resize((width, height), Image.LANCZOS)

    img = quantize_image(img)

    indices = []
    print("Palette indices per row:")
    for y in range(height):
        row_indices = []
        for x in range(width):
            rgb = img.getpixel((x, y))
            idx = closest_palette_index(rgb)
            row_indices.append(idx)
        indices.extend(row_indices)
        print(f"Row {y}: {row_indices}")


    if len(indices) % 2 != 0:
        indices.append(0)  # pad last pixel with 0 if odd pixels (should not happen here)

    packed_bitmap = pack_4bpp_indices(indices)

    print("\nunsigned char myBitmap[{}] = {{".format(len(packed_bitmap)))
    for i, val in enumerate(packed_bitmap):
        print(f"0x{val:02X}, ", end='')
        if (i+1) % 18 == 0:
            print()  # newline every 18 bytes (36 pixels)
    print("};\n")

    print("// Palette RGB565 values:")
    print("unsigned short myPalette[16] = {")
    for i, (r, g, b) in enumerate(PALETTE_RGB):
        c565 = rgb_to_rgb565(r, g, b)
        print(f"0x{c565:04X}, ", end='')
        if (i+1) % 8 == 0:
            print()
    print("};")

process_image("me.bmp")


I don't know if you can help me with this but the python code I used to get values for 4 bit entries is this however it's only giving it in black and white do you know if I am missing something out.

#include <fxcg/display.h>
#include <fxcg/keyboard.h>

unsigned char myBitmap[198] = {
0xFC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF, 0xFF, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF, 0xFC, 0xFF,
0xCF, 0xFC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF, 0xFC, 0xFF, 0xCC, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xFF, 0xFC, 0xFF,
0xCC, 0xCF, 0xCC, 0xCC, 0xCC, 0xCF, 0xFF, 0xCC, 0xFF, 0xCC, 0xCF, 0xFC, 0xCC, 0xCC, 0xFF, 0xFC, 0xCC, 0xFF,
0xCC, 0xCC, 0xFF, 0xCC, 0xCC, 0xFF, 0xCC, 0xCC, 0xFF, 0xCC, 0xCC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCC, 0xCC, 0xFF,
0xCC, 0xCC, 0xCC, 0xCF, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, 0xCC, 0xCC, 0xCC, 0xCF, 0xFC, 0xCC, 0xCC, 0xCC, 0xFF,
0xCC, 0xCC, 0xCC, 0xFF, 0xFF, 0xCC, 0xCC, 0xCC, 0xFF, 0xCC, 0xCC, 0xCF, 0xFF, 0xCF, 0xCC, 0xCC, 0xCC, 0xFF,
0xCC, 0xCC, 0xCF, 0xFC, 0xCF, 0xFC, 0xCC, 0xCC, 0xFF, 0xCC, 0xCC, 0xFF, 0xFC, 0xCC, 0xFC, 0xCC, 0xCC, 0xFF,
0xCC, 0xCC, 0xFF, 0xCC, 0xCC, 0xFF, 0xCC, 0xCC, 0xFF, 0xCC, 0xCF, 0xFF, 0xCC, 0xCC, 0xCF, 0xCC, 0xCC, 0xFF,
0xCC, 0xCF, 0xFC, 0xCC, 0xCC, 0xCF, 0xFC, 0xCC, 0xFF, 0xCC, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xFF, 0xCC, 0xFF,
0xCC, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF, 0xCC, 0xFF, 0xCF, 0xFC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF, 0xFC, 0xFF,
0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xFF, 0xFF, 0xFC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF, 0xFF,
};

struct glyph_def {
    short dx;                  
    short dy;                
    void* shortcolor_bitmap;  
    short xalignment;        
    short xoffset;            
};

struct glyph_def myGlyph = {
    .dx = 18,
    .dy = 22,
    .shortcolor_bitmap = myBitmap,
    .xalignment = 2,  
    .xoffset = 0
};

int main(void) {
    char color1 = TEXT_COLOR_WHITE;
    char color2 = TEXT_COLOR_WHITE;

    DefineStatusAreaFlags(3, SAF_BATTERY | SAF_GLYPH, &color1, &color2);

    DefineStatusGlyph(0, &myGlyph);

    DisplayStatusArea();

    int key;
    while (1) {
        GetKey(&key);
        if (key == KEY_CTRL_MENU) break;
    }

    return 1;
}





Here is my add in code which worked but its only in black and white.

Also I think you were wrong about the status area being 24 px I believe its only 22px in height and would this mean that the info on the Prizm wiki specifically on https://prizm.cemetech.net/Syscalls/DefineStatusGlyph/ is incorrect because it says 2-byte per pixel whereas the correct is 4 bit but I don't know if anyone still edits on it.

Thanks a lot for your help
Lephenixnoir Hors ligne Administrateur Points: 25156 Défis: 174 Message

Citer : Posté le 29/05/2025 00:24 | #


Did you write this code yourself? It assumes a color palette but I see no indication or documentation that this is what the calculator uses. Please try with all values from 0 to 15. I suspect this is 3-bit mode and thus only values 0 to 7 will be relevant.

Note that the OS has a 3-bit and a 16-bit mode for rendering. It might be that the format of the icon depends on that, so it's not completely certain yet that the wiki information is wrong (it might just be incomplete, maybe?).

As far as the status area height is concerned what I can tell you is that drawing functions that skip the status area all do y+=24. The 2-pixel difference with what you observe might be for border and padding.
Mon graphe (28 Janvier): (MPM ; serial gint ; (Rogue Life || HH2) ; PythonExtra ; ? ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Critical Hors ligne Membre Points: 47 Défis: 0 Message

Citer : Posté le 29/05/2025 23:38 | #


No the code was not written by me. I used your 0 to 7 values approach and it finally worked looked exactly like .bmp file however I believe this means I cannot use more specific colors right and can only stick with the 7 specific colors.

And yes you were right completely forgot that the black separator line exists that takes 2 pixels up so it would be 24 px as my 22px .bmp perfectly fits.

Really appreciate all the help that you provided me with otherwise I would of been completely stuck I posted this on Cemetech also but still have 0 responses from that despite it probably having more experts as they made the wiki, I guess the Cemetech forum really has died down.
Lephenixnoir Hors ligne Administrateur Points: 25156 Défis: 174 Message

Citer : Posté le 30/05/2025 00:01 | #


Glad you got it working. Just to confirm this is the standard 3-bit color palette? Like 1-bit R, 1-bit G, 1-bit B?

I'm not surprised that Cemetech is slower to respond, although no doubt they will eventually. At some point Cemetch had... let's say... a significant shift of focus to TI models, leaving the CASIO wing of the community declining. The best PrizmSDK users are still there though.
Mon graphe (28 Janvier): (MPM ; serial gint ; (Rogue Life || HH2) ; PythonExtra ; ? ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Critical Hors ligne Membre Points: 47 Défis: 0 Message

Citer : Posté le 30/05/2025 00:33 | #


Yes its a standard 3-bit color palette

Guess the TI models appeal more to Cemetech.

Also a weird thing I found while playing around with the custom glyph is that every dimension works except 41 by 22 in which your image gets scuffed purposely it seems like as I was changing the size from 39 by 22 to 40 by 22 nothing happened using the exact same process for 41 by 22 image was scuffed was stretched out to weird looking dimensions I confirmed three times nothing was wrong with my process and 42 by 22 was fine again found it a little odd so thought I would share it
Lephenixnoir Hors ligne Administrateur Points: 25156 Défis: 174 Message

Citer : Posté le 30/05/2025 01:05 | #


Given that you have two pixels per byte I'm not surprised odd widths are wonky. It's very rare for image formats to switch rows in the middle of a byte because it prevents you from having a clean pointer to the start of a row. Usually you'd need to leave 4 bits empty to pad out the row before starting the next one.
Mon graphe (28 Janvier): (MPM ; serial gint ; (Rogue Life || HH2) ; PythonExtra ; ? ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2025 | Il y a 105 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd