diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/core/rendering/shapes')
7 files changed, 9 insertions, 323 deletions
diff --git a/chromium/third_party/WebKit/Source/core/rendering/shapes/RasterShape.cpp b/chromium/third_party/WebKit/Source/core/rendering/shapes/RasterShape.cpp deleted file mode 100644 index a57958071a0..00000000000 --- a/chromium/third_party/WebKit/Source/core/rendering/shapes/RasterShape.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * 2. Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" -#include "core/rendering/shapes/RasterShape.h" - -#include "core/rendering/shapes/ShapeInterval.h" -#include "wtf/MathExtras.h" - -namespace WebCore { - -IntRect RasterShapeIntervals::bounds() const -{ - if (!m_bounds) - m_bounds = adoptPtr(new IntRect(m_region.bounds())); - return *m_bounds; -} - -void RasterShapeIntervals::addInterval(int y, int x1, int x2) -{ - m_region.unite(Region(IntRect(x1, y, x2 - x1, 1))); - m_bounds.clear(); -} - -static inline IntRect alignedRect(IntRect r, int y1, int y2) -{ - return IntRect(r.x(), y1, r.width(), y2 - y1); -} - -void RasterShapeIntervals::getIncludedIntervals(int y1, int y2, SegmentList& result) const -{ - ASSERT(y2 >= y1); - - IntRect lineRect(bounds().x(), y1, bounds().width(), y2 - y1); - Region lineRegion(lineRect); - lineRegion.intersect(m_region); - if (lineRegion.isEmpty()) - return; - - Vector<IntRect> lineRects = lineRegion.rects(); - ASSERT(lineRects.size() > 0); - - Region segmentsRegion(lineRect); - Region intervalsRegion; - - // The loop below uses Regions to compute the intersection of the horizontal - // shape intervals that fall within the line's box. - - int lineY = lineRects[0].y(); - for (unsigned i = 0; i < lineRects.size(); ++i) { - if (lineRects[i].y() != lineY) { - segmentsRegion.intersect(intervalsRegion); - intervalsRegion = Region(); - } - intervalsRegion.unite(Region(alignedRect(lineRects[i], y1, y2))); - lineY = lineRects[i].y(); - } - if (!intervalsRegion.isEmpty()) - segmentsRegion.intersect(intervalsRegion); - - Vector<IntRect> segmentRects = segmentsRegion.rects(); - for (unsigned i = 0; i < segmentRects.size(); ++i) - result.append(LineSegment(segmentRects[i].x(), segmentRects[i].maxX())); -} - -const RasterShapeIntervals& RasterShape::marginIntervals() const -{ - ASSERT(shapeMargin() >= 0); - if (!shapeMargin()) - return *m_intervals; - - // FIXME: add support for non-zero margin, see https://code.google.com/p/chromium/issues/detail?id=252737. - return *m_intervals; -} - -const RasterShapeIntervals& RasterShape::paddingIntervals() const -{ - ASSERT(shapePadding() >= 0); - if (!shapePadding()) - return *m_intervals; - - // FIXME: add support for non-zero padding, see https://code.google.com/p/chromium/issues/detail?id=252737. - return *m_intervals; -} - -void RasterShape::getExcludedIntervals(LayoutUnit, LayoutUnit, SegmentList&) const -{ - // FIXME: this method is only a stub, see https://code.google.com/p/chromium/issues/detail?id=252737. -} - -void RasterShape::getIncludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList& result) const -{ - const RasterShapeIntervals& intervals = paddingIntervals(); - if (intervals.isEmpty()) - return; - - float y1 = logicalTop; - float y2 = logicalTop + logicalHeight; - - if (y1 < intervals.bounds().y() || y2 > intervals.bounds().maxY()) - return; - - intervals.getIncludedIntervals(y1, y2, result); -} - -bool RasterShape::firstIncludedIntervalLogicalTop(LayoutUnit minLogicalIntervalTop, const LayoutSize& minLogicalIntervalSize, LayoutUnit& result) const -{ - float minIntervalTop = minLogicalIntervalTop; - float minIntervalHeight = minLogicalIntervalSize.height(); - float minIntervalWidth = minLogicalIntervalSize.width(); - - const RasterShapeIntervals& intervals = paddingIntervals(); - if (intervals.isEmpty() || minIntervalWidth > intervals.bounds().width()) - return false; - - float minY = std::max<float>(intervals.bounds().y(), minIntervalTop); - float maxY = minY + minIntervalHeight; - - if (maxY > intervals.bounds().maxY()) - return false; - - // FIXME: complete this method, see https://code.google.com/p/chromium/issues/detail?id=252737. - - result = minY; - return true; -} - -} // namespace WebCore diff --git a/chromium/third_party/WebKit/Source/core/rendering/shapes/RasterShape.h b/chromium/third_party/WebKit/Source/core/rendering/shapes/RasterShape.h deleted file mode 100644 index 84bed9cf25d..00000000000 --- a/chromium/third_party/WebKit/Source/core/rendering/shapes/RasterShape.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * 2. Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef RasterShape_h -#define RasterShape_h - -#include "core/platform/graphics/FloatRect.h" -#include "core/platform/graphics/Region.h" -#include "core/rendering/shapes/Shape.h" -#include "wtf/Assertions.h" -#include "wtf/Vector.h" - -namespace WebCore { - -class RasterShapeIntervals { -public: - RasterShapeIntervals() { } - - IntRect bounds() const; - bool isEmpty() const { return m_region.isEmpty(); } - void addInterval(int y, int x1, int x2); - void getIncludedIntervals(int y1, int y2, SegmentList&) const; - -private: - Region m_region; - mutable OwnPtr<IntRect> m_bounds; // Cached value of m_region.bounds(). -}; - -class RasterShape : public Shape { - WTF_MAKE_NONCOPYABLE(RasterShape); -public: - RasterShape(PassOwnPtr<RasterShapeIntervals> intervals) - : Shape() - , m_intervals(intervals) - { - } - - virtual LayoutRect shapeMarginLogicalBoundingBox() const OVERRIDE { return static_cast<LayoutRect>(marginIntervals().bounds()); } - virtual LayoutRect shapePaddingLogicalBoundingBox() const OVERRIDE { return static_cast<LayoutRect>(paddingIntervals().bounds()); } - virtual bool isEmpty() const OVERRIDE { return m_intervals->isEmpty(); } - virtual void getExcludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList&) const OVERRIDE; - virtual void getIncludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList&) const OVERRIDE; - virtual bool firstIncludedIntervalLogicalTop(LayoutUnit minLogicalIntervalTop, const LayoutSize& minLogicalIntervalSize, LayoutUnit&) const OVERRIDE; - -private: - const RasterShapeIntervals& marginIntervals() const; - const RasterShapeIntervals& paddingIntervals() const; - - OwnPtr<RasterShapeIntervals> m_intervals; -}; - -} // namespace WebCore - -#endif // RasterShape_h diff --git a/chromium/third_party/WebKit/Source/core/rendering/shapes/Shape.cpp b/chromium/third_party/WebKit/Source/core/rendering/shapes/Shape.cpp index b325c073aa5..60d003bad86 100644 --- a/chromium/third_party/WebKit/Source/core/rendering/shapes/Shape.cpp +++ b/chromium/third_party/WebKit/Source/core/rendering/shapes/Shape.cpp @@ -31,12 +31,9 @@ #include "core/rendering/shapes/Shape.h" #include "core/css/LengthFunctions.h" -#include "core/fetch/ImageResource.h" #include "core/platform/graphics/FloatSize.h" -#include "core/platform/graphics/ImageBuffer.h" #include "core/platform/graphics/WindRule.h" #include "core/rendering/shapes/PolygonShape.h" -#include "core/rendering/shapes/RasterShape.h" #include "core/rendering/shapes/RectangleShape.h" #include "wtf/MathExtras.h" #include "wtf/OwnPtr.h" @@ -201,45 +198,4 @@ PassOwnPtr<Shape> Shape::createShape(const BasicShape* basicShape, const LayoutS return shape.release(); } -PassOwnPtr<Shape> Shape::createShape(const StyleImage* styleImage, float threshold, const LayoutSize&, WritingMode writingMode, Length margin, Length padding) -{ - ASSERT(styleImage && styleImage->isImageResource() && styleImage->cachedImage() && styleImage->cachedImage()->image()); - - OwnPtr<RasterShapeIntervals> intervals = adoptPtr(new RasterShapeIntervals()); - - Image* image = styleImage->cachedImage()->image(); - const IntSize& imageSize = image->size(); - OwnPtr<ImageBuffer> imageBuffer = ImageBuffer::create(imageSize); - if (imageBuffer) { - GraphicsContext* graphicsContext = imageBuffer->context(); - graphicsContext->drawImage(image, IntPoint()); - - RefPtr<Uint8ClampedArray> pixelArray = imageBuffer->getUnmultipliedImageData(IntRect(IntPoint(), imageSize)); - unsigned pixelArrayLength = pixelArray->length(); - unsigned pixelArrayOffset = 3; // Each pixel is four bytes: RGBA. - uint8_t alphaPixelThreshold = threshold * 255; - - ASSERT(static_cast<unsigned>(imageSize.width() * imageSize.height() * 4) == pixelArrayLength); - - for (int y = 0; y < imageSize.height(); ++y) { - int startX = -1; - for (int x = 0; x < imageSize.width() && pixelArrayOffset < pixelArrayLength; ++x, pixelArrayOffset += 4) { - uint8_t alpha = pixelArray->item(pixelArrayOffset); - if ((startX == -1) && alpha > alphaPixelThreshold) { - startX = x; - } else if (startX != -1 && (alpha <= alphaPixelThreshold || x == imageSize.width() - 1)) { - intervals->addInterval(y, startX, x); - startX = -1; - } - } - } - } - - OwnPtr<RasterShape> rasterShape = adoptPtr(new RasterShape(intervals.release())); - rasterShape->m_writingMode = writingMode; - rasterShape->m_margin = floatValueForLength(margin, 0); - rasterShape->m_padding = floatValueForLength(padding, 0); - return rasterShape.release(); -} - } // namespace WebCore diff --git a/chromium/third_party/WebKit/Source/core/rendering/shapes/Shape.h b/chromium/third_party/WebKit/Source/core/rendering/shapes/Shape.h index b1ea954b3fd..6e257c96e54 100644 --- a/chromium/third_party/WebKit/Source/core/rendering/shapes/Shape.h +++ b/chromium/third_party/WebKit/Source/core/rendering/shapes/Shape.h @@ -33,7 +33,6 @@ #include "core/platform/graphics/LayoutRect.h" #include "core/platform/text/WritingMode.h" #include "core/rendering/style/BasicShapes.h" -#include "core/rendering/style/StyleImage.h" #include "wtf/PassOwnPtr.h" #include "wtf/Vector.h" @@ -61,7 +60,6 @@ typedef Vector<LineSegment> SegmentList; class Shape { public: static PassOwnPtr<Shape> createShape(const BasicShape*, const LayoutSize& logicalBoxSize, WritingMode, Length margin, Length padding); - static PassOwnPtr<Shape> createShape(const StyleImage*, float threshold, const LayoutSize& logicalBoxSize, WritingMode, Length margin, Length padding); virtual ~Shape() { } diff --git a/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeInfo.cpp b/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeInfo.cpp index 54f97abf40f..78341a38445 100644 --- a/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeInfo.cpp +++ b/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeInfo.cpp @@ -41,26 +41,12 @@ const Shape* ShapeInfo<RenderType, shapeGetter, intervalGetter>::computedShape() if (Shape* shape = m_shape.get()) return shape; - const LayoutSize logicalBoxSize(m_shapeLogicalWidth, m_shapeLogicalHeight); - WritingMode writingMode = m_renderer->style()->writingMode(); - Length margin = m_renderer->style()->shapeMargin(); - Length padding = m_renderer->style()->shapePadding(); - const ShapeValue* shapeValue = (m_renderer->style()->*shapeGetter)(); - ASSERT(shapeValue); + ShapeValue* shapeValue = (m_renderer->style()->*shapeGetter)(); + BasicShape* shape = (shapeValue && shapeValue->type() == ShapeValue::Shape) ? shapeValue->shape() : 0; - switch (shapeValue->type()) { - case ShapeValue::Shape: - ASSERT(shapeValue->shape()); - m_shape = Shape::createShape(shapeValue->shape(), logicalBoxSize, writingMode, margin, padding); - break; - case ShapeValue::Image: - ASSERT(shapeValue->image()); - m_shape = Shape::createShape(shapeValue->image(), 0, logicalBoxSize, writingMode, margin, padding); - break; - default: - ASSERT_NOT_REACHED(); - } + ASSERT(shape); + m_shape = Shape::createShape(shape, LayoutSize(m_shapeLogicalWidth, m_shapeLogicalHeight), m_renderer->style()->writingMode(), m_renderer->style()->shapeMargin(), m_renderer->style()->shapePadding()); ASSERT(m_shape); return m_shape.get(); } diff --git a/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeInsideInfo.cpp b/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeInsideInfo.cpp index 8c63f6c4d74..01dff4951f8 100644 --- a/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeInsideInfo.cpp +++ b/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeInsideInfo.cpp @@ -44,19 +44,11 @@ LineSegmentRange::LineSegmentRange(const InlineIterator& start, const InlineIter bool ShapeInsideInfo::isEnabledFor(const RenderBlock* renderer) { ShapeValue* shapeValue = renderer->style()->resolvedShapeInside(); - if (!shapeValue) + if (!shapeValue || shapeValue->type() != ShapeValue::Shape) return false; - switch (shapeValue->type()) { - case ShapeValue::Shape: - return shapeValue->shape() && shapeValue->shape()->type() != BasicShape::BasicShapeInsetRectangleType; - case ShapeValue::Image: - return shapeValue->isImageValid(); - case ShapeValue::Outside: - return false; - } - - return false; + BasicShape* shape = shapeValue->shape(); + return shape && shape->type() != BasicShape::BasicShapeInsetRectangleType; } bool ShapeInsideInfo::adjustLogicalLineTop(float minSegmentWidth) diff --git a/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeOutsideInfo.cpp b/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeOutsideInfo.cpp index ed58e303568..76f52ddc461 100644 --- a/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeOutsideInfo.cpp +++ b/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeOutsideInfo.cpp @@ -35,20 +35,8 @@ namespace WebCore { bool ShapeOutsideInfo::isEnabledFor(const RenderBox* box) { - ShapeValue* shapeValue = box->style()->shapeOutside(); - if (!box->isFloatingWithShapeOutside() || !shapeValue) - return false; - - switch (shapeValue->type()) { - case ShapeValue::Shape: - return shapeValue->shape(); - case ShapeValue::Image: - return false; - case ShapeValue::Outside: - return false; - } - - return false; + ShapeValue* value = box->style()->shapeOutside(); + return box->isFloatingWithShapeOutside() && value->type() == ShapeValue::Shape && value->shape(); } bool ShapeOutsideInfo::computeSegmentsForContainingBlockLine(LayoutUnit lineTop, LayoutUnit floatTop, LayoutUnit lineHeight) |