fontservices/textbase/sgdi/ShaperCli.cpp
author hgs
Mon, 12 Jul 2010 14:38:26 +0800
changeset 45 662fa7de7023
permissions -rw-r--r--
201024_05
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45
662fa7de7023 201024_05
hgs
parents:
diff changeset
     1
// Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies).
662fa7de7023 201024_05
hgs
parents:
diff changeset
     2
// All rights reserved.
662fa7de7023 201024_05
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
662fa7de7023 201024_05
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
662fa7de7023 201024_05
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
662fa7de7023 201024_05
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
662fa7de7023 201024_05
hgs
parents:
diff changeset
     7
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
     8
// Initial Contributors:
662fa7de7023 201024_05
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    10
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
    11
// Contributors:
662fa7de7023 201024_05
hgs
parents:
diff changeset
    12
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
    13
// Description:
662fa7de7023 201024_05
hgs
parents:
diff changeset
    14
// Contains client-side shaper functionality.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    15
// 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    16
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
    17
662fa7de7023 201024_05
hgs
parents:
diff changeset
    18
#include "ShapeImpl.h"
662fa7de7023 201024_05
hgs
parents:
diff changeset
    19
#include "ShapeInfo.h"
662fa7de7023 201024_05
hgs
parents:
diff changeset
    20
#include <textbase.h>
662fa7de7023 201024_05
hgs
parents:
diff changeset
    21
#include "TextBasePanic.h"
662fa7de7023 201024_05
hgs
parents:
diff changeset
    22
662fa7de7023 201024_05
hgs
parents:
diff changeset
    23
GLREF_C void TextBasePanic(TInt aError);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    24
662fa7de7023 201024_05
hgs
parents:
diff changeset
    25
/** Construct an RShapeInfo. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
    26
/** @internalComponent */
662fa7de7023 201024_05
hgs
parents:
diff changeset
    27
EXPORT_C RShapeInfo::RShapeInfo()
662fa7de7023 201024_05
hgs
parents:
diff changeset
    28
	: iFont(0), iHeader(0), iEndOfShapedText(-1), iContextualProcessFunc(0) {}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    29
662fa7de7023 201024_05
hgs
parents:
diff changeset
    30
/** Perform shaping on the text in aText between aStartOfTextToShape and
662fa7de7023 201024_05
hgs
parents:
diff changeset
    31
aEndOfTextToShape, based on the script conventions implied by aScriptCode.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    32
@param aFont The font to use for the shaping.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    33
@param aText The text, including context.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    34
@param aStartOfTextToShape
662fa7de7023 201024_05
hgs
parents:
diff changeset
    35
	The start position within aText of the text to be shaped.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    36
@param aEndOfTextToShape
662fa7de7023 201024_05
hgs
parents:
diff changeset
    37
	The end position within aText of the text to be shaped.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    38
@param aScriptCode The script code for the script being shaped.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    39
@param aLanguageCode The language code for the language being shaped.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    40
@return
662fa7de7023 201024_05
hgs
parents:
diff changeset
    41
	KErrNone if the text was successfully shaped, KErrNotSupported if aFont has
662fa7de7023 201024_05
hgs
parents:
diff changeset
    42
	no shaper, KErrCouldNotConnect if the font bitmap server has not been
662fa7de7023 201024_05
hgs
parents:
diff changeset
    43
	started.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    44
*/
662fa7de7023 201024_05
hgs
parents:
diff changeset
    45
