| /* libs/graphics/sgl/SkScan.cpp |
| ** |
| ** Copyright 2006, The Android Open Source Project |
| ** |
| ** Licensed under the Apache License, Version 2.0 (the "License"); |
| ** you may not use this file except in compliance with the License. |
| ** You may obtain a copy of the License at |
| ** |
| ** http://www.apache.org/licenses/LICENSE-2.0 |
| ** |
| ** Unless required by applicable law or agreed to in writing, software |
| ** distributed under the License is distributed on an "AS IS" BASIS, |
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ** See the License for the specific language governing permissions and |
| ** limitations under the License. |
| */ |
| |
| #include "SkScan.h" |
| #include "SkBlitter.h" |
| #include "SkRegion.h" |
| |
| static inline void blitrect(SkBlitter* blitter, const SkIRect& r) { |
| blitter->blitRect(r.fLeft, r.fTop, r.width(), r.height()); |
| } |
| |
| void SkScan::FillIRect(const SkIRect& r, const SkRegion* clip, |
| SkBlitter* blitter) { |
| if (!r.isEmpty()) { |
| if (clip) { |
| if (clip->isRect()) { |
| const SkIRect& clipBounds = clip->getBounds(); |
| |
| if (clipBounds.contains(r)) { |
| blitrect(blitter, r); |
| } else { |
| SkIRect rr = r; |
| if (rr.intersect(clipBounds)) { |
| blitrect(blitter, rr); |
| } |
| } |
| } else { |
| SkRegion::Cliperator cliper(*clip, r); |
| const SkIRect& rr = cliper.rect(); |
| |
| while (!cliper.done()) { |
| blitrect(blitter, rr); |
| cliper.next(); |
| } |
| } |
| } else { |
| blitrect(blitter, r); |
| } |
| } |
| } |
| |
| void SkScan::FillXRect(const SkXRect& xr, const SkRegion* clip, |
| SkBlitter* blitter) { |
| SkIRect r; |
| |
| XRect_round(xr, &r); |
| SkScan::FillIRect(r, clip, blitter); |
| } |
| |
| #ifdef SK_SCALAR_IS_FLOAT |
| |
| void SkScan::FillRect(const SkRect& r, const SkRegion* clip, |
| SkBlitter* blitter) { |
| SkIRect ir; |
| |
| r.round(&ir); |
| SkScan::FillIRect(ir, clip, blitter); |
| } |
| |
| #endif |
| |