10910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/* libs/graphics/sgl/SkCoreBlitters.h
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project**
30910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** Copyright 2006, The Android Open Source Project
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project**
50910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
60910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** you may not use this file except in compliance with the License.
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** You may obtain a copy of the License at
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project**
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project**
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** See the License for the specific language governing permissions and
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project** limitations under the License.
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkCoreBlitters_DEFINED
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkCoreBlitters_DEFINED
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBlitter.h"
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBlitRow.h"
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkRasterBlitter : public SkBlitter {
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkRasterBlitter(const SkBitmap& device) : fDevice(device) {}
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected:
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkBitmap& fDevice;
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkBlitter INHERITED;
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkShaderBlitter : public SkRasterBlitter {
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkShaderBlitter(const SkBitmap& device, const SkPaint& paint);
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual ~SkShaderBlitter();
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected:
41f294d10d594ac335ea3bd09caec89004d41edc5cMike Reed    uint32_t    fShaderFlags;
42f294d10d594ac335ea3bd09caec89004d41edc5cMike Reed    SkShader*   fShader;
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // illegal
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkShaderBlitter& operator=(const SkShaderBlitter&);
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkRasterBlitter INHERITED;
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkA8_Blitter : public SkRasterBlitter {
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkA8_Blitter(const SkBitmap& device, const SkPaint& paint);
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void blitH(int x, int y, int width);
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void blitV(int x, int y, int height, SkAlpha alpha);
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void blitRect(int x, int y, int width, int height);
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void blitMask(const SkMask&, const SkIRect&);
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual const SkBitmap* justAnOpaqueColor(uint32_t*);
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned fSrcA;
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // illegal
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkA8_Blitter& operator=(const SkA8_Blitter&);
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkRasterBlitter INHERITED;
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkA8_Shader_Blitter : public SkShaderBlitter {
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkA8_Shader_Blitter(const SkBitmap& device, const SkPaint& paint);
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual ~SkA8_Shader_Blitter();
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void blitH(int x, int y, int width);
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void blitMask(const SkMask&, const SkIRect&);
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkXfermode* fXfermode;
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPMColor*  fBuffer;
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint8_t*    fAAExpand;
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // illegal
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkA8_Shader_Blitter& operator=(const SkA8_Shader_Blitter&);
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkShaderBlitter INHERITED;
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project////////////////////////////////////////////////////////////////
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkARGB32_Blitter : public SkRasterBlitter {
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkARGB32_Blitter(const SkBitmap& device, const SkPaint& paint);
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void blitH(int x, int y, int width);
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void blitV(int x, int y, int height, SkAlpha alpha);
990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void blitRect(int x, int y, int width, int height);
1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void blitMask(const SkMask&, const SkIRect&);
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual const SkBitmap* justAnOpaqueColor(uint32_t*);
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected:
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkColor fPMColor;
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned fSrcA, fSrcR, fSrcG, fSrcB;
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // illegal
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkARGB32_Blitter& operator=(const SkARGB32_Blitter&);
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkRasterBlitter INHERITED;
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
115a9caa4f932a7646571a52937b03c244f5bca9bdfMike Reedclass SkARGB32_Opaque_Blitter : public SkARGB32_Blitter {
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
117a9caa4f932a7646571a52937b03c244f5bca9bdfMike Reed    SkARGB32_Opaque_Blitter(const SkBitmap& device, const SkPaint& paint)
118a9caa4f932a7646571a52937b03c244f5bca9bdfMike Reed        : INHERITED(device, paint) { SkASSERT(paint.getAlpha() == 0xFF); }
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void blitMask(const SkMask&, const SkIRect&);
120a9caa4f932a7646571a52937b03c244f5bca9bdfMike Reed
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkARGB32_Blitter INHERITED;
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
125a9caa4f932a7646571a52937b03c244f5bca9bdfMike Reedclass SkARGB32_Black_Blitter : public SkARGB32_Opaque_Blitter {
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
127a9caa4f932a7646571a52937b03c244f5bca9bdfMike Reed    SkARGB32_Black_Blitter(const SkBitmap& device, const SkPaint& paint)
128a9caa4f932a7646571a52937b03c244f5bca9bdfMike Reed        : INHERITED(device, paint) {}
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void blitMask(const SkMask&, const SkIRect&);
130a9caa4f932a7646571a52937b03c244f5bca9bdfMike Reed    virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
133a9caa4f932a7646571a52937b03c244f5bca9bdfMike Reed    typedef SkARGB32_Opaque_Blitter INHERITED;
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkARGB32_Shader_Blitter : public SkShaderBlitter {
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkARGB32_Shader_Blitter(const SkBitmap& device, const SkPaint& paint);
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual ~SkARGB32_Shader_Blitter();
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void blitH(int x, int y, int width);
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]);
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
144d0195f840fa964da51f7a1192b432954794e660cMike Reed    SkXfermode*         fXfermode;
145d0195f840fa964da51f7a1192b432954794e660cMike Reed    SkPMColor*          fBuffer;
146d0195f840fa964da51f7a1192b432954794e660cMike Reed    SkBlitRow::Proc32   fProc32;
147d0195f840fa964da51f7a1192b432954794e660cMike Reed    SkBlitRow::Proc32   fProc32Blend;
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // illegal
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkARGB32_Shader_Blitter& operator=(const SkARGB32_Shader_Blitter&);
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkShaderBlitter INHERITED;
1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1554663d79a396bd4d45a9140626921c9fbad77fbf8Mike Reed///////////////////////////////////////////////////////////////////////////////
1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkA1_Blitter : public SkRasterBlitter {
1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkA1_Blitter(const SkBitmap& device, const SkPaint& paint);
1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void blitH(int x, int y, int width);
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint8_t fSrcA;
1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // illegal
1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkA1_Blitter& operator=(const SkA1_Blitter&);
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkRasterBlitter INHERITED;
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1714663d79a396bd4d45a9140626921c9fbad77fbf8Mike Reed///////////////////////////////////////////////////////////////////////////////
1724663d79a396bd4d45a9140626921c9fbad77fbf8Mike Reed
1734663d79a396bd4d45a9140626921c9fbad77fbf8Mike Reed/*  These return the correct subclass of blitter for their device config.
1744663d79a396bd4d45a9140626921c9fbad77fbf8Mike Reed
1754663d79a396bd4d45a9140626921c9fbad77fbf8Mike Reed    Currently, they make the following assumptions about the state of the
1764663d79a396bd4d45a9140626921c9fbad77fbf8Mike Reed    paint:
1774663d79a396bd4d45a9140626921c9fbad77fbf8Mike Reed
1784663d79a396bd4d45a9140626921c9fbad77fbf8Mike Reed    1. If there is an xfermode, there will also be a shader
1794663d79a396bd4d45a9140626921c9fbad77fbf8Mike Reed    2. If there is a colorfilter, there will be a shader that itself handles
1804663d79a396bd4d45a9140626921c9fbad77fbf8Mike Reed       calling the filter, so the blitter can always ignore the colorfilter obj
1814663d79a396bd4d45a9140626921c9fbad77fbf8Mike Reed
1824663d79a396bd4d45a9140626921c9fbad77fbf8Mike Reed    These pre-conditions must be handled by the caller, in our case
1834663d79a396bd4d45a9140626921c9fbad77fbf8Mike Reed    SkBlitter::Choose(...)
1844663d79a396bd4d45a9140626921c9fbad77fbf8Mike Reed */
1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectextern SkBlitter* SkBlitter_ChooseD4444(const SkBitmap& device,
1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                        const SkPaint& paint,
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                        void* storage, size_t storageSize);
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1904663d79a396bd4d45a9140626921c9fbad77fbf8Mike Reedextern SkBlitter* SkBlitter_ChooseD565(const SkBitmap& device,
1914663d79a396bd4d45a9140626921c9fbad77fbf8Mike Reed                                       const SkPaint& paint,
1924663d79a396bd4d45a9140626921c9fbad77fbf8Mike Reed                                       void* storage, size_t storageSize);
1934663d79a396bd4d45a9140626921c9fbad77fbf8Mike Reed
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
196