TInt RShapeInfo::Open(const CFont* aFont, const TDesC& aText,
662fa7de7023 201024_05
hgs
parents:
diff changeset
    46
	TInt aStartOfTextToShape, TInt aEndOfTextToShape,
662fa7de7023 201024_05
hgs
parents:
diff changeset
    47
	TInt aScriptCode, TInt aLanguageCode)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    48
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    49
	TEXTBASE_ASSERT_DEBUG(0 <= aStartOfTextToShape,
662fa7de7023 201024_05
hgs
parents:
diff changeset
    50
		ETextBasePanic_InvalidInputParam);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    51
	TEXTBASE_ASSERT_DEBUG(aStartOfTextToShape <= aEndOfTextToShape,
662fa7de7023 201024_05
hgs
parents:
diff changeset
    52
		ETextBasePanic_InvalidInputParam);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    53
	TEXTBASE_ASSERT_DEBUG(aEndOfTextToShape <= aText.Length(),
662fa7de7023 201024_05
hgs
parents:
diff changeset
    54
		ETextBasePanic_InvalidInputParam);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    55
	iFont = aFont;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    56
	TFontShapeFunctionParameters param;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    57
	param.iText = &aText;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    58
	param.iStart = aStartOfTextToShape;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    59
	param.iEnd = aEndOfTextToShape;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    60
	param.iScript = aScriptCode;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    61
	param.iLanguage = aLanguageCode;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    62
	const TInt r = aFont->ExtendedFunction(KFontGetShaping, &param);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    63
	iHeader = r == KErrNone ? param.iShapeHeaderOutput : 0;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    64
	if(iHeader)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    65
		iEndOfShapedText = aEndOfTextToShape;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    66
	return r;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    67
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    68
662fa7de7023 201024_05
hgs
parents:
diff changeset
    69
/** Frees the memory associated with this shaping information. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
    70
/** @internalComponent */
662fa7de7023 201024_05
hgs
parents:
diff changeset
    71
EXPORT_C void RShapeInfo::Close()
662fa7de7023 201024_05
hgs
parents:
diff changeset
    72
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    73
	if (iHeader)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    74
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    75
		TFontShapeDeleteFunctionParameters param;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    76
		param.iShapeHeader = iHeader;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    77
		iFont->ExtendedFunction(KFontDeleteShaping, &param);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    78
		iHeader = NULL;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    79
		iEndOfShapedText = -1;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    80
		// We don't reset iSingleContextChar because we want the context to remain throughout,
662fa7de7023 201024_05
hgs
parents:
diff changeset
    81
		// even when the session is closed. It would eventually simply go out of scope.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    82
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    83
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    84
662fa7de7023 201024_05
hgs
parents:
diff changeset
    85
/** Returns the number of glyphs in the shaped output.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    86
@return The number of glyphs. Also equal to the size of the Glyphs() array and
662fa7de7023 201024_05
hgs
parents:
diff changeset
    87
the GlyphPositions() array. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
    88
TInt RShapeInfo::GlyphCount() const
662fa7de7023 201024_05
hgs
parents:
diff changeset
    89
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    90
	TEXTBASE_ASSERT_ALWAYS(iHeader, ETextBasePanic_Invariant);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    91
	return iHeader->iGlyphCount;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    92
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    93
662fa7de7023 201024_05
hgs
parents:
diff changeset
    94
/** Returns the array of glyphs. These must be ORed with 0x80000000 to make
662fa7de7023 201024_05
hgs
parents:
diff changeset
    95
glyph numbers that functions like CFbsFont::Rasterize can accept to avoid
662fa7de7023 201024_05
hgs
parents:
diff changeset
    96
confusing glyph numbers with Unicode character numbers.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    97
@return The glyph array. The size of this array is RShapeInfo::GlyphCount
662fa7de7023 201024_05
hgs
parents:
diff changeset
    98
@see GlyphCount */
662fa7de7023 201024_05
hgs
parents:
diff changeset
    99
const TInt32* RShapeInfo::Glyphs() const
662fa7de7023 201024_05
hgs
parents:
diff changeset
   100
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   101
	TEXTBASE_ASSERT_ALWAYS(iHeader, ETextBasePanic_Invariant);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   102
	return reinterpret_cast<const TInt32*>(iHeader->iBuffer);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   103
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   104
662fa7de7023 201024_05
hgs
parents:
diff changeset
   105
