SkScan.h revision fbfcd5602128ec010c82cb733c9cdc0a3254f9f3
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 The Android Open Source Project 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkScan_DEFINED 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkScan_DEFINED 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRect.h" 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 151ba7137fc0dcace0c1be1367fe977202c63746bareed@google.comclass SkRasterClip; 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkRegion; 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkBlitter; 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkPath; 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Defines a fixed-point rectangle, identical to the integer SkIRect, but its 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com coordinates are treated as SkFixed rather than int32_t. 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comtypedef SkIRect SkXRect; 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkScan { 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 27045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void FillPath(const SkPath&, const SkIRect&, SkBlitter*); 28045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com 29045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com /////////////////////////////////////////////////////////////////////////// 30045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com // rasterclip 318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 32045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void FillIRect(const SkIRect&, const SkRasterClip&, SkBlitter*); 33045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void FillXRect(const SkXRect&, const SkRasterClip&, SkBlitter*); 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_SCALAR_IS_FIXED 35045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void FillRect(const SkRect& rect, const SkRasterClip& clip, 368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkBlitter* blitter) { 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkScan::FillXRect(*(const SkXRect*)&rect, clip, blitter); 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 39045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void AntiFillRect(const SkRect& rect, const SkRasterClip& clip, 408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkBlitter* blitter) { 41045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com SkScan::AntiFillXRect(*(const SkXRect*)&rect, clip, blitter); 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 43045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com#else 44045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void FillRect(const SkRect&, const SkRasterClip&, SkBlitter*); 45045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void AntiFillRect(const SkRect&, const SkRasterClip&, SkBlitter*); 46045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com#endif 47045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void AntiFillXRect(const SkXRect&, const SkRasterClip&, SkBlitter*); 48045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void FillPath(const SkPath&, const SkRasterClip&, SkBlitter*); 49045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void AntiFillPath(const SkPath&, const SkRasterClip&, SkBlitter*); 50045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void FrameRect(const SkRect&, const SkPoint& strokeSize, 51045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com const SkRasterClip&, SkBlitter*); 52045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void AntiFrameRect(const SkRect&, const SkPoint& strokeSize, 53045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com const SkRasterClip&, SkBlitter*); 54045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void FillTriangle(const SkPoint pts[], const SkRasterClip&, SkBlitter*); 55045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void HairLine(const SkPoint&, const SkPoint&, const SkRasterClip&, 567ff678bc1618dc669648198a7bdca8adfb189505mike@reedtribe.org SkBlitter*); 57045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void AntiHairLine(const SkPoint&, const SkPoint&, const SkRasterClip&, 58045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com SkBlitter*); 59045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void HairRect(const SkRect&, const SkRasterClip&, SkBlitter*); 60045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void AntiHairRect(const SkRect&, const SkRasterClip&, SkBlitter*); 61045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void HairPath(const SkPath&, const SkRasterClip&, SkBlitter*); 62045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void AntiHairPath(const SkPath&, const SkRasterClip&, SkBlitter*); 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 64045e62d715f5ee9b03deb5af3c750f8318096179reed@google.comprivate: 65045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com friend class SkAAClip; 66045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com friend class SkRegion; 67045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com 68045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void FillIRect(const SkIRect&, const SkRegion* clip, SkBlitter*); 69045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void FillXRect(const SkXRect&, const SkRegion* clip, SkBlitter*); 708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_SCALAR_IS_FIXED 71045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void FillRect(const SkRect& rect, const SkRegion* clip, 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkBlitter* blitter) { 73045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com SkScan::FillXRect(*(const SkXRect*)&rect, clip, blitter); 74045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com } 75045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void AntiFillRect(const SkRect& rect, const SkRegion* clip, 76045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com SkBlitter* blitter) { 778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkScan::AntiFillXRect(*(const SkXRect*)&rect, clip, blitter); 788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else 80045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void FillRect(const SkRect&, const SkRegion* clip, SkBlitter*); 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com static void AntiFillRect(const SkRect&, const SkRegion* clip, SkBlitter*); 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 8367ba5fa3283185f29c22e9b8daad521de0d00b23reed@google.com static void AntiFillXRect(const SkXRect&, const SkRegion*, SkBlitter*); 84045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void FillPath(const SkPath&, const SkRegion& clip, SkBlitter*); 852c508f2dc22027d61437b79326297ba055041561reed@google.com static void AntiFillPath(const SkPath&, const SkRegion& clip, SkBlitter*, 862c508f2dc22027d61437b79326297ba055041561reed@google.com bool forceRLE = false); 87045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void FillTriangle(const SkPoint pts[], const SkRegion*, SkBlitter*); 88fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 89761fb62b0eb174783316d2a8b933fba896ca6355reed@google.com static void AntiFrameRect(const SkRect&, const SkPoint& strokeSize, 90761fb62b0eb174783316d2a8b933fba896ca6355reed@google.com const SkRegion*, SkBlitter*); 91045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void HairLineRgn(const SkPoint&, const SkPoint&, const SkRegion*, 92045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com SkBlitter*); 93045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com static void AntiHairLineRgn(const SkPoint&, const SkPoint&, const SkRegion*, 94045e62d715f5ee9b03deb5af3c750f8318096179reed@google.com SkBlitter*); 958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Assign an SkXRect from a SkIRect, by promoting the src rect's coordinates 988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com from int to SkFixed. Does not check for overflow if the src coordinates 998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com exceed 32K 1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 101fc25abdabff76f913fb9d4f373418c10a1eca92breed@android.comstatic inline void XRect_set(SkXRect* xr, const SkIRect& src) { 1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com xr->fLeft = SkIntToFixed(src.fLeft); 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com xr->fTop = SkIntToFixed(src.fTop); 1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com xr->fRight = SkIntToFixed(src.fRight); 1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com xr->fBottom = SkIntToFixed(src.fBottom); 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Assign an SkXRect from a SkRect, by promoting the src rect's coordinates 1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com from SkScalar to SkFixed. Does not check for overflow if the src coordinates 1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com exceed 32K 1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 112fc25abdabff76f913fb9d4f373418c10a1eca92breed@android.comstatic inline void XRect_set(SkXRect* xr, const SkRect& src) { 1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com xr->fLeft = SkScalarToFixed(src.fLeft); 1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com xr->fTop = SkScalarToFixed(src.fTop); 1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com xr->fRight = SkScalarToFixed(src.fRight); 1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com xr->fBottom = SkScalarToFixed(src.fBottom); 1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Round the SkXRect coordinates, and store the result in the SkIRect. 1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 121fc25abdabff76f913fb9d4f373418c10a1eca92breed@android.comstatic inline void XRect_round(const SkXRect& xr, SkIRect* dst) { 1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dst->fLeft = SkFixedRound(xr.fLeft); 1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dst->fTop = SkFixedRound(xr.fTop); 1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dst->fRight = SkFixedRound(xr.fRight); 1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dst->fBottom = SkFixedRound(xr.fBottom); 1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Round the SkXRect coordinates out (i.e. use floor for left/top, and ceiling 1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com for right/bottom), and store the result in the SkIRect. 1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/ 131fc25abdabff76f913fb9d4f373418c10a1eca92breed@android.comstatic inline void XRect_roundOut(const SkXRect& xr, SkIRect* dst) { 1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dst->fLeft = SkFixedFloor(xr.fLeft); 1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dst->fTop = SkFixedFloor(xr.fTop); 1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dst->fRight = SkFixedCeil(xr.fRight); 1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dst->fBottom = SkFixedCeil(xr.fBottom); 1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 139