Home | History | Annotate | Download | only in atlastext
      1 /*
      2  * Copyright 2017 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "SkPoint3.h"
      9 #include "SkRefCnt.h"
     10 
     11 #ifndef SkAtlasTextRenderer_DEFINED
     12 #define SkAtlasTextRenderer_DEFINED
     13 
     14 /**
     15  * This is the base class for a renderer implemented by the SkAtlasText client. The
     16  * SkAtlasTextContext issues texture creations, deletions, uploads, and vertex draws to the
     17  * renderer. The renderer must perform those actions in the order called to correctly render
     18  * the text drawn to SkAtlasTextTargets.
     19  */
     20 class SK_API SkAtlasTextRenderer : public SkRefCnt {
     21 public:
     22     enum class AtlasFormat {
     23         /** Unsigned normalized 8 bit single channel format. */
     24         kA8
     25     };
     26 
     27     struct SDFVertex {
     28         /** Position in device space (not normalized). The third component is w (not z). */
     29         SkPoint3 fPosition;
     30         /** Color, same value for all four corners of a glyph quad. */
     31         uint32_t fColor;
     32         /** Texture coordinate (in texel units, not normalized). */
     33         SkIPoint16 fTextureCoord;
     34     };
     35 
     36     virtual ~SkAtlasTextRenderer() = default;
     37 
     38     /**
     39      * Create a texture of the provided format with dimensions 'width' x 'height'
     40      * and return a unique handle.
     41      */
     42     virtual void* createTexture(AtlasFormat, int width, int height) = 0;
     43 
     44     /**
     45      * Delete the texture with the passed handle.
     46      */
     47     virtual void deleteTexture(void* textureHandle) = 0;
     48 
     49     /**
     50      * Place the pixel data specified by 'data' in the texture with handle
     51      * 'textureHandle' in the rectangle ['x', 'x' + 'width') x ['y', 'y' + 'height').
     52      * 'rowBytes' specifies the byte offset between successive rows in 'data' and will always be
     53      * a multiple of the number of bytes per pixel.
     54      * The pixel format of data is the same as that of 'textureHandle'.
     55      */
     56     virtual void setTextureData(void* textureHandle, const void* data, int x, int y, int width,
     57                                 int height, size_t rowBytes) = 0;
     58 
     59     /**
     60      * Draws glyphs using SDFs. The SDF data resides in 'textureHandle'. The array
     61      * 'vertices' provides interleaved device-space positions, colors, and
     62      * texture coordinates. There are are 4 * 'quadCnt' entries in 'vertices'.
     63      */
     64     virtual void drawSDFGlyphs(void* targetHandle, void* textureHandle, const SDFVertex vertices[],
     65                                int quadCnt) = 0;
     66 
     67     /** Called when a SkAtlasTextureTarget is destroyed. */
     68     virtual void targetDeleted(void* targetHandle) = 0;
     69 };
     70 
     71 #endif
     72