Merge "Account for text op stroke in bounds calculation" into nyc-dev

This commit is contained in:
Chris Craik
2016-03-17 17:05:14 +00:00
committed by Android (Google) Code Review
2 changed files with 58 additions and 1 deletions

View File

@@ -646,7 +646,9 @@ static batchid_t textBatchId(const SkPaint& paint) {
} }
void FrameBuilder::deferTextOp(const TextOp& op) { void FrameBuilder::deferTextOp(const TextOp& op) {
BakedOpState* bakedState = tryBakeOpState(op); BakedOpState* bakedState = BakedOpState::tryStrokeableOpConstruct(
mAllocator, *mCanvasState.writableSnapshot(), op,
BakedOpState::StrokeBehavior::StyleDefined);
if (!bakedState) return; // quick rejected if (!bakedState) return; // quick rejected
batchid_t batchId = textBatchId(*(op.paint)); batchid_t batchId = textBatchId(*(op.paint));

View File

@@ -316,6 +316,61 @@ TEST(FrameBuilder, textStrikethrough) {
<< "Expect number of ops = 2 * loop count"; << "Expect number of ops = 2 * loop count";
} }
static auto styles = {
SkPaint::kFill_Style, SkPaint::kStroke_Style, SkPaint::kStrokeAndFill_Style };
TEST(FrameBuilder, textStyle) {
class TextStyleTestRenderer : public TestRendererBase {
public:
void onMergedTextOps(const MergedBakedOpList& opList) override {
ASSERT_EQ(0, mIndex);
ASSERT_EQ(3u, opList.count);
mIndex += opList.count;
int index = 0;
for (auto style : styles) {
auto state = opList.states[index++];
ASSERT_EQ(style, state->op->paint->getStyle())
<< "Remainder of validation relies upon stable merged order";
ASSERT_EQ(0, state->computedState.clipSideFlags)
<< "Clipped bounds validation requires unclipped ops";
}
Rect fill = opList.states[0]->computedState.clippedBounds;
Rect stroke = opList.states[1]->computedState.clippedBounds;
EXPECT_EQ(stroke, opList.states[2]->computedState.clippedBounds)
<< "Stroke+Fill should be same as stroke";
EXPECT_TRUE(stroke.contains(fill));
EXPECT_FALSE(fill.contains(stroke));
Rect outsetFill(fill);
outsetFill.outset(10);
EXPECT_EQ(stroke, outsetFill);
}
};
auto node = TestUtils::createNode(0, 0, 400, 400,
[](RenderProperties& props, TestCanvas& canvas) {
SkPaint paint;
paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
paint.setAntiAlias(true);
paint.setTextSize(50);
paint.setStrokeWidth(10);
// draw 3 copies of the same text overlapping, each with a different style.
// They'll get merged, but with
for (auto style : styles) {
paint.setStyle(style);
TestUtils::drawTextToCanvas(&canvas, "Test string1", paint, 100, 100);
}
});
FrameBuilder frameBuilder(sEmptyLayerUpdateQueue, SkRect::MakeWH(400, 400), 400, 400,
TestUtils::createSyncedNodeList(node), sLightGeometry, nullptr);
TextStyleTestRenderer renderer;
frameBuilder.replayBakedOps<TestDispatcher>(renderer);
EXPECT_EQ(3, renderer.getIndex()) << "Expect 3 ops";
}
RENDERTHREAD_TEST(FrameBuilder, textureLayer) { RENDERTHREAD_TEST(FrameBuilder, textureLayer) {
class TextureLayerTestRenderer : public TestRendererBase { class TextureLayerTestRenderer : public TestRendererBase {
public: public: