mirror of
https://github.com/dgis/emu48android
synced 2025-01-13 08:01:25 +01:00
- Rewrite the StretchBlt() function to improve the pixel rendering.
- Allow to build the project with "gradlew build".
This commit is contained in:
parent
a0844c5023
commit
5e0c56d44c
13 changed files with 58 additions and 51 deletions
5
.gitignore
vendored
5
.gitignore
vendored
|
@ -1,10 +1,7 @@
|
||||||
*.iml
|
*.iml
|
||||||
.gradle
|
.gradle
|
||||||
/local.properties
|
/local.properties
|
||||||
/.idea/caches/build_file_checksums.ser
|
.idea
|
||||||
/.idea/libraries
|
|
||||||
/.idea/modules.xml
|
|
||||||
/.idea/workspace.xml
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
/build
|
/build
|
||||||
/captures
|
/captures
|
||||||
|
|
|
@ -32,13 +32,15 @@ NOT WORKING YET
|
||||||
|
|
||||||
CHANGES
|
CHANGES
|
||||||
|
|
||||||
Version 1.2 (2019-03-XX)
|
Version 1.2alpha (2019-03-XX)
|
||||||
|
|
||||||
- Use the KML Global color as background color.
|
- Use the KML Global color as background color.
|
||||||
- Set the extension .e49 when "Saving as" a state file with model 'Q'.
|
- Set the extension .e49 when "Saving as" a state file with model 'Q'.
|
||||||
- Fix a crash after opening several times a state file.
|
- Fix a crash after opening several times a state file.
|
||||||
- Fix On-D diagnostic not working for 48gII/49G/49g+/50g (rom 2.15 not good, change for 2.10).
|
- Fix On-D diagnostic not working for 48gII/49G/49g+/50g (rom 2.15 not good, change for 2.10).
|
||||||
- Fix the scrolling issue found in Emu48 1.59+
|
- Improve the scrolling issue found in Emu48 1.59+.
|
||||||
|
- Rewrite the StretchBlt() function to improve the pixel rendering.
|
||||||
|
- Allow to build the project with "gradlew build".
|
||||||
|
|
||||||
|
|
||||||
Version 1.1 (2019-03-01)
|
Version 1.1 (2019-03-01)
|
||||||
|
@ -66,9 +68,9 @@ Note: some included files are not covered by the GPL; these include ROM image fi
|
||||||
The Eric's Real scripts ("real*.kml" and "real*.bmp") are embedded in this application with the kind permission of Eric Rechlin.
|
The Eric's Real scripts ("real*.kml" and "real*.bmp") are embedded in this application with the kind permission of Eric Rechlin.
|
||||||
|
|
||||||
TODO
|
TODO
|
||||||
|
- Build with Android 4.0
|
||||||
- Add a separation between the pixels (Suggestion from Jaime Meza)
|
- Add a separation between the pixels (Suggestion from Jaime Meza)
|
||||||
- Sometimes the "busy" annunciator gets stuck
|
- Sometimes the "busy" annunciator gets stuck
|
||||||
- Pixel alignment (pixel squeeze?) issue
|
|
||||||
- Add KML script loading dependencies fallback to the inner ROM (and may be KML include?)
|
- Add KML script loading dependencies fallback to the inner ROM (and may be KML include?)
|
||||||
- Add haptic feedback when touch a button
|
- Add haptic feedback when touch a button
|
||||||
- Add a true fullscreen mode under the status bar and the bottom buttons
|
- Add a true fullscreen mode under the status bar and the bottom buttons
|
||||||
|
@ -114,3 +116,4 @@ DONE
|
||||||
- Fix sound error at the initialization
|
- Fix sound error at the initialization
|
||||||
- Open Emu48 with a state (content://) file shared with it
|
- Open Emu48 with a state (content://) file shared with it
|
||||||
- Add sound switch settings
|
- Add sound switch settings
|
||||||
|
- Pixel alignment (pixel squeeze?) issue
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.4.1)
|
cmake_minimum_required(VERSION 3.4.1)
|
||||||
|
|
||||||
|
#add_compile_options(-D DEBUG_DISPLAY)
|
||||||
|
|
||||||
include_directories(src/main/cpp/win32)
|
include_directories(src/main/cpp/win32)
|
||||||
|
|
||||||
# Creates and names a library, sets it as either STATIC
|
# Creates and names a library, sets it as either STATIC
|
||||||
|
|
|
@ -37,4 +37,7 @@ dependencies {
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2'
|
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2'
|
||||||
implementation 'com.google.android.material:material:1.1.0-alpha01'
|
implementation 'com.google.android.material:material:1.1.0-alpha01'
|
||||||
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
|
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
|
||||||
|
testImplementation 'junit:junit:4.12'
|
||||||
|
androidTestImplementation 'androidx.test:runner:1.1.0-alpha4'
|
||||||
|
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha4'
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
package org.emulator.forty.eight;
|
package org.emulator.forty.eight;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.support.test.InstrumentationRegistry;
|
|
||||||
import android.support.test.runner.AndroidJUnit4;
|
import androidx.test.InstrumentationRegistry;
|
||||||
|
import androidx.test.runner.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
|
@ -73,6 +73,7 @@
|
||||||
</activity>
|
</activity>
|
||||||
<activity
|
<activity
|
||||||
android:name="org.emulator.forty.eight.InfoWebActivity"
|
android:name="org.emulator.forty.eight.InfoWebActivity"
|
||||||
|
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"
|
||||||
android:label="@string/title_web_activity_info">
|
android:label="@string/title_web_activity_info">
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="android.support.PARENT_ACTIVITY"
|
android:name="android.support.PARENT_ACTIVITY"
|
||||||
|
@ -80,6 +81,7 @@
|
||||||
</activity>
|
</activity>
|
||||||
<activity
|
<activity
|
||||||
android:name="org.emulator.forty.eight.InfoActivity"
|
android:name="org.emulator.forty.eight.InfoActivity"
|
||||||
|
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"
|
||||||
android:label="@string/title_activity_info">
|
android:label="@string/title_activity_info">
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="android.support.PARENT_ACTIVITY"
|
android:name="android.support.PARENT_ACTIVITY"
|
||||||
|
|
|
@ -32,13 +32,15 @@ NOT WORKING YET
|
||||||
|
|
||||||
CHANGES
|
CHANGES
|
||||||
|
|
||||||
Version 1.2 (2019-03-XX)
|
Version 1.2alpha (2019-03-XX)
|
||||||
|
|
||||||
- Use the KML Global color as background color.
|
- Use the KML Global color as background color.
|
||||||
- Set the extension .e49 when "Saving as" a state file with model 'Q'.
|
- Set the extension .e49 when "Saving as" a state file with model 'Q'.
|
||||||
- Fix a crash after opening several times a state file.
|
- Fix a crash after opening several times a state file.
|
||||||
- Fix On-D diagnostic not working for 48gII/49G/49g+/50g (rom 2.15 not good, change for 2.10).
|
- Fix On-D diagnostic not working for 48gII/49G/49g+/50g (rom 2.15 not good, change for 2.10).
|
||||||
- Improve the scrolling issue found in Emu48 1.59+
|
- Improve the scrolling issue found in Emu48 1.59+.
|
||||||
|
- Rewrite the StretchBlt() function to improve the pixel rendering.
|
||||||
|
- Allow to build the project with "gradlew build".
|
||||||
|
|
||||||
|
|
||||||
Version 1.1 (2019-03-01)
|
Version 1.1 (2019-03-01)
|
||||||
|
|
|
@ -1333,7 +1333,7 @@ BOOL PatBlt(HDC hdcDest, int x, int y, int w, int h, DWORD rop) {
|
||||||
destinationHeight = abs(hBitmapDestination->bitmapInfoHeader->biHeight);
|
destinationHeight = abs(hBitmapDestination->bitmapInfoHeader->biHeight);
|
||||||
|
|
||||||
destinationBytes = hBitmapDestination->bitmapInfoHeader->biBitCount >> 3;
|
destinationBytes = hBitmapDestination->bitmapInfoHeader->biBitCount >> 3;
|
||||||
destinationStride = (float)(destinationBytes * ((destinationWidth * hBitmapDestination->bitmapInfoHeader->biBitCount + 31) / 32));
|
destinationStride = (float)(4 * ((destinationWidth * hBitmapDestination->bitmapInfoHeader->biBitCount + 31) / 32));
|
||||||
}
|
}
|
||||||
|
|
||||||
HPALETTE palette = hdcDest->realizedPalette;
|
HPALETTE palette = hdcDest->realizedPalette;
|
||||||
|
@ -1404,11 +1404,9 @@ BOOL StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdc
|
||||||
|
|
||||||
int sourceBitCount = hBitmapSource->bitmapInfoHeader->biBitCount;
|
int sourceBitCount = hBitmapSource->bitmapInfoHeader->biBitCount;
|
||||||
int sourceBytes = sourceBitCount >> 3;
|
int sourceBytes = sourceBitCount >> 3;
|
||||||
float sourceBytesWithDecimal = (float)sourceBitCount / 8.0f;
|
int sourceStride = 4 * ((sourceWidth * hBitmapSource->bitmapInfoHeader->biBitCount + 31) / 32);
|
||||||
//TODO float sourceStride = (float)(sourceBytesWithDecimal * ((sourceWidth * hBitmapSource->bitmapInfoHeader->biBitCount + 31) / 32));
|
|
||||||
float sourceStride = (float)(4 * ((sourceWidth * hBitmapSource->bitmapInfoHeader->biBitCount + 31) / 32));
|
|
||||||
int destinationBytes = 0;
|
int destinationBytes = 0;
|
||||||
float destinationStride = 0;
|
int destinationStride = 0;
|
||||||
|
|
||||||
JNIEnv * jniEnv = NULL;
|
JNIEnv * jniEnv = NULL;
|
||||||
|
|
||||||
|
@ -1444,24 +1442,12 @@ BOOL StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdc
|
||||||
destinationHeight = abs(hBitmapDestination->bitmapInfoHeader->biHeight);
|
destinationHeight = abs(hBitmapDestination->bitmapInfoHeader->biHeight);
|
||||||
|
|
||||||
destinationBytes = (hBitmapDestination->bitmapInfoHeader->biBitCount >> 3);
|
destinationBytes = (hBitmapDestination->bitmapInfoHeader->biBitCount >> 3);
|
||||||
destinationStride = (float)(destinationBytes * ((destinationWidth * hBitmapDestination->bitmapInfoHeader->biBitCount + 31) / 32));
|
destinationStride = destinationBytes * ((destinationWidth * hBitmapDestination->bitmapInfoHeader->biBitCount + 31) / 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
xDest -= hdcDest->windowOrigineX;
|
xDest -= hdcDest->windowOrigineX;
|
||||||
yDest -= hdcDest->windowOrigineY;
|
yDest -= hdcDest->windowOrigineY;
|
||||||
|
|
||||||
//https://softwareengineering.stackexchange.com/questions/148123/what-is-the-algorithm-to-copy-a-region-of-one-bitmap-into-a-region-in-another
|
|
||||||
float src_dx = (float)wSrc / (float)wDest;
|
|
||||||
float src_dy = (float)hSrc / (float)hDest;
|
|
||||||
float dst_maxx = xDest + wDest;
|
|
||||||
float dst_maxy = yDest + hDest;
|
|
||||||
float src_cury = ySrc;
|
|
||||||
|
|
||||||
if(reverseHeight == FALSE) {
|
|
||||||
src_dy = -src_dy;
|
|
||||||
src_cury = sourceHeight - 1 - src_cury;
|
|
||||||
}
|
|
||||||
|
|
||||||
//LOGD("StretchBlt(%08x, x:%d, y:%d, w:%d, h:%d, %08x, x:%d, y:%d, w:%d, h:%d) -> sourceBytes: %d", hdcDest->hdcCompatible, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, sourceBytesWithDecimal);
|
//LOGD("StretchBlt(%08x, x:%d, y:%d, w:%d, h:%d, %08x, x:%d, y:%d, w:%d, h:%d) -> sourceBytes: %d", hdcDest->hdcCompatible, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, sourceBytesWithDecimal);
|
||||||
HPALETTE palette = hdcSrc->realizedPalette;
|
HPALETTE palette = hdcSrc->realizedPalette;
|
||||||
if(!palette)
|
if(!palette)
|
||||||
|
@ -1469,16 +1455,21 @@ BOOL StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdc
|
||||||
PALETTEENTRY * palPalEntry = palette && palette->paletteLog && palette->paletteLog->palPalEntry ?
|
PALETTEENTRY * palPalEntry = palette && palette->paletteLog && palette->paletteLog->palPalEntry ?
|
||||||
palette->paletteLog->palPalEntry : NULL;
|
palette->paletteLog->palPalEntry : NULL;
|
||||||
|
|
||||||
for (float y = yDest; y < dst_maxy; y++) {
|
int dst_maxx = xDest + wDest;
|
||||||
float src_curx = xSrc;
|
int dst_maxy = yDest + hDest;
|
||||||
BYTE parity = xSrc;
|
for (int y = yDest; y < dst_maxy; y++) {
|
||||||
for (float x = xDest; x < dst_maxx; x++, parity++) {
|
int src_cury = ySrc + (y - yDest) * hSrc / hDest;
|
||||||
// Point sampling - you can also impl as bilinear or other
|
if(!reverseHeight)
|
||||||
|
src_cury = sourceHeight - 1 - src_cury;
|
||||||
|
BYTE parity = (BYTE) xSrc;
|
||||||
|
for (int x = xDest; x < dst_maxx; x++, parity++) {
|
||||||
|
int src_curx = xSrc + (x - xDest) * wSrc / wDest;
|
||||||
|
if (src_curx < 0 || src_cury < 0 || src_curx >= sourceWidth || src_cury >= sourceHeight)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int currentXBytes = ((sourceBitCount >> 2) * src_curx) >> 1;
|
||||||
float currentXBytes = sourceBytesWithDecimal * (int)src_curx;
|
BYTE * sourcePixel = pixelsSource + sourceStride * src_cury + currentXBytes;
|
||||||
BYTE * sourcePixel = pixelsSource + (int)(sourceStride * (int)src_cury) + (int)currentXBytes;
|
BYTE * destinationPixel = pixelsDestination + destinationStride * y + 4 * x;
|
||||||
BYTE * destinationPixel = pixelsDestination + (int)(destinationStride * y + 4.0 * x);
|
|
||||||
|
|
||||||
// -> ARGB_8888
|
// -> ARGB_8888
|
||||||
switch (sourceBitCount) {
|
switch (sourceBitCount) {
|
||||||
|
@ -1486,7 +1477,7 @@ BOOL StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdc
|
||||||
BYTE colorIndex = (parity & 0x1 ? sourcePixel[0] & (BYTE)0x0F : sourcePixel[0] >> 4);
|
BYTE colorIndex = (parity & 0x1 ? sourcePixel[0] & (BYTE)0x0F : sourcePixel[0] >> 4);
|
||||||
//BYTE colorIndex = (parity & 0x1 ? sourcePixel[0] >> 4 : sourcePixel[0] & (BYTE)0x0F);
|
//BYTE colorIndex = (parity & 0x1 ? sourcePixel[0] >> 4 : sourcePixel[0] & (BYTE)0x0F);
|
||||||
if (palPalEntry) {
|
if (palPalEntry) {
|
||||||
destinationPixel[0] = palPalEntry[colorIndex].peRed; //TODO Exchange Blue and Red?
|
destinationPixel[0] = palPalEntry[colorIndex].peRed;
|
||||||
destinationPixel[1] = palPalEntry[colorIndex].peGreen;
|
destinationPixel[1] = palPalEntry[colorIndex].peGreen;
|
||||||
destinationPixel[2] = palPalEntry[colorIndex].peBlue;
|
destinationPixel[2] = palPalEntry[colorIndex].peBlue;
|
||||||
destinationPixel[3] = 255;
|
destinationPixel[3] = 255;
|
||||||
|
@ -1501,7 +1492,7 @@ BOOL StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdc
|
||||||
case 8: {
|
case 8: {
|
||||||
BYTE colorIndex = sourcePixel[0];
|
BYTE colorIndex = sourcePixel[0];
|
||||||
if (palPalEntry) {
|
if (palPalEntry) {
|
||||||
destinationPixel[0] = palPalEntry[colorIndex].peRed; //TODO Exchange Blue and Red?
|
destinationPixel[0] = palPalEntry[colorIndex].peRed;
|
||||||
destinationPixel[1] = palPalEntry[colorIndex].peGreen;
|
destinationPixel[1] = palPalEntry[colorIndex].peGreen;
|
||||||
destinationPixel[2] = palPalEntry[colorIndex].peBlue;
|
destinationPixel[2] = palPalEntry[colorIndex].peBlue;
|
||||||
destinationPixel[3] = 255;
|
destinationPixel[3] = 255;
|
||||||
|
@ -1525,11 +1516,7 @@ BOOL StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdc
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
src_curx += src_dx;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
src_cury += src_dy;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(jniEnv)
|
if(jniEnv)
|
||||||
|
|
|
@ -1177,7 +1177,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
|
||||||
private void updateFromPreferences(String key, boolean isDynamic) {
|
private void updateFromPreferences(String key, boolean isDynamic) {
|
||||||
int isDynamicValue = isDynamic ? 1 : 0;
|
int isDynamicValue = isDynamic ? 1 : 0;
|
||||||
if(key == null) {
|
if(key == null) {
|
||||||
String[] settingKeys = { "settings_realspeed", "settings_grayscale", "settings_allow_rotation", "settings_fill_screen", "settings_allow_sound", "settings_kml", "settings_port1", "settings_port2" };
|
String[] settingKeys = { "settings_realspeed", "settings_grayscale", "settings_allow_rotation", "settings_fill_screen", "settings_scale", "settings_allow_sound", "settings_kml", "settings_port1", "settings_port2" };
|
||||||
for (String settingKey : settingKeys) {
|
for (String settingKey : settingKeys) {
|
||||||
updateFromPreferences(settingKey, false);
|
updateFromPreferences(settingKey, false);
|
||||||
}
|
}
|
||||||
|
@ -1199,6 +1199,9 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
|
||||||
case "settings_fill_screen":
|
case "settings_fill_screen":
|
||||||
mainScreenView.setFillScreen(sharedPreferences.getBoolean("settings_fill_screen", false));
|
mainScreenView.setFillScreen(sharedPreferences.getBoolean("settings_fill_screen", false));
|
||||||
break;
|
break;
|
||||||
|
case "settings_scale":
|
||||||
|
//mainScreenView.setScale(1.0f); //sharedPreferences.getFloat("settings_scale", 0.0f));
|
||||||
|
break;
|
||||||
|
|
||||||
case "settings_allow_sound":
|
case "settings_allow_sound":
|
||||||
NativeLib.setConfiguration("settings_sound_volume", isDynamicValue,
|
NativeLib.setConfiguration("settings_sound_volume", isDynamicValue,
|
||||||
|
|
|
@ -27,6 +27,7 @@ public class MainScreenView extends SurfaceView {
|
||||||
private float screenOffsetX = 0.0f;
|
private float screenOffsetX = 0.0f;
|
||||||
private float screenOffsetY= 0.0f;
|
private float screenOffsetY= 0.0f;
|
||||||
private boolean fillScreen = false;
|
private boolean fillScreen = false;
|
||||||
|
private float fixScale = 0.0f;
|
||||||
private int backgroundColor = Color.BLACK;
|
private int backgroundColor = Color.BLACK;
|
||||||
|
|
||||||
public MainScreenView(Context context) {
|
public MainScreenView(Context context) {
|
||||||
|
@ -201,13 +202,13 @@ public class MainScreenView extends SurfaceView {
|
||||||
float viewRatio = (float)viewHeight / (float)viewWidth;
|
float viewRatio = (float)viewHeight / (float)viewWidth;
|
||||||
float imageRatio = imageSizeY / imageSizeX;
|
float imageRatio = imageSizeY / imageSizeX;
|
||||||
if(viewRatio > imageRatio) {
|
if(viewRatio > imageRatio) {
|
||||||
scaleX = scaleY = viewWidth / imageSizeX;
|
scaleX = scaleY = this.fixScale != 0.0f ? this.fixScale : viewWidth / imageSizeX;
|
||||||
translateX = 0.0f;
|
translateX = (viewWidth - scaleX * imageSizeX) / 2.0f; //0.0f;
|
||||||
translateY = (viewHeight - scaleY * imageSizeY) / 2.0f;
|
translateY = (viewHeight - scaleY * imageSizeY) / 2.0f;
|
||||||
} else {
|
} else {
|
||||||
scaleX = scaleY = viewHeight / imageSizeY;
|
scaleX = scaleY = this.fixScale != 0.0f ? this.fixScale : viewHeight / imageSizeY;
|
||||||
translateX = (viewWidth - scaleX * imageSizeX) / 2.0f;
|
translateX = (viewWidth - scaleX * imageSizeX) / 2.0f;
|
||||||
translateY = 0.0f;
|
translateY = (viewHeight - scaleY * imageSizeY) / 2.0f; //0.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,4 +272,10 @@ public class MainScreenView extends SurfaceView {
|
||||||
calcTranslateAndScale(getWidth(), getHeight());
|
calcTranslateAndScale(getWidth(), getHeight());
|
||||||
postInvalidate();
|
postInvalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setScale(float scale) {
|
||||||
|
this.fixScale = scale;
|
||||||
|
calcTranslateAndScale(getWidth(), getHeight());
|
||||||
|
postInvalidate();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,5 +5,5 @@
|
||||||
android:viewportWidth="24.0"
|
android:viewportWidth="24.0"
|
||||||
android:viewportHeight="24.0">
|
android:viewportHeight="24.0">
|
||||||
|
|
||||||
<path android:fillColor="#FF000000" android:pathData="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm-1 4l6 6v10c0 1.1-.9 2-2 2H7.99C6.89 23 6 22.1 6 21l.01-14c0-1.1.89-2 1.99-2h7zm-1 7h5.5L14 6.5V12z"/>
|
<path android:fillColor="#FF000000" android:pathData="M 16,1 H 4 C 2.9,1 2,1.9 2,3 V 17 H 4 V 3 h 12 z m -1,4 6,6 v 10 c 0,1.1 -0.9,2 -2,2 H 7.99 C 6.89,23 6,22.1 6,21 L 6.01,7 C 6.01,5.9 6.9,5 8,5 Z m -1,7 h 5.5 L 14,6.5 Z"/>
|
||||||
</vector>
|
</vector>
|
|
@ -5,5 +5,5 @@
|
||||||
android:viewportWidth="24.0"
|
android:viewportWidth="24.0"
|
||||||
android:viewportHeight="24.0">
|
android:viewportHeight="24.0">
|
||||||
<path android:fillColor="#FF000000"
|
<path android:fillColor="#FF000000"
|
||||||
android:pathData="M19 12v7H5v-7H3v7c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-7h-2zm-6 .67l2.59-2.58L17 11.5l-5 5-5-5 1.41-1.41L11 12.67V3h2z"/>
|
android:pathData="m 19,12 v 7 H 5 V 12 H 3 v 7 c 0,1.1 0.9,2 2,2 h 14 c 1.1,0 2,-0.9 2,-2 v -7 z m -6,0.67 2.59,-2.58 1.41,1.41 -5,5 -5,-5 1.41,-1.41 2.59,2.58 V 3 h 2 z"/>
|
||||||
</vector>
|
</vector>
|
Loading…
Reference in a new issue