Hi Fang,

your solutions looks good.

About Q1
You should not worry about it, when vcl creates polygons for text then
it always create new ones. If you get the same pointer
more than onces that just means the system memory allocator has used the
already freed memory from one of the last
polygons again. Thats why we must use the operator== of the PolyPolygon
since it compares the content of the instance,
not the this pointer.

About Q2
Yes you must return the min point with the id, but it must be the min
point from the compared PolyPolygon, not the min point
from the PolyPolygon in the cache. And this must be added to the
translation of the shape that uses this PolyPolygon.

Please add that and tell me about the results. For debug purposes you
can also google the web, there are some free
flash decompilers around.

Regards,
Christian

Fang Yaqiong wrote:
> Hi Christian,
> I add a class PolyPolygonCacheKey what you used to said. It contains
> the operator == and operator < and a method getMinPoint to get the
> minX and minY of the Poygon.
> class PolyPolygonCacheKey
> {
> public:
> PolyPolygonCacheKey( const PolyPolygon& rPolyPoly, const FillStyle&
> rFillStyle ):maPolyPoly(rPolyPoly),maFillStyle(rFillStyle)
> {
> }
> BOOL operator==( const PolyPolygonCacheKey& rKey ) const;
> BOOL operator<( const PolyPolygonCacheKey& rKey ) const;
> B2DPoint getMinPoint( const PolyPolygon& rPolyPoly);
> private:
> PolyPolygon maPolyPoly;
> FillStyle maFillStyle;
> };
> And the getMinPoint() is defined like this:
> B2DPoint PolyPolygonCacheKey::getMinPoint(const PolyPolygon& rPolyPoly)
> {
> sal_uInt32 nB2DPolyPolygonCount = rPolyPoly.getB2DPolyPolygon().count();
> B2DPoint maMinPoint;
> maMinPoint.setX(rPolyPoly.getB2DPolyPolygon().getB2DPolygon(0).getB2DPoint(0).getX());
> maMinPoint.setY(rPolyPoly.getB2DPolyPolygon().getB2DPolygon(0).getB2DPoint(0).getY());
>
> for (int i=0;i<nB2DPolyPolygonCount;i++)
> {
> sal_uInt32 nB2DPolygonCount =
> rPolyPoly.getB2DPolyPolygon().getB2DPolygon(i).count();
>
> for (int j=0; j< nB2DPolygonCount; j++)
> {
> B2DPoint maPoint;
> maPoint.setX(rPolyPoly.getB2DPolyPolygon().getB2DPolygon(i).getB2DPoint(j).getX());
> maPoint.setY(rPolyPoly.getB2DPolyPolygon().getB2DPolygon(i).getB2DPoint(j).getY());
> if (maMinPoint.getX() > maPoint.getX())
> {
> maMinPoint.setX(maPoint.getX());
> }
> if (maMinPoint.getY()>maPoint.getY())
> {
> maMinPoint.setY(maPoint.getY());
> }
> }
> }
> return maMinPoint;
> }
> In swfwriter.cxx I add a chache in the sal_uInt16 Writer::defineShape(
> const PolyPolygon& rPolyPoly, const FillStyle& rFillStyle )
> before startTag( TAG_DEFINESHAPE3 );
> I add the cods:
> PolyPolygon maPolyPolygon = rPolyPoly;
> PolyPolygonCacheKey maPolyPolygonFillStyle(rPolyPoly,rFillStyle);
> //get the minX and minY
> B2DPoint maMinPoint = maPolyPolygonFillStyle.getMinPoint(maPolyPolygon);
> Point maMinPoint1(-maMinPoint.getX(),-maMinPoint.getY());
> //translate the polygon back to not contains the offset
> maPolyPolygon.Translate(maMinPoint1);
> PolyPolygonCacheKey maPolyPolygonFillStyle1(maPolyPolygon,rFillStyle);
> //find the polygon in the cache, maPolyPolygonCacheMap is defined in
> class writer
> std::map<PolyPolygonCacheKey, int>::const_iterator
> aIter(maPolyPolygonCacheMap.find(maPolyPolygonFillStyle1));
>
> sal_uInt16 nShapeId=0;
> if( aIter != maPolyPolygonCacheMap.end() )
> {
> //if find,return the nShapId
> nShapeId = aIter->second;
> return nShapeId;
> }
> else
> {
> //if not, we create one now
> nShapeId = createID();
> maPolyPolygonCacheMap[maPolyPolygonFillStyle]=nShapeId;
> }
> This is my thought in this part, what do you think about it? Is it all
> right or not?
> I still have some questions about it, as I haven't defined the
> operator == and < suitably.
> I used to define them like this:
> BOOL PolyPolygonCacheKey::operator==( const PolyPolygonCacheKey& rKey
> ) const
> {
> DBG_CHKTHIS( PolyPolygonCacheKey, NULL );
> DBG_CHKOBJ( &rKey, PolyPolygonCacheKey, NULL );
> if ((this->maPolyPoly == rKey.maPolyPoly) && (this->maFillStyle ==
> rKey.maFillStyle))
> return TRUE;
> else
> return FALSE;
> }
> BOOL PolyPolygonCacheKey::operator<( const PolyPolygonCacheKey& rKey )
> const
> {
> DBG_CHKTHIS( PolyPolygonCacheKey, NULL );
> DBG_CHKOBJ( &rKey, PolyPolygonCacheKey, NULL );
>
> return !(*this == rKey) && (this->maPolyPoly < rKey.maPolyPoly);
> }
> But it doesn't work probably. Can you give some suggestions?
> Q1: When I track in the codes, I find in Writer::defineShape(const
> PolyPolygon& rPolyPoly, const FillStyle& rFillStyle ) , the value of
> rPolyPoly is a pointer. When the Polygon is the same (if I export the
> same word several times), sometimes the pointer points to the same
> place, bug sometimes not. I puzzled about it. And the polygon here
> containts the offest of the polygon, but it is true that sometime the
> pointer in the rPolyPoly points to the same cache, but sometimes not.
> Q2: I read about the format of the flash, we define the shapes of
> every polygon , and then define a movieclip to put all the polygons on
> it. If we define the polygons without the offset, and how we know the
> different offset of the same polygon, and how to define a movieclip
> which contians the offset of the polygon? Should I return the offset
> of each polygon altogether with the id?
> I'm sorry that it last such a long time. I am new about it and don't
> have full time on it. But I think I am trying my best to it. Thank you
> for your guides and look forward to your suggestions sincerely.
> Best regards,
> Fang
> ------------------------------------------------------------------------
> Fang Yaqiong [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>
> 2007-06-22
> Regards&Thanks!
> Tel:010-5157-0010 Ext.6202
> Beijing Redflag CH2000 Software Co., Ltd.


-- 
Sitz der Gesellschaft: Sun Microsystems GmbH, Sonnenallee 1, D-85551 
Kirchheim-Heimstetten
Amtsgericht Muenchen: HRB 161028
Geschaeftsfuehrer: Marcel Schneider, Wolfgang Engels, Dr. Roland Boemer
Vorsitzender des Aufsichtsrates: Martin Haering 

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to