SkScan.h revision 8a1c16ff38322f0210116fa7293eb8817c7e477e
18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/* libs/graphics/sgl/SkScan.h
28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com**
38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** Copyright 2006, The Android Open Source Project
48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com**
58a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** Licensed under the Apache License, Version 2.0 (the "License");
68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** you may not use this file except in compliance with the License.
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** You may obtain a copy of the License at
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com**
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com**     http://www.apache.org/licenses/LICENSE-2.0
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com**
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** Unless required by applicable law or agreed to in writing, software
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** distributed under the License is distributed on an "AS IS" BASIS,
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** See the License for the specific language governing permissions and
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** limitations under the License.
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkScan_DEFINED
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkScan_DEFINED
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRect.h"
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkRegion;
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkBlitter;
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkPath;
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Defines a fixed-point rectangle, identical to the integer SkIRect, but its
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    coordinates are treated as SkFixed rather than int32_t.
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comtypedef SkIRect SkXRect;
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkScan {
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void FillIRect(const SkIRect&, const SkRegion* clip, SkBlitter*);
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void FillXRect(const SkXRect&, const SkRegion* clip, SkBlitter*);
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_SCALAR_IS_FIXED
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void FillRect(const SkRect& rect, const SkRegion* clip,
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                         SkBlitter* blitter) {
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkScan::FillXRect(*(const SkXRect*)&rect, clip, blitter);
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void FillRect(const SkRect&, const SkRegion* clip, SkBlitter*);
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void FillTriangle(const SkPoint pts[], const SkRegion*, SkBlitter*);
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void FillPath(const SkPath&, const SkRegion& clip, SkBlitter*);
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void FillTriangle(const SkPoint& a, const SkPoint& b,
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                             const SkPoint& c, const SkRegion* clip,
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                             SkBlitter* blitter) {
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkPoint pts[3];
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        pts[0] = a;
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        pts[1] = b;
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        pts[2] = c;
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        FillTriangle(pts, clip, blitter);
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void HairLine(const SkPoint&, const SkPoint&, const SkRegion* clip, SkBlitter*);
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void HairRect(const SkRect&, const SkRegion* clip, SkBlitter*);
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void HairPath(const SkPath&, const SkRegion* clip, SkBlitter*);
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void FrameRect(const SkRect&, SkScalar width, const SkRegion* clip, SkBlitter*);
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void AntiFillXRect(const SkXRect&, const SkRegion* clip, SkBlitter*);
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_SCALAR_IS_FIXED
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void AntiFillRect(const SkRect& rect, const SkRegion* clip,
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                         SkBlitter* blitter) {
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkScan::AntiFillXRect(*(const SkXRect*)&rect, clip, blitter);
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void AntiFillRect(const SkRect&, const SkRegion* clip, SkBlitter*);
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void AntiFillPath(const SkPath&, const SkRegion& clip, SkBlitter*);
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void AntiHairLine(const SkPoint&, const SkPoint&, const SkRegion* clip, SkBlitter*);
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void AntiHairRect(const SkRect&, const SkRegion* clip, SkBlitter*);
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void AntiHairPath(const SkPath&, const SkRegion* clip, SkBlitter*);
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Assign an SkXRect from a SkIRect, by promoting the src rect's coordinates
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    from int to SkFixed. Does not check for overflow if the src coordinates
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    exceed 32K
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void XRect_set(SkXRect* xr, const SkIRect& src) {
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    xr->fLeft = SkIntToFixed(src.fLeft);
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    xr->fTop = SkIntToFixed(src.fTop);
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    xr->fRight = SkIntToFixed(src.fRight);
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    xr->fBottom = SkIntToFixed(src.fBottom);
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Assign an SkXRect from a SkRect, by promoting the src rect's coordinates
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    from SkScalar to SkFixed. Does not check for overflow if the src coordinates
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    exceed 32K
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void XRect_set(SkXRect* xr, const SkRect& src) {
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    xr->fLeft = SkScalarToFixed(src.fLeft);
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    xr->fTop = SkScalarToFixed(src.fTop);
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    xr->fRight = SkScalarToFixed(src.fRight);
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    xr->fBottom = SkScalarToFixed(src.fBottom);
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Round the SkXRect coordinates, and store the result in the SkIRect.
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void XRect_round(const SkXRect& xr, SkIRect* dst) {
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    dst->fLeft = SkFixedRound(xr.fLeft);
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    dst->fTop = SkFixedRound(xr.fTop);
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    dst->fRight = SkFixedRound(xr.fRight);
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    dst->fBottom = SkFixedRound(xr.fBottom);
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Round the SkXRect coordinates out (i.e. use floor for left/top, and ceiling
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for right/bottom), and store the result in the SkIRect.
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void XRect_roundOut(const SkXRect& xr, SkIRect* dst) {
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    dst->fLeft = SkFixedFloor(xr.fLeft);
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    dst->fTop = SkFixedFloor(xr.fTop);
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    dst->fRight = SkFixedCeil(xr.fRight);
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    dst->fBottom = SkFixedCeil(xr.fBottom);
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
124