/** Returns the array of positions for the glyphs returned by Glyphs, and the
662fa7de7023 201024_05
hgs
parents:
diff changeset
   106
total advance for the text.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   107
@return
662fa7de7023 201024_05
hgs
parents:
diff changeset
   108
	Array of glyph positions in pixels, relative to the pen position before
662fa7de7023 201024_05
hgs
parents:
diff changeset
   109
	the glyphs are drawn. The array has GlyphCount() + 1 entries, as the
662fa7de7023 201024_05
hgs
parents:
diff changeset
   110
	last entry represents the total advance of the text. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
   111
const RShapeInfo::TPoint16* RShapeInfo::GlyphPositions() const
662fa7de7023 201024_05
hgs
parents:
diff changeset
   112
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   113
	TEXTBASE_ASSERT_ALWAYS(iHeader, ETextBasePanic_Invariant);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   114
	return reinterpret_cast<const RShapeInfo::TPoint16*>(iHeader->iBuffer
662fa7de7023 201024_05
hgs
parents:
diff changeset
   115
		+ ((iHeader->iGlyphCount) << 2));
662fa7de7023 201024_05
hgs
parents:
diff changeset
   116
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   117
662fa7de7023 201024_05
hgs
parents:
diff changeset
   118
/** Returns the pen advance these glyphs require.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   119
@return The pen advance; where to move the pen after drawing all the glyphs. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
   120
RShapeInfo::TPoint16 RShapeInfo::Advance() const
662fa7de7023 201024_05
hgs
parents:
diff changeset
   121
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   122
	TEXTBASE_ASSERT_ALWAYS(iHeader, ETextBasePanic_Invariant);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   123
	RShapeInfo::TPoint16 r;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   124
	r.iX = *reinterpret_cast<const TInt16*>(iHeader->iBuffer
662fa7de7023 201024_05
hgs
parents:
diff changeset
   125
		+ (iHeader->iGlyphCount << 3));
662fa7de7023 201024_05
hgs
parents:
diff changeset
   126
	r.iY = *reinterpret_cast<const TInt16*>(iHeader->iBuffer
662fa7de7023 201024_05
hgs
parents:
diff changeset
   127
		+ (iHeader->iGlyphCount << 3) + 2);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   128
	return r;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   129
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   130
662fa7de7023 201024_05
hgs
parents:
diff changeset
   131
/** Returns the array of indices.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   132
@return
662fa7de7023 201024_05
hgs
parents:
diff changeset
   133
	Indices[n] is the position in the input text that produced Glyphs[n].
662fa7de7023 201024_05
hgs
parents:
diff changeset
   134
*/
662fa7de7023 201024_05
hgs
parents:
diff changeset
   135
const TInt16* RShapeInfo::Indices() const
662fa7de7023 201024_05
hgs
parents:
diff changeset
   136
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   137
	TEXTBASE_ASSERT_ALWAYS(iHeader, ETextBasePanic_Invariant);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   138
	return reinterpret_cast<const TInt16*>(iHeader->iBuffer
662fa7de7023 201024_05
hgs
parents:
diff changeset
   139
		+ (iHeader->iGlyphCount << 3) + 4);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   140
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   141
	
662fa7de7023 201024_05
hgs
parents:
diff changeset
   142
TInt RShapeInfo::EndOfShapedText()
662fa7de7023 201024_05
hgs
parents:
diff changeset
   143
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   144
	return iEndOfShapedText;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   145
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   146
662fa7de7023 201024_05
hgs
parents:
diff changeset
   147
/** Checks if this shaping information is still occupying memory. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
   148
EXPORT_C TBool RShapeInfo::IsOpen()
662fa7de7023 201024_05
hgs
parents:
diff changeset
   149
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   150
	if(iHeader && iHeader->iGlyphCount >= 0 && iHeader->iCharacterCount >=0)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   151
		return ETrue;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   152
	else
662fa7de7023 201024_05
hgs
parents:
diff changeset
   153
		return EFalse;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   154
		
662fa7de7023 201024_05
hgs
parents:
diff changeset
   155
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   156
662fa7de7023 201024_05
hgs
parents:
diff changeset
   157
void RShapeInfo::SetContext(TAny* aContextualProcessFunc)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   158
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   159
	iContextualProcessFunc = aContextualProcessFunc;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   160
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   161
	
662fa7de7023 201024_05
hgs
parents:
diff changeset
   162
TAny* RShapeInfo::GetContext()
662fa7de7023 201024_05
hgs
parents:
diff changeset
   163
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   164
	return iContextualProcessFunc;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   165
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   166