"""Apple II HGR monochrome: 280x192, 1 bit/pixel, black & white. Universal across the Apple II+ and //e. Tone is carried entirely by dithering. """ from __future__ import annotations import numpy as np from ... import dither from ...convert.base import Conversion, perceptual_error from .. import palette as apal WIDTH, HEIGHT = 280, 192 PIXEL_ASPECT = 1.0 DATA_ADDR = 0x2000 # HGR page 1 def convert(img_rgb, palette_name="mono", dither_mode="floyd", intensive=False, base_color=None): from ...palette import srgb_to_lab plab = apal.mono_lab() # 2 entries: black, white L = srgb_to_lab(img_rgb)[..., 0] img_mono = np.zeros((HEIGHT, WIDTH, 3)) img_mono[..., 0] = L plab_mono = np.zeros((2, 3)) plab_mono[:, 0] = plab[:, 0] allowed = np.tile(np.array([0, 1]), (HEIGHT, WIDTH, 1)) idx = dither.quantize(img_mono, allowed, plab_mono, dither_mode).astype(np.uint8) data = apal.pack_hgr_mono(idx) # 8192-byte HGR buffer preview = (apal.MONO.astype(np.uint8))[idx] return Conversion( mode="hgr_mono", width=WIDTH, height=HEIGHT, pixel_aspect=PIXEL_ASPECT, index_image=idx.astype(np.uint16), data=data, data_addr=DATA_ADDR, viewer="hgr", preview_rgb=preview, error=perceptual_error(idx, img_mono, plab_mono), meta={"palette": "mono", "dither": dither_mode}, )