mirror of
https://github.com/dgis/emu48android
synced 2024-12-27 09:58:46 +01:00
Improve the Overlapping window source position when Background/Offset is not (0,0) and add the pixel border.
This commit is contained in:
parent
6343695d7e
commit
30310af532
6 changed files with 79 additions and 33 deletions
|
@ -68,6 +68,10 @@ Version 1.8beta3 (2020-04-XX)
|
||||||
- Intercept the ESC keyboard key to allow the use of the BACK soft key.
|
- Intercept the ESC keyboard key to allow the use of the BACK soft key.
|
||||||
- Add LCD pixel borders.
|
- Add LCD pixel borders.
|
||||||
- Add support for the dark theme.
|
- Add support for the dark theme.
|
||||||
|
- Fix issues with Linux build (Fix #11).
|
||||||
|
- Remove the non loadable file from the MRU file list (Fix #13).
|
||||||
|
- Hide the menu [Default KML script folder] when the default is already displayed (Fix #5).
|
||||||
|
- Fix: Overlapping window source position when Background/Offset is not (0,0).
|
||||||
|
|
||||||
|
|
||||||
Version 1.7 (2019-12-12)
|
Version 1.7 (2019-12-12)
|
||||||
|
@ -186,6 +190,8 @@ The Eric's Real scripts ("real*.kml" and "real*.bmp/png") are embedded in this a
|
||||||
|
|
||||||
TODO
|
TODO
|
||||||
|
|
||||||
|
- Anyway that the layout settings (zoom mode, fill screen...) be part of the saved state, rather than being global to the app (Vincent Weber).
|
||||||
|
- Overlapping windows not refresh correctly at the very start (new file).
|
||||||
- Add the name of the file in the toast "State saved".
|
- Add the name of the file in the toast "State saved".
|
||||||
- The clock seems unsynchronized sometimes.
|
- The clock seems unsynchronized sometimes.
|
||||||
- Retain a key by right clicking if it is from a mouse.
|
- Retain a key by right clicking if it is from a mouse.
|
||||||
|
|
|
@ -33,7 +33,7 @@ NOTES
|
||||||
But it works exactly like with Windows. If you can write in the ROM file,
|
But it works exactly like with Windows. If you can write in the ROM file,
|
||||||
it should save the content of port 2 in the ROM file with Android too.
|
it should save the content of port 2 in the ROM file with Android too.
|
||||||
To save the port 2 in the HP49/50 with Emu48 for Android:
|
To save the port 2 in the HP49/50 with Emu48 for Android:
|
||||||
* copy "real50g-lc.kml", "real50g-lc.png", "keyb4950.kmi", "rom.49g" in a FOLDER of your Android device,
|
* copy "real50g-lc.kml", "real50g-lc.png", "keyb4950.kmi", "rom.49g" in a FOLDER of your Android device,
|
||||||
* in the menu:
|
* in the menu:
|
||||||
- touch "New..." to create a new device
|
- touch "New..." to create a new device
|
||||||
- or touch "Change KML Script..." to change the current KML script and ROM location
|
- or touch "Change KML Script..." to change the current KML script and ROM location
|
||||||
|
@ -52,11 +52,26 @@ NOT WORKING YET
|
||||||
- Serial Ports (Wire or Ir)
|
- Serial Ports (Wire or Ir)
|
||||||
|
|
||||||
|
|
||||||
|
LINKS
|
||||||
|
|
||||||
|
- Original Emu48 for Windows from Christoph Giesselink and Sébastien Carlier: https://hp.giesselink.com/emu48.htm
|
||||||
|
- Emu48+ for Windows from Eric Rechlin and Cyrille de Brebission: https://www.hpcalc.org/details/6523
|
||||||
|
- Droid48 Reader app: https://play.google.com/store/apps/details?id=com.drehersoft.droid48reader or https://www.hpcalc.org/details/7366
|
||||||
|
- Smart Charlemagne (HP48SX Skins for Android): https://www.hpmuseum.org/forum/thread-14197-post-125336.html or https://www.hpcalc.org/details/9115
|
||||||
|
- The Museum of HP Calculators Forum: https://www.hpmuseum.org/forum/thread-12540.html
|
||||||
|
|
||||||
|
|
||||||
CHANGES
|
CHANGES
|
||||||
|
|
||||||
Version 1.8beta2 (2019-12-19)
|
Version 1.8beta3 (2020-04-XX)
|
||||||
|
|
||||||
- Intercept the ESC keyboard key to allow the use of the BACK soft key.
|
- Intercept the ESC keyboard key to allow the use of the BACK soft key.
|
||||||
|
- Add LCD pixel borders.
|
||||||
|
- Add support for the dark theme.
|
||||||
|
- Fix issues with Linux build (Fix #11).
|
||||||
|
- Remove the non loadable file from the MRU file list (Fix #13).
|
||||||
|
- Hide the menu [Default KML script folder] when the default is already displayed (Fix #5).
|
||||||
|
- Fix: Overlapping window source position when Background/Offset is not (0,0).
|
||||||
|
|
||||||
|
|
||||||
Version 1.7 (2019-12-12)
|
Version 1.7 (2019-12-12)
|
||||||
|
|
|
@ -1120,10 +1120,10 @@ JNIEXPORT jint JNICALL Java_org_emulator_calculator_NativeLib_getState(JNIEnv *e
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_org_emulator_calculator_NativeLib_getScreenPositionX(JNIEnv *env, jobject thisz) {
|
JNIEXPORT jint JNICALL Java_org_emulator_calculator_NativeLib_getScreenPositionX(JNIEnv *env, jobject thisz) {
|
||||||
return nLcdX;
|
return nLcdX - nBackgroundX;
|
||||||
}
|
}
|
||||||
JNIEXPORT jint JNICALL Java_org_emulator_calculator_NativeLib_getScreenPositionY(JNIEnv *env, jobject thisz) {
|
JNIEXPORT jint JNICALL Java_org_emulator_calculator_NativeLib_getScreenPositionY(JNIEnv *env, jobject thisz) {
|
||||||
return nLcdY;
|
return nLcdY - nBackgroundY;
|
||||||
}
|
}
|
||||||
JNIEXPORT jint JNICALL Java_org_emulator_calculator_NativeLib_getScreenWidth(JNIEnv *env, jobject thisz) {
|
JNIEXPORT jint JNICALL Java_org_emulator_calculator_NativeLib_getScreenWidth(JNIEnv *env, jobject thisz) {
|
||||||
return 131*nLcdZoom*nGdiXZoom;
|
return 131*nLcdZoom*nGdiXZoom;
|
||||||
|
|
|
@ -29,6 +29,8 @@ import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
|
|
||||||
|
import static org.emulator.calculator.MainScreenView.drawPixelBorder;
|
||||||
|
|
||||||
public class LCDOverlappingView extends View {
|
public class LCDOverlappingView extends View {
|
||||||
|
|
||||||
protected static final String TAG = "LCDOverlappingView";
|
protected static final String TAG = "LCDOverlappingView";
|
||||||
|
@ -47,6 +49,7 @@ public class LCDOverlappingView extends View {
|
||||||
private MainScreenView mainScreenView;
|
private MainScreenView mainScreenView;
|
||||||
private boolean viewSized = false;
|
private boolean viewSized = false;
|
||||||
private boolean firstTime = true;
|
private boolean firstTime = true;
|
||||||
|
private boolean usePixelBorders = true;
|
||||||
|
|
||||||
public LCDOverlappingView(Context context, MainScreenView mainScreenView) {
|
public LCDOverlappingView(Context context, MainScreenView mainScreenView) {
|
||||||
super(context);
|
super(context);
|
||||||
|
@ -56,8 +59,10 @@ public class LCDOverlappingView extends View {
|
||||||
|
|
||||||
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext());
|
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext());
|
||||||
|
|
||||||
paint.setFilterBitmap(true);
|
//paint.setFilterBitmap(true);
|
||||||
paint.setAntiAlias(true);
|
paint.setStyle(Paint.Style.STROKE);
|
||||||
|
paint.setStrokeWidth(1.0f);
|
||||||
|
paint.setAntiAlias(false); //true);
|
||||||
|
|
||||||
DisplayMetrics displayMetrics = new DisplayMetrics();
|
DisplayMetrics displayMetrics = new DisplayMetrics();
|
||||||
((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
|
((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
|
||||||
|
@ -217,11 +222,19 @@ public class LCDOverlappingView extends View {
|
||||||
//if(debug) Log.d(TAG, "onDraw()");
|
//if(debug) Log.d(TAG, "onDraw()");
|
||||||
|
|
||||||
if(this.overlappingLCDMode != OVERLAPPING_LCD_MODE_NONE) {
|
if(this.overlappingLCDMode != OVERLAPPING_LCD_MODE_NONE) {
|
||||||
int x = NativeLib.getScreenPositionX();
|
int lcdPositionX = NativeLib.getScreenPositionX();
|
||||||
int y = NativeLib.getScreenPositionY();
|
int lcdPositionY = NativeLib.getScreenPositionY();
|
||||||
srcBitmapCopy.set(x, y, x + NativeLib.getScreenWidth(), y + NativeLib.getScreenHeight());
|
srcBitmapCopy.set(lcdPositionX, lcdPositionY, lcdPositionX + NativeLib.getScreenWidth(), lcdPositionY + NativeLib.getScreenHeight());
|
||||||
dstBitmapCopy.set(0, 0, getWidth(), getHeight());
|
dstBitmapCopy.set(0, 0, getWidth(), getHeight());
|
||||||
canvas.drawBitmap(mainScreenView.getBitmap(), srcBitmapCopy, dstBitmapCopy, paint);
|
canvas.drawBitmap(mainScreenView.getBitmap(), srcBitmapCopy, dstBitmapCopy, paint);
|
||||||
|
|
||||||
|
if(usePixelBorders) {
|
||||||
|
int lcdWidthNative = NativeLib.getScreenWidthNative();
|
||||||
|
if(lcdWidthNative > 0) {
|
||||||
|
int lcdHeightNative = NativeLib.getScreenHeightNative();
|
||||||
|
drawPixelBorder(canvas, lcdWidthNative, lcdHeightNative, 0.0f, 0.0f, getWidth(), getHeight(), paint);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -364,4 +377,9 @@ public class LCDOverlappingView extends View {
|
||||||
this.updateLayout();
|
this.updateLayout();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setUsePixelBorders(boolean usePixelBorders) {
|
||||||
|
this.usePixelBorders = usePixelBorders;
|
||||||
|
postInvalidate();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -367,35 +367,40 @@ public class MainScreenView extends PanAndScaleView {
|
||||||
super.onDraw(canvas);
|
super.onDraw(canvas);
|
||||||
|
|
||||||
if(usePixelBorders) {
|
if(usePixelBorders) {
|
||||||
int lcdPositionX = NativeLib.getScreenPositionX();
|
|
||||||
int lcdPositionY = NativeLib.getScreenPositionY();
|
|
||||||
int lcdWidth = NativeLib.getScreenWidth();
|
|
||||||
int lcdHeight = NativeLib.getScreenHeight();
|
|
||||||
int lcdWidthNative = NativeLib.getScreenWidthNative();
|
int lcdWidthNative = NativeLib.getScreenWidthNative();
|
||||||
int lcdHeightNative = NativeLib.getScreenHeightNative();
|
if(lcdWidthNative > 0) {
|
||||||
|
int lcdHeightNative = NativeLib.getScreenHeightNative();
|
||||||
|
int lcdPositionX = NativeLib.getScreenPositionX();
|
||||||
|
int lcdPositionY = NativeLib.getScreenPositionY();
|
||||||
|
int lcdWidth = NativeLib.getScreenWidth();
|
||||||
|
int lcdHeight = NativeLib.getScreenHeight();
|
||||||
|
|
||||||
float screenPositionX = lcdPositionX * viewScaleFactorX + viewPanOffsetX;
|
float screenPositionX = lcdPositionX * viewScaleFactorX + viewPanOffsetX;
|
||||||
float screenPositionY = lcdPositionY * viewScaleFactorY + viewPanOffsetY;
|
float screenPositionY = lcdPositionY * viewScaleFactorY + viewPanOffsetY;
|
||||||
float screenWidth = lcdWidth * viewScaleFactorX;
|
float screenWidth = lcdWidth * viewScaleFactorX;
|
||||||
float screenHeight = lcdHeight * viewScaleFactorY;
|
float screenHeight = lcdHeight * viewScaleFactorY;
|
||||||
|
drawPixelBorder(canvas, lcdWidthNative, lcdHeightNative, screenPositionX, screenPositionY, screenWidth, screenHeight, paintLCD);
|
||||||
// Draw the LCD grid lines without antialiasing to emulate the genuine pixels borders
|
|
||||||
int lcdBackgroundColor = 0xFF000000 | NativeLib.getLCDBackgroundColor();
|
|
||||||
paintLCD.setColor(lcdBackgroundColor);
|
|
||||||
float stepX = screenWidth / lcdWidthNative;
|
|
||||||
for(int x = 0; x < lcdWidthNative; x++) {
|
|
||||||
float screenX = screenPositionX + x * stepX;
|
|
||||||
canvas.drawLine(screenX, screenPositionY, screenX, screenPositionY + screenHeight, paintLCD);
|
|
||||||
}
|
}
|
||||||
float stepY = screenHeight / lcdHeightNative;
|
|
||||||
for(int y = 0; y < lcdHeightNative; y++) {
|
|
||||||
float screenY = screenPositionY + y * stepY;
|
|
||||||
canvas.drawLine(screenPositionX, screenY, screenPositionX + screenWidth, screenY, paintLCD);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateCallback(int type, int param1, int param2, String param3, String param4) {
|
static void drawPixelBorder(Canvas canvas, int lcdWidthNative, int lcdHeightNative, float screenPositionX, float screenPositionY, float screenWidth, float screenHeight, Paint paintLCD) {
|
||||||
|
// Draw the LCD grid lines without antialiasing to emulate the genuine pixels borders
|
||||||
|
int lcdBackgroundColor = 0xFF000000 | NativeLib.getLCDBackgroundColor();
|
||||||
|
paintLCD.setColor(lcdBackgroundColor);
|
||||||
|
float stepX = screenWidth / lcdWidthNative;
|
||||||
|
for (int x = 0; x < lcdWidthNative; x++) {
|
||||||
|
float screenX = screenPositionX + x * stepX;
|
||||||
|
canvas.drawLine(screenX, screenPositionY, screenX, screenPositionY + screenHeight, paintLCD);
|
||||||
|
}
|
||||||
|
float stepY = screenHeight / lcdHeightNative;
|
||||||
|
for (int y = 0; y < lcdHeightNative; y++) {
|
||||||
|
float screenY = screenPositionY + y * stepY;
|
||||||
|
canvas.drawLine(screenPositionX, screenY, screenPositionX + screenWidth, screenY, paintLCD);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateCallback(int type, int param1, int param2, String param3, String param4) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case NativeLib.CALLBACK_TYPE_INVALIDATE:
|
case NativeLib.CALLBACK_TYPE_INVALIDATE:
|
||||||
//Log.d(TAG, "PAINT updateCallback() postInvalidate()");
|
//Log.d(TAG, "PAINT updateCallback() postInvalidate()");
|
||||||
|
|
|
@ -1584,7 +1584,9 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
|
||||||
lcdOverlappingView.setOverlappingLCDMode(overlappingLCDMode);
|
lcdOverlappingView.setOverlappingLCDMode(overlappingLCDMode);
|
||||||
break;
|
break;
|
||||||
case "settings_lcd_pixel_borders":
|
case "settings_lcd_pixel_borders":
|
||||||
mainScreenView.setUsePixelBorders(sharedPreferences.getBoolean("settings_lcd_pixel_borders", false));
|
boolean usePixelBorders = sharedPreferences.getBoolean("settings_lcd_pixel_borders", false);
|
||||||
|
mainScreenView.setUsePixelBorders(usePixelBorders);
|
||||||
|
lcdOverlappingView.setUsePixelBorders(usePixelBorders);
|
||||||
break;
|
break;
|
||||||
case "settings_hide_bar":
|
case "settings_hide_bar":
|
||||||
case "settings_hide_bar_status":
|
case "settings_hide_bar_status":
|
||||||
|
|
Loading…
Reference in a new issue