From d35774eac4da37ee0893eda6b691ecebbe7c467f Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Wed, 10 Dec 2025 15:23:30 -0800 Subject: [PATCH] Use high precision cos for RGB->DHGR Conversion Add some raster op routines for FORTH turtle graphcis --- images/apple/PLEIADES-2.20.po | Bin 33553920 -> 33553920 bytes images/apple/PLFORTH.po | Bin 143360 -> 143360 bytes src/dhgr.tk/utils/dhgrrgb.pla | 49 ++++++---------------------------- src/scripts/hgrlib.4th | 5 +++- 4 files changed, 12 insertions(+), 42 deletions(-) diff --git a/images/apple/PLEIADES-2.20.po b/images/apple/PLEIADES-2.20.po index 75679ec978801e1fbed4b82357e3dac99e29730a..4f09208cba5d66f197a7a2d1725a7f47b91fe5c8 100644 GIT binary patch delta 6463 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 aM3+UsihdJa5&bT@YT6vJwAS>)eg6ZM2RR1- delta 7515 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 aqU)kxM8AsuE&5G#L$}*f-l)6y`2PTAHSv4^ diff --git a/images/apple/PLFORTH.po b/images/apple/PLFORTH.po index ecfb56daa1c245d42340555cb51c55e22fe568c9..5a3d8da878b3461b8e35085934f84ee7382aa462 100644 GIT binary patch delta 1665 zcmZuyOH9;I6uqxJ$I*yrP%$ux4Mq$^NMvxq$Hg!frc&D4c8Eq;urcVygfS+ph8;>= zkj$cq(OGCRA;yT2$;7xaA^6wvkN>cjmHVmQd9-!g#dq_t`;2ftbvrz+>Forb4O87tnfk$~@ zU#giCKbfi$e@IrXXtzfM;9LRxxt z9t(J^7pgp#$650pTR`)y7FtPUi224ArwC^pTc6_l$wPZwQ)R8I$J-=*gp;_#Pa=!R zbU+m%SvwWT$B3Ndka_6XY}?PHE4ba8G}v|?THLvMdGrbPc&*Y;9r&SQRc0113xGaD zy5F2x?8)<_ao{B~v~%A8>amiBrAR&leT}mB^0IN5df@^QB4l-$2qjXuLMBMMPc$V< zkyS~==d7q`+DK9tQF#I{#fkE*B3qIXQv%Vks;En2>M_+6`|BC+X$|dx)Rnw==Tet> z(>yVTU2d;zEn=59KJ6S9Qn*ecf@{eeB$9rIYDZ-J25lEzKxcv~f{USt$ zjlh=aH?+bMvqCrf53ur#E|~WNtJd>Xv5iKO%Mw9&`<}IwyG5w*;nU`M5&Qo9DO1%`iYsHkN!9|KEQ><2Fn=hinBik?AprX-Fj(KlnV)L}+vBI}LxVj5`{7iV7hG7+9C+j%cLX|& zq!LqWLj&6aAM|lkvor}C%pOh*QgFp|?b>yH3_PZe151|SE?&8QY zk;gqd7J-HxD^Rcb9lK4-Q(SCEalqLdOBzFNaV%|&&r^WTn5rbz?p}A2Y>7HC%XcD2 z)V0PF=V z%O7r8tn@|P)AyPxbaL+i`7u+vDaUIS*jw_mm$yyL)D|zHATFR_ b ?? a :: b end -def sin(deg)#1 - while deg > 360; deg = deg - 360; loop - while deg < 0; deg = deg + 360; loop - if deg <= 90 - return sin90[deg] - elsif deg <= 180 - return sin90[180 - deg] - elsif deg <= 270 - return -sin90[deg - 180] - fin - return -sin90[360 - deg] -end - -def cos(deg)#1 - return sin(deg + 90) -end - def dist(dr, dg, db)#2 // Linear distance res[t_i32] rr, gg @@ -180,16 +151,12 @@ def calcChroma(angle)#0 for i = 0 to 3 // Calculate RGB for this DHGR pixel - //r = max(0, (saturation + (cos(angle - phase[RED]) >> 7))) - //g = max(0, (saturation + (cos(angle - phase[GRN]) >> 7))) - //b = max(0, (saturation + (cos(angle - phase[BLU]) >> 7))) - r = saturation + (cos(angle - phase[RED]) >> 7) - g = saturation + (cos(angle - phase[GRN]) >> 7) - b = saturation + (cos(angle - phase[BLU]) >> 7) - // Make chroma add up to white - ntscChroma[i*3 + RED] = (r + 2) / 4 - ntscChroma[i*3 + GRN] = (g + 2) / 4 - ntscChroma[i*3 + BLU] = (b + 2) / 4 + r = saturation + mulcos(255, angle - phase[RED]) + g = saturation + mulcos(255, angle - phase[GRN]) + b = saturation + mulcos(255, angle - phase[BLU]) + ntscChroma[i*3 + RED] = min(255, max(0, (r + 2) / 4)) + ntscChroma[i*3 + GRN] = min(255, max(0, (g + 2) / 4)) + ntscChroma[i*3 + BLU] = min(255, max(0, (b + 2) / 4)) // Next NTSC chroma pixel angle = angle - 90 next @@ -484,7 +451,7 @@ def rgbImportExport(rgbfile, dhgrfile)#0 fin end -puts("DHGR RGB converter 1.1\n") +puts("DHGR RGB converter 1.2\n") arg = argNext(argFirst) if ^arg while ^(arg + 1) == '-' diff --git a/src/scripts/hgrlib.4th b/src/scripts/hgrlib.4th index 7b5a2db..499f0c3 100644 --- a/src/scripts/hgrlib.4th +++ b/src/scripts/hgrlib.4th @@ -24,6 +24,9 @@ LOOKUP HGRDRAWBUF PLASMA HGRDRAWBUF LOOKUP HGRCOLOR PLASMA HGRCOLOR LOOKUP SETLINESPANS PLASMA SETLINESPANS LOOKUP LINESPANS PLASMA HGRLINE -LOOKUP HGRHLIN LOOKUP HGRVLIN SETLINESPANS +: SETLINE [ LOOKUP HGRHLIN ] LITERAL [ LOOKUP HGRVLIN ] LITERAL SETLINESPANS ; +: SETXORLINE [ LOOKUP HGRXORHLIN ] LITERAL [ LOOKUP HGRXORVLIN ] LITERAL SETLINESPANS ; +: SETORLINE [ LOOKUP HGRORHLIN ] LITERAL [ LOOKUP HGRORVLIN ] LITERAL SETLINESPANS ; +SETLINE ' TEXT 0= ?ENDSRC : TEXT -1 HGRMODE DROP TEXT ;