pictographs/AknPictograph/group/AknPictographConfig.pl
author hgs
Fri, 09 Jul 2010 18:26:31 +0800
changeset 85 d8333970eafb
parent 0 05e9090e2422
permissions -rw-r--r--
201027_1

#
# Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved.
# This component and the accompanying materials are made available
# under the terms of "Eclipse Public License v1.0"
# which accompanies this distribution, and is available
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
#
# Initial Contributors:
# Nokia Corporation - initial contribution.
#
# Contributors:
#
# Description: 
#    Configures the pictograph building environment during the build process.
#
use strict;
use File::Path;
my ($myname, $mydir);
#
#  Determine where this program is
#
BEGIN {
  ($myname = $0) =~ s@.*(\\|/)@@;
  ($mydir = $0)  =~ s@(\\|/)[^(\\|/)]*$@@;
  $mydir =~ s@\\@/@g; #replace \ with /
  $mydir = "." if ($mydir eq $myname); 
}         

#constants for directory paths
use constant CONFIG_ROOT_DIR					 			=> "$mydir/../config";
use constant CONFIG_FILE_NAME					 			=> "config.ini";
use constant PICTOGRAPH_BITMAPS_ROOT	 			=> "$mydir/../../aknpictographbitmaps";
use constant PICTOGRAPH_BITMAPS_DATA	 			=> PICTOGRAPH_BITMAPS_ROOT."/data";
use constant GENERATED_FILES_DIR     	 			=> "$mydir/../generated";

# supported keys in config.ini
use constant PICT_HEIGHTS  						 			=> "PICTOGRAPH_HEIGHTS";
use constant PICTOGRAPH_BITMAPS_SOURCE_DIR  => "PICTOGRAPH_BITMAPS_SOURCE_DIR";
use constant PICT_BITMAP_DISPLAY_MODE  			=> "PICTOGRAPH_BITMAP_DISPLAY_MODE";
use constant PICT_BITMAP_MASK_DISPLAY_MODE  => "PICTOGRAPH_BITMAP_MASK_DISPLAY_MODE";

# supported display modes for pictograph bitmaps/masks
use constant ECOLOR256  										=> "EColor256";
use constant ECOLOR64K  										=> "EColor64K";
use constant EGRAY2        									=> "EGray2";
use constant EGRAY256      									=> "EGray256";

#heade file template related
use constant COLORMODE_BITMAP_TAG_VALUE   	=> "COLORMODE_BITMAP_TAG_VALUE";
use constant COLORMODE_MASK_TAG_VALUE     	=> "COLORMODE_MASK_TAG_VALUE";
use constant DISPLAY_MODE_BITMAP_VALUE   	  => "DISPLAY_MODE_BITMAP_VALUE";
use constant DISPLAY_MODE_MASK_VALUE      	=> "DISPLAY_MODE_MASK_VALUE";
use constant CONF_HEADER_FILE_NAME					=> "aknpictographconfig.h";
use constant CONF_HEADER_FILE_NAME_DEF			=> "AKNPICTOGRAPHCONFIG_H";
use constant CONF_HEADER_FILE_TEMPLATE			=>
				"// This file is generated by AknPictographConfig.pl. Do not edit!!\n\n\n\n\n".
				"#ifndef @{[CONF_HEADER_FILE_NAME_DEF]}\n".
				"#define @{[CONF_HEADER_FILE_NAME_DEF]}\n\n".
				"#include <gdi.h>\n\n".
				"// Color mode tags for BMCONV tool\n".
				"_LIT8( KBitmapTag, @{[COLORMODE_BITMAP_TAG_VALUE]} );\n".
				"_LIT8( KMaskTag, @{[COLORMODE_MASK_TAG_VALUE]} );\n\n".
				"// Display modes for pictograph bitmap/mask creation\n".
				"const TDisplayMode KBitmapDisplayMode = @{[DISPLAY_MODE_BITMAP_VALUE]};\n".
				"const TDisplayMode KMaskDisplayMode   = @{[DISPLAY_MODE_MASK_VALUE]};\n\n".
				"#endif // @{[CONF_HEADER_FILE_NAME_DEF]}\n\n".
				"// End of file\n";

