From 095c6a0094536244e1131a1dcf9fcf6f15fd8922 Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Mon, 2 Apr 2018 00:47:33 +0200 Subject: [PATCH] fixed cpu engine --- .gitignore | 1 + pom.xml | 5 +++ .../org/warp/picalculator/KeyboardTest.java | 4 +- src/main/java/org/warp/picalculator/Main.java | 8 ++-- .../picalculator/gui/graphicengine/Skin.java | 4 ++ .../gui/graphicengine/cpu/CPUFont.java | 10 +++++ .../gui/graphicengine/cpu/CPURenderer.java | 37 +++++++++++-------- .../gui/graphicengine/cpu/CPUSkin.java | 10 +++++ .../gui/graphicengine/gpu/GPUFont.java | 10 +++++ .../gui/graphicengine/gpu/GPUSkin.java | 10 +++++ 10 files changed, 80 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 799bec4e..5a49e12b 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ font_gputest12.rft font_gputest2.rft font_gputest3.png font_gputest4.png +font_gputest4.xcf manager2/ VBO_Example.java diff --git a/pom.xml b/pom.xml index 29573558..5a9e6880 100755 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,11 @@ zip4j 1.3.2 + + com.google.code.gson + gson + 2.8.2 + 1.8 diff --git a/src/main/java/org/warp/picalculator/KeyboardTest.java b/src/main/java/org/warp/picalculator/KeyboardTest.java index 17bfa0a6..12a89256 100755 --- a/src/main/java/org/warp/picalculator/KeyboardTest.java +++ b/src/main/java/org/warp/picalculator/KeyboardTest.java @@ -1,10 +1,12 @@ package org.warp.picalculator; +import org.warp.picalculator.device.PIHardwareDisplay; +import org.warp.picalculator.gui.CalculatorHUD; import org.warp.picalculator.gui.screens.KeyboardDebugScreen; public class KeyboardTest { public static void main(String[] args) throws InterruptedException, Error { - new Main(new KeyboardDebugScreen(), args); + new Main(new KeyboardDebugScreen(), new PIHardwareDisplay(), new CalculatorHUD(), args); } } diff --git a/src/main/java/org/warp/picalculator/Main.java b/src/main/java/org/warp/picalculator/Main.java index 75b6939f..01c231af 100755 --- a/src/main/java/org/warp/picalculator/Main.java +++ b/src/main/java/org/warp/picalculator/Main.java @@ -11,6 +11,8 @@ import org.warp.picalculator.device.Keyboard; import org.warp.picalculator.device.PIHardwareDisplay; import org.warp.picalculator.gui.CalculatorHUD; import org.warp.picalculator.gui.DisplayManager; +import org.warp.picalculator.gui.HUD; +import org.warp.picalculator.gui.HardwareDisplay; import org.warp.picalculator.gui.screens.LoadingScreen; import org.warp.picalculator.gui.screens.Screen; import org.warp.picalculator.math.rules.RulesManager; @@ -22,10 +24,10 @@ public class Main { public static Main instance; public static String[] args; public Main(String[] args) throws InterruptedException, Error { - this(new LoadingScreen(), args); + this(new LoadingScreen(), new PIHardwareDisplay(), new CalculatorHUD(), args); } - public Main(Screen screen, String[] args) throws InterruptedException, Error { + public Main(Screen screen, HardwareDisplay disp, HUD hud, String[] args) throws InterruptedException, Error { System.out.println("WarpPI Calculator"); instance = this; Main.args = args; @@ -33,7 +35,7 @@ public class Main { Thread.currentThread().setPriority(Thread.MAX_PRIORITY); Thread.currentThread().setName("Main thread"); beforeStart(); - new DisplayManager(new PIHardwareDisplay(), new CalculatorHUD(), screen, "WarpPI Calculator by Andrea Cavalli (@Cavallium)"); + new DisplayManager(disp, hud, screen, "WarpPI Calculator by Andrea Cavalli (@Cavallium)"); afterStart(); if (screen instanceof LoadingScreen) { ((LoadingScreen) screen).loaded = true; diff --git a/src/main/java/org/warp/picalculator/gui/graphicengine/Skin.java b/src/main/java/org/warp/picalculator/gui/graphicengine/Skin.java index 04c927bf..afa53f37 100755 --- a/src/main/java/org/warp/picalculator/gui/graphicengine/Skin.java +++ b/src/main/java/org/warp/picalculator/gui/graphicengine/Skin.java @@ -11,4 +11,8 @@ public interface Skin { public boolean isInitialized(); public void use(GraphicEngine d); + + public int getSkinWidth(); + + public int getSkinHeight(); } diff --git a/src/main/java/org/warp/picalculator/gui/graphicengine/cpu/CPUFont.java b/src/main/java/org/warp/picalculator/gui/graphicengine/cpu/CPUFont.java index 971c8f3c..3b8fe502 100755 --- a/src/main/java/org/warp/picalculator/gui/graphicengine/cpu/CPUFont.java +++ b/src/main/java/org/warp/picalculator/gui/graphicengine/cpu/CPUFont.java @@ -307,4 +307,14 @@ public class CPUFont implements BinaryFont { return true; } + @Override + public int getSkinWidth() { + return -1; + } + + @Override + public int getSkinHeight() { + return -1; + } + } diff --git a/src/main/java/org/warp/picalculator/gui/graphicengine/cpu/CPURenderer.java b/src/main/java/org/warp/picalculator/gui/graphicengine/cpu/CPURenderer.java index 26fff142..869f77c2 100644 --- a/src/main/java/org/warp/picalculator/gui/graphicengine/cpu/CPURenderer.java +++ b/src/main/java/org/warp/picalculator/gui/graphicengine/cpu/CPURenderer.java @@ -54,9 +54,11 @@ public class CPURenderer implements Renderer { } } - private void glDrawSkin(int x0, int y0, int s0, int t0, int s1, int t1, boolean transparent) { + private void glDrawSkin(int x0, int y0, int x1, int y1, int s0, int t0, int s1, int t1, boolean transparent) { x0 += StaticVars.screenPos[0]; y0 += StaticVars.screenPos[1]; + double incrementX = Math.abs((double)(x1-x0)/(double)(s1-s0)); + double incrementY = Math.abs((double)(y1-y0)/(double)(t1-t0)); int oldColor; int newColor; final int onex = s0 <= s1 ? 1 : -1; @@ -102,25 +104,30 @@ public class CPURenderer implements Renderer { } y0 = 0; } - int pixelX; - int pixelY; - for (int texx = 0; texx < s1 - s0; texx++) { - for (int texy = 0; texy < t1 - t0; texy++) { - pixelX = (x0 + texx * onex + width); - pixelY = (y0 + texy * oney + height); - if (pixelX - (pixelX % size[0]) == 0) { - final int index = pixelX + pixelY * size[0]; - if (canvas2d.length > index) { - newColor = currentSkin.skinData[(s0 + texx) + (t0 + texy) * currentSkin.skinSize[0]]; + for (double pixelX = 0; pixelX < x1-x0; pixelX++) { + for (double pixelY = 0; pixelY < y1-y0; pixelY++) { + final int index = (int) (x0+pixelX + (y0+pixelY) * size[0]); + if (canvas2d.length > index) { + int texx = (int) (pixelX / incrementX); + int texy = (int) (pixelY / incrementY); + int skinIndex = (int) (s0 + texx + (t0 + texy) * currentSkin.skinSize[0]); + if (skinIndex >= 0 && skinIndex < currentSkin.skinData.length) { + newColor = currentSkin.skinData[skinIndex]; + final int a = (int) ((double)(newColor >> 24 & 0xFF) * ((double)(color >> 24 & 0xFF)/(double)0xFF)); + int r = (int) ((double)(newColor >> 16 & 0xFF) * ((double)(color >> 16 & 0xFF)/(double)0xFF)); + int g = (int) ((double)(newColor >> 8 & 0xFF) * ((double)(color >> 8 & 0xFF)/(double)0xFF)); + int b = (int) ((double)(newColor & 0xFF) * ((double)(color & 0xFF)/(double)0xFF)); + newColor = a << 24 | r << 16 | g << 8 | b; if (transparent) { oldColor = canvas2d[index]; final float a2 = (newColor >> 24 & 0xFF) / 255f; final float a1 = 1f - a2; - final int r = (int) ((oldColor >> 16 & 0xFF) * a1 + (newColor >> 16 & 0xFF) * a2); - final int g = (int) ((oldColor >> 8 & 0xFF) * a1 + (newColor >> 8 & 0xFF) * a2); - final int b = (int) ((oldColor & 0xFF) * a1 + (newColor & 0xFF) * a2); + r = (int) ((oldColor >> 16 & 0xFF) * a1 + (newColor >> 16 & 0xFF) * a2); + g = (int) ((oldColor >> 8 & 0xFF) * a1 + (newColor >> 8 & 0xFF) * a2); + b = (int) ((oldColor & 0xFF) * a1 + (newColor & 0xFF) * a2); newColor = 0xFF000000 | r << 16 | g << 8 | b; } + canvas2d[index] = newColor; } } @@ -169,7 +176,7 @@ public class CPURenderer implements Renderer { public void glFillRect(float x, float y, float width, float height, float uvX, float uvY, float uvWidth, float uvHeight) { if (currentSkin != null) { - glDrawSkin((int) x, (int) y, (int) uvX, (int) uvY, (int) (uvWidth + uvX), (int) (uvHeight + uvY), true); + glDrawSkin((int) x, (int) y, (int) (x + width), (int) (y + height), (int) uvX, (int) uvY, (int) (uvWidth + uvX), (int) (uvHeight + uvY), true); } else { glFillColor(x, y, width, height); } diff --git a/src/main/java/org/warp/picalculator/gui/graphicengine/cpu/CPUSkin.java b/src/main/java/org/warp/picalculator/gui/graphicengine/cpu/CPUSkin.java index c41868fa..184109cb 100755 --- a/src/main/java/org/warp/picalculator/gui/graphicengine/cpu/CPUSkin.java +++ b/src/main/java/org/warp/picalculator/gui/graphicengine/cpu/CPUSkin.java @@ -58,4 +58,14 @@ public class CPUSkin implements Skin { return true; } + @Override + public int getSkinWidth() { + return skinSize[0]; + } + + @Override + public int getSkinHeight() { + return skinSize[1]; + } + } diff --git a/src/main/java/org/warp/picalculator/gui/graphicengine/gpu/GPUFont.java b/src/main/java/org/warp/picalculator/gui/graphicengine/gpu/GPUFont.java index 55aaa5ce..53b35270 100755 --- a/src/main/java/org/warp/picalculator/gui/graphicengine/gpu/GPUFont.java +++ b/src/main/java/org/warp/picalculator/gui/graphicengine/gpu/GPUFont.java @@ -234,4 +234,14 @@ public class GPUFont implements BinaryFont { public boolean isInitialized() { return initialized; } + + @Override + public int getSkinWidth() { + return this.memoryWidth; + } + + @Override + public int getSkinHeight() { + return this.memoryHeight; + } } \ No newline at end of file diff --git a/src/main/java/org/warp/picalculator/gui/graphicengine/gpu/GPUSkin.java b/src/main/java/org/warp/picalculator/gui/graphicengine/gpu/GPUSkin.java index aa062014..12131ab9 100755 --- a/src/main/java/org/warp/picalculator/gui/graphicengine/gpu/GPUSkin.java +++ b/src/main/java/org/warp/picalculator/gui/graphicengine/gpu/GPUSkin.java @@ -67,4 +67,14 @@ public class GPUSkin implements Skin { return initialized; } + @Override + public int getSkinWidth() { + return w; + } + + @Override + public int getSkinHeight() { + return h; + } + }