From f7f24dfbe5123119f199f081e65a9ad3de1a51f6 Mon Sep 17 00:00:00 2001 From: Flare Microsystems Date: Sun, 3 Mar 2024 00:02:00 -0800 Subject: [PATCH] Initial commit --- .classpath | 7 + .gitignore | 26 ++ .gitlab-ci.yml | 13 + .project | 17 ++ .settings/org.eclipse.jdt.core.prefs | 11 + resources/Star 4 Radar.ttf | Bin 0 -> 16308 bytes resources/Star4000 Extended.ttf | Bin 0 -> 19388 bytes .../Star4000 Large Compressed Numbers.ttf | Bin 0 -> 11924 bytes resources/Star4000 Large Compressed.ttf | Bin 0 -> 19520 bytes resources/Star4000 Large.ttf | Bin 0 -> 20692 bytes resources/Star4000 Small.ttf | Bin 0 -> 18948 bytes resources/Star4000.ttf | Bin 0 -> 19564 bytes .../flaretv/visualforecast/RenderPanel.java | 250 ++++++++++++++++++ .../flaretv/visualforecast/SmallTextInfo.java | 44 +++ .../flaretv/visualforecast/TickThread.java | 43 +++ .../visualforecast/VisualForecastFrame.java | 45 ++++ .../visualforecast/icons/CloudIcon.java | 89 +++++++ .../flaretv/visualforecast/icons/Icon.java | 7 + .../visualforecast/icons/IconProvider.java | 42 +++ .../icons/PartlyCloudyIcon.java | 28 ++ .../visualforecast/icons/RainIcon.java | 76 ++++++ .../visualforecast/icons/SnowflakeIcon.java | 106 ++++++++ .../flaretv/visualforecast/icons/SunIcon.java | 75 ++++++ .../visualforecast/interfaces/Tickable.java | 5 + 24 files changed, 884 insertions(+) create mode 100644 .classpath create mode 100644 .gitignore create mode 100644 .gitlab-ci.yml create mode 100644 .project create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 resources/Star 4 Radar.ttf create mode 100644 resources/Star4000 Extended.ttf create mode 100644 resources/Star4000 Large Compressed Numbers.ttf create mode 100644 resources/Star4000 Large Compressed.ttf create mode 100644 resources/Star4000 Large.ttf create mode 100644 resources/Star4000 Small.ttf create mode 100644 resources/Star4000.ttf create mode 100644 src/com/flaremicro/flaretv/visualforecast/RenderPanel.java create mode 100644 src/com/flaremicro/flaretv/visualforecast/SmallTextInfo.java create mode 100644 src/com/flaremicro/flaretv/visualforecast/TickThread.java create mode 100644 src/com/flaremicro/flaretv/visualforecast/VisualForecastFrame.java create mode 100644 src/com/flaremicro/flaretv/visualforecast/icons/CloudIcon.java create mode 100644 src/com/flaremicro/flaretv/visualforecast/icons/Icon.java create mode 100644 src/com/flaremicro/flaretv/visualforecast/icons/IconProvider.java create mode 100644 src/com/flaremicro/flaretv/visualforecast/icons/PartlyCloudyIcon.java create mode 100644 src/com/flaremicro/flaretv/visualforecast/icons/RainIcon.java create mode 100644 src/com/flaremicro/flaretv/visualforecast/icons/SnowflakeIcon.java create mode 100644 src/com/flaremicro/flaretv/visualforecast/icons/SunIcon.java create mode 100644 src/com/flaremicro/flaretv/visualforecast/interfaces/Tickable.java diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..5c59d7a --- /dev/null +++ b/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2be9ec5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +#Compiled binary directory +bin/ + +# Package Files # +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +*.dat diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..fef13ef --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,13 @@ +# You can override the included template(s) by including variable overrides +# SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings +# Secret Detection customization: https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings +# Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings +# Container Scanning customization: https://docs.gitlab.com/ee/user/application_security/container_scanning/#customizing-the-container-scanning-settings +# Note that environment variables can be set in several places +# See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence +stages: +- test +sast: + stage: test +include: +- template: Security/SAST.gitlab-ci.yml diff --git a/.project b/.project new file mode 100644 index 0000000..91fb489 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + VisualForecast 1000 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..3a21537 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/resources/Star 4 Radar.ttf b/resources/Star 4 Radar.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3b52590d71f9ec1faa94f29f4cf5dbeb36c4e703 GIT binary patch literal 16308 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ⅅ>yWXkY4O&sOUkK^f zC|#we%mAl2w2)c`<(wtt3sD}2Bbwl!T!^71d18-|q+!?BgLy0uJNpIL-7TVFG#n=l z#n^QmNuzLrK86m!p6^)9b_Zh@X&iRp#$&fZr&21z8O>qXlbeXMp-FJ7BXMFg8OE4` zT^s}5=%-3JM>V>$mg=aUj-g{|8cqeKW3ROVLeHc|nnkl=^0_eOd^&+ngdtCYa*L>m zPDW=gfpaf|;Mw{w{Fow=*n5PqFh{4&v5r#86yA*V1)# zJ>38sevfWKl)){m(XEKexQ%Yde$gF>y0{DR8TZf+F=yY4L3bbh1Q8eysMrR?ET}jI z8ME*hJ&rS+C+R7An%%U8o>fs2&(ZUUVt5fz8!sbv;}t|~n2{Q0HWX zT+WBFk0 zBBE**&*nKim*??(K7mi<1$+`O~2i|CZn3clka3 z9ry7L-pRYTpLg^7`~iQ+zvn;jNBl?rm_Ok^@u&P}{tJJ`8U8DO&R_7C{1yL=|Bik5 zZ}?l@!+Uvvvxv$g!9oa^(1aUtD_)T&@iiyBcY z>O{RbMjR`qiQ~j{alB{{GsH~MC}xS-Vvd+A=85@;ojFk~5GRR+Vv%SPCyT{miC8L@ ziREI2I7OT)R*KWa>Eb)$3~{Cih@fZ|EuvL~M4MA#6?0R zMM|s@YelzMC(ah{LAFO+~|V45PwI{W3NDjrA%u zX4Y33T53LD#f-3ROh_%O}q1E1?nHDy- zgySu#&bCOXyRc;tE@*TJ7PL5^XI4uPq&=->G7EfyN$+fnVaQ@Q+hiD0Nx^KVbwS7h zy|XPbLT2ijZBh)Wq;T$_AcgINaKT)MKta0$7R|-NrZZ@2U(}wHDV#Uhwyqd`srAnTq)*i14by69(xPt{Q}kPRtRc zX!U*>baf~i2}WDPEuICzmQ*t2iKwJ#K`ve-C*xUQ8YrR?Z2`2`B6xWgn(d=z`-M48 zilR9g&qA|()HHB3DF2-%9_#7|xn@V(U7={Zcaf!h%u;@lseDW&!xnXf3j)CV+$@j2jxjGF?<>tK0tgcU)Y2k`N z2@BWez^CTG>jq)ZN>kUfRZ_6h@!f*69nc+#McWevGo&mgTF?Q#GiIwIZ!o0N!bOQl zFwtScu|e3Kj74LKVXfg%Jd_A0RIXq~q^kqJ2~d$AjK-4qNf8bf&F)Hs!B7?F%}!eN z^D&92qM}8eVL6GInPoZ11&caE?Iu!580h=)aw}fi%uq7uo*TrVRP$A3eU;bZr>#Vl z3;f(mI{;~tq5H&OS62`Np|iO)C{9X=g(-1L81ASf5KUp%;*OYmNw~c;=vo>~c`a#N zO&wuZBc7&2*km)KzDUxuB^qHN+WCT@V~Ctr_U< zcB!1ZH55q(y%sI)Y*e^pWm2goiMdxR)gnqYQ^=W(BAOE2VQKz{S4v%_= zN4>+N-r-R@NX6!X5n}mng<;oL7&eaz!{$+8*gPr>n@5FV^QbUv9u`dijsTslsRI;Ne*?~om2`38M!fR}}C;>U5 zRz-d=9*?b!gxZo`1*N(QR2r8w%*xi-+NcRN$C4c;lK`fr^ke}*c zq$nJPu23$Ct+&F^S*h@vU?dc63AsCBsYGZP%n*^gW5Ec%jRg`Jwu>aY9I!c=w`2~y z0ha_61i)~BN~;QnHgSw98>q8^dK;**fm$1=wty;|j^A!xZL_GhDOcKb{C0`o#_`*9 zR4PTSvXLuoG5ii-bNAcwR62lNRb{iNu<57*N!f3UTIC?yl&frcs%&|xY|2V4*}U3O z(4nJB@YQR^e}%91q7P;2Hgl0SGmR&$d=e|4){tAhy{)TNn%@?VMBv=9ZqGazr?%2F zucEHH%1o*&3e4&_+`yZRhlA~@E;Ef=`PQhJkFS@F8p-4!RFL$B~5^F7yRI?lZ77wPa;b13*TVW^m dZcX0{4bOqC@rR#)RdW0xt;Y5m{@04c{{SqEy!QYA literal 0 HcmV?d00001 diff --git a/resources/Star4000 Extended.ttf b/resources/Star4000 Extended.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0f8c962b1d412dbb5765e22df719a08711db8c61 GIT binary patch literal 19388 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 Y23yu29s#4+`okQ5Yew+@F(CB+0NEd(I{*Lx literal 0 HcmV?d00001 diff --git a/resources/Star4000 Large Compressed Numbers.ttf b/resources/Star4000 Large Compressed Numbers.ttf new file mode 100644 index 0000000000000000000000000000000000000000..17459e0612d197a66fa1732e12bf04f1b024540e GIT binary patch literal 11924 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 literal 0 HcmV?d00001 diff --git a/resources/Star4000 Large Compressed.ttf b/resources/Star4000 Large Compressed.ttf new file mode 100644 index 0000000000000000000000000000000000000000..936d7595d7d2ddfc83133e4d38ccb4be7448f6e8 GIT binary patch literal 19520 zcmeHvcUV+M*Z7>d+gK3ky)58@u~BwucEExWJBo^Jg#}iZ1z{1avG-^+nqsd>Y|+Gy z7&RsuHELpv(TFWZV-ihF@+KD8;X8Bh?n2)8`+m>&d%o|F-|u-|_PKY?ojdoGnKNh3 zoO><=2qCUy1`$YHzd^AHN0%;|MF^x|?U1};L+KaOJ3k;qv6m3}Cz}D*R?+EeSNJwN{kO&_+Vs=HPWmv7xF|@f%r(_XDuK#$qTozW39O4TR{vAVgMQT2gNPVOYo? zgrs~>$cbm;hVk;`weo%q511f4aA}8^E@FFr1D{cL zW_?M9aG~Kr!wvS*FMQVCjF63l?&(je>KqlBSsD%LN;Gv;{uLVlI+w1%#t_(W`zde1Ig(0#1{3*} z3?T!El8lEpK?gcAkPHD6w8uM#NHzqKF?hEJ>5IG-kzCRV@0mz3$-!d?=|I|$Y?6w{ zBr=Nh!rG7UNG1zNCt@LqWHgDu=Lca+1L=)*Lr6a|0K&;3JZ5p3NKcZ7So09~C_F03 z3TRDM;I9K-6=8iI!ZXPR;a7{#HR10l%Ov{&AwQke4U2I%@f=-{9l$?^eIJh{{aIBWe*;bGj!PS+z}&3jUHnlWApNj1%*YXapTR!mXgv5 zW#!h2iIr88CQq3SG{Ra*nI((%1Xw9*Yj-NRB@u^QfJ$>f0v**r# ze&OP!FUXgdzq<1E)o-p{|Mo`h&0DvLOm-NBy^3qO0xj`$@PtqZhggV*u8e8edJACQ=iviPPvb?KK@W zoi*JwuV}Vv-qq}ikVkk&_(eoUL`SrX7!|Q9;=M>3sfcVI=@sc4859{F`BG%-$jnGX zq%n#{c|=8MiI!^Jv>sX?ZGbjJ+d|t$tJikanzb{ubF>SzOSG?RH)(fiKh#!hYqXze z&ucGfuWKJfcZ}{DogO_VIxo5)di)dmL|#YH_aH<=Hi8#~fd=9r0n#7?20}KBg0WDA za=oCZQLbw!*Bq2PPsf$ zuE5AJyIf-;^F_Hd|Ak!ropQaV-KgE+l0-qJbW6ggs|p>)NiysvHfcM#rD{C)K+afVmoYGaBuZJ?%Uwsow;{b z-TmXvoV!2Y{pn8S-5rG7opZzx(1-ng~-)?z|#y(2#5 zeQUz4(RdYiyW{QH+nSr{H`8vW+)TWga5MI1o15C3VK@D6dequ#f2#eV_WRnqwYO?7 z*Pg5WwDzOgW3>kfsoh<>t@iEO9<>>@>9yM0sM^TdaF36?=F2}4C*&2Jm;3*dgKH{* zkEMgd|M~~};V_*3=X$9A=bEP1un{qCgw0YNtZ#bnzYoK>|6^N$Y$0>VT(mcDkO%1b zEG3K4XWdS=qK~);fXpVZlPBai@+x@~J*|&PE&6cl$qw=d`5pb>&14t(jGQLB$yoHB zUL*PB95IqJU&vOuj;Y>qqi4dRF6ziHt}8 z&Wt|XMp8m1kWx}c%1H&Wl8NY}JtS3RGJ1Sd&@Y>cUg9S53Ym^pVJ7*BJR(Pcf&em* zg94PKj?{w+TtE%3#6}pnK{IeC4dgHKlsqF}lRM-t*+ce{=i~+Xj@%>F=wFV5@n9z3 zllxGN*5)?3PQE2K$Sv{>xk)}CAJRw~MGlaI

