Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright 2011 The Android Open Source Project
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 
      9 #ifndef SkScan_DEFINED
     10 #define SkScan_DEFINED
     11 
     12 #include "SkFixed.h"
     13 #include "SkRect.h"
     14 #include <atomic>
     15 
     16 class SkRasterClip;
     17 class SkRegion;
     18 class SkBlitter;
     19 class SkPath;
     20 
     21 /** Defines a fixed-point rectangle, identical to the integer SkIRect, but its
     22     coordinates are treated as SkFixed rather than int32_t.
     23 */
     24 typedef SkIRect SkXRect;
     25 
     26 extern std::atomic<bool> gSkUseAnalyticAA;
     27 extern std::atomic<bool> gSkForceAnalyticAA;
     28 
     29 class AdditiveBlitter;
     30 
     31 class SkScan {
     32 public:
     33     /*
     34      *  Draws count-1 line segments, one at a time:
     35      *      line(pts[0], pts[1])
     36      *      line(pts[1], pts[2])
     37      *      line(......, pts[count - 1])
     38      */
     39     typedef void (*HairRgnProc)(const SkPoint[], int count, const SkRegion*, SkBlitter*);
     40     typedef void (*HairRCProc)(const SkPoint[], int count, const SkRasterClip&, SkBlitter*);
     41 
     42     static void FillPath(const SkPath&, const SkIRect&, SkBlitter*);
     43 
     44     ///////////////////////////////////////////////////////////////////////////
     45     // rasterclip
     46 
     47     static void FillIRect(const SkIRect&, const SkRasterClip&, SkBlitter*);
     48     static void FillXRect(const SkXRect&, const SkRasterClip&, SkBlitter*);
     49     static void FillRect(const SkRect&, const SkRasterClip&, SkBlitter*);
     50     static void AntiFillRect(const SkRect&, const SkRasterClip&, SkBlitter*);
     51     static void AntiFillXRect(const SkXRect&, const SkRasterClip&, SkBlitter*);
     52     static void FillPath(const SkPath&, const SkRasterClip&, SkBlitter*);
     53     static void AntiFillPath(const SkPath&, const SkRasterClip&, SkBlitter*);
     54     static void FrameRect(const SkRect&, const SkPoint& strokeSize,
     55                           const SkRasterClip&, SkBlitter*);
     56     static void AntiFrameRect(const SkRect&, const SkPoint& strokeSize,
     57                               const SkRasterClip&, SkBlitter*);
     58     static void FillTriangle(const SkPoint pts[], const SkRasterClip&, SkBlitter*);
     59     static void HairLine(const SkPoint[], int count, const SkRasterClip&, SkBlitter*);
     60     static void AntiHairLine(const SkPoint[], int count, const SkRasterClip&, SkBlitter*);
     61     static void HairRect(const SkRect&, const SkRasterClip&, SkBlitter*);
     62     static void AntiHairRect(const SkRect&, const SkRasterClip&, SkBlitter*);
     63     static void HairPath(const SkPath&, const SkRasterClip&, SkBlitter*);
     64     static void AntiHairPath(const SkPath&, const SkRasterClip&, SkBlitter*);
     65     static void HairSquarePath(const SkPath&, const SkRasterClip&, SkBlitter*);
     66     static void AntiHairSquarePath(const SkPath&, const SkRasterClip&, SkBlitter*);
     67     static void HairRoundPath(const SkPath&, const SkRasterClip&, SkBlitter*);
     68     static void AntiHairRoundPath(const SkPath&, const SkRasterClip&, SkBlitter*);
     69 
     70     // Needed by do_fill_path in SkScanPriv.h
     71     static void FillPath(const SkPath&, const SkRegion& clip, SkBlitter*);
     72 
     73 private:
     74     friend class SkAAClip;
     75     friend class SkRegion;
     76 
     77     static void FillIRect(const SkIRect&, const SkRegion* clip, SkBlitter*);
     78     static void FillXRect(const SkXRect&, const SkRegion* clip, SkBlitter*);
     79     static void FillRect(const SkRect&, const SkRegion* clip, SkBlitter*);
     80     static void AntiFillRect(const SkRect&, const SkRegion* clip, SkBlitter*);
     81     static void AntiFillXRect(const SkXRect&, const SkRegion*, SkBlitter*);
     82     static void AntiFillPath(const SkPath&, const SkRegion& clip, SkBlitter*,
     83                              bool forceRLE = false);
     84     static void FillTriangle(const SkPoint pts[], const SkRegion*, SkBlitter*);
     85 
     86     static void AntiFrameRect(const SkRect&, const SkPoint& strokeSize,
     87                               const SkRegion*, SkBlitter*);
     88     static void HairLineRgn(const SkPoint[], int count, const SkRegion*, SkBlitter*);
     89     static void AntiHairLineRgn(const SkPoint[], int count, const SkRegion*, SkBlitter*);
     90     static void AAAFillPath(const SkPath& path, const SkRegion& origClip, SkBlitter* blitter,
     91                             bool forceRLE = false); // SkAAClip uses forceRLE
     92 };
     93 
     94 /** Assign an SkXRect from a SkIRect, by promoting the src rect's coordinates
     95     from int to SkFixed. Does not check for overflow if the src coordinates
     96     exceed 32K
     97 */
     98 static inline void XRect_set(SkXRect* xr, const SkIRect& src) {
     99     xr->fLeft = SkIntToFixed(src.fLeft);
    100     xr->fTop = SkIntToFixed(src.fTop);
    101     xr->fRight = SkIntToFixed(src.fRight);
    102     xr->fBottom = SkIntToFixed(src.fBottom);
    103 }
    104 
    105 /** Assign an SkXRect from a SkRect, by promoting the src rect's coordinates
    106     from SkScalar to SkFixed. Does not check for overflow if the src coordinates
    107     exceed 32K
    108 */
    109 static inline void XRect_set(SkXRect* xr, const SkRect& src) {
    110     xr->fLeft = SkScalarToFixed(src.fLeft);
    111     xr->fTop = SkScalarToFixed(src.fTop);
    112     xr->fRight = SkScalarToFixed(src.fRight);
    113     xr->fBottom = SkScalarToFixed(src.fBottom);
    114 }
    115 
    116 /** Round the SkXRect coordinates, and store the result in the SkIRect.
    117 */
    118 static inline void XRect_round(const SkXRect& xr, SkIRect* dst) {
    119     dst->fLeft = SkFixedRoundToInt(xr.fLeft);
    120     dst->fTop = SkFixedRoundToInt(xr.fTop);
    121     dst->fRight = SkFixedRoundToInt(xr.fRight);
    122     dst->fBottom = SkFixedRoundToInt(xr.fBottom);
    123 }
    124 
    125 /** Round the SkXRect coordinates out (i.e. use floor for left/top, and ceiling
    126     for right/bottom), and store the result in the SkIRect.
    127 */
    128 static inline void XRect_roundOut(const SkXRect& xr, SkIRect* dst) {
    129     dst->fLeft = SkFixedFloorToInt(xr.fLeft);
    130     dst->fTop = SkFixedFloorToInt(xr.fTop);
    131     dst->fRight = SkFixedCeilToInt(xr.fRight);
    132     dst->fBottom = SkFixedCeilToInt(xr.fBottom);
    133 }
    134 
    135 #endif
    136