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