package readers ;
import java.io.IOException ;
import java.io.InputStreamReader ;
import java.nio.file.Path ;
import java.util.ArrayList ;
import java.util.Arrays ;
import java.util.List ;
import java.awt.Color ;
public abstract class Reader {
int score ;
int rank ;
int [ ] notes = new int [ 7 ] ;
int difficulty ;
String title ;
int pct ;
int maxcombo ;
String other ;
List < Box > readRegions = new ArrayList < > ( ) ;
final int TRANSPARENT = new Color ( 0 , 0 , 0 , 0 ) . getRGB ( ) ;
String readAllBoxes ( Path img ) {
try {
Process p = Runtime . getRuntime ( ) . exec ( new String [ ] { "python3" , "runocr.py" , "ja" , img . toAbsolutePath ( ) . toString ( ) } ) ;
while ( p . isAlive ( ) ) ;
InputStreamReader result = new InputStreamReader ( p . getInputStream ( ) ) ;
StringBuilder sb = new StringBuilder ( ) ;
while ( result . ready ( ) ) {
sb . append ( ( char ) result . read ( ) ) ;
}
result . close ( ) ;
sb . append ( "\n" ) ;
p = Runtime . getRuntime ( ) . exec ( new String [ ] { "python3" , "runocr.py" , "en" , img . toAbsolutePath ( ) . toString ( ) } ) ;
while ( p . isAlive ( ) ) ;
result = new InputStreamReader ( p . getInputStream ( ) ) ;
while ( result . ready ( ) ) {
sb . append ( ( char ) result . read ( ) ) ;
}
return sb . toString ( ) ;
} catch ( IOException e ) {
e . printStackTrace ( ) ;
}
return "" ;
}
abstract String interpretOutput ( String [ ] jp_data , String [ ] en_data ) ;
void trimAllData ( String [ ] data ) {
StringBuilder sb = new StringBuilder ( ) ;
for ( int i = 0 ; i < data . length ; i + + ) {
sb . delete ( 0 , sb . length ( ) ) ;
for ( int j = 0 ; j < data [ i ] . length ( ) ; j + + ) {
if ( data [ i ] . charAt ( j ) ! = '[' & & data [ i ] . charAt ( j ) ! = '(' & & data [ i ] . charAt ( j ) ! = ')' & & data [ i ] . charAt ( j ) ! = ']' ) {
sb . append ( data [ i ] . charAt ( j ) ) ;
}
}
data [ i ] = sb . toString ( ) . trim ( ) ;
}
}
void seek ( int [ ] arr , int i , ColorRange SEEKCOLOR , Color FINALCOLOR , int width ) {
seek ( arr , i , SEEKCOLOR , FINALCOLOR , width , 0 ) ;
}
int seek ( int [ ] arr , int i , ColorRange SEEKCOLOR , Color FINALCOLOR , int width , int farthestRight ) {
arr [ i ] = FINALCOLOR . getRGB ( ) ;
int X = i % width ;
for ( int x = - 1 ; x < = 1 ; x + + ) {
for ( int y = - 1 ; y < = 1 ; y + + ) {
int newX = ( i + x + y * width ) % width ;
int newY = ( i + x + y * width ) / width ;
if ( newX > = 0 & & newY > = 0 & & newX < = width & & newY < = arr . length / width ) {
Color col = new Color ( arr [ i + x + y * width ] ) ;
if ( ! col . equals ( Color . MAGENTA ) & & SEEKCOLOR . colorInRange ( col ) ) {
farthestRight = seek ( arr , i + x + y * width , SEEKCOLOR , FINALCOLOR , width , farthestRight ) ;
}
}
}
}
return X > farthestRight ? X : farthestRight ;
}
void seekThreshold ( int [ ] arr , int i , int threshold , Color FINALCOLOR , int width ) {
seekThreshold ( arr , i , threshold , FINALCOLOR , width , 0 ) ;
}
int seekThreshold ( int [ ] arr , int i , int threshold , Color FINALCOLOR , int width , int farthestRight ) {
arr [ i ] = FINALCOLOR . getRGB ( ) ;
int X = i % width ;
for ( int x = - 1 ; x < = 1 ; x + + ) {
for ( int y = - 1 ; y < = 1 ; y + + ) {
int newX = ( i + x + y * width ) % width ;
int newY = ( i + x + y * width ) / width ;
if ( newX > = 0 & & newY > = 0 & & newX < = width & & newY < = arr . length / width ) {
Color col = new Color ( arr [ i + x + y * width ] ) ;
if ( ! col . equals ( Color . MAGENTA ) & & colorIsBright ( col , threshold ) ) {
farthestRight = seekThreshold ( arr , i + x + y * width , threshold , FINALCOLOR , width , farthestRight ) ;
}
}
}
}
return X > farthestRight ? X : farthestRight ;
}
void process ( int [ ] arr , int width , int a , int b , int c , int d , int e , int f , int g , int h , int ii , int j , int k , int l ) {
final ColorRange TARGETCOLOR = new ColorRange ( a , b , c , d , e , f ) ;
final ColorRange SEEKINGCOLOR = new ColorRange ( g , h , ii , j , k , l ) ;
final Color FINALCOLOR = Color . MAGENTA ;
for ( int i = 0 ; i < arr . length ; i + + ) {
Color col = new Color ( arr [ i ] , true ) ;
if ( TARGETCOLOR . colorInRange ( col ) ) {
seek ( arr , i , SEEKINGCOLOR , FINALCOLOR , width ) ;
}
}
for ( int i = 0 ; i < arr . length ; i + + ) {
Color col = new Color ( arr [ i ] , true ) ;
if ( ! col . equals ( Color . MAGENTA ) ) {
arr [ i ] = TRANSPARENT ;
}
}
}
boolean colorIsBright ( Color col , int brightnessThreshold ) {
return col . getRed ( ) + col . getBlue ( ) + col . getGreen ( ) > brightnessThreshold ;
}
void processBrightness ( int [ ] arr , int width , int threshold1 , int threshold2 ) {
final Color FINALCOLOR = Color . MAGENTA ;
for ( int i = 0 ; i < arr . length ; i + + ) {
Color col = new Color ( arr [ i ] , true ) ;
if ( colorIsBright ( col , threshold1 ) ) {
seekThreshold ( arr , i , threshold2 , FINALCOLOR , width ) ;
}
}
for ( int i = 0 ; i < arr . length ; i + + ) {
Color col = new Color ( arr [ i ] , true ) ;
if ( ! col . equals ( Color . MAGENTA ) ) {
arr [ i ] = TRANSPARENT ;
}
}
}
char [ ] [ ] number_alternatives = {
/*0*/ { '0' , 'o' , 'O' , 'e' } ,
/*1*/ { '1' , '\\' , '/' , 'I' , 'i' } ,
/*2*/ { '2' } ,
/*3*/ { '3' } ,
/*4*/ { '4' } ,
/*5*/ { '5' } ,
/*6*/ { '6' , 'b' } ,
/*7*/ { '7' } ,
/*8*/ { '8' , 'B' } ,
/*9*/ { '9' , 'g' , 'y' , } ,
} ;
int convertToInt ( String [ ] data ) { return convertToInt ( "" , data ) ; }
int convertToInt ( String prefix , String [ ] data ) {
int numb = 0 ;
for ( int i = prefix . length ( ) ; i < data . length ; i + + ) {
String s = data [ i ] ;
for ( int j = 0 ; j < s . length ( ) ; j + + ) {
if ( s . charAt ( j ) > = '0' & & s . charAt ( j ) < = '9' ) {
numb * = 10 ;
numb + = s . charAt ( j ) - '0' ;
}
}
}
return numb ;
}
@Override
public String toString ( ) {
return "Reader [difficulty=" + difficulty + ", maxcombo=" + maxcombo + ", notes=" + Arrays . toString ( notes )
+ ", other=" + other + ", pct=" + pct + ", rank=" + rank + ", score=" + score + ", title=" + title
+ "]" ;
}
}