1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2011 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBitmap.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColor.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkFontDescriptor.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkGraphics.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPaint.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPoint.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRect.h"
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkStream.h"
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTypeface.h"
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTypes.h"
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "Test.h"
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic const SkColor bgColor = SK_ColorWHITE;
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void create(SkBitmap* bm, SkIRect bound) {
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bm->allocN32Pixels(bound.width(), bound.height());
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void drawBG(SkCanvas* canvas) {
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas->drawColor(bgColor);
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** Assumes that the ref draw was completely inside ref canvas --
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    implies that everything outside is "bgColor".
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Checks that all overlap is the same and that all non-overlap on the
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ref is "bgColor".
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic bool compare(const SkBitmap& ref, const SkIRect& iref,
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    const SkBitmap& test, const SkIRect& itest)
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot{
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const int xOff = itest.fLeft - iref.fLeft;
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const int yOff = itest.fTop - iref.fTop;
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    for (int y = 0; y < test.height(); ++y) {
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int x = 0; x < test.width(); ++x) {
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkColor testColor = test.getColor(x, y);
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            int refX = x + xOff;
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            int refY = y + yOff;
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkColor refColor;
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (refX >= 0 && refX < ref.width() &&
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                refY >= 0 && refY < ref.height())
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            {
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                refColor = ref.getColor(refX, refY);
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            } else {
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                refColor = bgColor;
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (refColor != testColor) {
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                return false;
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return true;
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_TEST(FontHostStream, reporter) {
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    {
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint paint;
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setColor(SK_ColorGRAY);
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setTextSize(SkIntToScalar(30));
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setTypeface(SkTypeface::MakeFromName("Georgia", SkFontStyle()));
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkIRect origRect = SkIRect::MakeWH(64, 64);
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkBitmap origBitmap;
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        create(&origBitmap, origRect);
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkCanvas origCanvas(origBitmap);
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkIRect streamRect = SkIRect::MakeWH(64, 64);
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkBitmap streamBitmap;
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        create(&streamBitmap, streamRect);
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkCanvas streamCanvas(streamBitmap);
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPoint point = SkPoint::Make(24, 32);
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // Test: origTypeface and streamTypeface from orig data draw the same
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        drawBG(&origCanvas);
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        origCanvas.drawString("A", point.fX, point.fY, paint);
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        sk_sp<SkTypeface> typeface(paint.getTypeface() ? paint.refTypeface()
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                       : SkTypeface::MakeDefault());
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        int ttcIndex;
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        std::unique_ptr<SkStreamAsset> fontData(typeface->openStream(&ttcIndex));
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (!fontData) {
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // We're using a SkTypeface that can't give us a stream.
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // This happens with portable or system fonts.  End the test now.
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return;
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        sk_sp<SkTypeface> streamTypeface(SkTypeface::MakeFromStream(fontData.release()));
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkFontDescriptor desc;
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        bool isLocalStream = false;
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        streamTypeface->getFontDescriptor(&desc, &isLocalStream);
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        REPORTER_ASSERT(reporter, isLocalStream);
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setTypeface(streamTypeface);
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        drawBG(&streamCanvas);
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        streamCanvas.drawPosText("A", 1, &point, paint);
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        REPORTER_ASSERT(reporter,
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                        compare(origBitmap, origRect, streamBitmap, streamRect));
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    //Make sure the typeface is deleted and removed.
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkGraphics::PurgeFontCache();
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
114