LCOV - code coverage report
Current view: top level - vcl/source/gdi - bmpacc3.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 73 120 60.8 %
Date: 2015-06-13 12:38:46 Functions: 7 7 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <tools/poly.hxx>
      21             : 
      22             : #include <vcl/salbtype.hxx>
      23             : #include <vcl/bitmap.hxx>
      24             : #include <vcl/region.hxx>
      25             : #include <vcl/bmpacc.hxx>
      26             : 
      27             : #include <bmpfast.hxx>
      28             : 
      29        4856 : void BitmapWriteAccess::SetLineColor( const Color& rColor )
      30             : {
      31        4856 :     if (rColor.GetTransparency() == 255)
      32             :     {
      33           0 :         mpLineColor.reset();
      34             :     }
      35             :     else
      36             :     {
      37        4856 :         if (HasPalette())
      38             :         {
      39         764 :             mpLineColor.reset(new BitmapColor(static_cast<sal_uInt8>(GetBestPaletteIndex(rColor))));
      40             :         }
      41             :         else
      42             :         {
      43        4092 :             mpLineColor.reset(new BitmapColor(rColor));
      44             :         }
      45             :     }
      46        4856 : }
      47             : 
      48         640 : void BitmapWriteAccess::SetFillColor()
      49             : {
      50         640 :     mpFillColor.reset();
      51         640 : }
      52             : 
      53        8387 : void BitmapWriteAccess::SetFillColor( const Color& rColor )
      54             : {
      55        8387 :     if (rColor.GetTransparency() == 255)
      56             :     {
      57           0 :         mpFillColor.reset();
      58             :     }
      59             :     else
      60             :     {
      61        8387 :         if (HasPalette())
      62             :         {
      63        4227 :             mpFillColor.reset(new BitmapColor(static_cast<sal_uInt8>(GetBestPaletteIndex(rColor))));
      64             :         }
      65             :         else
      66             :         {
      67        4160 :             mpFillColor.reset(new BitmapColor(rColor));
      68             :         }
      69             :     }
      70        8387 : }
      71             : 
      72        1201 : void BitmapWriteAccess::Erase( const Color& rColor )
      73             : {
      74             :     // convert the color format from RGB to palette index if needed
      75             :     // TODO: provide and use Erase( BitmapColor& method)
      76        1201 :     BitmapColor aColor = rColor;
      77        1201 :     if (HasPalette())
      78             :     {
      79        1088 :         aColor = BitmapColor(static_cast<sal_uInt8>(GetBestPaletteIndex(rColor)));
      80             :     }
      81             :     // try fast bitmap method first
      82        1201 :     if (ImplFastEraseBitmap(*mpBuffer, aColor))
      83        2289 :         return;
      84             : 
      85             :     // use the canonical method to clear the bitmap
      86         113 :     BitmapColor* pOldFillColor = mpFillColor ? new BitmapColor(*mpFillColor) : NULL;
      87         113 :     const Point aPoint;
      88         113 :     const Rectangle aRect(aPoint, maBitmap.GetSizePixel());
      89             : 
      90         113 :     SetFillColor(rColor);
      91         113 :     FillRect(aRect);
      92             : 
      93         113 :     mpFillColor.reset(pOldFillColor);
      94             : }
      95             : 
      96        7912 : void BitmapWriteAccess::DrawLine( const Point& rStart, const Point& rEnd )
      97             : {
      98        7912 :     if (mpLineColor)
      99             :     {
     100        7912 :         const BitmapColor& rLineColor = *mpLineColor.get();
     101             :         long nX, nY;
     102             : 
     103        7912 :         if (rStart.X() == rEnd.X())
     104             :         {
     105             :             // Vertical Line
     106        3958 :             const long nEndY = rEnd.Y();
     107             : 
     108        3958 :             nX = rStart.X();
     109        3958 :             nY = rStart.Y();
     110             : 
     111        3958 :             if (nEndY > nY)
     112             :             {
     113       25703 :                 for (; nY <= nEndY; nY++ )
     114       23726 :                     SetPixel( nY, nX, rLineColor );
     115             :             }
     116             :             else
     117             :             {
     118       25711 :                 for (; nY >= nEndY; nY-- )
     119       23730 :                     SetPixel( nY, nX, rLineColor );
     120             :             }
     121             :         }
     122        3954 :         else if (rStart.Y() == rEnd.Y())
     123             :         {
     124             :             // Horizontal Line
     125        3954 :             const long nEndX = rEnd.X();
     126             : 
     127        3954 :             nX = rStart.X();
     128        3954 :             nY = rStart.Y();
     129             : 
     130        3954 :             if (nEndX > nX)
     131             :             {
     132      134602 :                 for (; nX <= nEndX; nX++)
     133      132625 :                     SetPixel(nY, nX, rLineColor);
     134             :             }
     135             :             else
     136             :             {
     137      134602 :                 for (; nX >= nEndX; nX--)
     138      132625 :                     SetPixel(nY, nX, rLineColor);
     139             :             }
     140             :         }
     141             :         else
     142             :         {
     143           0 :             const long  nDX = labs( rEnd.X() - rStart.X() );
     144           0 :             const long  nDY = labs( rEnd.Y() - rStart.Y() );
     145             :             long nX1;
     146             :             long nY1;
     147             :             long nX2;
     148             :             long nY2;
     149             : 
     150           0 :             if (nDX >= nDY)
     151             :             {
     152           0 :                 if (rStart.X() < rEnd.X())
     153             :                 {
     154           0 :                     nX1 = rStart.X();
     155           0 :                     nY1 = rStart.Y();
     156           0 :                     nX2 = rEnd.X();
     157           0 :                     nY2 = rEnd.Y();
     158             :                 }
     159             :                 else
     160             :                 {
     161           0 :                     nX1 = rEnd.X();
     162           0 :                     nY1 = rEnd.Y();
     163           0 :                     nX2 = rStart.X();
     164           0 :                     nY2 = rStart.Y();
     165             :                 }
     166             : 
     167           0 :                 const long nDYX = (nDY - nDX) << 1;
     168           0 :                 const long nDY2 = nDY << 1;
     169           0 :                 long nD = nDY2 - nDX;
     170           0 :                 bool bPos = nY1 < nY2;
     171             : 
     172           0 :                 for (nX = nX1, nY = nY1; nX <= nX2; nX++)
     173             :                 {
     174           0 :                     SetPixel(nY, nX, rLineColor);
     175             : 
     176           0 :                     if (nD < 0)
     177           0 :                         nD += nDY2;
     178             :                     else
     179             :                     {
     180           0 :                         nD += nDYX;
     181             : 
     182           0 :                         if (bPos)
     183           0 :                             nY++;
     184             :                         else
     185           0 :                             nY--;
     186             :                     }
     187             :                 }
     188             :             }
     189             :             else
     190             :             {
     191           0 :                 if (rStart.Y() < rEnd.Y())
     192             :                 {
     193           0 :                     nX1 = rStart.X();
     194           0 :                     nY1 = rStart.Y();
     195           0 :                     nX2 = rEnd.X();
     196           0 :                     nY2 = rEnd.Y();
     197             :                 }
     198             :                 else
     199             :                 {
     200           0 :                     nX1 = rEnd.X();
     201           0 :                     nY1 = rEnd.Y();
     202           0 :                     nX2 = rStart.X();
     203           0 :                     nY2 = rStart.Y();
     204             :                 }
     205             : 
     206           0 :                 const long  nDYX = (nDX - nDY) << 1;
     207           0 :                 const long  nDY2 = nDX << 1;
     208           0 :                 long nD = nDY2 - nDY;
     209           0 :                 bool bPos = nX1 < nX2;
     210             : 
     211           0 :                 for (nX = nX1, nY = nY1; nY <= nY2; nY++)
     212             :                 {
     213           0 :                     SetPixel(nY, nX, rLineColor);
     214             : 
     215           0 :                     if (nD < 0)
     216           0 :                         nD += nDY2;
     217             :                     else
     218             :                     {
     219           0 :                         nD += nDYX;
     220             : 
     221           0 :                         if (bPos)
     222           0 :                             nX++;
     223             :                         else
     224           0 :                             nX--;
     225             :                     }
     226             :                 }
     227             :             }
     228             :         }
     229             :     }
     230        7912 : }
     231             : 
     232        8263 : void BitmapWriteAccess::FillRect( const Rectangle& rRect )
     233             : {
     234        8263 :     if (mpFillColor)
     235             :     {
     236        8263 :         const BitmapColor& rFillColor = *mpFillColor.get();
     237        8263 :         Point aPoint;
     238        8263 :         Rectangle aRect(aPoint, maBitmap.GetSizePixel());
     239             : 
     240        8263 :         aRect.Intersection(rRect);
     241             : 
     242        8263 :         if (!aRect.IsEmpty())
     243             :         {
     244        8263 :             const long nStartX = rRect.Left();
     245        8263 :             const long nStartY = rRect.Top();
     246        8263 :             const long nEndX = rRect.Right();
     247        8263 :             const long nEndY = rRect.Bottom();
     248             : 
     249       97047 :             for (long nY = nStartY; nY <= nEndY; nY++)
     250             :             {
     251    14214092 :                 for (long nX = nStartX; nX <= nEndX; nX++)
     252             :                 {
     253    14125308 :                     SetPixel(nY, nX, rFillColor);
     254             :                 }
     255             :             }
     256             :         }
     257             :     }
     258        8263 : }
     259             : 
     260        8185 : void BitmapWriteAccess::DrawRect( const Rectangle& rRect )
     261             : {
     262        8185 :     if (mpFillColor)
     263        7540 :         FillRect(rRect);
     264             : 
     265        8185 :     if (mpLineColor && (!mpFillColor || ( *mpFillColor.get() != *mpLineColor.get())))
     266             :     {
     267        1978 :         DrawLine(rRect.TopLeft(), rRect.TopRight());
     268        1978 :         DrawLine(rRect.TopRight(), rRect.BottomRight());
     269        1978 :         DrawLine(rRect.BottomRight(), rRect.BottomLeft());
     270        1978 :         DrawLine(rRect.BottomLeft(), rRect.TopLeft());
     271             :     }
     272        8185 : }
     273             : 
     274             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11