# hash for supported display modes for pictograph bitmaps
my %supported_bitmap_display_modes = 
						(
						uc (ECOLOR256) => +ECOLOR256,
						uc (ECOLOR64K) => +ECOLOR64K
						);			
# hash for supported display modes for pictograph masks
my %supported_bitmap_mask_display_modes = 
						(
						uc (EGRAY2)   => +EGRAY2,
						uc (EGRAY256) => +EGRAY256
						);																
						
# hash for supported bitmap/mask color mode tags for BMCONV tool
my %supported_color_mode_tags = 
						(
						@{[ECOLOR256]}   => qq("/c8"),
						@{[ECOLOR64K]}   => qq("/c16"),
						@{[EGRAY2]}      => qq("/1"),
						@{[EGRAY256]}    => qq("/8")						
						);																

my $usage = "Usage:\n".
				    "   perl AknPictographConfig.pl <config_dir_name>\n\n".
				    "   <config_dir_name> = directory below directory '<location of AknPictographConfig.pl>/../config'\n\n";
  				    
###############################################################################
# main code
###############################################################################				    
my $config_dir_name = shift || die $usage;
$config_dir_name = lc $config_dir_name;

my $values_ref = ParseConfigFile($config_dir_name);
PrintConfigInfo($values_ref,$config_dir_name);
GenerateConfigHeader($values_ref);
PrepareBuildEnvironment($values_ref,$config_dir_name);

###############################################################################
# subroutines
###############################################################################				    

#
# Subroutine for parsing pictograph configuration file 
#
# parameters 
# $_[0] - name of the configuration directory under CONFIG_ROOT_DIR
#
# return: reference to a hash of key value pairs 
#
sub ParseConfigFile{
	my $config_dir_name = shift || die "ParseConfigFile: argument error!";
	my $filename = CONFIG_ROOT_DIR."/$config_dir_name/".CONFIG_FILE_NAME;
	my $content;
	my %values;
	open(FILE, $filename) || die "Unable to open file $filename: $!";
	{                                                         
	  local $/ ;                                            
	  undef $/ ;  # reads the whole file on the next line   
	  $content = <FILE> ;                                         
	}             
	close FILE;
	
	#remove comments from $content
	#Note: comments start with // and ends with line end
	$content =~ s@//.*?$@@mg;
			
	# Regular expression for matching a token after '=' in $1.
	# The token is trimmed from left and right
	my $match_token = '[^\S\n]*=[^\S\n]*(\w.*?)[^\S\n]*$';
	
	#match PICT_HEIGHTS key value pair
	#value is list of heights
	my $tmp = PICT_HEIGHTS;
	$content =~ /$tmp$match_token/mi || die "$tmp or value is not specified in $filename !\n";
	$_=$1;
	@{$values{$tmp}} = split;
	die "At least a single pictograph height must be specified for $tmp in $filename\n" if @{$values{$tmp}}==0;
	
	#match PICTOGRAPH_BITMAPS_SOURCE_DIR key value pair
	$tmp = PICTOGRAPH_BITMAPS_SOURCE_DIR;
	$values{$tmp} = $config_dir_name; #default value
	$values{$tmp} = $1 if ($content =~ /$tmp$match_token/mi);
	
	#match PICT_BITMAP_DISPLAY_MODE key value pair
	$tmp = PICT_BITMAP_DISPLAY_MODE;
	$values{$tmp} = ECOLOR256; #default value
	if ($content =~ /$tmp$match_token/mi){
		$_ = $supported_bitmap_display_modes{uc $1} || die "Value \'$1\' is not supported for $tmp!\n";
		$values{$tmp} = $_;
	}
	
	#match PICT_BITMAP_MASK_DISPLAY_MODE key value pair
	$tmp = PICT_BITMAP_MASK_DISPLAY_MODE;
	$values{$tmp} = EGRAY2; #default value
	if ($content =~ /$tmp$match_token/mi){
		$_ = $supported_bitmap_mask_display_modes{uc $1} || die "Value \'$1\' is not supported for $tmp!\n";
		$values{$tmp} = $_;
	}
	return \%values;
}

