void LayoutTableBoxComponent::styleDidChange(StyleDifference diff, const ComputedStyle* oldStyle) { LayoutBox::styleDidChange(diff, oldStyle); if (parent() && oldStyle) { if (resolveColor(*oldStyle, CSSPropertyBackgroundColor) != resolveColor(CSSPropertyBackgroundColor) || oldStyle->backgroundLayers() != styleRef().backgroundLayers()) m_backgroundChangedSinceLastPaintInvalidation = true; } }
void RenderMultiColumnSet::paintColumnRules(PaintInfo& paintInfo, const LayoutPoint& paintOffset) { if (paintInfo.context->paintingDisabled()) return; RenderStyle* blockStyle = multiColumnBlockFlow()->style(); const Color& ruleColor = resolveColor(blockStyle, CSSPropertyWebkitColumnRuleColor); bool ruleTransparent = blockStyle->columnRuleIsTransparent(); EBorderStyle ruleStyle = blockStyle->columnRuleStyle(); LayoutUnit ruleThickness = blockStyle->columnRuleWidth(); LayoutUnit colGap = columnGap(); bool renderRule = ruleStyle > BHIDDEN && !ruleTransparent; if (!renderRule) return; unsigned colCount = columnCount(); if (colCount <= 1) return; bool antialias = shouldAntialiasLines(paintInfo.context); bool leftToRight = style()->isLeftToRightDirection(); LayoutUnit currLogicalLeftOffset = leftToRight ? LayoutUnit() : contentLogicalWidth(); LayoutUnit ruleAdd = borderAndPaddingLogicalLeft(); LayoutUnit ruleLogicalLeft = leftToRight ? LayoutUnit() : contentLogicalWidth(); LayoutUnit inlineDirectionSize = computedColumnWidth(); BoxSide boxSide = isHorizontalWritingMode() ? leftToRight ? BSLeft : BSRight : leftToRight ? BSTop : BSBottom; for (unsigned i = 0; i < colCount; i++) { // Move to the next position. if (leftToRight) { ruleLogicalLeft += inlineDirectionSize + colGap / 2; currLogicalLeftOffset += inlineDirectionSize + colGap; } else { ruleLogicalLeft -= (inlineDirectionSize + colGap / 2); currLogicalLeftOffset -= (inlineDirectionSize + colGap); } // Now paint the column rule. if (i < colCount - 1) { LayoutUnit ruleLeft = isHorizontalWritingMode() ? paintOffset.x() + ruleLogicalLeft - ruleThickness / 2 + ruleAdd : paintOffset.x() + borderLeft() + paddingLeft(); LayoutUnit ruleRight = isHorizontalWritingMode() ? ruleLeft + ruleThickness : ruleLeft + contentWidth(); LayoutUnit ruleTop = isHorizontalWritingMode() ? paintOffset.y() + borderTop() + paddingTop() : paintOffset.y() + ruleLogicalLeft - ruleThickness / 2 + ruleAdd; LayoutUnit ruleBottom = isHorizontalWritingMode() ? ruleTop + contentHeight() : ruleTop + ruleThickness; IntRect pixelSnappedRuleRect = pixelSnappedIntRectFromEdges(ruleLeft, ruleTop, ruleRight, ruleBottom); drawLineForBoxSide(paintInfo.context, pixelSnappedRuleRect.x(), pixelSnappedRuleRect.y(), pixelSnappedRuleRect.maxX(), pixelSnappedRuleRect.maxY(), boxSide, ruleColor, ruleStyle, 0, 0, antialias); } ruleLogicalLeft = currLogicalLeftOffset; } }
bool RenderBoxModelObject::boxShadowShouldBeAppliedToBackground(BackgroundBleedAvoidance bleedAvoidance, InlineFlowBox* inlineFlowBox) const { if (bleedAvoidance != BackgroundBleedNone) return false; if (style()->hasAppearance()) return false; const ShadowList* shadowList = style()->boxShadow(); if (!shadowList) return false; bool hasOneNormalBoxShadow = false; size_t shadowCount = shadowList->shadows().size(); for (size_t i = 0; i < shadowCount; ++i) { const ShadowData& currentShadow = shadowList->shadows()[i]; if (currentShadow.style() != Normal) continue; if (hasOneNormalBoxShadow) return false; hasOneNormalBoxShadow = true; if (currentShadow.spread()) return false; } if (!hasOneNormalBoxShadow) return false; Color backgroundColor = resolveColor(CSSPropertyBackgroundColor); if (backgroundColor.hasAlpha()) return false; const FillLayer* lastBackgroundLayer = &style()->backgroundLayers(); for (const FillLayer* next = lastBackgroundLayer->next(); next; next = lastBackgroundLayer->next()) lastBackgroundLayer = next; if (lastBackgroundLayer->clip() != BorderFillBox) return false; if (lastBackgroundLayer->image() && style()->hasBorderRadius()) return false; if (inlineFlowBox && !inlineFlowBox->boxShadowCanBeAppliedToBackground(*lastBackgroundLayer)) return false; if (hasOverflowClip() && lastBackgroundLayer->attachment() == LocalBackgroundAttachment) return false; return true; }
void ThemeComponent::readXML(std::string path) { if(mPath == path) return; setDefaults(); deleteComponents(); mPath = path; if(path.empty()) return; LOG(LogInfo) << "Loading theme \"" << path << "\"..."; pugi::xml_document doc; pugi::xml_parse_result result = doc.load_file(path.c_str()); if(!result) { LOG(LogError) << "Error parsing theme \"" << path << "\"!\n" << " " << result.description(); return; } pugi::xml_node root; if(!mDetailed) { //if we're using the basic view, check if there's a basic version of the theme root = doc.child("basicTheme"); } if(!root) { root = doc.child("theme"); } if(!root) { LOG(LogError) << "No theme tag found in theme \"" << path << "\"!"; return; } //load non-component theme stuff mColorMap["primary"] = resolveColor(root.child("listPrimaryColor").text().get(), mColorMap["primary"]); mColorMap["secondary"] = resolveColor(root.child("listSecondaryColor").text().get(), mColorMap["secondary"]); mColorMap["selector"] = resolveColor(root.child("listSelectorColor").text().get(), mColorMap["selector"]); mColorMap["selected"] = resolveColor(root.child("listSelectedColor").text().get(), mColorMap["selected"]); mColorMap["description"] = resolveColor(root.child("descColor").text().get(), mColorMap["description"]); mColorMap["fastSelect"] = resolveColor(root.child("fastSelectColor").text().get(), mColorMap["fastSelect"]); mBoolMap["hideHeader"] = root.child("hideHeader") != 0; mBoolMap["hideDividers"] = root.child("hideDividers") != 0; //GuiBox theming data mBoxData.backgroundPath = expandPath(root.child("boxBackground").text().get()); mBoxData.backgroundTiled = root.child("boxBackgroundTiled") != 0; mBoxData.horizontalPath = expandPath(root.child("boxHorizontal").text().get()); mBoxData.horizontalTiled = root.child("boxHorizontalTiled") != 0; mBoxData.verticalPath = expandPath(root.child("boxVertical").text().get()); mBoxData.verticalTiled = root.child("boxVerticalTiled") != 0; mBoxData.cornerPath = expandPath(root.child("boxCorner").text().get()); //list stuff mBoolMap["listCentered"] = !root.child("listLeftAlign"); mFloatMap["listOffsetX"] = strToFloat(root.child("listOffsetX").text().get(), mFloatMap["listOffsetX"]); mFloatMap["listTextOffsetX"] = strToFloat(root.child("listTextOffsetX").text().get(), mFloatMap["listTextOffsetX"]); //game image stuff std::string artPos = root.child("gameImagePos").text().get(); std::string artDim = root.child("gameImageDim").text().get(); std::string artOrigin = root.child("gameImageOrigin").text().get(); std::string artPosX, artPosY, artWidth, artHeight, artOriginX, artOriginY; splitString(artPos, ' ', &artPosX, &artPosY); splitString(artDim, ' ', &artWidth, &artHeight); splitString(artOrigin, ' ', &artOriginX, &artOriginY); mFloatMap["gameImageOffsetX"] = resolveExp(artPosX, mFloatMap["gameImageOffsetX"]); mFloatMap["gameImageOffsetY"] = resolveExp(artPosY, mFloatMap["gameImageOffsetY"]); mFloatMap["gameImageWidth"] = resolveExp(artWidth, mFloatMap["gameImageWidth"]); mFloatMap["gameImageHeight"] = resolveExp(artHeight, mFloatMap["gameImageHeight"]); mFloatMap["gameImageOriginX"] = resolveExp(artOriginX, mFloatMap["gameImageOriginX"]); mFloatMap["gameImageOriginY"] = resolveExp(artOriginY, mFloatMap["gameImageOriginY"]); mStringMap["imageNotFoundPath"] = expandPath(root.child("gameImageNotFound").text().get()); //sounds mSoundMap["menuScroll"]->loadFile(expandPath(root.child("menuScrollSound").text().get())); mSoundMap["menuSelect"]->loadFile(expandPath(root.child("menuSelectSound").text().get())); mSoundMap["menuBack"]->loadFile(expandPath(root.child("menuBackSound").text().get())); mSoundMap["menuOpen"]->loadFile(expandPath(root.child("menuOpenSound").text().get())); //fonts mListFont = resolveFont(root.child("listFont"), Font::getDefaultPath(), Renderer::getDefaultFont(Renderer::MEDIUM)->getSize()); mDescFont = resolveFont(root.child("descriptionFont"), Font::getDefaultPath(), Renderer::getDefaultFont(Renderer::SMALL)->getSize()); mFastSelectFont = resolveFont(root.child("fastSelectFont"), Font::getDefaultPath(), Renderer::getDefaultFont(Renderer::LARGE)->getSize()); //actually read the components createComponentChildren(root, this); LOG(LogInfo) << "Theme loading complete."; }
int colorxlate(char *str, gvcolor_t * color, color_type_t target_type) { static hsvrgbacolor_t *last; static unsigned char *canon; static int allocated; unsigned char *p, *q; hsvrgbacolor_t fake; unsigned char c; double H, S, V, A, R, G, B; double C, M, Y, K; unsigned int r, g, b, a; int len, rc; color->type = target_type; rc = COLOR_OK; for (; *str == ' '; str++); /* skip over any leading whitespace */ p = (unsigned char *) str; /* test for rgb value such as: "#ff0000" or rgba value such as "#ff000080" */ a = 255; /* default alpha channel value=opaque in case not supplied */ if ((*p == '#') && (sscanf((char *) p, "#%2x%2x%2x%2x", &r, &g, &b, &a) >= 3)) { switch (target_type) { case HSVA_DOUBLE: R = (double) r / 255.0; G = (double) g / 255.0; B = (double) b / 255.0; A = (double) a / 255.0; rgb2hsv(R, G, B, &H, &S, &V); color->u.HSVA[0] = H; color->u.HSVA[1] = S; color->u.HSVA[2] = V; color->u.HSVA[3] = A; break; case RGBA_BYTE: color->u.rgba[0] = r; color->u.rgba[1] = g; color->u.rgba[2] = b; color->u.rgba[3] = a; break; case CMYK_BYTE: R = (double) r / 255.0; G = (double) g / 255.0; B = (double) b / 255.0; rgb2cmyk(R, G, B, &C, &M, &Y, &K); color->u.cmyk[0] = (int) C *255; color->u.cmyk[1] = (int) M *255; color->u.cmyk[2] = (int) Y *255; color->u.cmyk[3] = (int) K *255; break; case RGBA_WORD: color->u.rrggbbaa[0] = r * 65535 / 255; color->u.rrggbbaa[1] = g * 65535 / 255; color->u.rrggbbaa[2] = b * 65535 / 255; color->u.rrggbbaa[3] = a * 65535 / 255; break; case RGBA_DOUBLE: color->u.RGBA[0] = (double) r / 255.0; color->u.RGBA[1] = (double) g / 255.0; color->u.RGBA[2] = (double) b / 255.0; color->u.RGBA[3] = (double) a / 255.0; break; case COLOR_STRING: break; case COLOR_INDEX: break; } return rc; } /* test for hsv value such as: ".6,.5,.3" */ if (((c = *p) == '.') || isdigit(c)) { len = strlen((char*)p); if (len >= allocated) { allocated = len + 1 + 10; canon = grealloc(canon, allocated); if (! canon) { rc = COLOR_MALLOC_FAIL; return rc; } } q = canon; while ((c = *p++)) { if (c == ',') c = ' '; *q++ = c; } *q = '\0'; if (sscanf((char *) canon, "%lf%lf%lf", &H, &S, &V) == 3) { /* clip to reasonable values */ H = MAX(MIN(H, 1.0), 0.0); S = MAX(MIN(S, 1.0), 0.0); V = MAX(MIN(V, 1.0), 0.0); switch (target_type) { case HSVA_DOUBLE: color->u.HSVA[0] = H; color->u.HSVA[1] = S; color->u.HSVA[2] = V; color->u.HSVA[3] = 1.0; /* opaque */ break; case RGBA_BYTE: hsv2rgb(H, S, V, &R, &G, &B); color->u.rgba[0] = (int) (R * 255); color->u.rgba[1] = (int) (G * 255); color->u.rgba[2] = (int) (B * 255); color->u.rgba[3] = 255; /* opaque */ break; case CMYK_BYTE: hsv2rgb(H, S, V, &R, &G, &B); rgb2cmyk(R, G, B, &C, &M, &Y, &K); color->u.cmyk[0] = (int) C *255; color->u.cmyk[1] = (int) M *255; color->u.cmyk[2] = (int) Y *255; color->u.cmyk[3] = (int) K *255; break; case RGBA_WORD: hsv2rgb(H, S, V, &R, &G, &B); color->u.rrggbbaa[0] = (int) (R * 65535); color->u.rrggbbaa[1] = (int) (G * 65535); color->u.rrggbbaa[2] = (int) (B * 65535); color->u.rrggbbaa[3] = 65535; /* opaque */ break; case RGBA_DOUBLE: hsv2rgb(H, S, V, &R, &G, &B); color->u.RGBA[0] = R; color->u.RGBA[1] = G; color->u.RGBA[2] = B; color->u.RGBA[3] = 1.0; /* opaque */ break; case COLOR_STRING: break; case COLOR_INDEX: break; } return rc; } } /* test for known color name (generic, not renderer specific known names) */ fake.name = resolveColor(str); if (!fake.name) return COLOR_MALLOC_FAIL; if ((last == NULL) || (last->name[0] != fake.name[0]) || (strcmp(last->name, fake.name))) { last = (hsvrgbacolor_t *) bsearch((void *) &fake, (void *) color_lib, sizeof(color_lib) / sizeof(hsvrgbacolor_t), sizeof(fake), colorcmpf); } if (last != NULL) { switch (target_type) { case HSVA_DOUBLE: color->u.HSVA[0] = ((double) last->h) / 255.0; color->u.HSVA[1] = ((double) last->s) / 255.0; color->u.HSVA[2] = ((double) last->v) / 255.0; color->u.HSVA[3] = ((double) last->a) / 255.0; break; case RGBA_BYTE: color->u.rgba[0] = last->r; color->u.rgba[1] = last->g; color->u.rgba[2] = last->b; color->u.rgba[3] = last->a; break; case CMYK_BYTE: R = (last->r) / 255.0; G = (last->g) / 255.0; B = (last->b) / 255.0; rgb2cmyk(R, G, B, &C, &M, &Y, &K); color->u.cmyk[0] = (int) C * 255; color->u.cmyk[1] = (int) M * 255; color->u.cmyk[2] = (int) Y * 255; color->u.cmyk[3] = (int) K * 255; break; case RGBA_WORD: color->u.rrggbbaa[0] = last->r * 65535 / 255; color->u.rrggbbaa[1] = last->g * 65535 / 255; color->u.rrggbbaa[2] = last->b * 65535 / 255; color->u.rrggbbaa[3] = last->a * 65535 / 255; break; case RGBA_DOUBLE: color->u.RGBA[0] = last->r / 255.0; color->u.RGBA[1] = last->g / 255.0; color->u.RGBA[2] = last->b / 255.0; color->u.RGBA[3] = last->a / 255.0; break; case COLOR_STRING: break; case COLOR_INDEX: break; } return rc; } /* if we're still here then we failed to find a valid color spec */ rc = COLOR_UNKNOWN; switch (target_type) { case HSVA_DOUBLE: color->u.HSVA[0] = color->u.HSVA[1] = color->u.HSVA[2] = 0.0; color->u.HSVA[3] = 1.0; /* opaque */ break; case RGBA_BYTE: color->u.rgba[0] = color->u.rgba[1] = color->u.rgba[2] = 0; color->u.rgba[3] = 255; /* opaque */ break; case CMYK_BYTE: color->u.cmyk[0] = color->u.cmyk[1] = color->u.cmyk[2] = color->u.cmyk[3] = 0; break; case RGBA_WORD: color->u.rrggbbaa[0] = color->u.rrggbbaa[1] = color->u.rrggbbaa[2] = 0; color->u.rrggbbaa[3] = 65535; /* opaque */ break; case RGBA_DOUBLE: color->u.RGBA[0] = color->u.RGBA[1] = color->u.RGBA[2] = 0.0; color->u.RGBA[3] = 1.0; /* opaque */ break; case COLOR_STRING: break; case COLOR_INDEX: break; } return rc; }