From b9543270e1db82fcf21ff98c02c53727ad9a9bce Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Thu, 11 Jul 2024 09:41:29 +0100 Subject: [PATCH] PicoVector: Fix x16 anti-aliasing. --- libraries/pico_vector/pico_vector.cpp | 3 +++ libraries/pico_vector/pico_vector.hpp | 16 +++++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/libraries/pico_vector/pico_vector.cpp b/libraries/pico_vector/pico_vector.cpp index 9c20f073..933ef2a1 100644 --- a/libraries/pico_vector/pico_vector.cpp +++ b/libraries/pico_vector/pico_vector.cpp @@ -6,6 +6,9 @@ namespace pimoroni { PicoGraphics *PicoVector::graphics = nullptr; + uint8_t PicoVector::max_alpha = 4; + const uint8_t *PicoVector::alpha_map = alpha_map_x4; + void PicoVector::draw(pp_poly_t *poly) { pp_transform(NULL); pp_render(poly); diff --git a/libraries/pico_vector/pico_vector.hpp b/libraries/pico_vector/pico_vector.hpp index d76904d5..534fe3bd 100644 --- a/libraries/pico_vector/pico_vector.hpp +++ b/libraries/pico_vector/pico_vector.hpp @@ -31,7 +31,10 @@ namespace pimoroni { private: static PicoGraphics *graphics; af_text_metrics_t text_metrics; - static constexpr uint8_t alpha_map[4] {0, 128, 192, 255}; + static constexpr uint8_t alpha_map_x4[4] {0, 128, 192, 255}; + static constexpr uint8_t alpha_map_x16[16] {0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 255}; + static uint8_t max_alpha; + static const uint8_t *alpha_map; public: PicoVector(PicoGraphics *graphics, void *mem = nullptr) { @@ -39,7 +42,7 @@ namespace pimoroni { pp_tile_callback(PicoVector::tile_callback); - pp_antialias(graphics->supports_alpha_blend() ? PP_AA_X4 : PP_AA_NONE); + set_antialiasing(graphics->supports_alpha_blend() ? PP_AA_X4 : PP_AA_NONE); pp_clip(graphics->clip.x, graphics->clip.y, graphics->clip.w, graphics->clip.h); @@ -67,7 +70,7 @@ namespace pimoroni { for(auto y = 0; y < tile->h; y++) { for(auto x = 0; x < tile->w; x++) { uint8_t alpha = *tile_data++; - if (alpha >= 4) { + if (alpha >= max_alpha) { PicoVector::graphics->pixel({x + tile->x, y + tile->y}); } else if (alpha > 0) { alpha = alpha_map[alpha]; @@ -91,6 +94,13 @@ namespace pimoroni { void set_antialiasing(pp_antialias_t antialias) { pp_antialias(antialias); + if(antialias == PP_AA_X16) { + alpha_map = alpha_map_x16; + max_alpha = 16; + } else { + alpha_map = alpha_map_x4; + max_alpha = 4; + } } void set_font_size(unsigned int font_size) {