odin-blend2d

Odin bindings to Blend2D
Log | Files | Refs | README | LICENSE

bl_bench_backend.cpp (4382B)


      1 // This file is part of Blend2D project <https://blend2d.com>
      2 //
      3 // See LICENSE.md for license and copyright information
      4 // SPDX-License-Identifier: Zlib
      5 
      6 #include "bl_bench_app.h"
      7 #include "bl_bench_backend.h"
      8 #include "shape_data.h"
      9 
     10 #include <chrono>
     11 
     12 namespace blbench {
     13 
     14 // blbench::Backend - Construction & Destruction
     15 // =================================================
     16 
     17 Backend::Backend()
     18   : _name(),
     19     _params(),
     20     _duration(0),
     21     _rnd_coord(0x19AE0DDAE3FA7391ull),
     22     _rnd_color(0x94BD7A499AD10011ull),
     23     _rnd_extra(0x1ABD9CC9CAF0F123ull),
     24     _rnd_sprite_id(0) {}
     25 Backend::~Backend() {}
     26 
     27 // blbench::Backend - Run
     28 // ==========================
     29 
     30 static void BenchModule_shape_helper(Backend* mod, RenderOp op, ShapeKind shapeKind) {
     31   ShapeData shapeData;
     32   get_shape_data(shapeData, shapeKind);
     33   mod->render_shape(op, shapeData);
     34 }
     35 
     36 void Backend::run(const BenchApp& app, const BenchParams& params) {
     37   _params = params;
     38 
     39   _rnd_coord.rewind();
     40   _rnd_color.rewind();
     41   _rnd_extra.rewind();
     42   _rnd_sprite_id = 0;
     43 
     44   // Initialize the sprites.
     45   for (uint32_t i = 0; i < kBenchNumSprites; i++) {
     46     _sprites[i] = app.get_scaled_sprite(i, params.shape_size);
     47   }
     48 
     49   before_run();
     50   auto start = std::chrono::high_resolution_clock::now();
     51 
     52   switch (_params.testKind) {
     53     case TestKind::kFillAlignedRect   : render_rect_a(RenderOp::kFillNonZero); break;
     54     case TestKind::kFillSmoothRect    : render_rect_f(RenderOp::kFillNonZero); break;
     55     case TestKind::kFillRotatedRect   : render_rect_rotated(RenderOp::kFillNonZero); break;
     56     case TestKind::kFillSmoothRound   : render_round_f(RenderOp::kFillNonZero); break;
     57     case TestKind::kFillRotatedRound  : render_round_rotated(RenderOp::kFillNonZero); break;
     58     case TestKind::kFillTriangle      : render_polygon(RenderOp::kFillNonZero, 3); break;
     59     case TestKind::kFillPolygon10NZ   : render_polygon(RenderOp::kFillNonZero, 10); break;
     60     case TestKind::kFillPolygon10EO   : render_polygon(RenderOp::kFillEvenOdd, 10); break;
     61     case TestKind::kFillPolygon20NZ   : render_polygon(RenderOp::kFillNonZero, 20); break;
     62     case TestKind::kFillPolygon20EO   : render_polygon(RenderOp::kFillEvenOdd, 20); break;
     63     case TestKind::kFillPolygon40NZ   : render_polygon(RenderOp::kFillNonZero, 40); break;
     64     case TestKind::kFillPolygon40EO   : render_polygon(RenderOp::kFillEvenOdd, 40); break;
     65     case TestKind::kFillButterfly     : BenchModule_shape_helper(this, RenderOp::kFillNonZero, ShapeKind::kButterfly); break;
     66     case TestKind::kFillFish          : BenchModule_shape_helper(this, RenderOp::kFillNonZero, ShapeKind::kFish); break;
     67     case TestKind::kFillDragon        : BenchModule_shape_helper(this, RenderOp::kFillNonZero, ShapeKind::kDragon); break;
     68     case TestKind::kFillWorld         : BenchModule_shape_helper(this, RenderOp::kFillNonZero, ShapeKind::kWorld); break;
     69 
     70     case TestKind::kStrokeAlignedRect : render_rect_a(RenderOp::kStroke); break;
     71     case TestKind::kStrokeSmoothRect  : render_rect_f(RenderOp::kStroke); break;
     72     case TestKind::kStrokeRotatedRect : render_rect_rotated(RenderOp::kStroke); break;
     73     case TestKind::kStrokeSmoothRound : render_round_f(RenderOp::kStroke); break;
     74     case TestKind::kStrokeRotatedRound: render_round_rotated(RenderOp::kStroke); break;
     75     case TestKind::kStrokeTriangle    : render_polygon(RenderOp::kStroke, 3); break;
     76     case TestKind::kStrokePolygon10   : render_polygon(RenderOp::kStroke, 10); break;
     77     case TestKind::kStrokePolygon20   : render_polygon(RenderOp::kStroke, 20); break;
     78     case TestKind::kStrokePolygon40   : render_polygon(RenderOp::kStroke, 40); break;
     79     case TestKind::kStrokeButterfly   : BenchModule_shape_helper(this, RenderOp::kStroke, ShapeKind::kButterfly); break;
     80     case TestKind::kStrokeFish        : BenchModule_shape_helper(this, RenderOp::kStroke, ShapeKind::kFish); break;
     81     case TestKind::kStrokeDragon      : BenchModule_shape_helper(this, RenderOp::kStroke, ShapeKind::kDragon); break;
     82     case TestKind::kStrokeWorld       : BenchModule_shape_helper(this, RenderOp::kStroke, ShapeKind::kWorld); break;
     83   }
     84 
     85   flush();
     86 
     87   auto end = std::chrono::high_resolution_clock::now();
     88   std::chrono::duration<double> elapsed = end - start;
     89   _duration = uint64_t(elapsed.count() * 1000000);
     90 
     91   after_run();
     92 }
     93 
     94 void Backend::serialize_info(JSONBuilder& json) const { (void)json; }
     95 
     96 } // {blbench}