Home | History | Annotate | Download | only in core
      1 
      2 /*
      3  * Copyright 2006 The Android Open Source Project
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 
     10 #include "SkScan.h"
     11 #include "SkBlitter.h"
     12 #include "SkRasterClip.h"
     13 
     14 static inline void blitrect(SkBlitter* blitter, const SkIRect& r) {
     15     blitter->blitRect(r.fLeft, r.fTop, r.width(), r.height());
     16 }
     17 
     18 void SkScan::FillIRect(const SkIRect& r, const SkRegion* clip,
     19                        SkBlitter* blitter) {
     20     if (!r.isEmpty()) {
     21         if (clip) {
     22             if (clip->isRect()) {
     23                 const SkIRect& clipBounds = clip->getBounds();
     24 
     25                 if (clipBounds.contains(r)) {
     26                     blitrect(blitter, r);
     27                 } else {
     28                     SkIRect rr = r;
     29                     if (rr.intersect(clipBounds)) {
     30                         blitrect(blitter, rr);
     31                     }
     32                 }
     33             } else {
     34                 SkRegion::Cliperator    cliper(*clip, r);
     35                 const SkIRect&          rr = cliper.rect();
     36 
     37                 while (!cliper.done()) {
     38                     blitrect(blitter, rr);
     39                     cliper.next();
     40                 }
     41             }
     42         } else {
     43             blitrect(blitter, r);
     44         }
     45     }
     46 }
     47 
     48 void SkScan::FillXRect(const SkXRect& xr, const SkRegion* clip,
     49                        SkBlitter* blitter) {
     50     SkIRect r;
     51 
     52     XRect_round(xr, &r);
     53     SkScan::FillIRect(r, clip, blitter);
     54 }
     55 
     56 #ifdef SK_SCALAR_IS_FLOAT
     57 
     58 void SkScan::FillRect(const SkRect& r, const SkRegion* clip,
     59                        SkBlitter* blitter) {
     60     SkIRect ir;
     61 
     62     r.round(&ir);
     63     SkScan::FillIRect(ir, clip, blitter);
     64 }
     65 
     66 #endif
     67 
     68 ///////////////////////////////////////////////////////////////////////////////
     69 
     70 void SkScan::FillIRect(const SkIRect& r, const SkRasterClip& clip,
     71                        SkBlitter* blitter) {
     72     if (clip.isEmpty() || r.isEmpty()) {
     73         return;
     74     }
     75 
     76     if (clip.isBW()) {
     77         FillIRect(r, &clip.bwRgn(), blitter);
     78         return;
     79     }
     80 
     81     SkAAClipBlitterWrapper wrapper(clip, blitter);
     82     FillIRect(r, &wrapper.getRgn(), wrapper.getBlitter());
     83 }
     84 
     85 void SkScan::FillXRect(const SkXRect& xr, const SkRasterClip& clip,
     86                        SkBlitter* blitter) {
     87     if (clip.isEmpty() || xr.isEmpty()) {
     88         return;
     89     }
     90 
     91     if (clip.isBW()) {
     92         FillXRect(xr, &clip.bwRgn(), blitter);
     93         return;
     94     }
     95 
     96     SkAAClipBlitterWrapper wrapper(clip, blitter);
     97     FillXRect(xr, &wrapper.getRgn(), wrapper.getBlitter());
     98 }
     99 
    100 #ifdef SK_SCALAR_IS_FLOAT
    101 
    102 void SkScan::FillRect(const SkRect& r, const SkRasterClip& clip,
    103                       SkBlitter* blitter) {
    104     if (clip.isEmpty() || r.isEmpty()) {
    105         return;
    106     }
    107 
    108     if (clip.isBW()) {
    109         FillRect(r, &clip.bwRgn(), blitter);
    110         return;
    111     }
    112 
    113     SkAAClipBlitterWrapper wrapper(clip, blitter);
    114     FillRect(r, &wrapper.getRgn(), wrapper.getBlitter());
    115 }
    116 
    117 #endif
    118