svgtopt/SVG/SVGEngine/src/SVGAttributeVerifier.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 14 Apr 2010 16:53:18 +0300
branchRCL_3
changeset 15 d240fe32a15c
parent 0 d46562c3d99d
permissions -rw-r--r--
Revision: 201013 Kit: 201015

/*
* Copyright (c) 2003 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:  SVG Implementation header file
 *
*/


#include "SVGAttributeVerifier.h"
#include <limits.h>
#include <hal.h>
#include <hal_data.h>
// --------------------------------------------------------------------------
// TBool CSvgAttributeVerifier::ParseForDecimalValue( const TDesC& aNum2Str, TReal32& aValue )
// ---------------------------------------------------------------------------
TBool CSvgAttributeVerifier::ParseForDecimalValue( const TDesC& aNum2Str, TReal32& aValue, const TDesC& aAttrValue, TBool isSvgElement )
	{
	TLex parser( aNum2Str );
	parser.SkipSpace();
	TInt result = parser.Val( aValue, '.' );
	TChar chr;
    TBool numUnits = EFalse ;
    TPtrC16 remChars = parser.Remainder();
    
    TInt dimInTwips ;
    TInt dimInPixels;
    const TReal32 TwipsInCentimeters = 566.929133858268 ;
    const TReal32 TwipsInInches = 1440 ;
    const TReal32 TwipsInPt = 20 ;
    const TReal32 TwipsInPc = 240 ;
    
    _LIT(Kcm,"cm");
    _LIT(Kmm,"mm");
    _LIT(Kin,"in");
    _LIT(KPx,"px");
    _LIT(KPt,"pt");
    _LIT(KPc,"pc");
    _LIT(KPer,"%");
    
    _LIT(KWidth, "width");
    _LIT(KHeight, "height");
    
    if(isSvgElement)
    {
	    if(aAttrValue == KWidth)
	    {
	  		if(remChars == Kcm)
	    	{
		    	numUnits = ETrue;
		    	HAL::Get( HALData::EDisplayXTwips, dimInTwips );
				HAL::Get( HALData::EDisplayXPixels, dimInPixels );
				
				aValue *=  (dimInPixels*TwipsInCentimeters)/dimInTwips ;
				
	    	}
		    else if(remChars == Kmm)
		    {
		    	numUnits = ETrue;
		    	HAL::Get( HALData::EDisplayXTwips, dimInTwips );
				HAL::Get( HALData::EDisplayXPixels, dimInPixels );
				
				aValue *=  (dimInPixels*TwipsInCentimeters/10)/dimInTwips ;
		    }
		    else if(remChars == Kin)
		    {
		    	numUnits = ETrue;
		    	
				HAL::Get( HALData::EDisplayXTwips, dimInTwips );
				HAL::Get( HALData::EDisplayXPixels, dimInPixels );
				aValue *=  (dimInPixels*TwipsInInches)/dimInTwips ;
		    }
		    else if(remChars == KPt)
		    {
		    	numUnits = ETrue;
		    	
				HAL::Get( HALData::EDisplayXTwips, dimInTwips );
				HAL::Get( HALData::EDisplayXPixels, dimInPixels );
				aValue *=  (dimInPixels*TwipsInPt)/dimInTwips ;
		    }
		    else if(remChars == KPc)
		    {
		    	numUnits = ETrue;
		    	
				HAL::Get( HALData::EDisplayXTwips, dimInTwips );
				HAL::Get( HALData::EDisplayXPixels, dimInPixels );
				aValue *=  (dimInPixels*TwipsInPc)/dimInTwips ;
		    }
		    else if(remChars == KPx || remChars == KPer)
		    {
		    	numUnits = ETrue;
		    }
		}
	    else if(aAttrValue == KHeight)
	    {
	    	if(remChars == Kcm)
	    	{
		    	numUnits = ETrue;
		    
		    	HAL::Get( HALData::EDisplayYTwips, dimInTwips );
				HAL::Get( HALData::EDisplayYPixels, dimInPixels );
				
				aValue *=  (dimInPixels*TwipsInCentimeters)/dimInTwips ;
	    	}
		    else if(remChars == Kmm)
		    {
		    	numUnits = ETrue;
		    	
		    	HAL::Get( HALData::EDisplayYTwips, dimInTwips );
				HAL::Get( HALData::EDisplayYPixels, dimInPixels );
				
				aValue *=  (dimInPixels*TwipsInCentimeters/10)/dimInTwips ;
		    }
		    else if(remChars == Kin)
		    {
		    	numUnits = ETrue;
		    	
				HAL::Get( HALData::EDisplayYTwips, dimInTwips );
				HAL::Get( HALData::EDisplayYPixels, dimInPixels );
				aValue *=  (dimInPixels*TwipsInInches)/dimInTwips ;
		    }
		    else if(remChars == KPt)
		    {
		    	numUnits = ETrue;
		    	
				HAL::Get( HALData::EDisplayYTwips, dimInTwips );
				HAL::Get( HALData::EDisplayYPixels, dimInPixels );
				aValue *=  (dimInPixels*TwipsInPt)/dimInTwips ;
		    }
		    else if(remChars == KPc)
		    {
		    	numUnits = ETrue;
		    	
				HAL::Get( HALData::EDisplayYTwips, dimInTwips );
				HAL::Get( HALData::EDisplayYPixels, dimInPixels );
				aValue *=  (dimInPixels*TwipsInPc)/dimInTwips ;
		    }
		    else if(remChars == KPx || remChars == KPer)
		    {
		    	numUnits = ETrue;
		    }
		}
    }
    
    
    if(!numUnits)
	while(!(parser.Eos()))
	{
		chr=parser.Get();
		if(!chr.IsDigit())
		{
			aValue=0;
			return result==KErrNotFound;	
		}
		parser.Inc();
	}

	if (result != KErrNone)
		{
		aValue= 0;
		}
	parser.SkipSpace();
	return result == KErrNone;
	}




// --------------------------------------------------------------------------
// TBool CSvgAttributeVerifier::ValidAttrValue( const TDesC& aValue,
// ---------------------------------------------------------------------------
TBool CSvgAttributeVerifier::ValidAttrValue( const TDesC& aValue,
											 TReal32& aConvVal,
											 TUint8 aDatatype,
											 const TDesC& aAttrValue,
											 TBool isSvgElement)
	{
	TReal32 lMinValue = (TReal32)(aDatatype==KSVG_LENGTH_TYPE ? 0 : -KMax16BitValue);
	// invalid number string
	if ( !ParseForDecimalValue( aValue, aConvVal, aAttrValue, isSvgElement) )
		{
		aConvVal=0;
		return EFalse;
		}
	// less than minimum value
	else if ( aConvVal > KMax16BitValue )
		{
		aConvVal = KMax16BitValue;
		return EFalse;
		}
	// greater than maximum value
	else if ( aConvVal < lMinValue )
		{
		aConvVal = lMinValue;
		return EFalse;
		}
	// number string is valid and within range
	return ETrue;
	}