#
# Subroutine for preparing build environment for building pictographs
# bitmaps.
#
# parameters 
# $_[0] - reference to a hash of key value pairs
# $_[1] - name of the configuration directory under CONFIG_ROOT_DIR
#				    
sub PrepareBuildEnvironment{
	die "PrepareBuildEnvironment: argument error!" if @_!=2;
	my ($values_ref,$config_dir_name) = @_;		
	my $bitmap_target = PICTOGRAPH_BITMAPS_DATA;
	$bitmap_target =~ s@/@\\@g; #replace '/' with '\\' for Xcopy, del
	my $config_source = CONFIG_ROOT_DIR;
	$config_source =~ s@/@\\@g; #replace '/' with '\\' for Xcopy, del
	
	print "Cleanup...\n";
	
	system("del /q /f $bitmap_target\\*.* > nul 2>&1");
	system("del /q /f $config_source\\*.* > nul 2>&1");
	
	my @pict_height_list = @{$values_ref->{+PICT_HEIGHTS}};
	print "Extracting pictographs for $config_dir_name with heights: @pict_height_list in progress...\n";
	
	my $command = "unzip -o -qq @{[PICTOGRAPH_BITMAPS_ROOT]}/$values_ref->{+PICTOGRAPH_BITMAPS_SOURCE_DIR}/*.zip -d @{[PICTOGRAPH_BITMAPS_DATA]}";
	system("$command > nul 2>&1") == 0 or	die qq(Command "$command" has failed: $?\n);
			
	foreach (@pict_height_list){
		my $command = "xcopy $config_source\\$config_dir_name\\picto"."$_".".ini $config_source\\";
		system("$command > nul 2>&1") == 0 or	die qq(Command "$command" has failed: $?\n);	
	}	
	print "Configuring build environment is successful.\n";
}

#
# Subroutine for generating configuration header file
#
# parameters 
# $_[0] - reference to a hash of key value pairs
#				    
sub GenerateConfigHeader{
	my $values_ref = shift || die "GenerateConfigHeader: argument error!";
	my $conf_header_content = CONF_HEADER_FILE_TEMPLATE;
	
	my $tmp = $values_ref->{+PICT_BITMAP_DISPLAY_MODE};
	$conf_header_content =~ s/@{[DISPLAY_MODE_BITMAP_VALUE]}/$tmp/si; #insert bitmap display mode
  $conf_header_content =~ s/@{[COLORMODE_BITMAP_TAG_VALUE]}/$supported_color_mode_tags{$tmp}/si; #insert bitmap color mode tag
	$tmp = $values_ref->{+PICT_BITMAP_MASK_DISPLAY_MODE};
	$conf_header_content =~ s/@{[DISPLAY_MODE_MASK_VALUE]}/$tmp/si; #insert mask display mode
  $conf_header_content =~ s/@{[COLORMODE_MASK_TAG_VALUE]}/$supported_color_mode_tags{$tmp}/si; #insert mask color mode tag
  
  mkpath GENERATED_FILES_DIR;
  $tmp = GENERATED_FILES_DIR."/".CONF_HEADER_FILE_NAME;
  open(OUTFILE, ">$tmp") || die "Unable to create file $tmp: $!";
	print OUTFILE $conf_header_content;
	close OUTFILE;                                                    	
}

# Subroutine for printing info to stdout about the current 
# pictograph build configuration
#
# parameters 
# $_[0] - reference to a hash of key value pairs
# $_[1] - name of the configuration directory under CONFIG_ROOT_DIR
#				    
sub PrintConfigInfo{
	die "PrintConfigInfo: argument error!" if @_!=2;
	my ($values_ref,$config_dir_name) = @_;		
	print "Pictograph configuration dir:       $config_dir_name\n";
	print "Pictographs heights:                @{$values_ref->{+PICT_HEIGHTS}}\n";
	print "Pictograph bitmaps color mode:      $values_ref->{+PICT_BITMAP_DISPLAY_MODE}\n";
	print "Pictograph bitmap masks color mode: $values_ref->{+PICT_BITMAP_MASK_DISPLAY_MODE}\n";	
}