void GraphicsContext::drawLinesForText(const FloatPoint& point, const DashArray& widths, bool printing, bool doubleUnderlines) { if (paintingDisabled()) return; if (widths.size() <= 0) return; Color localStrokeColor(strokeColor()); bool shouldAntialiasLine; FloatRect bounds = computeLineBoundsAndAntialiasingModeForText(point, widths.last(), printing, shouldAntialiasLine, localStrokeColor); Vector<FloatRect, 4> dashBounds; ASSERT(!(widths.size() % 2)); dashBounds.reserveInitialCapacity(dashBounds.size() / 2); for (size_t i = 0; i < widths.size(); i += 2) dashBounds.append(FloatRect(FloatPoint(bounds.x() + widths[i], bounds.y()), FloatSize(widths[i+1] - widths[i], bounds.height()))); if (doubleUnderlines) { // The space between double underlines is equal to the height of the underline for (size_t i = 0; i < widths.size(); i += 2) dashBounds.append(FloatRect(FloatPoint(bounds.x() + widths[i], bounds.y() + 2 * bounds.height()), FloatSize(widths[i+1] - widths[i], bounds.height()))); } cairo_t* cr = platformContext()->cr(); cairo_save(cr); for (auto& dash : dashBounds) fillRectWithColor(cr, dash, localStrokeColor); cairo_restore(cr); }
FloatRect GraphicsContext::computeUnderlineBoundsForText(const FloatPoint& point, float width, bool printing) { Color dummyColor; return computeLineBoundsAndAntialiasingModeForText(point, width, printing, dummyColor); }
FloatRect GraphicsContext::computeLineBoundsForText(const FloatPoint& origin, float width, bool printing) { bool dummyBool; Color dummyColor; return computeLineBoundsAndAntialiasingModeForText(origin, width, printing, dummyBool, dummyColor); }