|
1 // Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies). |
|
2 // All rights reserved. |
|
3 // This component and the accompanying materials are made available |
|
4 // under the terms of "Eclipse Public License v1.0" |
|
5 // which accompanies this distribution, and is available |
|
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
7 // |
|
8 // Initial Contributors: |
|
9 // Nokia Corporation - initial contribution. |
|
10 // |
|
11 // Contributors: |
|
12 // |
|
13 // Description: |
|
14 // Shells for window server graphics class |
|
15 // |
|
16 // |
|
17 |
|
18 #include <e32std.h> |
|
19 #include <graphics/wsdrawresource.h> |
|
20 #include "../SERVER/w32cmd.h" |
|
21 #include "CLIENT.H" |
|
22 #include "w32comm.h" |
|
23 #include "graphicsresourcewrapper.h" |
|
24 #include <graphics/gdi/gdiconsts.h> |
|
25 #include <graphics/gdi/gdistructs.h> |
|
26 #include "graphics/windowserverconstants.h" |
|
27 |
|
28 #define KDefaultShadowColor KRgbGray |
|
29 enum {EPolygonMaxHeaderSize=sizeof(TWsCmdHeader)+sizeof(TWsGcCmdSegmentedDrawPolygonData)}; |
|
30 |
|
31 // |
|
32 // class CWindowGc::CPimpl |
|
33 // |
|
34 |
|
35 NONSHARABLE_STRUCT(CWindowGc::CPimpl): public CBase, public MWsDrawResource |
|
36 /** @internalComponent @released */ |
|
37 { |
|
38 public: |
|
39 enum TStateType |
|
40 { |
|
41 EStateBrushColor = 1<<0, |
|
42 EStateBrushStyle = 1<<1, |
|
43 EStatePenColor = 1<<2, |
|
44 EStatePenStyle = 1<<3, |
|
45 EStatePenSize = 1<<4, |
|
46 EStateDrawMode = 1<<5, |
|
47 EStateClippingRect = 1<<6, |
|
48 EStateUnderlineStyle = 1<<7, |
|
49 EStateStrikethroughStyle = 1<<8, |
|
50 EStateWordJustification = 1<<9, |
|
51 EStateCharJustification = 1<<10, |
|
52 }; |
|
53 |
|
54 CPimpl(CWindowGc& aGc); |
|
55 void WriteAnyPendingStateChanges(); |
|
56 void ResetPendingState(); |
|
57 void StorePendingStateChange(TStateType aState, const TAny* aValue); |
|
58 TUint32 GetState() const {return iPendingState;} |
|
59 void CancelPendingClippingRect(); |
|
60 ~CPimpl(); |
|
61 public: //from MWsDrawResource |
|
62 void DrawResource(const TPoint& aPos, const RWsDrawableSource& aSource, CWindowGc::TGraphicsRotation aRotation=CWindowGc::EGraphicsRotationNone) |
|
63 { |
|
64 iGc.DrawResource(aPos, aSource, aRotation); |
|
65 } |
|
66 void DrawResource(const TRect& aDestRect, const RWsDrawableSource& aSource, CWindowGc::TGraphicsRotation aRotation=CWindowGc::EGraphicsRotationNone) |
|
67 { |
|
68 iGc.DrawResource(aDestRect, aSource, aRotation); |
|
69 } |
|
70 void DrawResource(const TRect& aDestRect, const RWsDrawableSource& aSource, const TRect& aSrcRect, CWindowGc::TGraphicsRotation aRotation=CWindowGc::EGraphicsRotationNone) |
|
71 { |
|
72 iGc.DrawResource(aDestRect, aSource, aSrcRect, aRotation); |
|
73 } |
|
74 void DrawResource(const TRect& aDestRect, const RWsDrawableSource& aSource, const TDesC8& aParam) |
|
75 { |
|
76 iGc.DrawResource(aDestRect, aSource, aParam); |
|
77 } |
|
78 public: |
|
79 CWindowGc& iGc; |
|
80 CFbsFont* iFont; |
|
81 TRgb iShadowColor; |
|
82 TBool iForceWrite; |
|
83 TBool iClippingRectSet; |
|
84 |
|
85 private: |
|
86 TUint32 iPendingState; |
|
87 |
|
88 // Pending state - used to store requested state changes not yet written to wserv |
|
89 TRgb iPendingBrushColor; |
|
90 TBrushStyle iPendingBrushStyle; |
|
91 TRgb iPendingPenColor; |
|
92 TPenStyle iPendingPenStyle; |
|
93 TSize iPendingPenSize; |
|
94 TDrawMode iPendingDrawMode; |
|
95 TRect iPendingClippingRect; |
|
96 TFontUnderline iPendingUnderlineStyle; |
|
97 TFontStrikethrough iPendingStrikethroughStyle; |
|
98 TWsGcCmdSetJustification iPendingWordJustification; |
|
99 TWsGcCmdSetJustification iPendingCharJustification; |
|
100 |
|
101 // Current state - values that have actually been written to wserv |
|
102 TRgb iCurrentBrushColor; |
|
103 TBrushStyle iCurrentBrushStyle; |
|
104 TRgb iCurrentPenColor; |
|
105 TPenStyle iCurrentPenStyle; |
|
106 TSize iCurrentPenSize; |
|
107 TDrawMode iCurrentDrawMode; |
|
108 TFontUnderline iCurrentUnderlineStyle; |
|
109 TFontStrikethrough iCurrentStrikethroughStyle; |
|
110 TWsGcCmdSetJustification iCurrentWordJustification; |
|
111 TWsGcCmdSetJustification iCurrentCharJustification; |
|
112 }; |
|
113 |
|
114 CWindowGc::CPimpl::CPimpl(CWindowGc& aGc) |
|
115 : iGc(aGc), iFont(NULL), iShadowColor(KDefaultShadowColor) |
|
116 { |
|
117 ResetPendingState(); |
|
118 } |
|
119 |
|
120 CWindowGc::CPimpl::~CPimpl() |
|
121 { |
|
122 iFont = NULL; |
|
123 } |
|
124 |
|
125 void CWindowGc::CPimpl::CancelPendingClippingRect() |
|
126 { |
|
127 iPendingState &= ~EStateClippingRect; |
|
128 } |
|
129 |
|
130 void CWindowGc::CPimpl::WriteAnyPendingStateChanges() |
|
131 { |
|
132 if (iPendingState == 0) |
|
133 return; |
|
134 |
|
135 if (iPendingState & EStateDrawMode) |
|
136 { |
|
137 if (iPendingDrawMode != iCurrentDrawMode) |
|
138 { |
|
139 iGc.WriteInt(iPendingDrawMode,EWsGcOpSetDrawMode); |
|
140 iCurrentDrawMode = iPendingDrawMode; |
|
141 } |
|
142 } |
|
143 |
|
144 if (iPendingState & EStateBrushStyle) |
|
145 { |
|
146 if (iPendingBrushStyle != iCurrentBrushStyle) |
|
147 { |
|
148 iGc.WriteInt(iPendingBrushStyle,EWsGcOpSetBrushStyle); |
|
149 iCurrentBrushStyle = iPendingBrushStyle; |
|
150 } |
|
151 } |
|
152 |
|
153 if (iPendingState & EStateBrushColor) |
|
154 { |
|
155 // Brush colour optimisation more conservative (than for other state changes) because server-side code modifies it without client's knowledge |
|
156 if (iPendingBrushColor != iCurrentBrushColor || iForceWrite) |
|
157 { |
|
158 iGc.WriteInt(iPendingBrushColor.Internal(),EWsGcOpSetBrushColor); |
|
159 iCurrentBrushColor = iPendingBrushColor; |
|
160 iForceWrite = EFalse; |
|
161 } |
|
162 } |
|
163 |
|
164 if (iPendingState & EStatePenStyle) |
|
165 { |
|
166 if (iPendingPenStyle != iCurrentPenStyle) |
|
167 { |
|
168 iGc.WriteInt(iPendingPenStyle,EWsGcOpSetPenStyle); |
|
169 iCurrentPenStyle = iPendingPenStyle; |
|
170 } |
|
171 } |
|
172 |
|
173 if (iPendingState & EStatePenColor) |
|
174 { |
|
175 if (iPendingPenColor != iCurrentPenColor) |
|
176 { |
|
177 iGc.WriteInt(iPendingPenColor.Internal(),EWsGcOpSetPenColor); |
|
178 iCurrentPenColor = iPendingPenColor; |
|
179 } |
|
180 } |
|
181 |
|
182 if (iPendingState & EStateClippingRect) |
|
183 { |
|
184 iGc.WriteRect(iPendingClippingRect,EWsGcOpSetClippingRect); |
|
185 iClippingRectSet = ETrue; |
|
186 } |
|
187 |
|
188 if (iPendingState & EStateUnderlineStyle) |
|
189 { |
|
190 if (iPendingUnderlineStyle != iCurrentUnderlineStyle) |
|
191 { |
|
192 iGc.WriteInt(iPendingUnderlineStyle,EWsGcOpSetUnderlineStyle); |
|
193 iCurrentUnderlineStyle = iPendingUnderlineStyle; |
|
194 } |
|
195 } |
|
196 |
|
197 if (iPendingState & EStateStrikethroughStyle) |
|
198 { |
|
199 if (iPendingStrikethroughStyle != iCurrentStrikethroughStyle) |
|
200 { |
|
201 iGc.WriteInt(iPendingStrikethroughStyle,EWsGcOpSetStrikethroughStyle); |
|
202 iCurrentStrikethroughStyle = iPendingStrikethroughStyle; |
|
203 } |
|
204 } |
|
205 |
|
206 if (iPendingState & EStatePenSize) |
|
207 { |
|
208 if (iPendingPenSize != iCurrentPenSize) |
|
209 { |
|
210 iGc.WriteSize(iPendingPenSize,EWsGcOpSetPenSize); |
|
211 iCurrentPenSize = iPendingPenSize; |
|
212 } |
|
213 } |
|
214 |
|
215 if (iPendingState & EStateWordJustification) |
|
216 { |
|
217 if (iPendingWordJustification.excessWidth != iCurrentWordJustification.excessWidth |
|
218 || iPendingWordJustification.numGaps != iCurrentWordJustification.numGaps) |
|
219 { |
|
220 iGc.Write(&iPendingWordJustification,sizeof(iPendingWordJustification),EWsGcOpSetWordJustification); |
|
221 iCurrentWordJustification = iPendingWordJustification; |
|
222 } |
|
223 } |
|
224 |
|
225 if (iPendingState & EStateCharJustification) |
|
226 { |
|
227 if (iPendingCharJustification.excessWidth != iCurrentCharJustification.excessWidth |
|
228 || iPendingCharJustification.numGaps != iCurrentCharJustification.numGaps) |
|
229 { |
|
230 iGc.Write(&iPendingCharJustification,sizeof(iPendingCharJustification),EWsGcOpSetCharJustification); |
|
231 iCurrentCharJustification = iPendingCharJustification; |
|
232 } |
|
233 } |
|
234 |
|
235 iPendingState = 0; |
|
236 } |
|
237 |
|
238 void CWindowGc::CPimpl::ResetPendingState() |
|
239 { |
|
240 // This function should only be called from CWindowGc::Reset() |
|
241 iForceWrite = EFalse; |
|
242 iPendingState = 0; |
|
243 |
|
244 iClippingRectSet = EFalse; |
|
245 |
|
246 // The following default values are the same as those used by CFbsBitGc::Reset() |
|
247 iPendingBrushColor = KRgbWhite; |
|
248 iPendingBrushStyle = CGraphicsContext::ENullBrush; |
|
249 iPendingPenColor = KRgbBlack; |
|
250 iPendingPenStyle = CGraphicsContext::ESolidPen; |
|
251 iPendingPenSize = TSize(1,1); |
|
252 iPendingDrawMode = CGraphicsContext::EDrawModePEN; |
|
253 iPendingUnderlineStyle = EUnderlineOff; |
|
254 iPendingStrikethroughStyle = EStrikethroughOff; |
|
255 iPendingWordJustification.excessWidth = 0; |
|
256 iPendingWordJustification.numGaps = 0; |
|
257 iPendingCharJustification.excessWidth = 0; |
|
258 iPendingCharJustification.numGaps = 0; |
|
259 |
|
260 iCurrentBrushColor = iPendingBrushColor; |
|
261 iCurrentBrushStyle = iPendingBrushStyle; |
|
262 iCurrentPenColor = iPendingPenColor; |
|
263 iCurrentPenStyle = iPendingPenStyle; |
|
264 iCurrentPenSize = iPendingPenSize; |
|
265 iCurrentDrawMode = iPendingDrawMode; |
|
266 iCurrentUnderlineStyle = iPendingUnderlineStyle; |
|
267 iCurrentStrikethroughStyle = iPendingStrikethroughStyle; |
|
268 iCurrentWordJustification.excessWidth = iPendingWordJustification.excessWidth; |
|
269 iCurrentWordJustification.numGaps = iPendingWordJustification.numGaps; |
|
270 iCurrentCharJustification.excessWidth = iPendingCharJustification.excessWidth; |
|
271 iCurrentCharJustification.numGaps = iPendingCharJustification.numGaps; |
|
272 } |
|
273 |
|
274 void CWindowGc::CPimpl::StorePendingStateChange(TStateType aState, const TAny* aValue) |
|
275 { |
|
276 switch (aState) |
|
277 { |
|
278 case EStateBrushColor: |
|
279 iPendingState |= EStateBrushColor; |
|
280 iPendingBrushColor = *((TRgb*)(aValue)); |
|
281 break; |
|
282 case EStateBrushStyle: |
|
283 iPendingState|=EStateBrushStyle; |
|
284 iPendingBrushStyle = *((TBrushStyle*)(aValue)); |
|
285 break; |
|
286 case EStatePenColor: |
|
287 iPendingState|=EStatePenColor; |
|
288 iPendingPenColor = *((TRgb*)(aValue)); |
|
289 break; |
|
290 case EStatePenStyle: |
|
291 iPendingState|=EStatePenStyle; |
|
292 iPendingPenStyle = *((TPenStyle*)(aValue)); |
|
293 break; |
|
294 case EStateDrawMode: |
|
295 iPendingState|=EStateDrawMode; |
|
296 iPendingDrawMode = *((TDrawMode*)(aValue)); |
|
297 break; |
|
298 case EStateClippingRect: |
|
299 iPendingState|=EStateClippingRect; |
|
300 iPendingClippingRect = *((TRect*)(aValue)); |
|
301 break; |
|
302 case EStateUnderlineStyle: |
|
303 iPendingState|=EStateUnderlineStyle; |
|
304 iPendingUnderlineStyle = *((TFontUnderline*)(aValue)); |
|
305 break; |
|
306 case EStateStrikethroughStyle: |
|
307 iPendingState|=EStateStrikethroughStyle; |
|
308 iPendingStrikethroughStyle= *((TFontStrikethrough*)(aValue)); |
|
309 break; |
|
310 case EStatePenSize: |
|
311 iPendingState|=EStatePenSize; |
|
312 iPendingPenSize = *((TSize*)(aValue)); |
|
313 break; |
|
314 case EStateWordJustification: |
|
315 iPendingState|=EStateWordJustification; |
|
316 iPendingWordJustification = *((TWsGcCmdSetJustification*)(aValue)); |
|
317 break; |
|
318 case EStateCharJustification: |
|
319 iPendingState|=EStateCharJustification; |
|
320 iPendingCharJustification = *((TWsGcCmdSetJustification*)(aValue)); |
|
321 break; |
|
322 default: |
|
323 break; |
|
324 } |
|
325 } |
|
326 |
|
327 // |
|
328 // class CWindowGc |
|
329 // |
|
330 |
|
331 EXPORT_C CWindowGc::CWindowGc(CWsScreenDevice *aDevice) : MWsClientClass(aDevice->iBuffer), iPimpl(NULL), iDevice(aDevice) |
|
332 /** Constructor which creates, but does not initialise a graphics context. |
|
333 |
|
334 @param aDevice Any screen device owned by the same session. Its life time |
|
335 should be at least as long as the gc itself. |
|
336 @see CWsScreenDevice::CreateContext() */ |
|
337 {} |
|
338 |
|
339 EXPORT_C CWindowGc::~CWindowGc() |
|
340 /** Destructor. */ |
|
341 { |
|
342 if (iBuffer && iWsHandle) |
|
343 Write(EWsGcOpFree); |
|
344 delete iPimpl; |
|
345 } |
|
346 |
|
347 void CWindowGc::WriteTextCommand(TAny *cmd, TInt len,const TDesC &aBuf,TInt opcode,TInt opcodePtr) const |
|
348 { |
|
349 if ((aBuf.Size()+len)>(TInt)(iBuffer->BufferSize()-sizeof(TWsCmdHeader))) |
|
350 { |
|
351 WriteReplyByProvidingRemoteReadAccess(cmd,len,&aBuf,opcodePtr); |
|
352 } |
|
353 else |
|
354 { |
|
355 Write(cmd,len,aBuf.Ptr(),aBuf.Size(),opcode); |
|
356 } |
|
357 } |
|
358 |
|
359 void CWindowGc::WriteTextCommand(TAny *cmd, TInt len,const TDesC8 &aBuf,TInt opcode,TInt opcodePtr) const |
|
360 { |
|
361 if ((aBuf.Size()+len)>(TInt)(iBuffer->BufferSize()-sizeof(TWsCmdHeader))) |
|
362 { |
|
363 WriteReplyByProvidingRemoteReadAccess(cmd,len,&aBuf,opcodePtr); |
|
364 } |
|
365 else |
|
366 { |
|
367 Write(cmd,len,aBuf.Ptr(),aBuf.Size(),opcode); |
|
368 } |
|
369 } |
|
370 |
|
371 EXPORT_C TInt CWindowGc::Construct() |
|
372 /** Completes construction. |
|
373 |
|
374 @return KErrNone if successful, otherwise a leave error. |
|
375 @panic TW32Panic 17 in debug builds if called on an already constructed object. |
|
376 This function always causes a flush of the window server buffer. */ |
|
377 { |
|
378 __ASSERT_DEBUG(iWsHandle == KNullHandle, Panic(EW32PanicGraphicDoubleConstruction)); |
|
379 iPimpl = new CPimpl(*this); |
|
380 if (!iPimpl) |
|
381 return KErrNoMemory; |
|
382 TInt ret; |
|
383 if ((ret=iBuffer->WriteReplyWs(EWsClOpCreateGc))<0) |
|
384 return(ret); |
|
385 iWsHandle=ret; |
|
386 return(KErrNone); |
|
387 } |
|
388 |
|
389 EXPORT_C void CWindowGc::Activate(RDrawableWindow &aDevice) |
|
390 /** Activates the context for a given window and updates iDevice with the pointer to the screen device of the screen on which aDevice is found. |
|
391 |
|
392 When drawing is complete, the code using the context should call Deactivate(). |
|
393 Draw methods invoked after an Activate() will affect the window specified. |
|
394 A graphics context can only be active for one window at a time. A panic occurs |
|
395 if a draw function is called before calling this function, or if Activate() |
|
396 is called twice without an intervening Deactivate(). |
|
397 |
|
398 @param aWindow The window for which the graphics context is to be activated. */ |
|
399 { |
|
400 TUint devicePointer = WriteReplyInt(aDevice.WsHandle(),EWsGcOpActivate); |
|
401 iDevice = (CWsScreenDevice*)devicePointer; |
|
402 iPimpl->iForceWrite = ETrue; // needed because brush colour set to window background colour in CWsGc::Activate |
|
403 } |
|
404 |
|
405 EXPORT_C void CWindowGc::Deactivate() |
|
406 /** Frees the graphics context to be used with another window. |
|
407 |
|
408 This method should be called when the application has completed drawing to |
|
409 the window. */ |
|
410 { |
|
411 iPimpl->ResetPendingState(); // needed because server-side state is reset on deactivation |
|
412 Write(EWsGcOpDeactivate); |
|
413 iPimpl->iFont=NULL; |
|
414 iPimpl->iShadowColor = KDefaultShadowColor; |
|
415 } |
|
416 |
|
417 //====================Functions from GDI.H=============================== |
|
418 |
|
419 EXPORT_C CGraphicsDevice* CWindowGc::Device() const |
|
420 /** Returns a pointer to the device, more specifically a CWsScreenDevice, for the screen that the WindowGc was last activated on. |
|
421 If the WindowGc has not been activated at all, it then returns the device that was passed to its constructor. |
|
422 |
|
423 The user should be careful when calling this function since it can return the screen device of any screen in the system. |
|
424 Hence, the return value of this function will be useful only if the user is aware of how the WindowGc was used before this function is called. |
|
425 @return A pointer to the device for the screen that the WindowGc was last activated on or the device passed at construction*/ |
|
426 { |
|
427 return(iDevice); |
|
428 } |
|
429 |
|
430 EXPORT_C void CWindowGc::SetOrigin(const TPoint &aPoint) |
|
431 /** Sets the position of the co-ordinate origin. |
|
432 |
|
433 All subsequent drawing operations are then done relative to this origin. The |
|
434 default origin is (0,0), the top left corner of the window. |
|
435 |
|
436 @param aPoint A point for the origin, default (0,0). |
|
437 @see CGraphicsContext::SetOrigin() */ |
|
438 { |
|
439 if ( iPimpl->GetState() & CPimpl::EStateClippingRect ) |
|
440 { |
|
441 iPimpl->WriteAnyPendingStateChanges(); |
|
442 } |
|
443 WritePoint(aPoint,EWsGcOpSetOrigin); |
|
444 } |
|
445 |
|
446 EXPORT_C void CWindowGc::SetClippingRect(const TRect& aRect) |
|
447 /** Sets a clipping rectangle. |
|
448 |
|
449 Graphics drawn to the window are clipped, so that only items which fall within |
|
450 the rectangle are displayed. |
|
451 |
|
452 Note that clipping is additive. If a clipping region has been set using SetClippingRegion() |
|
453 then clipping will be to the intersection of that region and this rectangle. |
|
454 |
|
455 @param aRect The clipping rectangle in window co-ordinates. Note that this rectangle is |
|
456 tranformed by the current drawing co-ordinate origin before it is used. |
|
457 The co-ordinate origin is set using SetOrigin(). |
|
458 |
|
459 @see SetClippingRegion() */ |
|
460 { |
|
461 TRect rect(aRect); |
|
462 iPimpl->StorePendingStateChange(CPimpl::EStateClippingRect, &rect); |
|
463 } |
|
464 |
|
465 EXPORT_C void CWindowGc::CancelClippingRect() |
|
466 /** Cancels the clipping rectangle. |
|
467 |
|
468 @see SetClippingRect() */ |
|
469 { |
|
470 if (iPimpl->GetState() & CPimpl::EStateClippingRect) |
|
471 { |
|
472 iPimpl->CancelPendingClippingRect(); |
|
473 } |
|
474 |
|
475 if (iPimpl->iClippingRectSet) |
|
476 { |
|
477 Write(EWsGcOpCancelClippingRect); |
|
478 } |
|
479 |
|
480 iPimpl->iClippingRectSet = EFalse; |
|
481 } |
|
482 |
|
483 EXPORT_C TInt CWindowGc::SetClippingRegion(const TRegion &aRegion) |
|
484 /** Sets the clipping region. |
|
485 |
|
486 Drawing is always clipped to the visible area of a window. The region specified |
|
487 by this function is in addition to that area. |
|
488 |
|
489 This function always causes a flush of the window server buffer. |
|
490 |
|
491 @param aRegion The new clipping region in window co-ordinates |
|
492 as used in SetClippingRect(). The clipping region is transformed by the current |
|
493 drawing origin before use. |
|
494 |
|
495 @return KErrNone if successful, KErrNoMemory if there is insufficient memory |
|
496 to create the region on the server side, otherwise another error code. |
|
497 |
|
498 @see SetClippingRect() */ |
|
499 { |
|
500 const TInt regionCount=aRegion.Count(); |
|
501 TPtrC8 ptrRect(reinterpret_cast<const TUint8*>(aRegion.RectangleList()),regionCount*sizeof(TRect)); |
|
502 return(WriteReplyByProvidingRemoteReadAccess(®ionCount,sizeof(regionCount),&ptrRect,EWsGcOpSetClippingRegion)); |
|
503 } |
|
504 |
|
505 EXPORT_C void CWindowGc::CancelClippingRegion() |
|
506 /** Cancels the current clipping region. */ |
|
507 { |
|
508 Write(EWsGcOpCancelClippingRegion); |
|
509 } |
|
510 |
|
511 EXPORT_C void CWindowGc::SetDrawMode(TDrawMode aDrawingMode) |
|
512 /** Sets the drawing mode. |
|
513 |
|
514 This affects the colour that is actually drawn, because it defines the way |
|
515 that the current screen colour logically combines with the current pen colour |
|
516 and brush colour. |
|
517 |
|
518 There are 13 drawing modes (see CGraphicsContext::TDrawMode enum), each giving |
|
519 different logical combinations of pen, brush and screen colours. Each mode |
|
520 is produced by ORing together different combinations of seven drawing mode |
|
521 components (see CGraphicsContext::TDrawModeComponents enum). |
|
522 |
|
523 The three most important modes are TDrawMode::EDrawModePEN, TDrawMode::EDrawModeNOTSCREEN |
|
524 and TDrawMode::EDrawModeXOR. The default drawing mode is TDrawMode::EDrawModePEN. |
|
525 |
|
526 The drawing mode is over-ridden for line and shape drawing functions when |
|
527 a wide pen line has been selected. It is forced to TDrawMode::EDrawModePEN. |
|
528 This is to prevent undesired effects at line joins (vertexes). |
|
529 |
|
530 Notes: |
|
531 |
|
532 TDrawMode::EDrawModeAND gives a "colour filter" effect. For example: |
|
533 |
|
534 ANDing with white gives the original colour |
|
535 |
|
536 ANDing with black gives black |
|
537 |
|
538 TDrawMode::EDrawModeOR gives a "colour boost" effect. For example: |
|
539 |
|
540 ORing with black gives the original colour |
|
541 |
|
542 ORing with white gives white |
|
543 |
|
544 TDrawMode::EDrawModeXOR gives an "Exclusive OR" effect. For example: |
|
545 |
|
546 white XOR black gives white |
|
547 |
|
548 white XOR white gives black |
|
549 |
|
550 black XOR black gives black |
|
551 |
|
552 @param aDrawingMode A drawing mode. |
|
553 @see CGraphicsContext::SetDrawMode() */ |
|
554 { |
|
555 iPimpl->StorePendingStateChange(CPimpl::EStateDrawMode, &aDrawingMode); |
|
556 } |
|
557 |
|
558 EXPORT_C void CWindowGc::UseFont(const CFont *aFont) |
|
559 /** Sets this context's font. |
|
560 |
|
561 The font is used for text drawing. If the font is already in the font and |
|
562 bitmap server's memory the GDI will share that copy. |
|
563 |
|
564 Note that this function must be called prior to drawing text or the calling |
|
565 thread will panic. |
|
566 |
|
567 @param aFont A device font. |
|
568 @see CGraphicsContext::UseFont() */ |
|
569 { |
|
570 if (iPimpl->iFont!=(CFbsFont *)aFont) |
|
571 { |
|
572 iPimpl->iFont=(CFbsFont *)aFont; |
|
573 WriteInt(iPimpl->iFont->Handle(),EWsGcOpUseFont); |
|
574 } |
|
575 } |
|
576 |
|
577 EXPORT_C void CWindowGc::DiscardFont() |
|
578 /** Discards a font. |
|
579 |
|
580 This frees up the memory used (if the font is not being shared with some other |
|
581 process). |
|
582 |
|
583 Note that if no font is in use when this function is called, then there is no effect. |
|
584 |
|
585 @see CGraphicsContext::DiscardFont() */ |
|
586 { |
|
587 Write(EWsGcOpDiscardFont); |
|
588 iPimpl->iFont=NULL; |
|
589 } |
|
590 |
|
591 EXPORT_C void CWindowGc::SetUnderlineStyle(TFontUnderline aUnderlineStyle) |
|
592 /** Sets the underline style for all subsequently drawn text. |
|
593 |
|
594 @param aUnderlineStyle The underline style: either on or off. |
|
595 @see CGraphicsContext::SetUnderlineStyle() */ |
|
596 { |
|
597 iPimpl->StorePendingStateChange(CPimpl::EStateUnderlineStyle, &aUnderlineStyle); |
|
598 } |
|
599 |
|
600 EXPORT_C void CWindowGc::SetStrikethroughStyle(TFontStrikethrough aStrikethroughStyle) |
|
601 /** Sets the strikethrough style for all subsequently drawn text. |
|
602 |
|
603 @param aStrikethroughStyle The strikethrough style: either on or off. |
|
604 @see CGraphicsContext::SetStrikethroughStyle() */ |
|
605 { |
|
606 iPimpl->StorePendingStateChange(CPimpl::EStateStrikethroughStyle, &aStrikethroughStyle); |
|
607 } |
|
608 |
|
609 void CWindowGc::SetJustification(TInt aExcessWidth,TInt aNumGaps, TInt aOpcode) |
|
610 { |
|
611 TWsGcCmdSetJustification justification; |
|
612 |
|
613 justification.excessWidth=aExcessWidth; |
|
614 justification.numGaps=aNumGaps; |
|
615 |
|
616 if (aOpcode == EWsGcOpSetWordJustification) |
|
617 { |
|
618 iPimpl->StorePendingStateChange(CPimpl::EStateWordJustification, &justification); |
|
619 } |
|
620 else if (aOpcode == EWsGcOpSetCharJustification) |
|
621 { |
|
622 iPimpl->StorePendingStateChange(CPimpl::EStateCharJustification, &justification); |
|
623 } |
|
624 } |
|
625 |
|
626 EXPORT_C void CWindowGc::SetWordJustification(TInt aExcessWidth,TInt aNumGaps) |
|
627 /** Sets word justification. |
|
628 |
|
629 This function is particularly useful for doing WYSIWYG underlining or strikethrough, |
|
630 as it ensures that the lines extend correctly into the gaps between words. It is not |
|
631 intended for regular use by developers. |
|
632 |
|
633 @param aExcessWidth The excess width (in pixels) to be distributed between |
|
634 the specified number of gaps (starting immediately) |
|
635 @param aNumGaps The number of gaps between words |
|
636 @see CGraphicsContext::SetWordJustification() */ |
|
637 { |
|
638 SetJustification(aExcessWidth, aNumGaps, EWsGcOpSetWordJustification); |
|
639 } |
|
640 |
|
641 EXPORT_C void CWindowGc::SetCharJustification(TInt aExcessWidth,TInt aNumChars) |
|
642 /** Sets the character justification. |
|
643 |
|
644 This function is used primarily to get accurate WYSIWYG, and is not intended |
|
645 for regular use by developers. |
|
646 |
|
647 The text line that is to be justified has a certain number of characters (this |
|
648 includes the spaces between the words). It also has a distance (in pixels) |
|
649 between the end of the last word and the actual end of the line (right hand |
|
650 margin, usually). These excess width pixels are distributed amongst all the |
|
651 characters, increasing the gaps between them, to achieve full justification |
|
652 of the text line. |
|
653 |
|
654 This function is particularly useful for WYSIWYG underlining or strikethrough, |
|
655 as it ensures that the lines extend into the gaps between characters. |
|
656 |
|
657 See CGraphicsContext::SetCharJustification() for more information. |
|
658 |
|
659 @param aExcessWidth The excess width (in pixels) to be distributed between |
|
660 the specified number of characters. |
|
661 @param aNumChars The number of characters involved |
|
662 @see CGraphicsContext::SetCharJustification() */ |
|
663 { |
|
664 SetJustification(aExcessWidth, aNumChars, EWsGcOpSetCharJustification); |
|
665 } |
|
666 |
|
667 EXPORT_C void CWindowGc::SetPenColor(const TRgb &aColor) |
|
668 /** Sets the pen colour. |
|
669 |
|
670 The effective pen colour depends on the drawing mode (see SetDrawMode()). |
|
671 |
|
672 The default pen colour is black. |
|
673 |
|
674 @param aColor The RGB colour for the pen. |
|
675 @see CGraphicsContext::SetPenColor() */ |
|
676 { |
|
677 TRgb color = aColor; |
|
678 iPimpl->StorePendingStateChange(CPimpl::EStatePenColor, &color); |
|
679 } |
|
680 |
|
681 EXPORT_C void CWindowGc::SetPenStyle(TPenStyle aPenStyle) |
|
682 /** Sets the line drawing style for the pen. |
|
683 |
|
684 The pen is used when drawing lines and for the outline of filled shapes. There |
|
685 are 6 pen styles (see CGraphicsContext::TPenStyle enum). If no pen style is |
|
686 set, the default is TPenStyle::ESolidPen. |
|
687 |
|
688 To use a pen style, its full context must be given, e.g. for a null pen: CGraphicsContext::TPenStyle::ENullPen. |
|
689 |
|
690 @param aPenStyle A pen style. |
|
691 @see CGraphicsContext::SetPenStyle() */ |
|
692 { |
|
693 iPimpl->StorePendingStateChange(CPimpl::EStatePenStyle, &aPenStyle); |
|
694 } |
|
695 |
|
696 EXPORT_C void CWindowGc::SetPenSize(const TSize& aSize) |
|
697 /** Sets the line drawing size for the pen. |
|
698 |
|
699 Lines of size greater than one pixel are drawn with rounded ends that extend |
|
700 beyond the end points, (as if the line is drawn using a circular pen tip of |
|
701 the specified size). Rounded ends of lines drawn with a wide pen are always |
|
702 drawn in TDrawMode::EDrawModePEN mode, overriding whatever mode has been set |
|
703 using SetDrawMode(). |
|
704 |
|
705 @param aSize A line size, the default being 1 pixel. |
|
706 @see CGraphicsContext::SetPenSize() */ |
|
707 { |
|
708 TSize size(aSize); |
|
709 iPimpl->StorePendingStateChange(CPimpl::EStatePenSize, &size); |
|
710 } |
|
711 |
|
712 EXPORT_C void CWindowGc::SetBrushColor(const TRgb &aColor) |
|
713 /** Sets the brush colour. |
|
714 |
|
715 The effective brush colour depends on the drawing mode (see SetDrawMode()). |
|
716 If no brush colour has been set, it defaults to white. However the default |
|
717 brush style is null, so when drawing to a window, the default appears to be |
|
718 the window's background colour. |
|
719 |
|
720 @param aColor The RGB colour for the brush. |
|
721 @see CGraphicsContext::SetBrushColor() */ |
|
722 { |
|
723 TRgb color = aColor; |
|
724 iPimpl->StorePendingStateChange(CPimpl::EStateBrushColor, &color); |
|
725 } |
|
726 |
|
727 EXPORT_C void CWindowGc::SetBrushStyle(TBrushStyle aBrushStyle) |
|
728 /** Sets the line drawing style for the brush. |
|
729 |
|
730 The GDI provides ten brush styles, including six built-in hatching patterns |
|
731 (see CGraphicsContext::TBrushStyle). |
|
732 |
|
733 Use TBrushStyle::ENullBrush to draw the outline of a fillable shape on its |
|
734 own, without filling. |
|
735 |
|
736 If the TBrushStyle::EPatternedBrush style is set, but no bitmap pattern has |
|
737 been selected using UseBrushPattern(), then the brush defaults to TBrushStyle::ENullBrush. |
|
738 |
|
739 Hatching lines are done in the current brush colour, set using SetBrushColor(). |
|
740 Hatching can be overlaid on other graphics. The hatching pattern starts at |
|
741 the brush origin, set using SetBrushOrigin(). |
|
742 |
|
743 @param aBrushStyle The brush style. |
|
744 @see CGraphicsContext::SetBrushStyle() */ |
|
745 { |
|
746 iPimpl->StorePendingStateChange(CPimpl::EStateBrushStyle, &aBrushStyle); |
|
747 } |
|
748 EXPORT_C void CWindowGc::SetBrushOrigin(const TPoint &aOrigin) |
|
749 /** Sets the brush pattern origin. |
|
750 |
|
751 This specifies the position of the pixel in the top left corner of a reference |
|
752 pattern tile, (in absolute device co-ordinates). Other copies of the pattern |
|
753 tile are then drawn around the reference one. Thus the brush origin can be |
|
754 set as the top left corner of a shape. |
|
755 |
|
756 The brush pattern may be a built-in style (see SetBrushStyle()), or a bitmap. |
|
757 To use a bitmap, the brush must have a pattern set (see UseBrushPattern()) |
|
758 and the brush style must be set to TBrushStyle::EPatternedBrush. |
|
759 |
|
760 Notes: |
|
761 |
|
762 If SetBrushOrigin() is not used, then the origin defaults to (0,0). |
|
763 |
|
764 This brush origin remains in effect for all fillable shapes drawn subsequently, |
|
765 until a new brush origin is set. Shapes can thus be considered as windows |
|
766 onto a continuous pattern field (covering the whole clipping region of a screen |
|
767 device, or the whole device area of a printer). |
|
768 |
|
769 @param aOrigin The origin point for the brush. |
|
770 @see CGraphicsContext::SetBrushOrigin() */ |
|
771 { |
|
772 WritePoint(aOrigin,EWsGcOpSetBrushOrigin); |
|
773 } |
|
774 |
|
775 EXPORT_C void CWindowGc::UseBrushPattern(const CFbsBitmap *aDevice) |
|
776 /** Sets the brush pattern to the specified bitmap. |
|
777 |
|
778 For the brush to actually use the bitmap, TBrushStyle::EPatternedBrush must |
|
779 be used to set the brush style (see SetBrushStyle()). When the brush pattern |
|
780 is no longer required, use DiscardBrushPattern() to free up the memory used, |
|
781 (if the bitmap is not being shared). If UseBrushPattern() is used again without |
|
782 using DiscardBrushPattern() then the previous pattern is discarded automatically. |
|
783 |
|
784 Notes: |
|
785 |
|
786 When loading a bitmap, the GDI checks to see if the bitmap is already in memory. |
|
787 If the bitmap is already there, then that copy is shared. |
|
788 |
|
789 The brush does not need to have a pattern set at all. There are several built-in |
|
790 hatching patterns, which can be selected using SetBrushStyle(). |
|
791 |
|
792 @param aDevice A bitmap pattern for the brush |
|
793 @see CGraphicsContext::UseBrushPattern() */ |
|
794 { |
|
795 WriteInt(aDevice->Handle(),EWsGcOpUseBrushPattern); |
|
796 AddToBitmapArray(aDevice->Handle()); |
|
797 } |
|
798 |
|
799 EXPORT_C void CWindowGc::DiscardBrushPattern() |
|
800 /** Discards a non-built-in brush pattern. |
|
801 |
|
802 This frees up the memory used for the bitmap, if it is not being shared by |
|
803 another process. |
|
804 |
|
805 If no brush pattern has been set when this function is called, it has no effect. |
|
806 |
|
807 @see CGraphicsContext::DiscardBrushPattern() */ |
|
808 { |
|
809 Write(EWsGcOpDiscardBrushPattern); |
|
810 } |
|
811 |
|
812 EXPORT_C void CWindowGc::Plot(const TPoint &aPoint) |
|
813 /** Draws a single point. |
|
814 |
|
815 The point is drawn with the current pen settings using the current drawing |
|
816 mode. |
|
817 |
|
818 Note: if the pen size is greater than one pixel, a filled circle of the current |
|
819 pen colour is drawn, with the pen size as the diameter and the plotted point |
|
820 as the centre. If the pen size is an even number of pixels, the extra pixels |
|
821 are drawn below and to the right of the centre. See SetPenSize(). |
|
822 |
|
823 @param aPoint The point to be drawn. |
|
824 @see CGraphicsContext::Plot() */ |
|
825 { |
|
826 iPimpl->WriteAnyPendingStateChanges(); |
|
827 WritePoint(aPoint,EWsGcOpPlot); |
|
828 } |
|
829 |
|
830 EXPORT_C void CWindowGc::DrawLine(const TPoint &aPoint1,const TPoint &aPoint2) |
|
831 /** Draws a straight line between two points. |
|
832 |
|
833 @param aPoint1 The point at the start of the line. |
|
834 @param aPoint2 The point at the end of the line. |
|
835 @see CGraphicsContext::DrawLine() */ |
|
836 { |
|
837 iPimpl->WriteAnyPendingStateChanges(); |
|
838 TWsGcCmdDrawLine drawLine(aPoint1,aPoint2); |
|
839 Write(&drawLine,sizeof(drawLine),EWsGcOpDrawLine); |
|
840 } |
|
841 |
|
842 EXPORT_C void CWindowGc::MoveTo(const TPoint &aPoint) |
|
843 /** Moves the internal drawing position relative to the co-ordinate origin, without |
|
844 drawing a line. |
|
845 |
|
846 A subsequent call to DrawLineTo() or DrawLineBy() will then use the new internal |
|
847 drawing position as the start point for the line drawn. |
|
848 |
|
849 Notes: |
|
850 |
|
851 The operations DrawLine(), DrawLineTo(), DrawLineBy() and DrawPolyline() also |
|
852 change the internal drawing position to the last point of the drawn line(s). |
|
853 |
|
854 The internal drawing position is set to the co-ordinate origin if no drawing |
|
855 or moving operations have yet taken place. |
|
856 |
|
857 @param aPoint The point to move the internal drawing position to. |
|
858 @see CGraphicsContext::MoveTo() |
|
859 @see CGraphicsContext::MoveBy() */ |
|
860 { |
|
861 WritePoint(aPoint,EWsGcOpMoveTo); |
|
862 } |
|
863 |
|
864 EXPORT_C void CWindowGc::MoveBy(const TPoint &aPoint) |
|
865 /** Moves the internal drawing position by a vector, without drawing a line. |
|
866 |
|
867 The internal drawing position is moved relative to its current co-ordinates. |
|
868 |
|
869 @param aPoint The vector to move the internal drawing position by. |
|
870 @see CGraphicsContext::MoveBy() |
|
871 @see CGraphicsContext::MoveTo() */ |
|
872 { |
|
873 WritePoint(aPoint,EWsGcOpMoveBy); |
|
874 } |
|
875 |
|
876 EXPORT_C void CWindowGc::DrawLineTo(const TPoint &aPoint) |
|
877 /** Draws a straight line from the current internal drawing position to a point. |
|
878 |
|
879 @param aPoint The point at the end of the line. |
|
880 @see CGraphicsContext::DrawLineTo() */ |
|
881 { |
|
882 iPimpl->WriteAnyPendingStateChanges(); |
|
883 WritePoint(aPoint,EWsGcOpDrawTo); |
|
884 } |
|
885 |
|
886 EXPORT_C void CWindowGc::DrawLineBy(const TPoint &aPoint) |
|
887 /** Draws a straight line relative to the current internal drawing position, using |
|
888 a vector. |
|
889 |
|
890 The start point of the line is the current internal drawing position. The |
|
891 vector aVector is added to the internal drawing position to give the end point |
|
892 of the line |
|
893 |
|
894 @param aPoint The vector to add to the current internal drawing position, |
|
895 giving the end point of the line. |
|
896 @see CGraphicsContext::DrawLineBy() */ |
|
897 { |
|
898 iPimpl->WriteAnyPendingStateChanges(); |
|
899 WritePoint(aPoint,EWsGcOpDrawBy); |
|
900 } |
|
901 |
|
902 void CWindowGc::doDrawPolyLine(const CArrayFix<TPoint> *aPointArray, const TPoint* aPointList,TInt aNumPoints) |
|
903 { |
|
904 TWsGcOpcodes opcode=EWsGcOpDrawPolyLine; |
|
905 TWsGcCmdDrawPolyLine polyLine; |
|
906 TInt maxBufLen=(iBuffer->BufferSize()-sizeof(TWsCmdHeader)-sizeof(polyLine))/sizeof(TPoint); |
|
907 TInt sent=0; |
|
908 while(sent<aNumPoints) |
|
909 { |
|
910 TInt availableLen; |
|
911 const TPoint *ptr; |
|
912 if (aPointArray) |
|
913 { |
|
914 ptr=&(*aPointArray)[sent]; |
|
915 availableLen=aPointArray->End(sent)-ptr; |
|
916 } |
|
917 else |
|
918 { |
|
919 ptr=aPointList+sent; |
|
920 availableLen=aNumPoints-sent; |
|
921 } |
|
922 polyLine.numPoints=Min(availableLen,maxBufLen); |
|
923 sent+=polyLine.numPoints; |
|
924 polyLine.more=(sent!=aNumPoints); |
|
925 Write(&polyLine,sizeof(polyLine),ptr,polyLine.numPoints*sizeof(TPoint),opcode); |
|
926 polyLine.last=ptr[polyLine.numPoints-1]; |
|
927 opcode=EWsGcOpDrawPolyLineContinued; |
|
928 } |
|
929 } |
|
930 |
|
931 EXPORT_C void CWindowGc::DrawPolyLine(const TPoint* aPointList,TInt aNumPoints) |
|
932 /** Draws a polyline using points in a list. |
|
933 |
|
934 A polyline is a series of concatenated straight lines joining a set of points. |
|
935 |
|
936 @param aPointList Pointer to a list of points on the polyline. |
|
937 @param aNumPoints The number of points in the point list. |
|
938 @see CGraphicsContext::DrawPolyLine() */ |
|
939 { |
|
940 iPimpl->WriteAnyPendingStateChanges(); |
|
941 doDrawPolyLine(NULL,aPointList,aNumPoints); |
|
942 } |
|
943 |
|
944 EXPORT_C void CWindowGc::DrawPolyLine(const CArrayFix<TPoint> *aPointArray) |
|
945 /** Draws a polyline using points in an array. |
|
946 |
|
947 A polyline is a series of concatenated straight lines joining a set of points. |
|
948 |
|
949 @param aPointArray An array containing the points on the polyline. |
|
950 @see CGraphicsContext::DrawPolyLine() */ |
|
951 { |
|
952 iPimpl->WriteAnyPendingStateChanges(); |
|
953 doDrawPolyLine(aPointArray,NULL,aPointArray->Count()); |
|
954 } |
|
955 |
|
956 TInt CWindowGc::doDrawPolygon(const CArrayFix<TPoint> *aPointArray,const TPoint* aPointList,TInt aNumPoints,TFillRule aFillRule) |
|
957 { |
|
958 if (aNumPoints<=0) |
|
959 return(KErrNone); |
|
960 TWsGcCmdSegmentedDrawPolygonData polyData; |
|
961 polyData.index=0; |
|
962 TInt maxBufLen=(iBuffer->BufferSize()-EPolygonMaxHeaderSize)/sizeof(TPoint); |
|
963 FOREVER |
|
964 { |
|
965 const TPoint *ptr; |
|
966 TInt availableLen; |
|
967 if (aPointArray) |
|
968 { |
|
969 ptr=&(*aPointArray)[polyData.index]; |
|
970 availableLen=aPointArray->End(polyData.index)-ptr; |
|
971 } |
|
972 else |
|
973 { |
|
974 ptr=aPointList+polyData.index; |
|
975 availableLen=aNumPoints-polyData.index; |
|
976 } |
|
977 polyData.numPoints=Min(availableLen,maxBufLen); |
|
978 if (polyData.index==0) // First time around |
|
979 { |
|
980 if (polyData.numPoints==aNumPoints) // Can it be done in one go? |
|
981 { |
|
982 TWsGcCmdDrawPolygon drawPolygon; |
|
983 drawPolygon.numPoints=aNumPoints; |
|
984 drawPolygon.fillRule=aFillRule; |
|
985 Write(&drawPolygon,sizeof(drawPolygon),ptr,aNumPoints*sizeof(TPoint),EWsGcOpDrawPolygon); |
|
986 break; |
|
987 } |
|
988 TWsGcCmdStartSegmentedDrawPolygon start; |
|
989 start.totalNumPoints=aNumPoints; |
|
990 TInt err=WriteReply(&start,sizeof(start),EWsGcOpStartSegmentedDrawPolygon); |
|
991 if (err!=KErrNone) |
|
992 return(err); |
|
993 } |
|
994 Write(&polyData,sizeof(polyData),ptr,polyData.numPoints*sizeof(TPoint),EWsGcOpSegmentedDrawPolygonData); |
|
995 polyData.index+=polyData.numPoints; |
|
996 if (polyData.index==aNumPoints) |
|
997 { |
|
998 TWsGcCmdDrawSegmentedPolygon draw; |
|
999 draw.fillRule=aFillRule; |
|
1000 Write(&draw,sizeof(draw),EWsGcOpDrawSegmentedPolygon); |
|
1001 break; |
|
1002 } |
|
1003 } |
|
1004 return(KErrNone); |
|
1005 } |
|
1006 |
|
1007 EXPORT_C TInt CWindowGc::DrawPolygon(const TPoint* aPointList,TInt aNumPoints,TFillRule aFillRule) |
|
1008 /** Draws and fills a polygon using points defined in a list. |
|
1009 |
|
1010 The first TPoint in the list defines the start of the first side of the polygon. |
|
1011 The second TPoint defines the second vertex (the end point of the first side |
|
1012 and the start point of the second side) and so on. The final side of the polygon |
|
1013 is drawn using the last TPoint from the array or list, and the line drawn |
|
1014 to the start point of the first side. |
|
1015 |
|
1016 Self-crossing polygons can be filled according to one of two rules, TFillRule::EAlternate |
|
1017 (the default), or TFillRule::EWinding. To explain the difference between these |
|
1018 rules, the concept of a winding number needs to be introduced. The area outside |
|
1019 any of the loops of the polygon has a winding number of zero, and is never |
|
1020 filled. An inside a loop which is bounded by an area with winding number 0 |
|
1021 has a winding number of 1. If an area is within a loop that is bounded by |
|
1022 an area with winding number 1, e.g. a loop within a loop, has a winding number |
|
1023 of 2, and so on. |
|
1024 |
|
1025 The filling of a polygon proceeds according to this algorithm: |
|
1026 |
|
1027 If aFillRule is TFillRule::EAlternate (default) and it has an odd winding |
|
1028 number, then fill the surrounding area. |
|
1029 |
|
1030 If aFillRule is TFillRule::EWinding and it has a winding number greater than |
|
1031 zero, then fill the surrounding area. |
|
1032 |
|
1033 This function always causes a flush of the window server buffer. |
|
1034 |
|
1035 @param aPointList Pointer to a list of points, specifying the vertices of |
|
1036 the polygon. |
|
1037 @param aNumPoints The number of points in the vertex list |
|
1038 @param aFillRule Either TFillRule::EAlternate (the default) or TFillRule::EWinding. |
|
1039 @return KErrNone if successful, otherwise another of the system-wide error |
|
1040 codes. |
|
1041 @see CGraphicsContext::DrawPolygon() */ |
|
1042 { |
|
1043 iPimpl->WriteAnyPendingStateChanges(); |
|
1044 return(doDrawPolygon(NULL,aPointList,aNumPoints,aFillRule)); |
|
1045 } |
|
1046 |
|
1047 EXPORT_C TInt CWindowGc::DrawPolygon(const CArrayFix<TPoint> *aPointArray,TFillRule aFillRule) |
|
1048 /** Draws and fills a polygon using points defined in an array. |
|
1049 |
|
1050 The first TPoint in the array defines the start of the first side of the polygon. |
|
1051 The second TPoint defines the second vertex (the end point of the first side |
|
1052 and the start point of the second side) and so on. The final side of the polygon |
|
1053 is drawn using the last TPoint from the array or list, and the line drawn |
|
1054 to the start point of the first side. |
|
1055 |
|
1056 Self-crossing polygons can be filled according to one of two rules, TFillRule::EAlternate |
|
1057 (the default), or TFillRule::EWinding. To explain the difference between these |
|
1058 rules, the concept of a winding number needs to be introduced. The area outside |
|
1059 any of the loops of the polygon has a winding number of zero, and is never |
|
1060 filled. An inside a loop which is bounded by an area with winding number 0 |
|
1061 has a winding number of 1. If an area is within a loop that is bounded by |
|
1062 an area with winding number 1, e.g. a loop within a loop, has a winding number |
|
1063 of 2, and so on. |
|
1064 |
|
1065 The filling of a polygon proceeds according to this algorithm: |
|
1066 |
|
1067 If aFillRule is TFillRule::EAlternate (default) and it has an odd winding |
|
1068 number, then fill the surrounding area. |
|
1069 |
|
1070 If aFillRule is TFillRule::EWinding and it has a winding number greater than |
|
1071 zero, then fill the surrounding area. |
|
1072 |
|
1073 This function always causes a flush of the window server buffer. |
|
1074 |
|
1075 @param aPointArray An array of points, specifying the vertices of the polygon. |
|
1076 @param aFillRule Either TFillRule::EAlternate (the default) or TFillRule::EWinding. |
|
1077 @return KErrNone if successful, otherwise another of the system-wide error |
|
1078 codes. |
|
1079 @see CGraphicsContext::DrawPolygon() */ |
|
1080 { |
|
1081 iPimpl->WriteAnyPendingStateChanges(); |
|
1082 return(doDrawPolygon(aPointArray,NULL,aPointArray->Count(),aFillRule)); |
|
1083 } |
|
1084 |
|
1085 void CWindowGc::DrawArcOrPie(const TRect &aRect,const TPoint &aStart,const TPoint &aEnd, TInt aOpcode) |
|
1086 { |
|
1087 iPimpl->WriteAnyPendingStateChanges(); |
|
1088 TWsGcCmdDrawArcOrPie cmd(aRect,aStart,aEnd); |
|
1089 Write(&cmd,sizeof(cmd),aOpcode); |
|
1090 } |
|
1091 |
|
1092 EXPORT_C void CWindowGc::DrawArc(const TRect &aRect,const TPoint &aStart,const TPoint &aEnd) |
|
1093 /** Draws an arc (a portion of an ellipse). |
|
1094 |
|
1095 The point aStart is used to define one end of a line from the geometric centre |
|
1096 of the ellipse. The point of intersection between this line and the ellipse |
|
1097 defines the start point of the arc. The point aEnd is used to define one end |
|
1098 of a second line from the geometric centre of the ellipse. The point of intersection |
|
1099 between this line and the ellipse defines the end point of the arc. The pixels |
|
1100 at both the start point and the end point are drawn. |
|
1101 |
|
1102 The arc itself is the segment of the ellipse in an anti-clockwise direction |
|
1103 from the start point to the end point. |
|
1104 |
|
1105 Notes |
|
1106 |
|
1107 A rectangle is used in the construction of the ellipse of which the arc is |
|
1108 a segment. This rectangle is passed as an argument of type TRect. |
|
1109 |
|
1110 A wide line arc is drawn with the pixels distributed either side of a true |
|
1111 ellipse, in such a way that the outer edge of the line would touch the edge |
|
1112 of the construction rectangle. In other words, the ellipse used to construct |
|
1113 it is slightly smaller than that for a single pixel line size. |
|
1114 |
|
1115 If aStart or aEnd are the ellipse centre then the line that defines the start/end |
|
1116 of the arc defaults to one extending vertically above the centre point. |
|
1117 |
|
1118 If aStart and aEnd are the same point, or points on the same line through |
|
1119 the ellipse centre then a complete unfilled ellipse is drawn. |
|
1120 |
|
1121 Line drawing is subject to pen colour, width and style and draw mode |
|
1122 |
|
1123 @param aRect The rectangle in which to draw the ellipse (of which the arc is |
|
1124 a segment). |
|
1125 @param aStart A point to define the start of the arc. |
|
1126 @param aEnd A point to define the end of the arc. |
|
1127 @see CGraphicsContext::DrawArc() */ |
|
1128 { |
|
1129 iPimpl->WriteAnyPendingStateChanges(); |
|
1130 DrawArcOrPie(aRect,aStart,aEnd,EWsGcOpDrawArc); |
|
1131 } |
|
1132 |
|
1133 EXPORT_C void CWindowGc::DrawPie(const TRect &aRect,const TPoint &aStart,const TPoint &aEnd) |
|
1134 /** Draws and fills a pie-shaped slice of an ellipse. |
|
1135 |
|
1136 Outlines are subject to the current pen colour, width, style and draw mode. |
|
1137 Set the pen to ENullPen for no outline. The fill is subject to brush style |
|
1138 (colour, hash or pattern), the origin and the current drawing mode. Set the |
|
1139 brush to ENullBrush for no fill. |
|
1140 |
|
1141 The point aStart is used to define one end of a line to the centre of the |
|
1142 ellipse. The point of intersection between this line and the ellipse defines |
|
1143 the start point of the arc bounding the pie slice. The point aEnd is used |
|
1144 to define one end of a second line to the centre of the ellipse. The point |
|
1145 of intersection between this line and the ellipse defines the end point of |
|
1146 the arc bounding the pie slice. The pixels at the end point are not drawn. |
|
1147 |
|
1148 The pie slice itself is the area bounded by: the arc of the ellipse in an |
|
1149 anticlockwise direction from the start point to the end point; the straight |
|
1150 line from the start point from the geometric centre of the ellipse; the |
|
1151 straight line from the end point from the geometric centre of the ellipse. |
|
1152 |
|
1153 The line drawn by the pen goes inside the rectangle given by the aRect argument. |
|
1154 |
|
1155 Notes: |
|
1156 |
|
1157 A rectangle is used in the construction of the pie slice. This rectangle is |
|
1158 passed as an argument of type TRect. The curved edge of the pie slice is an |
|
1159 arc of an ellipse constructed within the rectangle. |
|
1160 |
|
1161 A wide line edged pie slice has the arc drawn with the pixels distributed |
|
1162 either side of a true ellipse. This is done in such a way that the outer edge |
|
1163 of the line would touch the edge of the construction rectangle. In other words, |
|
1164 the ellipse used to construct it is slightly smaller than that for a single |
|
1165 pixel line size. |
|
1166 |
|
1167 If aStart or aEnd are the ellipse centre then the line that defines the start/end |
|
1168 of the arc defaults to one extending vertically above the centre point. |
|
1169 |
|
1170 If aStart and aEnd are the same point, or points on the same line through |
|
1171 the ellipse centre then a complete filled ellipse is drawn. A line is also |
|
1172 drawn from the edge to the ellipse centre. |
|
1173 |
|
1174 @param aRect A rectangle in which to draw the ellipse bounding the pie slice |
|
1175 @param aStart A point to define the start of the pie slice |
|
1176 @param aEnd A point to define the end of the pie slice |
|
1177 @see CGraphicsContext::DrawPie() */ |
|
1178 { |
|
1179 iPimpl->WriteAnyPendingStateChanges(); |
|
1180 DrawArcOrPie(aRect,aStart,aEnd,EWsGcOpDrawPie); |
|
1181 } |
|
1182 |
|
1183 EXPORT_C void CWindowGc::DrawEllipse(const TRect &aRect) |
|
1184 /** Draws and fills an ellipse. |
|
1185 |
|
1186 The ellipse is drawn inside the rectangle defined by the aRect argument. Any |
|
1187 TRect that has odd pixel dimensions, has the bottom right corner trimmed to |
|
1188 give even pixel dimensions before the ellipse is constructed. |
|
1189 |
|
1190 The column and row of pixels containing the bottom right co-ordinate of the |
|
1191 aRect argument are not part of the rectangle. |
|
1192 |
|
1193 Note: a wide outline ellipse is drawn with the pixels distributed either side of |
|
1194 a true ellipse, in such a way that the outer edge of the line touches the |
|
1195 edge of the construction rectangle. In other words, the ellipse used to construct |
|
1196 it is smaller than that for a single pixel line size. |
|
1197 |
|
1198 @param aRect The rectangle in which to draw the ellipse |
|
1199 @see CGraphicsContext::DrawEllipse() */ |
|
1200 { |
|
1201 iPimpl->WriteAnyPendingStateChanges(); |
|
1202 WriteRect(aRect,EWsGcOpDrawEllipse); |
|
1203 } |
|
1204 |
|
1205 EXPORT_C void CWindowGc::DrawRect(const TRect &aRect) |
|
1206 /** Draws and fills a rectangle. |
|
1207 |
|
1208 The rectangle's border is drawn with the pen, and it is filled using the brush. |
|
1209 |
|
1210 @param aRect The rectangle to be drawn. |
|
1211 @see CGraphicsContext::DrawRect() */ |
|
1212 { |
|
1213 iPimpl->WriteAnyPendingStateChanges(); |
|
1214 WriteRect(aRect,EWsGcOpDrawRect); |
|
1215 } |
|
1216 |
|
1217 EXPORT_C void CWindowGc::DrawRoundRect(const TRect &aRect,const TSize &aEllipse) |
|
1218 /** Draws and fills a rectangle with rounded corners. |
|
1219 |
|
1220 The rounded corners are each constructed as an arc of an ellipse. The dimensions |
|
1221 of each corner (corner size and corner height) are given by aEllipse. See |
|
1222 DrawArc() for a description of arc construction. |
|
1223 |
|
1224 The line drawn by the pen (if any) goes inside the rectangle given by the |
|
1225 TRect argument. |
|
1226 |
|
1227 Notes: |
|
1228 |
|
1229 Dotted and dashed pen styles cannot be used for the outline of a rounded rectangle. |
|
1230 |
|
1231 If either corner size dimension is greater than half the corresponding rectangle |
|
1232 length, the corner size dimension is reduced to half the rectangle size. |
|
1233 |
|
1234 @param aRect The rectangle to be drawn. |
|
1235 @param aEllipse The dimensions of each corner. |
|
1236 @see CGraphicsContext::DrawRoundRect() */ |
|
1237 { |
|
1238 iPimpl->WriteAnyPendingStateChanges(); |
|
1239 TWsGcCmdDrawRoundRect drawRoundRect(aRect,aEllipse); |
|
1240 Write(&drawRoundRect,sizeof(drawRoundRect),EWsGcOpDrawRoundRect); |
|
1241 } |
|
1242 |
|
1243 EXPORT_C void CWindowGc::DrawBitmap(const TPoint &aTopLeft, const CFbsBitmap *aDevice) |
|
1244 /** Draws a bitmap at a specified point. |
|
1245 |
|
1246 The function does a compress/stretch based on its internally stored size in |
|
1247 twips. Note that if the twips value of the bitmap is not set then nothing |
|
1248 is drawn (this is the default situation). |
|
1249 |
|
1250 Windows that store their redraw commands will only store drawing position and a handle to bitmaps |
|
1251 that are drawn in it. The bitmap handle is just a pointer to the bitmap in the FBSERV heap. |
|
1252 At some point later WSERV may need to draw that window again and it will just replay the |
|
1253 stored commands including the draw bitmap. However, if the client has changed the content of the bitmap, |
|
1254 WSERV will effectively draw a different bitmap when it replays the commands. |
|
1255 |
|
1256 Note: this member function uses the bitmap's size in twips and does a stretch/compress |
|
1257 blit using a linear DDA. |
|
1258 |
|
1259 @param aTopLeft The point where the top left pixel of the bitmap is to be |
|
1260 drawn |
|
1261 @param aDevice The source bitmap. |
|
1262 @see CGraphicsContext::DrawBitmap() */ |
|
1263 { |
|
1264 iPimpl->WriteAnyPendingStateChanges(); |
|
1265 TWsGcCmdDrawBitmap drawBitmap(aTopLeft,aDevice->Handle()); |
|
1266 Write(&drawBitmap,sizeof(drawBitmap),EWsGcOpDrawBitmap); |
|
1267 AddToBitmapArray(aDevice->Handle()); |
|
1268 } |
|
1269 |
|
1270 EXPORT_C void CWindowGc::DrawBitmap(const TRect &aDestRect, const CFbsBitmap *aDevice) |
|
1271 /** Draws a bitmap in a rectangle. |
|
1272 |
|
1273 The bitmap is compressed/stretched to fit the specified rectangle. Note that |
|
1274 if the twips value of the bitmap is not set then nothing is drawn (this is |
|
1275 the default situation). |
|
1276 |
|
1277 Windows that store their redraw commands will only store drawing position and a handle to bitmaps |
|
1278 that are drawn in it. The bitmap handle is just a pointer to the bitmap in the FBSERV heap. |
|
1279 At some point later WSERV may need to draw that window again and it will just replay the |
|
1280 stored commands including the draw bitmap. However, if the client has changed the content of the bitmap, |
|
1281 WSERV will effectively draw a different bitmap when it replays the commands. |
|
1282 |
|
1283 Notes: this member function uses the bitmap's size in pixels and does a stretch/compress |
|
1284 blit using a linear DDA. |
|
1285 |
|
1286 @param aDestRect The rectangle within which the bitmap is to be drawn. |
|
1287 @param aDevice The source bitmap. |
|
1288 @see CGraphicsContext::DrawBitmap() */ |
|
1289 { |
|
1290 iPimpl->WriteAnyPendingStateChanges(); |
|
1291 TWsGcCmdDrawBitmap2 drawBitmap(aDestRect,aDevice->Handle()); |
|
1292 Write(&drawBitmap,sizeof(drawBitmap),EWsGcOpDrawBitmap2); |
|
1293 AddToBitmapArray(aDevice->Handle()); |
|
1294 } |
|
1295 |
|
1296 EXPORT_C void CWindowGc::DrawBitmap(const TRect &aDestRect, const CFbsBitmap *aDevice, const TRect &aSourceRect) |
|
1297 /** Draws a specified rectangle from a bitmap into another rectangle. |
|
1298 |
|
1299 The function compresses/stretches the specified rectangle from the bitmap |
|
1300 to fit the destination rectangle. Note that if the twips value of the bitmap |
|
1301 is not set then nothing is drawn (this is the default situation). |
|
1302 |
|
1303 Windows that store their redraw commands will only store drawing position and a handle to bitmaps |
|
1304 that are drawn in it. The bitmap handle is just a pointer to the bitmap in the FBSERV heap. |
|
1305 At some point later WSERV may need to draw that window again and it will just replay the |
|
1306 stored commands including the draw bitmap. However, if the client has changed the content of the bitmap, |
|
1307 WSERV will effectively draw a different bitmap when it replays the commands. |
|
1308 |
|
1309 Note: this member function uses rectangle sizes in pixels and does a stretch/compress |
|
1310 blit using a linear DDA. |
|
1311 |
|
1312 @param aDestRect The rectangle within which the bitmap is to be drawn. |
|
1313 @param aDevice A source bitmap. |
|
1314 @param aSourceRect The rectangle in the source bitmap that is copied to the |
|
1315 destination rectangle. |
|
1316 @see CGraphicsContext::DrawBitmap() */ |
|
1317 { |
|
1318 iPimpl->WriteAnyPendingStateChanges(); |
|
1319 TWsGcCmdDrawBitmap3 drawBitmap(aDestRect,aDevice->Handle(),aSourceRect); |
|
1320 Write(&drawBitmap,sizeof(drawBitmap),EWsGcOpDrawBitmap3); |
|
1321 AddToBitmapArray(aDevice->Handle()); |
|
1322 } |
|
1323 |
|
1324 /** Draws a specified rectangle from a bitmap and its mask into another rectangle. |
|
1325 |
|
1326 The function compresses/stretches the specified rectangle from the bitmap |
|
1327 to fit the destination rectangle. |
|
1328 The mask bitmap can be used as either a positive or negative mask. Masked |
|
1329 pixels are not mapped to the destination rectangle. |
|
1330 |
|
1331 A black and white (binary) mask bitmap is used. With aInvertMask=EFalse, black |
|
1332 pixels in the mask bitmap stop corresponding pixels in the source bitmap from |
|
1333 being transferred to the destination rectangle. With aInvertMask=ETrue, white |
|
1334 pixels in the mask bitmap stop corresponding pixels in the source bitmap from |
|
1335 being transferred to the destination rectangle. |
|
1336 |
|
1337 If mask bitmap's display mode is EColor256, the function does AplhaBlending |
|
1338 and ignores aInvertMask parameter. |
|
1339 |
|
1340 Windows that store their redraw commands will only store drawing position and a handle to bitmaps |
|
1341 that are drawn in it. The bitmap handle is just a pointer to the bitmap in the FBSERV heap. |
|
1342 At some point later WSERV may need to draw that window again and it will just replay the |
|
1343 stored commands including the draw bitmap. However, if the client has changed the content of the bitmap, |
|
1344 WSERV will effectively draw a different bitmap when it replays the commands. |
|
1345 |
|
1346 Note: this member function uses rectangle sizes in pixels and does a stretch/compress |
|
1347 blit using a linear DDA. |
|
1348 |
|
1349 @param aDestRect The rectangle within which the masked bitmap is to be drawn. |
|
1350 @param aBitmap A source bitmap. |
|
1351 @param aSourceRect The rectangle in the source bitmap that is copied to the |
|
1352 destination rectangle. |
|
1353 @param aMaskBitmap A mask bitmap. |
|
1354 @param aInvertMask If false, a source pixel that is masked by a black pixel |
|
1355 is not transferred to the destination rectangle. If true, then a source pixel |
|
1356 that is masked by a white pixel is not transferred to the destination rectangle. */ |
|
1357 EXPORT_C void CWindowGc::DrawBitmapMasked(const TRect& aDestRect, const CFbsBitmap* aBitmap, const TRect& aSourceRect, const CFbsBitmap* aMaskBitmap, TBool aInvertMask) |
|
1358 { |
|
1359 iPimpl->WriteAnyPendingStateChanges(); |
|
1360 TWsGcCmdDrawBitmapMasked drawBitmap(aDestRect,aBitmap->Handle(),aSourceRect,aMaskBitmap->Handle(),aInvertMask); |
|
1361 Write(&drawBitmap,sizeof(drawBitmap),EWsGcOpDrawBitmapMasked); |
|
1362 AddToBitmapArray(aBitmap->Handle()); |
|
1363 AddToBitmapArray(aMaskBitmap->Handle()); |
|
1364 } |
|
1365 |
|
1366 EXPORT_C void CWindowGc::DrawBitmapMasked(const TRect& aDestRect, const CWsBitmap* aBitmap, const TRect& aSourceRect, const CWsBitmap* aMaskBitmap, TBool aInvertMask) |
|
1367 /** Draws a specified rectangle from a wserv bitmap and its mask into |
|
1368 another rectangle. |
|
1369 |
|
1370 The function compresses/stretches the specified rectangle from the bitmap |
|
1371 to fit the destination rectangle. |
|
1372 The mask bitmap can be used as either a positive or negative mask. Masked |
|
1373 pixels are not mapped to the destination rectangle. |
|
1374 |
|
1375 A black and white (binary) mask bitmap is used. With aInvertMask=EFalse, black |
|
1376 pixels in the mask bitmap stop corresponding pixels in the source bitmap from |
|
1377 being transferred to the destination rectangle. With aInvertMask=ETrue, white |
|
1378 pixels in the mask bitmap stop corresponding pixels in the source bitmap from |
|
1379 being transferred to the destination rectangle. |
|
1380 |
|
1381 If mask bitmap's display mode is EColor256, the function does AplhaBlending |
|
1382 and ignores aInvertMask parameter. |
|
1383 |
|
1384 Windows that store their redraw commands will only store drawing position and a handle to bitmaps |
|
1385 that are drawn in it. The bitmap handle is just a pointer to the bitmap in the FBSERV heap. |
|
1386 At some point later WSERV may need to draw that window again and it will just replay the |
|
1387 stored commands including the draw bitmap. However, if the client has changed the content of the bitmap, |
|
1388 WSERV will effectively draw a different bitmap when it replays the commands. |
|
1389 |
|
1390 Note: this member function uses rectangle sizes in pixels and does a stretch/compress |
|
1391 blit using a linear DDA. |
|
1392 |
|
1393 @param aDestRect The rectangle within which the masked bitmap is to be drawn. |
|
1394 @param aBitmap A source wserv bitmap. |
|
1395 @param aSourceRect The rectangle in the source bitmap that is copied to the |
|
1396 destination rectangle. |
|
1397 @param aMaskBitmap A mask wserv bitmap. |
|
1398 @param aInvertMask If false, a source pixel that is masked by a black pixel |
|
1399 is not transferred to the destination rectangle. If true, then a source pixel |
|
1400 that is masked by a white pixel is not transferred to the destination rectangle. */ |
|
1401 { |
|
1402 iPimpl->WriteAnyPendingStateChanges(); |
|
1403 TWsGcCmdDrawBitmapMasked drawBitmap(aDestRect,aBitmap->WsHandle(),aSourceRect,aMaskBitmap->WsHandle(),aInvertMask); |
|
1404 Write(&drawBitmap,sizeof(drawBitmap),EWsGcOpWsDrawBitmapMasked); |
|
1405 AddToBitmapArray(aBitmap->Handle()); |
|
1406 AddToBitmapArray(aMaskBitmap->Handle()); |
|
1407 } |
|
1408 EXPORT_C void CWindowGc::DrawText(const TDesC &aBuf, const TPoint &aPos) |
|
1409 /** Draws horizontal text with no surrounding box. |
|
1410 |
|
1411 The appearance of the text is subject to the drawing mode, the font, pen colour, |
|
1412 word justification and character justification. |
|
1413 |
|
1414 A panic occurs if this function is called when there is no font: see UseFont(). |
|
1415 |
|
1416 @param aBuf The string to write. |
|
1417 @param aPos The point specifying the position of the baseline at the left |
|
1418 end of the text. |
|
1419 @see CGraphicsContext::DrawText() */ |
|
1420 { |
|
1421 iPimpl->WriteAnyPendingStateChanges(); |
|
1422 TWsGcCmdDrawText printText(aPos,aBuf.Length()); |
|
1423 WriteTextCommand(&printText,sizeof(printText),aBuf,EWsGcOpDrawText,EWsGcOpDrawTextPtr); |
|
1424 } |
|
1425 |
|
1426 EXPORT_C void CWindowGc::DrawText(const TDesC &aBuf,const TRect &aBox,TInt aBaselineOffset,TTextAlign aHoriz,TInt aLeftMrg) |
|
1427 /** Draws horizontal text within a cleared box. |
|
1428 |
|
1429 The appearance of the text is subject to the drawing mode, the font, pen colour, |
|
1430 word justification and character justification. It is also subject to the |
|
1431 background brush (set brush to ENullBrush for no effect on background). |
|
1432 |
|
1433 A panic occurs if this function is called when there is no font: see UseFont(). |
|
1434 |
|
1435 Note: the text is clipped to the box. You must ensure that the specified string |
|
1436 is not too large. |
|
1437 |
|
1438 @param aBuf The text to write. |
|
1439 @param aBox The box to draw the text in. |
|
1440 @param aBaselineOffset An offset from the top of the box to the text baseline. |
|
1441 Note that the baseline is the line on which letters sit, for instance below r, s, t, and |
|
1442 above the tail of q, and y. |
|
1443 @param aHoriz The text alignment mode (default is left, rather than centre |
|
1444 or right). |
|
1445 @param aLeftMrg The left margin for left-aligned text, or the right margin |
|
1446 for right-aligned text (default is zero). |
|
1447 @see CGraphicsContext::DrawText() */ |
|
1448 { |
|
1449 iPimpl->WriteAnyPendingStateChanges(); |
|
1450 if (aBuf.Size()<(TInt)(iBuffer->BufferSize()-sizeof(TWsCmdHeader)-sizeof(TWsGcCmdBoxTextOptimised2))) |
|
1451 { |
|
1452 if (aHoriz==ELeft && aLeftMrg==0) |
|
1453 { |
|
1454 TWsGcCmdBoxTextOptimised1 boxTextOpt1(aBox,aBaselineOffset,aBuf.Length()); |
|
1455 Write(&boxTextOpt1,sizeof(boxTextOpt1),aBuf.Ptr(),aBuf.Size(),EWsGcOpDrawBoxTextOptimised1); |
|
1456 } |
|
1457 else |
|
1458 { |
|
1459 TWsGcCmdBoxTextOptimised2 boxTextOpt2(aBox,aBaselineOffset,aHoriz,aLeftMrg,aBuf.Length()); |
|
1460 Write(&boxTextOpt2,sizeof(boxTextOpt2),aBuf.Ptr(),aBuf.Size(),EWsGcOpDrawBoxTextOptimised2); |
|
1461 } |
|
1462 } |
|
1463 else |
|
1464 { |
|
1465 TWsGcCmdBoxText boxText(aBox,aBaselineOffset,aHoriz,aLeftMrg,aBuf.Length(),iPimpl->iFont->TextWidthInPixels(aBuf)); |
|
1466 WriteTextCommand(&boxText,sizeof(boxText),aBuf,EWsGcOpDrawBoxText,EWsGcOpDrawBoxTextPtr); |
|
1467 } |
|
1468 } |
|
1469 |
|
1470 TInt CWindowGc::APIExDrawText(const TDesC& aBuf,const TTextParameters* aParam,const TPoint& aPos) |
|
1471 { |
|
1472 iPimpl->WriteAnyPendingStateChanges(); |
|
1473 TWsGcCmdDrawTextInContext printTextInContext(aPos,aBuf.Length(),aParam->iStart,aParam->iEnd); |
|
1474 WriteTextCommand(&printTextInContext,sizeof(printTextInContext),aBuf,EWsGcOpDrawTextInContext,EWsGcOpDrawTextInContextPtr); |
|
1475 return KErrNone; |
|
1476 } |
|
1477 |
|
1478 TInt CWindowGc::APIExDrawText(const TDesC& aBuf,const TTextParameters* aParam,const TRect& aBox,TInt aBaselineOffset,TTextAlign aHoriz,TInt aLeftMrg) |
|
1479 { |
|
1480 iPimpl->WriteAnyPendingStateChanges(); |
|
1481 if (aBuf.Size()<(TInt)(iBuffer->BufferSize()-sizeof(TWsCmdHeader)-sizeof(TWsGcCmdBoxTextInContextOptimised2))) |
|
1482 { |
|
1483 if (aHoriz==ELeft && aLeftMrg==0) |
|
1484 { |
|
1485 TWsGcCmdBoxTextInContextOptimised1 boxTextOpt1(aBox,aBaselineOffset,aBuf.Length(),aParam->iStart,aParam->iEnd); |
|
1486 Write(&boxTextOpt1,sizeof(boxTextOpt1),aBuf.Ptr(),aBuf.Size(),EWsGcOpDrawBoxTextInContextOptimised1); |
|
1487 } |
|
1488 else |
|
1489 { |
|
1490 TWsGcCmdBoxTextInContextOptimised2 boxTextOpt2(aBox,aBaselineOffset,aHoriz,aLeftMrg,aBuf.Length(),aParam->iStart,aParam->iEnd); |
|
1491 Write(&boxTextOpt2,sizeof(boxTextOpt2),aBuf.Ptr(),aBuf.Size(),EWsGcOpDrawBoxTextInContextOptimised2); |
|
1492 } |
|
1493 } |
|
1494 else |
|
1495 { |
|
1496 TWsGcCmdBoxTextInContext boxText(aBox,aBaselineOffset,aHoriz,aLeftMrg,aBuf.Length(),iPimpl->iFont->TextWidthInPixels(aBuf),aParam->iStart,aParam->iEnd); |
|
1497 WriteTextCommand(&boxText,sizeof(boxText),aBuf,EWsGcOpDrawBoxTextInContext,EWsGcOpDrawBoxTextInContextPtr); |
|
1498 } |
|
1499 return KErrNone; |
|
1500 } |
|
1501 EXPORT_C void CWindowGc::DrawTextVertical(const TDesC& aText,const TPoint& aPos,TBool aUp) |
|
1502 /** Draws vertical text in the specified direction. |
|
1503 |
|
1504 A panic occurs if this function is called when there is no font: see UseFont(). |
|
1505 |
|
1506 @param aText The text to be drawn. |
|
1507 @param aPos Point of origin of the text baseline. |
|
1508 @param aUp Direction. ETrue for up, EFalse for down. */ |
|
1509 { |
|
1510 iPimpl->WriteAnyPendingStateChanges(); |
|
1511 TWsGcCmdDrawTextVertical printText(aPos,aText.Length(),aUp); |
|
1512 WriteTextCommand(&printText,sizeof(printText),aText,EWsGcOpDrawTextVertical,EWsGcOpDrawTextVerticalPtr); |
|
1513 } |
|
1514 |
|
1515 EXPORT_C void CWindowGc::DrawTextVertical(const TDesC& aText,const TRect& aBox,TInt aBaselineOffset,TBool aUp,TTextAlign aVert,TInt aMargin) |
|
1516 /** Draws text vertically in the specified direction, within a box of the specified |
|
1517 size. |
|
1518 |
|
1519 A panic occurs if this function is called when there is no font: see UseFont(). |
|
1520 |
|
1521 @param aText The text to be drawn. |
|
1522 @param aBox The bounding box within which the text should be drawn, and which |
|
1523 it is clipped to. |
|
1524 @param aBaselineOffset The height of the top of the characters from their text |
|
1525 baseline. |
|
1526 @param aUp The direction. ETrue for up, EFalse for down. |
|
1527 @param aVert The text alignment. |
|
1528 @param aMargin The margin. */ |
|
1529 { |
|
1530 iPimpl->WriteAnyPendingStateChanges(); |
|
1531 TWsGcCmdBoxTextVertical boxText(aBox); |
|
1532 boxText.baselineOffset=aBaselineOffset; |
|
1533 boxText.up=aUp; |
|
1534 boxText.vert=aVert; |
|
1535 boxText.margin=aMargin; |
|
1536 boxText.length=aText.Length(); |
|
1537 boxText.width=iPimpl->iFont->TextWidthInPixels(aText); |
|
1538 WriteTextCommand(&boxText,sizeof(boxText),aText,EWsGcOpDrawBoxTextVertical,EWsGcOpDrawBoxTextVerticalPtr); |
|
1539 } |
|
1540 |
|
1541 TInt CWindowGc::APIExDrawTextVertical(const TDesC& aText,const TTextParameters* aParam,const TPoint& aPos,TBool aUp) |
|
1542 { |
|
1543 iPimpl->WriteAnyPendingStateChanges(); |
|
1544 TWsGcCmdDrawTextInContextVertical printText(aPos,aText.Length(),aUp,aParam->iStart,aParam->iEnd); |
|
1545 WriteTextCommand(&printText,sizeof(printText),aText,EWsGcOpDrawTextInContextVertical,EWsGcOpDrawTextInContextVerticalPtr); |
|
1546 return KErrNone; |
|
1547 } |
|
1548 |
|
1549 TInt CWindowGc::APIExDrawTextVertical(const TDesC& aText,const TTextParameters* aParam,const TRect& aBox,TInt aBaselineOffset,TBool aUp,TTextAlign aVert,TInt aMargin) |
|
1550 { |
|
1551 iPimpl->WriteAnyPendingStateChanges(); |
|
1552 TWsGcCmdBoxTextInContextVertical boxText(aBox); |
|
1553 boxText.baselineOffset=aBaselineOffset; |
|
1554 boxText.up=aUp; |
|
1555 boxText.vert=aVert; |
|
1556 boxText.margin=aMargin; |
|
1557 boxText.length=aText.Length(); |
|
1558 boxText.width=iPimpl->iFont->TextWidthInPixels(aText); |
|
1559 boxText.start = aParam->iStart; |
|
1560 boxText.end = aParam->iEnd; |
|
1561 WriteTextCommand(&boxText,sizeof(boxText),aText,EWsGcOpDrawBoxTextInContextVertical,EWsGcOpDrawBoxTextInContextVerticalPtr); |
|
1562 return KErrNone; |
|
1563 } |
|
1564 |
|
1565 //========================Extra functions============================ |
|
1566 |
|
1567 EXPORT_C void CWindowGc::CopyRect(const TPoint &anOffset,const TRect &aRect) |
|
1568 /** Copies a rectangle from any part of the screen into the window that the gc |
|
1569 is active on. |
|
1570 |
|
1571 The copy part of the operation applies to the whole rectangle, irrespective |
|
1572 of whether or not it within the window, however the "paste" is clipped to |
|
1573 the drawing area. |
|
1574 |
|
1575 The rectangle is specified in window coordinates (if the top-left of the rectangle |
|
1576 is (0,0) then the area of the screen it specifies has its top-left at the |
|
1577 top left corner of the window, if it is (-10,-10) then it starts 10 pixels |
|
1578 above and to the left of the window). |
|
1579 |
|
1580 Note: shadows in the source rectangle will be copied. None of the area drawn to |
|
1581 will gain shadowing (even if the window is already in shadow). |
|
1582 |
|
1583 This version of this function is only really suitable for testing. |
|
1584 |
|
1585 @param anOffset The offset from the original position to the point where the |
|
1586 rectangle is copied. |
|
1587 @param aRect The rectangular area to be copied. This is in window co-ordinates, |
|
1588 e.g. the top left corner of the window is position (0,0) with respect to the |
|
1589 rectangle. |
|
1590 @see CBitmapContext::CopyRect() */ |
|
1591 { |
|
1592 iPimpl->WriteAnyPendingStateChanges(); |
|
1593 TWsGcCmdCopyRect copyRect(anOffset,aRect); |
|
1594 Write(©Rect,sizeof(copyRect),EWsGcOpCopyRect); |
|
1595 } |
|
1596 |
|
1597 EXPORT_C void CWindowGc::BitBlt(const TPoint &aPoint, const CFbsBitmap *aBitmap) |
|
1598 /** Performs a bitmap block transfer. |
|
1599 |
|
1600 Windows that store their redraw commands will only store drawing position and a handle to bitmaps |
|
1601 that are drawn in it. The bitmap handle is just a pointer to the bitmap in the FBSERV heap. |
|
1602 At some point later WSERV may need to draw that window again and it will just replay the |
|
1603 stored commands including the draw bitmap. However, if the client has changed the content of the bitmap, |
|
1604 WSERV will effectively draw a different bitmap when it replays the commands. |
|
1605 |
|
1606 @param aPoint The position for the top left corner of the bitmap. |
|
1607 @param aBitmap A memory-resident bitmap. |
|
1608 @see CBitmapContext::BitBlt() */ |
|
1609 { |
|
1610 if (aBitmap == NULL || !aBitmap->Handle()) |
|
1611 return; |
|
1612 iPimpl->WriteAnyPendingStateChanges(); |
|
1613 TWsGcCmdGdiBlt2 gdiBlit(aPoint,aBitmap->Handle()); |
|
1614 Write(&gdiBlit,sizeof(gdiBlit),EWsGcOpGdiBlt2); |
|
1615 AddToBitmapArray(aBitmap->Handle()); |
|
1616 } |
|
1617 |
|
1618 EXPORT_C void CWindowGc::BitBlt(const TPoint &aDestination,const CFbsBitmap *aBitmap,const TRect &aSource) |
|
1619 /** Performs a bitmap block transfer of a rectangular piece of a bitmap. |
|
1620 |
|
1621 Windows that store their redraw commands will only store drawing position and a handle to bitmaps |
|
1622 that are drawn in it. The bitmap handle is just a pointer to the bitmap in the FBSERV heap. |
|
1623 At some point later WSERV may need to draw that window again and it will just replay the |
|
1624 stored commands including the draw bitmap. However, if the client has changed the content of the bitmap, |
|
1625 WSERV will effectively draw a different bitmap when it replays the commands. |
|
1626 |
|
1627 Note: if the rectangle aSource is larger than the bitmap then the bitmap will be padded |
|
1628 with white. |
|
1629 |
|
1630 @param aDestination The position for the top left corner of the bitmap. |
|
1631 @param aBitmap A memory-resident bitmap |
|
1632 @param aSource A rectangle defining the piece of the bitmap to be drawn, with |
|
1633 co-ordinates relative to the top left corner of the bitmap |
|
1634 @see CBitmapContext::BitBlt() */ |
|
1635 { |
|
1636 if (aBitmap == NULL || !aBitmap->Handle()) |
|
1637 return; |
|
1638 iPimpl->WriteAnyPendingStateChanges(); |
|
1639 TWsGcCmdGdiBlt3 gdiBlit(aDestination,aBitmap->Handle(),aSource); |
|
1640 Write(&gdiBlit,sizeof(gdiBlit),EWsGcOpGdiBlt3); |
|
1641 AddToBitmapArray(aBitmap->Handle()); |
|
1642 } |
|
1643 |
|
1644 EXPORT_C void CWindowGc::BitBltMasked(const TPoint& aPoint,const CFbsBitmap* aBitmap,const TRect& aSourceRect,const CFbsBitmap* aMaskBitmap,TBool aInvertMask) |
|
1645 /** Performs a masked bitmap block transfer of a memory resident source bitmap. |
|
1646 |
|
1647 The mask bitmap can be used as either a positive or negative mask. Masked |
|
1648 pixels are not mapped to the destination rectangle. |
|
1649 |
|
1650 A black and white (binary) mask bitmap is used. With aInvertMask=EFalse, black |
|
1651 pixels in the mask bitmap stop corresponding pixels in the source bitmap from |
|
1652 being transferred to the destination rectangle. With aInvertMask=ETrue, white |
|
1653 pixels in the mask bitmap stop corresponding pixels in the source bitmap from |
|
1654 being transferred to the destination rectangle. |
|
1655 |
|
1656 Windows that store their redraw commands will only store drawing position and a handle to bitmaps |
|
1657 that are drawn in it. The bitmap handle is just a pointer to the bitmap in the FBSERV heap. |
|
1658 At some point later WSERV may need to draw that window again and it will just replay the |
|
1659 stored commands including the draw bitmap. However, if the client has changed the content of the bitmap, |
|
1660 WSERV will effectively draw a different bitmap when it replays the commands. |
|
1661 |
|
1662 @param aPoint A position for the top left corner of the bitmap. |
|
1663 @param aBitmap A memory-resident source bitmap. |
|
1664 @param aSourceRect A rectangle defining the piece of the bitmap to be drawn, |
|
1665 with co-ordinates relative to the top left corner of the bitmap |
|
1666 @param aMaskBitmap A mask bitmap. |
|
1667 @param aInvertMask If false, a source pixel that is masked by a black pixel |
|
1668 is not transferred to the destination rectangle. If true, then a source pixel |
|
1669 that is masked by a white pixel is not transferred to the destination rectangle. |
|
1670 |
|
1671 @see CBitmapContext::BitBltMasked() */ |
|
1672 { |
|
1673 if (aBitmap == NULL || !aBitmap->Handle() || aMaskBitmap == NULL || !aMaskBitmap->Handle()) |
|
1674 return; |
|
1675 iPimpl->WriteAnyPendingStateChanges(); |
|
1676 TWsGcCmdBltMasked gdiBlitMasked(aPoint,aBitmap->Handle(),aSourceRect,aMaskBitmap->Handle(),aInvertMask); |
|
1677 Write(&gdiBlitMasked,sizeof(gdiBlitMasked),EWsGcOpGdiBltMasked); |
|
1678 AddToBitmapArray(aBitmap->Handle()); |
|
1679 AddToBitmapArray(aMaskBitmap->Handle()); |
|
1680 } |
|
1681 |
|
1682 EXPORT_C void CWindowGc::BitBlt(const TPoint &aPoint, const CWsBitmap *aBitmap) |
|
1683 /** Performs a bitmap block transfer on a bitmap to which the window server already |
|
1684 has a handle. |
|
1685 |
|
1686 Windows that store their redraw commands will only store drawing position and a handle to bitmaps |
|
1687 that are drawn in it. The bitmap handle is just a pointer to the bitmap in the FBSERV heap. |
|
1688 At some point later WSERV may need to draw that window again and it will just replay the |
|
1689 stored commands including the draw bitmap. However, if the client has changed the content of the bitmap, |
|
1690 WSERV will effectively draw a different bitmap when it replays the commands. |
|
1691 |
|
1692 This function should be used in preference to the CFbsBitmap overload if the |
|
1693 bitmap is to be used more than once, as it is a lot quicker. |
|
1694 |
|
1695 @param aPoint The position for the top left corner of the bitmap. |
|
1696 @param aBitmap A window server bitmap. |
|
1697 @see CBitmapContext::BitBlt() */ |
|
1698 { |
|
1699 if (aBitmap == NULL || !aBitmap->Handle()) |
|
1700 return; |
|
1701 iPimpl->WriteAnyPendingStateChanges(); |
|
1702 TWsGcCmdGdiBlt2 gdiBlit(aPoint,aBitmap->WsHandle()); |
|
1703 Write(&gdiBlit,sizeof(gdiBlit),EWsGcOpGdiWsBlt2); |
|
1704 AddToBitmapArray(aBitmap->Handle()); |
|
1705 } |
|
1706 |
|
1707 EXPORT_C void CWindowGc::BitBlt(const TPoint &aDestination,const CWsBitmap *aBitmap,const TRect &aSource) |
|
1708 /** Performs a bitmap block transfer of a rectangular piece of a bitmap to which |
|
1709 the window server already has a handle. |
|
1710 |
|
1711 Windows that store their redraw commands will only store drawing position and a handle to bitmaps |
|
1712 that are drawn in it. The bitmap handle is just a pointer to the bitmap in the FBSERV heap. |
|
1713 At some point later WSERV may need to draw that window again and it will just replay the |
|
1714 stored commands including the draw bitmap. However, if the client has changed the content of the bitmap, |
|
1715 WSERV will effectively draw a different bitmap when it replays the commands. |
|
1716 |
|
1717 This function should be used in preference to the CFbsBitmap overload if the |
|
1718 bitmap is to be used more than once, as it is a lot quicker. |
|
1719 |
|
1720 Note: if the rectangle aSource is larger than the bitmap then the bitmap will be padded |
|
1721 with white. |
|
1722 |
|
1723 @param aDestination The position for the top left corner of the bitmap. |
|
1724 @param aBitmap A window server bitmap. |
|
1725 @param aSource A rectangle defining the piece of the bitmap to be drawn, with |
|
1726 co-ordinates relative to the top left corner of the bitmap |
|
1727 @see CBitmapContext::BitBlt() */ |
|
1728 { |
|
1729 if (aBitmap == NULL || !aBitmap->Handle()) |
|
1730 return; |
|
1731 iPimpl->WriteAnyPendingStateChanges(); |
|
1732 TWsGcCmdGdiBlt3 gdiBlit(aDestination,aBitmap->WsHandle(),aSource); |
|
1733 Write(&gdiBlit,sizeof(gdiBlit),EWsGcOpGdiWsBlt3); |
|
1734 AddToBitmapArray(aBitmap->Handle()); |
|
1735 } |
|
1736 |
|
1737 EXPORT_C void CWindowGc::BitBltMasked(const TPoint& aPoint,const CWsBitmap * aBitmap,const TRect& aSourceRect,const CWsBitmap * aMaskBitmap,TBool aInvertMask) |
|
1738 /** Performs a masked bitmap block transfer of a window server bitmap. |
|
1739 |
|
1740 The mask bitmap can be used as either a positive or negative mask. Masked |
|
1741 pixels are not mapped to the destination rectangle. |
|
1742 |
|
1743 A black and white (binary) mask bitmap is used. With aInvertMask=EFalse, black |
|
1744 pixels in the mask bitmap stop corresponding pixels in the source bitmap from |
|
1745 being transferred to the destination rectangle. With aInvertMask=ETrue, white |
|
1746 pixels in the mask bitmap stop corresponding pixels in the source bitmap from |
|
1747 being transferred to the destination rectangle. |
|
1748 |
|
1749 This function should be used in preference to the CFbsBitmap overload if the |
|
1750 bitmap is to be used more than once, as it is a lot quicker. |
|
1751 |
|
1752 Windows that store their redraw commands will only store drawing position and a handle to bitmaps |
|
1753 that are drawn in it. The bitmap handle is just a pointer to the bitmap in the FBSERV heap. |
|
1754 At some point later WSERV may need to draw that window again and it will just replay the |
|
1755 stored commands including the draw bitmap. However, if the client has changed the content of the bitmap, |
|
1756 WSERV will effectively draw a different bitmap when it replays the commands. |
|
1757 |
|
1758 @param aPoint A position for the top left corner of the bitmap. |
|
1759 @param aBitmap A window server bitmap. |
|
1760 @param aSourceRect A rectangle defining the piece of the bitmap to be drawn, |
|
1761 with co-ordinates relative to the top left corner of the bitmap. |
|
1762 @param aMaskBitmap A window server mask bitmap. |
|
1763 @param aInvertMask If false, a source pixel that is masked by a black pixel |
|
1764 is not transferred to the destination rectangle. If true, then a source pixel |
|
1765 that is masked by a white pixel is not transferred to the destination rectangle. |
|
1766 |
|
1767 @see CBitmapContext::BitBltMasked() */ |
|
1768 { |
|
1769 if (aBitmap == NULL || !aBitmap->Handle() || aMaskBitmap == NULL || !aMaskBitmap->Handle()) |
|
1770 return; |
|
1771 iPimpl->WriteAnyPendingStateChanges(); |
|
1772 TWsGcCmdBltMasked gdiBlitMasked(aPoint,aBitmap->WsHandle(),aSourceRect,aMaskBitmap->WsHandle(),aInvertMask); |
|
1773 Write(&gdiBlitMasked,sizeof(gdiBlitMasked),EWsGcOpGdiWsBltMasked); |
|
1774 AddToBitmapArray(aBitmap->Handle()); |
|
1775 AddToBitmapArray(aMaskBitmap->Handle()); |
|
1776 } |
|
1777 |
|
1778 /** |
|
1779 This method has been deprecated. It is no longer possible to re-map pixel colours |
|
1780 within a rectangle. Calling it has no effect. |
|
1781 @param aRect Ignored. |
|
1782 @param aColors Ignored. |
|
1783 @param aNumPairs Ignored. |
|
1784 @param aMapForwards Ignored. |
|
1785 @deprecated |
|
1786 */ |
|
1787 EXPORT_C void CWindowGc::MapColors(const TRect& /*aRect*/, const TRgb* /*aColors*/, TInt /*aNumPairs*/, TBool /*aMapForwards*/) |
|
1788 { |
|
1789 } |
|
1790 |
|
1791 EXPORT_C void CWindowGc::Clear(const TRect &aRect) |
|
1792 /** Clears a rectangular area of a window. |
|
1793 |
|
1794 The cleared area is filled with the current brush colour. |
|
1795 |
|
1796 @param aRect The rectangle to clear. |
|
1797 @see CBitmapContext::Clear() */ |
|
1798 { |
|
1799 iPimpl->WriteAnyPendingStateChanges(); |
|
1800 WriteRect(aRect,EWsGcOpClearRect); |
|
1801 } |
|
1802 |
|
1803 EXPORT_C void CWindowGc::Clear() |
|
1804 /** Clears the whole window. |
|
1805 |
|
1806 The cleared area is filled with the current brush colour. |
|
1807 |
|
1808 @see CBitmapContext::Clear() */ |
|
1809 { |
|
1810 iPimpl->WriteAnyPendingStateChanges(); |
|
1811 Write(EWsGcOpClear); |
|
1812 } |
|
1813 |
|
1814 EXPORT_C void CWindowGc::Reset() |
|
1815 /** Resets the graphics context to its default settings. |
|
1816 |
|
1817 The drawing mode is set to TDrawMode::EDrawModePen (pen and brush colours used as |
|
1818 they are); there is no clipping rectangle; the pen settings are black, |
|
1819 solid, single pixel size; the brush style is null; no text font is selected. |
|
1820 |
|
1821 @see CGraphicsContext::Reset() */ |
|
1822 { |
|
1823 Write(EWsGcOpReset); |
|
1824 iPimpl->iFont=NULL; |
|
1825 iPimpl->iShadowColor = KDefaultShadowColor; |
|
1826 iPimpl->ResetPendingState(); |
|
1827 iPimpl->iForceWrite = ETrue; // needed because brush colour set to window background colour in CPlaybackGc::CommandL and CWsGc::SetGcAttribute |
|
1828 } |
|
1829 |
|
1830 /** |
|
1831 This method has been deprecated. Dithering is no longer supported. Calling it |
|
1832 has no effect. |
|
1833 @param aPoint Ignored. |
|
1834 @deprecated |
|
1835 */ |
|
1836 EXPORT_C void CWindowGc::SetDitherOrigin(const TPoint& /*aPoint*/) |
|
1837 { |
|
1838 } |
|
1839 |
|
1840 EXPORT_C void CWindowGc::SetFaded(TBool aFaded) |
|
1841 /** Sets whether the graphics context is faded. |
|
1842 |
|
1843 Fading is used to make a window appear less colourful so that other windows |
|
1844 stand out. For example, a window would be faded when a dialogue is displayed |
|
1845 in front of it. |
|
1846 |
|
1847 @param aFaded ETrue to fade the graphics context, EFalse to unfade it. */ |
|
1848 { |
|
1849 iPimpl->WriteAnyPendingStateChanges(); |
|
1850 WriteInt(aFaded,EWsGcOpSetFaded); |
|
1851 } |
|
1852 |
|
1853 EXPORT_C void CWindowGc::SetFadingParameters(TUint8 aBlackMap,TUint8 aWhiteMap) |
|
1854 /** Sets the fading parameters. |
|
1855 |
|
1856 This function allows you to override the map used when drawing with a faded |
|
1857 graphics context. However if you draw to a faded window with a faded graphics |
|
1858 context, then fading on the graphics context is ignored and it will use the |
|
1859 fading of the window. |
|
1860 |
|
1861 Fading is used to make a window appear less colourful so that other windows stand |
|
1862 out. For example, a window would be faded when a dialogue is displayed |
|
1863 in front of it. |
|
1864 |
|
1865 You can either make a faded window closer to white or closer to black. |
|
1866 The fading map allows you to over-ride the default fading parameters set in |
|
1867 RWsSession::SetDefaultFadingParameters(). |
|
1868 |
|
1869 Fading re-maps colours to fall between the specified black and white map values. |
|
1870 If aBlackMap=0 and aWhiteMap=255 then the colours are mapped unchanged. As the |
|
1871 values converge, the colours are mapped to a smaller range, so the differences |
|
1872 between colours in the faded graphics context decrease. If the values are reversed |
|
1873 then the colours are inverted (i.e. where the gc would be black, it is now white). |
|
1874 |
|
1875 @param aBlackMap Black map fading parameter. Unfaded this is 0. |
|
1876 @param aWhiteMap White map fading parameter. Unfaded this is 255. |
|
1877 @see RWsSession::SetDefaultFadingParameters() |
|
1878 @see RWindowTreeNode::SetFaded() */ |
|
1879 { |
|
1880 WriteInt(WservEncoding::Encode8BitValues(aBlackMap,aWhiteMap),EWsGcOpSetFadeParams); |
|
1881 } |
|
1882 |
|
1883 EXPORT_C TInt CWindowGc::AlphaBlendBitmaps(const TPoint& aDestPt, const CFbsBitmap* aSrcBmp, const TRect& aSrcRect,const CFbsBitmap* aAlphaBmp, const TPoint& aAlphaPt) |
|
1884 /** |
|
1885 Performs an alpha blending of the source data, aSrcBmp, with the window, using |
|
1886 the data from aAlphaBmp as an alpha blending factor. |
|
1887 The formula used is: |
|
1888 (S * A + W * (255 - A)) / 255, where: |
|
1889 - S - a pixel from aSrcBmp; |
|
1890 - W - a pixel from the window; |
|
1891 - A - a pixel from aAlphaBmp; |
|
1892 The contents of source and alpha bitmap are preserved. |
|
1893 The calculated alpha blended pixels are written to the destination - the window image. |
|
1894 |
|
1895 Windows that store their redraw commands will only store drawing position and a handle to bitmaps |
|
1896 that are drawn in it. The bitmap handle is just a pointer to the bitmap in the FBSERV heap. |
|
1897 At some point later WSERV may need to draw that window again and it will just replay the |
|
1898 stored commands including the draw bitmap. However, if the client has changed the content of the bitmap, |
|
1899 WSERV will effectively draw a different bitmap when it replays the commands. |
|
1900 |
|
1901 This method is supported from version 8.1 |
|
1902 @param aDestPt Position in the target the result should be drawn to. |
|
1903 @param aSrcBmp A pointer to the source bitmap. |
|
1904 @param aSrcRect The part of the source bitmap that should be used. |
|
1905 @param aAlphaBmp A pointer to the bitmap used as an alpha blending factor. |
|
1906 @param aAlphaPt Position of the first pixel in the alpha bitmap that should be used as a source |
|
1907 for the alpha blending. The size of the area is the same as the |
|
1908 source bitmap area - aSrcRect parameter. |
|
1909 @see CFbsBitGc::AlphaBlendBitmaps() |
|
1910 */ |
|
1911 { |
|
1912 iPimpl->WriteAnyPendingStateChanges(); |
|
1913 TWsGcCmdAlphaBlendBitmaps alphaBlend(aDestPt, aSrcBmp->Handle(), aSrcRect, aAlphaBmp->Handle(), aAlphaPt); |
|
1914 Write(&alphaBlend,sizeof(alphaBlend),EWsGcOpGdiAlphaBlendBitmaps); |
|
1915 AddToBitmapArray(aSrcBmp->Handle()); |
|
1916 AddToBitmapArray(aAlphaBmp->Handle()); |
|
1917 return KErrNone; |
|
1918 } |
|
1919 |
|
1920 EXPORT_C TInt CWindowGc::AlphaBlendBitmaps(const TPoint& aDestPt, const CWsBitmap* aSrcBmp, const TRect& aSrcRect,const CWsBitmap* aAlphaBmp, const TPoint& aAlphaPt) |
|
1921 /** |
|
1922 The method performs an alpha blending of the source data, aSrcBmp, with the window, using |
|
1923 the data from aAlphaBmp as an alpha blending factor. |
|
1924 For information on how this function works, see the other overload. |
|
1925 |
|
1926 Windows that store their redraw commands will only store drawing position and a handle to bitmaps |
|
1927 that are drawn in it. The bitmap handle is just a pointer to the bitmap in the FBSERV heap. |
|
1928 At some point later WSERV may need to draw that window again and it will just replay the |
|
1929 stored commands including the draw bitmap. However, if the client has changed the content of the bitmap, |
|
1930 WSERV will effectively draw a different bitmap when it replays the commands. |
|
1931 |
|
1932 This method is supported from version 8.1 |
|
1933 @param aDestPt Position in the target the result should be drawn to. |
|
1934 @param aSrcBmp A pointer to the source bitmap. |
|
1935 @param aSrcRect The part of the source bitmap that should be used. |
|
1936 @param aAlphaBmp A pointer to the bitmap used as an alpha blending factor. |
|
1937 @param aAlphaPt Position of the first pixel in the alpha bitmap that should be used as a source |
|
1938 for the alpha blending. The size of the area is the same as the |
|
1939 source bitmap area - aSrcRect parameter. |
|
1940 @see CFbsBitGc::AlphaBlendBitmaps() |
|
1941 */ |
|
1942 { |
|
1943 iPimpl->WriteAnyPendingStateChanges(); |
|
1944 TWsGcCmdAlphaBlendBitmaps alphaBlend(aDestPt, aSrcBmp->WsHandle(), aSrcRect, aAlphaBmp->WsHandle(), aAlphaPt); |
|
1945 Write(&alphaBlend,sizeof(alphaBlend),EWsGcOpGdiWsAlphaBlendBitmaps); |
|
1946 AddToBitmapArray(aSrcBmp->Handle()); |
|
1947 AddToBitmapArray(aAlphaBmp->Handle()); |
|
1948 return KErrNone; |
|
1949 } |
|
1950 |
|
1951 /** |
|
1952 This method has been deprecated. Calling it has no effect. |
|
1953 @param aDrawOpaque Ignored. |
|
1954 @deprecated |
|
1955 */ |
|
1956 EXPORT_C void CWindowGc::SetOpaque(TBool aDrawOpaque) |
|
1957 { |
|
1958 iPimpl->WriteAnyPendingStateChanges(); |
|
1959 WriteInt(aDrawOpaque, EWsGcOpSetOpaque); |
|
1960 } |
|
1961 |
|
1962 /** APIExtension can contain as many additional methods as is required by |
|
1963 CGraphicsContext after its original conception. It takes 3 parameters. |
|
1964 Function is exported due to constrains of retaining BC with earlier versions. |
|
1965 This is not used directly by external methods, instead it is called by a named |
|
1966 method in CGraphicsContext which passes the relivant arguements including an |
|
1967 unique identifier for the required action. |
|
1968 @param aUid The unique identifier for the method that is required. Selected |
|
1969 internally by a series of "if" statements. |
|
1970 @see Valid Uid identifiers are listed in header gdi.h |
|
1971 @see CGraphicsContext |
|
1972 @param aOutput is a TAny pointer to a reference. Used to output data as the structure |
|
1973 does not need to be instantiated before the function call this adds greater |
|
1974 flexibility. |
|
1975 @param aInput is a TAny pointer used to input data. |
|
1976 */ |
|
1977 EXPORT_C TInt CWindowGc::APIExtension(TUid aUid, TAny*& aOutput, TAny* aInput) |
|
1978 { |
|
1979 if (aUid == KGetUnderlineMetrics) |
|
1980 { |
|
1981 return APIExGetUnderlineMetrics(aOutput); |
|
1982 } |
|
1983 else if (aUid == KSetShadowColor) |
|
1984 { |
|
1985 return APIExSetShadowColor(aInput); |
|
1986 } |
|
1987 else if (aUid == KGetShadowColor) |
|
1988 { |
|
1989 return APIExGetShadowColor(aOutput); |
|
1990 } |
|
1991 else if (aUid == KDrawTextInContextUid) |
|
1992 { |
|
1993 TDrawTextInContextInternal* contextParam = (TDrawTextInContextInternal*)aInput; |
|
1994 return APIExDrawText(contextParam->iText, &contextParam->iParam, contextParam->iPosition); |
|
1995 } |
|
1996 else if (aUid == KDrawBoxTextInContextUid) |
|
1997 { |
|
1998 TDrawTextInContextInternal* contextParam = (TDrawTextInContextInternal*)aInput; |
|
1999 return APIExDrawText(contextParam->iText,&contextParam->iParam,contextParam->iBox,contextParam->iBaselineOffset,contextParam->iAlign,contextParam->iMargin); |
|
2000 } |
|
2001 else if (aUid == KDrawTextInContextVerticalUid) |
|
2002 { |
|
2003 TDrawTextInContextInternal* contextParam = (TDrawTextInContextInternal*)aInput; |
|
2004 return APIExDrawTextVertical(contextParam->iText, &contextParam->iParam, contextParam->iPosition,contextParam->iUp); |
|
2005 } |
|
2006 else if (aUid == KDrawBoxTextInContextVerticalUid) |
|
2007 { |
|
2008 TDrawTextInContextInternal* contextParam = (TDrawTextInContextInternal*)aInput; |
|
2009 return APIExDrawTextVertical(contextParam->iText,&contextParam->iParam,contextParam->iBox,contextParam->iBaselineOffset,contextParam->iUp,contextParam->iAlign,contextParam->iMargin); |
|
2010 } |
|
2011 else if (aUid == KApiExtensionInterfaceUid) |
|
2012 { |
|
2013 return APIExInterface(aOutput, *static_cast<TUid*>(aInput)); |
|
2014 } |
|
2015 /* Future cases may be placed here later.*/ |
|
2016 else |
|
2017 return CBitmapContext::APIExtension(aUid, aOutput, aInput); |
|
2018 } |
|
2019 |
|
2020 //The methods listed above in APIExtension follow here with the prefix APIEx. |
|
2021 TInt CWindowGc::APIExGetUnderlineMetrics(TAny*& aOutput) |
|
2022 { |
|
2023 const TInt width = Max(iPimpl->iFont->HeightInPixels() / 10,1); |
|
2024 TTwoTInt* ptr = (TTwoTInt*)aOutput; |
|
2025 ptr->iTop = 1 + width / 2; |
|
2026 ptr->iBottom = (ptr->iTop) + width; |
|
2027 return KErrNone; |
|
2028 } |
|
2029 |
|
2030 TInt CWindowGc::APIExSetShadowColor(TAny* aShadowColor) |
|
2031 { |
|
2032 const TRgb shadowColor = *(reinterpret_cast<TRgb*> (aShadowColor)); |
|
2033 WriteInt(shadowColor.Internal(), EWsGcOpSetShadowColor); |
|
2034 iPimpl->iShadowColor = shadowColor; |
|
2035 return KErrNone; |
|
2036 } |
|
2037 |
|
2038 TInt CWindowGc::APIExGetShadowColor(TAny*& aOutput) |
|
2039 { |
|
2040 TRgb* ptr = (TRgb*)aOutput; |
|
2041 ptr->SetInternal(iPimpl->iShadowColor.Internal()); |
|
2042 return KErrNone; |
|
2043 } |
|
2044 |
|
2045 //Default implementation of reserved virtual |
|
2046 EXPORT_C void CWindowGc::Reserved_CGraphicsContext_2() |
|
2047 { |
|
2048 CBitmapContext::Reserved_CGraphicsContext_2(); |
|
2049 } |
|
2050 |
|
2051 //Default implementation of reserved virtual |
|
2052 EXPORT_C void CWindowGc::Reserved_CBitmapContext_1() |
|
2053 { |
|
2054 CBitmapContext::Reserved_CBitmapContext_1(); |
|
2055 } |
|
2056 |
|
2057 //Default implementation of reserved virtual |
|
2058 EXPORT_C void CWindowGc::Reserved_CBitmapContext_2() |
|
2059 { |
|
2060 CBitmapContext::Reserved_CBitmapContext_2(); |
|
2061 } |
|
2062 |
|
2063 //Default implementation of reserved virtual |
|
2064 EXPORT_C void CWindowGc::Reserved_CBitmapContext_3() |
|
2065 { |
|
2066 CBitmapContext::Reserved_CBitmapContext_3(); |
|
2067 } |
|
2068 |
|
2069 // was Reserved_CWindowGc_1 |
|
2070 EXPORT_C void CWindowGc::DrawWsGraphic(const TWsGraphicId& aId,const TRect& aDestRect) |
|
2071 /** Draws an abstract artwork. |
|
2072 It does nothing if aDestRect values fall outside the window area. |
|
2073 |
|
2074 @param aId the identifier for the artwork |
|
2075 @param aDestRect the destination rect within the active window for this artwork |
|
2076 |
|
2077 @since 9.2 |
|
2078 @released |
|
2079 */ |
|
2080 { |
|
2081 iPimpl->WriteAnyPendingStateChanges(); |
|
2082 TWsGcCmdDrawWsGraphic drawWsGraphic(aId,aDestRect); |
|
2083 Write(&drawWsGraphic,sizeof(drawWsGraphic),EWsGcOpDrawWsGraphic); |
|
2084 } |
|
2085 |
|
2086 // Reserved_CWindowGc_2 |
|
2087 EXPORT_C void CWindowGc::DrawWsGraphic(const TWsGraphicId& aId,const TRect& aDestRect,const TDesC8& aData) |
|
2088 /** Draws an abstract artwork. |
|
2089 It does nothing if aDestRect values fall outside the window area. |
|
2090 |
|
2091 @param aId the identifier for the artwork |
|
2092 @param aDestRect the destination rect within the active window for this artwork |
|
2093 @param aData opaque datagram to associate with this occasion of drawing. The format is dependent upon the artwork |
|
2094 |
|
2095 @since 9.2 |
|
2096 @released |
|
2097 */ |
|
2098 { |
|
2099 iPimpl->WriteAnyPendingStateChanges(); |
|
2100 TWsGcCmdDrawWsGraphic drawWsGraphic(aId,aDestRect); |
|
2101 drawWsGraphic.iDataLen = aData.Size(); |
|
2102 WriteTextCommand(&drawWsGraphic, sizeof(drawWsGraphic), aData, EWsGcOpDrawWsGraphic, EWsGcOpDrawWsGraphicPtr); |
|
2103 } |
|
2104 |
|
2105 /** |
|
2106 Gets an extension interface specified by the supplied UID, or NULL if it isn't supported. |
|
2107 |
|
2108 @param aInterfaceId The UID of the requested interface |
|
2109 @return A pointer to the interface, or NULL if the interface isn't supported |
|
2110 @publishedPartner |
|
2111 @prototype |
|
2112 */ |
|
2113 EXPORT_C TAny* CWindowGc::Interface(TUid aInterfaceId) |
|
2114 { |
|
2115 TAny* interface = NULL; |
|
2116 if(KErrNone == APIExtension(KApiExtensionInterfaceUid, interface, &aInterfaceId)) |
|
2117 return interface; |
|
2118 return NULL; |
|
2119 } |
|
2120 |
|
2121 /** |
|
2122 Gets an extension interface specified by the supplied UID, or NULL if it isn't supported. |
|
2123 |
|
2124 @param aInterfaceId The UID of the requested interface |
|
2125 @return A pointer to the interface, or NULL if the interface isn't supported |
|
2126 @publishedPartner |
|
2127 @prototype |
|
2128 */ |
|
2129 EXPORT_C const TAny* CWindowGc::Interface(TUid aInterfaceId) const |
|
2130 { |
|
2131 return const_cast<CWindowGc*>(this)->Interface(aInterfaceId); |
|
2132 } |
|
2133 |
|
2134 TInt CWindowGc::APIExInterface(TAny*& aInterface, TUid aInterfaceId) |
|
2135 { |
|
2136 if(aInterfaceId == KMWsDrawResourceInterfaceUid) |
|
2137 { |
|
2138 aInterface = static_cast<MWsDrawResource*>(iPimpl); |
|
2139 return KErrNone; |
|
2140 } |
|
2141 return KErrNotSupported; |
|
2142 } |
|
2143 |
|
2144 void CWindowGc::DrawResource(const TPoint& aPos, const RWsDrawableSource& aSource, TGraphicsRotation aRotation) |
|
2145 { |
|
2146 iPimpl->WriteAnyPendingStateChanges(); |
|
2147 TWsGcCmdDrawResourceToPos drawWsResource(aSource.WsHandle(), aPos, aRotation); |
|
2148 Write(&drawWsResource, sizeof(drawWsResource), EWsGcOpDrawResourceToPos); |
|
2149 } |
|
2150 |
|
2151 void CWindowGc::DrawResource(const TRect& aDestRect, const RWsDrawableSource& aSource, TGraphicsRotation aRotation) |
|
2152 { |
|
2153 iPimpl->WriteAnyPendingStateChanges(); |
|
2154 TWsGcCmdDrawResourceToRect drawWsResource(aSource.WsHandle(), aDestRect, aRotation); |
|
2155 Write(&drawWsResource, sizeof(drawWsResource), EWsGcOpDrawResourceToRect); |
|
2156 } |
|
2157 |
|
2158 void CWindowGc::DrawResource(const TRect& aDestRect, const RWsDrawableSource& aSource, const TRect& aSrcRect, TGraphicsRotation aRotation) |
|
2159 { |
|
2160 iPimpl->WriteAnyPendingStateChanges(); |
|
2161 TWsGcCmdDrawResourceFromRectToRect drawWsResource(aSource.WsHandle(), aDestRect, aSrcRect, aRotation); |
|
2162 Write(&drawWsResource, sizeof(drawWsResource), EWsGcOpDrawResourceFromRectToRect); |
|
2163 } |
|
2164 |
|
2165 void CWindowGc::DrawResource(const TRect& aDestRect, const RWsDrawableSource& aSource, const TDesC8& aParam) |
|
2166 { |
|
2167 iPimpl->WriteAnyPendingStateChanges(); |
|
2168 TWsGcCmdDrawResourceWithData drawWsResource(aSource.WsHandle(), aDestRect, &aParam); |
|
2169 Write(&drawWsResource, sizeof(drawWsResource),EWsGcOpDrawResourceWithData); |
|
2170 } |
|
2171 |
|
2172 //Default implementation of reserved virtual |
|
2173 EXPORT_C void CWindowGc::Reserved_CWindowGc_3() |
|
2174 { |
|
2175 } |
|
2176 |
|
2177 //Default implementation of reserved virtual |
|
2178 EXPORT_C void CWindowGc::Reserved_CWindowGc_4() |
|
2179 { |
|
2180 } |
|
2181 |
|
2182 //Default implementation of reserved virtual |
|
2183 EXPORT_C void CWindowGc::Reserved_CWindowGc_5() |
|
2184 { |
|
2185 } |
|
2186 |
|
2187 /** |
|
2188 Default constructor. |
|
2189 Only for embedding instances of RWsDrawableSource into other classes as data members. |
|
2190 Before a RWsDrawableSource can be used the other constructor must be called. |
|
2191 */ |
|
2192 EXPORT_C RWsDrawableSource::RWsDrawableSource() |
|
2193 : iDrawableId(KSgNullDrawableId), iScreenNumber(KSgScreenIdMain) |
|
2194 { |
|
2195 } |
|
2196 |
|
2197 /** |
|
2198 Constructor. |
|
2199 @param aWs Session to the window server |
|
2200 |
|
2201 @pre Connection to the window server is established |
|
2202 */ |
|
2203 EXPORT_C RWsDrawableSource::RWsDrawableSource(RWsSession &aWs) |
|
2204 : MWsClientClass(aWs.iBuffer), iDrawableId(KSgNullDrawableId), iScreenNumber(KSgScreenIdMain) |
|
2205 { |
|
2206 } |
|
2207 |
|
2208 /** |
|
2209 Create window server object for resource drawing operation via window server. |
|
2210 |
|
2211 This object will be identified by a unique handle and will be associated with drawable resource which is passed as a parameter. |
|
2212 |
|
2213 This object will be created for drawing onto the default screen only. |
|
2214 |
|
2215 @see CWindowGc |
|
2216 @param aDrawable Drawable resource. |
|
2217 |
|
2218 @post Drawable source is created and can be used by window server. The reference counter of the underlying |
|
2219 image resource is incremented. |
|
2220 |
|
2221 @return KErrNone if successful, KErrArgument if the image resource is not valid, |
|
2222 KErrAlreadyExists if this handle is already associated with a |
|
2223 specific resource, otherwise one of the system-wide error codes. |
|
2224 */ |
|
2225 EXPORT_C TInt RWsDrawableSource::Create(const RSgDrawable& aDrawable) |
|
2226 { |
|
2227 return Create(aDrawable, KSgScreenIdMain); |
|
2228 } |
|
2229 |
|
2230 /** |
|
2231 Create window server object for resource drawing operation via window server. |
|
2232 |
|
2233 This object will be identified by unique handle and will be associated with drawable resource which is passed as a parameter. |
|
2234 |
|
2235 This object will be created for drawing onto the specified screen only. |
|
2236 |
|
2237 @see CWindowGc |
|
2238 @param aDrawable Drawable resource. |
|
2239 @param aScreenNumber The screen onto which this drawable resource can be drawn. |
|
2240 |
|
2241 @post Drawable source is created and can be used by window server. The reference counter of the underlying |
|
2242 image resource is incremented. |
|
2243 |
|
2244 @return KErrNone if successful, KErrArgument if the image resource is not valid |
|
2245 or if the specified screen is invalid, KErrAlreadyExists if this handle |
|
2246 is already associated with a specific resource, otherwise one of the |
|
2247 system-wide error codes. |
|
2248 */ |
|
2249 EXPORT_C TInt RWsDrawableSource::Create(const RSgDrawable& aDrawable, TInt aScreenNumber) |
|
2250 { |
|
2251 if (iWsHandle) |
|
2252 { |
|
2253 return KErrAlreadyExists; |
|
2254 } |
|
2255 CGraphicsResourceWrapperFactory* grwFactory = new CGraphicsResourceWrapperFactory(); |
|
2256 if (!grwFactory) |
|
2257 return KErrNoMemory; |
|
2258 CGraphicsResourceWrapper* graphicsResource = grwFactory->NewGraphicsResourceWrapper(); |
|
2259 if(!graphicsResource) |
|
2260 { |
|
2261 delete grwFactory; |
|
2262 return KErrNotSupported; |
|
2263 } |
|
2264 if (graphicsResource->IsNull(aDrawable) || aScreenNumber < 0) |
|
2265 { |
|
2266 delete graphicsResource; |
|
2267 delete grwFactory; |
|
2268 return KErrArgument; |
|
2269 } |
|
2270 TWsClCmdCreateDrawableSource create(graphicsResource->Id(aDrawable), aScreenNumber); |
|
2271 TInt ret; |
|
2272 if ((ret = iBuffer->WriteReplyWs(&create, sizeof(TWsClCmdCreateDrawableSource), EWsClOpCreateDrawableSource)) < 0) |
|
2273 { |
|
2274 delete graphicsResource; |
|
2275 delete grwFactory; |
|
2276 return ret; |
|
2277 } |
|
2278 iWsHandle = ret; |
|
2279 iDrawableId = graphicsResource->Id(aDrawable); |
|
2280 iScreenNumber = aScreenNumber; |
|
2281 delete graphicsResource; |
|
2282 delete grwFactory; |
|
2283 return KErrNone; |
|
2284 } |
|
2285 |
|
2286 /** |
|
2287 Destroy the window server drawable source. |
|
2288 Calling this method on a object that is not associated with any RSgDrawable |
|
2289 resource will have no effect. Once Close() is called, this drawable source object can be reused. |
|
2290 |
|
2291 @post The window server drawable object is destroyed. The instance is no longer associated |
|
2292 with a RSgDrawable specific resource. The reference counter of the underlying |
|
2293 image resource is decremented. |
|
2294 */ |
|
2295 EXPORT_C void RWsDrawableSource::Close() |
|
2296 { |
|
2297 if (iWsHandle) |
|
2298 { |
|
2299 Write(EWsDrawableSourceOpFree); |
|
2300 iWsHandle = 0; |
|
2301 iDrawableId = KSgNullDrawableId; |
|
2302 iScreenNumber = KSgScreenIdMain; |
|
2303 } |
|
2304 } |
|
2305 |
|
2306 /** |
|
2307 Get the unique ID of the associated drawable resource. |
|
2308 */ |
|
2309 EXPORT_C const TSgDrawableId& RWsDrawableSource::DrawableId() const |
|
2310 { |
|
2311 return iDrawableId; |
|
2312 } |
|
2313 |
|
2314 /** |
|
2315 Get the screen number of the drawable source. |
|
2316 */ |
|
2317 EXPORT_C TInt RWsDrawableSource::ScreenNumber() const |
|
2318 { |
|
2319 return iScreenNumber; |
|
2320 } |