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