11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkBlitter_DEFINED 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkBlitter_DEFINED 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmap.h" 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMatrix.h" 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkPaint.h" 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkRefCnt.h" 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkRegion.h" 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkMask.h" 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/** SkBlitter and its subclasses are responsible for actually writing pixels 211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger into memory. Besides efficiency, they handle clipping and antialiasing. 221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger*/ 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkBlitter { 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual ~SkBlitter(); 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /// Blit a horizontal run of one or more pixels. 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void blitH(int x, int y, int width); 291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /// Blit a horizontal run of antialiased pixels; runs[] is a *sparse* 301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /// zero-terminated run-length encoding of spans of constant alpha values. 311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void blitAntiH(int x, int y, const SkAlpha antialias[], 321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const int16_t runs[]); 331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /// Blit a vertical run of pixels with a constant alpha value. 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void blitV(int x, int y, int height, SkAlpha alpha); 351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /// Blit a solid rectangle one or more pixels wide. 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void blitRect(int x, int y, int width, int height); 371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /** Blit a rectangle with one alpha-blended column on the left, 381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger width (zero or more) opaque pixels, and one alpha-blended column 391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger on the right. 401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger The result will always be at least two pixels wide. 411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void blitAntiRect(int x, int y, int width, int height, 431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkAlpha leftAlpha, SkAlpha rightAlpha); 441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /// Blit a pattern of pixels defined by a rectangle-clipped mask; 451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /// typically used for text. 460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void blitMask(const SkMask&, const SkIRect& clip); 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /** If the blitter just sets a single value for each pixel, return the 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bitmap it draws into, and assign value. If not, return NULL and ignore 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project the value parameter. 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual const SkBitmap* justAnOpaqueColor(uint32_t* value); 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger ///@name non-virtual helpers 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void blitMaskRegion(const SkMask& mask, const SkRegion& clip); 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void blitRectRegion(const SkIRect& rect, const SkRegion& clip); 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void blitRegion(const SkRegion& clip); 581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger ///@} 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /** @name Factories 611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger Return the correct blitter to use given the specified context. 621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static SkBlitter* Choose(const SkBitmap& device, 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMatrix& matrix, 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPaint& paint) { 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return Choose(device, matrix, paint, NULL, 0); 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static SkBlitter* Choose(const SkBitmap& device, 700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkMatrix& matrix, 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPaint& paint, 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void* storage, size_t storageSize); 730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project static SkBlitter* ChooseSprite(const SkBitmap& device, 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPaint&, 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkBitmap& src, 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int left, int top, 780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void* storage, size_t storageSize); 791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger ///@} 800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate: 820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** This blitter silently never draws anything. 850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkNullBlitter : public SkBlitter { 870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void blitH(int x, int y, int width) SK_OVERRIDE; 891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void blitAntiH(int x, int y, const SkAlpha[], 901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const int16_t runs[]) SK_OVERRIDE; 911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE; 921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE; 931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void blitMask(const SkMask&, const SkIRect& clip) SK_OVERRIDE; 941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual const SkBitmap* justAnOpaqueColor(uint32_t* value) SK_OVERRIDE; 950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Wraps another (real) blitter, and ensures that the real blitter is only 980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project called with coordinates that have been clipped by the specified clipRect. 990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project This means the caller need not perform the clipping ahead of time. 1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkRectClipBlitter : public SkBlitter { 1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void init(SkBlitter* blitter, const SkIRect& clipRect) { 1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(!clipRect.isEmpty()); 1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBlitter = blitter; 1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fClipRect = clipRect; 1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void blitH(int x, int y, int width) SK_OVERRIDE; 1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void blitAntiH(int x, int y, const SkAlpha[], 1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const int16_t runs[]) SK_OVERRIDE; 1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE; 1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE; 1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void blitAntiRect(int x, int y, int width, int height, 1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkAlpha leftAlpha, SkAlpha rightAlpha) SK_OVERRIDE; 1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void blitMask(const SkMask&, const SkIRect& clip) SK_OVERRIDE; 1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual const SkBitmap* justAnOpaqueColor(uint32_t* value) SK_OVERRIDE; 1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate: 1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkBlitter* fBlitter; 1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIRect fClipRect; 1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Wraps another (real) blitter, and ensures that the real blitter is only 1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger called with coordinates that have been clipped by the specified clipRgn. 1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger This means the caller need not perform the clipping ahead of time. 1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkRgnClipBlitter : public SkBlitter { 1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void init(SkBlitter* blitter, const SkRegion* clipRgn) { 1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(clipRgn && !clipRgn->isEmpty()); 1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fBlitter = blitter; 1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fRgn = clipRgn; 1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void blitH(int x, int y, int width) SK_OVERRIDE; 1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void blitAntiH(int x, int y, const SkAlpha[], 1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const int16_t runs[]) SK_OVERRIDE; 1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE; 1401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE; 1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void blitAntiRect(int x, int y, int width, int height, 1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkAlpha leftAlpha, SkAlpha rightAlpha) SK_OVERRIDE; 1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void blitMask(const SkMask&, const SkIRect& clip) SK_OVERRIDE; 1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual const SkBitmap* justAnOpaqueColor(uint32_t* value) SK_OVERRIDE; 1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate: 1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkBlitter* fBlitter; 1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkRegion* fRgn; 1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/** Factory to set up the appropriate most-efficient wrapper blitter 1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger to apply a clip. Returns a pointer to a member, so lifetime must 1531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger be managed carefully. 1541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger*/ 1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkBlitterClipper { 1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkBlitter* apply(SkBlitter* blitter, const SkRegion* clip, 1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkIRect* bounds = NULL); 1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate: 1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkNullBlitter fNullBlitter; 1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkRectClipBlitter fRectBlitter; 1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkRgnClipBlitter fRgnBlitter; 1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 167