c|_L2SM6Z9odlKJFM+KRkQ9%GMe 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,QvH*h02aWnV8 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 LCHQ|25c literal 0 HcmV?d00001 diff --git a/resources/Star4000.ttf b/resources/Star4000.ttf new file mode 100644 index 0000000000000000000000000000000000000000..638855ce2181eed2b318e7d875a223555b643f3f GIT binary patch literal 19564 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 Vrh9si9= 11 && n <= 13) + { + return "th"; + } + switch (n % 10) { + case 1: + return "st"; + case 2: + return "nd"; + case 3: + return "rd"; + default: + return "th"; + } + } + + @Override + public void paintComponent(Graphics g) { + super.paintComponent(g); + Graphics2D g2d = prepareFrameBuffer(); + if (font == null) + font = g2d.getFont(); + g2d.setFont(font.deriveFont(24F)); + + g2d.setStroke(new BasicStroke(2)); + + g2d.setColor(this.backgroundPurple); + g2d.fillRect(0, 0, W, TOPBAR_HEIGHT); + + g2d.setPaint(new GradientPaint(0, HEADERBAR_Y, backgroundOrange, 0, HEADERBAR_Y + (HEADERBAR_HEIGHT + 10), backgroundPurple)); + g2d.shear(HEADERBAR_SHEAR, 0); + g2d.fillRect(-HEADERBAR_OFFSET, HEADERBAR_Y, HEADERBAR_WIDTH, HEADERBAR_HEIGHT); + + g2d.setPaint(new GradientPaint(0, HEADERBAR_Y, backgroundPurple.brighter().brighter().brighter(), 0, HEADERBAR_Y + (HEADERBAR_HEIGHT + 10), backgroundPurple)); + g2d.fillRect(W - TIMEBAR_WIDTH + TIMEBAR_OFFSET, TIMEBAR_Y, TIMEBAR_WIDTH, TIMEBAR_HEIGHT); + g2d.shear(-HEADERBAR_SHEAR, 0); + + g2d.setPaint(new GradientPaint(0, TOPBAR_HEIGHT, backgroundPurple, 0, MAINBAR_HEIGHT, backgroundOrange)); + g2d.fillRect(0, TOPBAR_HEIGHT, W, MAINBAR_HEIGHT); + + g2d.fillRect(0, TOPBAR_HEIGHT, W, MAINBAR_HEIGHT); + + g2d.setColor(this.backgroundBlue); + g2d.fillRect(0, H - INFOBAR_HEIGHT, W, INFOBAR_HEIGHT); + + g2d.setColor(Color.DARK_GRAY); + g2d.drawLine(0, H - INFOBAR_HEIGHT + STROKE_OFFSET, W, H - INFOBAR_HEIGHT + STROKE_OFFSET); + + g2d.setColor(Color.WHITE); + g2d.drawLine(0, H - INFOBAR_HEIGHT + STROKE_WIDTH + STROKE_OFFSET, W, H - INFOBAR_HEIGHT + STROKE_WIDTH + STROKE_OFFSET); + + drawGradientRect(g2d, 60, TOPBAR_HEIGHT, W - 120, MAINBAR_HEIGHT, 20, backgroundBlue.brighter(), backgroundBlue.darker()); + g2d.setColor(backgroundBlue.brighter()); + g2d.drawRect(60 + STROKE_OFFSET, TOPBAR_HEIGHT + STROKE_OFFSET, W - 120 - STROKE_WIDTH, MAINBAR_HEIGHT - STROKE_WIDTH); + // g2d.setColor(Color.GRAY); + // g2d.drawRect(60, TOPBAR_HEIGHT+2, W-120, MAINBAR_HEIGHT-4); + + String dateString = DATE_FORMAT.format(System.currentTimeMillis()) + getDayOfMonthSuffix(); + String timeString = TIME_FORMAT.format(System.currentTimeMillis()); + + // g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + // RenderingHints.VALUE_ANTIALIAS_ON); + drawOutlinedString(g2d, 60, HEADERBAR_Y + 18, "Your local forecast", Color.WHITE, Color.BLACK, 1); + int sw = g2d.getFontMetrics().stringWidth(dateString); + drawOutlinedString(g2d, W - sw - 60, TIMEBAR_Y + 18, dateString, Color.WHITE, Color.BLACK, 1); + sw = g2d.getFontMetrics().stringWidth(timeString); + drawOutlinedString(g2d, W - sw - 60, TIMEBAR_Y + 36, timeString, Color.WHITE, Color.BLACK, 1); + g2d.setFont(font.deriveFont(36F)); + drawOutlinedString(g2d, 60, HEADERBAR_Y + 52, "New Westminster, BC", Color.YELLOW, Color.BLACK, 2); + + int w2 = g2d.getFontMetrics().stringWidth("EXTREME WEATHER ADVISORY"); + drawOutlinedString(g2d, (W >> 1) - (w2 >> 1), TOPBAR_HEIGHT + 48, "EXTREME WEATHER ADVISORY", Color.RED, Color.BLACK, 2); + + g2d.setFont(font.deriveFont(30F)); + for (int i = 0; i < testString.length; i++) + { + drawOutlinedString(g2d, 90, TOPBAR_HEIGHT + 78 + 25 * i, testString[i], Color.WHITE, Color.BLACK, 1); + } + + // g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + // RenderingHints.VALUE_ANTIALIAS_ON); + IconProvider.drawIcon(g2d, IconProvider.SNOWFLAKE, 80, 300, 80, animationTick); + IconProvider.drawIcon(g2d, IconProvider.CLOUD, 160, 300, 80, animationTick); + IconProvider.drawIcon(g2d, IconProvider.PARTLY_CLOUDY, 160 + 80, 300, 80, animationTick); + IconProvider.drawIcon(g2d, IconProvider.CLOUDY_CLOUDY, 160 + 160, 300, 80, animationTick); + IconProvider.drawIcon(g2d, IconProvider.RAIN, 160 + 160 + 80, 300, 80, animationTick); + IconProvider.drawIcon(g2d, IconProvider.SCATTERD_SHOWERS, 160 + 160 + 160, 300, 80, animationTick); + + g2d.dispose(); + g.drawImage(frameBuffer, 0, 0, getWidth(), getHeight(), this); + } + + public void drawGradientRect(Graphics2D g, int x, int y, int w, int h, int borderWidth, Color innerColor, Color outerColor) { + + g.setColor(innerColor); + g.fillRect(x, y, w, h); + + g.setPaint(new GradientPaint(x, 0, outerColor, x + borderWidth, 0, innerColor)); + g.fillRect(x, y, borderWidth, h); + + g.setPaint(new GradientPaint(x + w - borderWidth, 0, innerColor, x + w, 0, outerColor)); + g.fillRect(x + w - borderWidth, y, borderWidth, h); + + g.setPaint(new GradientPaint(0, y, outerColor, 0, y + borderWidth, innerColor)); + g.setClip(new Polygon(new int[] { x, x + w, x + w - borderWidth, x + borderWidth }, new int[] { y, y, y + borderWidth, y + borderWidth }, 4)); + g.fillRect(x, y, w, borderWidth); + + g.setClip(new Polygon(new int[] { x, x + w, x + w - borderWidth, x + borderWidth }, new int[] { y + h, y + h, y + h - borderWidth, y + h - borderWidth }, 4)); + g.setPaint(new GradientPaint(0, y + h - borderWidth, innerColor, 0, y + h, outerColor)); + g.fillRect(x, y + h - borderWidth, w, borderWidth); + + g.setClip(null); + + } + + public void drawOutlinedString(Graphics2D g2d, int x, int y, String text, Color textColor, Color outline, int outlineSize) { + g2d.setColor(outline); + for (int i = 1; i <= outlineSize; i++) + { + g2d.drawString(text, x + i, y); + g2d.drawString(text, x - i, y); + g2d.drawString(text, x, y + i); + g2d.drawString(text, x, y - i); + g2d.drawString(text, x + i, y + i); + g2d.drawString(text, x - i, y - i); + g2d.drawString(text, x - i, y + i); + g2d.drawString(text, x + i, y - i); + } + + g2d.setColor(textColor); + g2d.drawString(text, x, y); + /* + * AffineTransform transform = g2d.getTransform(); + * transform.translate(x, y); g2d.transform(transform); + * g2d.setColor(outline); FontRenderContext frc = + * g2d.getFontRenderContext(); TextLayout tl = new TextLayout(text, + * g2d.getFont(), frc); Shape shape = tl.getOutline(null); + * g2d.setStroke(new BasicStroke(outlineSize)); g2d.draw(shape); + * g2d.setColor(textColor); g2d.fill(shape); + */ + } + + @Override + public void run() { + while (true) + { + this.animationTick++; + repaint(); + LockSupport.parkNanos(125000000); + } + } + +} diff --git a/src/com/flaremicro/flaretv/visualforecast/SmallTextInfo.java b/src/com/flaremicro/flaretv/visualforecast/SmallTextInfo.java new file mode 100644 index 0000000..56eb452 --- /dev/null +++ b/src/com/flaremicro/flaretv/visualforecast/SmallTextInfo.java @@ -0,0 +1,44 @@ +package com.flaremicro.flaretv.visualforecast; + +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.border.EmptyBorder; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.JSpinner; +import javax.swing.SpinnerNumberModel; + +public class SmallTextInfo extends JFrame { + + /** + * + */ + private static final long serialVersionUID = 1L; + private JPanel contentPane; + + /** + * Create the frame. + */ + public SmallTextInfo(RenderPanel rp) { + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setBounds(100, 100, 295, 93); + contentPane = new JPanel(); + contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); + setContentPane(contentPane); + contentPane.setLayout(null); + + JSpinner spinner = new JSpinner(); + spinner.setModel(new SpinnerNumberModel(new Float(rp.fontMult), null, null, new Float(0.5F))); + spinner.setBounds(12, 12, 255, 22); + spinner.addChangeListener(new ChangeListener(){ + + @Override + public void stateChanged(ChangeEvent e) { + rp.fontMult = (Float)spinner.getValue(); + rp.repaint(); + } + + }); + contentPane.add(spinner); + } +} diff --git a/src/com/flaremicro/flaretv/visualforecast/TickThread.java b/src/com/flaremicro/flaretv/visualforecast/TickThread.java new file mode 100644 index 0000000..b9037db --- /dev/null +++ b/src/com/flaremicro/flaretv/visualforecast/TickThread.java @@ -0,0 +1,43 @@ +package com.flaremicro.flaretv.visualforecast; + +import com.flaremicro.flaretv.visualforecast.interfaces.Tickable; + +public class TickThread implements Runnable { + private final Tickable tickable; + private boolean running = true; + private final long sleepNanos; + + private long nextTick = 0; + + TickThread(Tickable tickable, long sleepNanos) { + this.tickable = tickable; + this.sleepNanos = sleepNanos; + } + + public void end() { + this.running = false; + } + + public void run() { + while (running) { + while(System.nanoTime() < nextTick) + { + try + { + Thread.sleep(1); + } + catch (InterruptedException e) + { + e.printStackTrace(); + } + } + nextTick = System.nanoTime() + sleepNanos; + tickable.tick(); + /*long nanosLost = System.nanoTime(); + panel.tick(); + nanosLost -= System.nanoTime(); + if(sleepNanos+nanosLost > 0) + LockSupport.parkNanos(sleepNanos+nanosLost);*/ + } + } +} \ No newline at end of file diff --git a/src/com/flaremicro/flaretv/visualforecast/VisualForecastFrame.java b/src/com/flaremicro/flaretv/visualforecast/VisualForecastFrame.java new file mode 100644 index 0000000..4428ca9 --- /dev/null +++ b/src/com/flaremicro/flaretv/visualforecast/VisualForecastFrame.java @@ -0,0 +1,45 @@ +package com.flaremicro.flaretv.visualforecast; + +import java.awt.BorderLayout; +import java.awt.EventQueue; + +import javax.swing.JFrame; + +public class VisualForecastFrame extends JFrame { + + /** + * + */ + private static final long serialVersionUID = 1L; + private RenderPanel contentPane; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + VisualForecastFrame frame = new VisualForecastFrame(); + frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the frame. + */ + public VisualForecastFrame() { + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setBounds(100, 100, 640*2, 480*2); + contentPane = new RenderPanel(); + contentPane.setBorder(null); + contentPane.setLayout(new BorderLayout(0, 0)); + setContentPane(contentPane); + setUndecorated(true); + } + +} diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/CloudIcon.java b/src/com/flaremicro/flaretv/visualforecast/icons/CloudIcon.java new file mode 100644 index 0000000..b47569c --- /dev/null +++ b/src/com/flaremicro/flaretv/visualforecast/icons/CloudIcon.java @@ -0,0 +1,89 @@ +package com.flaremicro.flaretv.visualforecast.icons; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.geom.Ellipse2D; + +public class CloudIcon implements Icon { + Ellipse2D.Float[] cloudCircles = new Ellipse2D.Float[]{ + new Ellipse2D.Float(0, 0.5F, 0.28F, 0.325F), + new Ellipse2D.Float(0.142F, 0.619F, 0.287F, 0.231F), + new Ellipse2D.Float(0.666F, 0.597F, 0.208F, 0.234F), + new Ellipse2D.Float(0.435F, 0.585F, 0.226F, 0.253F), + new Ellipse2D.Float(0.749F, 0.412F, 0.251F, 0.417F), + new Ellipse2D.Float(0.478F, 0.235F, 0.348F, 0.602F), + new Ellipse2D.Float(0.233F, 0.150F, 0.369F, 0.677F), + new Ellipse2D.Float(0.113F, 0.326F, 0.266F, 0.356F), + }; + + + Ellipse2D.Float[] extraStroke = new Ellipse2D.Float[]{ + new Ellipse2D.Float(0.142F, 0.619F, 0.287F, 0.231F), + new Ellipse2D.Float(0.666F, 0.597F, 0.208F, 0.234F) + }; + + + + Ellipse2D.Float[] overStroke = new Ellipse2D.Float[]{ + new Ellipse2D.Float(0.233F, 0.150F, 0.369F, 0.677F), + new Ellipse2D.Float(0.113F, 0.326F, 0.266F, 0.356F), + new Ellipse2D.Float(0.749F, 0.412F, 0.251F, 0.417F), + new Ellipse2D.Float(0.652F, 0.555F, 0.150F, 0.136F), + }; + + Ellipse2D.Float[] lightCircles = new Ellipse2D.Float[]{ + new Ellipse2D.Float(0.309F, 0.173F, 0.209F, 0.235F), + new Ellipse2D.Float(0.554F, 0.276F, 0.204F, 0.314F), + new Ellipse2D.Float(0.770F, 0.440F, 0.204F, 0.235F), + new Ellipse2D.Float(0.141F, 0.348F, 0.260F, 0.235F), + new Ellipse2D.Float(0.259F, 0.460F, 0.314F, 0.235F), + }; + + Ellipse2D.Float[] overLight = new Ellipse2D.Float[]{ + new Ellipse2D.Float(0.328F, 0.188F, 0.209F, 0.235F), + new Ellipse2D.Float(0.573F, 0.296F, 0.204F, 0.314F), + new Ellipse2D.Float(0.789F, 0.456F, 0.204F, 0.235F), + new Ellipse2D.Float(0.155F, 0.369F, 0.260F, 0.235F), + new Ellipse2D.Float(0.288F, 0.476F, 0.314F, 0.235F), + }; + + + @Override + public void drawIcon(Graphics2D g2d, float scale, int animationStep) { + g2d.setColor(Color.BLACK); + g2d.setStroke(new BasicStroke(4/scale)); + for(int i = 0; i < cloudCircles.length; i++) + { + g2d.draw(cloudCircles[i]); + } + g2d.setColor(Color.LIGHT_GRAY); + for(int i = 0; i < cloudCircles.length; i++) + { + g2d.fill(cloudCircles[i]); + } + + g2d.setColor(Color.BLACK); + g2d.setStroke(new BasicStroke(2/scale)); + for(int i = 0; i < extraStroke.length; i++) + { + g2d.draw(extraStroke[i]); + } + + g2d.setColor(Color.LIGHT_GRAY); + for(int i = 0; i < overStroke.length; i++) + { + g2d.fill(overStroke[i]); + } + + for(int i = 0; i < lightCircles.length; i++) + { + g2d.setColor(Color.LIGHT_GRAY.brighter()); + g2d.fill(lightCircles[i]); + g2d.setColor(Color.LIGHT_GRAY); + g2d.fill(overLight[i]); + } + + } + +} diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/Icon.java b/src/com/flaremicro/flaretv/visualforecast/icons/Icon.java new file mode 100644 index 0000000..380354a --- /dev/null +++ b/src/com/flaremicro/flaretv/visualforecast/icons/Icon.java @@ -0,0 +1,7 @@ +package com.flaremicro.flaretv.visualforecast.icons; + +import java.awt.Graphics2D; + +public interface Icon { + public void drawIcon(Graphics2D g2d, float scale, int animationStep); +} diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/IconProvider.java b/src/com/flaremicro/flaretv/visualforecast/icons/IconProvider.java new file mode 100644 index 0000000..e2b1570 --- /dev/null +++ b/src/com/flaremicro/flaretv/visualforecast/icons/IconProvider.java @@ -0,0 +1,42 @@ +package com.flaremicro.flaretv.visualforecast.icons; + +import java.awt.Graphics2D; +import java.awt.geom.AffineTransform; + +public class IconProvider { + + public static int SUN = 0; + public static int CLOUD = 1; + public static int PARTLY_CLOUDY = 2; + public static int CLOUDY_CLOUDY = 3; + public static int RAIN = 4; + public static int SCATTERD_SHOWERS = 5; + public static int SNOWFLAKE = 6; + + + private static final Icon[] CLASS_DEFS = new Icon[64]; + + static{ + CLASS_DEFS[SUN] = new SunIcon(); + CLASS_DEFS[CLOUD] = new CloudIcon(); + CLASS_DEFS[PARTLY_CLOUDY] = new PartlyCloudyIcon(CLASS_DEFS[CLOUD], CLASS_DEFS[SUN]); + CLASS_DEFS[CLOUDY_CLOUDY] = new PartlyCloudyIcon(CLASS_DEFS[CLOUD], CLASS_DEFS[CLOUD]); + CLASS_DEFS[RAIN] = new RainIcon(2, 1F, CLASS_DEFS[CLOUD]); + CLASS_DEFS[SCATTERD_SHOWERS] = new PartlyCloudyIcon(new RainIcon(2, 4F, CLASS_DEFS[CLOUD]), CLASS_DEFS[SUN]); + CLASS_DEFS[SNOWFLAKE] = new SnowflakeIcon(); + } + + public static void drawIcon(Graphics2D g2d, int icon, int x, int y, int scale, int animationStep) + { + if(icon >= 0 && CLASS_DEFS.length > icon) + { + AffineTransform af = g2d.getTransform(); + g2d.translate(x, y); + g2d.scale(scale, scale); + //1g2d.setColor(Color.RED); + //g2d.fill(new Rectangle2D.Float(0, 0, 1F, 1F)); + CLASS_DEFS[icon].drawIcon(g2d, scale, animationStep); + g2d.setTransform(af); + } + } +} diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/PartlyCloudyIcon.java b/src/com/flaremicro/flaretv/visualforecast/icons/PartlyCloudyIcon.java new file mode 100644 index 0000000..0c37cd7 --- /dev/null +++ b/src/com/flaremicro/flaretv/visualforecast/icons/PartlyCloudyIcon.java @@ -0,0 +1,28 @@ +package com.flaremicro.flaretv.visualforecast.icons; + +import java.awt.Graphics2D; + +public class PartlyCloudyIcon implements Icon { + private Icon cloud; + private Icon sun; + + public PartlyCloudyIcon(Icon cloud, Icon sun) + { + this.cloud = cloud; + this.sun = sun; + } + + @Override + public void drawIcon(Graphics2D g2d, float scale, int animationStep) { + g2d.translate(0.2F, 0.07F); + g2d.scale(0.8F, 0.8F); + sun.drawIcon(g2d, scale, animationStep); + g2d.scale(1.25F, 1); + g2d.translate(-0.2F, 0.2F); + cloud.drawIcon(g2d, scale, animationStep); + g2d.translate(0, -0.2F); + g2d.scale(1, 1.25F); + g2d.translate(0, -0.07F); + } + +} diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/RainIcon.java b/src/com/flaremicro/flaretv/visualforecast/icons/RainIcon.java new file mode 100644 index 0000000..5c9c8c5 --- /dev/null +++ b/src/com/flaremicro/flaretv/visualforecast/icons/RainIcon.java @@ -0,0 +1,76 @@ +package com.flaremicro.flaretv.visualforecast.icons; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.geom.Path2D; + +public class RainIcon implements Icon { + private final int rainCount; + private final float rainSpace; + private final Icon cloudIcon; + + Path2D.Float[] rainPath = new Path2D.Float[6]; + Color[] aniColors = new Color[]{ + //new Color(0x0000FF), + new Color(0x0022FF), + //new Color(0x0044FF), + new Color(0x0066FF), + //new Color(0x0088FF), + new Color(0x00DDFF), + //new Color(0x00CCFF), + new Color(0xFFFFFF), + //new Color(0x0088FF), + new Color(0x00DDFF), + //new Color(0x0044FF), + new Color(0x0066FF), + }; + + public RainIcon(int rainCount, float rainSpace, Icon cloudIcon) + { + this.rainCount = rainCount; + this.rainSpace = rainSpace * 0.125F; + this.cloudIcon = cloudIcon; + for(int i = 0; i < rainPath.length; i++) + { + float ph = 0.075F; + float pw = 0.1F; + float poff = 0.037F; + float xoff = poff*i; + float yoff = ph*i; + rainPath[i] = new Path2D.Float(); + rainPath[i].moveTo(0F+xoff, 1F-yoff); + rainPath[i].lineTo(poff+xoff, 1F-ph-yoff); + rainPath[i].lineTo(pw+poff+xoff, 1F-ph-yoff); + rainPath[i].lineTo(pw+xoff, 1F-yoff); + rainPath[i].closePath(); + } + } + + @Override + public void drawIcon(Graphics2D g2d, float scale, int animationStep) { + g2d.setStroke(new BasicStroke(4/scale)); + for(int j = 0; j < rainCount; j++) + { + g2d.translate(j*rainSpace, 0F); + g2d.setColor(Color.BLACK); + for(int i = 0; i < rainPath.length; i++) + { + g2d.draw(rainPath[i]); + } + for(int i = 0; i < rainPath.length; i++) + { + + g2d.setColor(aniColors[Math.abs(i-j+animationStep) % aniColors.length]); + g2d.fill(rainPath[i]); + } + g2d.translate(-j*rainSpace, 0F); + } + g2d.translate(0F, -0.10F); + g2d.scale(1F, 0.8F); + cloudIcon.drawIcon(g2d, scale, animationStep); + g2d.scale(1F, 1.25F); + g2d.translate(0F, 0.10F); + } + +} diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/SnowflakeIcon.java b/src/com/flaremicro/flaretv/visualforecast/icons/SnowflakeIcon.java new file mode 100644 index 0000000..5276d04 --- /dev/null +++ b/src/com/flaremicro/flaretv/visualforecast/icons/SnowflakeIcon.java @@ -0,0 +1,106 @@ +package com.flaremicro.flaretv.visualforecast.icons; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.geom.Path2D; + +public class SnowflakeIcon implements Icon { + Path2D.Float flakePath = new Path2D.Float(); + Path2D.Float gradPath = new Path2D.Float(); + Path2D.Float trianglePath = new Path2D.Float(); + + public SnowflakeIcon() + { + flakePath.moveTo(0.400, 0); + flakePath.lineTo(0.600, 0); + flakePath.lineTo(0.600, 0.327); + flakePath.lineTo(0.883, 0.163); + flakePath.lineTo(0.983, 0.336); + flakePath.lineTo(0.700, 0.500); + flakePath.lineTo(0.983, 0.664); + flakePath.lineTo(0.883, 0.837); + flakePath.lineTo(0.600,0.673); + flakePath.lineTo(0.600,1.000); + flakePath.lineTo(0.400,1.000); + flakePath.lineTo(0.400,0.673); + flakePath.lineTo(0.117,0.847); + flakePath.lineTo(0.017, 0.664); + flakePath.lineTo(0.300,0.500); + flakePath.lineTo(0.017,0.336); + flakePath.lineTo(0.117,0.163); + flakePath.lineTo(0.400,0.327); + flakePath.closePath(); + + gradPath.moveTo(0.433, 0.422); + gradPath.lineTo(0.143, 0.200); + gradPath.lineTo(0.433, 0.375); + gradPath.lineTo(0.429, 0.009); + gradPath.lineTo(0.480, 0.396); + gradPath.lineTo(0.446, 0.395); + gradPath.closePath(); + + gradPath.moveTo(0.533, 0.398); + gradPath.lineTo(0.579, 0.013); + gradPath.lineTo(0.576, 0.371); + gradPath.lineTo(0.875, 0.194); + gradPath.lineTo(0.565, 0.432); + gradPath.lineTo(0.547, 0.397); + gradPath.closePath(); + + gradPath.moveTo(0.591,0.479); + gradPath.lineTo(0.947,0.326); + gradPath.lineTo(0.638,0.500); + gradPath.lineTo(0.959,0.681); + gradPath.lineTo(0.597,0.531); + gradPath.lineTo(0.610,0.510); + gradPath.closePath(); + + gradPath.moveTo(0.569,0.576); + gradPath.lineTo(0.880,0.808); + gradPath.lineTo(0.574,0.628); + gradPath.lineTo(0.577,0.985); + gradPath.lineTo(0.527,0.597); + gradPath.lineTo(0.558,0.598); + gradPath.closePath(); + + gradPath.moveTo(0.473,0.596); + gradPath.lineTo(0.428,0.981); + gradPath.lineTo(0.431,0.626); + gradPath.lineTo(0.122,0.808); + gradPath.lineTo(0.432,0.570); + gradPath.lineTo(0.446,0.597); + gradPath.closePath(); + + gradPath.moveTo(0.407,0.523); + gradPath.lineTo(0.051,0.676); + gradPath.lineTo(0.358,0.502); + gradPath.lineTo(0.060,0.332); + gradPath.lineTo(0.408,0.481); + gradPath.lineTo(0.394,0.503); + gradPath.closePath(); + + trianglePath.moveTo(0.503, 0.421); + trianglePath.lineTo(0.578, 0.551); + trianglePath.lineTo(0.428, 0.551); + trianglePath.closePath();; + } + + @Override + public void drawIcon(Graphics2D g2d, float scale, int animationStep) { + g2d.setStroke(new BasicStroke(4/scale)); + g2d.setColor(Color.BLACK); + g2d.draw(flakePath); + g2d.setColor(Color.WHITE); + g2d.fill(flakePath); + //g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setPaint(new Color(0x2288FF)); + g2d.fill(gradPath); + g2d.setStroke(new BasicStroke(1/scale)); + g2d.draw(gradPath); + //g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + g2d.setPaint(Color.BLACK); + g2d.fill(trianglePath); + } + +} diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/SunIcon.java b/src/com/flaremicro/flaretv/visualforecast/icons/SunIcon.java new file mode 100644 index 0000000..f603a18 --- /dev/null +++ b/src/com/flaremicro/flaretv/visualforecast/icons/SunIcon.java @@ -0,0 +1,75 @@ +package com.flaremicro.flaretv.visualforecast.icons; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Path2D; + +public class SunIcon implements Icon { + Path2D.Float sunPath = new Path2D.Float(); + Ellipse2D.Float sunCircle1 = new Ellipse2D.Float(0.2F, 0.2F, 0.6F, 0.6F); + Ellipse2D.Float sunInternalCircle1 = new Ellipse2D.Float(0.28F, 0.22F, 0.5F, 0.5F); + Ellipse2D.Float sunInternalCircle2 = new Ellipse2D.Float(0.34F, 0.22F, 0.4F, 0.4F); + Color[] animationColours = new Color[]{ + new Color(255, 100, 0), + new Color(255, 120, 0), + new Color(255, 140, 0), + new Color(255, 160, 0), + new Color(255, 180, 0), + new Color(255, 200, 0), + new Color(255, 220, 0), + new Color(255, 200, 0), + new Color(255, 180, 0), + new Color(255, 160, 0), + new Color(255, 140, 0), + new Color(255, 120, 0), + }; + public SunIcon() + { + sunPath.moveTo(0.5F, 0.0F); + sunPath.lineTo(0.605F, 0.106F); + sunPath.lineTo(0.750F, 0.067F); + sunPath.lineTo(0.789F, 0.211F); + sunPath.lineTo(0.933F, 0.250F); + sunPath.lineTo(0.894F, 0.394F); + sunPath.lineTo(1.0F, 0.5F); + sunPath.lineTo(0.894F, 0.606F); + sunPath.lineTo(0.933F, 0.750F); + sunPath.lineTo(0.789F, 0.789F); + sunPath.lineTo(0.750F, 0.933F); + sunPath.lineTo(0.605F, 0.894F); + sunPath.lineTo(0.5F, 1.0F); + sunPath.lineTo(0.394F, 0.894F); + sunPath.lineTo(0.250F, 0.933F); + sunPath.lineTo(0.211F, 0.789F); + sunPath.lineTo(0.067F, 0.750F); + sunPath.lineTo(0.106F, 0.606F); + sunPath.lineTo(0.0F, 0.5F); + sunPath.lineTo(0.106F, 0.394F); + sunPath.lineTo(0.067F, 0.250F); + sunPath.lineTo(0.211F, 0.211F); + sunPath.lineTo(0.250F, 0.067F); + sunPath.lineTo(0.394F, 0.106F); + sunPath.closePath(); + } + + @Override + public void drawIcon(Graphics2D g2d, float scale, int animationStep) { + g2d.setColor(Color.BLACK); + g2d.setStroke(new BasicStroke(4/scale)); + g2d.draw(sunPath); + g2d.setColor(animationColours[animationStep % animationColours.length]); + g2d.fill(sunPath); + g2d.setColor(new Color(0xFFEE00)); + g2d.fill(sunCircle1); + g2d.setColor(new Color(0xFFFF88)); + g2d.fill(sunInternalCircle1); + g2d.setColor(new Color(0xFFFFDD)); + g2d.fill(sunInternalCircle2); + g2d.setColor(Color.BLACK); + g2d.setStroke(new BasicStroke(2/scale)); + g2d.draw(sunCircle1); + } + +} diff --git a/src/com/flaremicro/flaretv/visualforecast/interfaces/Tickable.java b/src/com/flaremicro/flaretv/visualforecast/interfaces/Tickable.java new file mode 100644 index 0000000..27ce33a --- /dev/null +++ b/src/com/flaremicro/flaretv/visualforecast/interfaces/Tickable.java @@ -0,0 +1,5 @@ +package com.flaremicro.flaretv.visualforecast.interfaces; + +public interface Tickable { + public void tick(); +}