home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.arch      Apparently more than just beeps & boops      131,241 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 130,103 of 131,241   
   BGB to Robert Finch   
   Re: Tonights Tradeoff (1/3)   
   02 Nov 25 14:58:36   
   
   From: cr88192@gmail.com   
      
   On 11/2/2025 9:06 AM, Robert Finch wrote:   
   > On 2025-11-02 3:21 a.m., BGB wrote:   
   >> On 10/31/2025 2:32 PM, BGB wrote:   
   >>> On 10/31/2025 1:21 PM, BGB wrote:   
   >>>   
   >>> ...   
   >>>   
   >>>>   
   >>>> In a lot of the cases, I was using an 8-bit indexed color or color-   
   >>>> cell mode. For indexed color, one needs to send each image through a   
   >>>> palette conversion (to the OS color palette); or run a color-cell   
   >>>> encoder. Mostly because the display HW used 128K of VRAM.   
   >>>>   
   >>>> And, even if RAM backed, there are bandwidth problems with going   
   >>>> bigger; so higher-resolutions had typically worked to reduce the   
   >>>> bits per pixel:   
   >>>>     320x200: 16 bpp   
   >>>>     640x400: 4 bpp (color cell), 8 bpp (uses 256K, sorta works)   
   >>>>     800x600: 2 or 4 bpp color-cell   
   >>>>    1024x768: 1 bpp monochrome, other experiments (*1)   
   >>>>      Or, use the 2 bpp mode, for 192K.   
   >>>>   
   >>>> *1: Bayer Pattern Mode/Logic (where the pattern of pixels also   
   >>>> encodes the color);   
   >>>> One possibility also being to use an indexed color pair for every   
   >>>> 8x8, allowing for a 1.25 bpp color cell mode.   
   >>>>   
   >>>   
   >>>   
   >>> Expanding on this:   
   >>> Idea 1, original:   
   >>> Each group of 2x2 pixels understood as:   
   >>>    G R   
   >>>    B G   
   >>> With each pixel alternating color.   
   >>>   
   >>> But, slightly better for quality is to operate on blocks of 4x4   
   >>> pixels, with the pixel bits encoding color indirectly for the whole   
   >>> 4x4 block:   
   >>>    G R G B   
   >>>    B G R G   
   >>>    G R G B   
   >>>    B G R G   
   >>> So, if >= 4 G bits are set, G is High.   
   >>> So, if >= 2 R bits are set, R is High.   
   >>> So, if >= 2 B bits are set, B is High.   
   >>> If > 8 bits are set, I is high.   
   >>>   
   >>> The non-set pixels usually assuming either 0000 (Black) or 1000 (Dark   
   >>> Grey) depending on I bit. Or, a low intensity version of the main   
   >>> color if over 75% of a given bit are set in a given way (say, for   
   >>> mostly flat color blocks).   
   >>>   
   >>> Still kinda sucks, but allows a crude approximation of 16 color   
   >>> graphics at 1 bpp...   
   >>>   
   >>   
   >> Well, anyways, here is me testing with another variation of the idea   
   >> (after thinking about it again).   
   >>   
   >> Using a joke image as a test case here...   
   >>   
   >> https://x.com/cr88192/status/1984694932666261839   
   >>   
   >> This variation uses:   
   >>    Y R   
   >>    B G   
   >>   
   >> In this case tiling as:   
   >>    Y R Y R ...   
   >>    B G B G ...   
   >>    Y R Y R ...   
   >>    B G B G ...   
   >>    ...   
   >>   
   >> Where, Y is a pure luma value.   
   >>    May or may not use this, or:   
   >>      Y R B G Y R B G   
   >>      B G Y R B G Y R   
   >>      ...   
   >>    But, prior pattern is simpler to deal with.   
   >>   
   >> Note that having every line follow the same pattern (with no   
   >> alternation) would lead to obvious vertical lines in the output.   
   >>   
   >>   
   >> With a different (slightly more complicated color recovery algorithm),   
   >> and was operating on 8x8 pixel blocks.   
   >>   
   >> With 4x4, there is effectively 4 bits per channel, which is enough to   
   >> recover 1 bit of color per channel.   
   >>   
   >> With 8x8, there are 16 bits, and it is possible to recover ~ 3 bits   
   >> per channel, allowing for roughly a RGB333 color space (though, the   
   >> vectors are normalized here).   
   >>   
   >> Having both a Y and G channel slightly helps with the color-recovery   
   >> process; and allows a way to signal a monochrome block (if Y==G, the   
   >> block is assumed to be monochrome, and the R/B bits can be used more   
   >> freely for expressing luma).   
   >>   
   >> Where:   
   >> Chroma accuracy comes at the expense of luma accuracy;   
   >> An increased colorspace comes at the cost of spatial resolution of   
   >> chroma;   
   >> ...   
   >>   
   >>   
   >> Dealing with chroma does have the effect of making the dithering   
   >> process more complicated. As noted, reliable recovery of the color   
   >> vector is itself a bit fiddly (and is very sensitive to the encoder   
   >> side dither process).   
   >>   
   >> The former image was itself an example of an artifact caused by the   
   >> dithering process, which in this case was over-boosting the green   
   >> channel (and rotating the dither matrix would result in drastic color   
   >> shifts). The later image was mostly after I realized the issue with   
   >> the dither pattern, and modified how it was being handled (replacing   
   >> the use of an 8x8 ordered dither with a 4x4 ordered dither, and then   
   >> rotating the matrix for each channel).   
   >>   
   >>   
   >> Image quality isn't great, but then again, not sure how to do that   
   >> much better with a naive 1 bit/pixel encoding.   
   >>   
   >>   
   >> I guess, an open question here is whether the color-recovery algorithm   
   >> would be practical for hardware / FPGA.   
   >>   
   >> One possible could be:   
   >>    Use LUT4 to map 4b -> 2b (as a count)   
   >>    Then, map 2x2b -> 3b (adder)   
   >>    Then, map 2x3b -> 4b (adder), then discard LSB.   
   >>    Then, select max or R/G/B/Y;   
   >>      This is used as an inverse normalization scale.   
   >>    Feed each value and scale through a LUT (for R/G/B)   
   >>      Getting a 5-bit scaled RGB;   
   >>      Roughly: (Val<<5)/Max   
   >>    Compose a 5-bit RGB555 value used for each pixel that is set.   
   >>   
   >> Actual pixel decoding process works the same as with 8x8 blocks of 1   
   >> bit monochome, selecting minimum or maximum color based on each bit.   
   >>   
   >> Possibly, Y could also be used to select "relative" minimum and   
   >> maximum values, vs full intensity and black, but this would add more   
   >> logic complexity.   
   >>   
   >>   
   >> Pros/Cons:   
   >>    +: Looks better than per-pixel Bayer-RGB   
   >>    +: Looks better than 4x4 RGBI   
   >>    -: Would require more complex decoder logic;   
   >>    -: Requires specialized dither logic to not look like broken crap.   
   >>    -: Doesn't give passable results if handed naive grayscale dithering.   
   >>   
   >> Per-Pixel RGB still holds up OK with naive grayscale dither.   
   >> But, this approach is a lot more particular.   
   >>   
   >> the RGBI approach seems intermediate, more likely to decode grayscale   
   >> patterns as gray.   
   >>   
   >>   
   >>   
   >> I guess a more open question is if such a thing could be useful (it is   
   >> pretty far down the image-quality scale). But, OTOH, with simpler   
   >> (non- randomized) dither patterns; it can LZ compress OK (depending on   
   >> image, can get 0.1 to 0.8 bpp; which is generally JPEG territory).   
   >>   
   >> If combined with delta encoding or similar; could almost be adapted   
   >> into a very crappy video codec.   
   >>   
   >> Well, or LZ4, where (at 320x200) one could potentially hold several   
   >> frames of video in a 64K sliding window.   
   >>   
   >> But, image quality might be unacceptably poor. Also if decoded in   
   >> software, the color-reconstruction is likely to be more   
   >> computationally expensive than just using a CRAM style codec (while   
   >> also giving worse image quality).   
   >>   
   >>   
      
   [continued in next message]   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca