@ -61,13 +61,9 @@ Resulted shift is added to own shift of layer (setted by function LayerShift).
*/
*/
const ObjectBase * GMT_Map ( const ObjectList * input )
const ObjectBase * GMT_Map ( const ObjectList * input )
{
{
const ObjectList * list = input ;
std : : string err ;
auto size = list - > Size ( ) ;
if ( 0 = = size ) return 0 ;
decltype ( size ) pos = 0 ;
std : : string title ;
std : : string title ;
std : : stack < std : : pair < const ObjectList * , decltype ( pos ) > > lstack ;
bool first = true ;
double xg , yg , x , y ;
double xg , yg , x , y ;
bool xislocal = false , yislocal = false ;
bool xislocal = false , yislocal = false ;
std : : list < std : : shared_ptr < std : : string > > data ;
std : : list < std : : shared_ptr < std : : string > > data ;
@ -78,45 +74,29 @@ const ObjectBase* GMT_Map(const ObjectList* input)
// See http://bugs.ghostscript.com/show_bug.cgi?id=202735
// See http://bugs.ghostscript.com/show_bug.cgi?id=202735
data . emplace_back ( new std : : string ( " 4000 4000 translate " ) ) ;
data . emplace_back ( new std : : string ( " 4000 4000 translate " ) ) ;
data . emplace_back ( new std : : string ( header ) ) ;
data . emplace_back ( new std : : string ( header ) ) ;
while ( pos < size )
for ( auto i = input - > begin ( ) ; i ! = input - > end ( ) ; + + i )
{
// Check if next argument is list
{
{
OBType < ObjectList > l ( list - > At ( pos ) ) ;
// Descending
if ( l )
{
if ( 0 = = l - > Size ( ) ) goto next ;
lstack . push ( std : : make_pair ( list , pos ) ) ;
list = l ;
pos = 0 ;
size = l - > Size ( ) ;
continue ;
}
}
// Check if first argument is string
// Check if first argument is string
if ( first )
if ( input - > begin ( ) = = i )
{
{
first = false ;
OBType < ObjectString > s ( * i ) ;
OBType < ObjectString > s ( list - > At ( pos ) ) ;
if ( s )
if ( s )
{
{
title = s - > Value ( ) ;
title = s - > Value ( ) ;
goto next ;
continue ;
}
}
}
}
// Check if argument is pair
// Check if argument is pair
{
{
OBType < ObjectPair > p ( list - > At ( pos ) ) ;
OBType < ObjectPair > p ( * i ) ;
if ( p )
if ( p )
{
{
std : : string name = p - > Name ( ) ;
std : : string name = p - > Name ( ) ;
tolower ( name ) ;
tolower ( name ) ;
Base2Double d ( p - > Value ( ) ) ;
Base2Double d ;
bool suc = true ;
bool suc = true ;
double val = d ( & suc ) ;
double val = d . Convert ( p - > Value ( ) , & suc , err ) ;
if ( ! suc ) goto fail ; // Conversion failed
if ( ! suc ) goto fail ; // Conversion failed
suc = false ;
suc = false ;
if ( " x " = = name ) { suc = true ; xislocal = true ; x = val ; }
if ( " x " = = name ) { suc = true ; xislocal = true ; x = val ; }
@ -127,14 +107,14 @@ const ObjectBase* GMT_Map(const ObjectList* input)
if ( " yg " = = name ) { suc = true ; yg = val ; }
if ( " yg " = = name ) { suc = true ; yg = val ; }
if ( " xgr " = = name ) { suc = true ; xg + = val ; }
if ( " xgr " = = name ) { suc = true ; xg + = val ; }
if ( " ygr " = = name ) { suc = true ; yg + = val ; }
if ( " ygr " = = name ) { suc = true ; yg + = val ; }
if ( ! suc ) goto fail ; // Unknown name
if ( ! suc ) { err = " Unknown parameter name: " + p - > Name ( ) ; goto fail ; } // Unknown name
goto next ;
continue ;
}
}
}
}
// Check if argument is layer
// Check if argument is layer
{
{
OBType < ObjectGMTLayer > l ( list - > At ( pos ) ) ;
OBType < ObjectGMTLayer > l ( * i ) ;
if ( l )
if ( l )
{
{
struct gmt_layer layer = l - > Data ( ) ;
struct gmt_layer layer = l - > Data ( ) ;
@ -148,22 +128,11 @@ const ObjectBase* GMT_Map(const ObjectList* input)
data . emplace_back ( new std : : string ( layer . EndShift ( ) ) ) ;
data . emplace_back ( new std : : string ( layer . EndShift ( ) ) ) ;
}
}
else data . emplace_back ( layer . data ) ;
else data . emplace_back ( layer . data ) ;
goto next ;
continue ;
}
}
}
}
err = " Unknown argument type: " + i - > Type ( ) ;
goto fail ; // Unknown type of argument
goto fail ; // Unknown type of argument
next :
pos + + ;
// Ascending
if ( pos = = size & & ! lstack . empty ( ) )
{
list = lstack . top ( ) . first ;
pos = lstack . top ( ) . second ;
lstack . pop ( ) ;
size = list - > Size ( ) ;
goto next ;
}
}
}
data . emplace_back ( new std : : string ( footer ) ) ;
data . emplace_back ( new std : : string ( footer ) ) ;
@ -175,7 +144,7 @@ const ObjectBase* GMT_Map(const ObjectList* input)
int ret ;
int ret ;
ret = GhostRun ( " -sDEVICE=bbox " , gs_bbox_callback , & in , 0 , & bboxes , 0 ) ; // Bounding box is writed on stderr
ret = GhostRun ( " -sDEVICE=bbox " , gs_bbox_callback , & in , 0 , & bboxes , 0 ) ; // Bounding box is writed on stderr
if ( 0 ! = ret ) goto fail ; // Something wrong
if ( 0 ! = ret ) { err = " Can't determine BoundingBox " ; goto fail ; } // Something wrong
std : : smatch m ;
std : : smatch m ;
std : : smatch : : const_iterator ci ;
std : : smatch : : const_iterator ci ;
@ -183,7 +152,7 @@ const ObjectBase* GMT_Map(const ObjectList* input)
bool ok = true ;
bool ok = true ;
std : : regex_search ( bboxes , m , r ) ;
std : : regex_search ( bboxes , m , r ) ;
if ( 5 ! = m . size ( ) ) goto fail ; // This is strange and scary
if ( 5 ! = m . size ( ) ) { err = " Something go wrong, this is strange and scary " ; goto fail ; } // This is strange and scary
ci = m . cbegin ( ) ;
ci = m . cbegin ( ) ;
ci + + ; // Skip full match
ci + + ; // Skip full match
@ -191,7 +160,7 @@ const ObjectBase* GMT_Map(const ObjectList* input)
ok = ok & & str2int ( * ci + + , & bbly ) ;
ok = ok & & str2int ( * ci + + , & bbly ) ;
ok = ok & & str2int ( * ci + + , & bbrx ) ;
ok = ok & & str2int ( * ci + + , & bbrx ) ;
ok = ok & & str2int ( * ci + + , & bbry ) ;
ok = ok & & str2int ( * ci + + , & bbry ) ;
if ( ! ok ) goto fail ; // Unexpected!
if ( ! ok ) { err = " Unexpected error! " ; goto fail ; } // Unexpected!
// FIXME: Workaround ghostscript bug 202735
// FIXME: Workaround ghostscript bug 202735
// We add 5 points to each margin because ghostscript does'nt count linewidths when calculate bounding box
// We add 5 points to each margin because ghostscript does'nt count linewidths when calculate bounding box
bblx - = 4005 ;
bblx - = 4005 ;
@ -224,7 +193,7 @@ const ObjectBase* GMT_Map(const ObjectList* input)
}
}
fail :
fail :
return 0 ;
return new ObjectError ( " Map " , err ) ;
}
}
// Creating pdf from eps
// Creating pdf from eps
@ -235,39 +204,24 @@ Optionally, resolution can be specified by pair with name resolution, res or r a
*/
*/
const ObjectBase * GMT_Convert2PDF ( const ObjectList * input )
const ObjectBase * GMT_Convert2PDF ( const ObjectList * input )
{
{
if ( ! gs_abilities . havepdf ) return 0 ; // No pdf support
std : : string err ;
double r ;
RNFPar < SearchGMTMap , ObjectGMTMap > map ( " map " ) ;
bool suc = true ;
ONPar < Base2PosD > r ( " resolution " , 720 ) ;
const ObjectGMTMap * map = 0 ;
ParseNamedParameters params ( input , map , r ) ;
const ObjectGMTMap * m = map ;
{
if ( ! gs_abilities . havepdf ) { err = " No PDF support in Ghostscript " ; goto fail ; } // No pdf support
SearchParameterWDefO < double , DoubleDefaultVal < 720 > , false , PMin < 1 > > res ( input , " r " , " res " , " resolution " ) ;
if ( ! params ) { err = params . Error ( ) ; goto fail ; } // Parsing error
r = res ( & suc ) ;
if ( ! suc ) goto fail ; // Error
}
{
for ( ObjectList : : IndexType i = 0 ; i < input - > Size ( ) ; i + + )
{
OBType < ObjectGMTMap > m ( input - > At ( i ) ) ;
if ( m )
{
if ( 0 ! = map ) goto fail ; // Duplicate
map = m ;
}
}
if ( 0 = = map ) goto fail ; // Map not found
}
{
{
std : : string * out = new std : : string ;
std : : string * out = new std : : string ;
int ret = eps2pdf ( * ( map - > pValue ( ) ) , out , r ) ;
int ret = eps2pdf ( * ( m - > pValue ( ) ) , out , r ) ;
if ( 0 ! = ret ) { delete out ; goto fail ; } // Something wrong
if ( 0 ! = ret ) { err = " Conversion of EPS to PDF failed " ; delete out ; goto fail ; } // Something wrong
return new ObjectGMTMapPDF ( out , map - > Bblx ( ) , map - > Bbly ( ) , map - > Bbrx ( ) , map - > Bbry ( ) ) ;
return new ObjectGMTMapPDF ( out , m - > Bblx ( ) , m - > Bbly ( ) , m - > Bbrx ( ) , m - > Bbry ( ) ) ;
}
}
fail :
fail :
return 0 ;
return new ObjectError ( " EPS2PDF " , err ) ;
}
}
@ -286,112 +240,101 @@ antialiasing or aa - can be used to set graphics and text antialiasing simultane
*/
*/
const ObjectBase * GMT_Convert2PNG ( const ObjectList * input )
const ObjectBase * GMT_Convert2PNG ( const ObjectList * input )
{
{
if ( ! gs_abilities . havepdf ) return 0 ; // No pdf support, so, no png
std : : string gsdev , err ;
double r ;
double res ;
bool suc = true ;
const GMTMap * map = 0 ;
std : : string gsdev ( " " ) ;
bool ispdf ;
uint aat = 0 , aag = 0 ;
std : : string aats ( " full " ) , aags ( " full " ) ;
uint dscale = 0 ;
// Map to convert
ONPar < Base2PosD > r ( " resolution " , 300 ) , ds ( " d[own]scale " , 1.0 ) ;
{
ONPar < Base2Pos > w ( " width " ) , h ( " height " ) ;
for ( ObjectList : : IndexType i = 0 ; i < input - > Size ( ) ; i + + )
ONPar < Base2StringD > cs ( " c[olor][ ]space " , " color " ) , taa ( " t[ext]a[nti]aliasing " , " full " ) , gaa ( " g[raphics]a[nti]aliasing " , " full " ) , aa ( " a[nti]aliasing " , " full " ) ;
{
const ObjectGMTMap * me ;
OBType < ObjectGMTMap > m ( input - > At ( i ) ) ;
const ObjectGMTMapPDF * mp ;
OBType < ObjectGMTMapPDF > p ( input - > At ( i ) ) ;
const GMTMap * m ;
if ( m )
uint aat , aag ;
uint dscale ;
if ( ! gs_abilities . havepdf ) { err = " No PDF support in Ghostscript " ; goto fail ; } // No pdf support, so, no png
// Search map
{
{
if ( 0 ! = map ) goto fail ; // Duplicate
RNFPar < SearchGMTMap , ObjectGMTMap > mapeps ( " map " ) ;
map = m ;
RNFPar < SearchGMTMapPDF , ObjectGMTMap > mappdf ( " map " ) ;
ispdf = false ;
ParseNamedParameters peps ( input , mapeps ) ;
ParseNamedParameters ppdf ( input , mappdf ) ;
if ( ! ( peps | | ppdf ) ) { err = " Error parsing map parameter " ; goto fail ; }
me = mapeps ; mp = mappdf ;
if ( nullptr = = me & & nullptr = = mp ) { err = " Map parameter not specified " ; goto fail ; } // This must never happened
if ( nullptr ! = me ) m = me ; else m = mp ;
}
}
if ( p )
// Parse other parameters
{
{
if ( 0 ! = map ) goto fail ; // Duplicate
ParseNamedParameters params ( input , r , ds , w , h , cs , taa , gaa , aa ) ;
map = p ;
if ( ! params ) { err = params . Error ( ) ; goto fail ; }
ispdf = true ;
}
}
if ( 0 = = map ) goto fail ; // Map not found
}
}
// Determine resolution
// Determine resolution
{
{
SearchParameter < double , false , PMin < 1 > > res ( input , " r " , " res " , " resolution " ) ;
BaseM2Double w ( input , " width " , " w " ) , h ( input , " height " , " h " ) ;
// Check existence
// Check existence
if ( ( res . Exist ( ) & & w . Exist ( ) ) | | ( res . Exist ( ) & & h . Exist ( ) ) | | ( w . Exist ( ) & & h . Exist ( ) ) ) goto fail ; // Only one parameter allowed
if ( ( r . Exist ( ) & & w . Exist ( ) ) | | ( r . Exist ( ) & & h . Exist ( ) ) | | ( w . Exist ( ) & & h . Exist ( ) ) ) { err = " Only one of resolution, width or height may be specified " ; goto fail ; } // Only one parameter allowed
r = 300 ; // Default value
if ( r . Exist ( ) ) res = r ;
if ( res . Exist ( ) ) r = res ( & suc ) ;
if ( w . Exist ( ) ) res = w * 72.0 / ( m - > Bbrx ( ) - m - > Bblx ( ) ) ;
if ( w . Exist ( ) ) r = w ( & suc ) * 72.0 / ( map - > Bbrx ( ) - map - > Bblx ( ) ) ;
if ( h . Exist ( ) ) res = h * 72.0 / ( m - > Bbry ( ) - m - > Bbly ( ) ) ;
if ( h . Exist ( ) ) r = h ( & suc ) * 72.0 / ( map - > Bbry ( ) - map - > Bbly ( ) ) ;
if ( ! suc ) goto fail ; // Error
}
}
// Color model
// Color model
{
{
std : : string cs ;
std : : string cspace = cs ;
BaseMD2String cspace ( input , " 8bit " , " colorspace " , " cspace " , " cs " ) ;
tolower ( cspace ) ;
cs = cspace ( & suc ) ;
if ( ( " mono " = = cspace | | " monochrome " = = cspace ) & & gs_abilities . havepngmono ) gsdev = " pngmono " ;
if ( ! suc ) goto fail ; // Error
if ( ( " monod " = = cspace | | " monodiffused " = = cspace ) & & gs_abilities . havepngmonod ) gsdev = " pngmonod " ;
tolower ( cs ) ;
if ( ( " 16c " = = cspace | | " 16 " = = cspace ) & & gs_abilities . havepng16 ) gsdev = " png16 " ;
if ( ( " mono " = = cs | | " monochrome " = = cs ) & & gs_abilities . havepngmono ) gsdev = " pngmono " ;
if ( ( " 256c " = = cspace | | " 256 " = = cspace ) & & gs_abilities . havepng256 ) gsdev = " png256 " ;
if ( ( " monod " = = cs | | " monodiffused " = = cs ) & & gs_abilities . havepngmonod ) gsdev = " pngmonod " ;
if ( ( " gray " = = cspace | | " grey " = = cspace | | " g " = = cspace ) & & gs_abilities . havepnggray ) gsdev = " pnggray " ;
if ( ( " 16c " = = cs | | " 16 " = = cs ) & & gs_abilities . havepng16 ) gsdev = " png16 " ;
if ( ( " full " = = cspace | | " 8bit " = = cspace | | " color " = = cspace ) & & gs_abilities . havepng16m ) gsdev = " png16m " ;
if ( ( " 256c " = = cs | | " 256 " = = cs ) & & gs_abilities . havepng256 ) gsdev = " png256 " ;
if ( gsdev . empty ( ) ) { err = " Colorspace " + cs . Value ( ) + " is bad or unsupported " ; goto fail ; } // Incorrect value
if ( ( " gray " = = cs | | " grey " = = cs | | " g " = = cs ) & & gs_abilities . havepnggray ) gsdev = " pnggray " ;
if ( ( " full " = = cs | | " 8bit " = = cs | | " color " = = cs ) & & gs_abilities . havepng16m ) gsdev = " png16m " ;
if ( " " = = gsdev ) goto fail ; // Incorrect value
}
}
// Antialiasing
// Antialiasing
{
{
BaseM2String aa ( input , " antialiasing " , " aa " ) , taa ( input , " textantialiasing " , " taa " ) , gaa ( input , " graphicsantialiasing " , " gaa " ) ;
std : : string aags = aa , aats = aa ;
if ( aa . Exist ( ) ) aags = aats = aa ( & suc ) ;
if ( taa . Exist ( ) ) aats = taa ;
if ( taa . Exist ( ) ) aats = taa ( & suc ) ;
if ( gaa . Exist ( ) ) aags = gaa ;
if ( gaa . Exist ( ) ) aags = gaa ( & suc ) ;
if ( ! suc ) goto fail ; // Error
tolower ( aags ) ; tolower ( aats ) ;
tolower ( aags ) ; tolower ( aats ) ;
if ( " none " = = aags | | " no " = = aags | | " n " = = aags ) aag = 1 ; if ( " none " = = aats | | " no " = = aats | | " n " = = aats ) aat = 1 ;
if ( " none " = = aags | | " no " = = aags | | " n " = = aags ) aag = 1 ; if ( " none " = = aats | | " no " = = aats | | " n " = = aats ) aat = 1 ;
if ( " small " = = aags | | " s " = = aags ) aag = 2 ; if ( " small " = = aats | | " s " = = aats ) aat = 2 ;
if ( " small " = = aags | | " s " = = aags ) aag = 2 ; if ( " small " = = aats | | " s " = = aats ) aat = 2 ;
if ( " full " = = aags | | " f " = = aags ) aag = 4 ; if ( " full " = = aats | | " f " = = aats ) aat = 4 ;
if ( " full " = = aags | | " f " = = aags ) aag = 4 ; if ( " full " = = aats | | " f " = = aats ) aat = 4 ;
if ( 0 = = aat | | 0 = = aag ) goto fail ; // Incorrect value
if ( 0 = = aat ) { err = " Incorrect value for text antialiasing: " + aats ; goto fail ; }
if ( 0 = = aag ) { err = " Incorrect value for graphics antialiasing: " + aags ; goto fail ; }
}
}
// Downscale
// Downscale
if ( " pngmonod " = = gsdev | | " pnggray " = = gsdev | | " png16m " = = gsdev )
if ( " pngmonod " = = gsdev | | " pnggray " = = gsdev | | " png16m " = = gsdev )
{
{
SearchParameterWDefO < double , DoubleDefaultVal < 1 > , false , PMin < 1 > , PMax < 10 > , PInt > ds ( input , " downscale " , " dscale " , " ds " ) ;
dscale = static_cast < uint > ( ds ) ;
dscale = static_cast < uint > ( ds ( & suc ) ) ;
if ( dscale < 1 | | dscale > 10 ) { err = " Downscale must be in interval from 1 to 10 " ; goto fail ; }
if ( ! suc ) goto fail ; // Error
res * = dscale ;
r * = dscale ;
}
}
// Go!
// Go!
{
{
std : : string * pdf = 0 ;
std : : string * pdf = 0 ;
int ret ;
int ret ;
if ( ! ispdf )
if ( nullptr ! = me )
{
{
pdf = new std : : string ;
pdf = new std : : string ;
ret = eps2pdf ( * ( map - > pValue ( ) ) , pdf , r , aat , aag ) ;
ret = eps2pdf ( * ( me - > pValue ( ) ) , pdf , r , aat , aag ) ;
if ( 0 ! = ret ) { delete pdf ; goto fail ; } // Something wrong
if ( 0 ! = ret ) { err = " Can't convert EPS to PDF " ; delete pdf ; goto fail ; } // Something wrong
}
}
{
{
std : : string * out = new std : : string ;
std : : string * out = new std : : string ;
ret = GhostRun ( " -r " + ToString ( r ) + " -dTextAlphaBits= " + ToString ( aat ) + " -dGraphicAlphaBits= " + ToString ( aag ) + " -sDEVICE= " + gsdev + ( ( dscale > 1 ) ? ( " -dDownScaleFactor= " + ToString ( dscale ) ) : " " ) , ( ( 0 ! = pdf ) ? * pdf : * ( ma p - > pValue ( ) ) ) , 0 , 0 , out ) ;
ret = GhostRun ( " -r " + ToString ( res ) + " -dTextAlphaBits= " + ToString ( aat ) + " -dGraphicAlphaBits= " + ToString ( aag ) + " -sDEVICE= " + gsdev + ( ( dscale > 1 ) ? ( " -dDownScaleFactor= " + ToString ( dscale ) ) : " " ) , ( ( 0 ! = pdf ) ? * pdf : * ( mp - > pValue ( ) ) ) , 0 , 0 , out ) ;
if ( 0 ! = pdf ) delete pdf ;
if ( 0 ! = pdf ) delete pdf ;
if ( 0 ! = ret ) { delete out ; goto fail ; } // Something wrong
if ( 0 ! = ret ) { err = " Can't convert PDF to PNG " ; delete out ; goto fail ; } // Something wrong
return new ObjectGMTImage ( out ) ;
return new ObjectGMTImage ( out ) ;
}
}
}
}
fail :
fail :
return 0 ;
return new ObjectError ( " EPS2PNG " , err ) ;
}
}
@ -410,104 +353,94 @@ antialiasing or aa - can be used to set graphics and text antialiasing simultane
*/
*/
const ObjectBase * GMT_Convert2JPG ( const ObjectList * input )
const ObjectBase * GMT_Convert2JPG ( const ObjectList * input )
{
{
if ( ! gs_abilities . havepdf ) return 0 ; // No pdf support, so, no jpeg
std : : string gsdev , err ;
double r ;
bool suc = true ;
ONPar < Base2PosD > r ( " resolution " , 300 ) ;
const GMTMap * map = 0 ;
ONPar < Base2Pos > w ( " width " ) , h ( " height " ) ;
std : : string gsdev ( " " ) ;
ONPar < Base2StringD > cs ( " c[olor][ ]space " , " color " ) , taa ( " t[ext]a[nti]aliasing " , " full " ) , gaa ( " g[raphics]a[nti]aliasing " , " full " ) , aa ( " a[nti]aliasing " , " full " ) ;
bool ispdf ;
ONPar < Base2NonNegD > q ( " quality " , 75 ) ;
uint aat = 0 , aag = 0 ;
const ObjectGMTMap * me ;
std : : string aats ( " full " ) , aags ( " full " ) ;
const ObjectGMTMapPDF * mp ;
const GMTMap * m ;
double res ;
uint aat , aag ;
uint qual ;
uint qual ;
// Map to convert
if ( ! gs_abilities . havepdf ) { err = " No PDF support in Ghostscript " ; goto fail ; } // No pdf support, so, no jpeg
{
// Search map
for ( ObjectList : : IndexType i = 0 ; i < input - > Size ( ) ; i + + )
{
{
OBType < ObjectGMTMap > m ( input - > At ( i ) ) ;
RNFPar < SearchGMTMap , ObjectGMTMap > mapeps ( " map " ) ;
OBType < ObjectGMTMapPDF > p ( input - > At ( i ) ) ;
RNFPar < SearchGMTMapPDF , ObjectGMTMap > mappdf ( " map " ) ;
if ( m )
ParseNamedParameters peps ( input , mapeps ) ;
{
ParseNamedParameters ppdf ( input , mappdf ) ;
if ( 0 ! = map ) goto fail ; // Duplicate
if ( ! ( peps | | ppdf ) ) { err = " Error parsing map parameter " ; goto fail ; }
map = m ;
me = mapeps ; mp = mappdf ;
ispdf = false ;
if ( nullptr = = me & & nullptr = = mp ) { err = " Map parameter not specified " ; goto fail ; } // This must never happened
if ( nullptr ! = me ) m = me ; else m = mp ;
}
}
if ( p )
// Parse other parameters
{
{
if ( 0 ! = map ) goto fail ; // Duplicate
ParseNamedParameters params ( input , r , q , w , h , cs , taa , gaa , aa ) ;
map = p ;
if ( ! params ) { err = params . Error ( ) ; goto fail ; }
ispdf = true ;
}
}
if ( 0 = = map ) goto fail ; // Map not found
}
}
// Determine resolution
// Determine resolution
{
{
SearchParameter < double , false , PMin < 1 > > res ( input , " r " , " res " , " resolution " ) ;
BaseM2Double w ( input , " width " , " w " ) , h ( input , " height " , " h " ) ;
// Check existence
// Check existence
if ( ( res . Exist ( ) & & w . Exist ( ) ) | | ( res . Exist ( ) & & h . Exist ( ) ) | | ( w . Exist ( ) & & h . Exist ( ) ) ) goto fail ; // Only one parameter allowed
if ( ( r . Exist ( ) & & w . Exist ( ) ) | | ( r . Exist ( ) & & h . Exist ( ) ) | | ( w . Exist ( ) & & h . Exist ( ) ) ) { err = " Only one of resolution, width or height may be specified " ; goto fail ; } // Only one parameter allowed
r = 300 ; // Default value
if ( r . Exist ( ) ) res = r ;
if ( res . Exist ( ) ) r = res ( & suc ) ;
if ( w . Exist ( ) ) res = w * 72.0 / ( m - > Bbrx ( ) - m - > Bblx ( ) ) ;
if ( w . Exist ( ) ) r = w ( & suc ) * 72.0 / ( map - > Bbrx ( ) - map - > Bblx ( ) ) ;
if ( h . Exist ( ) ) res = h * 72.0 / ( m - > Bbry ( ) - m - > Bbly ( ) ) ;
if ( h . Exist ( ) ) r = h ( & suc ) * 72.0 / ( map - > Bbry ( ) - map - > Bbly ( ) ) ;
if ( ! suc ) goto fail ; // Error
}
}
// Color model
// Color model
{
{
std : : string cs ;
std : : string cspace = cs ;
BaseMD2String cspace ( input , " 8bit " , " colorspace " , " cspace " , " cs " ) ;
tolower ( cspace ) ;
cs = cspace ( & suc ) ;
if ( ( " gray " = = cspace | | " grey " = = cspace | | " g " = = cspace ) & & gs_abilities . havejpeggray ) gsdev = " jpeggray " ;
if ( ! suc ) goto fail ; // Error
if ( ( " full " = = cspace | | " 8bit " = = cspace | | " color " = = cspace ) & & gs_abilities . havejpeg ) gsdev = " jpeg " ;
tolower ( cs ) ;
if ( gsdev . empty ( ) ) { err = " Colorspace " + cs . Value ( ) + " is bad or unsupported " ; goto fail ; } // Incorrect value
if ( ( " gray " = = cs | | " grey " = = cs | | " g " = = cs ) & & gs_abilities . havejpeggray ) gsdev = " jpeggray " ;
if ( ( " full " = = cs | | " 8bit " = = cs | | " color " = = cs ) & & gs_abilities . havejpeg ) gsdev = " jpeg " ;
if ( " " = = gsdev ) goto fail ; // Incorrect value
}
}
// Antialiasing
// Antialiasing
{
{
BaseM2String aa ( input , " antialiasing " , " aa " ) , taa ( input , " textantialiasing " , " taa " ) , gaa ( input , " graphicsantialiasing " , " gaa " ) ;
std : : string aags = aa , aats = aa ;
if ( aa . Exist ( ) ) aags = aats = aa ( & suc ) ;
if ( taa . Exist ( ) ) aats = taa ;
if ( taa . Exist ( ) ) aats = taa ( & suc ) ;
if ( gaa . Exist ( ) ) aags = gaa ;
if ( gaa . Exist ( ) ) aags = gaa ( & suc ) ;
if ( ! suc ) goto fail ; // Error
tolower ( aags ) ; tolower ( aats ) ;
tolower ( aags ) ; tolower ( aats ) ;
if ( " none " = = aags | | " no " = = aags | | " n " = = aags ) aag = 1 ; if ( " none " = = aats | | " no " = = aats | | " n " = = aats ) aat = 1 ;
if ( " none " = = aags | | " no " = = aags | | " n " = = aags ) aag = 1 ; if ( " none " = = aats | | " no " = = aats | | " n " = = aats ) aat = 1 ;
if ( " small " = = aags | | " s " = = aags ) aag = 2 ; if ( " small " = = aats | | " s " = = aats ) aat = 2 ;
if ( " small " = = aags | | " s " = = aags ) aag = 2 ; if ( " small " = = aats | | " s " = = aats ) aat = 2 ;
if ( " full " = = aags | | " f " = = aags ) aag = 4 ; if ( " full " = = aats | | " f " = = aats ) aat = 4 ;
if ( " full " = = aags | | " f " = = aags ) aag = 4 ; if ( " full " = = aats | | " f " = = aats ) aat = 4 ;
if ( 0 = = aat | | 0 = = aag ) goto fail ; // Incorrect value
if ( 0 = = aat ) { err = " Incorrect value for text antialiasing: " + aats ; goto fail ; }
if ( 0 = = aag ) { err = " Incorrect value for graphics antialiasing: " + aags ; goto fail ; }
}
}
// Quality
// Quality
{
{
SearchParameterWDefO < double , DoubleDefaultVal < 75 > , false , PMin < 0 > , PMax < 100 > , PInt > q ( input , " quality " , " qual " , " q " ) ;
qual = static_cast < uint > ( q ) ;
qual = static_cast < uint > ( q ( & suc ) ) ;
if ( q > 100 ) { err = " JPEG quality must not exceed 100 " ; goto fail ; } // Error
if ( ! suc ) goto fail ; // Error
}
}
// Go!
// Go!
{
{
std : : string * pdf = 0 ;
std : : string * pdf = 0 ;
int ret ;
int ret ;
if ( ! ispdf )
if ( nullptr ! = me )
{
{
pdf = new std : : string ;
pdf = new std : : string ;
ret = eps2pdf ( * ( map - > pValue ( ) ) , pdf , r , aat , aag ) ;
ret = eps2pdf ( * ( me - > pValue ( ) ) , pdf , r , aat , aag ) ;
if ( 0 ! = ret ) { delete pdf ; goto fail ; } // Something wrong
if ( 0 ! = ret ) { err = " Can't convert EPS to PDF " ; delete pdf ; goto fail ; } // Something wrong
}
}
{
{
std : : string * out = new std : : string ;
std : : string * out = new std : : string ;
ret = GhostRun ( " -r " + ToString ( r ) + " -dTextAlphaBits= " + ToString ( aat ) + " -dGraphicAlphaBits= " + ToString ( aag ) + " -sDEVICE= " + gsdev + " -dJPEGQ= " + ToString ( qual ) , ( ( 0 ! = pdf ) ? * pdf : * ( ma p - > pValue ( ) ) ) , 0 , 0 , out ) ;
ret = GhostRun ( " -r " + ToString ( res ) + " -dTextAlphaBits= " + ToString ( aat ) + " -dGraphicAlphaBits= " + ToString ( aag ) + " -sDEVICE= " + gsdev + " -dJPEGQ= " + ToString ( qual ) , ( ( 0 ! = pdf ) ? * pdf : * ( mp - > pValue ( ) ) ) , 0 , 0 , out ) ;
if ( 0 ! = pdf ) delete pdf ;
if ( 0 ! = pdf ) delete pdf ;
if ( 0 ! = ret ) { delete out ; goto fail ; } // Something wrong
if ( 0 ! = ret ) { err = " Can't convert PDF to JPEG " ; delete out ; goto fail ; } // Something wrong
return new ObjectGMTImage ( out ) ;
return new ObjectGMTImage ( out ) ;
}
}
}
}
fail :
fail :
return 0 ;
return new ObjectError ( " EPS2JPEG " , err ) ;
}
}