Progressing

This commit is contained in:
Norbi Peti 2018-11-28 21:48:05 +01:00
parent 7ed8cfd8d0
commit 1c77835855
No known key found for this signature in database
GPG key ID: DBA4C4549A927E56
2 changed files with 29 additions and 24 deletions

View file

@ -1,5 +1,6 @@
package sznp.virtualcomputer; package sznp.virtualcomputer;
@SuppressWarnings("unused")
public interface PXCLib { public interface PXCLib {
/** /**
* Testing only * Testing only
@ -14,13 +15,14 @@ public interface PXCLib {
* @param address Bitmap address from VirtualBox * @param address Bitmap address from VirtualBox
* @param w Width of the screen * @param w Width of the screen
* @param h Height of the screen * @param h Height of the screen
* @param mc Total count of maps used for the screen * @param mcx Width of the screen in maps
* @param mcy Height of the screen in maps
*/ */
void setSource(long address, int w, int h, int mcx, int mcy); void setSource(long address, int w, int h, int mcx, int mcy);
/** /**
* Updates map and returns it's content * Updates map and returns it's content, where affected
* @return Full map data [mapc][data] * @return Partial map data [mapc][data]
*/ */
byte[][] updateAndGetMap(int x, int y, int width, int height); //TODO: Only update parts that actually updated and return them per-map (flagDirty) byte[][] updateAndGetMap(int x, int y, int width, int height); //TODO: Only update parts that actually updated and return them per-map (flagDirty)
} }

View file

@ -25,14 +25,12 @@ typedef struct { //BGRA
int alpha : 8; int alpha : 8;
} NativeColor; //Used for the screen data } NativeColor; //Used for the screen data
char matchColor(NativeColor* p); char matchColor(NativeColor nc);
void* image=NULL; void* image=NULL;
void* maps=NULL; //Per map data (1st map, second map etc.) void* maps=NULL; //Per map data (1st map, second map etc.)
short width, height, mapcx, mapcy; short width, height, mapcx, mapcy;
char* mapp=NULL; //Pointer inside the map
NativeColor* imgp=NULL; //Pointer inside the image
void setSource(addr address, short w, short h, short mcx, short mcy) { void setSource(addr address, short w, short h, short mcx, short mcy) {
ct_assert(sizeof(char)==1); //Compile-time assert ct_assert(sizeof(char)==1); //Compile-time assert
@ -40,28 +38,33 @@ void setSource(addr address, short w, short h, short mcx, short mcy) {
image=(void*)address; image=(void*)address;
maps=malloc(MAPSIZE*MAPSIZE*mcx*mcy); //1 byte per pixel maps=malloc(MAPSIZE*MAPSIZE*mcx*mcy); //1 byte per pixel
width=w, height=h, mapcx=mcx, mapcy=mcy; width=w, height=h, mapcx=mcx, mapcy=mcy;
mapp=maps;
} }
//May return 0 //May return 0
void* updateAndGetMap(int x, int y, int w, int h) { //TODO: Support the parameters void* updateAndGetMap(int x, int y, int w, int h) { //TODO: Support the parameters
if(image==NULL || maps==NULL) return 0; if(image==NULL || maps==NULL) return 0;
void* const retp = mapp; char* mapp = maps;
for(short i=0; i<MAPSIZE; i++) { //We need to jump NativeColor* imgp = image;
for(short j=0; j<MAPSIZE; j++) { for(int k=0; k<mapcx; k++) {
*mapp=matchColor(imgp); for(int l=0; l<mapcy; l++) {
imgp++; //Increment by the size of Nativecolor so 4 mapp = maps + MAPSIZE*k + MAPSIZE*mapcx*MAPSIZE*l; //Go to the start of the map
mapp++; for(short i=0; i<MAPSIZE; i++) { //We need to jump
for(short j=0; j<MAPSIZE; j++) {
*mapp=matchColor(*imgp);
imgp++; //Increment by the size of NativeColor so 4
mapp++;
}
imgp+=width-MAPSIZE; //Go back to the first column
}
imgp+=MAPSIZE; //Go to the next map, kind of - TODO: Use X and Y coords!
if((void*)mapp - maps > MAPSIZE * MAPSIZE * mapcx * mapcy ||
(void*)imgp - image > width * height * sizeof(NativeColor)) {
mapp = maps; //Start over
imgp = image; //Start over
}
} }
imgp+=width-MAPSIZE; //Go back to the first column
} }
imgp+=MAPSIZE; //Go to the next map, kind of - TODO: Use X and Y coords! return maps; //TODO: Return changed only
if((void*)mapp - maps > MAPSIZE * MAPSIZE * mapcx * mapcy ||
(void*)imgp - image > width * height * sizeof(NativeColor)) {
mapp = maps; //Start over
imgp = image; //Start over
} //TODO: This is only one map, do it for all of them
return retp;
} }
const Color colors[] = { const Color colors[] = {
@ -133,9 +136,9 @@ double getDistance(Color c1, Color c2) {
} }
//Code from Bukkit's MapPalette class //Code from Bukkit's MapPalette class
char matchColor(NativeColor* const p) { char matchColor(NativeColor nc) {
if (p->alpha < 128) return 0; if (nc.alpha < 128) return 0;
Color color={.red=p->red, .green=p->green, .blue=p->blue}; Color color={.red=nc.red, .green=nc.green, .blue=nc.blue};
char index = 0; char index = 0;
double best = -1; double best = -1;