1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <hwui/Paint.h>
18 #include <minikin/Layout.h>
19 #include <string>
20 #include "TestSceneBase.h"
21 
22 class SaveLayer2Animation;
23 
24 static TestScene::Registrar _SaveLayer(TestScene::Info{
25         "savelayer2",
26         "Interleaving 20 drawText/drawRect ops with saveLayer"
27         "Tests the clipped saveLayer performance and FBO switching overhead.",
28         TestScene::simpleCreateScene<SaveLayer2Animation>});
29 
30 class SaveLayer2Animation : public TestScene {
31 public:
32     Paint mBluePaint;
33     Paint mGreenPaint;
34 
createContent(int width,int height,Canvas & canvas)35     void createContent(int width, int height, Canvas& canvas) override {
36         canvas.drawColor(SkColorSetARGB(255, 255, 0, 0), SkBlendMode::kSrcOver);
37         SkIRect bounds = SkIRect::MakeWH(width, height);
38         int regions = 20;
39         int smallRectHeight = (bounds.height() / regions);
40         int padding = smallRectHeight / 4;
41         int top = bounds.fTop;
42 
43         mBluePaint.setColor(SkColorSetARGB(255, 0, 0, 255));
44         mBluePaint.getSkFont().setSize(padding);
45         mGreenPaint.setColor(SkColorSetARGB(255, 0, 255, 0));
46         mGreenPaint.getSkFont().setSize(padding);
47 
48         // interleave drawText and drawRect with saveLayer ops
49         for (int i = 0; i < regions; i++, top += smallRectHeight) {
50             canvas.saveLayer(bounds.fLeft, top, bounds.fRight, top + padding, &mBluePaint,
51                              SaveFlags::ClipToLayer | SaveFlags::MatrixClip);
52             canvas.drawColor(SkColorSetARGB(255, 255, 255, 0), SkBlendMode::kSrcOver);
53             std::string stri = std::to_string(i);
54             std::string offscreen = "offscreen line " + stri;
55             TestUtils::drawUtf8ToCanvas(&canvas, offscreen.c_str(), mBluePaint, bounds.fLeft,
56                     top + padding);
57             canvas.restore();
58 
59             canvas.drawRect(bounds.fLeft, top + padding, bounds.fRight,
60                             top + smallRectHeight - padding, mBluePaint);
61             std::string onscreen = "onscreen line " + stri;
62             TestUtils::drawUtf8ToCanvas(&canvas, onscreen.c_str(), mGreenPaint, bounds.fLeft,
63                     top + smallRectHeight - padding);
64         }
65     }
doFrame(int frameNr)66     void doFrame(int frameNr) override {}
67 };
68