| 1 | // Copyright 2006 The Android Open Source Project |
| 2 | // Copyright 2020 Yevhenii Reizner |
| 3 | // |
| 4 | // Use of this source code is governed by a BSD-style license that can be |
| 5 | // found in the LICENSE file. |
| 6 | |
| 7 | use crate::geom::ScreenIntRect; |
| 8 | |
| 9 | use crate::alpha_runs::AlphaRun; |
| 10 | use crate::color::AlphaU8; |
| 11 | use crate::LengthU32; |
| 12 | |
| 13 | /// Mask is used to describe alpha bitmaps. |
| 14 | pub struct Mask { |
| 15 | pub image: [u8; 2], |
| 16 | pub bounds: ScreenIntRect, |
| 17 | pub row_bytes: u32, |
| 18 | } |
| 19 | |
| 20 | /// Blitter is responsible for actually writing pixels into memory. |
| 21 | /// |
| 22 | /// Besides efficiency, they handle clipping and antialiasing. |
| 23 | /// An object that implements Blitter contains all the context needed to generate pixels |
| 24 | /// for the destination and how src/generated pixels map to the destination. |
| 25 | /// The coordinates passed to the `blit_*` calls are in destination pixel space. |
| 26 | pub trait Blitter { |
| 27 | /// Blits a horizontal run of one or more pixels. |
| 28 | fn blit_h(&mut self, _x: u32, _y: u32, _width: LengthU32) { |
| 29 | unreachable!() |
| 30 | } |
| 31 | |
| 32 | /// Blits a horizontal run of antialiased pixels. |
| 33 | /// |
| 34 | /// runs[] is a *sparse* zero-terminated run-length encoding of spans of constant alpha values. |
| 35 | /// |
| 36 | /// The runs[] and antialias[] work together to represent long runs of pixels with the same |
| 37 | /// alphas. The runs[] contains the number of pixels with the same alpha, and antialias[] |
| 38 | /// contain the coverage value for that number of pixels. The runs[] (and antialias[]) are |
| 39 | /// encoded in a clever way. The runs array is zero terminated, and has enough entries for |
| 40 | /// each pixel plus one, in most cases some of the entries will not contain valid data. An entry |
| 41 | /// in the runs array contains the number of pixels (np) that have the same alpha value. The |
| 42 | /// next np value is found np entries away. For example, if runs[0] = 7, then the next valid |
| 43 | /// entry will by at runs[7]. The runs array and antialias[] are coupled by index. So, if the |
| 44 | /// np entry is at runs[45] = 12 then the alpha value can be found at antialias[45] = 0x88. |
| 45 | /// This would mean to use an alpha value of 0x88 for the next 12 pixels starting at pixel 45. |
| 46 | fn blit_anti_h( |
| 47 | &mut self, |
| 48 | _x: u32, |
| 49 | _y: u32, |
| 50 | _antialias: &mut [AlphaU8], |
| 51 | _runs: &mut [AlphaRun], |
| 52 | ) { |
| 53 | unreachable!() |
| 54 | } |
| 55 | |
| 56 | /// Blits a vertical run of pixels with a constant alpha value. |
| 57 | fn blit_v(&mut self, _x: u32, _y: u32, _height: LengthU32, _alpha: AlphaU8) { |
| 58 | unreachable!() |
| 59 | } |
| 60 | |
| 61 | fn blit_anti_h2(&mut self, _x: u32, _y: u32, _alpha0: AlphaU8, _alpha1: AlphaU8) { |
| 62 | unreachable!() |
| 63 | } |
| 64 | |
| 65 | fn blit_anti_v2(&mut self, _x: u32, _y: u32, _alpha0: AlphaU8, _alpha1: AlphaU8) { |
| 66 | unreachable!() |
| 67 | } |
| 68 | |
| 69 | /// Blits a solid rectangle one or more pixels wide. |
| 70 | fn blit_rect(&mut self, _rect: &ScreenIntRect) { |
| 71 | unreachable!() |
| 72 | } |
| 73 | |
| 74 | /// Blits a pattern of pixels defined by a rectangle-clipped mask. |
| 75 | fn blit_mask(&mut self, _mask: &Mask, _clip: &ScreenIntRect) { |
| 76 | unreachable!() |
| 77 | } |
| 78 | } |
| 79 | |