试图用文本掩盖APNG背景

时间:2015-03-19 20:51:30

标签: pebble-watch pebble-sdk cloudpebble

我正在使用Pebble example与APNG一起工作并试图用透明文本掩盖它,因此位图将仅显示文本,但无论我尝试使用哪种掩模/复合模式,位图都显示为黑色和 - 白色(原始动画是彩色的,如果我不绘制文字,则以彩色显示)

enter image description here

这是我在回调SP中用于绘制文本的图层的示例代码:

//creating background and text
graphics_context_set_fill_color(ctx, GColorBlack);
graphics_fill_rect(ctx, GRect(0, 0, 144, 168), 0, GCornerNone);
graphics_context_set_text_color(ctx, GColorWhite);
graphics_draw_text(ctx, "08:39", fonts_get_system_font(FONT_KEY_ROBOTO_BOLD_SUBSET_49), GRect(0,50,144,118), GTextOverflowModeFill, GTextAlignmentCenter, NULL);

//drawing bitmap (extracted from bitmap_sequence elsewhere) 
graphics_context_set_compositing_mode(ctx, GCompOpClear);
graphics_draw_bitmap_in_rect(ctx, s_bitmap, GRect(0,0,144,168));

知道如何让实际的彩色位图显示出来吗?

1 个答案:

答案 0 :(得分:1)

好的,我终于成功了,但不确定这是不是最好的方法。我基本上捕获当前图层的帧缓冲,然后循环遍历每个像素,逐字节复制源位图,但只有遇到白色像素时才会这样:

enter image description here

GBitmap *fb = graphics_capture_frame_buffer_format(ctx, GBitmapFormat8Bit);

uint8_t *fb_data =  gbitmap_get_data(fb);
uint8_t *anim_data =  gbitmap_get_data(s_bitmap);

for (int i=0; i < 144*168; i++) {
    if (fb_data[i] == 255) {
       fb_data[i] = anim_data[i];
    }
}

can be optimized