Back to index

lightning-sunbird  0.9+nobinonly
nsRegionOS2.cpp
Go to the documentation of this file.
00001 /* ***** BEGIN LICENSE BLOCK *****
00002  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00003  *
00004  * The contents of this file are subject to the Mozilla Public License Version
00005  * 1.1 (the "License"); you may not use this file except in compliance with
00006  * the License. You may obtain a copy of the License at
00007  * http://www.mozilla.org/MPL/
00008  *
00009  * Software distributed under the License is distributed on an "AS IS" basis,
00010  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00011  * for the specific language governing rights and limitations under the
00012  * License.
00013  *
00014  * The Original Code is mozilla.org code.
00015  *
00016  * The Initial Developer of the Original Code is
00017  * Dainis Jonitis, <Dainis_Jonitis@swh-t.lv>.
00018  * Portions created by the Initial Developer are Copyright (C) 2001
00019  * the Initial Developer. All Rights Reserved.
00020  *
00021  * Contributor(s):
00022  *
00023  * Alternatively, the contents of this file may be used under the terms of
00024  * either of the GNU General Public License Version 2 or later (the "GPL"),
00025  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00026  * in which case the provisions of the GPL or the LGPL are applicable instead
00027  * of those above. If you wish to allow use of your version of this file only
00028  * under the terms of either the GPL or the LGPL, and not to allow others to
00029  * use your version of this file under the terms of the MPL, indicate your
00030  * decision by deleting the provisions above and replace them with the notice
00031  * and other provisions required by the GPL or the LGPL. If you do not delete
00032  * the provisions above, a recipient may use your version of this file under
00033  * the terms of any one of the MPL, the GPL or the LGPL.
00034  *
00035  * ***** END LICENSE BLOCK ***** */
00036 
00037 #include "nsGfxDefs.h"
00038 #include "nsRegionOS2.h"
00039 
00040 
00041 NS_IMPL_ISUPPORTS1(nsRegionOS2, nsIRegion)
00042 
00043 nsRegionOS2::nsRegionOS2() 
00044 {  
00045 }
00046 
00047 // Do not use GetNativeRegion on OS/2. Regions are device specific. Use GetHRGN () instead.
00048 nsresult nsRegionOS2::GetNativeRegion (void *&aRegion) const
00049 {
00050   aRegion = (void*)RGN_ERROR;
00051   return NS_OK;
00052 }
00053 
00054 PRUint32 nsRegionOS2::NumOfRects (HPS aPS, HRGN aRegion) const
00055 {
00056   RGNRECT rgnRect;
00057   rgnRect.ircStart = 1;
00058   rgnRect.crc = 0xFFFFFFFF;
00059   rgnRect.crcReturned = 0;
00060   rgnRect.ulDirection = RECTDIR_LFRT_TOPBOT;
00061 
00062   GFX (::GpiQueryRegionRects (aPS, aRegion, NULL, &rgnRect, NULL), FALSE);
00063  
00064   return rgnRect.crcReturned;
00065 }
00066 
00067 HRGN nsRegionOS2::GetHRGN (PRUint32 DestHeight, HPS DestPS)
00068 {
00069   PRUint32 NumRects = mRegion.GetNumRects ();
00070 
00071   if (NumRects > 0)
00072   {
00073     PRECTL pRects = new RECTL [NumRects];
00074 
00075     nsRegionRectIterator ri (mRegion);
00076     const nsRect* pSrc;
00077     PRECTL pDest = pRects;
00078 
00079     while ((pSrc = ri.Next()))
00080     {
00081       pDest->xLeft    = pSrc->x;
00082       pDest->xRight   = pSrc->XMost ();
00083       pDest->yTop     = DestHeight - pSrc->y;
00084       pDest->yBottom  = pDest->yTop - pSrc->height;
00085       pDest++;
00086     }
00087 
00088     HRGN rgn = GFX (::GpiCreateRegion (DestPS, NumRects, pRects), RGN_ERROR);
00089     delete [] pRects;
00090 
00091     return rgn;
00092   } else
00093   {
00094     return GFX (::GpiCreateRegion (DestPS, 0, NULL), RGN_ERROR);
00095   }
00096 }
00097 
00098 // For copying from an existing region who has height & possibly diff. hdc
00099 nsresult nsRegionOS2::InitWithHRGN (HRGN SrcRegion, PRUint32 SrcHeight, HPS SrcPS)
00100 {
00101   PRUint32 NumRects = NumOfRects (SrcPS, SrcRegion);
00102   mRegion.SetEmpty ();
00103 
00104   if (NumRects > 0)
00105   {
00106     RGNRECT RgnControl = { 1, NumRects, 0, RECTDIR_LFRT_TOPBOT };
00107     PRECTL  pRects = new RECTL [NumRects];
00108 
00109     GFX (::GpiQueryRegionRects (SrcPS, SrcRegion, NULL, &RgnControl, pRects), FALSE);
00110 
00111     for (PRUint32 cnt = 0 ; cnt < NumRects ; cnt++)
00112       mRegion.Or (mRegion, nsRect ( pRects [cnt].xLeft, SrcHeight - pRects [cnt].yTop, 
00113                   pRects [cnt].xRight - pRects [cnt].xLeft, pRects [cnt].yTop - pRects [cnt].yBottom));
00114 
00115     delete [] pRects;
00116   }
00117 
00118   return NS_OK;
00119 }