2014-11-19 2 views
1

На часах Pebble я пытаюсь перезаписать слой растрового изображения с текстом, чтобы текст был написан белым над черными областями и черными над белыми областями.галька bitmap xor или маска?

В других средах я бы сделал это с помощью операции XOR или создаю маску и выполнил пару записей после маскировки того, что я не хочу перезаписывать. Я не вижу графического оператора XOR или оператора маски в графической библиотеке Pebble.

Как это можно сделать?

Я использую C и CloudPebble.

Линд

+0

I wondwer если режим http://developer.getpebble.com/docs/c/group___graphics_types.html#ga0d021422bd90a2a49e6c8d848e6d556f ответ. Он работает для объединения растровых изображений, возможно, и для текста (не пробовал). –

+0

Я смотрел на это (GcompOp), но не мог понять, как заставить его работать, не имея блочной границы вокруг текста или графического объекта. Наконец, я написал свою собственную рутину, чтобы сделать это. – user4268665

ответ

1

Вот рутина, чтобы сделать это. Текстовый слой должен быть «под» графическим слоем, тогда вы используете layer_set_update_proc(), чтобы установить процедуру обновления для графического слоя в подпрограмму ниже.

static void bitmapLayerUpdate(struct Layer *layer, GContext *ctx){ 
    GBitmap *framebuffer; 
    const GBitmap *graphic = bitmap_layer_get_bitmap((BitmapLayer *)layer); 
    int height; 
    uint32_t finalBits; 
    uint32_t *bfr, *bitmap; 

    framebuffer = graphics_capture_frame_buffer(ctx); 
    if (framebuffer == NULL){ 
    APP_LOG(APP_LOG_LEVEL_DEBUG, "capture frame buffer failed!!"); 
    } else { 
// APP_LOG(APP_LOG_LEVEL_DEBUG, "capture frame buffer succeeded"); 
    } 
    height = graphic->bounds.size.h; 

    for (int yindex =0; yindex < height; yindex++){ 
    for (unsigned int xindex = 0; xindex < (graphic->row_size_bytes); xindex+=4){ 
     bfr = (uint32_t*)((framebuffer->addr)+(yindex * framebuffer->row_size_bytes)+xindex); 
     bitmap = (uint32_t*)((graphic->addr)+(yindex * graphic->row_size_bytes)+xindex); 
     finalBits = *bitmap^*bfr; 
     // APP_LOG(APP_LOG_LEVEL_DEBUG, "bfr: %0x, bitmsp: %0x, finalBits: %x", (unsigned int)bfr, (unsigned int)bitmap, finalBits); 

     *bfr = finalBits; 
    } 
    } 
    graphics_release_frame_buffer(ctx, framebuffer); 
} 
Смежные вопросы