static void set_fade (AboutRenderer *r, AboutState *state, double f) { GtkStyleContext *ctxt = gtk_widget_get_style_context (state->anim_area); PangoAttrList *attrlist = pango_layout_get_attributes (r->layout); GdkRGBA col, bg, fg; PangoAttribute *attr; gtk_style_context_get_color (ctxt, GTK_STATE_FLAG_NORMAL, &fg); gtk_style_context_get_background_color (ctxt, GTK_STATE_FLAG_NORMAL, &bg); col = blend_colors (&bg, &fg, f); attr = pango_attr_foreground_new (col.red * 65535., col.green * 65535., col.blue * 65535.); pango_attr_list_change (attrlist, attr); pango_layout_set_attributes (r->layout, attrlist); }
// _UpdateColors void AlphaSlider::_UpdateColors() { if (!fBitmap || !fBitmap->IsValid()) return; // fill in top row with alpha gradient uint8* topRow = (uint8*)fBitmap->Bits(); uint32 width = fBitmap->Bounds().IntegerWidth() + 1; uint8* p = topRow; rgb_color color = fColor; if (!IsEnabled()) { // blend low color and color to give disabled look rgb_color bg = LowColor(); color.red = (uint8)(((uint32)bg.red + color.red) / 2); color.green = (uint8)(((uint32)bg.green + color.green) / 2); color.blue = (uint8)(((uint32)bg.blue + color.blue) / 2); } for (uint32 x = 0; x < width; x++) { p[0] = color.blue; p[1] = color.green; p[2] = color.red; p[3] = x * 255 / width; p += 4; } // copy top row to rest of bitmap uint32 height = fBitmap->Bounds().IntegerHeight() + 1; uint32 bpr = fBitmap->BytesPerRow(); uint8* dstRow = topRow + bpr; for (uint32 i = 1; i < height; i++) { memcpy(dstRow, topRow, bpr); dstRow += bpr; } // post process bitmap to underlay it with a pattern to visualize alpha uint8* row = topRow; for (uint32 i = 0; i < height; i++) { uint8* p = row; for (uint32 x = 0; x < width; x++) { uint8 alpha = p[3]; if (alpha < 255) { p[3] = 255; alpha = 255 - alpha; if (x % 8 >= 4) { if (i % 8 >= 4) { blend_colors(p, alpha, kAlphaLow.blue, kAlphaLow.green, kAlphaLow.red); } else { blend_colors(p, alpha, kAlphaHigh.blue, kAlphaHigh.green, kAlphaHigh.red); } } else { if (i % 8 >= 4) { blend_colors(p, alpha, kAlphaHigh.blue, kAlphaHigh.green, kAlphaHigh.red); } else { blend_colors(p, alpha, kAlphaLow.blue, kAlphaLow.green, kAlphaLow.red); } } } p += 4; } row += bpr; } }
static void _UpdateUIStyle(RimeConfig* config, weasel::UI* ui, bool initialize) { if (!ui) return; weasel::UIStyle &style(ui->style()); const int BUF_SIZE = 99; char buffer[BUF_SIZE + 1]; memset(buffer, '\0', sizeof(buffer)); if (RimeConfigGetString(config, "style/font_face", buffer, BUF_SIZE)) { style.font_face = utf8towcs(buffer); } RimeConfigGetInt(config, "style/font_point", &style.font_point); Bool inline_preedit = False; if (RimeConfigGetBool(config, "style/inline_preedit", &inline_preedit) || initialize) { style.inline_preedit = !!inline_preedit; } char preedit_type[20] = { 0 }; if (RimeConfigGetString(config, "style/preedit_type", preedit_type, sizeof(preedit_type) - 1)) { if (!std::strcmp(preedit_type, "composition")) style.preedit_type = weasel::UIStyle::COMPOSITION; else if (!std::strcmp(preedit_type, "preview")) style.preedit_type = weasel::UIStyle::PREVIEW; } Bool display_tray_icon = False; if (RimeConfigGetBool(config, "style/display_tray_icon", &display_tray_icon) || initialize) { style.display_tray_icon = !!display_tray_icon; } Bool horizontal = False; if (RimeConfigGetBool(config, "style/horizontal", &horizontal) || initialize) { style.layout_type = horizontal ? weasel::UIStyle::LAYOUT_HORIZONTAL : weasel::UIStyle::LAYOUT_VERTICAL; } Bool fullscreen = False; if (RimeConfigGetBool(config, "style/fullscreen", &fullscreen) && fullscreen) { style.layout_type = (style.layout_type == weasel::UIStyle::LAYOUT_HORIZONTAL) ? weasel::UIStyle::LAYOUT_HORIZONTAL_FULLSCREEN : weasel::UIStyle::LAYOUT_VERTICAL_FULLSCREEN; } char label_text_format[128] = { 0 }; if (RimeConfigGetString(config, "style/label_format", label_text_format, sizeof(label_text_format) - 1)) { style.label_text_format = utf8towcs(label_text_format); } // layout (alternative to style/horizontal) char layout_type[256] = {0}; if (RimeConfigGetString(config, "style/layout/type", layout_type, sizeof(layout_type) - 1)) { if (!std::strcmp(layout_type, "vertical")) style.layout_type = weasel::UIStyle::LAYOUT_VERTICAL; else if (!std::strcmp(layout_type, "horizontal")) style.layout_type = weasel::UIStyle::LAYOUT_HORIZONTAL; if (!std::strcmp(layout_type, "vertical+fullscreen")) style.layout_type = weasel::UIStyle::LAYOUT_VERTICAL_FULLSCREEN; else if (!std::strcmp(layout_type, "horizontal+fullscreen")) style.layout_type = weasel::UIStyle::LAYOUT_HORIZONTAL_FULLSCREEN; else LOG(WARNING) << "Invalid style type: " << layout_type; } RimeConfigGetInt(config, "style/layout/min_width", &style.min_width); RimeConfigGetInt(config, "style/layout/min_height", &style.min_height); if (!RimeConfigGetInt(config, "style/layout/border", &style.border)) { RimeConfigGetInt(config, "style/layout/border_width", &style.border); } RimeConfigGetInt(config, "style/layout/margin_x", &style.margin_x); RimeConfigGetInt(config, "style/layout/margin_y", &style.margin_y); RimeConfigGetInt(config, "style/layout/spacing", &style.spacing); RimeConfigGetInt(config, "style/layout/candidate_spacing", &style.candidate_spacing); RimeConfigGetInt(config, "style/layout/hilite_spacing", &style.hilite_spacing); RimeConfigGetInt(config, "style/layout/hilite_padding", &style.hilite_padding); RimeConfigGetInt(config, "style/layout/round_corner", &style.round_corner); // color scheme if (initialize && RimeConfigGetString(config, "style/color_scheme", buffer, BUF_SIZE)) { std::string prefix("preset_color_schemes/"); prefix += buffer; RimeConfigGetInt(config, (prefix + "/text_color").c_str(), &style.text_color); if (!RimeConfigGetInt(config, (prefix + "/candidate_text_color").c_str(), &style.candidate_text_color)) { style.candidate_text_color = style.text_color; } RimeConfigGetInt(config, (prefix + "/back_color").c_str(), &style.back_color); if (!RimeConfigGetInt(config, (prefix + "/border_color").c_str(), &style.border_color)) { style.border_color = style.text_color; } if (!RimeConfigGetInt(config, (prefix + "/hilited_text_color").c_str(), &style.hilited_text_color)) { style.hilited_text_color = style.text_color; } if (!RimeConfigGetInt(config, (prefix + "/hilited_back_color").c_str(), &style.hilited_back_color)) { style.hilited_back_color = style.back_color; } if (!RimeConfigGetInt(config, (prefix + "/hilited_candidate_text_color").c_str(), &style.hilited_candidate_text_color)) { style.hilited_candidate_text_color = style.hilited_text_color; } if (!RimeConfigGetInt(config, (prefix + "/hilited_candidate_back_color").c_str(), &style.hilited_candidate_back_color)) { style.hilited_candidate_back_color = style.hilited_back_color; } if (!RimeConfigGetInt(config, (prefix + "/label_color").c_str(), &style.label_text_color)) { style.label_text_color = blend_colors(style.candidate_text_color, style.back_color); } if (!RimeConfigGetInt(config, (prefix + "/hilited_label_color").c_str(), &style.hilited_label_text_color)) { style.hilited_label_text_color = blend_colors(style.hilited_candidate_text_color, style.hilited_candidate_back_color); } style.comment_text_color = style.label_text_color; style.hilited_comment_text_color = style.hilited_label_text_color; if (RimeConfigGetInt(config, (prefix + "/comment_text_color").c_str(), &style.comment_text_color)) { style.hilited_comment_text_color = style.comment_text_color; } RimeConfigGetInt(config, (prefix + "/hilited_comment_text_color").c_str(), &style.hilited_comment_text_color); } }