other-licenses/skia-npapi/ANPCanvas.cpp

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 /*
     2  * Copyright 2008, The Android Open Source Project
     3  *
     4  * Redistribution and use in source and binary forms, with or without
     5  * modification, are permitted provided that the following conditions
     6  * are met:
     7  *  * Redistributions of source code must retain the above copyright
     8  *    notice, this list of conditions and the following disclaimer.
     9  *  * Redistributions in binary form must reproduce the above copyright
    10  *    notice, this list of conditions and the following disclaimer in the
    11  *    documentation and/or other materials provided with the distribution.
    12  *
    13  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
    14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
    17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
    20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
    21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    24  */
    26 // must include config.h first for webkit to fiddle with new/delete
    27 #include "SkANP.h"
    29 static ANPCanvas* anp_newCanvas(const ANPBitmap* bitmap) {
    30     SkBitmap bm;
    31     return new ANPCanvas(*SkANP::SetBitmap(&bm, *bitmap));
    32 }
    34 static void anp_deleteCanvas(ANPCanvas* canvas) {
    35     delete canvas;
    36 }
    38 static void anp_save(ANPCanvas* canvas) {
    39     canvas->skcanvas->save();
    40 }
    42 static void anp_restore(ANPCanvas* canvas) {
    43     canvas->skcanvas->restore();
    44 }
    46 static void anp_translate(ANPCanvas* canvas, float tx, float ty) {
    47     canvas->skcanvas->translate(SkFloatToScalar(tx), SkFloatToScalar(ty));
    48 }
    50 static void anp_scale(ANPCanvas* canvas, float sx, float sy) {
    51     canvas->skcanvas->scale(SkFloatToScalar(sx), SkFloatToScalar(sy));
    52 }
    54 static void anp_rotate(ANPCanvas* canvas, float degrees) {
    55     canvas->skcanvas->rotate(SkFloatToScalar(degrees));
    56 }
    58 static void anp_skew(ANPCanvas* canvas, float kx, float ky) {
    59     canvas->skcanvas->skew(SkFloatToScalar(kx), SkFloatToScalar(ky));
    60 }
    62 static void anp_clipRect(ANPCanvas* canvas, const ANPRectF* rect) {
    63     SkRect r;
    64     canvas->skcanvas->clipRect(*SkANP::SetRect(&r, *rect));
    65 }
    67 static void anp_clipPath(ANPCanvas* canvas, const ANPPath* path) {
    68     canvas->skcanvas->clipPath(*path);
    69 }
    70 static void anp_concat(ANPCanvas* canvas, const ANPMatrix* matrix) {
    71     canvas->skcanvas->concat(*matrix);
    72 }
    74 static void anp_getTotalMatrix(ANPCanvas* canvas, ANPMatrix* matrix) {
    75     const SkMatrix& src = canvas->skcanvas->getTotalMatrix();
    76     *matrix = *reinterpret_cast<const ANPMatrix*>(&src);
    77 }
    79 static bool anp_getLocalClipBounds(ANPCanvas* canvas, ANPRectF* r,
    80                                    bool antialias) {
    81     SkRect bounds;
    82     if (canvas->skcanvas->getClipBounds(&bounds)) {
    83         SkANP::SetRect(r, bounds);
    84         return true;
    85     }
    86     return false;
    87 }
    89 static bool anp_getDeviceClipBounds(ANPCanvas* canvas, ANPRectI* r) {
    90     const SkRegion& clip = canvas->skcanvas->getTotalClip();
    91     if (!clip.isEmpty()) {
    92         SkANP::SetRect(r, clip.getBounds());
    93         return true;
    94     }
    95     return false;
    96 }
    98 static void anp_drawColor(ANPCanvas* canvas, ANPColor color) {
    99     canvas->skcanvas->drawColor(color);
   100 }
   102 static void anp_drawPaint(ANPCanvas* canvas, const ANPPaint* paint) {
   103     canvas->skcanvas->drawPaint(*paint);
   104 }
   106 static void anp_drawLine(ANPCanvas* canvas, float x0, float y0,
   107                          float x1, float y1, const ANPPaint* paint) {
   108     canvas->skcanvas->drawLine(SkFloatToScalar(x0), SkFloatToScalar(y0),
   109                            SkFloatToScalar(x1), SkFloatToScalar(y1), *paint);
   110 }
   112 static void anp_drawRect(ANPCanvas* canvas, const ANPRectF* rect,
   113                          const ANPPaint* paint) {
   114     SkRect  r;
   115     canvas->skcanvas->drawRect(*SkANP::SetRect(&r, *rect), *paint);
   116 }
   118 static void anp_drawOval(ANPCanvas* canvas, const ANPRectF* rect,
   119                          const ANPPaint* paint) {
   120     SkRect  r;
   121     canvas->skcanvas->drawOval(*SkANP::SetRect(&r, *rect), *paint);
   122 }
   124 static void anp_drawPath(ANPCanvas* canvas, const ANPPath* path,
   125                          const ANPPaint* paint) {
   126     canvas->skcanvas->drawPath(*path, *paint);
   127 }
   129 static void anp_drawText(ANPCanvas* canvas, const void* text, uint32_t length,
   130                          float x, float y, const ANPPaint* paint) {
   131     canvas->skcanvas->drawText(text, length,
   132                                SkFloatToScalar(x), SkFloatToScalar(y),
   133                                *paint);
   134 }
   136 static void anp_drawPosText(ANPCanvas* canvas, const void* text,
   137                 uint32_t byteLength, const float xy[], const ANPPaint* paint) {
   138     canvas->skcanvas->drawPosText(text, byteLength,
   139                                   reinterpret_cast<const SkPoint*>(xy), *paint);
   140 }
   142 static void anp_drawBitmap(ANPCanvas* canvas, const ANPBitmap* bitmap,
   143                            float x, float y, const ANPPaint* paint) {
   144     SkBitmap    bm;
   145     canvas->skcanvas->drawBitmap(*SkANP::SetBitmap(&bm, *bitmap),
   146                                  SkFloatToScalar(x), SkFloatToScalar(y),
   147                                  paint);
   148 }
   150 static void anp_drawBitmapRect(ANPCanvas* canvas, const ANPBitmap* bitmap,
   151                               const ANPRectI* src, const ANPRectF* dst,
   152                                const ANPPaint* paint) {
   153     SkBitmap    bm;
   154     SkRect      dstR;
   155     SkIRect     srcR, *srcPtr = NULL;
   157     if (src) {
   158         srcPtr = SkANP::SetRect(&srcR, *src);
   159     }
   160     canvas->skcanvas->drawBitmapRect(*SkANP::SetBitmap(&bm, *bitmap), srcPtr,
   161                            *SkANP::SetRect(&dstR, *dst), paint);
   162 }
   164 ///////////////////////////////////////////////////////////////////////////////
   166 #define ASSIGN(obj, name)   (obj)->name = anp_##name
   168 void InitCanvasInterface(ANPCanvasInterfaceV0* i) {
   169     ASSIGN(i, newCanvas);
   170     ASSIGN(i, deleteCanvas);
   171     ASSIGN(i, save);
   172     ASSIGN(i, restore);
   173     ASSIGN(i, translate);
   174     ASSIGN(i, scale);
   175     ASSIGN(i, rotate);
   176     ASSIGN(i, skew);
   177     ASSIGN(i, clipRect);
   178     ASSIGN(i, clipPath);
   179     ASSIGN(i, concat);
   180     ASSIGN(i, getTotalMatrix);
   181     ASSIGN(i, getLocalClipBounds);
   182     ASSIGN(i, getDeviceClipBounds);
   183     ASSIGN(i, drawColor);
   184     ASSIGN(i, drawPaint);
   185     ASSIGN(i, drawLine);
   186     ASSIGN(i, drawRect);
   187     ASSIGN(i, drawOval);
   188     ASSIGN(i, drawPath);
   189     ASSIGN(i, drawText);
   190     ASSIGN(i, drawPosText);
   191     ASSIGN(i, drawBitmap);
   192     ASSIGN(i, drawBitmapRect);
   193 }

mercurial