Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fillRect function will leave a black line at the top of the image #15

Closed
upupzealot opened this issue Mar 16, 2017 · 7 comments
Closed

Comments

@upupzealot
Copy link
Contributor

upupzealot commented Mar 16, 2017

My code is like:

const SIZE = 100;
const BGCOLORS = [...some colors...]
...
const avatar = PImage.make(SIZE, SIZE);
const g2d = avatar.getContext('2d');
g2d.fillStyle = BGCOLORS[_.random(BGCOLORS.length - 1)];
g2d.fillRect(0, 0, SIZE, SIZE);
//g2d.fillRect(-1, -1, SIZE + 1, SIZE + 1); // this will work
@joshmarinacci
Copy link
Owner

joshmarinacci commented Mar 21, 2017 via email

@upupzealot
Copy link
Contributor Author

Glad to hear that! love this pure js canvas lib so much.

@joshmarinacci
Copy link
Owner

I've finished and merged the refactor branch. Could you get the latest build and see if there is still a problem?

@upupzealot
Copy link
Contributor Author

Very thx for the updating!
there seems some other problems:
1.SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
would be fixed if you add a "use strict"; to the src/text.js
2.TypeError: FONT.loadSync is not a function
Not sure how to fix this.

@joshmarinacci
Copy link
Owner

I can fix the let/const stuff. Can you send me the code you are running so I can identify the loadsync part?

@upupzealot
Copy link
Contributor Author

upupzealot commented Jul 17, 2017

@joshmarinacci It's a part of my project which is big.

'use strict';

const _ = require('lodash');
const co = require('co');
const fs = require('fs');
const path = require('path');
const PImage = require('pureimage');
const Promise = require('bluebird');

const config = require('../config/index.js');

module.exports = (User, options) => {
  const avatarDir = path.resolve(__dirname, '../../client', config.userAvatarMixin.avatarDir);
  if (!fs.existsSync(avatarDir)) {
    fs.mkdir(avatarDir);
  }

  const encodePNG = Promise.promisify((img, fileName, callback) => {
    PImage.encodePNG(
      img,
      fs.createWriteStream(fileName),
      (err) => {
        callback(err, fileName);
      });
  });

  const SIZE = config.userAvatarMixin.size;
  const FONT = PImage.registerFont(
    path.resolve(__dirname, '../../client', config.userAvatarMixin.font),
    'AVATAR FONT');
  FONT.loadSync();
  const BGCOLORS = config.userAvatarMixin.backgroundColors;

  User.observe('after save', (ctx, next) => {
    co(function*() {
      if (ctx.instance && !ctx.instance.avatar) {
        const user = ctx.instance;
        const avatar = PImage.make(SIZE, SIZE);
        const g2d = avatar.getContext('2d');
        g2d.fillStyle = BGCOLORS[_.random(BGCOLORS.length - 1)];
        // g2d.fillRect(0, 0, SIZE, SIZE);
        g2d.fillRect(-1, -1, SIZE + 1, SIZE + 1);
        g2d.fillStyle = '#FFFFFF';
        g2d.setFont('AVATAR FONT', config.userAvatarMixin.fontSize);

        const name = user.username.substr(0, 1).toUpperCase();
        const dimention = g2d.measureText(name);
        dimention.height = dimention.emHeightAscent + dimention.emHeightDescent;
        g2d.fillText(
          name,
          (SIZE - dimention.width) / 2 + 1,
          (SIZE - dimention.height / 2));

        const avatarDir = path.resolve(__dirname, '../../client', config.userAvatarMixin.avatarDir);
        const file = yield encodePNG(avatar, `${avatarDir}/avatar-${user.id}.png`);
        yield user.updateAttribute('avatar', `/${path.basename(avatarDir)}/${path.relative(avatarDir, file)}`);
      }
      next();
    }).catch((err) => {
      console.error(err);
      next(err);
    });
  });
};

I paste it here directly and hope it would help.

@joshmarinacci
Copy link
Owner

Ah yes. LoadSync doesn't exist anymore. You must load fonts asynchronously using .load(). It works like this

var fnt = PImage.registerFont('tests/fonts/SourceSansPro-Regular.ttf','Source Sans Pro');
fnt.load(function() {
    var img = PImage.make(200,200);
   .. do stuff that uses the font

});

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants